/**
* 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.feememberservice;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.cuacfm.members.model.account.Account;
import org.cuacfm.members.model.accountservice.AccountService;
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.feemember.FeeMember;
import org.cuacfm.members.model.feemember.FeeMemberRepository;
import org.cuacfm.members.model.paymember.PayMember;
import org.cuacfm.members.model.paymemberservice.PayMemberService;
import org.cuacfm.members.model.util.Constants.levels;
import org.cuacfm.members.model.util.PushService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/** The Class FeeMemberServiceImpl. */
@Service("feeMemberService")
public class FeeMemberServiceImpl implements FeeMemberService {
@Autowired
private FeeMemberRepository feeMemberRepository;
@Autowired
private PayMemberService payMemberService;
@Autowired
private AccountService accountService;
@Autowired
private DirectDebitService directDebitService;
@Autowired
private EventService eventService;
/** Instantiates a new feeMember service. */
public FeeMemberServiceImpl() {
// Default empty constructor.
}
@Override
public FeeMember save(FeeMember feeMember) throws UniqueException {
// It is verified that there is not exist year of feeMember in other
// feeMember
if (feeMemberRepository.findByYear(feeMember.getYear()) != null) {
throw new UniqueException("Year", String.valueOf(feeMember.getYear()));
}
feeMemberRepository.save(feeMember);
List<String> devicesToken = new ArrayList<>();
int percent;
// Create payments of users
for (Account user : accountService.getUsers()) {
percent = 0;
if (user.getAccountType() != null) {
percent = user.getAccountType().getDiscount();
}
if (percent != 100) {
Double discount = (feeMember.getPrice() * percent) / 100;
Double price = feeMember.getPrice() - discount;
price = price / user.getInstallments();
// Create installments
for (int installment = 1; installment <= user.getInstallments(); installment++) {
int value = (installment - 1) * 12 / user.getInstallments();
if (installment == 1) {
value = 1;
}
LocalDate dateFormat = LocalDate.now();
dateFormat = dateFormat.withDayOfMonth(1);
dateFormat = dateFormat.withMonth(value);
dateFormat = dateFormat.withYear(feeMember.getYear());
Date dateCharge = Date.from(dateFormat.atStartOfDay(ZoneId.systemDefault()).toInstant());
PayMember payMember = new PayMember(user, feeMember, price, installment, user.getInstallments(), dateCharge);
payMemberService.save(payMember);
directDebitService.save(user);
}
}
// Add devices token to send push
devicesToken.addAll(user.getDevicesToken());
}
Object[] arguments = { feeMember.getName() };
// Save event
eventService.save("feeMember.successCreate", null, levels.HIGH, arguments);
// Send push
PushService.sendPushNotificationToDevice(devicesToken, feeMember.getName(), feeMember.getDescription());
return feeMember;
}
@Override
public void savePayMember(Account account, FeeMember feeMember) {
int month = 0;
int percent = 0;
if (account.getAccountType() != null) {
percent = account.getAccountType().getDiscount();
}
// If the same year applied the discount
if (feeMember.getYear() == LocalDate.now().getYear()) {
month = LocalDate.now().getMonthValue();
}
Double fee = feeMember.getPrice() / 12 * month;
Double discount = (feeMember.getPrice() * percent) / 100;
Double price = feeMember.getPrice() - discount;
price = price / account.getInstallments();
Double amount;
// Create installments
// Si se añade en diciembre no paga
for (int installment = 1; installment <= account.getInstallments(); installment++) {
if (fee > 0) {
amount = price - fee;
fee = fee - price;
} else {
amount = price;
}
if (amount > 0) {
int value = (installment - 1) * 12 / account.getInstallments();
if (installment == 1) {
value = 1;
}
LocalDate dateFormat = LocalDate.now();
dateFormat = dateFormat.withDayOfMonth(1);
dateFormat = dateFormat.withMonth(value);
dateFormat = dateFormat.withYear(feeMember.getYear());
Date dateCharge = Date.from(dateFormat.atStartOfDay(ZoneId.systemDefault()).toInstant());
PayMember payMember = new PayMember(account, feeMember, amount, installment, account.getInstallments(), dateCharge);
payMemberService.save(payMember);
directDebitService.save(account);
}
}
Object[] arguments = { account.getName() + " " + account.getSurname(), feeMember.getName() };
eventService.save("payMember.admin.successJoin", null, levels.HIGH, arguments);
}
@Override
public FeeMember update(FeeMember feeMember) throws UniqueException {
// It is verified that there is not exist name of feeMember in other
// feeMember
FeeMember feeMemberSearch = feeMemberRepository.findByYear(feeMember.getYear());
if ((feeMemberSearch != null) && (feeMemberSearch.getId() != feeMember.getId())) {
throw new UniqueException("Year", String.valueOf(feeMember.getYear()));
}
Object[] arguments = { feeMember.getName() };
eventService.save("feeMember.successModify", null, levels.HIGH, arguments);
return feeMemberRepository.update(feeMember);
}
@Override
public FeeMember findByName(String name) {
return feeMemberRepository.findByName(name);
}
@Override
public FeeMember findById(Long id) {
return feeMemberRepository.findById(id);
}
@Override
public FeeMember findByYear(int year) {
return feeMemberRepository.findByYear(year);
}
@Override
public List<FeeMember> getFeeMemberList() {
return feeMemberRepository.getFeeMemberList();
}
@Override
public FeeMember getLastFeeMember() {
return feeMemberRepository.getLastFeeMember();
}
}