Project

General

Profile

1
package eu.dnetlib.goldoa.service;
2

    
3
import eu.dnetlib.goldoa.domain.Budget;
4
import eu.dnetlib.goldoa.domain.Organization;
5
import eu.dnetlib.goldoa.domain.PersonManagerException;
6
import eu.dnetlib.goldoa.domain.User;
7
import eu.dnetlib.goldoa.service.dao.BudgetDAO;
8
import eu.dnetlib.goldoa.service.utils.EmailUtils;
9
import org.springframework.beans.factory.annotation.Autowired;
10
import org.springframework.stereotype.Service;
11
import org.springframework.transaction.annotation.Transactional;
12

    
13
import java.io.InputStream;
14
import java.text.SimpleDateFormat;
15
import java.util.Arrays;
16
import java.util.Date;
17
import java.util.List;
18
import java.util.concurrent.ExecutorService;
19

    
20
/*
21
 * Created by antleb on 4/2/15.
22
*/
23

    
24
@Transactional
25
@Service("budgetManager")
26
public class BudgetManagerImpl implements BudgetManager {
27

    
28
	@Autowired private BudgetDAO budgetDAO;
29
	@Autowired private UserManager userManager;
30
	@Autowired private OrganizationManager organizationManager;
31
	@Autowired private PublisherManager publisherManager;
32
	@Autowired private ExecutorService executorService;
33
	@Autowired private EmailUtils emailUtils;
34

    
35
	@Override
36
	public Budget saveBudget(final Budget budget) {
37

    
38
		if(budget.getId() == null){
39
			//getRequestId
40
			budget.setId("B-" + new SimpleDateFormat("yyyyMMdd-").format(new Date()) + budgetDAO.getRequestId());
41
			budget.setDate(new Date());
42
			budget.setRemaining(budget.getAmountGranted());
43
		}
44
		budgetDAO.saveBudget(budget);
45
		return budget;
46
	}
47

    
48
	@Override
49
	public Budget submitBudgetRequest(final Budget budget) {
50
		budget.setStatus(Budget.Status.SUBMITTED);
51
		saveBudget(budget);
52
		executorService.submit(new Runnable() {
53
			@Override
54
			public void run() {
55
				try {
56

    
57
					List<User> moderators = userManager.getModerators();
58
					emailUtils.sendUserNewBudgetEmail(budget);
59

    
60
					for (User moderator : moderators)
61
						emailUtils.sendModeratorNewBudgetEmail(moderator, budget);
62

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

    
69
		return budget;
70
	}
71

    
72
	@Override
73
	public Budget getBudget(String budgetId) {
74
		return budgetDAO.getBudget(budgetId);
75
	}
76

    
77
	@Override
78
	public List<Budget> getBudgets() {
79
		return budgetDAO.getBudgets();		
80
	}
81

    
82
	@Override
83
	public List<Budget> getBudgetsForUser(String user_email) {
84
		return budgetDAO.getBudgetsForUser(user_email);
85
	}
86

    
87
	@Override
88
	public List<Budget> getBudgetsForPublisher(String publisherEmail) {
89
		return budgetDAO.getBudgetsForPublisher(publisherEmail);
90
	}
91

    
92
	@Override
93
	public List<Budget> getBudgetsForAccounting() {
94
		return budgetDAO.getBudgetsForAccounting();
95
	}
96

    
97
	@Override
98
	public List<Budget> getBudgetsForOrganization(List<String> organizationIds) {
99
		return budgetDAO.getBudgetsForOrganization(organizationIds);
100
	}
101

    
102
	@Override
103
	public void initiallyApproveBudgetRequest(final String budgetId, String comment, String email) {
104
		budgetDAO.initiallyApproveBudget(budgetId);
105
		User user = null;
106
		try {
107
			user = userManager.getByEmail(email);
108
		} catch (PersonManagerException e) {
109
			e.printStackTrace();
110
		}
111
		budgetDAO.saveComment(budgetId, user, comment, null);
112

    
113
		executorService.submit(new Runnable() {
114
			@Override
115
			public void run() {
116
				try {
117
					List<User> moderators = userManager.getModerators();
118
					Budget budget = budgetDAO.getBudget(budgetId);
119
					emailUtils.sendUserAcceptedBudgetEmail(budget);
120

    
121
					for (User moderator : moderators)
122
						emailUtils.sendModeratorAcceptedBudgetEmail(moderator, budget);
123

    
124
				} catch (Exception e) {
125
					e.printStackTrace();
126
				}
127
			}
128
		});
129
	}
130

    
131
	@Override
132
	public void approveBudgetRequest(final String budgetId, String comment, float amountGranted, String email) {
133
		budgetDAO.approveBudget(budgetId, amountGranted);
134

    
135
		User user = null;
136
		try {
137
			user = userManager.getByEmail(email);
138
		} catch (PersonManagerException e) {
139
			e.printStackTrace();
140
		}
141

    
142
		budgetDAO.saveComment(budgetId, user, comment, null);
143

    
144
		executorService.submit(new Runnable() {
145
			@Override
146
			public void run() {
147
				try {
148
					Budget budget = budgetDAO.getBudget(budgetId);
149
					List<User> moderators = userManager.getModerators();
150
					emailUtils.sendUserAcceptedBudgetEmail(budget);
151

    
152
					for (User moderator : moderators)
153
						emailUtils.sendModeratorAcceptedBudgetEmail(moderator, budget);
154

    
155
				} catch (Exception e) {
156
					e.printStackTrace();
157
				}
158
			}
159
		});
160
	}
161

    
162
	@Override
163
	public void rejectBudgetRequest(final String budgetId, String comment, String email) {
164
		budgetDAO.rejectBudget(budgetId);
165
		//budgetDAO.updateBudgetComment(budgetId, comment);
166

    
167
        User user = null;
168
        try {
169
            user = userManager.getByEmail(email);
170
        } catch (PersonManagerException e) {
171
            e.printStackTrace();
172
        }
173

    
174
        budgetDAO.saveComment(budgetId, user , comment, null);
175

    
176
		executorService.submit(new Runnable() {
177
			@Override
178
			public void run() {
179
				try {
180
					List<User> moderators = userManager.getModerators();
181
					Budget budget = budgetDAO.getBudget(budgetId);
182
					emailUtils.sendUserRejectedBudgetEmail(budget);
183

    
184
					for (User moderator : moderators)
185
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
186

    
187
				} catch (Exception e) {
188
					e.printStackTrace();
189
				}
190
			}
191
		});
192
	}
193

    
194
	@Override
195
	public void processingPayment(final String budgetId, String comment, String email) {
196
		budgetDAO.processingBudget(budgetId);
197

    
198
		User user = null;
199
		/*try {
200
			user = userManager.getByEmail(email);
201
		} catch (PersonManagerException e) {
202
			e.printStackTrace();
203
		}
204
*/
205
		budgetDAO.saveComment(budgetId, user, comment, null);
206

    
207
		executorService.submit(new Runnable() {
208
			@Override
209
			public void run() {
210
				try {
211
					List<User> moderators = userManager.getModerators();
212
					Budget budget = budgetDAO.getBudget(budgetId);
213
					emailUtils.sendUserRejectedBudgetEmail(budget);
214

    
215
					for (User moderator : moderators)
216
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
217

    
218
				} catch (Exception e) {
219
					e.printStackTrace();
220
				}
221
			}
222
		});
223
	}
224

    
225
	@Override
226
	public void denyPayment(final String budgetId, String comment, String email) {
227
		budgetDAO.accountingDeniedBudget(budgetId);
228

    
229
		User user = null;
230
		try {
231
			user = userManager.getByEmail(email);
232
		} catch (PersonManagerException e) {
233
			e.printStackTrace();
234
		}
235

    
236
		budgetDAO.saveComment(budgetId, user, comment, null);
237

    
238
		executorService.submit(new Runnable() {
239
			@Override
240
			public void run() {
241
				try {
242
					List<User> moderators = userManager.getModerators();
243
					Budget budget = budgetDAO.getBudget(budgetId);
244
					emailUtils.sendUserRejectedBudgetEmail(budget);
245

    
246
					for (User moderator : moderators)
247
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
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 email) {
258
		budgetDAO.accountingOnHoldBudget(budgetId);
259

    
260
		User user = null;
261
		try {
262
			user = userManager.getByEmail(email);
263
		} catch (PersonManagerException e) {
264
			e.printStackTrace();
265
		}
266

    
267
		budgetDAO.saveComment(budgetId, user, comment, null);
268

    
269
		executorService.submit(new Runnable() {
270
			@Override
271
			public void run() {
272
				try {
273
					List<User> moderators = userManager.getModerators();
274
					Budget budget = budgetDAO.getBudget(budgetId);
275
					emailUtils.sendUserRejectedBudgetEmail(budget);
276

    
277
					for (User moderator : moderators)
278
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
279

    
280
				} catch (Exception e) {
281
					e.printStackTrace();
282
				}
283
			}
284
		});
285
	}
286

    
287
	@Override
288
	public void budgetPaid(final String budgetId, String comment, String email) {
289
		budgetDAO.accountingPaidBudget(budgetId);
290

    
291
		User user = null;
292
		try {
293
			user = userManager.getByEmail(email);
294
		} catch (PersonManagerException e) {
295
			e.printStackTrace();
296
		}
297

    
298
		budgetDAO.saveComment(budgetId, user, comment, null);
299

    
300
		executorService.submit(new Runnable() {
301
			@Override
302
			public void run() {
303
				try {
304
					Budget budget = budgetDAO.getBudget(budgetId);
305
					List<User> moderators = userManager.getModerators();
306
					emailUtils.sendUserRejectedBudgetEmail(budget);
307

    
308
					for (User moderator : moderators)
309
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
310

    
311
				} catch (Exception e) {
312
					e.printStackTrace();
313
				}
314
			}
315
		});
316
	}
317

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

    
323
	@Override
324
	public void uploadBeneficiaryContract(String budgetId, String contentType, InputStream inputStream) {
325
		budgetDAO.uploadBeneficiaryContract(budgetId, contentType, inputStream);
326
	}
327

    
328
	@Override
329
	public void uploadSignedContract(String budgetId, String contentType, InputStream inputStream) {
330
		budgetDAO.uploadSignedContract(budgetId, contentType, inputStream);
331
	}
332

    
333
	@Override
334
	public void uploadBankReceipt(String budgetId, String contentType, InputStream inputStream) {
335
		budgetDAO.uploadBankReceipt(budgetId, contentType, inputStream);
336
	}
337

    
338
	@Override
339
	public Budget getForRequest(String organizationId, String publisherEmail) {
340
		List<Budget> budgets;
341
		Budget res = null;
342

    
343
		if (organizationId != null) {
344
			budgets = getBudgetsForOrganization(Arrays.asList(organizationId));
345

    
346
			for (Budget budget : budgets) {
347
				if (isValid(budget)) {
348
					res = budget;
349

    
350
					break;
351
				}
352
			}
353
		} else if (publisherEmail != null) {
354
			budgets = getBudgetsForPublisher(publisherEmail);
355

    
356
			for (Budget budget : budgets) {
357
				if (isValid(budget)) {
358
					res = budget;
359

    
360
					break;
361
				}
362
			}
363
		}
364

    
365
		return res;
366
	}
367

    
368
	private boolean isValid(Budget budget) {
369
		return budget.getStatus().getCode() == Budget.Status.ACCOUNTING_PAID.getCode();
370

    
371
	}
372

    
373
	private Budget.Status getStatus(int statusCode) {
374
		return Budget.Status.forStatus(statusCode);
375
	}
376

    
377
	public Organization getOrganizationForBudget(String budgetID){
378
		return budgetDAO.getOrganizationForBudget(budgetID);
379
	}
380
}
(2-2/29)