Project

General

Profile

1
package eu.dnetlib.goldoa.service;
2

    
3
import eu.dnetlib.goldoa.domain.Budget;
4
import eu.dnetlib.goldoa.domain.BudgetFile;
5
import eu.dnetlib.goldoa.domain.BudgetInfo;
6
import eu.dnetlib.goldoa.domain.OrganizationManagerException;
7
import eu.dnetlib.goldoa.domain.Person;
8
import eu.dnetlib.goldoa.domain.PersonManagerException;
9
import eu.dnetlib.goldoa.service.dao.BudgetDAO;
10
import eu.dnetlib.goldoa.service.utils.EmailUtils;
11
import org.springframework.beans.factory.annotation.Autowired;
12
import org.springframework.transaction.annotation.Transactional;
13

    
14
import java.io.InputStream;
15
import java.util.ArrayList;
16
import java.util.Date;
17
import java.util.List;
18
import java.util.UUID;
19
import java.util.concurrent.ExecutorService;
20

    
21
/**
22
 * Created by antleb on 4/2/15.
23
 */
24
@Transactional
25
public class BudgetManagerImpl implements BudgetManager {
26

    
27
	@Autowired
28
	private BudgetDAO budgetDAO;
29
	@Autowired
30
	private PersonManager personManager;
31
	@Autowired
32
	private OrganizationManager organizationManager;
33
	@Autowired
34
	ExecutorService executorService;
35
	@Autowired
36
	private EmailUtils emailUtils;
37

    
38
	@Override
39
	public Budget saveBudget(final Budget budget) {
40
		if (budget.getId() == null) {
41
			budget.setId(UUID.randomUUID().toString());
42
			budget.setDate(new Date());
43
			budget.setRemaining(budget.getAmountGranted());
44
		}
45

    
46
		budgetDAO.saveBudget(budget);
47

    
48
		budgetDAO.deleteBudgetRelations(budget);
49
		budgetDAO.insertBudgetRelations(budget);
50

    
51
		if (Budget.Status.SUBMITTED.equals(getStatus(budget.getStatusCode()))) {
52
			executorService.submit(new Runnable() {
53
				@Override
54
				public void run() {
55
					try {
56
						BudgetInfo budgetInfo = getBudgetInfo(budget);
57
						List<Person> moderators = personManager.getModerators();
58

    
59
						emailUtils.sendUserNewBudgetEmail(budgetInfo);
60

    
61
						for (Person moderator : moderators)
62
							emailUtils.sendModeratorNewBudgetEmail(moderator, budgetInfo);
63

    
64
					} catch (Exception e) {
65
						e.printStackTrace();
66
					}
67
				}
68
			});
69
		}
70

    
71
		return budget;
72
	}
73

    
74
	@Override
75
	public BudgetInfo getBudget(String budgetId) {
76
		return getBudgetInfo(budgetDAO.getBudget(budgetId));
77
	}
78

    
79
	@Override
80
	public List<BudgetInfo> getBudgets() {
81
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
82

    
83
		for (Budget budget : budgetDAO.getBudgets())
84
			res.add(getBudgetInfo(budget));
85

    
86
		return res;
87
	}
88

    
89
	@Override
90
	public List<BudgetInfo> getBudgetsForUser(String userId) {
91
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
92

    
93
		for (Budget budget : budgetDAO.getBudgetsForUser(userId))
94
			res.add(getBudgetInfo(budget));
95

    
96
		return res;
97
	}
98

    
99
	@Override
100
	public List<BudgetInfo> getBudgetsForOrganization(List<String> organizationIds) {
101
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
102

    
103
		for (Budget budget : budgetDAO.getBudgetsForOrganization(organizationIds))
104
			res.add(getBudgetInfo(budget));
105

    
106
		return res;
107
	}
108

    
109
	@Override
110
	public void approveBudget(final String budgetId, String comment, float amountGranted) {
111
		budgetDAO.approveBudget(budgetId, amountGranted);
112
		budgetDAO.updateBudgetComment(budgetId, comment);
113

    
114
		executorService.submit(new Runnable() {
115
			@Override
116
			public void run() {
117
				try {
118
					BudgetInfo budgetInfo = getBudget(budgetId);
119
					List<Person> moderators = personManager.getModerators();
120

    
121
					emailUtils.sendUserAcceptedBudgetEmail(budgetInfo);
122

    
123
					for (Person moderator : moderators)
124
						emailUtils.sendModeratorAcceptedBudgetEmail(moderator, budgetInfo);
125

    
126
				} catch (Exception e) {
127
					e.printStackTrace();
128
				}
129
			}
130
		});
131
	}
132

    
133
	@Override
134
	public void rejectBudget(final String budgetId, String comment) {
135
		budgetDAO.rejectBudget(budgetId);
136
		budgetDAO.updateBudgetComment(budgetId, comment);
137

    
138
		executorService.submit(new Runnable() {
139
			@Override
140
			public void run() {
141
				try {
142
					BudgetInfo budgetInfo = getBudget(budgetId);
143
					List<Person> moderators = personManager.getModerators();
144

    
145
					emailUtils.sendUserRejectedBudgetEmail(budgetInfo);
146

    
147
					for (Person moderator : moderators)
148
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budgetInfo);
149

    
150
				} catch (Exception e) {
151
					e.printStackTrace();
152
				}
153
			}
154
		});
155
	}
156

    
157
	@Override
158
	public void uploadTerms(String id, String contentType, InputStream inputStream) {
159
		budgetDAO.uploadTerms(id, contentType, inputStream);
160
	}
161

    
162
	@Override
163
	public BudgetFile downloadBudgetTerms(String budgetId) {
164
		return budgetDAO.downloadTerms(budgetId);
165
	}
166

    
167
	private BudgetInfo getBudgetInfo(Budget budget) {
168
		BudgetInfo budgetInfo = new BudgetInfo();
169

    
170
		budgetInfo.setId(budget.getId());
171
		budgetInfo.setDate(budget.getDate());
172
		budgetInfo.setStartDate(budget.getStartDate());
173
		budgetInfo.setEndDate(budget.getEndDate());
174
		budgetInfo.setAmountGranted(budget.getAmountGranted());
175
		budgetInfo.setAmountRequested(budget.getAmountRequested());
176
		budgetInfo.setRemaining(budget.getRemaining());
177
		budgetInfo.setCurrency(budget.getCurrency());
178
		budgetInfo.setStatusCode(budget.getStatusCode());
179
		budgetInfo.setStatus(getStatus(budget.getStatusCode()));
180
		budgetInfo.setComment(budgetDAO.getBudgetComment(budget.getId()));
181
		budgetInfo.setBankAccount(budget.getBankAccount());
182

    
183
		if (budget.getUser() != null) {
184
			try {
185
				budgetInfo.setUser(personManager.getById(budget.getUser()));
186
			} catch (PersonManagerException e) {
187
				e.printStackTrace();
188
			}
189
		}
190

    
191
		if (budget.getOrganisation() != null) {
192
			try {
193
				budgetInfo.setOrganisation(organizationManager.getById(budget.getOrganisation()));
194
			} catch (OrganizationManagerException e) {
195
				e.printStackTrace();
196
			}
197
		}
198

    
199
		return budgetInfo;
200
	}
201

    
202
	private Budget.Status getStatus(int statusCode) {
203
		for (Budget.Status s : Budget.Status.values())
204
			if ((statusCode & s.getCode()) == s.getCode())
205
				return s;
206

    
207
		return null;
208
	}
209
}
(2-2/29)