Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Zeiterfassung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Zeiterfassung

    Hallo, ich programmiere eine simple Zeiterfassung - die Berechnung und Ausgabe der Differenzen fällt mir schwer.

    Meine DB sieht prinzipiell so aus:
    Userid timestamp typ tag
    user1 xxx kommt 2019_08_19
    user1 xxx geht 2019_08_19
    user1 xxx kommt 2019_08_19
    user1 xxx geht 2019_08_19







    Berechnet und ausgegeben werden sollen für den entsprechenden Tag die Differenz - egal ob positiv oder negativ:
    z.B. so "Dein Zeitkonto beträgt" 3 Stunden, 23 Minuten - wenn es negativ ist, sollte am besten ein Minus davor

    Ist die Richtung generell richtig oder würde man dies anders machen.

    Vielen Dank für Euer Feedback.
    Thorben





  • #2
    Ich würde Ein- und Austragen in eine Zeile zusammen fassen. Denn es sollte eh nie vorkommen, das man sich austrägt ohne sich vorher einzutragen. Und eintragen ohne sich jemals auszutragen macht ja auch nicht viel Sinn.

    Kommentar


    • #3
      Würde ich auch so machen. Dann hast du immer Zeitfenster, und viele DBs können entsprechend direkt damit umgehen, um Überlappungen o.Ä. festzustellen und allgemein damit zu rechnen.
      You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

      Kommentar


      • #4
        timestamp brauchst du dann auch nicht, dafür aber datetime als Typ für kommt und geht.
        Für die Berechnung schaue dir mal die Funktionen an die Mysql bereit stellt.

        Kommentar


        • #5
          Zitat von hellbringer Beitrag anzeigen
          Ich würde Ein- und Austragen in eine Zeile zusammen fassen. Denn es sollte eh nie vorkommen, das man sich austrägt ohne sich vorher einzutragen. Und eintragen ohne sich jemals auszutragen macht ja auch nicht viel Sinn.
          Macht keinen Sinn, sich z.B. abzumelden ohne sich vorher am Tag angemeldet zu haben. Wer darauf baut, hat aber die Rechnung ohne die Findigkeit der Nutzer solcher Systeme gemacht. Für solche Unregelmäßigkeiten müssen ganz klare Regeln her (Am Vortag anmelden und am akt. Tag Abends abmelden macht wie viele Überstunden? ).
          PHP-Klassen auf github

          Kommentar


          • #6
            Zitat von jspit Beitrag anzeigen
            Macht keinen Sinn, sich z.B. abzumelden ohne sich vorher am Tag angemeldet zu haben. Wer darauf baut, hat aber die Rechnung ohne die Findigkeit der Nutzer solcher Systeme gemacht. Für solche Unregelmäßigkeiten müssen ganz klare Regeln her (Am Vortag anmelden und am akt. Tag Abends abmelden macht wie viele Überstunden? ).
            Das ist dann Problem des jeweiligen Benutzers, wenn er das System falsch bedient. Mit genug negativer Energie kann man alles sabotieren. Dagegen hilft kein Datenbankdesign. Wenn ein Benutzer sich wirklich über die sinnvolle Zeit hinaus austragen möchte, dann erlaubt man es ihm im UI einfach nicht. Aber das ist, wie gesagt, eine ganz andere Baustelle. Und von Überstundenberechnung war hier bis jetzt gar keine Rede. Das ist auch eine komplett andere Baustelle, da je nach Arbeitsvertrag andere Regeln gelten und sowas möglichst allgemein in einer Software umzusetzen ist dann ein weitaus größeres Projekt als eine Datenbanktabelle anzulegen.

            Kommentar


            • #7
              Zitat von jspit Beitrag anzeigen
              (Am Vortag anmelden und am akt. Tag Abends abmelden macht wie viele Überstunden? ).
              Nachtschicht?

              Kommentar


              • #8
                Oder Arzt... 24-Stunden Schicht im Krankenhaus
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Hahahaha - super - hab's hinbekommen

                  Jetzt brauche ich noch die Ansicht:
                  Es werden alle Tage des Monats aufgelistet - jetzt muss ich nur noch die täglichen Buchungen dazu, diese kommen aus einer MySQL-Tabelle kommen, also
                  die klassische Terminkalender-Sache - so sieht der Loop der Tage / Monat aus:

                  PHP-Code:
                  $monat "2019_08";
                  $m explode("_"$monat);
                  $anzahltage date("t",mktime(0,0,0,$m[1],1,$m[0]));
                  for(
                  $i 1$i < ($anzahltage 1); $i++) {
                  echo 
                  $m[0] . "_" $m[1] . "_" str_pad($i,2,"0",STR_PAD_LEFT) . "<br>";

                  Danke Euch. Thorben

                  Kommentar


                  • #10
                    Oder lesbarer:
                    PHP-Code:
                    $startDate = new DateTimeImmutable('2019-08-01');

                    $period = new DatePeriod(
                        
                    $startDate, new DateInterval('P1D'), $startDate->modify('+1 month')
                    );

                    foreach (
                    $period as $date) {
                        echo 
                    $date->format('Y_m_d') . '<br />';

                    Kommentar


                    • #11
                      Ja, sehr gut, nur wie kann ich jetzt meine MySQL-Results dazu tun?

                      Nachher sollte es so aussehen:

                      2019-08-01 - Termin XYZ
                      2019-08-01- Termin XYZ
                      2019-08-01- Termin XYZ
                      ...
                      2019-08-31- Termin XYZ

                      LG

                      Kommentar


                      • #12
                        Eigentlich obliegt es dir das zu programmieren.
                        Zudem bist du komplett vom ersten Beitrag abgewichen, da ging es noch um eine Zeiterfassung, jetzt sind wir schon bei einer Art Eventkalender, die am besten wir, für dich erstellen sollen.

                        Das es nicht ganz einfach ist, ist klar, aber wenn du dich damit überfordert fühlst, dann fange doch erst mal mit etwas einfacherem an.

                        Du solltest uns auch mal deine DB zeigen wie du das bis jetzt umgesetzt hast, am besten als SQL-Dump.

                        Kommentar


                        • #13
                          "sollte"? Dann überleg dir, wie du es genau haben willst, wie es gehen könnte, dass du das erreichst, und programiere es. Das ist ja das spannende daran. Den Code zu tippen ist nur ein notwendiges Übel dazu.. finde ich zumindest
                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Es geht immer noch um die Zeiterfassung ...

                            PHP-Code:
                            $events = array();

                               
                            $sql "SELECT * FROM tt_book WHERE userid = 'cbca6620db5901eed225f66a2ed6ff7f' AND monat = '2019_08' ORDER BY tag ASC";
                                foreach (
                            $pdo->query($sql) as $r) {
                                
                            $events[] = $r['tag'];

                                }



                                
                            $monat "2019_08";
                                
                            $m explode("_"$monat);

                                
                            $anzahltage date("t",mktime(0,0,0,$m[1],1,$m[0]));

                                for(
                            $i 1$i < ($anzahltage 1); $i++) {
                                
                            $days $m[0] . "_" $m[1] . "_" str_pad($i,2,"0",STR_PAD_LEFT);
                                if(
                            $days == $events[$i]) {
                                
                            //echo "$days - vorhanden<br>";
                                
                            }  else {
                                
                            //echo "Tag: $days - nicht vorhanden<br>";
                                
                            }

                                } 
                            Ich bin mir mit dem Ansatz total unsicher.
                            Die Tage des Monats ($days) sollen mit den Werten aus dem Array abgeglichen werden, wenn $days = event[].

                            LG aus Lübeck sendet
                            Thorben

                            Kommentar


                            • #15
                              PHP-Code:
                                  $monat "2019_08";
                                  
                              $m explode("_"$monat);

                                  
                              $anzahltage date("t",mktime(0,0,0,$m[1],1,$m[0]));

                                  for(
                              $i 1$i < ($anzahltage 1); $i++) {
                                  
                              $days $m[0] . "_" $m[1] . "_" str_pad($i,2,"0",STR_PAD_LEFT);
                                  if(
                              $days == $events[$i]) {
                                  
                              //echo "$days - vorhanden<br>";
                                  
                              }  else {
                                  
                              //echo "Tag: $days - nicht vorhanden<br>";
                                  

                              Definiere an dieser Stelle doch einfach die Variablen $year und $month anstatt mit $monat, als Monat-Jahr-Kombination, und $m, als Array.., alles noch unleserlicher zu machen.

                              Ich glaube du suchst in_array()
                              Relax, you're doing fine.
                              RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                              Kommentar

                              Lädt...
                              X