Project

General

Profile

1
package eu.dnetlib.goldoa.service;
2

    
3
import eu.dnetlib.goldoa.domain.Budget;
4
import eu.dnetlib.goldoa.domain.Comment;
5
import eu.dnetlib.goldoa.domain.ManagerException;
6
import eu.dnetlib.goldoa.domain.OrganizationManagerException;
7
import eu.dnetlib.goldoa.domain.User;
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.stereotype.Service;
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.Arrays;
19
import java.util.Date;
20
import java.util.List;
21
import java.util.UUID;
22
import java.util.concurrent.ExecutorService;
23

    
24
/*
25
 * Created by antleb on 4/2/15.
26
*/
27

    
28
@Transactional
29
@Service
30
public class BudgetManagerImpl implements BudgetManager {
31

    
32
	@Autowired private BudgetDAO budgetDAO;
33
	@Autowired private UserManager userManager;
34
	@Autowired private OrganizationManager organizationManager;
35
	@Autowired private PublisherManager publisherManager;
36
	@Autowired private ExecutorService executorService;
37
	@Autowired private EmailUtils emailUtils;
38

    
39
	@Override
40
	public Budget saveBudget(final Budget budget) {
41
		
42
		if(budget.getId() == null){
43
			//getRequestId
44
			budget.setId("B-" + new SimpleDateFormat("yyyyMMdd-").format(new Date()) + budgetDAO.getRequestId());
45
			budget.setDate(new Date());
46
			budget.setRemaining(budget.getAmountGranted());
47
		}
48
		budgetDAO.saveBudget(budget);
49
		return budget;
50
	}
51

    
52
	@Override
53
	public Budget submitBudgetRequest(final Budget budget) {
54
		budget.setStatus(Budget.Status.SUBMITTED);
55

    
56
		saveBudget(budget);
57

    
58
		executorService.submit(new Runnable() {
59
			@Override
60
			public void run() {
61
				try {
62
					
63
					List<User> moderators = userManager.getModerators();
64
					emailUtils.sendUserNewBudgetEmail(budget);
65

    
66
					for (User moderator : moderators)
67
						emailUtils.sendModeratorNewBudgetEmail(moderator, budget);
68

    
69
				} catch (Exception e) {
70
					e.printStackTrace();
71
				}
72
			}
73
		});
74

    
75
		return budget;
76
	}
77

    
78
	@Override
79
	public Budget getBudget(String budgetId) {
80
		return budgetDAO.getBudget(budgetId);
81
	}
82

    
83
	@Override
84
	public List<Budget> getBudgets() {
85
		return budgetDAO.getBudgets();		
86
	}
87

    
88
	@Override
89
	public List<Budget> getBudgetsForUser(String user_email) {
90
		return budgetDAO.getBudgetsForUser(user_email);
91
	}
92

    
93
	@Override
94
	public List<Budget> getBudgetsForPublisher(String publisherId) {
95
		return budgetDAO.getBudgetsForPublisher(publisherId);
96
	}
97

    
98
	@Override
99
	public List<Budget> getBudgetsForAccounting() {
100
		return budgetDAO.getBudgetsForAccounting();
101
	}
102

    
103
	@Override
104
	public List<Budget> getBudgetsForOrganization(List<String> organizationIds) {
105
		return budgetDAO.getBudgetsForOrganization(organizationIds);
106
	}
107

    
108
	@Override
109
	public void initiallyApproveBudgetRequest(final String budgetId, String comment, String email) {
110
		budgetDAO.initiallyApproveBudget(budgetId);
111
		User user = null;
112
		try {
113
			user = userManager.getByEmail(email);
114
		} catch (PersonManagerException e) {
115
			e.printStackTrace();
116
		}
117
		budgetDAO.saveComment(budgetId, user, comment, null);
118

    
119
		executorService.submit(new Runnable() {
120
			@Override
121
			public void run() {
122
				try {
123
					List<User> moderators = userManager.getModerators();
124
					Budget budget = budgetDAO.getBudget(budgetId);
125
					emailUtils.sendUserAcceptedBudgetEmail(budget);
126

    
127
					for (User moderator : moderators)
128
						emailUtils.sendModeratorAcceptedBudgetEmail(moderator, budget);
129

    
130
				} catch (Exception e) {
131
					e.printStackTrace();
132
				}
133
			}
134
		});
135
	}
136

    
137
	@Override
138
	public void approveBudgetRequest(final String budgetId, String comment, float amountGranted, String email) {
139
		budgetDAO.approveBudget(budgetId, amountGranted);
140

    
141
		User user = null;
142
		try {
143
			user = userManager.getByEmail(email);
144
		} catch (PersonManagerException e) {
145
			e.printStackTrace();
146
		}
147

    
148
		budgetDAO.saveComment(budgetId, user, comment, null);
149

    
150
		executorService.submit(new Runnable() {
151
			@Override
152
			public void run() {
153
				try {
154
					Budget budget = budgetDAO.getBudget(budgetId);
155
					List<User> moderators = userManager.getModerators();
156
					emailUtils.sendUserAcceptedBudgetEmail(budget);
157

    
158
					for (User moderator : moderators)
159
						emailUtils.sendModeratorAcceptedBudgetEmail(moderator, budget);
160

    
161
				} catch (Exception e) {
162
					e.printStackTrace();
163
				}
164
			}
165
		});
166
	}
167

    
168
	@Override
169
	public void rejectBudgetRequest(final String budgetId, String comment, String email) {
170
		budgetDAO.rejectBudget(budgetId);
171
		//budgetDAO.updateBudgetComment(budgetId, comment);
172

    
173
        User user = null;
174
        try {
175
            user = userManager.getByEmail(email);
176
        } catch (PersonManagerException e) {
177
            e.printStackTrace();
178
        }
179

    
180
        budgetDAO.saveComment(budgetId, user , comment, null);
181

    
182
		executorService.submit(new Runnable() {
183
			@Override
184
			public void run() {
185
				try {
186
					List<User> moderators = userManager.getModerators();
187
					Budget budget = budgetDAO.getBudget(budgetId);
188
					emailUtils.sendUserRejectedBudgetEmail(budget);
189

    
190
					for (User moderator : moderators)
191
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
192

    
193
				} catch (Exception e) {
194
					e.printStackTrace();
195
				}
196
			}
197
		});
198
	}
199

    
200
	@Override
201
	public void processingPayment(final String budgetId, String comment, String email) {
202
		budgetDAO.processingBudget(budgetId);
203

    
204
		User user = null;
205
		/*try {
206
			user = userManager.getByEmail(email);
207
		} catch (PersonManagerException e) {
208
			e.printStackTrace();
209
		}
210
*/
211
		budgetDAO.saveComment(budgetId, user, comment, null);
212

    
213
		executorService.submit(new Runnable() {
214
			@Override
215
			public void run() {
216
				/*try {
217
					List<User> moderators = userManager.getModerators();
218
					Budget budget = budgetDAO.getBudget(budgetId);
219
					emailUtils.sendUserRejectedBudgetEmail(budget);
220

    
221
					for (User moderator : moderators)
222
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
223

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

    
231
	@Override
232
	public void denyPayment(final String budgetId, String comment, String email) {
233
		budgetDAO.accountingDeniedBudget(budgetId);
234

    
235
		User user = null;
236
		try {
237
			user = userManager.getByEmail(email);
238
		} catch (PersonManagerException e) {
239
			e.printStackTrace();
240
		}
241

    
242
		budgetDAO.saveComment(budgetId, user, comment, null);
243

    
244
		executorService.submit(new Runnable() {
245
			@Override
246
			public void run() {
247
				try {
248
					List<User> moderators = userManager.getModerators();
249
					Budget budget = budgetDAO.getBudget(budgetId);
250
					emailUtils.sendUserRejectedBudgetEmail(budget);
251

    
252
					for (User moderator : moderators)
253
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
254

    
255
				} catch (Exception e) {
256
					e.printStackTrace();
257
				}
258
			}
259
		});
260
	}
261

    
262
	@Override
263
	public void onHoldPayment(final String budgetId, String comment, String email) {
264
		budgetDAO.accountingOnHoldBudget(budgetId);
265

    
266
		User user = null;
267
		try {
268
			user = userManager.getByEmail(email);
269
		} catch (PersonManagerException e) {
270
			e.printStackTrace();
271
		}
272

    
273
		budgetDAO.saveComment(budgetId, user, comment, null);
274

    
275
		executorService.submit(new Runnable() {
276
			@Override
277
			public void run() {
278
				try {
279
					List<User> moderators = userManager.getModerators();
280
					Budget budget = budgetDAO.getBudget(budgetId);
281
					emailUtils.sendUserRejectedBudgetEmail(budget);
282

    
283
					for (User moderator : moderators)
284
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
285

    
286
				} catch (Exception e) {
287
					e.printStackTrace();
288
				}
289
			}
290
		});
291
	}
292

    
293
	@Override
294
	public void budgetPaid(final String budgetId, String comment, String email) {
295
		budgetDAO.accountingPaidBudget(budgetId);
296

    
297
		User user = null;
298
		try {
299
			user = userManager.getByEmail(email);
300
		} catch (PersonManagerException e) {
301
			e.printStackTrace();
302
		}
303

    
304
		budgetDAO.saveComment(budgetId, user, comment, null);
305

    
306
		executorService.submit(new Runnable() {
307
			@Override
308
			public void run() {
309
				try {
310
					Budget budget = budgetDAO.getBudget(budgetId);
311
					List<User> moderators = userManager.getModerators();
312
					emailUtils.sendUserRejectedBudgetEmail(budget);
313

    
314
					for (User moderator : moderators)
315
						emailUtils.sendModeratorRejectedBudgetEmail(moderator, budget);
316

    
317
				} catch (Exception e) {
318
					e.printStackTrace();
319
				}
320
			}
321
		});
322
	}
323

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

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

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

    
339
	@Override
340
	public void uploadBankReceipt(String budgetId, String contentType, InputStream inputStream) {
341
		budgetDAO.uploadBankReceipt(budgetId, contentType, inputStream);
342
	}
343

    
344
	@Override
345
	public Budget getForRequest(String organizationId, String publisherId) {
346
		List<Budget> budgets;
347
		Budget res = null;
348

    
349
		if (organizationId != null) {
350
			budgets = getBudgetsForOrganization(Arrays.asList(organizationId));
351

    
352
			for (Budget budget : budgets) {
353
				if (isValid(budget)) {
354
					res = budget;
355

    
356
					break;
357
				}
358
			}
359
		} else if (publisherId != null) {
360
			budgets = getBudgetsForPublisher(publisherId);
361

    
362
			for (Budget budget : budgets) {
363
				if (isValid(budget)) {
364
					res = budget;
365

    
366
					break;
367
				}
368
			}
369
		}
370

    
371
		return res;
372
	}
373

    
374
	private boolean isValid(Budget budget) {
375
		return budget.getStatus().getCode() == Budget.Status.ACCOUNTING_PAID.getCode();
376

    
377
	}
378

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