Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dzielenie zakresów
rad11
post 5.06.2018, 06:55:20
Post #1





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


Aplikacja generalnie polega na tym, że raportujemy sobie czas pracy możemy wprowadzać korekty itd.

Mam takich kilka scenariuszy:

  1. Scenariusz 1
  2. Użytkownik chce podzielić okres pracy 10:00 - 14:00 na pół, bo zapomniał przełączyć zadania
  3. Wprowadza korektę z nowym zadaniem, w godzinach 12:00 - 14:00. Korekta macierzystego czasu pracy wprowadza się automatycznie
  4.  
  5. Scenariusz 2:
  6. Użytkownik pracował w godzinach 9:00 - 17:00 na jednym zadaniu, ale przypomniał sobie, że w godzinach 11:00 - 12:00 powinien raportować na co innego.
  7. Wprowadza korektę na inne zadanie w godzinach 11:00 - 12:00
  8. Macierzysty okres pracy automatycznie dzieli się na dwa okresy 9:00 - 11:00 i 12:00 - 17:00.
  9.  
  10. Scenariusz 3
  11. Użytkownik pracował
  12. w godzinach 9:00-11:00 na zadaniu A
  13. w godzinach 11:00-17:00 na zadaniu B
  14. Użytkownik chce wprowadzić korektę w czasie 10-12 wprowadzając zadanie C
  15. Macierzyste czasy pracy zadania A i B zostają skorygowane o zadanie C
  16.  
  17. Scenariusz 4
  18. Użytkownik pracował na zadaniu A w godzinach 10:00-12:00
  19. Użytkownik pomylił zadania i logował czas nie na ten task
  20. Użytkownik podmienia nazwę zadania A na B
  21. pozostawiając czas macierzysty 10:00-12:00


Moje pytanie brzmi jak najlepiej będzie te scenariusze obsłużyć używając DateTime ? Macie jakieś pomysły ? Miał może ktoś z was kiedyś podobny problem i jest w stanie podzielić się wiedzą jak w łatwy sposób to można osiągnać? Chodzi mi najbardziej o problem w scenariuszach 2 i 3 wydają mi się najbardziej skomplikowane.

Ten post edytował rad11 5.06.2018, 06:56:54
Go to the top of the page
+Quote Post
Pyton_000
post 5.06.2018, 07:47:56
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Każde zadanie to obiekt składający się z początku i końca zadania.
gdzie to zapiszesz to nie ma znaczenia.

Sytuacja 3: Masz zakres który chcesz wstawić 11-12. Pobierasz sobie wszystkie zakresy które mają część wspólną z nowym zakresem. Sortujesz je wg. czasu rozpoczęcia. I teraz musisz każdy zakres sprawdzić i zmodyfikować odpowiednio start lub koniec. Tutaj może pojawić się problem (chipotetycznie) że jakieś zadanie będzie się w całości zawierało w nowym przedziale a wtedy należałoby je chyba oznaczyć jako usunięte.

2 scenariusz to bierzesz sobię zadanie. Sprawdzasz czy nowe w całości się zawiera. Robisz kopię zadania i w 1-szym obcinasz end_date do wartości start_date nowego, a w drugim odwrotnie. ot i cała filozofia smile.gif
Go to the top of the page
+Quote Post
rad11
post 6.06.2018, 10:43:06
Post #3





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


A czy uważasz że dało by się to zrobić nie używając ifologii ?

Ten post edytował rad11 6.06.2018, 10:43:14
Go to the top of the page
+Quote Post
SmokAnalog
post 6.06.2018, 10:48:42
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Pytanie czy chcesz pozwalać na dziury w czasie. Jeśli tak, to lepiej zapisuj przy każdym wpisie początek i koniec, dbając przy zapisie o brak zazębień. Jeśli nie, to wystarczy zapisywać długość trwania każdego bloku.

To nie jest skomplikowane. Przy posortowanych blokach łatwo wyłapywać zazębienia.
Go to the top of the page
+Quote Post
rad11
post 6.06.2018, 10:52:50
Post #5





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


@SmokAnalog zapisywany jest początek oraz koniec i dziury też mogą być pomiędzy zadaniami bo ktoś mógł mieć tzw. breaka czyli nic robił
Go to the top of the page
+Quote Post
SmokAnalog
post 6.06.2018, 11:01:30
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Jeżeli zadania nie mogą się nakładać (co wcale nie jest takie oczywiste, bo może czasami mogą?), to nie pozostaje Ci nic innego, jak zadbać o to z poziomu klasy odpowiedzialnej za zapisywanie. Posortuj według rozpoczęcia i sprawdzaj po kolei czy czas zakończenia poprzedniego jest mniejszy lub równy czasowi rozpoczęcia kolejnego.
Go to the top of the page
+Quote Post
Pyton_000
post 6.06.2018, 11:06:16
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Zacznij sobie od rozpisania wszystkich warunków a potem będziesz to upraszczał aż znajdziesz optymalny algorytm.
Go to the top of the page
+Quote Post
athabus
post 6.06.2018, 12:07:15
Post #8





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Jak dla mnie robienie czegoś takiego w oparciu o formularze to trochę bez sensu. Skończy się tak, że ktoś wpisze zły zakres, podzieli mu wcześniejszy wpis na dwa, potem zmieni datę/czas, znów coś podzieli i będzie ogólny burdel.
MZ tutaj lepiej o to zadbać na poziomie interfejsu, a sam model tylko musi zabronić zapisywać zazębiające się okresy.

Na poziomie interfejsu ogarnąłbym to na podobnej zasadzie jak w google calendar - używając np. jqueryUI szubko uzyskasz przyzwoity efektt. Będzie znacznie wygodniej i unikniesz zarządzanie piekiełkiem podzielonych przypadkowo zadań przez omyłkowe wpisy.
Go to the top of the page
+Quote Post
SmokAnalog
post 6.06.2018, 12:16:08
Post #9





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Nikt tu nie wspominał jeszcze o implementacji interfejsu użytkownika. Oczywiście, że lepiej zrobić jakieś przesuwajki. Tylko że nawet najfajniejszy interfejs nie wyeliminuje potrzeby porządnej walidacji danych. Praca backendowa będzie taka sama niezależnie czy to jest zwykły formularz czy wypasiony interfejs.
Go to the top of the page
+Quote Post
rad11
post 6.06.2018, 12:19:05
Post #10





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


Fomularz już jest i wygląda tak https://ibb.co/nERsSo (mała wycinka formularza) można wprowadzać korektę do pojedynczego periodu, ale można też dodać korektę na inne zadanie o określonym periodzie.

Ten post edytował rad11 6.06.2018, 12:24:27
Go to the top of the page
+Quote Post
athabus
post 6.06.2018, 12:39:14
Post #11





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


SmokAnalog, ale walidacja to jedno, a scenariusze wyżej to co innego. Mi tutaj chodzi o to, że połowa tych problemów nie musi być rozwiązywana, a już na pewno nie powinna być rozwiązywana automatycznie. Np. to że masz prace nad taksiem A dzisiaj od 9 do 17 i dodajesz drugi task nad którym pracowałeś 11-12. Teraz wg scenariusza dzieli się bazowy task na 2 i po środku wstawia task b. Ale co jak użytkownik po zapisaniu zauważy, że taks B miał być z datą wczorajszą? Zmieni na wczorajszą, ale task A zostanie już z dziurą. Itd itp. Takie rzeczy będą zdarzały się nagminnie, bo ludzie się mylą.

MZ w backendzie tak jak pisałem wystarczy dać walidację czy taski na siebie nie nachodzą i jak nachodzą to zwracać wyjątek, a całą "logikę" żeby było dobrze zostawić użytkownikowi, bo to on wie co dokładnie chce zapisać - z dobrym interfejsem po prostu zrobi to co chce. Tj. w interfejsie sam musi ustalić podział tasku, czy tak go "przeciągać" aby nie nachodził na siebie itp. W backendzie wystarczy jedynie sprawdzać czy finalnie nic na siebie nie nachodzi i tyle.

Ogólnie uważam, że oparcie tego na formularzach jest słabe i niewygodne z punktu widzenia użyteczności + powoduje sporo problemów pobocznych i osobiście uważam, że są błędne założenia wstępne np. z tym, że system automatycznie dzieli taski.
Go to the top of the page
+Quote Post
SmokAnalog
post 6.06.2018, 12:47:38
Post #12





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Wszystko zależy od tego w jaki sposób to ma być używane. Jeśli tych zadań ma być dużo, to faktycznie w formularzu będzie można się utopić. Ale jeśli jest tylko kilka na dzień, to takie wpisywanie nie jest takie straszne, szczególnie jak będzie też wizualizacja dnia gdzieś obok formularza. Czasami łatwiej coś wpisać niż bawić się klockami. Zależy jak leży biggrin.gif
Go to the top of the page
+Quote Post
rad11
post 6.06.2018, 12:57:57
Post #13





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


Tych zadań jest dużo, ale raczej zmiana interfejsu nie wchodzi w grę tylko obsługa na backendzie.
Go to the top of the page
+Quote Post
athabus
post 6.06.2018, 13:00:27
Post #14





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


No też prawda - jak będzie 5 ogarniętych ludzi, mało tasków to z jakąś sensowną wizualizacją obok formularza da się tak pracować. Osobiście też wolę wpisać niż przeciągać, ale wiadomo, że jesteśmy w mniejszości ;-)

//edit - jak jest dużo to raczej czekają cię ciężkie chwile - mz to dzielenie to jest miejsce gdzie będzie sporo kłopotów. Raczej jak ktoś zapomniał, to niech teraz to koryguje ręcznie, bo inaczej skończy się tak jak pisałem wyżej. Daj też tą wizualizację w postaci jakiegoś timelina o której pisał SmokAnalog, gdzie dziury będą innym kolorem bo to kolejne miejsce, gdzie będzie sporo błędów. Ogólnie jednak będzie ciężko jeśli użytkownicy mają to edytować/poprawiać. Łatwo się będzie pogubić jak to nie są pełne godziny tylko czas typu 16:15-16:23 itd.

Ten post edytował athabus 6.06.2018, 13:04:41
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 15:44