/**
* 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.bankremittanceservice;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.xml.bind.JAXBException;
import javax.xml.datatype.DatatypeConfigurationException;
import org.cuacfm.members.model.account.Account;
import org.cuacfm.members.model.accountservice.AccountService;
import org.cuacfm.members.model.bankremittance.BankRemittance;
import org.cuacfm.members.model.bankremittance.BankRemittanceRepository;
import org.cuacfm.members.model.directdebit.DirectDebit;
import org.cuacfm.members.model.directdebitservice.DirectDebitService;
import org.cuacfm.members.model.eventservice.EventService;
import org.cuacfm.members.model.exceptions.ExistTransactionIdException;
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.cuacfm.members.model.util.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.MessageSource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/** The Class bankRemittanceService. */
@Service("bankRemittanceService")
public class BankRemittanceServiceImpl implements BankRemittanceService {
private static final Logger logger = LoggerFactory.getLogger(BankRemittanceService.class);
@Value("${path}${pathBankRemittance}")
private String pathBankRemittance;
@Value("${path}${pathReturnBankRemittance}")
private String pathReturnBankRemittance;
@Autowired
private MessageSource messageSource;
@Autowired
private DirectDebitService directDebitService;
@Autowired
private BankRemittanceRepository bankRemittanceRepository;
@Autowired
private BankRemittanceSEPAXML bankRemittanceSEPAXML;
@Autowired
private ReturnBankRemittanceSEPAXML returnBankRemittanceSEPAXML;
@Autowired
private AccountService accountService;
@Autowired
private EventService eventService;
@Override
public void createBankRemittance(Date dateCharge, Date monthCharge) {
BankRemittance bankRemittance = new BankRemittance(dateCharge, monthCharge);
bankRemittanceRepository.save(bankRemittance);
for (Account account : accountService.getUsersDirectDebit()) {
if (account.activeBankAccount() != null && account.getMethodPayment().isDirectDebit()) {
// Actualiza el directDebit de cada usuario
DirectDebit directDebit = directDebitService.save(account);
if (directDebit != null) {
directDebit.setBankRemittance(bankRemittance);
directDebit.setSecuence(directDebitService.isRcurOrFRST(account.getId()));
directDebit.setMethod(methods.DIRECTDEBIT);
}
}
}
Object[] arguments = { DateUtils.format(bankRemittance.getDateCharge(), DateUtils.FORMAT_DATE) };
eventService.save("bankRemittance.successCreate", null, levels.HIGH, arguments);
}
@Override
public BankRemittance update(BankRemittance bankRemittance) {
Object[] arguments = { DateUtils.format(bankRemittance.getDateCharge(), DateUtils.FORMAT_DATE) };
eventService.save("bankRemittance.successManagement", null, levels.HIGH, arguments);
return bankRemittanceRepository.update(bankRemittance);
}
/**
* Update state bank remittance.
*
* @param bankRemittance the bank remittance
* @param state the state
* @param method the method
* @throws ExistTransactionIdException the exist transaction id exception
*/
private void updateStateBankRemittance(BankRemittance bankRemittance, states state, methods method) throws ExistTransactionIdException {
bankRemittance.setState(state);
bankRemittanceRepository.update(bankRemittance);
for (DirectDebit directDebit : directDebitService.findAllByBankRemittanceId(bankRemittance.getId())) {
if (!directDebit.getState().equals(states.RETURN_BILL)) {
directDebitService.updateDirectDebit(directDebit, state, method, bankRemittance.getDateCharge());
}
}
}
@Override
public String payBankRemittance(BankRemittance bankRemittance) throws ExistTransactionIdException {
updateStateBankRemittance(bankRemittance, states.PAY, methods.DIRECTDEBIT);
Object[] arguments = { DateUtils.format(bankRemittance.getDateCharge(), DateUtils.FORMAT_DATE) };
return eventService.save("bankRemittance.successPay", null, levels.HIGH, arguments);
}
@Override
public String managementBankRemittance(BankRemittance bankRemittance) throws ExistTransactionIdException {
updateStateBankRemittance(bankRemittance, states.MANAGEMENT, methods.DIRECTDEBIT);
Object[] arguments = { DateUtils.format(bankRemittance.getDateCharge(), DateUtils.FORMAT_DATE) };
return eventService.save("bankRemittance.successManagement", null, levels.HIGH, arguments);
}
@Override
public BankRemittance findById(Long id) {
return bankRemittanceRepository.findById(id);
}
@Override
public List<BankRemittance> getBankRemittanceList() {
return bankRemittanceRepository.getBankRemittanceList();
}
@Override
public ResponseEntity<byte[]> generateXML(Long bankRemittanceId) {
logger.info("generateXML");
BankRemittance bankRemittance = bankRemittanceRepository.findById(bankRemittanceId);
FileUtils.createFolderIfNoExist(pathBankRemittance);
String fileXML = messageSource.getMessage("fileBankRemittance", null, Locale.getDefault())
+ DateUtils.format(new Date(), DateUtils.FORMAT_FILE) + ".xml";
try {
bankRemittanceSEPAXML.create(pathBankRemittance + fileXML, bankRemittance,
directDebitService.findAllByBankRemittanceId(bankRemittanceId));
} catch (IOException | JAXBException | DatatypeConfigurationException e) {
logger.error("processXML: ", e);
}
return FileUtils.downloadFile(pathBankRemittance, fileXML, MediaType.TEXT_XML);
}
@Override
public String processXML(MultipartFile file) {
logger.info("processXML");
try {
byte[] bytes = file.getBytes();
FileUtils.createFolderIfNoExist(pathReturnBankRemittance);
String[] originalFilename = file.getOriginalFilename().split(".xml");
Path pathXML = Paths
.get(pathReturnBankRemittance + originalFilename[0] + DateUtils.format(new Date(), DateUtils.FORMAT_FILE) + ".xml");
Files.write(pathXML, bytes);
returnBankRemittanceSEPAXML.load(pathXML.toString());
} catch (Exception e) {
logger.error("processXML: ", e);
Object[] arguments = {};
eventService.save("bankRemittance.failUpload", null, levels.HIGH, arguments);
return "bankRemittance.failUpload";
}
Object[] arguments = { file.getOriginalFilename() };
eventService.save("bankRemittance.successUpload", null, levels.HIGH, arguments);
return "bankRemittance.successUpload";
}
}