/**
* 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.directdebitservice;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.cuacfm.members.model.account.Account;
import org.cuacfm.members.model.accountservice.AccountService;
import org.cuacfm.members.model.directdebit.DirectDebit;
import org.cuacfm.members.model.directdebit.DirectDebitDTO;
import org.cuacfm.members.model.directdebit.DirectDebitRepository;
import org.cuacfm.members.model.eventservice.EventService;
import org.cuacfm.members.model.exceptions.ExistTransactionIdException;
import org.cuacfm.members.model.paymember.PayMember;
import org.cuacfm.members.model.paymemberservice.PayMemberService;
import org.cuacfm.members.model.payprogram.PayProgram;
import org.cuacfm.members.model.payprogramservice.PayProgramService;
import org.cuacfm.members.model.util.Constants.levels;
import org.cuacfm.members.model.util.Constants.methods;
import org.cuacfm.members.model.util.Constants.states;
import org.cuacfm.members.model.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/** The Class DirectDebitRepositoryImpl. */
@Service("directDebitService")
public class DirectDebitServiceImpl implements DirectDebitService {
//private static final Logger logger = LoggerFactory.getLogger(DirectDebitServiceImpl.class);
@Autowired
private AccountService accountService;
@Autowired
private DirectDebitRepository directDebitRepository;
@Autowired
private PayMemberService payMemberService;
@Autowired
private PayProgramService payProgramService;
@Autowired
private EventService eventService;
@Override
public DirectDebit save(DirectDebit directDebit) {
return directDebitRepository.save(directDebit);
}
@Override
public DirectDebit save(Account account) {
DirectDebit directDebit = directDebitRepository.getLastDirectDebit(account.getId());
// If no exists open directDebit, its create a new
if (directDebit == null) {
String[] idRevious = directDebitRepository.findLastId().split("_");
String date = DateUtils.format(new Date(), "ddMMyyyy");
String idNew = date + "_" + String.format("%03d", Integer.parseInt(idRevious[1]) + 1);
directDebit = new DirectDebit(account, idNew);
}
// Al actualizarse se borra el metodo que existiese
directDebit.setMethod(null);
directDebit.setPayPrograms(payProgramService.findNoPayListByAccountId(account.getId()));
directDebit.setPayMembers(payMemberService.findNoPayListByAccountId(account.getId()));
// if price is 0, it is not create directDebit
if (directDebit.getPrice() == 0) {
directDebitRepository.remove(directDebit);
return null;
}
return directDebitRepository.update(directDebit);
}
@Override
public String refresh() {
for (Account account : accountService.getAccounts()) {
save(account);
}
return eventService.save("directDebit.successRefresh", null, levels.CRITICAL);
}
@Override
public List<DirectDebit> findAll() {
return directDebitRepository.findAll();
}
@Override
public List<DirectDebit> findAllOpen() {
return directDebitRepository.findAllOpen();
}
@Override
public List<DirectDebit> findAllClose() {
return directDebitRepository.findAllClose();
}
@Override
public List<DirectDebit> findAllByAccountId(Long accountId) {
return directDebitRepository.findAllByAccountId(accountId);
}
@Override
public List<DirectDebit> findAllOpenByAccountId(Long accountId) {
return directDebitRepository.findAllOpenByAccountId(accountId);
}
@Override
public List<DirectDebit> findAllByBankRemittanceId(Long bankRemittanceId) {
return directDebitRepository.findAllByBankRemittanceId(bankRemittanceId);
}
@Override
public void updateDirectDebit(DirectDebit directDebit, states state, methods method, Date datePay) throws ExistTransactionIdException {
directDebit.setState(state);
directDebit.setMethod(method);
directDebit.setDateUpdate(new Date());
directDebit.setDatePay(datePay);
directDebitRepository.update(directDebit);
if (directDebit.getPayMembers() != null) {
for (PayMember payMember : directDebit.getPayMembers()) {
payMember.setState(state);
payMember.setMethod(method);
payMember.setDatePay(datePay);
payMember.setIdTxn(directDebit.getIdTxn());
payMember.setEmailPayer(directDebit.getEmailPayer());
payMember.setIdPayer(directDebit.getIdPayer());
payMemberService.update(payMember);
}
}
if (directDebit.getPayPrograms() != null) {
for (PayProgram payProgram : directDebit.getPayPrograms()) {
payProgram.setState(state);
payProgram.setMethod(method);
payProgram.setDatePay(datePay);
payProgram.setIdTxn(directDebit.getIdTxn());
payProgram.setEmailPayer(directDebit.getEmailPayer());
payProgram.setIdPayer(directDebit.getIdPayer());
payProgramService.update(payProgram);
}
}
}
@Override
public List<DirectDebitDTO> getDTO(List<DirectDebit> directDebits) {
List<DirectDebitDTO> directDebitsDTO = new ArrayList<>();
for (DirectDebit directDebit : directDebits) {
DirectDebitDTO directDebitDTO = new DirectDebitDTO(directDebit.getId(), accountService.getAccountDTO(directDebit.getAccount()),
directDebit.getConcept(), directDebit.getPrice(), directDebit.getDateCreate(), directDebit.getDateUpdate(),
directDebit.getDatePay(), directDebit.getState(), directDebit.getMethod(), directDebit.getSecuence(), directDebit.getIdPayer(),
directDebit.getIdTxn(), directDebit.getEmailPayer());
if (directDebit.getReturnReason() != null) {
directDebitDTO.setReturnReason(directDebit.getReturnReason().getDescription());
}
if (directDebit.getBankRemittance() != null) {
directDebitDTO.setBankRemittance(directDebit.getBankRemittance().getMonthCharge());
}
directDebitsDTO.add(directDebitDTO);
}
return directDebitsDTO;
}
@Override
public DirectDebit findById(String id) {
return directDebitRepository.findById(id);
}
@Override
public DirectDebit getLastDirectDebit(Long acoountId) {
return directDebitRepository.getLastDirectDebit(acoountId);
}
@Override
public String isRcurOrFRST(Long accountId) {
return directDebitRepository.isRcurOrFRST(accountId);
}
@Override
public String directDebit(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
updateDirectDebit(directDebit, states.PAY, methods.DIRECTDEBIT, new Date());
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successDirectDebit", account, levels.HIGH, arguments);
}
@Override
public String markBankDeposit(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
if (directDebit.getState().equals(states.NO_PAY) || directDebit.getState().equals(states.RETURN_BILL)) {
updateDirectDebit(directDebit, states.MANAGEMENT, methods.BANK_DEPOSIT, null);
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successBankDeposit.mark", account, levels.HIGH, arguments);
}
return null;
}
@Override
public String cancelBankDeposit(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
if (directDebit.getMethod().equals(methods.BANK_DEPOSIT) || directDebit.getState().equals(states.MANAGEMENT)) {
updateDirectDebit(directDebit, states.NO_PAY, null, null);
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successBankDeposit.cancel", account, levels.HIGH, arguments);
}
return null;
}
@Override
public String confirmBankDeposit(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
if (directDebit.getMethod().equals(methods.BANK_DEPOSIT) || directDebit.getState().equals(states.MANAGEMENT)) {
updateDirectDebit(directDebit, states.PAY, methods.BANK_DEPOSIT, new Date());
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successBankDeposit.pay", account, levels.HIGH, arguments);
}
return null;
}
@Override
public String confirmPaypal(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
if (directDebit.getMethod().equals(methods.PAYPAL) || directDebit.getState().equals(states.MANAGEMENT)) {
updateDirectDebit(directDebit, states.PAY, methods.PAYPAL, new Date());
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successPayPal.pay", account, levels.HIGH, arguments);
}
return null;
}
@Override
public String cash(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
if (directDebit.getState().equals(states.NO_PAY) || directDebit.getState().equals(states.RETURN_BILL)) {
updateDirectDebit(directDebit, states.PAY, methods.CASH, new Date());
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successCash", account, levels.HIGH, arguments);
}
return null;
}
@Override
public void paypal(DirectDebit directDebit, Account account, String idTxn, String idPayer, String emailPayer, String statusPay, String datePay)
throws ExistTransactionIdException {
if (directDebit.getMethod() == null || !directDebit.getState().equals(states.CANCEL)) {
DirectDebit directDebitExist = directDebitRepository.findByIdTxn(idTxn);
if (directDebitExist != null && directDebitExist.getId() != directDebit.getId()) {
throw new ExistTransactionIdException(idTxn);
}
directDebit.setIdTxn(idTxn);
directDebit.setEmailPayer(emailPayer);
directDebit.setIdPayer(idPayer);
directDebit.setMethod(methods.PAYPAL);
directDebit.setState(states.MANAGEMENT);
if (statusPay.contains("Completed")) {
directDebit.setDatePay(DateUtils.format(datePay, DateUtils.FORMAT_PAYPAL, Locale.US));
directDebit.setState(states.PAY);
}
updateDirectDebit(directDebit, directDebit.getState(), directDebit.getMethod(), directDebit.getDatePay());
Object[] arguments = { directDebit.getConcept() };
eventService.save("directDebit.successPayPal", account, levels.HIGH, arguments);
}
}
@Override
public String returnBill(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
updateDirectDebit(directDebit, states.RETURN_BILL, methods.DIRECTDEBIT, null);
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successReturnBill", account, levels.HIGH, arguments);
}
@Override
public String management(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
updateDirectDebit(directDebit, states.MANAGEMENT, methods.DIRECTDEBIT, null);
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successManagement", account, levels.HIGH, arguments);
}
@Override
public String cancel(DirectDebit directDebit, Account account) throws ExistTransactionIdException {
updateDirectDebit(directDebit, states.CANCEL, null, null);
Object[] arguments = { directDebit.getConcept() };
return eventService.save("directDebit.successCancel", account, levels.HIGH, arguments);
}
}