/**
* 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.paymember;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.persistence.TypedQuery;
import org.cuacfm.members.model.account.Account;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/** The Class PayMemberRepositoryImpl. */
@Repository
@Transactional(readOnly = true)
public class PayMemberRepositoryImpl implements PayMemberRepository {
private static final Logger logger = LoggerFactory.getLogger(PayMemberRepositoryImpl.class);
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional
public PayMember save(PayMember payMember) {
entityManager.persist(payMember);
return payMember;
}
@Override
@Transactional
public PayMember update(PayMember payMember) {
return entityManager.merge(payMember);
}
@Override
public PayMember findById(Long id) {
try {
return entityManager.createQuery("select a from PayMember a where a.id = :id", PayMember.class).setParameter("id", id).getSingleResult();
} catch (PersistenceException e) {
logger.info("NoResult" + e.getMessage());
return null;
}
}
@Override
public PayMember findByIdTxn(String idTxn) {
try {
return entityManager.createQuery("select a from PayMember a where a.idTxn = :idTxn", PayMember.class).setParameter("idTxn", idTxn)
.getSingleResult();
} catch (NoResultException e) {
logger.info("NoResult" + e.getMessage());
return null;
}
}
@Override
public List<PayMember> findByPayMemberIds(Long accountId, Long feeMemberId) {
return entityManager
.createQuery("select a from PayMember a where a.account.id = :accountId and a.feeMember.id = :feeMemberId", PayMember.class)
.setParameter("accountId", accountId).setParameter("feeMemberId", feeMemberId).getResultList();
}
@Override
public List<PayMember> getPayMemberList() {
return entityManager.createQuery("select a from PayMember a order by a.account.login", PayMember.class).getResultList();
}
@Override
public List<PayMember> findNoPayListByAccountId(Long accountId) {
return entityManager.createQuery("select p from PayMember p where p.state <> 'PAY' and p.dateCharge <= :date and p.account.id = :accountId",
PayMember.class).setParameter("date", new Date()).setParameter("accountId", accountId).getResultList();
}
@Override
public Map<Account, List<PayMember>> getPayMemberNoPayListByDirectDebit(Date monthCharge) {
TypedQuery<Object[]> q = entityManager.createQuery(
"select p.account, p from PayMember p where p.state <> 'PAY' " + "and p.account.methodPayment.directDebit = true "
+ "and month(p.dateCharge) = month(:month) " + "and year(p.dateCharge) = year(:month) " + "order by p.account.name",
Object[].class).setParameter("month", monthCharge);
List<Object[]> resultList = q.getResultList();
Map<Account, List<PayMember>> userPayMembers = new HashMap<Account, List<PayMember>>();
for (Object[] result : resultList) {
Account account = (Account) result[0];
// If exist Account in userPayMembers
if (userPayMembers.containsKey(account)) {
List<PayMember> payMembersAux = userPayMembers.get(account);
payMembersAux.add((PayMember) result[1]);
userPayMembers.putIfAbsent(account, payMembersAux);
}
// If no exist Account in userPayPrograms
else {
List<PayMember> payMembers = new ArrayList<PayMember>();
payMembers.add((PayMember) result[1]);
userPayMembers.put(account, payMembers);
}
}
return userPayMembers;
}
@Override
public List<PayMember> getPayMemberListByFeeMemberId(Long feeMemberId) {
return entityManager.createQuery("select a from PayMember a where a.feeMember.id = :feeMemberId", PayMember.class)
.setParameter("feeMemberId", feeMemberId).getResultList();
}
@Override
public List<PayMember> getPayMemberListByAccountId(Long accountId) {
return entityManager.createQuery("select a from PayMember a where a.account.id = :accountId", PayMember.class)
.setParameter("accountId", accountId).getResultList();
}
@Override
public List<String> getUsernamesByFeeMember(Long feeMemberId) {
// No running Concat(a.name, ' - ', a.nickname)
List<Account> accounts = entityManager
.createQuery("select a from Account a " + "where a.role in ('ROLE_USER', 'ROLE_PREREGISTERED')"
+ "and a.active = true " + "and a.id not in " + "(select c.id from Account c, PayMember p "
+ "where p.feeMember.id = :feeMemberId and p.account.id = c.id) " + "order by a.login", Account.class)
.setParameter("feeMemberId", feeMemberId).getResultList();
List<String> usernames = new ArrayList<>();
for (Account account : accounts) {
if (account.getNickName() != null && !account.getNickName().isEmpty()) {
usernames.add(account.getId() + ": " + account.getName() + " " + account.getSurname() + " - " + account.getNickName());
} else {
usernames.add(account.getId() + ": " + account.getName() + " " + account.getSurname());
}
}
return usernames;
}
}