code: private List<TimephasedCost> getTimephasedCostMultipleRates(List<TimephasedWork> standardWorkList, List<TimephasedWork> overtimeWorkList)
     {
        List<TimephasedWork> standardWorkResult = new LinkedList<TimephasedWork>();
        List<TimephasedWork> overtimeWorkResult = new LinkedList<TimephasedWork>();
        CostRateTable table = getCostRateTable();
        ProjectCalendar calendar = getCalendar();
  
        Iterator<TimephasedWork> iter = overtimeWorkList.iterator();
        for (TimephasedWork standardWork : standardWorkList)
        {
           TimephasedWork overtimeWork = iter.hasNext() ? iter.next() : null;
  
           int startIndex = getCostRateTableEntryIndex(standardWork.getStart());
           int finishIndex = getCostRateTableEntryIndex(standardWork.getFinish());
  
           if (startIndex == finishIndex)
           {
              standardWorkResult.add(standardWork);
              if (overtimeWork != null)
              {
                 overtimeWorkResult.add(overtimeWork);
              }
           }
           else
           {
              standardWorkResult.addAll(splitWork(table, calendar, standardWork, startIndex));
              if (overtimeWork != null)
              {
                 overtimeWorkResult.addAll(splitWork(table, calendar, overtimeWork, startIndex));
              }
           }
        }
  
        return getTimephasedCostSingleRate(standardWorkResult, overtimeWorkResult);
     }
docs: Generates timephased costs from timephased work where multiple cost rates
  apply to the assignment.
  
  @param standardWorkList timephased work
  @param overtimeWorkList timephased work
  @return timephased cost