Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Generowanie planu pracy.
zemiel
post
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.10.2012

Ostrzeżenie: (0%)
-----


Witam

Jestem początkujący w PHP i za wszelkie "buraki" (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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

Ten post edytował zemiel 24.10.2012, 21:41:00
Go to the top of the page
+Quote Post
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


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

Ten post edytował CuteOne 24.10.2012, 19:56:59
Go to the top of the page
+Quote Post
zemiel
post
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.10.2012

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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");
Go to the top of the page
+Quote Post
CuteOne
post
Post #5





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


Fajnie ci to wyszło, więc łap małego gotowca (IMG:style_emoticons/default/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()" (IMG:style_emoticons/default/tongue.gif)

Ten post edytował CuteOne 26.10.2012, 00:01:58
Go to the top of the page
+Quote Post
zemiel
post
Post #6





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.10.2012

Ostrzeżenie: (0%)
-----


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ę (IMG:style_emoticons/default/smile.gif)

Pozdrawiam

PS
Tak na marginesie to to mój pierwszy taki skrypt który napisałem zupełnie sam (IMG:style_emoticons/default/smile.gif)

Ten post edytował zemiel 26.10.2012, 19:37:18
Go to the top of the page
+Quote Post
CuteOne
post
Post #7





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


Dość prosto - lecisz cały miesiąc i gdy data = dacie w tablicy brygady echujesz je (IMG:style_emoticons/default/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ć

Ten post edytował CuteOne 26.10.2012, 20:07:07
Go to the top of the page
+Quote Post
zemiel
post
Post #8





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 24.10.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował zemiel 30.10.2012, 16:40:51
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 05:19