Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Generowanie planu pracy.
Forum PHP.pl > Forum > Przedszkole
zemiel
Witam

Jestem początkujący w PHP i za wszelkie "buraki" smile.gif z góry przepraszam.
Muszę zrobić plan pracy dla trzech zmian i na każdej zmianie jest 6 brygad.
Chodzi o to że niedziela zawsze wolna plus jeden dzień w tygodniu, który jest ruchomy (np. w pierwszym tygodniu 1 brygada ma wolną niedziele i poniedziałek zaś w kolejnym niedzielę i wtorek itd. a 2 brygada w pierwszym tygodniu ma wolną niedziele i wtorek a w drugim niedzielę i środę i tak dalej, każda kolejna brygada ma przesunięty dzień wolny i jeden dzień w tygodniu - wiem ze to zamotane ale tak to wygląda wink.gif ).
Teraz co muszę z tym zrobić:
Wyświetlanie planu po wybraniu zmiany i brygady z możliwością wybrania okresu wyświetlenia z dokładnością do pełnego tygodnia.

Proszę o pomoc.
Pozdrawiam
zemiel


PS
Tu jest link gdzie mniej więcej jest pokazane jak to ma wyglądać tylko jest to plan dla jednej brygady tylko nie ma możliwości wyboru o którym mówiłem:
http://bedforddhlworkers.zemiel.co.uk/rota.php

Pozdrawiam
CuteOne
1. Musisz znać nazwy(a właściwie numery dnia) dnia dla każdej daty - manual date parametr "N"
2. Musisz widzieć ile dni ma dany miesiąc - manual date parametr "t" + mktime()

Teraz wystarczy dla każdej brygady (w pętli) przelecieć cały miesiąc inkrementując o 8 dni
  1. $d jest zmienne zależne od brygady
  2. for($d = 1; $d <= 31; $d +8) {
  3.  
  4. if($np[$d] przypada na niedziele) { //sprawdzisz to za pomocą date() z 1 punktu
  5. $d++
  6. }
  7. $np[$d] = true; //kolejny dzień wolny
  8. }


Do tego dopisz niedziele
zemiel
Hejka

Ten wzór ma błąd bo pomija co 7 weekend gdzie ten powinien zaczynać się od poniedziałku.
Tu mam wzór jak to wygląda:
http://bedforddhlworkers.zemiel.co.uk/rota2.php
Nawet jak daje warunek gdy jest niedziela to żeby cofnął się o sześć dni to zmienia mi się jedynie data ale położenie zostaje takie samo.

A tak wyglądają moje wypociny wink.gif (na razie dla jednej brygady i bez opcji wyboru gdyż muszę przebrnąć przez generowanie tej tabelki potem zajmę się resztą):

  1. <?php
  2.  
  3. echo '<table border="1">
  4. <tr>
  5. <td>week</td>
  6. <td>date</td>
  7. <td>san</td>
  8. <td>mon</td>
  9. <td>tue</td>
  10. <td>wed</td>
  11. <td>thu</td>
  12. <td>fri</td>
  13. <td>sat</td>
  14. </tr>';
  15.  
  16.  
  17. $date=new DateTime('01/01/2012');
  18. $day=new DateTime('01/01/2012');
  19. $off=new DateTime('12/25/2011');
  20. echo date_format($off, 'd-m-Y');
  21.  
  22. for($year=1; $year<=520; $year++) {
  23.  
  24. echo '<tr><td>'.$year.'</td>';
  25.  
  26. echo '<td>'.date_format($date, 'd-m-Y').'</td>';
  27.  
  28. $date->modify('+7 day');
  29.  
  30. for($week=1; $week<=7; $week++) {
  31.  
  32. echo '<td>';
  33.  
  34. if(date_format($day, 'D')=="Sun"){
  35. echo 'OFF';
  36. } else {
  37. if(date_format($off, 'D')=="Sun") {
  38. $off->modify('+1 day');
  39. echo date_format($off, 'd-m-Y');
  40. } elseif(date_format($off, 'D')!="Sun") {
  41. $off->modify('+8 day');
  42.  
  43. } else {
  44.  
  45. echo '8';
  46.  
  47. }
  48.  
  49.  
  50. }
  51.  
  52. echo '</td>';
  53. $day->modify('+1 day');
  54.  
  55. }
  56.  
  57. echo '</tr>';
  58. }
  59.  
  60. echo '</table>';
  61.  
  62. ?>


Wszelkie sugestie i poprawki mile widziane.

Pozdrawiam
b4rt3kk
Ja bym zaczął przede wszystkim od funkcji generującej tabelkę ze wszystkimi dniami w miesiącu, w zależności od wybranego miesiąca. Następnie ustaliłbym jakieś wartości początkowe dla każdej z tych brygad, tj. dzień wolny, np. licząc od dziś, bo wstecz po co komu patrzeć? Pierwsze wolne:

  1. $bryg1 = '1-01-2013';
  2. $bryg2 = '2-01-2013';
  3. //itd.


Oczywiście daty tak tylko dla przykładu, to już sam wiesz lepiej jakie wstawić.

I teraz wystarczy dodawać co 8 dni do daty początkowej i te dni zaznaczać jako wolne.

  1. $wolneBryg1 = strtotime(date("d-m-Y", strtotime($bryg1)) . " +8 day");
CuteOne
Fajnie ci to wyszło, więc łap małego gotowca wink.gif
  1. <?php
  2. $brygady = array(
  3. '2012-01-02'=>array('brygadaRR','brygadaXX'),
  4. '2012-01-03'=>array('brygadaWW'),
  5. '2012-01-04'=>array('brygadaYY'),
  6. );
  7.  
  8.  
  9. for($y=2012;$y<=2013;$y++) {
  10.  
  11. for($m=1; $m<=12; $m++) {
  12.  
  13. $e_d = date("t", mktime(0,0,0,$m,1,$y));
  14.  
  15. for($d=1; $d<=$e_d; $d++) {
  16.  
  17. if(date("N", mktime(0,0,0,$m,$d,$y) < 7)) {
  18.  
  19. $date = date("Y-m-d", mktime(0,0,0,$m,$d,$y));
  20. if(array_key_exists($date, $brygady)) {
  21.  
  22. if(date("N", mktime(0,0,0,$m,$d+8,$y)) == 7) {
  23. $brygady[date("Y-m-d", mktime(0,0,0,$m,$d+9,$y))] = $brygady[$date];
  24. }
  25. else {
  26. $brygady[date("Y-m-d", mktime(0,0,0,$m,$d+8,$y))] = $brygady[$date];
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }
  33. echo '<pre>';print_r($brygady);
  34. ?>


Z deczka przekombinowany ale nie miałem weny bawić się z "new Date()" tongue.gif
zemiel
Cześć

Wszystko pięknie i wielkie dzięki za pomoc, tylko jak wyciągnąć konkretną brygadę z ciągu i i wyświetlić tylko ją w tym ciągu?
Bo teraz pokazuje mi ciąg ale wszystkich brygad (potrzebuje to wcisnąć w wiersze tabeli).

Tego nie jeszcze nie umiem mała podpowiedź proszę smile.gif

Pozdrawiam

PS
Tak na marginesie to to mój pierwszy taki skrypt który napisałem zupełnie sam smile.gif
CuteOne
Dość prosto - lecisz cały miesiąc i gdy data = dacie w tablicy brygady echujesz je tongue.gif

  1.  
  2. function addZero($int) { return ($int < 10) ? '0'.$int : $int; }
  3.  
  4. for($y=2012;$y<=2013;$y++) {
  5.  
  6. for($m=1; $m<=12; $m++) {
  7.  
  8. $e_d = date("t", mktime(0,0,0,$m,1,$y));
  9.  
  10. echo '<table><tr>';
  11.  
  12. for($d=1; $d<=$e_d; $d++) {
  13.  
  14. $date = $y.'-'.addZero($m).'-'.addZero($d);
  15.  
  16. echo '<td>';
  17. if(array_key_exists($date, $brygady)) {
  18.  
  19. foreach($brygady[$date] as $brygada) {
  20.  
  21. echo $brygada.'<br>';
  22. }
  23. }
  24. echo '</td>';
  25.  
  26. /** żeby każdy tydzień był w nowej linii **/
  27. if(date("N", mktime(0,0,0,$m,$d,$y)) == 7) echo '</tr><tr>';
  28. }
  29.  
  30. echo '</tr></table>';
  31. }
  32. }


to tak pi razy drzwi.. nie mam gdzie tego przetestować
zemiel
Dzięki
Ale nie zrozumieliśmy się chyba, gdyż tabela ma być generowana dla każdej brygady oddzielnie.
Na przykład klikam że chcę wyświetlić plan dla brygady nr 3 rotę za okres powiedzmy - kwiecień 2013;
i pojawia się tabelka gdzie są zaznaczone dni wolne i pracujące (np: wolny dzień to "OFF" a pracujący to "8")
gdyż tabelka musi być czytelna dla każdego a nie tylko dla wtajemniczonych (pracują tu ludzie w różnym wieku )
Pozdrawiam

PS
ma się generować coś takiego jak było w linku w pierwszym topiku.

Wiem że wybrzydzam ale jak coś robię to chcę żeby to wyglądało profesjonalnie

PS
Jak prawidłowo sformułować warunek do ifa, chodzi mi o coś takiego:

  1. pobierz, plaintext
  2. if((date_format($day, 'm-d-Y')==($off->modify('+'.$rotastep.' day'))){
  3.  
  4. echo '<tr>OFF</tr>';
  5.  
  6. } else { echo '<tr>8</t>';}
  7.  
  8.  
  9. gdzie $rotastep będzie z czytywany z tablicy (tu kolejny problemik - jak zrobić by przy każdej pętli pobierało kolejny parametr i po wczytaniu ostatniego robiło res i od początku)
  10.  
  11. Wieszam co ale muszę to zrobić i będę wdzięczny za pomoc
  12. Pozdrawiam
  13.  
  14.  
  15. PS.
  16.  
  17. Problem został rozwiązany ;).
  18.  
  19. Dziękuję wszystkim za pomoc.
  20.  
  21. Problem rozwiązałem w następujący sposób:
  22.  
  23. [php]$start_data=$_GET[from];
  24. $weeks_data=$_GET[weeks];
  25.  
  26. $step=array('8','8','8','8','8','2');
  27. reset($step);
  28.  
  29.  
  30. for($go=0; $go<$team_start; $go++) {
  31. next($step);
  32. }
  33. $date=new DateTime('01/01/2012');
  34. $day=new DateTime('01/01/2012');
  35. $off=new DateTime('01/02/2012');
  36.  
  37. echo date_format($date, 'Y-m-d');
  38.  
  39. $off->modify('+'.$team_start.'day');
  40.  
  41. echo date_format($off, 'Y-m-d');
  42.  
  43. echo '<table border="1">
  44. <tr>
  45. <td>week</td>
  46. <td>date</td>
  47. <td>san</td>
  48. <td>mon</td>
  49. <td>tue</td>
  50. <td>wed</td>
  51. <td>thu</td>
  52. <td>fri</td>
  53. <td>sat</td>
  54. </tr>';
  55.  
  56. $no=1;
  57.  
  58. for($line=1; $line<=600; $line++) {
  59.  
  60. if(date_format($date, 'Y-m-d')>=$start_data and $no<=$weeks_data) {
  61.  
  62. echo '<tr><td>'.$no.'.</td>';
  63. echo '<td>'.date_format($date, 'd-m-Y').'</td>';
  64. $no++;
  65. for($w=1; $w<=7; $w++) {
  66.  
  67. if(date_format($day, 'D')=="Sun"){
  68.  
  69. echo '<td>OFF</td>';
  70.  
  71. } elseif(date_format($day, 'D')!="Sun") {
  72.  
  73. if($day==$off) {
  74.  
  75. echo '<td>OFF</td>';
  76.  
  77. } else {
  78.  
  79. echo '<td>8</td>';
  80.  
  81. }
  82.  
  83. }
  84.  
  85. $day->modify('+1 day');
  86.  
  87. }
  88.  
  89.  
  90.  
  91. } else {
  92.  
  93. $day->modify('+7 day');
  94.  
  95. }
  96.  
  97.  
  98. $date->modify('+7 day');
  99.  
  100. $off->modify('+'.current($step).' day');
  101.  
  102. if(current($step)=='2'){
  103.  
  104. reset($step);
  105.  
  106. } else {
  107.  
  108. next($step);
  109.  
  110. }
  111.  
  112.  
  113. }
  114.  
  115. echo '</tr>';
  116.  
  117. echo '</table>';



rezultat tego można zobaczyć tu:
http://bedforddhlworkers.zemiel.co.uk/rota4.php

Pozdraiwam
zemiel
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.