1 14 package org.compiere.model; 15 16 import java.sql.*; 17 import java.math.*; 18 import java.util.*; 19 20 import org.compiere.util.*; 21 22 28 public class MSchedule 29 { 30 34 public MSchedule (Properties ctx) 35 { 36 m_ctx = ctx; 37 } 39 private Properties m_ctx; 40 private int m_S_Resource_ID; 41 private boolean m_isAvailable = true; 42 private boolean m_isSingleAssignment = true; 43 private int m_S_ResourceType_ID = 0; 44 private int m_C_UOM_ID = 0; 45 46 private Timestamp m_startDate = null; 47 private Timestamp m_endDate = null; 48 49 50 private String m_typeName = null; 51 52 private Timestamp m_slotStartTime = null; 53 54 private Timestamp m_slotEndTime = null; 55 56 57 private MAssignmentSlot[] m_timeSlots = null; 58 59 60 public static final Timestamp EARLIEST = new Timestamp(new GregorianCalendar(1970,1,1).getTimeInMillis()); 61 62 public static final Timestamp LATEST = new Timestamp(new GregorianCalendar(2070,12,31).getTimeInMillis()); 63 64 65 66 67 82 public MAssignmentSlot[] getAssignmentSlots (int S_Resource_ID, 83 Timestamp start_Date, Timestamp end_Date, 84 BigDecimal qty, boolean getAll) 85 { 86 Log.trace(Log.l4_Data, "MSchedule.getAssignmentSlots", start_Date); 87 if (m_S_Resource_ID != S_Resource_ID) 88 getBaseInfo (S_Resource_ID); 89 ArrayList list = new ArrayList(); 91 MAssignmentSlot ma = null; 92 93 if (!m_isAvailable) 94 { 95 ma = new MAssignmentSlot (EARLIEST, LATEST, 96 Msg.getMsg (m_ctx, "ResourceNotAvailable"), "", MAssignmentSlot.STATUS_NotAvailable); 97 if (!getAll) 98 return new MAssignmentSlot[] {ma}; 99 list.add(ma); 100 } 101 102 m_startDate = start_Date; 103 m_endDate = end_Date; 104 if (m_endDate == null) 105 m_endDate = UOMConversion.getEndDate(m_ctx, m_startDate, m_C_UOM_ID, qty); 106 Log.trace(Log.l5_DData, "- EndDate=" + m_endDate); 107 108 109 String sql = "SELECT Description, DateFrom, DateTo " 112 + "FROM S_ResourceUnavailable " 113 + "WHERE S_Resource_ID=?" + " AND DateTo >= ?" + " AND DateFrom <= ?" + " AND IsActive='Y'"; 117 try 118 { 119 PreparedStatement pstmt = DB.prepareStatement(sql); 121 pstmt.setInt(1, m_S_Resource_ID); 122 pstmt.setTimestamp(2, m_startDate); 123 pstmt.setTimestamp(3, m_endDate); 124 ResultSet rs = pstmt.executeQuery(); 125 while (rs.next()) 126 { 127 ma = new MAssignmentSlot (TimeUtil.getDay(rs.getTimestamp(2)), 128 TimeUtil.getNextDay(rs.getTimestamp(3)), Msg.getMsg (m_ctx, "ResourceUnAvailable"), rs.getString(1), 130 MAssignmentSlot.STATUS_UnAvailable); 131 if (getAll) 133 createDaySlot (list, ma); 134 else 135 list.add(ma); 136 } 137 rs.close(); 138 pstmt.close(); 139 } 140 catch (SQLException e) 141 { 142 Log.error("MSchedule.getAssignmentSlots-2", e); 143 ma = new MAssignmentSlot (EARLIEST, LATEST, 144 Msg.getMsg (m_ctx, "ResourceUnAvailable"), e.toString(), 145 MAssignmentSlot.STATUS_UnAvailable); 146 } 147 if (ma != null && !getAll) 148 return new MAssignmentSlot[] {ma}; 149 150 151 sql = MRole.getDefault(m_ctx, false).addAccessSQL ( 156 "SELECT Name, Date1 FROM C_NonBusinessDay " 157 + "WHERE TRUNC(Date1) BETWEEN ? AND ?", 158 "C_NonBusinessDay", false, false); try 160 { 161 Timestamp startDay = TimeUtil.getDay(m_startDate); 162 Timestamp endDay = TimeUtil.getDay(m_endDate); 163 PreparedStatement pstmt = DB.prepareStatement(sql); 165 pstmt.setTimestamp(1, startDay); 166 pstmt.setTimestamp(2, endDay); 167 ResultSet rs = pstmt.executeQuery(); 168 while (rs.next()) 169 { 170 ma = new MAssignmentSlot (TimeUtil.getDay(rs.getTimestamp(2)), 171 TimeUtil.getNextDay(rs.getTimestamp(2)), Msg.getMsg(m_ctx, "NonBusinessDay"), rs.getString(1), 173 MAssignmentSlot.STATUS_NonBusinessDay); 174 Log.trace(Log.l6_Database, "- NonBusinessDay", ma); 175 list.add(ma); 176 } 177 rs.close(); 178 pstmt.close(); 179 } 180 catch (SQLException e) 181 { 182 Log.error("MSchedule.getAssignmentSlots-3", e); 183 ma = new MAssignmentSlot (EARLIEST, LATEST, 184 Msg.getMsg(m_ctx, "NonBusinessDay"), e.toString(), 185 MAssignmentSlot.STATUS_NonBusinessDay); 186 } 187 if (ma != null && !getAll) 188 return new MAssignmentSlot[] {ma}; 189 190 191 sql = "SELECT Name, IsTimeSlot,TimeSlotStart,TimeSlotEnd, " + "IsDateSlot,OnMonday,OnTuesday,OnWednesday," + "OnThursday,OnFriday,OnSaturday,OnSunday " + "FROM S_ResourceType " 197 + "WHERE S_ResourceType_ID=?"; 198 try 199 { 200 PreparedStatement pstmt = DB.prepareStatement(sql); 201 pstmt.setInt(1, m_S_ResourceType_ID); 202 ResultSet rs = pstmt.executeQuery(); 203 if (rs.next()) 204 { 205 m_typeName = rs.getString(1); 206 if ("Y".equals(rs.getString(2))) 208 { 209 m_slotStartTime = TimeUtil.getDayTime (m_startDate, rs.getTimestamp(3)); 210 m_slotEndTime = TimeUtil.getDayTime (m_endDate, rs.getTimestamp(4)); 211 if (TimeUtil.inRange(m_startDate, m_endDate, m_slotStartTime, m_slotEndTime)) 212 { 213 ma = new MAssignmentSlot (m_slotStartTime, m_slotEndTime, 214 Msg.getMsg(m_ctx, "ResourceNotInSlotTime"), m_typeName, 215 MAssignmentSlot.STATUS_NotInSlotTime); 216 if (getAll) 217 createTimeSlot (list, 218 rs.getTimestamp(3), rs.getTimestamp(4)); 219 } 220 } 222 if ("Y".equals(rs.getString(5))) 224 { 225 if (TimeUtil.inRange(m_startDate, m_endDate, 226 "Y".equals(rs.getString(6)), "Y".equals(rs.getString(7)), "Y".equals(rs.getString(8)), "Y".equals(rs.getString(9)), "Y".equals(rs.getString(10)), "Y".equals(rs.getString(11)), "Y".equals(rs.getString(12)))) 229 { 230 ma = new MAssignmentSlot (m_startDate, m_endDate, 231 Msg.getMsg(m_ctx, "ResourceNotInSlotDay"), m_typeName, 232 MAssignmentSlot.STATUS_NotInSlotDay); 233 if (getAll) 234 createDaySlot (list, 235 "Y".equals(rs.getString(6)), "Y".equals(rs.getString(7)), "Y".equals(rs.getString(8)), "Y".equals(rs.getString(9)), "Y".equals(rs.getString(10)), "Y".equals(rs.getString(11)), "Y".equals(rs.getString(12))); 238 } 239 } 241 } 242 rs.close(); 243 pstmt.close(); 244 } 245 catch (SQLException e) 246 { 247 Log.error("MSchedule.getAssignmentSlots-4", e); 248 ma = new MAssignmentSlot (EARLIEST, LATEST, 249 Msg.getMsg(m_ctx, "ResourceNotInSlotDay"), e.toString(), 250 MAssignmentSlot.STATUS_NonBusinessDay); 251 } 252 if (ma != null && !getAll) 253 return new MAssignmentSlot[] {ma}; 254 255 sql = "SELECT S_ResourceAssignment_ID " 257 + "FROM S_ResourceAssignment " 258 + "WHERE S_Resource_ID=?" + " AND AssignDateTo >= ?" + " AND AssignDateFrom <= ?" + " AND IsActive='Y'"; 262 try 263 { 264 PreparedStatement pstmt = DB.prepareStatement(sql); 265 pstmt.setInt(1, m_S_Resource_ID); 266 pstmt.setTimestamp(2, m_startDate); 267 pstmt.setTimestamp(3, m_endDate); 268 ResultSet rs = pstmt.executeQuery(); 269 while (rs.next()) 270 { 271 MAssignment mAssignment = new MAssignment(Env.getCtx(), rs.getInt(1)); 272 ma = new MAssignmentSlot (mAssignment); 273 if (!getAll) 274 break; 275 list.add(ma); 276 } 277 rs.close(); 278 pstmt.close(); 279 } 280 catch (SQLException e) 281 { 282 Log.error("MSchedule.getAssignmentSlots-5", e); 283 ma = new MAssignmentSlot (EARLIEST, LATEST, 284 Msg.translate(m_ctx, "S_R"), e.toString(), 285 MAssignmentSlot.STATUS_NotConfirmed); 286 } 287 if (ma != null && !getAll) 288 return new MAssignmentSlot[] {ma}; 289 290 291 292 createTimeSlots(); 294 295 ArrayList clean = new ArrayList(list.size()); 297 for (int i = 0; i < list.size(); i++) 298 { 299 MAssignmentSlot mas = (MAssignmentSlot)list.get(i); 300 if ((mas.getStartTime().equals(m_startDate) || mas.getStartTime().after(m_startDate)) 301 && (mas.getEndTime().equals(m_endDate) || mas.getEndTime().before(m_endDate))) 302 clean.add(mas); 303 } 304 MAssignmentSlot[] sorted = new MAssignmentSlot[clean.size()]; 306 clean.toArray(sorted); 307 Arrays.sort(sorted, new MAssignmentSlot()); list.clear(); clean.clear(); Timestamp sortedDay = null; 311 for (int i = 0; i < sorted.length; i++) 312 { 313 if (sortedDay == null) 314 sortedDay = TimeUtil.getDay(sorted[i].getStartTime()); 315 if (sortedDay.equals(TimeUtil.getDay(sorted[i].getStartTime()))) 316 list.add(sorted[i]); 317 else 318 { 319 layoutSlots (list, clean); 321 list.clear(); 323 list.add(sorted[i]); 324 sortedDay = TimeUtil.getDay(sorted[i].getStartTime()); 325 } 326 } 327 layoutSlots (list, clean); 329 330 MAssignmentSlot[] retValue = new MAssignmentSlot[clean.size()]; 332 clean.toArray(retValue); 333 Arrays.sort(retValue, new MAssignmentSlot()); return retValue; 335 } 337 342 private void layoutSlots (ArrayList list, ArrayList clean) 343 { 344 int size = list.size(); 345 if (size == 0) 347 return; 348 else if (size == 1) 349 { 350 MAssignmentSlot mas = (MAssignmentSlot)list.get(0); 351 layoutY (mas); 352 clean.add (mas); 353 return; 354 } 355 356 boolean allDay = false; 358 for (int i = 0; !allDay && i < size; i++) 359 { 360 MAssignmentSlot mas = (MAssignmentSlot)list.get(i); 361 if (mas.getStatus() == MAssignmentSlot.STATUS_NotAvailable 362 || mas.getStatus() == MAssignmentSlot.STATUS_UnAvailable 363 || mas.getStatus() == MAssignmentSlot.STATUS_NonBusinessDay 364 || mas.getStatus() == MAssignmentSlot.STATUS_NotInSlotDay) 365 allDay = true; 366 367 } 368 if (allDay) 369 { 370 for (int i = 0; i < list.size(); i++) 372 { 373 MAssignmentSlot mas = (MAssignmentSlot)list.get(i); 374 if (mas.getStatus() == MAssignmentSlot.STATUS_NotInSlotTime) 375 list.remove(i--); 376 } 377 } 378 379 for (int i = 0; i < list.size(); i++) 381 { 382 MAssignmentSlot mas = (MAssignmentSlot)list.get(i); 383 layoutY (mas); 384 clean.add (mas); 385 } 386 387 int maxYslots = m_timeSlots.length; 389 int[] xSlots = new int[maxYslots]; for (int i = 0; i < list.size(); i++) 391 { 392 MAssignmentSlot mas = (MAssignmentSlot)list.get(i); 393 for (int y = mas.getYStart(); y < mas.getYEnd(); y++) 394 xSlots[y]++; 395 } 396 int maxXslots = 0; 398 for (int y = 0; y < xSlots.length; y++) 399 { 400 if (xSlots[y] > maxXslots) 401 maxXslots = xSlots[y]; 402 } 403 if (maxXslots < 2) 405 { 406 for (int i = 0; i < list.size(); i++) 407 { 408 MAssignmentSlot mas = (MAssignmentSlot)list.get(i); 409 mas.setX(0, 1); 410 } 411 return; 412 } 413 414 ArrayList[][] matrix = new ArrayList[maxXslots][maxYslots]; 416 for (int y = 0; y < maxYslots; y++) 418 { 419 ArrayList xyList = new ArrayList(); 420 matrix[0][y] = xyList; 421 for (int i = 0; i < list.size(); i++) 423 { 424 MAssignmentSlot mas = (MAssignmentSlot)list.get(i); 425 if (y >= mas.getYStart() && y <= mas.getYEnd()) 426 xyList.add(mas); 427 } 428 for (int x = 1; x < maxXslots; x++) 430 matrix[x][y] = new ArrayList(); 431 } 433 442 for (int y = 0; y < maxYslots; y++) 444 { 445 if (y > 0 && matrix[0][y].size() > 0) 447 { 448 for (int x = 1; x < maxXslots; x++) 449 { 450 if (matrix[x][y-1].size() > 0) { 452 Object above = matrix[x][y-1].get(0); 453 for (int i = 0; i < matrix[x][y].size(); i++) 454 { 455 if (above.equals(matrix[0][y].get(i))) { 457 matrix[x][y].add(matrix[0][y].get(i)); 458 matrix[0][y].remove(i--); 459 } 460 } 461 } 462 } 463 } 465 if (matrix[0][y].size() > 1) 467 { 468 Object above = null; 469 if (y > 0 && matrix[0][y-1].size() > 0) 470 above = matrix[0][y-1].get(0); 471 for (int i = 0; matrix[0][y].size() > 1; i++) 473 { 474 Object move = matrix[0][y].get(i); 475 if (!move.equals(above)) { 477 for (int x = 1; move != null && x < maxXslots; x++) 478 { 479 if (matrix[x][y].size() == 0) { 481 matrix[x][y].add(move); 482 matrix[0][y].remove(i--); 483 move = null; 484 } 485 } 486 } 487 } 488 } } 491 for (int y = 0; y < maxYslots; y++) 493 { 494 for (int x = 0; x < maxXslots; x++) 495 { 496 if (matrix[x][y].size() > 0) 497 { 498 MAssignmentSlot mas = (MAssignmentSlot)matrix[x][y].get(0); 499 mas.setX(x, xSlots[y]); 500 } 501 } 502 } 503 matrix = null; 505 } 507 511 private void layoutY (MAssignmentSlot mas) 512 { 513 int timeSlotStart = getTimeSlotIndex(mas.getStartTime(), false); 514 int timeSlotEnd = getTimeSlotIndex(mas.getEndTime(), true); 515 if (TimeUtil.isAllDay(mas.getStartTime(), mas.getEndTime())) 516 timeSlotEnd = m_timeSlots.length - 1; 517 mas.setY (timeSlotStart, timeSlotEnd); 519 } 521 528 private int getTimeSlotIndex (Timestamp time, boolean endTime) 529 { 530 if (m_timeSlots.length <= 1) 532 return 0; 533 for (int i = 0; i < m_timeSlots.length; i++) 535 { 536 if (m_timeSlots[i].inSlot (time, endTime)) 537 return i; 538 } 539 Log.error("MSchedule.getTimeSlotIndex - did not find Slot for " + time + " end=" + endTime); 540 return 0; 541 } 543 544 548 private void getBaseInfo (int S_Resource_ID) 549 { 550 String sql = MRole.getDefault(m_ctx, false).addAccessSQL ( 552 "SELECT r.IsActive,r.IsAvailable,null," + "r.S_ResourceType_ID,rt.C_UOM_ID " 554 + "FROM S_Resource r, S_ResourceType rt " 555 + "WHERE r.S_Resource_ID=?" 556 + " AND r.S_ResourceType_ID=rt.S_ResourceType_ID", 557 "r", MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO); 558 try 560 { 561 PreparedStatement pstmt = DB.prepareStatement(sql); 562 pstmt.setInt(1, S_Resource_ID); 563 ResultSet rs = pstmt.executeQuery(); 564 if (rs.next()) 565 { 566 if (!"Y".equals(rs.getString(1))) m_isAvailable = false; 568 if (m_isAvailable && !"Y".equals(rs.getString(2))) m_isAvailable = false; 570 m_isSingleAssignment = "Y".equals(rs.getString(3)); 571 m_S_ResourceType_ID = rs.getInt(4); 573 m_C_UOM_ID = rs.getInt(5); 574 } 576 else 577 m_isAvailable = false; 578 rs.close(); 579 pstmt.close(); 580 } 581 catch (SQLException e) 582 { 583 Log.error("MSchedule.getBaseInfo", e); 584 m_isAvailable = false; 585 } 586 m_S_Resource_ID = S_Resource_ID; 587 } 589 597 private void createTimeSlot (ArrayList list, 598 Timestamp startTime, Timestamp endTime) 599 { 600 GregorianCalendar cal = new GregorianCalendar(Language.getLanguage().getLocale()); 602 cal.setTimeInMillis(m_startDate.getTime()); 603 GregorianCalendar calEnd = new GregorianCalendar(Language.getLanguage().getLocale()); 605 calEnd.setTimeInMillis(m_endDate.getTime()); 606 607 while (cal.before(calEnd)) 608 { 609 cal.set(Calendar.HOUR_OF_DAY, 0); 611 cal.set(Calendar.MINUTE, 0); 612 cal.set(Calendar.SECOND, 0); 613 cal.set(Calendar.MILLISECOND, 0); 614 Timestamp start = new Timestamp (cal.getTimeInMillis()); 615 GregorianCalendar cal_1 = new GregorianCalendar(Language.getLanguage().getLocale()); 617 cal_1.setTimeInMillis(startTime.getTime()); 618 cal.set(Calendar.HOUR_OF_DAY, cal_1.get(Calendar.HOUR_OF_DAY)); 619 cal.set(Calendar.MINUTE, cal_1.get(Calendar.MINUTE)); 620 cal.set(Calendar.SECOND, cal_1.get(Calendar.SECOND)); 621 Timestamp end = new Timestamp (cal.getTimeInMillis()); 622 MAssignmentSlot ma = new MAssignmentSlot (start, end, 624 Msg.getMsg(m_ctx, "ResourceNotInSlotTime"), "", 625 MAssignmentSlot.STATUS_NotInSlotTime); 626 list.add(ma); 627 628 cal_1.setTimeInMillis(endTime.getTime()); 630 cal.set(Calendar.HOUR_OF_DAY, cal_1.get(Calendar.HOUR_OF_DAY)); 631 cal.set(Calendar.MINUTE, cal_1.get(Calendar.MINUTE)); 632 cal.set(Calendar.SECOND, cal_1.get(Calendar.SECOND)); 633 start = new Timestamp (cal.getTimeInMillis()); 634 cal.set(Calendar.HOUR_OF_DAY, 0); 636 cal.set(Calendar.MINUTE, 0); 637 cal.set(Calendar.SECOND, 0); 638 cal.add(Calendar.DAY_OF_YEAR, 1); 639 end = new Timestamp (cal.getTimeInMillis()); 640 ma = new MAssignmentSlot (start, end, 642 Msg.getMsg(m_ctx, "ResourceNotInSlotTime"), "", 643 MAssignmentSlot.STATUS_NotInSlotTime); 644 list.add(ma); 645 } 646 } 648 660 private void createDaySlot (ArrayList list, 661 boolean OnMonday, boolean OnTuesday, boolean OnWednesday, 662 boolean OnThursday, boolean OnFriday, boolean OnSaturday, boolean OnSunday) 663 { 664 GregorianCalendar cal = new GregorianCalendar(Language.getLanguage().getLocale()); 666 cal.setTimeInMillis(m_startDate.getTime()); 667 GregorianCalendar calEnd = new GregorianCalendar(Language.getLanguage().getLocale()); 669 calEnd.setTimeInMillis(m_endDate.getTime()); 670 671 while (cal.before(calEnd)) 672 { 673 int weekday = cal.get(Calendar.DAY_OF_WEEK); 674 if ((!OnSaturday && weekday == Calendar.SATURDAY) 675 || (!OnSunday && weekday == Calendar.SUNDAY) 676 || (!OnMonday && weekday == Calendar.MONDAY) 677 || (!OnTuesday && weekday == Calendar.TUESDAY) 678 || (!OnWednesday && weekday == Calendar.WEDNESDAY) 679 || (!OnThursday && weekday == Calendar.THURSDAY) 680 || (!OnFriday && weekday == Calendar.FRIDAY)) 681 { 682 cal.set(Calendar.HOUR_OF_DAY, 0); 684 cal.set(Calendar.MINUTE, 0); 685 cal.set(Calendar.SECOND, 0); 686 cal.set(Calendar.MILLISECOND, 0); 687 Timestamp start = new Timestamp (cal.getTimeInMillis()); 688 cal.add(Calendar.DAY_OF_YEAR, 1); 689 Timestamp end = new Timestamp (cal.getTimeInMillis()); 690 691 MAssignmentSlot ma = new MAssignmentSlot (start, end, 692 Msg.getMsg(m_ctx, "ResourceNotInSlotDay"), "", 693 MAssignmentSlot.STATUS_NotInSlotDay); 694 list.add(ma); 695 } 696 else cal.add(Calendar.DAY_OF_YEAR, 1); 698 } 699 } 701 706 private void createDaySlot (ArrayList list, MAssignmentSlot ma) 707 { 708 Timestamp start = ma.getStartTime(); 711 GregorianCalendar calStart = new GregorianCalendar(); 712 calStart.setTime(start); 713 calStart.set(Calendar.HOUR_OF_DAY, 0); 714 calStart.set(Calendar.MINUTE, 0); 715 calStart.set(Calendar.SECOND, 0); 716 calStart.set(Calendar.MILLISECOND, 0); 717 Timestamp end = ma.getEndTime(); 718 GregorianCalendar calEnd = new GregorianCalendar(); 719 calEnd.setTime(end); 720 calEnd.set(Calendar.HOUR_OF_DAY, 0); 721 calEnd.set(Calendar.MINUTE, 0); 722 calEnd.set(Calendar.SECOND, 0); 723 calEnd.set(Calendar.MILLISECOND, 0); 724 while (calStart.before(calEnd)) 726 { 727 Timestamp xStart = new Timestamp(calStart.getTimeInMillis()); 728 calStart.add(Calendar.DAY_OF_YEAR, 1); 729 Timestamp xEnd = new Timestamp(calStart.getTimeInMillis()); 730 MAssignmentSlot myMa = new MAssignmentSlot (xStart, xEnd, 731 ma.getName(), ma.getDescription(), ma.getStatus()); 732 list.add(myMa); 733 } 734 } 736 737 738 742 public MAssignmentSlot[] getDayTimeSlots () 743 { 744 return m_timeSlots; 745 } 747 750 private void createTimeSlots() 751 { 752 if (m_typeName == null) 754 throw new IllegalStateException ("ResourceTyoeName not set"); 755 756 ArrayList list = new ArrayList(); 757 UOM uom = UOM.get (m_ctx, m_C_UOM_ID); 758 int minutes = UOMConversion.convertToMinutes (m_ctx, m_C_UOM_ID, UOMConversion.ONE); 759 Log.trace(Log.l4_Data, "MSchedule.createDayTimeSlots", "Minutes=" + minutes); 760 if (minutes > 0 && minutes < 60*24) 762 { 763 GregorianCalendar cal = new GregorianCalendar(); 765 cal.setTime(m_startDate); 766 cal.set(Calendar.HOUR_OF_DAY, 0); 767 cal.set(Calendar.MINUTE, 0); 768 cal.set(Calendar.SECOND, 0); 769 cal.set(Calendar.MILLISECOND, 0); 770 if (m_slotStartTime != null) 772 { 773 long start = cal.getTimeInMillis(); 774 cal.setTime(TimeUtil.getDayTime(m_startDate, m_slotStartTime)); cal.set(Calendar.SECOND, 0); 776 cal.set(Calendar.MILLISECOND, 0); 777 list.add(new MAssignmentSlot(start, cal.getTimeInMillis())); 778 } 779 GregorianCalendar calEnd = new GregorianCalendar(); 781 if (m_slotEndTime != null) 782 { 783 calEnd.setTime(TimeUtil.getDayTime(m_startDate, m_slotEndTime)); 784 calEnd.set(Calendar.SECOND, 0); 785 calEnd.set(Calendar.MILLISECOND, 0); 786 } 787 else { 789 calEnd.setTime(m_startDate); 790 calEnd.set(Calendar.HOUR_OF_DAY, 0); 791 calEnd.set(Calendar.MINUTE, 0); 792 calEnd.set(Calendar.SECOND, 0); 793 calEnd.set(Calendar.MILLISECOND, 0); 794 calEnd.add(Calendar.DAY_OF_YEAR, 1); 795 } 796 799 GregorianCalendar calEndSlot = new GregorianCalendar(); 801 calEndSlot.setTime(cal.getTime()); 802 calEndSlot.add(Calendar.MINUTE, minutes); 803 804 while (cal.before(calEnd)) 805 { 806 list.add(new MAssignmentSlot(cal.getTimeInMillis(), calEndSlot.getTimeInMillis())); 807 cal.add(Calendar.MINUTE, minutes); 809 calEndSlot.add(Calendar.MINUTE, minutes); 810 } 811 calEndSlot.setTime(cal.getTime()); 813 calEndSlot.set(Calendar.HOUR_OF_DAY, 0); 814 calEndSlot.set(Calendar.MINUTE, 0); 815 calEndSlot.set(Calendar.SECOND, 0); 816 calEndSlot.set(Calendar.MILLISECOND, 0); 817 calEndSlot.add(Calendar.DAY_OF_YEAR, 1); list.add(new MAssignmentSlot(cal.getTimeInMillis(), calEndSlot.getTimeInMillis())); 819 } 820 821 else { 823 list.add (new MAssignmentSlot(TimeUtil.getDay(m_startDate), TimeUtil.getNextDay(m_startDate))); 824 } 825 826 m_timeSlots = new MAssignmentSlot[list.size()]; 828 list.toArray(m_timeSlots); 829 } 831 832 833 837 public int getS_Resource_ID() 838 { 839 return m_S_Resource_ID; 840 } 842 846 public Timestamp getStartDate () 847 { 848 return m_startDate; 849 } 851 855 public Timestamp getEndDate () 856 { 857 return m_endDate; 858 } 860 } | Popular Tags |