///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.humanresources; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.Serializable; import java.math.BigDecimal; import java.util.Calendar; import java.util.Locale; import java.util.TimeZone; import org.junit.Before; import org.junit.Test; import org.projectforge.access.AccessException; import org.projectforge.access.OperationType; import org.projectforge.common.DateHelper; import org.projectforge.common.DateHolder; import org.projectforge.fibu.KundeDO; import org.projectforge.fibu.KundeDao; import org.projectforge.fibu.ProjektDO; import org.projectforge.test.TestBase; import org.projectforge.user.GroupDO; import org.projectforge.user.GroupDao; import org.projectforge.user.PFUserDO; import org.projectforge.user.UserGroupCache; import org.projectforge.user.UserRightDO; import org.projectforge.user.UserRightId; import org.projectforge.user.UserRightValue; import org.projectforge.user.UserRights; public class HRPlanningTest extends TestBase { private static ProjektDO projekt1, projekt2; private GroupDao groupDao; private HRPlanningDao hrPlanningDao; private KundeDao kundeDao; private UserGroupCache userGroupCache; private static boolean initialized; public void setGroupDao(GroupDao groupDao) { this.groupDao = groupDao; } public void setHrPlanningDao(HRPlanningDao hrPlanningDao) { this.hrPlanningDao = hrPlanningDao; } public void setKundeDao(KundeDao kundeDao) { this.kundeDao = kundeDao; } public void setUserGroupCache(UserGroupCache userGroupCache) { this.userGroupCache = userGroupCache; } @Before public void createProjekts() { if (initialized == true) { return; } logon(TestBase.TEST_FINANCE_USER); final KundeDO kunde = new KundeDO(); kunde.setName("ACME ltd."); kunde.setId(59); kundeDao.save(kunde); projekt1 = initTestDB.addProjekt(kunde, 0, "Web portal"); projekt2 = initTestDB.addProjekt(kunde, 1, "Order management"); initialized = true; } @Test public void testUserRights() { PFUserDO user1 = initTestDB.addUser("HRPlanningTestUser1"); final HRPlanningRight right = (HRPlanningRight) UserRights.instance().getRight(UserRightId.PM_HR_PLANNING); assertFalse(right.isAvailable(userGroupCache, user1)); final HRPlanningDO planning = new HRPlanningDO().setUser(getUser(TestBase.TEST_USER)); logon(user1); assertFalse(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false)); try { hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, true); fail("AccessException excepted."); } catch (AccessException ex) { // OK } logon(TestBase.TEST_ADMIN_USER); GroupDO group = initTestDB.getGroup(ORGA_GROUP); group.getAssignedUsers().add(user1); groupDao.update(group); assertTrue(right.isAvailable(userGroupCache, user1)); logon(user1); assertFalse(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false)); assertTrue(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, false)); assertFalse(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, planning, false)); assertFalse(accessChecker.hasLoggedInUserHistoryAccess(UserRightId.PM_HR_PLANNING, planning, false)); assertFalse(accessChecker.hasLoggedInUserInsertAccess(UserRightId.PM_HR_PLANNING, planning, false)); logon(TestBase.TEST_ADMIN_USER); user1.addRight(new UserRightDO(user1, UserRightId.PM_HR_PLANNING, UserRightValue.READONLY)); userDao.update(user1); logon(user1); assertTrue(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false)); assertTrue(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, planning, false)); assertTrue(accessChecker.hasLoggedInUserHistoryAccess(UserRightId.PM_HR_PLANNING, planning, false)); assertFalse(accessChecker.hasLoggedInUserInsertAccess(UserRightId.PM_HR_PLANNING, planning, false)); logon(TestBase.TEST_ADMIN_USER); user1 = userDao.getById(user1.getId()); user1.getRight(UserRightId.PM_HR_PLANNING).setValue(UserRightValue.READWRITE); userDao.update(user1); logon(user1); assertTrue(hrPlanningDao.hasLoggedInUserAccess(planning, null, OperationType.SELECT, false)); assertTrue(accessChecker.hasLoggedInUserSelectAccess(UserRightId.PM_HR_PLANNING, planning, false)); assertTrue(accessChecker.hasLoggedInUserHistoryAccess(UserRightId.PM_HR_PLANNING, planning, false)); assertTrue(accessChecker.hasLoggedInUserInsertAccess(UserRightId.PM_HR_PLANNING, planning, false)); } @Test public void getFirstDayOfWeek() { final java.sql.Date date = createDate(2010, Calendar.JANUARY, 9, 1, 10, 57, 456); assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(HRPlanningDO.getFirstDayOfWeek(date))); } @Test public void testBeginOfWeek() { logon(TestBase.TEST_FINANCE_USER); HRPlanningDO planning = new HRPlanningDO(); final java.sql.Date date = createDate(2010, Calendar.JANUARY, 9, 1, 10, 57, 456); final DateHolder firstDayOfWeek = new DateHolder(DateHelper.UTC); firstDayOfWeek.setDate(2010, Calendar.JANUARY, 4, 0, 0, 0, 0); final long millis = firstDayOfWeek.getTimeInMillis(); planning.setFirstDayOfWeek(date); assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(planning.getWeek())); assertEquals(millis, planning.getWeek().getTime()); // planning.setWeek(date); planning.setUser(getUser(TestBase.TEST_USER)); assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(planning.getWeek())); final Serializable id = hrPlanningDao.save(planning); planning = hrPlanningDao.getById(id); assertEquals("2010-01-04 00:00:00.000 +0000", DateHelper.formatAsUTC(planning.getWeek())); } @Test public void overwriteDeletedEntries() { logon(TestBase.TEST_FINANCE_USER); // Create planning: HRPlanningDO planning = new HRPlanningDO(); planning.setUser(getUser(TEST_USER)); planning.setWeek(createDate(2010, Calendar.JANUARY, 11, 0, 0, 0, 0)); assertUTCDate(planning.getWeek(), 2010, Calendar.JANUARY, 11, 0, 0, 0); HRPlanningEntryDO entry = new HRPlanningEntryDO(); setHours(entry, 1, 2, 3, 4, 5, 6); entry.setProjekt(projekt1); planning.addEntry(entry); entry = new HRPlanningEntryDO(); setHours(entry, 2, 4, 6, 8, 10, 12); entry.setStatus(HRPlanningEntryStatus.OTHER); planning.addEntry(entry); entry = new HRPlanningEntryDO(); setHours(entry, 6, 5, 4, 3, 2, 1); entry.setProjekt(projekt2); planning.addEntry(entry); Serializable id = hrPlanningDao.save(planning); // Check saved planning planning = hrPlanningDao.getById(id); assertUTCDate(planning.getWeek(), 2010, Calendar.JANUARY, 11, 0, 0, 0); assertEquals(3, planning.getEntries().size()); assertHours(planning.getProjectEntry(projekt1), 1, 2, 3, 4, 5, 6); assertHours(planning.getProjectEntry(projekt2), 6, 5, 4, 3, 2, 1); assertHours(planning.getStatusEntry(HRPlanningEntryStatus.OTHER), 2, 4, 6, 8, 10, 12); // Delete entry planning.getProjectEntry(projekt1).setDeleted(true); hrPlanningDao.update(planning); // Check deleted entry and re-adding it planning = hrPlanningDao.getById(id); assertTrue(planning.getProjectEntry(projekt1).isDeleted()); entry = new HRPlanningEntryDO(); setHours(entry, 7, 9, 11, 1, 3, 5); entry.setProjekt(projekt1); planning.addEntry(entry); hrPlanningDao.update(planning); } private void setHours(final HRPlanningEntryDO entry, final int monday, final int tuesday, final int wednesday, final int thursday, final int friday, final int weekend) { entry.setMondayHours(new BigDecimal(monday)); entry.setTuesdayHours(new BigDecimal(tuesday)); entry.setWednesdayHours(new BigDecimal(wednesday)); entry.setThursdayHours(new BigDecimal(thursday)); entry.setFridayHours(new BigDecimal(friday)); entry.setWeekendHours(new BigDecimal(weekend)); } private void assertHours(final HRPlanningEntryDO entry, final int monday, final int tuesday, final int wednesday, final int thursday, final int friday, final int weekend) { assertBigDecimal(monday, entry.getMondayHours()); assertBigDecimal(tuesday, entry.getTuesdayHours()); assertBigDecimal(wednesday, entry.getWednesdayHours()); assertBigDecimal(thursday, entry.getThursdayHours()); assertBigDecimal(friday, entry.getFridayHours()); assertBigDecimal(weekend, entry.getWeekendHours()); } private java.sql.Date createDate(int year, int month, int day, int hour, int minute, int second, int millisecond) { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.GERMAN); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); cal.set(Calendar.DAY_OF_MONTH, day); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, minute); cal.set(Calendar.SECOND, second); cal.set(Calendar.MILLISECOND, millisecond); return new java.sql.Date(cal.getTimeInMillis()); } }