001    /*
002     * Copyright 2011 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 org.kuali.kfs.integration.ld;
017    
018    import java.util.Collection;
019    import java.util.List;
020    import java.util.Map;
021    import java.util.Set;
022    
023    import org.kuali.kfs.coa.businessobject.ObjectCode;
024    import org.kuali.rice.kew.exception.WorkflowException;
025    import org.kuali.rice.kns.util.KualiDecimal;
026    
027    /**
028     * This interface is exposing the service methods that may be used by the modules outside of labor
029     */
030    public interface LaborModuleService {
031    
032        /**
033         * find the employees who were paid based on a set of specified pay type within the given report periods. Here, a pay type can
034         * be determined by earn code and pay group.
035         * 
036         * @param payPeriods the given pay periods
037         * @param balanceTypes the specified balance type codes
038         * @param earnCodePayGroupMap the combination of earn codes and pay groups, where pay group is the key and earn code set is the
039         *        value
040         * @return the employees who were paid based on a set of specified pay type within the given report periods
041         */
042        public List<String> findEmployeesWithPayType(Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap);
043    
044        /**
045         * determine whether the given employee was paid based on a set of specified pay type within the given report periods. Here, a
046         * pay type can be determined by earn code and pay group.
047         * 
048         * @param emplid the given employee id
049         * @param payPeriods the given pay periods
050         * @param balanceTypes the specified balance type codes
051         * @param earnCodePayGroupMap the combination of earn codes and pay groups, where pay group is the key and earn code set is the
052         *        value
053         * @return true if the given employee was paid based on a set of specified pay type within the given report periods; otherwise,
054         *         false
055         */
056        public boolean isEmployeeWithPayType(String emplid, Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap);
057    
058        /**
059         * find all ledger balances matching the given criteria within the given fiscal years
060         * 
061         * @param fieldValues the given field values
062         * @param excludedFieldValues the given field values that must not be matched
063         * @param fiscalYears the given fiscal years
064         * @param balanceTypeList the given balance type code list
065         * @param positionObjectGroupCodes the specified position obejct group codes
066         * @return all ledger balances matching the given criteria within the given fiscal years
067         */
068        public Collection<LaborLedgerBalance> findLedgerBalances(Map<String, List<String>> fieldValues, Map<String, List<String>> excludedFieldValues, Set<Integer> fiscalYears, List<String> balanceTypes, List<String> positionObjectGroupCodes);
069    
070        /**
071         * calculate the fringe benefit amount for the given labor object and salary amount
072         * 
073         * @param laborLedgerObject the given labor object
074         * @param salaryAmount the given salary amount
075         * @return the fringe benefit amount for the given labor object and salary amount
076         */
077        public KualiDecimal calculateFringeBenefitFromLaborObject(LaborLedgerObject laborLedgerObject, KualiDecimal salaryAmount);
078    
079        /**
080         * calculate the fringe benefit amount for the given object code and salary amount
081         * 
082         * @param fiscalYear the year for object code record
083         * @param chartCode the chart for object code record
084         * @param objectCode the object code
085         * @param salaryAmount amount to calculate benefits for
086         * @return the fringe benefit amount
087         */
088        public KualiDecimal calculateFringeBenefit(Integer fiscalYear, String chartCode, String objectCode, KualiDecimal salaryAmount);
089    
090        /**
091         * create and approve a salary expense transfer document generated from the given accounting lines
092         * 
093         * @param documentDescription the description about the generated document
094         * @param explanation the explanation for the document
095         * @param annotation the annotation as acknowledgement
096         * @param adHocRecipients the given ad-hoc recipients who will be acknowledged about the document
097         * @param sourceAccoutingLines the given source accounting lines used to populate document
098         * @param targetAccoutingLines the given target accounting lines used to populate document
099         * @throws WorkflowException occurs if the document is failed to be routed for approval
100         */
101        public void createAndBlankApproveSalaryExpenseTransferDocument(String documentDescription, String explanation, String annotation, List<String> adHocRecipients, List<LaborLedgerExpenseTransferAccountingLine> sourceAccoutingLines, List<LaborLedgerExpenseTransferAccountingLine> targetAccoutingLines) throws WorkflowException;
102    
103        /**
104         * get the document numbers of the pending salary expense transfer documents for the given employee
105         * 
106         * @param emplid the given employee id
107         * @return the document numbers of the pending salary expense transfer documents for the given employee
108         */
109        public int countPendingSalaryExpenseTransfer(String emplid);
110    
111        /**
112         * retrieves a specific LaborLedgerObject from the database using primary key
113         * 
114         * @param fiscalYear the given fiscal year
115         * @param chartOfAccountsCode the given chart of accounts code
116         * @param objectCode the given object code
117         * @return a labor object retrieved based on the given information
118         */
119        public LaborLedgerObject retrieveLaborLedgerObject(Integer fiscalYear, String chartOfAccountsCode, String objectCode);
120    
121        /**
122         * retrieves a specific LaborLedgerObject based on the information of the given financial object
123         * 
124         * @param financialObject the given financial object
125         * @return a labor object retrieved based on the given information
126         */
127        public LaborLedgerObject retrieveLaborLedgerObject(ObjectCode financialObject);
128    
129        /**
130         * Retrieves LaborLedgerPositionObjectBenefits for a LaborLedgerObject key
131         * 
132         * @param fiscalYear the given fiscal year
133         * @param chartOfAccountsCode the given chart of accounts code
134         * @param objectCode the given object code
135         * @return a labor position object benefit retrieved based on the given information
136         */
137        public List<LaborLedgerPositionObjectBenefit> retrieveLaborPositionObjectBenefits(Integer fiscalYear, String chartOfAccountsCode, String objectCode);
138    
139        /**
140         * Does the given account have any labor ledger entries? It is necessary to check this before closing an account.
141         * 
142         * @param account the given account
143         * @return true if there is a pending entry for the given account; otherwise, return false
144         */
145        public boolean hasPendingLaborLedgerEntry(String chartOfAccountsCode, String accountNumber);
146    
147        /**
148         * Determines whether the given set of accounting lines have object codes that receieve fringe benefits
149         * 
150         * @param fiscalYear the fiscal year of the document
151         * @param chartOfAccountsCode chart of accounts code to check
152         * @param financialObjectCode financialObjectCode to check
153         * @return true if the lines include lines with labor object codes, false otherwise
154         */
155        public boolean hasFringeBenefitProducingObjectCodes(Integer fiscalYear, String chartOfAccountsCode, String financialObjectCode);
156    
157        /**
158         * Counts the number of entries in a group
159         * 
160         * @param the id of an origin entry group
161         * @return the count of the entries in that group
162         */
163        //public Integer getLaborOriginEntryGroupCount(Integer groupId);
164    
165        /**
166         * Determines where a Labor Ledger postion object group with the given code actually exists.
167         * 
168         * @param positionObjectGroupCode the code of the position object group to check for existence
169         * @return true if the position object group exists, false otherwise
170         */
171        public boolean doesLaborLedgerPositionObjectGroupExist(String positionObjectGroupCode);
172    }