chore(docs): redid readme + cleanup
This commit is contained in:
@@ -1,92 +0,0 @@
|
|||||||
#let table-header(..headers) = {
|
|
||||||
table.header(
|
|
||||||
..headers.pos().map(h => strong(h))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#let abrechnung(meta, days) = {
|
|
||||||
set page(paper: "a4", margin: (x:1.5cm, y:2.25cm),
|
|
||||||
footer:[#grid(
|
|
||||||
columns: (3fr, .65fr),
|
|
||||||
align: left + horizon,
|
|
||||||
inset: .5em,
|
|
||||||
[#meta.EmployeeName -- #meta.TimeRange], grid.cell(rowspan: 2)[#image("static/logo.png")],
|
|
||||||
[Arbeitszeitrechnung maschinell erstellt am #meta.CurrentTimestamp],
|
|
||||||
)
|
|
||||||
])
|
|
||||||
set text(font: "Noto Sans", size:10pt, fill: luma(10%))
|
|
||||||
set table(
|
|
||||||
stroke: 0.5pt + luma(10%),
|
|
||||||
inset: .5em,
|
|
||||||
align: center + horizon,
|
|
||||||
)
|
|
||||||
show text: it => {
|
|
||||||
if it.text == "0min"{
|
|
||||||
text(oklch(70.8%, 0, 0deg))[#it]
|
|
||||||
}else if it.text.starts-with("-"){
|
|
||||||
text(red)[#it]
|
|
||||||
}else{
|
|
||||||
it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[= Abrechnung Arbeitszeit -- #meta.EmployeeName]
|
|
||||||
|
|
||||||
[Zeitraum: #meta.TimeRange]
|
|
||||||
|
|
||||||
table(
|
|
||||||
columns: (1fr, 1fr, 1fr, 1fr, 1fr, 1fr, 1.25fr),
|
|
||||||
fill: (x, y) =>
|
|
||||||
if y == 0 { oklch(87%, 0, 0deg) },
|
|
||||||
table-header(
|
|
||||||
[Datum], [Kommen], [Gehen], [Arbeitsart], [Stunden], [Pause], [Überstunden]
|
|
||||||
),
|
|
||||||
.. for day in days {
|
|
||||||
(
|
|
||||||
[#day.Date],
|
|
||||||
if day.DayParts.len() == 0{
|
|
||||||
table.cell(colspan: 3)[Keine Buchungen]
|
|
||||||
}else if not day.DayParts.first().IsWorkDay{
|
|
||||||
table.cell(colspan: 3)[#day.DayParts.first().WorkType]
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
table.cell(colspan: 3, inset: 0em)[
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (1fr, 1fr, 1fr),
|
|
||||||
.. for Zeit in day.DayParts {
|
|
||||||
(
|
|
||||||
[#Zeit.BookingFrom],
|
|
||||||
[#Zeit.BookingTo],
|
|
||||||
[#Zeit.WorkType],
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
]
|
|
||||||
},
|
|
||||||
[#day.Worktime],
|
|
||||||
[#day.Pausetime],
|
|
||||||
[#day.Overtime],
|
|
||||||
)
|
|
||||||
if day.IsFriday {
|
|
||||||
( table.cell(colspan: 7, fill: oklch(87%, 0, 0deg))[Wochenende], ) // note the trailing comma
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
table(
|
|
||||||
columns: (3fr, 1fr),
|
|
||||||
align: right,
|
|
||||||
inset: (x: .25em, y:.75em),
|
|
||||||
stroke: none,
|
|
||||||
table.hline(start: 0, end: 2, stroke: stroke(dash:"dashed", thickness:.5pt)),
|
|
||||||
[Arbeitszeit :], table.cell(align: left)[#meta.WorkTime],
|
|
||||||
[Überstunden :], table.cell(align: left)[#meta.Overtime],
|
|
||||||
[Überstunden :],table.cell(align: left)[#meta.OvertimeTotal],
|
|
||||||
table.hline(start: 0, end: 2),
|
|
||||||
|
|
||||||
)
|
|
||||||
}
|
|
||||||
147
Readme.md
147
Readme.md
@@ -2,124 +2,53 @@
|
|||||||
|
|
||||||
[](https://sonar.letsstein.de/dashboard?id=arbeitszeitmessung)
|
[](https://sonar.letsstein.de/dashboard?id=arbeitszeitmessung)
|
||||||
|
|
||||||
bis jetzt ein einfaches Backend mit PostgreSQL Datenbank und GO Webserver um Arbeitszeitbuchungen per HTTP PUT einzufügen
|
---
|
||||||
|
|
||||||
|
Eine open-source Software zur Arbeitszeitmessung
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- manuelle Korrektur von einzelnen Buchungen
|
||||||
|
- Buchung von benutzerdefinierten Abwesenheiten
|
||||||
|
- automatische gesetzlicher Feiertage
|
||||||
|
- Pflege eigener Feiertage
|
||||||
|
|
||||||
|
- wöchentliches Abrechnungssystem
|
||||||
|
- Kontrolle der Arbeitszeiten durch direkte Führungskraft
|
||||||
|
|
||||||
|
- Ausgabe der Arbeitszeiten je Monat in PDF Format
|
||||||
|
|
||||||
|
- Anwesenheitsübersicht
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://git.letsstein.de/tom/arbeitszeitmessung arbeitszeitmessung
|
git clone https://git.letsstein.de/tom/arbeitszeitmessung arbeitszeitmessung
|
||||||
|
|
||||||
cd arbeitszeitmessung/Docker
|
cd arbeitszeitmessung
|
||||||
# .env Datei anpassen
|
|
||||||
docker compose up -d
|
./install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## PREVIEW
|
### Konfiguration:
|
||||||
|
|
||||||
Zeitverwaltungsansicht (/time):
|
- Datenbank
|
||||||
|
- `POSTGRES_USER` Postgres ADMIN Nutzername
|
||||||

|
- `POSTGRES_PASSWORD` Postgres ADMIN Passwort
|
||||||
|
- `POSTGRES_API_USER` Postgres API Nutzername für Webanwendung
|
||||||
Ansicht der Führungskraft (/team):
|
- `POSTGRES_API_PASS` Postgres API Passwort für Webanwendung
|
||||||
|
- `POSTGRES_PATH` Datebank Pfad
|
||||||

|
- `POSTGRES_DB` Postgres Datenbank Name
|
||||||
|
- `POSTGRES_PORT` Postgres Port für administration
|
||||||
Nutzeransicht (/user):
|
- System
|
||||||
|
- `TZ` Zeitzone
|
||||||

|
- `LOG_LEVEL` Welche Log-Nachrichten werden in der Konsole erscheinen
|
||||||
|
- Web/API
|
||||||
## Buchungstypen
|
- `API_TOKEN` API Token für ESP Endpoints
|
||||||
|
- `WEB_PORT` Port unter welchem Webserver erreichbar ist
|
||||||
1 - Kommen
|
- Ordnerstruktur
|
||||||
2 - Gehen
|
- `BACKUP_FOLDER` Pfad für DB Backup Datein
|
||||||
3 - Kommen Manuell
|
- `LOG_PATH` Pfad für Audit Logs
|
||||||
4 - Gehen Manuell
|
|
||||||
254 - Automatisch abgemeldet
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
Nutzung der API
|
|
||||||
wenn die `dev-docker-compose.yml` Datei gestartet wird, ist direkt ein SwaggerUI Server mit entsprechender Datei inbegriffen.
|
|
||||||
|
|
||||||
### Buchungen [/time]
|
|
||||||
|
|
||||||
#### [GET] Anfrage
|
|
||||||
|
|
||||||
Parameter: cardID (string)
|
|
||||||
Antwort: `200`
|
|
||||||
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"cradID": "test_card",
|
|
||||||
"readerID": "test_reader",
|
|
||||||
"bookingTyp": 2,
|
|
||||||
"loggedTime": "2024-09-05T08:37:53.117641Z",
|
|
||||||
"id": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cradID": "test_card",
|
|
||||||
"readerID": "mytest",
|
|
||||||
"bookingTyp": 1,
|
|
||||||
"loggedTime": "2024-09-05T08:51:12.670827Z",
|
|
||||||
"id": 6
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
Antwort `500`
|
|
||||||
Serverfehler
|
|
||||||
|
|
||||||
#### [PUT] Anfrage
|
|
||||||
|
|
||||||
Parameter: id (int)
|
|
||||||
Body: (veränderte Parameter)
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"cradID": "test_card",
|
|
||||||
"readerID": "mytest",
|
|
||||||
"bookingTyp": 1,
|
|
||||||
"loggedTime": "2024-09-05T08:51:12.670827Z"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Antwort `200`
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"cradID": "test_card",
|
|
||||||
"readerID": "mytest",
|
|
||||||
"bookingTyp": 1,
|
|
||||||
"loggedTime": "2024-09-05T08:51:12.670827Z",
|
|
||||||
"id": 6
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Neue Buchung [/time/new]
|
|
||||||
|
|
||||||
#### [PUT] Anfrage
|
|
||||||
|
|
||||||
Parameter:
|
|
||||||
|
|
||||||
- cardID (string)
|
|
||||||
- readerID (string)
|
|
||||||
- bookingType (string)
|
|
||||||
|
|
||||||
Antwort `202` Akzeptiert und eingefügt
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"cradID": "test_card",
|
|
||||||
"readerID": "mytest",
|
|
||||||
"bookingTyp": 1,
|
|
||||||
"loggedTime": "2024-09-05T08:51:12.670827Z",
|
|
||||||
"id": 6
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Antwort `409` Konflikt
|
|
||||||
Die vorherige Buchung am selben Tag hat den gleichen Buchungstyp
|
|
||||||
|
|
||||||
# Filestrukture
|
# Filestrukture
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user