Project

General

Profile

1
package eu.dnetlib.goldoa.service;
2

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

    
15
import java.io.InputStream;
16
import java.text.SimpleDateFormat;
17
import java.util.ArrayList;
18
import java.util.Date;
19
import java.util.List;
20
import java.util.UUID;
21
import java.util.concurrent.ExecutorService;
22

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

    
29
	@Autowired private BudgetDAO budgetDAO;
30
	@Autowired private PersonManager personManager;
31
	@Autowired private OrganizationManager organizationManager;
32
	@Autowired private PublisherManager publisherManager;
33
	@Autowired private InvoiceManager invoiceManager;
34
	@Autowired private ExecutorService executorService;
35
	@Autowired private EmailUtils emailUtils;
36

    
37
	@Override
38
	public Budget saveBudget(final Budget budget) {
39
		if (budget.getId() == null) {
40
//			budget.setId(UUID.randomUUID().toString());
41

    
42
			budget.setId(new SimpleDateFormat("yyyyMMdd-").format(new Date()) + budgetDAO.getRequestId());
43

    
44
			budget.setDate(new Date());
45
			budget.setRemaining(budget.getAmountGranted());
46
		}
47

    
48
		budgetDAO.saveBudget(budget);
49

    
50
		return budget;
51
	}
52

    
53
	@Override
54
	public Budget submitBudgetRequest(final Budget budget) {
55
		budget.setStatusCode(Budget.Status.SUBMITTED.getCode());
56

    
57
		saveBudget(budget);
58

    
59
		executorService.submit(new Runnable() {
60
			@Override
61
			public void run() {
62
				try {
63
					BudgetInfo budgetInfo = getBudgetInfo(budget);
64
					List<Person> moderators = personManager.getModerators();
65

    
66
					emailUtils.sendUserNewBudgetEmail(budgetInfo);
67

    
68
					for (Person moderator : moderators)
69
						emailUtils.sendModeratorNewBudgetEmail(moderator, budgetInfo);
70

    
71
				} catch (Exception e) {
72
					e.printStackTrace();
73
				}
74
			}
75
		});
76

    
77
		return budget;
78
	}
79

    
80
	@Override
81
	public BudgetInfo getBudget(String budgetId) {
82
		return getBudgetInfo(budgetDAO.getBudget(budgetId));
83
	}
84

    
85
	@Override
86
	public List<BudgetInfo> getBudgets() {
87
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
88

    
89
		for (Budget budget : budgetDAO.getBudgets())
90
			res.add(getBudgetInfo(budget));
91

    
92
		return res;
93
	}
94

    
95
	@Override
96
	public List<BudgetInfo> getBudgetsForUser(String userId) {
97
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
98

    
99
		for (Budget budget : budgetDAO.getBudgetsForUser(userId))
100
			res.add(getBudgetInfo(budget));
101

    
102
		return res;
103
	}
104

    
105
	@Override
106
	public List<BudgetInfo> getBudgetsForPublisher(String publisherId) {
107
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
108

    
109
		for (Budget budget : budgetDAO.getBudgetsForPublisher(publisherId))
110
			res.add(getBudgetInfo(budget));
111

    
112
		return res;
113
	}
114

    
115
	@Override
116
	public List<BudgetInfo> getBudgetsForAccounting() {
117
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
118

    
119
		for (Budget budget : budgetDAO.getBudgetsForAccounting())
120
			res.add(getBudgetInfo(budget));
121

    
122
		return res;
123
	}
124

    
125
	@Override
126
	public List<BudgetInfo> getBudgetsForOrganization(List<String> organizationIds) {
127
		List<BudgetInfo> res = new ArrayList<BudgetInfo>();
128

    
129
		for (Budget budget : budgetDAO.getBudgetsForOrganization(organizationIds))
130
			res.add(getBudgetInfo(budget));
131

    
132
		return res;
133
	}
134

    
135
	@Override
136
	public void initiallyApproveBudgetRequest(final String budgetId, String comment, String personId) {
137
		budgetDAO.initiallyApproveBudget(budgetId);
138
		budgetDAO.saveComment(budgetId, personId, comment, null);
139

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

    
147
					emailUtils.sendUserAcceptedBudgetEmail(budgetInfo);
148

    
149
					for (Person moderator : moderators)
150
						emailUtils.sendModeratorAcceptedBudgetEmail(moderator, budgetInfo);
151

    
152
				} catch (Exception e) {
153
					e.printStackTrace();
154
				}
155
			}
156
		});
157
	}
158

    
159
	@Override
160
	public void approveBudgetRequest(final String budgetId, String comment, float amountGranted, String personId) {
161
		budgetDAO.approveBudget(budgetId, amountGranted);
162
		budgetDAO.saveComment(budgetId, personId, comment, null);
163

    
164
		executorService.submit(new Runnable() {
165
			@Override
166
			public void run() {
167
				try {
168
					BudgetInfo budgetInfo = getBudget(budgetId);
169
					List<Person> moderators = personManager.getModerators();
170

    
171
					emailUtils.sendUserAcceptedBudgetEmail(budgetInfo);
172

    
173
					for (Person moderator : moderators)
174
						emailUtils.sendModeratorAcceptedBudgetEmail(moderator, budgetInfo);
175

    
176
				} catch (Exception e) {
177
					e.printStackTrace();
178
				}
179
			}
180
		});
181
	}
182

    
183
	@Override
184
	public void rejectBudgetRequest(final String budgetId, String comment, String personId) {
185
		budgetDAO.rejectBudget(budgetId);
186
//		budgetDAO.updateBudgetComment(budgetId, comment);
187
		budgetDAO.saveComment(budgetId, personId, comment, null);
188

    
189
		executorService.submit(new Runnable() {
190
			@Override
191
			public void run() {
192
				try {
193
					BudgetInfo budgetInfo = getBudget(budgetId);
194
					List<Person> moderators = personManager.getModerators();
195

    
196
					emailUtils.sendUserRejectedBudgetEmail(budgetInfo);
197

    
198
					for (Person moderator : moderators)
199
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budgetInfo);
200

    
201
				} catch (Exception e) {
202
					e.printStackTrace();
203
				}
204
			}
205
		});
206
	}
207

    
208
	@Override
209
	public void processingPayment(final String budgetId, String comment, String personId) {
210
		budgetDAO.processingBudget(budgetId);
211
		budgetDAO.saveComment(budgetId, personId, comment, null);
212

    
213
		executorService.submit(new Runnable() {
214
			@Override
215
			public void run() {
216
				try {
217
					BudgetInfo budgetInfo = getBudget(budgetId);
218
					List<Person> moderators = personManager.getModerators();
219

    
220
					emailUtils.sendUserRejectedBudgetEmail(budgetInfo);
221

    
222
					for (Person moderator : moderators)
223
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budgetInfo);
224

    
225
				} catch (Exception e) {
226
					e.printStackTrace();
227
				}
228
			}
229
		});
230
	}
231

    
232
	@Override
233
	public void denyPayment(final String budgetId, String comment, String personId) {
234
		budgetDAO.accountingDeniedBudget(budgetId);
235
		budgetDAO.saveComment(budgetId, personId, comment, null);
236

    
237
		executorService.submit(new Runnable() {
238
			@Override
239
			public void run() {
240
				try {
241
					BudgetInfo budgetInfo = getBudget(budgetId);
242
					List<Person> moderators = personManager.getModerators();
243

    
244
					emailUtils.sendUserRejectedBudgetEmail(budgetInfo);
245

    
246
					for (Person moderator : moderators)
247
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budgetInfo);
248

    
249
				} catch (Exception e) {
250
					e.printStackTrace();
251
				}
252
			}
253
		});
254
	}
255

    
256
	@Override
257
	public void onHoldPayment(final String budgetId, String comment, String personId) {
258
		budgetDAO.accountingOnHoldBudget(budgetId);
259
		budgetDAO.saveComment(budgetId, personId, comment, null);
260

    
261
		executorService.submit(new Runnable() {
262
			@Override
263
			public void run() {
264
				try {
265
					BudgetInfo budgetInfo = getBudget(budgetId);
266
					List<Person> moderators = personManager.getModerators();
267

    
268
					emailUtils.sendUserRejectedBudgetEmail(budgetInfo);
269

    
270
					for (Person moderator : moderators)
271
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budgetInfo);
272

    
273
				} catch (Exception e) {
274
					e.printStackTrace();
275
				}
276
			}
277
		});
278
	}
279

    
280
	@Override
281
	public void budgetPaid(final String budgetId, String comment, String personId) {
282
		budgetDAO.accountingPaidBudget(budgetId);
283
		budgetDAO.saveComment(budgetId, personId, comment, null);
284

    
285
		executorService.submit(new Runnable() {
286
			@Override
287
			public void run() {
288
				try {
289
					BudgetInfo budgetInfo = getBudget(budgetId);
290
					List<Person> moderators = personManager.getModerators();
291

    
292
					emailUtils.sendUserRejectedBudgetEmail(budgetInfo);
293

    
294
					for (Person moderator : moderators)
295
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budgetInfo);
296

    
297
				} catch (Exception e) {
298
					e.printStackTrace();
299
				}
300
			}
301
		});
302
	}
303

    
304
	@Override
305
	public void uploadInitialContract(String budgetId, String contentType, InputStream inputStream) {
306
		budgetDAO.uploadInitialContract(budgetId, contentType, inputStream);
307
	}
308

    
309
	@Override
310
	public void uploadBeneficiaryContract(String budgetId, String contentType, InputStream inputStream) {
311
		budgetDAO.uploadBeneficiaryContract(budgetId, contentType, inputStream);
312
	}
313

    
314
	@Override
315
	public void uploadSignedContract(String budgetId, String contentType, InputStream inputStream) {
316
		budgetDAO.uploadSignedContract(budgetId, contentType, inputStream);
317
	}
318

    
319
	@Override
320
	public void uploadBankReceipt(String budgetId, String contentType, InputStream inputStream) {
321
		budgetDAO.uploadBankReceipt(budgetId, contentType, inputStream);
322
	}
323

    
324
	private BudgetInfo getBudgetInfo(Budget budget) {
325
		BudgetInfo budgetInfo = new BudgetInfo();
326

    
327
		budgetInfo.setId(budget.getId());
328
		budgetInfo.setDate(budget.getDate());
329
		budgetInfo.setStartDate(budget.getStartDate());
330
		budgetInfo.setEndDate(budget.getEndDate());
331
		budgetInfo.setAmountGranted(budget.getAmountGranted());
332
		budgetInfo.setAmountRequested(budget.getAmountRequested());
333
		budgetInfo.setRemaining(budget.getRemaining());
334
		budgetInfo.setCurrency(budget.getCurrency());
335
		budgetInfo.setStatusCode(budget.getStatusCode());
336
		budgetInfo.setStatus(getStatus(budget.getStatusCode()));
337
		budgetInfo.setComments(budgetDAO.getBudgetComments(budget.getId()));
338
		budgetInfo.setBankAccount(budget.getBankAccount());
339

    
340
		if (budget.getUser() != null) {
341
			try {
342
				budgetInfo.setUser(personManager.getById(budget.getUser()));
343
			} catch (PersonManagerException e) {
344
				e.printStackTrace();
345
			}
346
		}
347

    
348
		if (budget.getOrganisation() != null) {
349
			try {
350
				budgetInfo.setOrganisation(organizationManager.getById(budget.getOrganisation()));
351
			} catch (OrganizationManagerException e) {
352
				e.printStackTrace();
353
			}
354
		}
355

    
356
		if (budget.getPublisher() != null) {
357
			budgetInfo.setPublisher(publisherManager.getPublisher(budget.getPublisher()));
358
		}
359

    
360
		if (budget.getInvoice() != null)
361
			try {
362
				budgetInfo.setInvoice(invoiceManager.getInvoice(budget.getInvoice()));
363
			} catch (ManagerException e) {
364
				e.printStackTrace();
365
			}
366

    
367
		for (Comment c: budgetInfo.getComments()) {
368
			try {
369
				c.setPerson(personManager.getById(c.getPerson().getId()));
370
			} catch (PersonManagerException e) {
371
				e.printStackTrace();
372
			}
373
		}
374

    
375
		return budgetInfo;
376
	}
377

    
378
	private Budget.Status getStatus(int statusCode) {
379
		return Budget.Status.forStatus(statusCode);
380
	}
381
}
(2-2/29)