Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.66 KB | None | 0 0
  1. const hourToNumber = (hour) => hour.split(':').map(n => Number(n));
  2. const compareHour = (hourA, hourB) => {
  3. const [hA, mA] = hourToNumber(hourA);
  4. const [hB, mB] = hourToNumber(hourB);
  5. return hA - hB || mA - mB;
  6. };
  7.  
  8. const isHourABeforeB = (hourA, hourB) => {
  9. return compareHour(hourA, hourB) <= 0;
  10. }
  11.  
  12. const isTaskDoable = (dayAvaibility, dayCalendar, task) => {
  13. if (!dayAvaibility) {
  14. return false;
  15. }
  16.  
  17. if (!isHourABeforeB(dayAvaibility.start, task.start) || !isHourABeforeB(task.end, dayAvaibility.end)) {
  18. return false;
  19. }
  20.  
  21. const collidingTask = dayCalendar.find(plannedTaks => {
  22. const startAfter = isHourABeforeB(task.end, plannedTaks.start);
  23. const endBefore = isHourABeforeB(plannedTaks.end, task.start);
  24. return !startAfter && !endBefore;
  25. });
  26. return !collidingTask;
  27. }
  28.  
  29. const findIndexRight = (array, predicate) => {
  30. for (let i = array.length - 1; i >= 0; i--) {
  31. if (predicate(array[i], i)) {
  32. return i;
  33. }
  34. }
  35. return -1;
  36. }
  37.  
  38. const fullFillCalendar = (avaibility, tasks) => {
  39. const orderedTask = tasks.sort((a, b) => a.id - b.id);
  40. const calendarByDay = {};
  41.  
  42. orderedTask.forEach(task => {
  43. if (!calendarByDay[task.day]) {
  44. calendarByDay[task.day] = [];
  45. }
  46.  
  47. const dayCalendar = calendarByDay[task.day];
  48.  
  49. if (isTaskDoable(avaibility.find(a => a.day === task.day), dayCalendar, task)) {
  50. const sortedIndex = findIndexRight(dayCalendar, plannedTask => {
  51. return !isHourABeforeB(plannedTask.start, task.start);
  52. });
  53. if (sortedIndex === - 1) {
  54. dayCalendar.push(task);
  55. } else {
  56. dayCalendar.splice(sortedIndex, 0, task);
  57. }
  58. };
  59. });
  60.  
  61. return [
  62. { day: 0, booking: calendarByDay[0] || [] },
  63. { day: 1, booking: calendarByDay[1] || [] },
  64. { day: 2, booking: calendarByDay[2] || [] },
  65. { day: 3, booking: calendarByDay[3] || [] },
  66. { day: 4, booking: calendarByDay[4] || [] },
  67. { day: 5, booking: calendarByDay[5] || [] },
  68. { day: 6, booking: calendarByDay[6] || [] },
  69. ]
  70. }
  71.  
  72. const bookings = [
  73. { "id": 0, "day": 6, "start": "14:22", "end": "15:05" },
  74. { "id": 1, "day": 4, "start": "12:43", "end": "13:34" },
  75. { "id": 2, "day": 1, "start": "10:46", "end": "11:31" },
  76. { "id": 3, "day": 2, "start": "14:36", "end": "17:48" },
  77. { "id": 4, "day": 1, "start": "09:55", "end": "13:10" },
  78. { "id": 5, "day": 5, "start": "11:20", "end": "14:37" },
  79. { "id": 6, "day": 5, "start": "12:58", "end": "13:50" },
  80. { "id": 7, "day": 0, "start": "10:01", "end": "11:10" },
  81. { "id": 8, "day": 4, "start": "09:33", "end": "10:25" },
  82. { "id": 9, "day": 4, "start": "11:52", "end": "13:51" },
  83. { "id": 10, "day": 3, "start": "09:58", "end": "17:43" },
  84. { "id": 11, "day": 2, "start": "10:09", "end": "15:52" },
  85. { "id": 12, "day": 1, "start": "10:55", "end": "14:32" },
  86. { "id": 13, "day": 1, "start": "15:55", "end": "16:24" },
  87. { "id": 14, "day": 0, "start": "15:07", "end": "17:21" },
  88. { "id": 15, "day": 3, "start": "12:20", "end": "14:54" },
  89. { "id": 16, "day": 4, "start": "12:21", "end": "16:20" },
  90. { "id": 17, "day": 3, "start": "14:11", "end": "17:49" },
  91. { "id": 18, "day": 2, "start": "09:33", "end": "14:03" },
  92. { "id": 19, "day": 1, "start": "13:38", "end": "15:42" }
  93. ]
  94.  
  95. const doctorAvailability = [
  96. {
  97. day: 0,
  98. start: "9:00",
  99. end: "18:00"
  100. },
  101. {
  102. day: 1,
  103. start: "9:00",
  104. end: "18:00"
  105. },
  106. {
  107. day: 2,
  108. start: "9:00",
  109. end: "18:00"
  110. },
  111. {
  112. day: 3,
  113. start: "9:00",
  114. end: "18:00"
  115. },
  116. {
  117. day: 4,
  118. start: "9:00",
  119. end: "18:00"
  120. },
  121. {
  122. day: 5,
  123. start: "9:00",
  124. end: "18:00"
  125. },
  126. {
  127. day: 6,
  128. start: "9:00",
  129. end: "18:00"
  130. }
  131. ];
  132.  
  133. console.log(JSON.stringify(fullFillCalendar(doctorAvailability, bookings), null, ' '));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement