/**
* 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.feeprogramservice;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.cuacfm.members.model.account.Account;
import org.cuacfm.members.model.directdebitservice.DirectDebitService;
import org.cuacfm.members.model.eventservice.EventService;
import org.cuacfm.members.model.exceptions.UniqueException;
import org.cuacfm.members.model.feeprogram.FeeProgram;
import org.cuacfm.members.model.feeprogram.FeeProgramRepository;
import org.cuacfm.members.model.payprogram.PayProgram;
import org.cuacfm.members.model.payprogramservice.PayProgramService;
import org.cuacfm.members.model.program.Program;
import org.cuacfm.members.model.programservice.ProgramService;
import org.cuacfm.members.model.util.Constants.levels;
import org.cuacfm.members.model.util.Constants.states;
import org.cuacfm.members.model.util.PushService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/** The Class FeeProgramServiceImpl. */
@Service("feeProgramService")
public class FeeProgramServiceImpl implements FeeProgramService {
@Autowired
private FeeProgramRepository feeProgramRepository;
@Autowired
private ProgramService programService;
@Autowired
private PayProgramService payProgramService;
@Autowired
private DirectDebitService directDebitService;
@Autowired
private EventService eventService;
/** Instantiates a new feeProgram service. */
public FeeProgramServiceImpl() {
// Default empty constructor.
}
@Override
public FeeProgram save(FeeProgram feeProgram) throws UniqueException {
// It is verified that there is not exist year of feeProgram in other feeProgram
if (feeProgramRepository.findByDate(feeProgram.getDate()) != null) {
throw new UniqueException("Date", String.valueOf(feeProgram.getDate()));
}
feeProgramRepository.save(feeProgram);
List<String> devicesToken = new ArrayList<>();
// Create payments of programs
for (Program program : programService.getProgramListActive()) {
// Duration in minutes, fee in hours, it is necessary convert price to minutes
Double price = (feeProgram.getPrice() / 60) * program.getDuration() * program.getPeriodicity();
PayProgram payProgram = new PayProgram(program, feeProgram, price);
payProgramService.save(payProgram);
if (program.getAccountPayer() != null) {
directDebitService.save(program.getAccountPayer());
}
// Add devices token to send push
for (Account account : program.getAccounts()) {
devicesToken.addAll(account.getDevicesToken());
}
}
Object[] arguments = { feeProgram.getName() };
// Save event
eventService.save("feeProgram.successCreate", null, levels.HIGH, arguments);
// Send push
PushService.sendPushNotificationToDevice(devicesToken, feeProgram.getName(), feeProgram.getDescription());
return feeProgram;
}
@Override
public FeeProgram update(FeeProgram feeProgram) throws UniqueException {
// It is verified that there is not exist name of feeProgram in other feeProgram
FeeProgram feeProgramSearch = feeProgramRepository.findByDate(feeProgram.getDate());
if ((feeProgramSearch != null) && (feeProgramSearch.getId() != feeProgram.getId())) {
throw new UniqueException("Date", String.valueOf(feeProgram.getDate()));
}
Object[] arguments = { feeProgram.getName() };
eventService.save("feeProgram.successModify", null, levels.HIGH, arguments);
return feeProgramRepository.update(feeProgram);
}
@Override
public FeeProgram refresh(FeeProgram feeProgram) {
for (PayProgram payProgram : payProgramService.getPayProgramListByFeeProgramId(feeProgram.getId())) {
// Si el programa esta dado de baja y no esta pagado se elimina
if (!payProgram.getProgram().isActive() && (payProgram.getState().equals(states.NO_PAY) || payProgram.getState().equals(states.CANCEL))) {
payProgramService.remove(payProgram);
}
}
// Añadir nuevos pagos si es necesario
for (Program program : programService.getProgramListActiveWhitoutPays(feeProgram.getDate())) {
Double price = (feeProgram.getPrice() / 60) * program.getDuration() * program.getPeriodicity();
PayProgram payProgram = new PayProgram(program, feeProgram, price);
payProgramService.save(payProgram);
directDebitService.save(program.getAccountPayer());
}
Object[] arguments = { feeProgram.getName() };
eventService.save("feeProgram.successRefresh", null, levels.HIGH, arguments);
return feeProgram;
}
@Override
public FeeProgram findByName(String name) {
return feeProgramRepository.findByName(name);
}
@Override
public FeeProgram findById(Long id) {
return feeProgramRepository.findById(id);
}
@Override
public FeeProgram findByDate(Date date) {
return feeProgramRepository.findByDate(date);
}
@Override
public List<FeeProgram> getFeeProgramList() {
return feeProgramRepository.getFeeProgramList();
}
}