001    /**
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package edu.sampleu.travel.dataobject;
017    
018    import edu.sampleu.travel.options.ExpenseType;
019    import edu.sampleu.travel.options.PostalCountryCode;
020    import edu.sampleu.travel.options.PostalStateCode;
021    import edu.sampleu.travel.options.TripType;
022    import org.junit.Test;
023    import org.kuali.rice.core.api.util.type.KualiDecimal;
024    import org.kuali.rice.krad.UserSession;
025    import org.kuali.rice.krad.data.PersistenceOption;
026    import org.kuali.rice.krad.document.Document;
027    import org.kuali.rice.krad.service.KRADServiceLocator;
028    import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
029    import org.kuali.rice.krad.test.KRADTestCase;
030    import org.kuali.rice.krad.util.GlobalVariables;
031    import org.kuali.rice.krad.util.MessageMap;
032    import org.kuali.rice.test.BaselineTestCase;
033    
034    import java.math.BigDecimal;
035    import java.text.SimpleDateFormat;
036    
037    import static org.junit.Assert.assertEquals;
038    import static org.junit.Assert.assertNotNull;
039    import static org.junit.Assert.assertTrue;
040    
041    /**
042     * Tests basic {@code TravelAuthorizationDocument} persistence.
043     *
044     * @author Kuali Rice Team (rice.collab@kuali.org)
045     */
046    @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.ROLLBACK_CLEAR_DB)
047    public class TravelAuthorizationDocumentTest extends KRADTestCase {
048    
049        private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
050    
051        private static final String DOCUMENT_DESCRIPTION = "Test Travel Authorization Document";
052        private static final String TRIP_BEGIN = "2010-01-01";
053        private static final String TRIP_END = "2010-02-01";
054        private static final String TRIP_DESCRIPTION = "Test Trip";
055        private static final String TRAVEL_TYPE_CODE = TripType.OS.getCode();
056        private static final KualiDecimal EXPENSE_LIMIT = new KualiDecimal(10000);
057        private static final String CELL_PHONE_NUMBER = "555-555-5555";
058    
059        private static String TRAVELER_DETAIL_ID;
060        private static final String PRINCIPAL_ID = "admin";
061    
062        private static String TRAVEL_DESTINATION_ID;
063        private static final String DESTINATION_NAME = PostalStateCode.CA.getLabel();
064        private static final String COUNTRY_CODE = PostalCountryCode.US.getCode();
065        private static final String STATE_CODE = PostalStateCode.CA.getCode();
066    
067        private static String MILEAGE_RATE_ID;
068        private static final String MILEAGE_RATE_CODE = "DO";
069        private static final String MILEAGE_RATE_NAME = "Domestic";
070        private static final BigDecimal MILEAGE_RATE = new BigDecimal("1994.88");
071    
072        private static final String PER_DIEM_DATE = "2010-01-01";
073        private static final BigDecimal BREAKFAST_VALUE = new BigDecimal("15.00");
074        private static final BigDecimal LUNCH_VALUE = new BigDecimal("30.00");
075        private static final BigDecimal DINNER_VALUE = new BigDecimal("45.00");
076        private static final BigDecimal INCIDENTALS_VALUE = new BigDecimal("15.00");
077        private static final BigDecimal ESTIMATED_MILEAGE = new BigDecimal("50");
078    
079        private static final String EXPENSE_TYPE = ExpenseType.A.getCode();
080        private static final String EXPENSE_DESCRIPTION = ExpenseType.A.getLabel();
081        private static final String TRAVEL_COMPANY_NAME = "Zorba's Travel";
082        private static final String EXPENSE_DATE = "2010-01-01";
083        private static final BigDecimal EXPENSE_AMOUNT = new BigDecimal("1236.49");
084    
085        @Override
086        public void setUp() throws Exception {
087            super.setUp();
088            GlobalVariables.setMessageMap(new MessageMap());
089            GlobalVariables.setUserSession(new UserSession("admin"));
090    
091            TravelerDetail newTravelerDetail = new TravelerDetail();
092            newTravelerDetail.setPrincipalId(PRINCIPAL_ID);
093            TRAVELER_DETAIL_ID = KRADServiceLocator.getDataObjectService().save(
094                    newTravelerDetail, PersistenceOption.FLUSH).getId();
095    
096            TravelDestination newTravelDestination = new TravelDestination();
097            newTravelDestination.setTravelDestinationName(DESTINATION_NAME);
098            newTravelDestination.setCountryCd(COUNTRY_CODE);
099            newTravelDestination.setStateCd(STATE_CODE);
100            TRAVEL_DESTINATION_ID = KRADServiceLocator.getDataObjectService().save(
101                    newTravelDestination, PersistenceOption.FLUSH).getTravelDestinationId();
102    
103            TravelMileageRate newTravelMileageRate = new TravelMileageRate();
104            newTravelMileageRate.setMileageRateCd(MILEAGE_RATE_CODE);
105            newTravelMileageRate.setMileageRateName(MILEAGE_RATE_NAME);
106            newTravelMileageRate.setMileageRate(MILEAGE_RATE);
107            MILEAGE_RATE_ID = KRADServiceLocator.getDataObjectService().save(
108                    newTravelMileageRate, PersistenceOption.FLUSH).getMileageRateId();
109        }
110    
111        @Override
112        public void tearDown() throws Exception {
113            GlobalVariables.setMessageMap(new MessageMap());
114            GlobalVariables.setUserSession(null);
115            super.tearDown();
116        }
117    
118        /**
119         * Tests basic {@code TravelAuthorizationDocument} persistence by saving it, reloading it, and checking the data.
120         *
121         * @throws java.lang.Exception for any exceptions occurring during creation
122         */
123        @Test
124        public void testTravelExpenseItem() throws Exception {
125            assertTrue(TravelExpenseItem.class.getName() + " is not mapped in JPA",
126                    KRADServiceLocator.getDataObjectService().supports(TravelAuthorizationDocument.class));
127    
128            String id = createTravelAuthorizationDocument();
129    
130            TravelAuthorizationDocument document = (TravelAuthorizationDocument) KRADServiceLocatorWeb.getDocumentService().getByDocumentHeaderId(id);
131            String documentNumber = document.getDocumentNumber();
132            assertNotNull("Travel Authorization Document is null", document);
133            assertNotNull("Travel Authorization Document ID is null", documentNumber);
134            assertEquals("Travel Authorization Document trip begin is incorrect", DATE_FORMAT.parse(TRIP_BEGIN), document.getTripBegin());
135            assertEquals("Travel Authorization Document trip end is incorrect", DATE_FORMAT.parse(TRIP_END), document.getTripEnd());
136            assertEquals("Travel Authorization Document trip description is incorrect", TRIP_DESCRIPTION, document.getTripDescription());
137            assertEquals("Travel Authorization Document trip destination ID is incorrect", TRAVEL_DESTINATION_ID, document.getTripDestinationId());
138            assertEquals("Travel Authorization Document traveler detail ID is incorrect", TRAVELER_DETAIL_ID, document.getTravelerDetailId());
139            assertEquals("Travel Authorization Document travel type code is incorrect", TRAVEL_TYPE_CODE, document.getTravelTypeCode());
140            assertEquals("Travel Authorization Document expense limit is incorrect", EXPENSE_LIMIT, document.getExpenseLimit());
141            assertEquals("Travel Authorization Document cell phone number is incorrect", CELL_PHONE_NUMBER, document.getCellPhoneNumber());
142    
143            assertTrue("Travel Authorization Document daily expense estimates is empty", !document.getDailyExpenseEstimates().isEmpty());
144            TravelPerDiemExpense travelPerDiemExpense = document.getDailyExpenseEstimates().get(0);
145            String travelPerDiemExpenseDocumentNumber = travelPerDiemExpense.getTravelAuthorizationDocumentId();
146            assertEquals("Travel Per Diem Expense document ID is incorrect", travelPerDiemExpenseDocumentNumber, documentNumber);
147    
148            assertTrue("Travel Authorization Document actual expense items is empty", !document.getActualExpenseItems().isEmpty());
149            TravelExpenseItem travelExpenseItem = document.getActualExpenseItems().get(0);
150            String travelExpenseItemDocumentNumber = travelExpenseItem.getTravelAuthorizationDocumentId();
151            assertEquals("Travel Expense Item document ID is incorrect", travelExpenseItemDocumentNumber, documentNumber);
152        }
153    
154        private String createTravelAuthorizationDocument() throws Exception {
155            Document newDocument = KRADServiceLocatorWeb.getDocumentService().getNewDocument(TravelAuthorizationDocument.class);
156            newDocument.getDocumentHeader().setDocumentDescription(DOCUMENT_DESCRIPTION);
157            TravelAuthorizationDocument newTravelAuthorizationDocument = (TravelAuthorizationDocument) newDocument;
158            newTravelAuthorizationDocument.setTripBegin(new java.sql.Date(DATE_FORMAT.parse(TRIP_BEGIN).getTime()));
159            newTravelAuthorizationDocument.setTripEnd(new java.sql.Date(DATE_FORMAT.parse(TRIP_END).getTime()));
160            newTravelAuthorizationDocument.setTripDescription(TRIP_DESCRIPTION);
161            newTravelAuthorizationDocument.setTripDestinationId(TRAVEL_DESTINATION_ID);
162            newTravelAuthorizationDocument.setTravelerDetailId(TRAVELER_DETAIL_ID);
163            newTravelAuthorizationDocument.setTravelTypeCode(TRAVEL_TYPE_CODE);
164            newTravelAuthorizationDocument.setExpenseLimit(EXPENSE_LIMIT);
165            newTravelAuthorizationDocument.setCellPhoneNumber(CELL_PHONE_NUMBER);
166    
167            TravelPerDiemExpense travelPerDiemExpense = new TravelPerDiemExpense();
168            travelPerDiemExpense.setTravelAuthorizationDocumentId(newTravelAuthorizationDocument.getDocumentNumber());
169            travelPerDiemExpense.setTravelDestinationId(TRAVEL_DESTINATION_ID);
170            travelPerDiemExpense.setPerDiemDate(DATE_FORMAT.parse(PER_DIEM_DATE));
171            travelPerDiemExpense.setBreakfastValue(BREAKFAST_VALUE);
172            travelPerDiemExpense.setLunchValue(LUNCH_VALUE);
173            travelPerDiemExpense.setDinnerValue(DINNER_VALUE);
174            travelPerDiemExpense.setIncidentalsValue(INCIDENTALS_VALUE);
175            travelPerDiemExpense.setMileageRateId(MILEAGE_RATE_ID);
176            travelPerDiemExpense.setEstimatedMileage(ESTIMATED_MILEAGE);
177            newTravelAuthorizationDocument.getDailyExpenseEstimates().add(travelPerDiemExpense);
178    
179            TravelExpenseItem travelExpenseItem = new TravelExpenseItem();
180            travelExpenseItem.setTravelAuthorizationDocumentId(newTravelAuthorizationDocument.getDocumentNumber());
181            travelExpenseItem.setTravelExpenseTypeCd(EXPENSE_TYPE);
182            travelExpenseItem.setExpenseDesc(EXPENSE_DESCRIPTION);
183            travelExpenseItem.setTravelCompanyName(TRAVEL_COMPANY_NAME);
184            travelExpenseItem.setExpenseDate(DATE_FORMAT.parse(EXPENSE_DATE));
185            travelExpenseItem.setExpenseAmount(EXPENSE_AMOUNT);
186            travelExpenseItem.setReimbursable(true);
187            travelExpenseItem.setTaxable(false);
188            newTravelAuthorizationDocument.getActualExpenseItems().add(travelExpenseItem);
189    
190            return KRADServiceLocatorWeb.getDocumentService().saveDocument(newTravelAuthorizationDocument).getDocumentNumber();
191        }
192    }