API

Authentifizierung

Um die Api nutzen zu können ist eine Authentifizierung erforderlich. Dafür werden die normalen Account (Benutzer) Login-Daten verwendet. Wenn die Authentifizierung erfolgreich war, wird ein Auth-Token als string zurückgegeben (JSON Web Token).

Dieser Auth-Token muss dann bei allen weiteren API-Anfragen im HTTP-Header (im Authorization-Feld) als Bearer-Token mit übergeben werden:
Header-Key: Authorization
Header-Value: Bearer <Auth-Token>

POST https://api.lupax.org/api/v1/auth/login

Data (Body, raw)

{
     "email": "Account-Email-Adresse",
     "password": "Account-Passwort"
} 

Response Auth-Token (string – JWT)

Organisationen

Mit dieser Anfrage werden alle Organisationen ausgegeben, mit der der aktuelle Account verknüpft ist.

GET https://api.lupax.org/api/v1/organizations

Response (json)

[
    {
        "id": int,
        "slug": string,
        "branch": string,
        "title": string,
        "url": string,
        "vacation_request_active": bool
    }, ...
]

Projekte

Mit dieser Anfrage werden alle Projekte als Array anhand bestimmter Parameter ausgegeben.

GET https://api.lupax.org/api/v1/organizations/[Organisations-Id]/projects

Verfügbare GET Parameter

Response (json)

[
    {
        "id": int,
        "title": string,
        "date_start": datetime, // YYYY-MM-DDThh:mm:ssTZD
        "date_end": datetime, // YYYY-MM-DDThh:mm:ssTZD
        "description": string (html),
        "client": {
            "salutation": string,
            "name": string,
            "first_name": string,
            "last_name": string,
            "type": string, // 'company'|'person'
            "customer": tinyint,
            "partner": tinyint,
            "deleted": tinyint,
            "organization": int,
            "phone_numbers": [
                string, ...
            ]
        },
        "sales": float, // Umsatz
        "responsible": {
            "id": int,
            "first_name": string,
            "last_name": string,
            "firm_tel": string,
            "firm_mobile": string,
            "staff": int
        },
        "status": {
            "id": int,
            "title": string,
            "color": string,
            "deleted": tinyint
        },
        "company": { // Daten der eigenen Organisation/Firma
            "id": int,
            "title": string,
            "logo": string,
            "company_name": string
        },
        "mission": int, // ID der Ausschreibung
        "organization": int,
        "extra_input": [ // Extra Felder
            {
                "title": string,
                "value": string
            }, ...
        ],
        "responsible_extra": [], // Zusätzliche Verantwortliche
        "files": [ // Dateien
            {}, ...
        ],
        "jobs": [ // Auflistung aller Dienstleistungen im Projekt
            {
                "id": int,
                "type": { // Angaben zur Dienstleistungsart
                    "title": string,
                    "icon": string,
                    "deleted": tinyint
                },
                "title": string,
                "description": string,
                "date_start": datetime, // Zeitraum-Beginn
                "date_end": datetime, // Zeitraum-Ende
                "duration": float, // Anzahl der Stunden
                "client": int,
                "address": {
                    "lat": float,
                    "lng": float,
                    "street": string,
                    "street_number": int,
                    "postal_code": int,
                    "city": string,
                    "text": string, // Komplette Adresse in einer Zeile
                    "additional": string // Bemerkungen
                },
                "address_note": string,
                "address_contact_person": string,
                "address_contact_phone": string,
                "dispo_start": datetime, // Realer-Beginn
                "dispo_end": datetime, // Reales-Ende
                "tour": int, // ID der Tour
                "tour_duration_cache": int, // Puffer-Zeit (Min.)
                "tour_drive": int, // Fahrzeit zum nächsten Ziel (Min.)
                "tour_drive_cache": int, // Puffer für Fahrzeit (Min.)
                "tour_order": int, // Reihenfolge in der Tour
                "tour_ignore": tinyint, // Keine Tour benötigt
                "tour_completed": tinyint, // Job in Tour abgeschlossen
                "project": int, // Projekt ID
                "responsible": int,
                "linked": int, // Verknüpfung mit anderem Job
                "deleted": tinyint,
                "organization": int,
                "crew": [
                    {
                        "qualification": {
                            "title": string,
                            "shortcut": string
                        },
                        "staffs": [
                            {
                                "id": int,
                                "first_name": string,
                                "last_name": string,
                                "department": int, // Abteilungs-ID
                                "mobile": string,
                                "booking_status": string // manual|offer|confirmation
                                // wird nur ausgegeben wenn bei der Anfrage "crew_booking_status" auf true gesetzt ist (siehe oben)
                            }, ...
                        ],
                        "required": int
                    }, ...
                ]
            }, ...
        ]
    }, ...
]

Touren

Mit dieser Anfrage werden alle Touren als Array anhand bestimmter Parameter ausgegeben.

GET https://api.lupax.org/api/v1/organizations/[Organisations-Id]/tours

Verfügbare GET Parameter

Response (json)

[
    { // TOUR
        "id": int,
        "title": string,
        "vehicle": {
            "id": int,
            "title": string,
            "code": string, // Kennzeichen
            "size": int, // Größe des Fahrzeugs (0 = PKW, 1= LKW 3,5t, ...)
            "driver_license": int, // 0 = Keinen, 1 = PKW - B, ...
            "seats": int, // Anzahl der Sitzplätze
            "petrol_consumption": int, // Durchschnittlicher Verbrauch
            "deleted": tinyint
        },
        "date_start": datetime, // YYYY-MM-DDThh:mm:ssTZD
        "date_end": datetime, // YYYY-MM-DDThh:mm:ssTZD
        "drive_start": int, // Fahrzeit zum nächsten Ziel (Min.)
        "drive_start_cache": int, // Puffer für Fahrzeit (Min.)
        "address_start": {
            "lat": float,
            "lng": float,
             "street": string,
             "street_number": int,
             "postal_code": int,
             "city": string,
             "text": string, // Komplette Adresse in einer Zeile
             "additional": string // Bemerkungen
        },
        "address_end": {
            "lat": float,
            "lng": float,
             "street": string,
             "street_number": int,
             "postal_code": int,
             "city": string,
             "text": string, // Komplette Adresse in einer Zeile
             "additional": string // Bemerkungen
        },
        "distance": int, // Strecke (Meter), die bei der Tour zurückgelegt wird
        "description": string,
        "completed": tinyint,
        "deleted": tinyint,
        "organization": int,
        "jobs": [
            {
                "id": int,
                "type": { // Angaben zur Dienstleistungsart
                    "title": string,
                    "icon": string,
                    "deleted": tinyint
                },
                "title": string,
                "description": string,
                "date_start": datetime, // Zeitraum-Beginn
                "date_end": datetime, // Zeitraum-Ende
                "duration": float, // Anzahl der Stunden
                "client": int || { // ID bei "minimal"=1, sonst Objekt
                    "salutation": string,
                    "name": string,
                    "first_name": string,
                    "last_name": string,
                    "type": string, // 'company'|'person'
                    "customer": tinyint,
                    "partner": tinyint,
                    "deleted": tinyint
                },
                "address": {
                    "lat": float,
                    "lng": float,
                    "street": string,
                    "street_number": int,
                    "postal_code": int,
                    "city": string,
                    "text": string, // Komplette Adresse in einer Zeile
                    "additional": string // Bemerkungen
                },
                "address_note": string,
                "address_contact_person": string,
                "address_contact_phone": string,
                "dispo_start": datetime, // Realer-Beginn
                "dispo_end": datetime, // Reales-Ende
                "tour": int, // ID der Tour
                "tour_duration_cache": int, // Puffer-Zeit (Min.)
                "tour_drive": int, // Fahrzeit zum nächsten Ziel (Min.)
                "tour_drive_cache": int,// Puffer für Fahrzeit (Min.)
                "tour_order": int, // Reihenfolge in der Tour
                "tour_ignore": tinyint, // Keine Tour benötigt
                "tour_completed": tinyint, // Job in Tour abgeschlossen
                "tour_completed_date": datetime, // Wird nur ausgegeben wenn im GET Parameter "completed_date" auf 1 gesetzt wurde
                "project": int || { // ID bei "minimal"=1, sonst Objekt
                    "id": int,
                    "title": string,
                    "date_start": datetime, // YYYY-MM-DDThh:mm:ssTZD
                    "date_end": datetime, // YYYY-MM-DDThh:mm:ssTZD
                    "description": string,
                    "client": int,
                    "sales": float, // Umsatz
                    "responsible": {
                        "id": int,
                        "first_name": string,
                        "last_name": string,
                        "firm_tel": string,
                        "firm_mobile": string,
                        "staff": int
                    },
                    "status": {
                        "id": int,
                        "title": string,
                        "color": string,
                        "deleted": tinyint
                    },
                    "company": int,
                    "mission": int, // ID der Ausschreibung
                    "organization": int,
                    "extra_input": [ // Extra Felder
                        {
                            "title": string,
                            "value": string
                        }, ...
                    ],
                    "responsible_extra": [], // Zusätzliche Verantwortliche
                    "files": [ // Dateien
                        {}, ...
                    ]
                },
                "responsible": {
                    "id": int,
                    "first_name": string,
                    "last_name": string,
                    "firm_tel": string,
                    "firm_mobile": string,
                    "staff": int
                },
                "linked": int, // Verknüpfung mit anderem Job
                "deleted": tinyint,
                "organization": int,
                "files": [],
                "extra_input": [ // Extra Felder
                    {
                        "title": string,
                        "value": string
                    }, ...
                ],
                "responsible_extra": [], // Zusätzliche Verantwortliche
                "company": {
                    "id": int,
                    "title": string,
                    "logo": string,
                    "company_name": string
                }
            }, ...
        ],
        "files": [{}, ...], // Dateien
        "drivers": { 
            "driver": [ // Array von Fahrern
                {
                    "id": int,
                    "first_name": string,
                    "last_name": string,
                    "department": int, // Abteilung
                    "organization": int
                }, ...
            ],
            "co-driver": [] // Array von Beifahrern
        },
        "company": {
            "id": int,
            "title": string,
            "logo": string,
            "company_name": string
        }
    }, ...
]

Dienstplaneinträge

Mit dieser Anfrage werden alle Dienstplaneinträge von allen Mitarbeitern als Array anhand bestimmter Parameter ausgegeben.

GET https://api.lupax.org/api/v1/organizations/[Organisations-Id]/rosters

Verfügbare GET Parameter

Response (json)

[
    {
        "id": int,
        "shift": int, // ID der Arbeitsschicht
        "start": datetime,
        "end": datetime,
        "duration": time, // Dauer als Zeitangabe
        "days": float, // Anzahl der Tage
        "type": string, // Art des Eintrags (work, vacation, vacation_special, sick, available, not_available, free, overtime_adjust)
        "title": string,
        "organization": int,
        "staff": {
            "id": int,
            "first_name": string,
            "last_name": string,
            "department": int // Abteilungs-ID
        }
    }, ...
]