Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,18 @@
{
"extends": ["../../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-clockodo
This library was generated with [Nx](https://nx.dev).
## Running lint
Run `nx lint pieces-clockodo` to execute the lint via [ESLint](https://eslint.org/).

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-clockodo",
"version": "0.1.10"
}

View File

@@ -0,0 +1,51 @@
{
"name": "pieces-clockodo",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/clockodo/src",
"projectType": "library",
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/clockodo",
"tsConfig": "packages/pieces/community/clockodo/tsconfig.lib.json",
"packageJson": "packages/pieces/community/clockodo/package.json",
"main": "packages/pieces/community/clockodo/src/index.ts",
"assets": [
"packages/pieces/community/clockodo/*.md",
{
"input": "packages/pieces/community/clockodo/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/clockodo",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
},
"tags": []
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "Zeiterfassung leicht gemacht",
"E-Mail": "E-Mail",
"API-Token": "API-Token",
"Company Name": "Firmenname",
"Company E-Mail": "Firma E-Mail",
"The email of your clockodo user": "Die E-Mail Ihres Clockodo-Benutzers",
"Your api token (can be found in profile settings)": "Ihr Api-Token (finden Sie in den Profileinstellungen)",
"Your company name or app name": "Firmenname oder App-Name",
"A contact email for your company or app": "Eine Kontakt-E-Mail für Ihr Unternehmen oder Ihre App",
"Create Entry": "Eintrag erstellen",
"Get Entry": "Eintrag abrufen",
"Get Entries": "Einträge abrufen",
"Update Entry": "Eintrag aktualisieren",
"Delete Entry": "Eintrag löschen",
"Create Customer": "Kunde erstellen",
"Get Customer": "Kunde erhalten",
"Update Customer": "Kunde aktualisieren",
"Get Customers": "Kunden holen",
"Delete Customer": "Kunden löschen",
"Create Project": "Projekt erstellen",
"Get Project": "Projekt holen",
"Get Projects": "Projekte abrufen",
"Update Project": "Projekt aktualisieren",
"Delete Project": "Projekt löschen",
"Create Service": "Service erstellen",
"Get Service": "Service abrufen",
"Update Service": "Update-Dienst",
"Get Services": "Services abrufen",
"Delete Service": "Service löschen",
"Get Team": "Team holen",
"Get Teams": "Teams holen",
"Get User": "Benutzer holen",
"Get Users": "Get Users",
"Create User": "Benutzer erstellen",
"Update User": "Benutzer aktualisieren",
"Delete User": "Benutzer löschen",
"Create Absence": "Abwesenheit erstellen",
"Get Absence": "Abwesenheit",
"Update Absence": "Abwesenheit aktualisieren",
"Get Absences": "Erhalte Abwesenheit",
"Delete Absence": "Abwesenheit löschen",
"Custom API Call": "Eigener API-Aufruf",
"Creates an entry in clockodo": "Erstellt einen Eintrag in clockodo",
"Retrieves a single entry from clockodo": "Ruft einen einzelnen Eintrag von Clockodo ab",
"Fetches entries from clockodo": "Ruft Einträge von Clockodo ab",
"Updates an entry in clockodo": "Aktualisiert einen Eintrag in clockodo",
"Deletes an entry in clockodo": "Löscht einen Eintrag in Clockodo",
"Creates a customer in clockodo": "Erstellt einen Kunden in clockodo",
"Retrieves a single customer from clockodo": "Ruft einen einzelnen Kunden von Clockodo ab",
"Updates a customer in clockodo": "Aktualisiert einen Kunden in clockodo",
"Fetches customers from clockodo": "Lädt Kunden von clockodo",
"Deletes a customer in clockodo": "Löscht einen Kunden in Clockodo",
"Creates a project in clockodo": "Erstellt ein Projekt in clockodo",
"Retrieves a single project from clockodo": "Ruft ein einzelnes Projekt von Clockodo ab",
"Fetches projects from clockodo": "Ruft Projekte von Clockodo ab",
"Updates a project in clockodo": "Aktualisiert ein Projekt in clockodo",
"Deletes a project in clockodo": "Löscht ein Projekt in Clockodo",
"Creates a service in clockodo": "Erstellt einen Dienst in Clockodo",
"Retrieves a single service from clockodo": "Ruft einen einzigen Dienst von Clockodo ab",
"Updates a service in clockodo": "Aktualisiert einen Dienst in Clockodo",
"Fetches services from clockodo": "Ruft Dienste von Clockodo ab",
"Deletes a service in clockodo": "Löscht einen Dienst in Clockodo",
"Retrieves a single team from clockodo": "Ruft ein einzelnes Team von Clockodo ab",
"Fetches teams from clockodo": "Ruft Teams von Clockodo ab",
"Retrieves a single user from clockodo": "Ruft einen einzelnen Benutzer von clockodo ab",
"Fetches users from clockodo": "Lädt Benutzer von clockodo",
"Creates a user in clockodo": "Erstellt einen Benutzer in clockodo",
"Updates a user in clockodo": "Aktualisiert einen Benutzer in clockodo",
"Deletes a user in clockodo": "Löscht einen Benutzer in clockodo",
"Creates a absence in clockodo": "Erstellt eine Abwesenheit in Clockodo",
"Retrieves a single absence from clockodo": "Ruft eine einzelne Abwesenheit von Clockodo ab",
"Updates an absence in clockodo": "Aktualisiert Abwesenheit in Clockodo",
"Fetches absences from clockodo": "Abrufen der Abwesenheit von Uhr",
"Deletes an absence in clockodo": "Löscht Abwesenheit in der Uhr",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Customer": "Kunde",
"Project": "Projekt",
"Service": "Service",
"Start Time": "Startzeit",
"End Time": "Endzeit",
"Description": "Beschreibung",
"Hourly Rate": "Stundensatz",
"User": "Benutzer",
"Entry ID": "Eintrag-ID",
"Start Date": "Startdatum",
"End Date": "Enddatum",
"Customer ID Filter": "Kunden-ID Filter",
"Project ID Filter": "Projekt ID-Filter",
"Service ID Filter": "Dienst-ID-Filter",
"Billable": "Abrechenbar",
"Billed": "Abgerechnet",
"Enhanced List": "Erweiterte Liste",
"Page": "Seite",
"Name": "Name",
"Number": "Zahl",
"Active": "Aktiv",
"Note": "Notiz",
"Color": "Farbe",
"Active Filter": "Aktiver Filter",
"Budget": "Budget",
"Budget in hours?": "Budget in Stunden?",
"Soft Budget": "Soft-Budget",
"Completed": "Abgeschlossen",
"Billed Amount": "Rechnungsbetrag",
"Billing Complete": "Abrechnung abgeschlossen",
"Team": "Team",
"Role": "Rolle",
"Language": "Sprache",
"Wage Type": "Lohnart",
"Can see absences": "Darf Abwesenheit sehen",
"Can manage absences": "Darf Abwesenheit verwalten",
"Can add customers": "Kann Kunden hinzufügen",
"Type": "Typ",
"Half Days": "Halbe Tage",
"Approved": "Genehmigt",
"Sick Note": "Kranke Notiz",
"Absence ID": "Abwesenheitsnummer",
"Status": "Status",
"Year": "Jahr",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"The ID of the customer": "Die ID des Kunden",
"The ID of the project": "Die ID des Projekts",
"The ID of the service": "Die ID des Dienstes",
"The ID of the user": "Die ID des Benutzers",
"Filter entries by their user": "Einträge nach ihrem Benutzer filtern",
"Filter entries by their customer": "Einträge nach Kunden filtern",
"Filter entries by their project": "Einträge nach Projekt filtern",
"Filter entries by their service": "Einträge nach ihrem Dienst filtern",
"Only show entries that are billable": "Nur abrechnungsfähige Einträge anzeigen",
"Only show entries that are already billed": "Nur Einträge anzeigen, die bereits abgerechnet sind",
"Retrieves additional information about the entries": "Ruft zusätzliche Informationen über die Einträge ab",
"Reads only the specified page": "Liest nur die angegebene Seite",
"Filter customers by their active status": "Kunden nach ihrem aktiven Status filtern",
"Filter projects by their customer": "Projekte nach Kunden filtern",
"The ID of the team": "Die ID des Teams",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"Orange": "Orange",
"Yellow": "Gelb",
"Green": "Grün",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Blau",
"Purple": "Lila",
"Magenta": "Magenta",
"Pink": "Rosa",
"German": "Deutsch",
"English": "Englisch",
"French": "Französisch",
"Salary": "Gehalt",
"Hourly wage": "Stundenlohn",
"Regular holiday": "Normaler Urlaub",
"Special leaves": "Spezielle Blätter",
"Reduction of overtime": "Reduktion der Überstunden",
"Sick day": "Kranker Tag",
"Sick day of a child": "Kranker Tag eines Kindes",
"School / further education": "Schule / Weiterbildung",
"Maternity protection": "Mutterschutz",
"Home office (planned hours are applied)": "Home Office (geplante Stunden werden angewendet)",
"Work out of office (planned hours are applied)": "Arbeiten außerhalb des Büros (geplante Stunden werden angewendet)",
"Special leaves (unpaid)": "Spezielle Blätter (unbezahlt)",
"Sick day (unpaid)": "Kranker Tag (unbezahlt)",
"Sick day of child (unpaid)": "Kranker Tag des Kindes (unbezahlt)",
"Quarantine": "Quarantäne",
"Military / alternative service (only full days)": "Militärdienst (nur volle Tage)",
"Sick day (sickness benefit)": "Kranker Tag (Krankheitsvorteil)",
"Requested": "Angefragt",
"Declined": "Abgelehnt",
"Approval cancelled": "Genehmigung storniert",
"Request cancelled": "Anfrage abgebrochen",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Entry": "Neuer Eintrag",
"New Absence Enquiry": "Neue Abwesenheitsanfrage",
"Triggers when a new time entry is created": "Wird ausgelöst, wenn ein neuer Zeiteintrag erstellt wird",
"Triggers when a new absence enquiry is created": "Wird ausgelöst, wenn eine neue Abwesenheitsanfrage erstellt wird"
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "Control de tiempo facilitado",
"E-Mail": "Correo",
"API-Token": "API-Token",
"Company Name": "Nombre De La Empresa",
"Company E-Mail": "E-Mail de la empresa",
"The email of your clockodo user": "El correo electrónico de tu usuario de reloj",
"Your api token (can be found in profile settings)": "Tu token api (se puede encontrar en la configuración del perfil)",
"Your company name or app name": "Nombre de su empresa o apellido",
"A contact email for your company or app": "Un correo electrónico de contacto para tu empresa o aplicación",
"Create Entry": "Crear entrada",
"Get Entry": "Obtener entrada",
"Get Entries": "Obtener entradas",
"Update Entry": "Actualizar entrada",
"Delete Entry": "Eliminar entrada",
"Create Customer": "Crear cliente",
"Get Customer": "Obtener cliente",
"Update Customer": "Actualizar cliente",
"Get Customers": "Obtener clientes",
"Delete Customer": "Eliminar cliente",
"Create Project": "Crear proyecto",
"Get Project": "Obtener proyecto",
"Get Projects": "Obtener Proyectos",
"Update Project": "Actualizar proyecto",
"Delete Project": "Eliminar proyecto",
"Create Service": "Crear Servicio",
"Get Service": "Obtener Servicio",
"Update Service": "Actualizar Servicio",
"Get Services": "Obtener servicios",
"Delete Service": "Eliminar Servicio",
"Get Team": "Obtener equipo",
"Get Teams": "Obtener Equipos",
"Get User": "Obtener usuario",
"Get Users": "Get Users",
"Create User": "Crear usuario",
"Update User": "Actualizar usuario",
"Delete User": "Eliminar usuario",
"Create Absence": "Crear ausencia",
"Get Absence": "Obtener ausencia",
"Update Absence": "Actualizar ausencia",
"Get Absences": "Obtener ausencias",
"Delete Absence": "Eliminar ausencia",
"Custom API Call": "Llamada API personalizada",
"Creates an entry in clockodo": "Crea una entrada en reloj",
"Retrieves a single entry from clockodo": "Recuperar una sola entrada del reloj",
"Fetches entries from clockodo": "Obtiene entradas de reloj",
"Updates an entry in clockodo": "Actualiza una entrada en clockodo",
"Deletes an entry in clockodo": "Elimina una entrada en reloj",
"Creates a customer in clockodo": "Crea un cliente en clockodo",
"Retrieves a single customer from clockodo": "Recuperar un solo cliente de clockodo",
"Updates a customer in clockodo": "Actualiza un cliente en clockodo",
"Fetches customers from clockodo": "Obtiene clientes de clockodo",
"Deletes a customer in clockodo": "Elimina un cliente en clockodo",
"Creates a project in clockodo": "Crea un proyecto en reloj",
"Retrieves a single project from clockodo": "Recuperar un solo proyecto de reloj",
"Fetches projects from clockodo": "Obtiene proyectos de reloj",
"Updates a project in clockodo": "Actualiza un proyecto en reloj",
"Deletes a project in clockodo": "Elimina un proyecto en reloj",
"Creates a service in clockodo": "Crea un servicio en clockodo",
"Retrieves a single service from clockodo": "Recuperar un solo servicio desde el reloj",
"Updates a service in clockodo": "Actualiza un servicio en clockodo",
"Fetches services from clockodo": "Obtiene servicios de reloj",
"Deletes a service in clockodo": "Elimina un servicio en reloj",
"Retrieves a single team from clockodo": "Recuperar un solo equipo de reloj",
"Fetches teams from clockodo": "Obtiene equipos de reloj",
"Retrieves a single user from clockodo": "Recuperar un solo usuario de clockodo",
"Fetches users from clockodo": "Obtener usuarios del reloj",
"Creates a user in clockodo": "Crea un usuario en clockodo",
"Updates a user in clockodo": "Actualiza un usuario en clockodo",
"Deletes a user in clockodo": "Elimina un usuario en clockodo",
"Creates a absence in clockodo": "Crea una ausencia en reloj",
"Retrieves a single absence from clockodo": "Recuperar una sola ausencia del reloj",
"Updates an absence in clockodo": "Actualiza una ausencia en reloj",
"Fetches absences from clockodo": "Obtiene ausencias del reloj",
"Deletes an absence in clockodo": "Elimina una ausencia en reloj",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Customer": "Cliente",
"Project": "Projekt",
"Service": "Servicio",
"Start Time": "Hora de inicio",
"End Time": "Hora de fin",
"Description": "Descripción",
"Hourly Rate": "Tarifa por hora",
"User": "Usuario",
"Entry ID": "ID de entrada",
"Start Date": "Fecha de inicio",
"End Date": "Fecha de fin",
"Customer ID Filter": "Filtro de ID de cliente",
"Project ID Filter": "Filtro de ID del proyecto",
"Service ID Filter": "Filtro de ID de servicio",
"Billable": "Facturable",
"Billed": "Facturado",
"Enhanced List": "Lista mejorada",
"Page": "Pgina",
"Name": "Nombre",
"Number": "Número",
"Active": "Activo",
"Note": "Nota",
"Color": "Color",
"Active Filter": "Filtro activo",
"Budget": "Presupuestario",
"Budget in hours?": "Presupuesto en horas?",
"Soft Budget": "Presupuesto suave",
"Completed": "Completado",
"Billed Amount": "Importe facturado",
"Billing Complete": "Facturación completada",
"Team": "Equipo",
"Role": "Rol",
"Language": "Idioma",
"Wage Type": "Tipo de salario",
"Can see absences": "Puedes ver ausencias",
"Can manage absences": "Puede administrar ausencias",
"Can add customers": "Puede añadir clientes",
"Type": "Tipo",
"Half Days": "Días medianos",
"Approved": "Aprobado",
"Sick Note": "Nota de enfermedad",
"Absence ID": "ID de Ausencia",
"Status": "Estado",
"Year": "Año",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"The ID of the customer": "El ID del cliente",
"The ID of the project": "El ID del proyecto",
"The ID of the service": "El ID del servicio",
"The ID of the user": "El ID del usuario",
"Filter entries by their user": "Filtrar entradas por su usuario",
"Filter entries by their customer": "Filtrar entradas por su cliente",
"Filter entries by their project": "Filtrar entradas por su proyecto",
"Filter entries by their service": "Filtrar entradas por su servicio",
"Only show entries that are billable": "Mostrar sólo las entradas que son facturables",
"Only show entries that are already billed": "Mostrar sólo las entradas que ya están facturadas",
"Retrieves additional information about the entries": "Recuperar información adicional sobre las entradas",
"Reads only the specified page": "Lee sólo la página especificada",
"Filter customers by their active status": "Filtrar clientes por su estado activo",
"Filter projects by their customer": "Filtrar proyectos por su cliente",
"The ID of the team": "El ID del equipo",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"Orange": "Naranja",
"Yellow": "Amarillo",
"Green": "Verde",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Azul",
"Purple": "Morado",
"Magenta": "Magenta",
"Pink": "Rosa",
"German": "Alemán",
"English": "Inglés",
"French": "Francés",
"Salary": "Salario",
"Hourly wage": "Salario por hora",
"Regular holiday": "Vacaciones regulares",
"Special leaves": "Hojas especiales",
"Reduction of overtime": "Reducción de las horas extraordinarias",
"Sick day": "Día de la enfermedad",
"Sick day of a child": "Día de un niño enfermo",
"School / further education": "Escolar / educación superior",
"Maternity protection": "Protección de maternidad",
"Home office (planned hours are applied)": "Oficina en casa (se aplican las horas planeadas)",
"Work out of office (planned hours are applied)": "Trabajar fuera de la oficina (se aplican las horas planificadas)",
"Special leaves (unpaid)": "Hojas especiales (sin pagar)",
"Sick day (unpaid)": "Día por enfermedad (no pagado)",
"Sick day of child (unpaid)": "Día del niño enfermo (no pagado)",
"Quarantine": "Cuarantina",
"Military / alternative service (only full days)": "Servicio militar / alternativo (sólo días completos)",
"Sick day (sickness benefit)": "Día por enfermedad (beneficio por enfermedad)",
"Requested": "Solicitado",
"Declined": "Denegado",
"Approval cancelled": "Aprobación cancelada",
"Request cancelled": "Solicitud cancelada",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Entry": "Nueva entrada",
"New Absence Enquiry": "Nueva consulta de ausencia",
"Triggers when a new time entry is created": "Dispara cuando se crea una nueva entrada de tiempo",
"Triggers when a new absence enquiry is created": "Dispara cuando se crea una nueva consulta de ausencia"
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "Le suivi du temps simplifié",
"E-Mail": "Courriel",
"API-Token": "API-Token",
"Company Name": "Nom de lentreprise",
"Company E-Mail": "E-Mail de la société",
"The email of your clockodo user": "L'e-mail de votre utilisateur d'horodatage",
"Your api token (can be found in profile settings)": "Votre jeton api (peut être trouvé dans les paramètres du profil)",
"Your company name or app name": "Nom de votre entreprise ou nom d'application",
"A contact email for your company or app": "Un e-mail de contact pour votre entreprise ou application",
"Create Entry": "Créer une entrée",
"Get Entry": "Obtenir une entrée",
"Get Entries": "Obtenir des entrées",
"Update Entry": "Mettre à jour l'entrée",
"Delete Entry": "Supprimer l'entrée",
"Create Customer": "Créer un client",
"Get Customer": "Obtenir le client",
"Update Customer": "Mettre à jour le client",
"Get Customers": "Obtenir des clients",
"Delete Customer": "Supprimer le client",
"Create Project": "Créer un projet",
"Get Project": "Obtenir le projet",
"Get Projects": "Obtenir des projets",
"Update Project": "Mettre à jour le projet",
"Delete Project": "Supprimer le projet",
"Create Service": "Créer un Service",
"Get Service": "Obtenir le service",
"Update Service": "Service de mise à jour",
"Get Services": "Obtenir des services",
"Delete Service": "Supprimer le service",
"Get Team": "Obtenir une équipe",
"Get Teams": "Obtenir des équipes",
"Get User": "Obtenir un utilisateur",
"Get Users": "Get Users",
"Create User": "Créer un utilisateur",
"Update User": "Mise à jour de l'utilisateur",
"Delete User": "Supprimer l'utilisateur",
"Create Absence": "Créer une absence",
"Get Absence": "Absence",
"Update Absence": "Mise à jour Absence",
"Get Absences": "Obtenez des absences",
"Delete Absence": "Supprimer l'absence",
"Custom API Call": "Appel API personnalisé",
"Creates an entry in clockodo": "Crée une entrée dans l'horloge",
"Retrieves a single entry from clockodo": "Récupère une seule entrée à partir de l'horloge",
"Fetches entries from clockodo": "Récupère les entrées de l'horloge kodo",
"Updates an entry in clockodo": "Met à jour une entrée dans l'horloge",
"Deletes an entry in clockodo": "Supprime une entrée dans l'horloge",
"Creates a customer in clockodo": "Crée un client dans l'horloge",
"Retrieves a single customer from clockodo": "Récupère un seul client de l'horloge",
"Updates a customer in clockodo": "Met à jour un client dans l'horloge",
"Fetches customers from clockodo": "Récupère les clients de l'horloge",
"Deletes a customer in clockodo": "Supprime un client dans l'horloge",
"Creates a project in clockodo": "Crée un projet dans l'horloge",
"Retrieves a single project from clockodo": "Récupère un seul projet à partir de l'horloge",
"Fetches projects from clockodo": "Récupère les projets depuis l'horloge",
"Updates a project in clockodo": "Met à jour un projet dans l'horloge",
"Deletes a project in clockodo": "Supprime un projet dans l'horloge",
"Creates a service in clockodo": "Crée un service dans l'horloge",
"Retrieves a single service from clockodo": "Récupère un service unique à partir de l'horloge",
"Updates a service in clockodo": "Met à jour un service dans l'horloge",
"Fetches services from clockodo": "Récupère les services de l'horloge",
"Deletes a service in clockodo": "Supprime un service dans l'horloge",
"Retrieves a single team from clockodo": "Récupère une seule équipe à partir de l'horloge",
"Fetches teams from clockodo": "Récupère les équipes de l'horloge kodo",
"Retrieves a single user from clockodo": "Récupère un seul utilisateur de l'horloge",
"Fetches users from clockodo": "Récupère les utilisateurs de l'horloge",
"Creates a user in clockodo": "Crée un utilisateur dans l'horloge",
"Updates a user in clockodo": "Met à jour un utilisateur dans l'horloge",
"Deletes a user in clockodo": "Supprime un utilisateur dans l'horloge",
"Creates a absence in clockodo": "Crée une absence dans l'horloge",
"Retrieves a single absence from clockodo": "Récupère une seule absence de l'horloge",
"Updates an absence in clockodo": "Met à jour une absence dans l'horloge",
"Fetches absences from clockodo": "Récupère les absences de l'horloge",
"Deletes an absence in clockodo": "Supprime une absence dans l'horloge",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Customer": "Client",
"Project": "Projet",
"Service": "Service",
"Start Time": "Start Time",
"End Time": "Heure de fin",
"Description": "Libellé",
"Hourly Rate": "Taux horaire",
"User": "Utilisateur",
"Entry ID": "ID de l'entrée",
"Start Date": "Date de début",
"End Date": "Date de fin",
"Customer ID Filter": "Filtre ID du client",
"Project ID Filter": "Filtre ID du projet",
"Service ID Filter": "Filtre ID de service",
"Billable": "Facturable",
"Billed": "Facturé",
"Enhanced List": "Liste améliorée",
"Page": "Page",
"Name": "Nom",
"Number": "Number",
"Active": "Actif",
"Note": "Note",
"Color": "Couleur",
"Active Filter": "Filtre actif",
"Budget": "Budget",
"Budget in hours?": "Budget en heures ?",
"Soft Budget": "Budget souple",
"Completed": "Terminé",
"Billed Amount": "Montant facturé",
"Billing Complete": "Facturation terminée",
"Team": "Équipe",
"Role": "Rôle",
"Language": "Langue",
"Wage Type": "Type de salaire",
"Can see absences": "Peut voir les absences",
"Can manage absences": "Permet de gérer les absences",
"Can add customers": "Peut ajouter des clients",
"Type": "Type de texte",
"Half Days": "Demi-jours",
"Approved": "Approuvé",
"Sick Note": "Note de maladie",
"Absence ID": "ID d'absence",
"Status": "Statut",
"Year": "Année",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'attente (en secondes)",
"The ID of the customer": "L'ID du client",
"The ID of the project": "L'ID du projet",
"The ID of the service": "L'ID du service",
"The ID of the user": "L'ID de l'utilisateur",
"Filter entries by their user": "Filtrer les entrées par leur utilisateur",
"Filter entries by their customer": "Filtrer les entrées par le client",
"Filter entries by their project": "Filtrer les entrées par projet",
"Filter entries by their service": "Filtrer les entrées par leur service",
"Only show entries that are billable": "Afficher uniquement les entrées qui sont facturables",
"Only show entries that are already billed": "Afficher uniquement les entrées qui sont déjà facturées",
"Retrieves additional information about the entries": "Récupère des informations supplémentaires sur les entrées",
"Reads only the specified page": "Lit seulement la page spécifiée",
"Filter customers by their active status": "Filtrer les clients par leur statut actif",
"Filter projects by their customer": "Filtrer les projets par leur client",
"The ID of the team": "L'ID de l'équipe",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"Orange": "Orange",
"Yellow": "Jaune",
"Green": "Vert",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Bleu",
"Purple": "Violet",
"Magenta": "Magenta",
"Pink": "Rose",
"German": "Allemand",
"English": "Anglais",
"French": "Français",
"Salary": "Salaire",
"Hourly wage": "Salaire horaire",
"Regular holiday": "Vacances régulières",
"Special leaves": "Feuilles spéciales",
"Reduction of overtime": "Réduction des heures supplémentaires",
"Sick day": "Jour malade",
"Sick day of a child": "Jour de maladie d'un enfant",
"School / further education": "École / formation continue",
"Maternity protection": "Protection contre la maternité",
"Home office (planned hours are applied)": "Home Office (horaires programmés sont appliqués)",
"Work out of office (planned hours are applied)": "Travail en dehors des bureaux (les heures planifiées sont appliquées)",
"Special leaves (unpaid)": "Feuilles spéciales (non payées)",
"Sick day (unpaid)": "Jour malade (non payé)",
"Sick day of child (unpaid)": "Jour malade de l'enfant (non payé)",
"Quarantine": "Quarantaine",
"Military / alternative service (only full days)": "Service militaire / alternatif (uniquement des jours entiers)",
"Sick day (sickness benefit)": "Jour de maladie (bienfaiteur)",
"Requested": "Demandé",
"Declined": "Refusé",
"Approval cancelled": "Approbation annulée",
"Request cancelled": "Demande annulée",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "TÊTE",
"New Entry": "Nouvelle entrée",
"New Absence Enquiry": "Nouvelle demande d'absence",
"Triggers when a new time entry is created": "Déclenche quand une nouvelle entrée de temps est créée",
"Triggers when a new absence enquiry is created": "Déclenche quand une nouvelle demande d'absence est créée"
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "タイムトラッキングが簡単になりました",
"E-Mail": "メール",
"API-Token": "API-Token",
"Company Name": "会社名",
"Company E-Mail": "会社のメールアドレス",
"The email of your clockodo user": "あなたのclockodoユーザーのメール",
"Your api token (can be found in profile settings)": "あなたのAPIトークンプロフィールの設定で見つけることができます",
"Your company name or app name": "会社名またはアプリ名",
"A contact email for your company or app": "会社またはアプリの連絡先メール",
"Create Entry": "エントリを作成",
"Get Entry": "エントリーを取得",
"Get Entries": "エントリーを取得",
"Update Entry": "エントリを更新",
"Delete Entry": "項目を削除",
"Create Customer": "顧客を作成",
"Get Customer": "顧客を取得",
"Update Customer": "顧客情報の更新",
"Get Customers": "顧客を獲得する",
"Delete Customer": "顧客を削除",
"Create Project": "プロジェクトを作成",
"Get Project": "プロジェクトを取得",
"Get Projects": "プロジェクトを取得",
"Update Project": "プロジェクトを更新",
"Delete Project": "プロジェクトを削除",
"Create Service": "サービスを作成",
"Get Service": "サービスを取得する",
"Update Service": "サービスを更新",
"Get Services": "サービスの取得",
"Delete Service": "サービスを削除",
"Get Team": "チームを取得",
"Get Teams": "チームを取得",
"Get User": "ユーザーを取得",
"Get Users": "Get Users",
"Create User": "ユーザーを作成",
"Update User": "ユーザーを更新",
"Delete User": "ユーザーを削除",
"Create Absence": "不在を作成",
"Get Absence": "不在になる",
"Update Absence": "不在を更新",
"Get Absences": "Absencesを入手",
"Delete Absence": "不在を削除",
"Custom API Call": "カスタムAPI通話",
"Creates an entry in clockodo": "clockodo でエントリを作成",
"Retrieves a single entry from clockodo": "clockodo から単一のエントリを取得します。",
"Fetches entries from clockodo": "clockodo から項目をフェッチします。",
"Updates an entry in clockodo": "clockodo のエントリを更新",
"Deletes an entry in clockodo": "clockodo のエントリを削除します。",
"Creates a customer in clockodo": "clockodo で顧客を作成します",
"Retrieves a single customer from clockodo": "clockodo から単一の顧客を取得します",
"Updates a customer in clockodo": "clockodo で顧客を更新する",
"Fetches customers from clockodo": "clockodo から顧客を取得します。",
"Deletes a customer in clockodo": "clockodo で顧客を削除します。",
"Creates a project in clockodo": "clockodo でプロジェクトを作成",
"Retrieves a single project from clockodo": "clockodo から単一のプロジェクトを取得します。",
"Fetches projects from clockodo": "clockodo からプロジェクトをフェッチします。",
"Updates a project in clockodo": "clockodo でプロジェクトを更新",
"Deletes a project in clockodo": "clockodo 内のプロジェクトを削除します",
"Creates a service in clockodo": "clockodo でサービスを作成します",
"Retrieves a single service from clockodo": "clockodo から単一のサービスを取得します。",
"Updates a service in clockodo": "clockodo でサービスを更新",
"Fetches services from clockodo": "clockodo からのサービスの取得",
"Deletes a service in clockodo": "clockodo でサービスを削除する",
"Retrieves a single team from clockodo": "clockodo から単一のチームを取得します。",
"Fetches teams from clockodo": "clockodo からチームをフェッチします。",
"Retrieves a single user from clockodo": "clockodo から1人のユーザーを取得します。",
"Fetches users from clockodo": "clockodo からユーザーを取得します。",
"Creates a user in clockodo": "clockodo でユーザーを作成します",
"Updates a user in clockodo": "clockodo でユーザーを更新します",
"Deletes a user in clockodo": "clockodo でユーザーを削除します。",
"Creates a absence in clockodo": "clockodo で不在を作成",
"Retrieves a single absence from clockodo": "clockodo から1つの不在を取得します。",
"Updates an absence in clockodo": "clockodo で不在を更新",
"Fetches absences from clockodo": "clockodo からの欠席をフェッチします。",
"Deletes an absence in clockodo": "clockodo 内の不在を削除",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Customer": "顧客",
"Project": "プロジェクト",
"Service": "サービス",
"Start Time": "開始時刻",
"End Time": "終了時刻",
"Description": "説明",
"Hourly Rate": "1時間あたりのレート",
"User": "ユーザー",
"Entry ID": "エントリ ID",
"Start Date": "開始日",
"End Date": "終了日",
"Customer ID Filter": "顧客IDフィルタ",
"Project ID Filter": "プロジェクト ID フィルタ",
"Service ID Filter": "サービスIDフィルタ",
"Billable": "請求可能",
"Billed": "お支払い",
"Enhanced List": "拡張リスト",
"Page": "ページ",
"Name": "Name",
"Number": "Number",
"Active": "有効",
"Note": "メモ",
"Color": "色",
"Active Filter": "有効なフィルタ",
"Budget": "予算",
"Budget in hours?": "時間内の予算?",
"Soft Budget": "ソフト予算",
"Completed": "完了",
"Billed Amount": "請求額",
"Billing Complete": "請求が完了しました",
"Team": "Team",
"Role": "ロール",
"Language": "言語",
"Wage Type": "賃金タイプ",
"Can see absences": "欠席を確認できます。",
"Can manage absences": "欠席を管理できます。",
"Can add customers": "顧客を追加できます",
"Type": "タイプ",
"Half Days": "半日前",
"Approved": "承認済み",
"Sick Note": "病気のメモ",
"Absence ID": "不在ID",
"Status": "ステータス",
"Year": "年",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"The ID of the customer": "顧客ID",
"The ID of the project": "プロジェクトの ID",
"The ID of the service": "サービスのID",
"The ID of the user": "利用者のID",
"Filter entries by their user": "ユーザーで項目をフィルター",
"Filter entries by their customer": "顧客で項目をフィルター",
"Filter entries by their project": "プロジェクトでエントリをフィルター",
"Filter entries by their service": "エントリをサービスでフィルター",
"Only show entries that are billable": "請求可能なエントリのみを表示",
"Only show entries that are already billed": "既に請求済みのエントリのみ表示",
"Retrieves additional information about the entries": "項目に関する追加情報を取得します。",
"Reads only the specified page": "指定したページのみ読み込みます。",
"Filter customers by their active status": "顧客のアクティブなステータスでフィルター",
"Filter projects by their customer": "顧客でプロジェクトをフィルター",
"The ID of the team": "チームのID",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"Orange": "オレンジ",
"Yellow": "黄色",
"Green": "緑",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "青",
"Purple": "パープル",
"Magenta": "マゼンタ",
"Pink": "ピンク",
"German": "ドイツ語",
"English": "日本語",
"French": "フランス語",
"Salary": "給料:",
"Hourly wage": "1時間あたりの賃金",
"Regular holiday": "定休日",
"Special leaves": "特別な葉",
"Reduction of overtime": "残業の削減",
"Sick day": "病気の日",
"Sick day of a child": "子供の病気の日",
"School / further education": "学校/さらなる教育",
"Maternity protection": "産科保護",
"Home office (planned hours are applied)": "在宅勤務(予定時間)",
"Work out of office (planned hours are applied)": "勤務外(予定時間が適用されます)",
"Special leaves (unpaid)": "特別葉(未払い)",
"Sick day (unpaid)": "病気の日 (未払い)",
"Sick day of child (unpaid)": "子供の病気の日 (未払い)",
"Quarantine": "<unk>",
"Military / alternative service (only full days)": "軍事/代替サービス(通常のみ)",
"Sick day (sickness benefit)": "病気の日(病気給付)",
"Requested": "要求済み",
"Declined": "辞退しました",
"Approval cancelled": "承認がキャンセルされました",
"Request cancelled": "リクエストがキャンセルされました",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Entry": "新規エントリ",
"New Absence Enquiry": "新しい不在のお問い合わせ",
"Triggers when a new time entry is created": "新しい時間エントリが作成されたときにトリガーします",
"Triggers when a new absence enquiry is created": "新しい不在問い合わせが作成されたときにトリガーします"
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "Tijdregistratie gemakkelijk gemaakt",
"E-Mail": "E-mailadres",
"API-Token": "API-Token",
"Company Name": "Bedrijfsnaam",
"Company E-Mail": "Bedrijf e-mail",
"The email of your clockodo user": "Het e-mailadres van uw clockodo gebruiker",
"Your api token (can be found in profile settings)": "Uw API token (kan gevonden worden in profielinstellingen)",
"Your company name or app name": "Uw bedrijfsnaam of appnaam",
"A contact email for your company or app": "Een contactmail voor uw bedrijf of app",
"Create Entry": "Invoer aanmaken",
"Get Entry": "Krijg Invoer",
"Get Entries": "Verkrijg items",
"Update Entry": "Invoer bijwerken",
"Delete Entry": "Vermelding verwijderen",
"Create Customer": "Klant aanmaken",
"Get Customer": "Klant ophalen",
"Update Customer": "Klant bijwerken",
"Get Customers": "Klanten ophalen",
"Delete Customer": "Klant verwijderen",
"Create Project": "Project aanmaken",
"Get Project": "Project ophalen",
"Get Projects": "Ophalen projecten",
"Update Project": "Project bijwerken",
"Delete Project": "Project verwijderen",
"Create Service": "Service aanmaken",
"Get Service": "Service krijgen",
"Update Service": "Update service",
"Get Services": "Services ophalen",
"Delete Service": "Service verwijderen",
"Get Team": "Team openen",
"Get Teams": "Teams ophalen",
"Get User": "Gebruiker ophalen",
"Get Users": "Get Users",
"Create User": "Gebruiker aanmaken",
"Update User": "Gebruiker bijwerken",
"Delete User": "Gebruiker verwijderen",
"Create Absence": "Afwezigheid maken",
"Get Absence": "Krijg Afwezigheid",
"Update Absence": "Afwezigheid bijwerken",
"Get Absences": "Krijg Afspraken",
"Delete Absence": "Afwezigheid verwijderen",
"Custom API Call": "Custom API Call",
"Creates an entry in clockodo": "Maakt een invoer in de klok",
"Retrieves a single entry from clockodo": "Haalt een enkele invoer van de clockodo op",
"Fetches entries from clockodo": "Haalt invoergegevens van de klok",
"Updates an entry in clockodo": "Werkt een item in de klok bij",
"Deletes an entry in clockodo": "Verwijdert een invoer in de klokodo",
"Creates a customer in clockodo": "Maakt een klant in de klok",
"Retrieves a single customer from clockodo": "Haal een enkele klant op van de clockodo",
"Updates a customer in clockodo": "Werkt een klant in clockodo bij",
"Fetches customers from clockodo": "Haalt klanten van de clockodo",
"Deletes a customer in clockodo": "Verwijdert een klant in de klok",
"Creates a project in clockodo": "Maakt een project in de klok",
"Retrieves a single project from clockodo": "Haalt een enkel project op van de clockodo",
"Fetches projects from clockodo": "Haalt projecten van clockodo",
"Updates a project in clockodo": "Werkt een project bij in de clockodo",
"Deletes a project in clockodo": "Verwijdert een project in de klok",
"Creates a service in clockodo": "Maakt een service in de klok",
"Retrieves a single service from clockodo": "Haalt een enkele dienst op van de clockodo",
"Updates a service in clockodo": "Werkt een service in clockodo bij",
"Fetches services from clockodo": "Haalt services van de clockodo",
"Deletes a service in clockodo": "Verwijdert een service in de clockodo",
"Retrieves a single team from clockodo": "Ophalen van één team van clockodo",
"Fetches teams from clockodo": "Haalt teams van de clockodo",
"Retrieves a single user from clockodo": "Haalt een enkele gebruiker op van de clockodo",
"Fetches users from clockodo": "Haalt gebruikers van de clockodo",
"Creates a user in clockodo": "Maakt een gebruiker aan in de klok",
"Updates a user in clockodo": "Werkt een gebruiker in clockodo bij",
"Deletes a user in clockodo": "Verwijdert een gebruiker in de klokodo",
"Creates a absence in clockodo": "Maakt een afwezigheid in de klok",
"Retrieves a single absence from clockodo": "Haalt een enkele afwezigheid van de clockodo op",
"Updates an absence in clockodo": "Werkt een afwezigheid in de klok bij",
"Fetches absences from clockodo": "Haalt de afwezigheid van de clockodo",
"Deletes an absence in clockodo": "Verwijdert een afwezigheid in de klokodo",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Customer": "Klant",
"Project": "Project",
"Service": "Diensten",
"Start Time": "Starttijd",
"End Time": "Eind Tijd",
"Description": "Beschrijving",
"Hourly Rate": "Tarief per uur",
"User": "Gebruiker",
"Entry ID": "Invoer ID",
"Start Date": "Start datum",
"End Date": "Eind datum",
"Customer ID Filter": "Filter klant-ID",
"Project ID Filter": "Project ID filter",
"Service ID Filter": "Filter service ID",
"Billable": "Factureerbaar",
"Billed": "Gefactureerd",
"Enhanced List": "Verbeterde lijst",
"Page": "Pagina",
"Name": "Naam",
"Number": "Getal",
"Active": "Actief",
"Note": "Notitie",
"Color": "Kleur",
"Active Filter": "Actieve filter",
"Budget": "Begroting",
"Budget in hours?": "Begroting in uren?",
"Soft Budget": "Soft Budget",
"Completed": "Voltooid",
"Billed Amount": "Gefactureerd bedrag",
"Billing Complete": "Facturering voltooid",
"Team": "Team",
"Role": "Functie",
"Language": "Taal",
"Wage Type": "Type salaris",
"Can see absences": "Kan afwezigheid zien",
"Can manage absences": "Kan afwegingen beheren",
"Can add customers": "Kan klanten toevoegen",
"Type": "Type",
"Half Days": "Halve dagen",
"Approved": "Goedgekeurd",
"Sick Note": "Sick Notitie",
"Absence ID": "Afwezigheid ID",
"Status": "status",
"Year": "jaar",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"The ID of the customer": "Het ID van de klant",
"The ID of the project": "Het ID van het project",
"The ID of the service": "Het ID van de dienst",
"The ID of the user": "Het ID van de gebruiker",
"Filter entries by their user": "Filter items op hun gebruiker",
"Filter entries by their customer": "Filter items op hun klant",
"Filter entries by their project": "Items filteren op hun project",
"Filter entries by their service": "Filter items op hun service",
"Only show entries that are billable": "Toon alleen factureerbare vermeldingen",
"Only show entries that are already billed": "Toon alleen vermeldingen die al gefactureerd zijn",
"Retrieves additional information about the entries": "Ophalen van extra informatie over de items",
"Reads only the specified page": "Leest alleen de opgegeven pagina",
"Filter customers by their active status": "Klanten filteren op hun actieve status",
"Filter projects by their customer": "Projecten filteren op klant",
"The ID of the team": "Het ID van het team",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"Orange": "Oranje",
"Yellow": "Geel",
"Green": "Groen",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Blauw",
"Purple": "Paars",
"Magenta": "Magenta",
"Pink": "Roze",
"German": "Duits",
"English": "Nederlands",
"French": "Frans",
"Salary": "Salaris",
"Hourly wage": "Uurloon",
"Regular holiday": "Reguliere vakantie",
"Special leaves": "Speciale bladeren",
"Reduction of overtime": "Vermindering van overuren",
"Sick day": "Zieke dag",
"Sick day of a child": "Zieke dag van een kind",
"School / further education": "School / voortgezet onderwijs",
"Maternity protection": "Moederschap bescherming",
"Home office (planned hours are applied)": "Huiskantoor (geplande uren worden toegepast)",
"Work out of office (planned hours are applied)": "Werk zonder werktijd (geplande uren worden toegepast)",
"Special leaves (unpaid)": "Speciale bladeren (onbetaald)",
"Sick day (unpaid)": "Zieke dag (onbetaald)",
"Sick day of child (unpaid)": "Zieke kinderdag (onbetaald)",
"Quarantine": "Quarantaine",
"Military / alternative service (only full days)": "Militaire / alternatieve service (alleen volledige dagen)",
"Sick day (sickness benefit)": "Zieke dag (ziekte-voordeel)",
"Requested": "Aangevraagd",
"Declined": "Geweigerd",
"Approval cancelled": "Goedkeuring geannuleerd",
"Request cancelled": "Verzoek geannuleerd",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Entry": "Nieuwe vermelding",
"New Absence Enquiry": "Nieuwe Afwezigheid Aanvraag",
"Triggers when a new time entry is created": "Triggert wanneer een nieuwe tijdvermelding wordt aangemaakt",
"Triggers when a new absence enquiry is created": "Triggert wanneer een nieuwe afwezigheid vraag wordt aangemaakt"
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "Rastreamento de tempo facilitado",
"E-Mail": "E-mail",
"API-Token": "API-Token",
"Company Name": "Nome da Empresa",
"Company E-Mail": "E-mail da Empresa",
"The email of your clockodo user": "O e-mail do seu usuário do clockodo",
"Your api token (can be found in profile settings)": "Seu token de API (pode ser encontrado nas configurações de perfil)",
"Your company name or app name": "Nome da sua empresa ou nome do app",
"A contact email for your company or app": "Um e-mail de contato para sua empresa ou aplicativo",
"Create Entry": "Criar Entrada",
"Get Entry": "Obter Entrada",
"Get Entries": "Obter Entradas",
"Update Entry": "Atualizar Entrada",
"Delete Entry": "Excluir registro",
"Create Customer": "Criar Cliente",
"Get Customer": "Obter Cliente",
"Update Customer": "Atualizar Cliente",
"Get Customers": "Obter Clientes",
"Delete Customer": "Excluir Cliente",
"Create Project": "Criar Projeto",
"Get Project": "Obter Projeto",
"Get Projects": "Obter projetos",
"Update Project": "Atualizar Projeto",
"Delete Project": "Excluir Projeto",
"Create Service": "Criar Serviço",
"Get Service": "Obter Serviço",
"Update Service": "Serviço de atualização",
"Get Services": "Obter Serviços",
"Delete Service": "Excluir Serviço",
"Get Team": "Obter Time",
"Get Teams": "Obtenha Times",
"Get User": "Obter Usuário",
"Get Users": "Get Users",
"Create User": "Criar Usuário",
"Update User": "Atualizar usuário",
"Delete User": "Excluir Usuário",
"Create Absence": "Criar Ausência",
"Get Absence": "Obter Ausência",
"Update Absence": "Atualizar Ausência",
"Get Absences": "Obter Abdominais",
"Delete Absence": "Excluir Ausência",
"Custom API Call": "Chamada de API personalizada",
"Creates an entry in clockodo": "Cria uma entrada no clockodo",
"Retrieves a single entry from clockodo": "Recupera uma entrada única do clockodo",
"Fetches entries from clockodo": "Obtém entradas do clockodo",
"Updates an entry in clockodo": "Atualiza uma entrada no clockodo",
"Deletes an entry in clockodo": "Exclui uma entrada no clockodo",
"Creates a customer in clockodo": "Cria um cliente no relógio",
"Retrieves a single customer from clockodo": "Recupera um único cliente do clockodo",
"Updates a customer in clockodo": "Atualiza um cliente no relógio",
"Fetches customers from clockodo": "Recupera os clientes do clockodo",
"Deletes a customer in clockodo": "Deleta um cliente no relógio",
"Creates a project in clockodo": "Cria um projeto no clockodo",
"Retrieves a single project from clockodo": "Recupera um único projeto do clockodo",
"Fetches projects from clockodo": "Recupera projetos do clockodo",
"Updates a project in clockodo": "Atualiza um projeto no clockodo",
"Deletes a project in clockodo": "Exclui um projeto no clockodo",
"Creates a service in clockodo": "Cria um serviço no clockodo",
"Retrieves a single service from clockodo": "Recupera um único serviço do clockodo",
"Updates a service in clockodo": "Atualiza um serviço no clockodo",
"Fetches services from clockodo": "Recupera os serviços do clockodo",
"Deletes a service in clockodo": "Exclui um serviço no clockodo",
"Retrieves a single team from clockodo": "Recupera um único time do relógio",
"Fetches teams from clockodo": "Recupera as equipes do relógio",
"Retrieves a single user from clockodo": "Recupera um único usuário do clockodo",
"Fetches users from clockodo": "Obtém os usuários do clockodo",
"Creates a user in clockodo": "Cria um usuário no clockodo",
"Updates a user in clockodo": "Atualiza um usuário no clockodo",
"Deletes a user in clockodo": "Exclui um usuário no clockodo",
"Creates a absence in clockodo": "Cria uma ausência no clockodo",
"Retrieves a single absence from clockodo": "Recupera uma única ausência do relógio",
"Updates an absence in clockodo": "Atualiza a ausência no clockodo",
"Fetches absences from clockodo": "Recupera a ausência do relógio",
"Deletes an absence in clockodo": "Exclui a ausência no relógio",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Customer": "Cliente",
"Project": "Projecto",
"Service": "Serviço",
"Start Time": "Hora de início",
"End Time": "Hora de término",
"Description": "Descrição",
"Hourly Rate": "Preço por hora",
"User": "Usuário",
"Entry ID": "ID da postagem",
"Start Date": "Data Inicial",
"End Date": "Data de Término",
"Customer ID Filter": "Filtro de ID de Cliente",
"Project ID Filter": "Filtro ID do projeto",
"Service ID Filter": "Filtro de Service ID",
"Billable": "Faturável",
"Billed": "Faturado",
"Enhanced List": "Lista aprimorada",
"Page": "Página",
"Name": "Nome",
"Number": "Número",
"Active": "Ativo",
"Note": "Observação",
"Color": "Cor",
"Active Filter": "Filtro ativo",
"Budget": "Orçamento",
"Budget in hours?": "Orçamento em horas?",
"Soft Budget": "Orçamento Suave",
"Completed": "Concluído",
"Billed Amount": "Valor Faturado",
"Billing Complete": "Faturamento completo",
"Team": "Equipe",
"Role": "Funções",
"Language": "IDIOMA",
"Wage Type": "Tipo de salário",
"Can see absences": "Pode ver ausências",
"Can manage absences": "Pode gerenciar as ausências",
"Can add customers": "Pode adicionar clientes",
"Type": "tipo",
"Half Days": "Metade dos dias",
"Approved": "Aceito",
"Sick Note": "Nota doente",
"Absence ID": "ID de Ausência",
"Status": "Estado",
"Year": "ano",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"The ID of the customer": "O ID do cliente",
"The ID of the project": "O ID do projeto",
"The ID of the service": "O ID do serviço",
"The ID of the user": "A ID do usuário",
"Filter entries by their user": "Filtrar entradas por seu usuário",
"Filter entries by their customer": "Filtrar entradas por seus clientes",
"Filter entries by their project": "Filtrar entradas por seu projeto",
"Filter entries by their service": "Filtrar entradas por serviço",
"Only show entries that are billable": "Apenas mostrar entradas facturáveis",
"Only show entries that are already billed": "Mostrar apenas as entradas que já são cobradas",
"Retrieves additional information about the entries": "Obtém informações adicionais sobre os lançamentos",
"Reads only the specified page": "Lê somente a página especificada",
"Filter customers by their active status": "Filtrar clientes pelo seu status ativo",
"Filter projects by their customer": "Filtrar projetos por seus clientes",
"The ID of the team": "O ID da equipe",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"Orange": "Laranja",
"Yellow": "Amarelo",
"Green": "Verde",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "azul",
"Purple": "Roxo",
"Magenta": "Magenta",
"Pink": "Rosa",
"German": "alemão",
"English": "Portuguese-Brazil",
"French": "francês",
"Salary": "Salário",
"Hourly wage": "Salário horário",
"Regular holiday": "Feriado regular",
"Special leaves": "Folhas especiais",
"Reduction of overtime": "Redução de horas extras",
"Sick day": "Dia doente",
"Sick day of a child": "Dia doente de uma criança",
"School / further education": "Ensino / Ensino Superior",
"Maternity protection": "Proteção de maternidade",
"Home office (planned hours are applied)": "Home office (horas planejadas são aplicadas)",
"Work out of office (planned hours are applied)": "Trabalho fora de escritório (horas planejadas são aplicadas)",
"Special leaves (unpaid)": "Folhas especiais (não pagas)",
"Sick day (unpaid)": "Dia doente (não pago)",
"Sick day of child (unpaid)": "Dia doente de criança (não pago)",
"Quarantine": "Quarentena",
"Military / alternative service (only full days)": "Serviço militar / alternativo (apenas dias inteiros)",
"Sick day (sickness benefit)": "Dia doente (benefício com doença)",
"Requested": "Solicitado",
"Declined": "Recusado",
"Approval cancelled": "Aprovação cancelada",
"Request cancelled": "Pedido cancelado",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Entry": "Nova entrada",
"New Absence Enquiry": "Nova dúvida de Absência",
"Triggers when a new time entry is created": "Dispara quando uma nova entrada é criada",
"Triggers when a new absence enquiry is created": "Dispara quando um novo pedido de ausência for criado"
}

View File

@@ -0,0 +1,187 @@
{
"Clockodo": "Чеккодо",
"Time tracking made easy": "Простое отслеживание времени",
"E-Mail": "Электронная почта",
"API-Token": "API-Token",
"Company Name": "Название компании",
"Company E-Mail": "Электронная почта компании",
"The email of your clockodo user": "Email пользователя clockodo",
"Your api token (can be found in profile settings)": "Ваш токен api (можно найти в настройках профиля)",
"Your company name or app name": "Название вашей компании или приложения",
"A contact email for your company or app": "Контактный адрес электронной почты для вашей компании или приложения",
"Create Entry": "Создать запись",
"Get Entry": "Получить запись",
"Get Entries": "Получить записи",
"Update Entry": "Обновить запись",
"Delete Entry": "Удалить запись",
"Create Customer": "Создать клиента",
"Get Customer": "Получить клиента",
"Update Customer": "Обновить клиента",
"Get Customers": "Получить клиентов",
"Delete Customer": "Удалить клиента",
"Create Project": "Создать проект",
"Get Project": "Получить проект",
"Get Projects": "Получить проекты",
"Update Project": "Обновить проект",
"Delete Project": "Удалить проект",
"Create Service": "Создать сервис",
"Get Service": "Получить услугу",
"Update Service": "Сервис обновления",
"Get Services": "Получить услуги",
"Delete Service": "Удалить сервис",
"Get Team": "Получить команду",
"Get Teams": "Получить команды",
"Get User": "Получить пользователя",
"Get Users": "Get Users",
"Create User": "Создать пользователя",
"Update User": "Изменить пользователя",
"Delete User": "Удалить пользователя",
"Create Absence": "Создать отсутствие",
"Get Absence": "Получить отсутствие",
"Update Absence": "Обновить отсутствие",
"Get Absences": "Получить Absences",
"Delete Absence": "Удалить отсутствие",
"Custom API Call": "Пользовательский вызов API",
"Creates an entry in clockodo": "Создает запись в clockodo",
"Retrieves a single entry from clockodo": "Извлекает одну запись из clockodo",
"Fetches entries from clockodo": "Извлекает записи из clockodo",
"Updates an entry in clockodo": "Обновляет запись в clockodo",
"Deletes an entry in clockodo": "Удаляет запись в clockodo",
"Creates a customer in clockodo": "Создает клиента в clockodo",
"Retrieves a single customer from clockodo": "Возвращает одного клиента из clockodo",
"Updates a customer in clockodo": "Обновляет клиента в clockodo",
"Fetches customers from clockodo": "Извлекает клиентов из clockodo",
"Deletes a customer in clockodo": "Удаляет клиента в clockodo",
"Creates a project in clockodo": "Создает проект в clockodo",
"Retrieves a single project from clockodo": "Возвращает один проект из clockodo",
"Fetches projects from clockodo": "Получает проекты из clockodo",
"Updates a project in clockodo": "Обновляет проект в clockodo",
"Deletes a project in clockodo": "Удаляет проект в clockodo",
"Creates a service in clockodo": "Создает сервис в clockodo",
"Retrieves a single service from clockodo": "Получает один сервис от clockodo",
"Updates a service in clockodo": "Обновляет сервис в clockodo",
"Fetches services from clockodo": "Извлекает сервисы из clockodo",
"Deletes a service in clockodo": "Удаляет сервис в clockodo",
"Retrieves a single team from clockodo": "Получает одну команду из clockodo",
"Fetches teams from clockodo": "Извлекает команды из clockodo",
"Retrieves a single user from clockodo": "Извлекает одного пользователя из clockodo",
"Fetches users from clockodo": "Извлекает пользователей из clockodo",
"Creates a user in clockodo": "Создает пользователя в clockodo",
"Updates a user in clockodo": "Обновляет пользователя в clockodo",
"Deletes a user in clockodo": "Удаляет пользователя в clockodo",
"Creates a absence in clockodo": "Создает отсутствие в clockodo",
"Retrieves a single absence from clockodo": "Получает одиночное отсутствие из clockodo",
"Updates an absence in clockodo": "Обновляет отсутствие в clockodo",
"Fetches absences from clockodo": "Получает отсутствие от clockodo",
"Deletes an absence in clockodo": "Удаляет отсутствие в clockodo",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Customer": "Покупатель",
"Project": "Проект",
"Service": "Сервис",
"Start Time": "Время начала",
"End Time": "Конец времени",
"Description": "Description",
"Hourly Rate": "Почасовая ставка",
"User": "Пользователь",
"Entry ID": "ID записи",
"Start Date": "Дата начала",
"End Date": "Дата окончания",
"Customer ID Filter": "Фильтр ID клиента",
"Project ID Filter": "Фильтр ID проекта",
"Service ID Filter": "Фильтр ID службы",
"Billable": "Оплачиваемый",
"Billed": "Оплачено",
"Enhanced List": "Расширенный список",
"Page": "Страница",
"Name": "Наименование",
"Number": "Номер",
"Active": "Активен",
"Note": "Примечание",
"Color": "Цвет",
"Active Filter": "Активный фильтр",
"Budget": "Бюджет",
"Budget in hours?": "Бюджет в часах?",
"Soft Budget": "Мягкий бюджет",
"Completed": "Выполнено",
"Billed Amount": "Оплаченная сумма",
"Billing Complete": "Платеж завершен",
"Team": "Команда",
"Role": "Роль",
"Language": "Язык",
"Wage Type": "Тип заработной платы",
"Can see absences": "Может видеть отсутствие",
"Can manage absences": "Управление отсутствиями",
"Can add customers": "Может добавлять клиентов",
"Type": "Тип",
"Half Days": "Пол дней",
"Approved": "Одобрено",
"Sick Note": "Локтевая заметка",
"Absence ID": "Отсутствие ID",
"Status": "Status",
"Year": "Год",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"The ID of the customer": "ID клиента",
"The ID of the project": "ID проекта",
"The ID of the service": "ID сервиса",
"The ID of the user": "ID пользователя",
"Filter entries by their user": "Фильтровать записи по их пользователю",
"Filter entries by their customer": "Фильтровать записи по клиенту",
"Filter entries by their project": "Фильтровать записи по их проекту",
"Filter entries by their service": "Фильтровать записи по их сервису",
"Only show entries that are billable": "Показывать только записи, которые можно оплатить",
"Only show entries that are already billed": "Показывать только записи, которые уже оплачены",
"Retrieves additional information about the entries": "Получает дополнительную информацию о записях",
"Reads only the specified page": "Читает только указанную страницу",
"Filter customers by their active status": "Фильтровать клиентов по их активному статусу",
"Filter projects by their customer": "Фильтровать проекты по клиенту",
"The ID of the team": "ID команды",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"Orange": "Оранжевый",
"Yellow": "Жёлтый",
"Green": "Зелёный",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Синий",
"Purple": "Фиолетовый",
"Magenta": "Пурпурный",
"Pink": "Розовый",
"German": "Немецкий",
"English": "Russian",
"French": "Французский",
"Salary": "Зарплата",
"Hourly wage": "Почасовая заработная плата",
"Regular holiday": "Регулярный отпуск",
"Special leaves": "Специальные листья",
"Reduction of overtime": "Снижение сверхурочной работы",
"Sick day": "Тяжелый день",
"Sick day of a child": "Серьезный день ребенка",
"School / further education": "Школа / дальнейшее образование",
"Maternity protection": "Охрана материнства",
"Home office (planned hours are applied)": "Домашний офис (запланированные часы)",
"Work out of office (planned hours are applied)": "Работы вне офиса (запланированные часы)",
"Special leaves (unpaid)": "Специальные листья (неоплаченные)",
"Sick day (unpaid)": "Болезный день (неоплаченный)",
"Sick day of child (unpaid)": "Больной день ребенка (неоплаченный)",
"Quarantine": "Карантин",
"Military / alternative service (only full days)": "Военная / альтернативная служба (только полные дни)",
"Sick day (sickness benefit)": "День болезни (пособие по болезни)",
"Requested": "Запрошено",
"Declined": "Отклонено",
"Approval cancelled": "Утверждение отменено",
"Request cancelled": "Запрос отменен",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Entry": "Новая запись",
"New Absence Enquiry": "Новый запрос об отсутствии",
"Triggers when a new time entry is created": "Триггеры при создании новой записи времени",
"Triggers when a new absence enquiry is created": "Запускает при создании нового запроса об отсутствии"
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "Time tracking made easy",
"E-Mail": "E-Mail",
"API-Token": "API-Token",
"Company Name": "Company Name",
"Company E-Mail": "Company E-Mail",
"The email of your clockodo user": "The email of your clockodo user",
"Your api token (can be found in profile settings)": "Your api token (can be found in profile settings)",
"Your company name or app name": "Your company name or app name",
"A contact email for your company or app": "A contact email for your company or app",
"Create Entry": "Create Entry",
"Get Entry": "Get Entry",
"Get Entries": "Get Entries",
"Update Entry": "Update Entry",
"Delete Entry": "Delete Entry",
"Create Customer": "Create Customer",
"Get Customer": "Get Customer",
"Update Customer": "Update Customer",
"Get Customers": "Get Customers",
"Delete Customer": "Delete Customer",
"Create Project": "Create Project",
"Get Project": "Get Project",
"Get Projects": "Get Projects",
"Update Project": "Update Project",
"Delete Project": "Delete Project",
"Create Service": "Create Service",
"Get Service": "Get Service",
"Update Service": "Update Service",
"Get Services": "Get Services",
"Delete Service": "Delete Service",
"Get Team": "Get Team",
"Get Teams": "Get Teams",
"Get User": "Get User",
"Get Users": "Get Users",
"Create User": "Create User",
"Update User": "Update User",
"Delete User": "Delete User",
"Create Absence": "Create Absence",
"Get Absence": "Get Absence",
"Update Absence": "Update Absence",
"Get Absences": "Get Absences",
"Delete Absence": "Delete Absence",
"Custom API Call": "Custom API Call",
"Creates an entry in clockodo": "Creates an entry in clockodo",
"Retrieves a single entry from clockodo": "Retrieves a single entry from clockodo",
"Fetches entries from clockodo": "Fetches entries from clockodo",
"Updates an entry in clockodo": "Updates an entry in clockodo",
"Deletes an entry in clockodo": "Deletes an entry in clockodo",
"Creates a customer in clockodo": "Creates a customer in clockodo",
"Retrieves a single customer from clockodo": "Retrieves a single customer from clockodo",
"Updates a customer in clockodo": "Updates a customer in clockodo",
"Fetches customers from clockodo": "Fetches customers from clockodo",
"Deletes a customer in clockodo": "Deletes a customer in clockodo",
"Creates a project in clockodo": "Creates a project in clockodo",
"Retrieves a single project from clockodo": "Retrieves a single project from clockodo",
"Fetches projects from clockodo": "Fetches projects from clockodo",
"Updates a project in clockodo": "Updates a project in clockodo",
"Deletes a project in clockodo": "Deletes a project in clockodo",
"Creates a service in clockodo": "Creates a service in clockodo",
"Retrieves a single service from clockodo": "Retrieves a single service from clockodo",
"Updates a service in clockodo": "Updates a service in clockodo",
"Fetches services from clockodo": "Fetches services from clockodo",
"Deletes a service in clockodo": "Deletes a service in clockodo",
"Retrieves a single team from clockodo": "Retrieves a single team from clockodo",
"Fetches teams from clockodo": "Fetches teams from clockodo",
"Retrieves a single user from clockodo": "Retrieves a single user from clockodo",
"Fetches users from clockodo": "Fetches users from clockodo",
"Creates a user in clockodo": "Creates a user in clockodo",
"Updates a user in clockodo": "Updates a user in clockodo",
"Deletes a user in clockodo": "Deletes a user in clockodo",
"Creates a absence in clockodo": "Creates a absence in clockodo",
"Retrieves a single absence from clockodo": "Retrieves a single absence from clockodo",
"Updates an absence in clockodo": "Updates an absence in clockodo",
"Fetches absences from clockodo": "Fetches absences from clockodo",
"Deletes an absence in clockodo": "Deletes an absence in clockodo",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Customer": "Customer",
"Project": "Project",
"Service": "Service",
"Start Time": "Start Time",
"End Time": "End Time",
"Description": "Description",
"Hourly Rate": "Hourly Rate",
"User": "User",
"Entry ID": "Entry ID",
"Start Date": "Start Date",
"End Date": "End Date",
"Customer ID Filter": "Customer ID Filter",
"Project ID Filter": "Project ID Filter",
"Service ID Filter": "Service ID Filter",
"Billable": "Billable",
"Billed": "Billed",
"Enhanced List": "Enhanced List",
"Page": "Page",
"Name": "Name",
"Number": "Number",
"Active": "Active",
"Note": "Note",
"Color": "Color",
"Active Filter": "Active Filter",
"Budget": "Budget",
"Budget in hours?": "Budget in hours?",
"Soft Budget": "Soft Budget",
"Completed": "Completed",
"Billed Amount": "Billed Amount",
"Billing Complete": "Billing Complete",
"Team": "Team",
"Role": "Role",
"Language": "Language",
"Wage Type": "Wage Type",
"Can see absences": "Can see absences",
"Can manage absences": "Can manage absences",
"Can add customers": "Can add customers",
"Type": "Type",
"Half Days": "Half Days",
"Approved": "Approved",
"Sick Note": "Sick Note",
"Absence ID": "Absence ID",
"Status": "Status",
"Year": "Year",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The ID of the customer": "The ID of the customer",
"The ID of the project": "The ID of the project",
"The ID of the service": "The ID of the service",
"The ID of the user": "The ID of the user",
"Filter entries by their user": "Filter entries by their user",
"Filter entries by their customer": "Filter entries by their customer",
"Filter entries by their project": "Filter entries by their project",
"Filter entries by their service": "Filter entries by their service",
"Only show entries that are billable": "Only show entries that are billable",
"Only show entries that are already billed": "Only show entries that are already billed",
"Retrieves additional information about the entries": "Retrieves additional information about the entries",
"Reads only the specified page": "Reads only the specified page",
"Filter customers by their active status": "Filter customers by their active status",
"Filter projects by their customer": "Filter projects by their customer",
"The ID of the team": "The ID of the team",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Orange": "Orange",
"Yellow": "Yellow",
"Green": "Green",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Blue",
"Purple": "Purple",
"Magenta": "Magenta",
"Pink": "Pink",
"German": "German",
"English": "English",
"French": "French",
"Salary": "Salary",
"Hourly wage": "Hourly wage",
"Regular holiday": "Regular holiday",
"Special leaves": "Special leaves",
"Reduction of overtime": "Reduction of overtime",
"Sick day": "Sick day",
"Sick day of a child": "Sick day of a child",
"School / further education": "School / further education",
"Maternity protection": "Maternity protection",
"Home office (planned hours are applied)": "Home office (planned hours are applied)",
"Work out of office (planned hours are applied)": "Work out of office (planned hours are applied)",
"Special leaves (unpaid)": "Special leaves (unpaid)",
"Sick day (unpaid)": "Sick day (unpaid)",
"Sick day of child (unpaid)": "Sick day of child (unpaid)",
"Quarantine": "Quarantine",
"Military / alternative service (only full days)": "Military / alternative service (only full days)",
"Sick day (sickness benefit)": "Sick day (sickness benefit)",
"Requested": "Requested",
"Declined": "Declined",
"Approval cancelled": "Approval cancelled",
"Request cancelled": "Request cancelled",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Entry": "New Entry",
"New Absence Enquiry": "New Absence Enquiry",
"Triggers when a new time entry is created": "Triggers when a new time entry is created",
"Triggers when a new absence enquiry is created": "Triggers when a new absence enquiry is created"
}

View File

@@ -0,0 +1,187 @@
{
"Clockodo": "Clockodo",
"Time tracking made easy": "Time tracking made easy",
"E-Mail": "E-Mail",
"API-Token": "API-Token",
"Company Name": "Tên công ty",
"Company E-Mail": "Company E-Mail",
"The email of your clockodo user": "The email of your clockodo user",
"Your api token (can be found in profile settings)": "Your api token (can be found in profile settings)",
"Your company name or app name": "Your company name or app name",
"A contact email for your company or app": "A contact email for your company or app",
"Create Entry": "Create Entry",
"Get Entry": "Get Entry",
"Get Entries": "Get Entries",
"Update Entry": "Update Entry",
"Delete Entry": "Delete Entry",
"Create Customer": "Create Customer",
"Get Customer": "Get Customer",
"Update Customer": "Update Customer",
"Get Customers": "Get Customers",
"Delete Customer": "Delete Customer",
"Create Project": "Create Project",
"Get Project": "Get Project",
"Get Projects": "Get Projects",
"Update Project": "Update Project",
"Delete Project": "Delete Project",
"Create Service": "Create Service",
"Get Service": "Get Service",
"Update Service": "Update Service",
"Get Services": "Get Services",
"Delete Service": "Delete Service",
"Get Team": "Get Team",
"Get Teams": "Get Teams",
"Get User": "Get User",
"Get Users": "Get Users",
"Create User": "Create User",
"Update User": "Update User",
"Delete User": "Delete User",
"Create Absence": "Create Absence",
"Get Absence": "Get Absence",
"Update Absence": "Update Absence",
"Get Absences": "Get Absences",
"Delete Absence": "Delete Absence",
"Custom API Call": "Custom API Call",
"Creates an entry in clockodo": "Creates an entry in clockodo",
"Retrieves a single entry from clockodo": "Retrieves a single entry from clockodo",
"Fetches entries from clockodo": "Fetches entries from clockodo",
"Updates an entry in clockodo": "Updates an entry in clockodo",
"Deletes an entry in clockodo": "Deletes an entry in clockodo",
"Creates a customer in clockodo": "Creates a customer in clockodo",
"Retrieves a single customer from clockodo": "Retrieves a single customer from clockodo",
"Updates a customer in clockodo": "Updates a customer in clockodo",
"Fetches customers from clockodo": "Fetches customers from clockodo",
"Deletes a customer in clockodo": "Deletes a customer in clockodo",
"Creates a project in clockodo": "Creates a project in clockodo",
"Retrieves a single project from clockodo": "Retrieves a single project from clockodo",
"Fetches projects from clockodo": "Fetches projects from clockodo",
"Updates a project in clockodo": "Updates a project in clockodo",
"Deletes a project in clockodo": "Deletes a project in clockodo",
"Creates a service in clockodo": "Creates a service in clockodo",
"Retrieves a single service from clockodo": "Retrieves a single service from clockodo",
"Updates a service in clockodo": "Updates a service in clockodo",
"Fetches services from clockodo": "Fetches services from clockodo",
"Deletes a service in clockodo": "Deletes a service in clockodo",
"Retrieves a single team from clockodo": "Retrieves a single team from clockodo",
"Fetches teams from clockodo": "Fetches teams from clockodo",
"Retrieves a single user from clockodo": "Retrieves a single user from clockodo",
"Fetches users from clockodo": "Fetches users from clockodo",
"Creates a user in clockodo": "Creates a user in clockodo",
"Updates a user in clockodo": "Updates a user in clockodo",
"Deletes a user in clockodo": "Deletes a user in clockodo",
"Creates a absence in clockodo": "Creates a absence in clockodo",
"Retrieves a single absence from clockodo": "Retrieves a single absence from clockodo",
"Updates an absence in clockodo": "Updates an absence in clockodo",
"Fetches absences from clockodo": "Fetches absences from clockodo",
"Deletes an absence in clockodo": "Deletes an absence in clockodo",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Customer": "Customer",
"Project": "Project",
"Service": "Service",
"Start Time": "Start Time",
"End Time": "End Time",
"Description": "Description",
"Hourly Rate": "Hourly Rate",
"User": "User",
"Entry ID": "Entry ID",
"Start Date": "Start Date",
"End Date": "End Date",
"Customer ID Filter": "Customer ID Filter",
"Project ID Filter": "Project ID Filter",
"Service ID Filter": "Service ID Filter",
"Billable": "Billable",
"Billed": "Billed",
"Enhanced List": "Enhanced List",
"Page": "Page",
"Name": "Name",
"Number": "Number",
"Active": "Tích cực",
"Note": "Note",
"Color": "Color",
"Active Filter": "Active Filter",
"Budget": "Budget",
"Budget in hours?": "Budget in hours?",
"Soft Budget": "Soft Budget",
"Completed": "Completed",
"Billed Amount": "Billed Amount",
"Billing Complete": "Billing Complete",
"Team": "Team",
"Role": "Vai trò",
"Language": "Language",
"Wage Type": "Wage Type",
"Can see absences": "Can see absences",
"Can manage absences": "Can manage absences",
"Can add customers": "Can add customers",
"Type": "Type",
"Half Days": "Half Days",
"Approved": "Approved",
"Sick Note": "Sick Note",
"Absence ID": "Absence ID",
"Status": "Status",
"Year": "Year",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The ID of the customer": "The ID of the customer",
"The ID of the project": "The ID of the project",
"The ID of the service": "The ID of the service",
"The ID of the user": "The ID of the user",
"Filter entries by their user": "Filter entries by their user",
"Filter entries by their customer": "Filter entries by their customer",
"Filter entries by their project": "Filter entries by their project",
"Filter entries by their service": "Filter entries by their service",
"Only show entries that are billable": "Only show entries that are billable",
"Only show entries that are already billed": "Only show entries that are already billed",
"Retrieves additional information about the entries": "Retrieves additional information about the entries",
"Reads only the specified page": "Reads only the specified page",
"Filter customers by their active status": "Filter customers by their active status",
"Filter projects by their customer": "Filter projects by their customer",
"The ID of the team": "The ID of the team",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Orange": "Orange",
"Yellow": "Yellow",
"Green": "Green",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Blue",
"Purple": "Purple",
"Magenta": "Magenta",
"Pink": "Pink",
"German": "German",
"English": "English",
"French": "French",
"Salary": "Salary",
"Hourly wage": "Hourly wage",
"Regular holiday": "Regular holiday",
"Special leaves": "Special leaves",
"Reduction of overtime": "Reduction of overtime",
"Sick day": "Sick day",
"Sick day of a child": "Sick day of a child",
"School / further education": "School / further education",
"Maternity protection": "Maternity protection",
"Home office (planned hours are applied)": "Home office (planned hours are applied)",
"Work out of office (planned hours are applied)": "Work out of office (planned hours are applied)",
"Special leaves (unpaid)": "Special leaves (unpaid)",
"Sick day (unpaid)": "Sick day (unpaid)",
"Sick day of child (unpaid)": "Sick day of child (unpaid)",
"Quarantine": "Quarantine",
"Military / alternative service (only full days)": "Military / alternative service (only full days)",
"Sick day (sickness benefit)": "Sick day (sickness benefit)",
"Requested": "Requested",
"Declined": "Declined",
"Approval cancelled": "Approval cancelled",
"Request cancelled": "Request cancelled",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Entry": "New Entry",
"New Absence Enquiry": "New Absence Enquiry",
"Triggers when a new time entry is created": "Triggers when a new time entry is created",
"Triggers when a new absence enquiry is created": "Triggers when a new absence enquiry is created"
}

View File

@@ -0,0 +1,188 @@
{
"Time tracking made easy": "Time tracking made easy",
"E-Mail": "E-Mail",
"API-Token": "API-Token",
"Company Name": "Company Name",
"Company E-Mail": "Company E-Mail",
"The email of your clockodo user": "The email of your clockodo user",
"Your api token (can be found in profile settings)": "Your api token (can be found in profile settings)",
"Your company name or app name": "Your company name or app name",
"A contact email for your company or app": "A contact email for your company or app",
"Create Entry": "Create Entry",
"Get Entry": "Get Entry",
"Get Entries": "Get Entries",
"Update Entry": "Update Entry",
"Delete Entry": "Delete Entry",
"Create Customer": "Create Customer",
"Get Customer": "Get Customer",
"Update Customer": "Update Customer",
"Get Customers": "Get Customers",
"Delete Customer": "Delete Customer",
"Create Project": "Create Project",
"Get Project": "Get Project",
"Get Projects": "Get Projects",
"Update Project": "Update Project",
"Delete Project": "Delete Project",
"Create Service": "Create Service",
"Get Service": "Get Service",
"Update Service": "Update Service",
"Get Services": "Get Services",
"Delete Service": "Delete Service",
"Get Team": "Get Team",
"Get Teams": "Get Teams",
"Get User": "Get User",
"Get Users": "Get Users",
"Create User": "Create User",
"Update User": "Update User",
"Delete User": "删除用户",
"Create Absence": "Create Absence",
"Get Absence": "Get Absence",
"Update Absence": "Update Absence",
"Get Absences": "Get Absences",
"Delete Absence": "Delete Absence",
"Custom API Call": "自定义 API 呼叫",
"Creates an entry in clockodo": "Creates an entry in clockodo",
"Retrieves a single entry from clockodo": "Retrieves a single entry from clockodo",
"Fetches entries from clockodo": "Fetches entries from clockodo",
"Updates an entry in clockodo": "Updates an entry in clockodo",
"Deletes an entry in clockodo": "Deletes an entry in clockodo",
"Creates a customer in clockodo": "Creates a customer in clockodo",
"Retrieves a single customer from clockodo": "Retrieves a single customer from clockodo",
"Updates a customer in clockodo": "Updates a customer in clockodo",
"Fetches customers from clockodo": "Fetches customers from clockodo",
"Deletes a customer in clockodo": "Deletes a customer in clockodo",
"Creates a project in clockodo": "Creates a project in clockodo",
"Retrieves a single project from clockodo": "Retrieves a single project from clockodo",
"Fetches projects from clockodo": "Fetches projects from clockodo",
"Updates a project in clockodo": "Updates a project in clockodo",
"Deletes a project in clockodo": "Deletes a project in clockodo",
"Creates a service in clockodo": "Creates a service in clockodo",
"Retrieves a single service from clockodo": "Retrieves a single service from clockodo",
"Updates a service in clockodo": "Updates a service in clockodo",
"Fetches services from clockodo": "Fetches services from clockodo",
"Deletes a service in clockodo": "Deletes a service in clockodo",
"Retrieves a single team from clockodo": "Retrieves a single team from clockodo",
"Fetches teams from clockodo": "Fetches teams from clockodo",
"Retrieves a single user from clockodo": "Retrieves a single user from clockodo",
"Fetches users from clockodo": "Fetches users from clockodo",
"Creates a user in clockodo": "Creates a user in clockodo",
"Updates a user in clockodo": "Updates a user in clockodo",
"Deletes a user in clockodo": "Deletes a user in clockodo",
"Creates a absence in clockodo": "Creates a absence in clockodo",
"Retrieves a single absence from clockodo": "Retrieves a single absence from clockodo",
"Updates an absence in clockodo": "Updates an absence in clockodo",
"Fetches absences from clockodo": "Fetches absences from clockodo",
"Deletes an absence in clockodo": "Deletes an absence in clockodo",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Customer": "Customer",
"Project": "项目",
"Service": "Service",
"Start Time": "开始时间",
"End Time": "End Time",
"Description": "描述",
"Hourly Rate": "Hourly Rate",
"User": "用户",
"Entry ID": "Entry ID",
"Start Date": "Start Date",
"End Date": "End Date",
"Customer ID Filter": "Customer ID Filter",
"Project ID Filter": "Project ID Filter",
"Service ID Filter": "Service ID Filter",
"Billable": "Billable",
"Billed": "Billed",
"Enhanced List": "Enhanced List",
"Page": "Page",
"Name": "名称",
"Number": "号码",
"Active": "使用中",
"Note": "说明",
"Color": "Color",
"Active Filter": "Active Filter",
"Budget": "Budget",
"Budget in hours?": "Budget in hours?",
"Soft Budget": "Soft Budget",
"Completed": "Completed",
"Billed Amount": "Billed Amount",
"Billing Complete": "Billing Complete",
"Team": "团队",
"Role": "作用",
"Language": "Language",
"Wage Type": "Wage Type",
"Can see absences": "Can see absences",
"Can manage absences": "Can manage absences",
"Can add customers": "Can add customers",
"Type": "类型",
"Half Days": "Half Days",
"Approved": "Approved",
"Sick Note": "Sick Note",
"Absence ID": "Absence ID",
"Status": "状态",
"Year": "Year",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"The ID of the customer": "The ID of the customer",
"The ID of the project": "The ID of the project",
"The ID of the service": "The ID of the service",
"The ID of the user": "The ID of the user",
"Filter entries by their user": "Filter entries by their user",
"Filter entries by their customer": "Filter entries by their customer",
"Filter entries by their project": "Filter entries by their project",
"Filter entries by their service": "Filter entries by their service",
"Only show entries that are billable": "Only show entries that are billable",
"Only show entries that are already billed": "Only show entries that are already billed",
"Retrieves additional information about the entries": "Retrieves additional information about the entries",
"Reads only the specified page": "Reads only the specified page",
"Filter customers by their active status": "Filter customers by their active status",
"Filter projects by their customer": "Filter projects by their customer",
"The ID of the team": "The ID of the team",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Orange": "Orange",
"Yellow": "Yellow",
"Green": "Green",
"Caribean": "Caribean",
"Lightblue": "Lightblue",
"Blue": "Blue",
"Purple": "Purple",
"Magenta": "Magenta",
"Pink": "Pink",
"German": "German",
"English": "English",
"French": "French",
"Salary": "Salary",
"Hourly wage": "Hourly wage",
"Regular holiday": "Regular holiday",
"Special leaves": "Special leaves",
"Reduction of overtime": "Reduction of overtime",
"Sick day": "Sick day",
"Sick day of a child": "Sick day of a child",
"School / further education": "School / further education",
"Maternity protection": "Maternity protection",
"Home office (planned hours are applied)": "Home office (planned hours are applied)",
"Work out of office (planned hours are applied)": "Work out of office (planned hours are applied)",
"Special leaves (unpaid)": "Special leaves (unpaid)",
"Sick day (unpaid)": "Sick day (unpaid)",
"Sick day of child (unpaid)": "Sick day of child (unpaid)",
"Quarantine": "Quarantine",
"Military / alternative service (only full days)": "Military / alternative service (only full days)",
"Sick day (sickness benefit)": "Sick day (sickness benefit)",
"Requested": "Requested",
"Declined": "Declined",
"Approval cancelled": "Approval cancelled",
"Request cancelled": "Request cancelled",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Entry": "New Entry",
"New Absence Enquiry": "New Absence Enquiry",
"Triggers when a new time entry is created": "Triggers when a new time entry is created",
"Triggers when a new absence enquiry is created": "Triggers when a new absence enquiry is created"
}

View File

@@ -0,0 +1,47 @@
import {
PieceAuth,
Property,
createPiece,
} from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import actions from './lib/actions';
import triggers from './lib/triggers';
export const clockodoAuth = PieceAuth.CustomAuth({
required: true,
props: {
email: Property.ShortText({
displayName: 'E-Mail',
required: true,
description: 'The email of your clockodo user',
}),
token: PieceAuth.SecretText({
displayName: 'API-Token',
description: 'Your api token (can be found in profile settings)',
required: true,
}),
company_name: Property.ShortText({
displayName: 'Company Name',
description: 'Your company name or app name',
required: true,
}),
company_email: Property.ShortText({
displayName: 'Company E-Mail',
description: 'A contact email for your company or app',
required: true,
}),
},
});
export const clockodo = createPiece({
displayName: 'Clockodo',
description: 'Time tracking made easy',
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/clockodo.png',
categories: [PieceCategory.PRODUCTIVITY],
authors: ["JanHolger","kishanprmr","MoShizzle","khaledmashaly","abuaboud"],
auth: clockodoAuth,
actions,
triggers,
});

View File

@@ -0,0 +1,60 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import {
clockodoCommon,
emptyToNull,
makeClient,
reformatDate,
} from '../../common';
import { AbsenceStatus, AbsenceType } from '../../common/models/absence';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'create_absence',
displayName: 'Create Absence',
description: 'Creates a absence in clockodo',
props: {
date_since: Property.DateTime({
displayName: 'Start Date',
required: true,
}),
date_until: Property.DateTime({
displayName: 'End Date',
required: true,
}),
type: clockodoCommon.absenceType(true),
user_id: clockodoCommon.user_id(false),
half_days: Property.Checkbox({
displayName: 'Half Days',
required: false,
}),
approved: Property.Checkbox({
displayName: 'Approved',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
sick_note: Property.Checkbox({
displayName: 'Sick Note',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.createAbsence({
date_since: reformatDate(propsValue.date_since) as string,
date_until: reformatDate(propsValue.date_until) as string,
type: propsValue.type as AbsenceType,
users_id: propsValue.user_id as number,
count_days: propsValue.half_days ? 0.5 : 1,
status: propsValue.approved
? AbsenceStatus.APPROVED
: AbsenceStatus.REQUESTED,
note: emptyToNull(propsValue.note),
sick_note: propsValue.sick_note,
});
return res.absence;
},
});

View File

@@ -0,0 +1,20 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'delete_absence',
displayName: 'Delete Absence',
description: 'Deletes an absence in clockodo',
props: {
absence_id: Property.Number({
displayName: 'Absence ID',
required: true,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
await client.deleteAbsence(propsValue.absence_id);
},
});

View File

@@ -0,0 +1,21 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'get_absence',
displayName: 'Get Absence',
description: 'Retrieves a single absence from clockodo',
props: {
absence_id: Property.Number({
displayName: 'Absence ID',
required: true,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.getAbsence(propsValue.absence_id);
return res.absence;
},
});

View File

@@ -0,0 +1,13 @@
import createAction from './create-absence';
import getAction from './get-absence';
import updateAction from './update-absence';
import listAction from './list-absence';
import deleteAction from './delete-absence';
export default [
createAction,
getAction,
updateAction,
listAction,
deleteAction,
];

View File

@@ -0,0 +1,27 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'list_absences',
displayName: 'Get Absences',
description: 'Fetches absences from clockodo',
props: {
year: Property.Number({
displayName: 'Year',
required: true,
}),
user_id: clockodoCommon.user_id(false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.listAbsences({
year: propsValue.year,
users_id: propsValue.user_id,
});
return {
absences: res.absences,
};
},
});

View File

@@ -0,0 +1,68 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import {
clockodoCommon,
emptyToNull,
makeClient,
reformatDate,
} from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'update_absence',
displayName: 'Update Absence',
description: 'Updates an absence in clockodo',
props: {
absence_id: Property.Number({
displayName: 'Absence ID',
required: true,
}),
date_since: Property.DateTime({
displayName: 'Start Date',
required: false,
}),
date_until: Property.DateTime({
displayName: 'End Date',
required: false,
}),
type: clockodoCommon.absenceType(false),
status: Property.StaticDropdown({
displayName: 'Status',
required: false,
options: {
options: [
{ value: 0, label: 'Requested' },
{ value: 1, label: 'Approved' },
{ value: 2, label: 'Declined' },
{ value: 3, label: 'Approval cancelled' },
{ value: 4, label: 'Request cancelled' },
],
},
}),
half_days: Property.Checkbox({
displayName: 'Half Days',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
sick_note: Property.Checkbox({
displayName: 'Sick Note',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.updateAbsence(propsValue.absence_id, {
date_since: reformatDate(propsValue.date_since),
date_until: reformatDate(propsValue.date_until),
type: propsValue.type,
status: propsValue.status,
count_days: propsValue.half_days ? 0.5 : 1,
note: emptyToNull(propsValue.note),
sick_note: propsValue.sick_note,
});
return res.absence;
},
});

View File

@@ -0,0 +1,45 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, emptyToNull, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'create_customer',
displayName: 'Create Customer',
description: 'Creates a customer in clockodo',
props: {
name: Property.ShortText({
displayName: 'Name',
required: true,
}),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
active: Property.Checkbox({
displayName: 'Active',
required: false,
}),
billable: Property.Checkbox({
displayName: 'Billable',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
color: clockodoCommon.color(false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.createCustomer({
name: propsValue.name,
number: emptyToNull(propsValue.number),
active: propsValue.active,
billable_default: propsValue.billable,
note: emptyToNull(propsValue.note),
color: propsValue.color,
});
return res.customer;
},
});

View File

@@ -0,0 +1,17 @@
import { createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'delete_customer',
displayName: 'Delete Customer',
description: 'Deletes a customer in clockodo',
props: {
customer_id: clockodoCommon.customer_id(true, false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
await client.deleteCustomer(propsValue.customer_id as number);
},
});

View File

@@ -0,0 +1,18 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'get_customer',
displayName: 'Get Customer',
description: 'Retrieves a single customer from clockodo',
props: {
customer_id: clockodoCommon.customer_id(true, undefined),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.getCustomer(propsValue.customer_id as number);
return res.customer;
},
});

View File

@@ -0,0 +1,13 @@
import createAction from './create-customer';
import getAction from './get-customer';
import updateAction from './update-customer';
import listAction from './list-customers';
import deleteAction from './delete-customer';
export default [
createAction,
getAction,
updateAction,
listAction,
deleteAction,
];

View File

@@ -0,0 +1,45 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { makeClient } from '../../common';
import { CustomerListFilter } from '../../common/models/customer';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'list_customers',
displayName: 'Get Customers',
description: 'Fetches customers from clockodo',
props: {
active_filter: Property.Checkbox({
displayName: 'Active Filter',
description: 'Filter customers by their active status',
required: false,
defaultValue: true,
}),
page: Property.Number({
displayName: 'Page',
description: 'Reads only the specified page',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const filter: CustomerListFilter = {
active: propsValue.active_filter,
};
if (propsValue.page !== undefined) {
const res = await client.listCustomers({
page: propsValue.page,
filter,
});
return {
pagination: res.paging,
customers: res.customers,
};
} else {
const customers = await client.listAllCustomers(filter);
return {
customers,
};
}
},
});

View File

@@ -0,0 +1,46 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, emptyToNull, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'update_customer',
displayName: 'Update Customer',
description: 'Updates a customer in clockodo',
props: {
customer_id: clockodoCommon.customer_id(true, undefined),
name: Property.ShortText({
displayName: 'Name',
required: false,
}),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
active: Property.Checkbox({
displayName: 'Active',
required: false,
}),
billable: Property.Checkbox({
displayName: 'Billable',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
color: clockodoCommon.color(false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.updateCustomer(propsValue.customer_id as number, {
name: propsValue.name,
number: emptyToNull(propsValue.number),
active: propsValue.active,
billable_default: propsValue.billable,
note: emptyToNull(propsValue.note),
color: propsValue.color,
});
return res.customer;
},
});

View File

@@ -0,0 +1,47 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, makeClient, reformatDateTime } from '../../common';
import { TimeRecordEntry } from '../../common/models/entry';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'create_entry',
displayName: 'Create Entry',
description: 'Creates an entry in clockodo',
props: {
customer_id: clockodoCommon.customer_id(),
project_id: clockodoCommon.project_id(false),
service_id: clockodoCommon.service_id(),
time_since: Property.DateTime({
displayName: 'Start Time',
required: true,
}),
time_until: Property.DateTime({
displayName: 'End Time',
required: true,
}),
text: Property.LongText({
displayName: 'Description',
required: false,
}),
hourly_rate: Property.Number({
displayName: 'Hourly Rate',
required: false,
}),
user_id: clockodoCommon.user_id(false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.createEntry({
customers_id: propsValue.customer_id,
projects_id: propsValue.project_id,
services_id: propsValue.service_id,
time_since: reformatDateTime(propsValue.time_since),
time_until: reformatDateTime(propsValue.time_until),
text: propsValue.text,
hourly_rate: propsValue.hourly_rate,
users_id: propsValue.user_id,
} as TimeRecordEntry); // For now we only support time records
return res.entry;
},
});

View File

@@ -0,0 +1,20 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'delete_entry',
displayName: 'Delete Entry',
description: 'Deletes an entry in clockodo',
props: {
entry_id: Property.Number({
displayName: 'Entry ID',
required: true,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
await client.deleteEntry(propsValue.entry_id);
},
});

View File

@@ -0,0 +1,21 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'get_entry',
displayName: 'Get Entry',
description: 'Retrieves a single entry from clockodo',
props: {
entry_id: Property.Number({
displayName: 'Entry ID',
required: true,
}),
},
async run({ auth, propsValue }) {
const client = makeClient (auth.props);
const res = await client.getEntry(propsValue.entry_id);
return res.entry;
},
});

View File

@@ -0,0 +1,13 @@
import createAction from './create-entry';
import getAction from './get-entry';
import updateAction from './update-entry';
import listAction from './list-entries';
import deleteAction from './delete-entry';
export default [
createAction,
getAction,
listAction,
updateAction,
deleteAction,
];

View File

@@ -0,0 +1,113 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { makeClient, reformatDateTime } from '../../common';
import { BillableType, EntryListFilter } from '../../common/models/entry';
import { clockodoAuth } from '../../../';
function calculateBillable(
billable?: boolean,
billed?: boolean
): BillableType | undefined {
if (billable === undefined && billed === undefined) {
return undefined;
} else {
if (billed) {
return 2;
} else {
return billable ? 1 : 0;
}
}
}
export default createAction({
auth: clockodoAuth,
name: 'list_entries',
displayName: 'Get Entries',
description: 'Fetches entries from clockodo',
props: {
time_since: Property.DateTime({
displayName: 'Start Date',
required: true,
}),
time_until: Property.DateTime({
displayName: 'End Date',
required: true,
}),
user_id_filter: Property.Number({
displayName: 'Customer ID Filter',
description: 'Filter entries by their user',
required: false,
}),
customer_id_filter: Property.Number({
displayName: 'Customer ID Filter',
description: 'Filter entries by their customer',
required: false,
}),
project_id_filter: Property.Number({
displayName: 'Project ID Filter',
description: 'Filter entries by their project',
required: false,
}),
service_id_filter: Property.Number({
displayName: 'Service ID Filter',
description: 'Filter entries by their service',
required: false,
}),
billable_filter: Property.Checkbox({
displayName: 'Billable',
description: 'Only show entries that are billable',
required: false,
}),
billed_filter: Property.Checkbox({
displayName: 'Billed',
description: 'Only show entries that are already billed',
required: false,
}),
enhanced_list: Property.Checkbox({
displayName: 'Enhanced List',
description: 'Retrieves additional information about the entries',
required: false,
}),
page: Property.Number({
displayName: 'Page',
description: 'Reads only the specified page',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const filter: EntryListFilter = {
users_id: propsValue.user_id_filter,
customers_id: propsValue.customer_id_filter,
projects_id: propsValue.project_id_filter,
services_id: propsValue.service_id_filter,
billable: calculateBillable(
propsValue.billable_filter,
propsValue.billed_filter
),
};
const time_since = reformatDateTime(propsValue.time_since) as string;
const time_until = reformatDateTime(propsValue.time_until) as string;
if (propsValue.page !== undefined) {
const res = await client.listEntries({
time_since,
time_until,
enhanced_list: propsValue.enhanced_list,
page: propsValue.page,
filter,
});
return {
pagination: res.paging,
entries: res.entries,
};
} else {
const entries = await client.listAllEntries(
time_since,
time_until,
filter
);
return {
entries,
};
}
},
});

View File

@@ -0,0 +1,45 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, makeClient, reformatDateTime } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'update_entry',
displayName: 'Update Entry',
description: 'Updates an entry in clockodo',
props: {
entry_id: Property.Number({
displayName: 'Entry ID',
required: true,
}),
customer_id: clockodoCommon.customer_id(false),
project_id: clockodoCommon.project_id(false),
service_id: clockodoCommon.service_id(false),
time_since: Property.DateTime({
displayName: 'Start Time',
required: false,
}),
time_until: Property.DateTime({
displayName: 'End Time',
required: false,
}),
text: Property.LongText({
displayName: 'Description',
required: false,
}),
user_id: clockodoCommon.user_id(false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.updateEntry(propsValue.entry_id, {
customers_id: propsValue.customer_id,
projects_id: propsValue.project_id,
services_id: propsValue.service_id,
users_id: propsValue.user_id,
text: propsValue.text,
time_since: reformatDateTime(propsValue.time_since),
time_until: reformatDateTime(propsValue.time_until),
});
return res.entry;
},
});

View File

@@ -0,0 +1,29 @@
import entryActions from './entry';
import customerActions from './customer';
import projectActions from './project';
import serviceActions from './service';
import teamActions from './team';
import userActions from './user';
import absenceActions from './absence';
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import { clockodoAuth } from '../../index';
export default [
...entryActions,
...customerActions,
...projectActions,
...serviceActions,
...teamActions,
...userActions,
...absenceActions,
createCustomApiCallAction({
baseUrl: () => 'https://my.clockodo.com/api', // Replace with the actual base URL
auth: clockodoAuth,
authMapping: async (auth) => ({
'X-ClockodoApiUser': auth?.props?.email || '',
'X-ClockodoApiKey': auth?.props?.token || '',
'X-Clockodo-External-Application': auth?.props?.company_name || '',
'Accept-Language': 'en',
}),
}),
];

View File

@@ -0,0 +1,60 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, emptyToNull, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'create_project',
displayName: 'Create Project',
description: 'Creates a project in clockodo',
props: {
name: Property.ShortText({
displayName: 'Name',
required: true,
}),
customer_id: clockodoCommon.customer_id(),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
active: Property.Checkbox({
displayName: 'Active',
required: false,
}),
billable: Property.Checkbox({
displayName: 'Billable',
required: false,
}),
budget: Property.Number({
displayName: 'Budget',
required: false,
}),
budget_is_hours: Property.Checkbox({
displayName: 'Budget in hours?',
required: false,
}),
budget_is_not_strict: Property.Checkbox({
displayName: 'Soft Budget',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.createProject({
name: propsValue.name,
customers_id: propsValue.customer_id as number,
number: emptyToNull(propsValue.number),
active: propsValue.active,
billable_default: propsValue.billable,
note: emptyToNull(propsValue.note),
budget_money: propsValue.budget,
budget_is_hours: propsValue.budget_is_hours,
budget_is_not_strict: propsValue.budget_is_not_strict,
});
return res.project;
},
});

View File

@@ -0,0 +1,17 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'delete_project',
displayName: 'Delete Project',
description: 'Deletes a project in clockodo',
props: {
project_id: clockodoCommon.project_id(true, false, false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
await client.deleteProject(propsValue.project_id as number);
},
});

View File

@@ -0,0 +1,18 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'get_project',
displayName: 'Get Project',
description: 'Retrieves a single project from clockodo',
props: {
project_id: clockodoCommon.project_id(true, false, null),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.getProject(propsValue.project_id as number);
return res.project;
},
});

View File

@@ -0,0 +1,13 @@
import createAction from './create-project';
import getAction from './get-project';
import updateAction from './update-project';
import listAction from './list-projects';
import deleteAction from './delete-project';
export default [
createAction,
getAction,
listAction,
updateAction,
deleteAction,
];

View File

@@ -0,0 +1,51 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { makeClient } from '../../common';
import { ProjectListFilter } from '../../common/models/project';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'list_projects',
displayName: 'Get Projects',
description: 'Fetches projects from clockodo',
props: {
customer_id_filter: Property.Number({
displayName: 'Customer ID Filter',
description: 'Filter projects by their customer',
required: false,
}),
active_filter: Property.Checkbox({
displayName: 'Active Filter',
description: 'Filter customers by their active status',
required: false,
defaultValue: true,
}),
page: Property.Number({
displayName: 'Page',
description: 'Reads only the specified page',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const filter: ProjectListFilter = {
customers_id: propsValue.customer_id_filter,
active: propsValue.active_filter,
};
if (propsValue.page !== undefined) {
const res = await client.listProjects({
page: propsValue.page,
filter,
});
return {
pagination: res.paging,
projects: res.projects,
};
} else {
const projects = await client.listAllProjects(filter);
return {
projects,
};
}
},
});

View File

@@ -0,0 +1,76 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, emptyToNull, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'update_project',
displayName: 'Update Project',
description: 'Updates a project in clockodo',
props: {
project_id: clockodoCommon.project_id(true, false, null),
customer_id: clockodoCommon.customer_id(false),
name: Property.ShortText({
displayName: 'Name',
required: false,
}),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
active: Property.Checkbox({
displayName: 'Active',
required: false,
}),
billable: Property.Checkbox({
displayName: 'Billable',
required: false,
}),
budget: Property.Number({
displayName: 'Budget',
required: false,
}),
budget_is_hours: Property.Checkbox({
displayName: 'Budget in hours?',
required: false,
}),
budget_is_not_strict: Property.Checkbox({
displayName: 'Soft Budget',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
completed: Property.Checkbox({
displayName: 'Completed',
required: false,
}),
billed_amount: Property.Number({
displayName: 'Billed Amount',
required: false,
}),
billing_complete: Property.Checkbox({
displayName: 'Billing Complete',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.updateProject(propsValue.project_id as number, {
name: propsValue.name,
customers_id: propsValue.customer_id,
number: emptyToNull(propsValue.number),
active: propsValue.active,
billable_default: propsValue.billable,
note: emptyToNull(propsValue.note),
budget_money: propsValue.budget,
budget_is_hours: propsValue.budget_is_hours,
budget_is_not_strict: propsValue.budget_is_not_strict,
completed: propsValue.completed,
billed_money: propsValue.billed_amount,
billed_completely: propsValue.billing_complete,
});
return res.project;
},
});

View File

@@ -0,0 +1,38 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { emptyToNull, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'create_service',
displayName: 'Create Service',
description: 'Creates a service in clockodo',
props: {
name: Property.ShortText({
displayName: 'Name',
required: true,
}),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
active: Property.Checkbox({
displayName: 'Active',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.createService({
name: propsValue.name,
number: emptyToNull(propsValue.number),
active: propsValue.active,
note: emptyToNull(propsValue.note),
});
return res.service;
},
});

View File

@@ -0,0 +1,17 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'delete_service',
displayName: 'Delete Service',
description: 'Deletes a service in clockodo',
props: {
service_id: clockodoCommon.service_id(true, false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
await client.deleteService(propsValue.service_id as number);
},
});

View File

@@ -0,0 +1,18 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'get_service',
displayName: 'Get Service',
description: 'Retrieves a single service from clockodo',
props: {
service_id: clockodoCommon.service_id(true, null),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.getService(propsValue.service_id as number);
return res.service;
},
});

View File

@@ -0,0 +1,13 @@
import createAction from './create-service';
import getAction from './get-service';
import updateAction from './update-service';
import listAction from './list-services';
import deleteAction from './delete-service';
export default [
createAction,
getAction,
updateAction,
listAction,
deleteAction,
];

View File

@@ -0,0 +1,18 @@
import { makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'list_services',
displayName: 'Get Services',
description: 'Fetches services from clockodo',
props: {},
async run({ auth }) {
const client = makeClient(auth.props);
const res = await client.listServices();
return {
services: res.services,
};
},
});

View File

@@ -0,0 +1,39 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, emptyToNull, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'update_service',
displayName: 'Update Service',
description: 'Updates a service in clockodo',
props: {
service_id: clockodoCommon.service_id(true, null),
name: Property.ShortText({
displayName: 'Name',
required: false,
}),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
active: Property.Checkbox({
displayName: 'Active',
required: false,
}),
note: Property.LongText({
displayName: 'Note',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.updateService(propsValue.service_id as number, {
name: propsValue.name,
number: emptyToNull(propsValue.number),
active: propsValue.active,
note: emptyToNull(propsValue.note),
});
return res.service;
},
});

View File

@@ -0,0 +1,18 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'get_team',
displayName: 'Get Team',
description: 'Retrieves a single team from clockodo',
props: {
team_id: clockodoCommon.team_id(),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.getTeam(propsValue.team_id as number);
return res.team;
},
});

View File

@@ -0,0 +1,4 @@
import getAction from './get-team';
import listAction from './list-teams';
export default [getAction, listAction];

View File

@@ -0,0 +1,18 @@
import { makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'list_teams',
displayName: 'Get Teams',
description: 'Fetches teams from clockodo',
props: {},
async run({ auth }) {
const client = makeClient(auth.props);
const res = await client.listTeams();
return {
teams: res.teams,
};
},
});

View File

@@ -0,0 +1,68 @@
import { clockodoCommon, emptyToNull, makeClient } from '../../common';
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'create_user',
displayName: 'Create User',
description: 'Creates a user in clockodo',
props: {
name: Property.ShortText({
displayName: 'Name',
required: true,
}),
email: Property.ShortText({
displayName: 'E-Mail',
required: true,
}),
role: Property.ShortText({
displayName: 'Role',
required: true,
}),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
team_id: clockodoCommon.team_id(false),
language: clockodoCommon.language(false),
wage_type: Property.StaticDropdown({
displayName: 'Wage Type',
required: false,
options: {
options: [
{ label: 'Salary', value: 1 },
{ label: 'Hourly wage', value: 2 },
],
},
}),
can_generally_see_absences: Property.Checkbox({
displayName: 'Can see absences',
required: false,
}),
can_generally_manage_absences: Property.Checkbox({
displayName: 'Can manage absences',
required: false,
}),
can_add_customers: Property.Checkbox({
displayName: 'Can add customers',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.createUser({
name: propsValue.name,
email: propsValue.email,
role: propsValue.role,
number: emptyToNull(propsValue.number),
teams_id: propsValue.team_id,
language: propsValue.language,
wage_type: propsValue.wage_type,
can_generally_see_absences: propsValue.can_generally_see_absences,
can_generally_manage_absences: propsValue.can_generally_manage_absences,
can_add_customers: propsValue.can_add_customers,
});
return res.user;
},
});

View File

@@ -0,0 +1,17 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'delete_user',
displayName: 'Delete User',
description: 'Deletes a user in clockodo',
props: {
user_id: clockodoCommon.user_id(true, false),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
await client.deleteUser(propsValue.user_id as number);
},
});

View File

@@ -0,0 +1,18 @@
import { clockodoCommon, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'get_user',
displayName: 'Get User',
description: 'Retrieves a single user from clockodo',
props: {
user_id: clockodoCommon.user_id(true, null),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.getUser(propsValue.user_id as number);
return res.user;
},
});

View File

@@ -0,0 +1,13 @@
import getAction from './get-user';
import listAction from './list-users';
import createAction from './create-user';
import updateAction from './update-user';
import deleteAction from './delete-user';
export default [
getAction,
listAction,
createAction,
updateAction,
deleteAction,
];

View File

@@ -0,0 +1,18 @@
import { makeClient } from '../../common';
import { clockodoAuth } from '../../../';
import { createAction } from '@activepieces/pieces-framework';
export default createAction({
auth: clockodoAuth,
name: 'list_users',
displayName: 'Get Users',
description: 'Fetches users from clockodo',
props: {},
async run({ auth }) {
const client = makeClient(auth.props);
const res = await client.listUsers();
return {
users: res.users,
};
},
});

View File

@@ -0,0 +1,74 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { clockodoCommon, emptyToNull, makeClient } from '../../common';
import { clockodoAuth } from '../../../';
export default createAction({
auth: clockodoAuth,
name: 'update_user',
displayName: 'Update User',
description: 'Updates a user in clockodo',
props: {
user_id: clockodoCommon.user_id(true, null),
name: Property.ShortText({
displayName: 'Name',
required: false,
}),
email: Property.ShortText({
displayName: 'E-Mail',
required: false,
}),
role: Property.ShortText({
displayName: 'Role',
required: false,
}),
number: Property.ShortText({
displayName: 'Number',
required: false,
}),
active: Property.Checkbox({
displayName: 'Active',
required: false,
}),
team_id: clockodoCommon.team_id(false),
language: clockodoCommon.language(false),
wage_type: Property.StaticDropdown({
displayName: 'Wage Type',
required: false,
options: {
options: [
{ label: 'Salary', value: 1 },
{ label: 'Hourly wage', value: 2 },
],
},
}),
can_generally_see_absences: Property.Checkbox({
displayName: 'Can see absences',
required: false,
}),
can_generally_manage_absences: Property.Checkbox({
displayName: 'Can manage absences',
required: false,
}),
can_add_customers: Property.Checkbox({
displayName: 'Can add customers',
required: false,
}),
},
async run({ auth, propsValue }) {
const client = makeClient(auth.props);
const res = await client.updateUser(propsValue.user_id as number, {
name: propsValue.name,
email: propsValue.email,
role: propsValue.role,
number: emptyToNull(propsValue.number),
active: propsValue.active,
teams_id: propsValue.team_id,
language: propsValue.language,
wage_type: propsValue.wage_type,
can_generally_see_absences: propsValue.can_generally_see_absences,
can_generally_manage_absences: propsValue.can_generally_manage_absences,
can_add_customers: propsValue.can_add_customers,
});
return res.user;
},
});

View File

@@ -0,0 +1,423 @@
import {
HttpMessageBody,
HttpMethod,
QueryParams,
httpClient,
} from '@activepieces/pieces-common';
import { ListRequest, prepareListRequest } from './models/common';
import {
UserCreateRequest,
UserListResponse,
UserSingleResponse,
UserUpdateRequest,
} from './models/user';
import {
CustomerSingleResponse,
CustomerListResponse,
CustomerCreateRequest,
CustomerUpdateRequest,
CustomerListFilter,
Customer,
} from './models/customer';
import {
ProjectSingleResponse,
ProjectListResponse,
ProjectCreateRequest,
ProjectUpdateRequest,
ProjectListFilter,
Project,
} from './models/project';
import {
ServiceSingleResponse,
ServiceListResponse,
ServiceCreateRequest,
ServiceUpdateRequest,
} from './models/service';
import {
EntrySingleResponse,
EntryListResponse,
EntryCreateRequest,
EntryUpdateRequest,
EntryListRequest,
Entry,
EntryListFilter,
} from './models/entry';
import {
AbsenceSingleResponse,
AbsenceListResponse,
AbsenceCreateRequest,
AbsenceUpdateRequest,
AbsenceListRequest,
} from './models/absence';
import {
TeamCreateRequest,
TeamListResponse,
TeamSingleResponse,
TeamUpdateRequest,
} from './models/team';
export class ClockodoClient {
private clientIdentification: string;
private language = 'en';
constructor(
private email: string,
private token: string,
clientName: string,
clientEmail: string
) {
this.clientIdentification = clientName + ';' + clientEmail;
}
setLanguage(language: string) {
this.language = language;
}
async makeRequest<T extends HttpMessageBody>(
method: HttpMethod,
url: string,
query?: QueryParams,
body?: object
): Promise<T> {
const res = await httpClient.sendRequest<T>({
method,
url: 'https://my.clockodo.com/api' + url,
queryParams: query,
body,
headers: {
'X-ClockodoApiUser': this.email,
'X-ClockodoApiKey': this.token,
'X-Clockodo-External-Application': this.clientIdentification,
'Accept-Language': this.language,
},
});
return res.body;
}
listUsers(): Promise<UserListResponse> {
return this.makeRequest<UserListResponse>(HttpMethod.GET, '/v2/users');
}
getUser(id: number): Promise<UserSingleResponse> {
return this.makeRequest<UserSingleResponse>(
HttpMethod.GET,
'/v2/users/' + id
);
}
createUser(request: UserCreateRequest) {
return this.makeRequest<UserSingleResponse>(
HttpMethod.POST,
'/v2/users',
undefined,
request
);
}
updateUser(
id: number,
request: UserUpdateRequest
): Promise<UserSingleResponse> {
return this.makeRequest<UserSingleResponse>(
HttpMethod.PUT,
'/v2/users/' + id,
undefined,
request
);
}
deleteUser(id: number): Promise<object> {
return this.makeRequest<object>(HttpMethod.DELETE, '/v2/users/' + id);
}
listTeams(): Promise<TeamListResponse> {
return this.makeRequest<TeamListResponse>(HttpMethod.GET, '/v2/teams');
}
getTeam(id: number): Promise<TeamSingleResponse> {
return this.makeRequest<TeamSingleResponse>(
HttpMethod.GET,
'/v2/teams/' + id
);
}
createTeam(request: TeamCreateRequest) {
return this.makeRequest<TeamSingleResponse>(
HttpMethod.POST,
'/v2/teams',
undefined,
request
);
}
updateTeam(
id: number,
request: TeamUpdateRequest
): Promise<TeamSingleResponse> {
return this.makeRequest<TeamSingleResponse>(
HttpMethod.PUT,
'/v2/teams/' + id,
undefined,
request
);
}
deleteTeam(id: number): Promise<object> {
return this.makeRequest<object>(HttpMethod.DELETE, '/v2/teams/' + id);
}
listCustomers(
request: ListRequest<CustomerListFilter> = {}
): Promise<CustomerListResponse> {
return this.makeRequest<CustomerListResponse>(
HttpMethod.GET,
'/v2/customers',
prepareListRequest(request)
);
}
async listAllCustomers(filter: CustomerListFilter = {}): Promise<Customer[]> {
let totalPages = 999999;
const all: Customer[] = [];
for (let page = 0; page < totalPages; page++) {
const res = await this.listCustomers({
page: page + 1,
filter,
});
totalPages = res.paging.count_pages;
res.customers.forEach((e) => all.push(e));
}
return all;
}
getCustomer(id: number): Promise<CustomerSingleResponse> {
return this.makeRequest<CustomerSingleResponse>(
HttpMethod.GET,
'/v2/customers/' + id
);
}
createCustomer(request: CustomerCreateRequest) {
return this.makeRequest<CustomerSingleResponse>(
HttpMethod.POST,
'/v2/customers',
undefined,
request
);
}
updateCustomer(
id: number,
request: CustomerUpdateRequest
): Promise<CustomerSingleResponse> {
return this.makeRequest<CustomerSingleResponse>(
HttpMethod.PUT,
'/v2/customers/' + id,
undefined,
request
);
}
deleteCustomer(id: number): Promise<object> {
return this.makeRequest<object>(HttpMethod.DELETE, '/v2/customers/' + id);
}
listProjects(
request: ListRequest<ProjectListFilter> = {}
): Promise<ProjectListResponse> {
return this.makeRequest<ProjectListResponse>(
HttpMethod.GET,
'/v2/projects',
prepareListRequest(request)
);
}
async listAllProjects(filter: ProjectListFilter = {}): Promise<Project[]> {
let totalPages = 999999;
const all: Project[] = [];
for (let page = 0; page < totalPages; page++) {
const res = await this.listProjects({
page: page + 1,
filter,
});
totalPages = res.paging.count_pages;
res.projects.forEach((e) => all.push(e));
}
return all;
}
getProject(id: number): Promise<ProjectSingleResponse> {
return this.makeRequest<ProjectSingleResponse>(
HttpMethod.GET,
'/v2/projects/' + id
);
}
createProject(request: ProjectCreateRequest) {
return this.makeRequest<ProjectSingleResponse>(
HttpMethod.POST,
'/v2/projects',
undefined,
request
);
}
updateProject(
id: number,
request: ProjectUpdateRequest
): Promise<ProjectSingleResponse> {
return this.makeRequest<ProjectSingleResponse>(
HttpMethod.PUT,
'/v2/projects/' + id,
undefined,
request
);
}
deleteProject(id: number): Promise<object> {
return this.makeRequest<object>(HttpMethod.DELETE, '/v2/projects/' + id);
}
listServices(): Promise<ServiceListResponse> {
return this.makeRequest<ServiceListResponse>(
HttpMethod.GET,
'/v2/services'
);
}
getService(id: number): Promise<ServiceSingleResponse> {
return this.makeRequest<ServiceSingleResponse>(
HttpMethod.GET,
'/v2/services/' + id
);
}
createService(request: ServiceCreateRequest) {
return this.makeRequest<ServiceSingleResponse>(
HttpMethod.POST,
'/v2/services',
undefined,
request
);
}
updateService(
id: number,
request: ServiceUpdateRequest
): Promise<ServiceSingleResponse> {
return this.makeRequest<ServiceSingleResponse>(
HttpMethod.PUT,
'/v2/services/' + id,
undefined,
request
);
}
deleteService(id: number): Promise<object> {
return this.makeRequest<object>(HttpMethod.DELETE, '/v2/services/' + id);
}
listEntries(request: EntryListRequest): Promise<EntryListResponse> {
return this.makeRequest<EntryListResponse>(
HttpMethod.GET,
'/v2/entries',
prepareListRequest(request)
);
}
async listAllEntries(
time_since: string,
time_until: string,
filter: EntryListFilter = {}
): Promise<Entry[]> {
let totalPages = 999999;
const all: Entry[] = [];
for (let page = 0; page < totalPages; page++) {
const res = await this.listEntries({
page: page + 1,
time_since,
time_until,
filter,
});
totalPages = res.paging.count_pages;
res.entries.forEach((e) => all.push(e));
}
return all;
}
getEntry(id: number): Promise<EntrySingleResponse> {
return this.makeRequest<EntrySingleResponse>(
HttpMethod.GET,
'/v2/entries/' + id
);
}
createEntry(request: EntryCreateRequest) {
return this.makeRequest<EntrySingleResponse>(
HttpMethod.POST,
'/v2/entries',
undefined,
request
);
}
updateEntry(
id: number,
request: EntryUpdateRequest
): Promise<EntrySingleResponse> {
return this.makeRequest<EntrySingleResponse>(
HttpMethod.PUT,
'/v2/entries/' + id,
undefined,
request
);
}
deleteEntry(id: number): Promise<object> {
return this.makeRequest<object>(HttpMethod.DELETE, '/v2/entries/' + id);
}
listAbsences(request: AbsenceListRequest): Promise<AbsenceListResponse> {
const query: QueryParams = {
year: request.year.toString(),
};
if (request.users_id) query.users_id = request.users_id.toString();
return this.makeRequest<AbsenceListResponse>(
HttpMethod.GET,
'/absences',
query
);
}
getAbsence(id: number): Promise<AbsenceSingleResponse> {
return this.makeRequest<AbsenceSingleResponse>(
HttpMethod.GET,
'/absences/' + id
);
}
createAbsence(request: AbsenceCreateRequest) {
return this.makeRequest<AbsenceSingleResponse>(
HttpMethod.POST,
'/absences',
undefined,
request
);
}
updateAbsence(
id: number,
request: AbsenceUpdateRequest
): Promise<AbsenceSingleResponse> {
return this.makeRequest<AbsenceSingleResponse>(
HttpMethod.PUT,
'/absences/' + id,
undefined,
request
);
}
deleteAbsence(id: number): Promise<object> {
return this.makeRequest<object>(HttpMethod.DELETE, '/absences/' + id);
}
}

View File

@@ -0,0 +1,256 @@
import { PiecePropValueSchema, Property } from '@activepieces/pieces-framework';
import { ClockodoClient } from './client';
import { clockodoAuth } from '../../';
import { isNil } from '@activepieces/shared';
type ClockodoAuthValue = PiecePropValueSchema<typeof clockodoAuth>;
export function makeClient(auth: ClockodoAuthValue): ClockodoClient {
return new ClockodoClient(
auth.email,
auth.token,
auth.company_name,
auth.company_email
);
}
export const clockodoCommon = {
absenceType: (required = true) =>
Property.StaticDropdown({
displayName: 'Type',
required,
options: {
options: [
{ value: 1, label: 'Regular holiday' },
{ value: 2, label: 'Special leaves' },
{ value: 3, label: 'Reduction of overtime' },
{ value: 4, label: 'Sick day' },
{ value: 5, label: 'Sick day of a child' },
{ value: 6, label: 'School / further education' },
{ value: 7, label: 'Maternity protection' },
{ value: 8, label: 'Home office (planned hours are applied)' },
{ value: 9, label: 'Work out of office (planned hours are applied)' },
{ value: 10, label: 'Special leaves (unpaid)' },
{ value: 11, label: 'Sick day (unpaid)' },
{ value: 12, label: 'Sick day of child (unpaid)' },
{ value: 13, label: 'Quarantine' },
{
value: 14,
label: 'Military / alternative service (only full days)',
},
{ value: 15, label: 'Sick day (sickness benefit)' },
],
},
}),
customer_id: (required = true, active: boolean | null = true) =>
Property.Dropdown({
auth: clockodoAuth,
description: 'The ID of the customer',
displayName: 'Customer',
required,
refreshers: [],
options: async ({ auth }) => {
if (isNil(auth)) {
return {
disabled: true,
placeholder: 'setup authentication first',
options: [],
};
}
const client = makeClient(auth.props);
const customers = await client.listAllCustomers({
active: active === null ? undefined : active,
});
return {
disabled: false,
options: customers.map((customer) => {
return {
label: customer.name,
value: customer.id,
};
}),
};
},
}),
project_id: (
required = true,
requiresCustomer = true,
active: boolean | null = true
) =>
Property.Dropdown({
auth: clockodoAuth,
description: 'The ID of the project',
displayName: 'Project',
required,
refreshers: [...(requiresCustomer ? ['customer_id'] : [])],
options: async ({ auth, customer_id }) => {
if (isNil(auth)) {
return {
disabled: true,
placeholder: 'setup authentication first',
options: [],
};
}
if (requiresCustomer && !customer_id) {
return {
disabled: true,
placeholder: 'select a customer first',
options: [],
};
}
const client = makeClient(auth.props);
const projects = await client.listAllProjects({
active: active === null ? undefined : active,
customers_id: requiresCustomer
? parseInt(customer_id as string)
: undefined,
});
return {
disabled: false,
options: projects.map((project) => {
return {
label: project.name,
value: project.id,
};
}),
};
},
}),
user_id: (required = true, active: boolean | null = true) =>
Property.Dropdown({
auth: clockodoAuth,
description: 'The ID of the user',
displayName: 'User',
required,
refreshers: [],
options: async ({ auth }) => {
if (isNil(auth)) {
return {
disabled: true,
placeholder: 'setup authentication first',
options: [],
};
}
const client = makeClient(auth.props);
const usersRes = await client.listUsers();
return {
disabled: false,
options: usersRes.users
.filter((u) => active === null || u.active === active)
.map((user) => {
return {
label: user.name,
value: user.id,
};
}),
};
},
}),
team_id: (required = true) =>
Property.Dropdown({
auth: clockodoAuth,
description: 'The ID of the team',
displayName: 'Team',
required,
refreshers: [],
options: async ({ auth }) => {
if (isNil(auth)) {
return {
disabled: true,
placeholder: 'setup authentication first',
options: [],
};
}
const client = makeClient(auth.props);
const teamsRes = await client.listTeams();
return {
disabled: false,
options: teamsRes.teams.map((team) => {
return {
label: team.name,
value: team.id,
};
}),
};
},
}),
service_id: (required = true, active: boolean | null = true) =>
Property.Dropdown({
auth: clockodoAuth,
description: 'The ID of the service',
displayName: 'Service',
required,
refreshers: [],
options: async ({ auth }) => {
if (isNil(auth)) {
return {
disabled: true,
placeholder: 'setup authentication first',
options: [],
};
}
const client = makeClient(auth.props);
const servicesRes = await client.listServices();
return {
disabled: false,
options: servicesRes.services
.filter((s) => active === null || s.active === active)
.map((service) => {
return {
label: service.name,
value: service.id,
};
}),
};
},
}),
language: (required = true) =>
Property.StaticDropdown({
displayName: 'Language',
required,
options: {
options: [
{ label: 'German', value: 'de' },
{ label: 'English', value: 'en' },
{ label: 'French', value: 'fr' },
],
},
}),
color: (required = true) =>
Property.StaticDropdown({
displayName: 'Color',
required,
options: {
options: [
{ label: 'Orange', value: 0xee9163 },
{ label: 'Yellow', value: 0xf0d758 },
{ label: 'Green', value: 0x9de34a },
{ label: 'Caribean', value: 0x39e6ca },
{ label: 'Lightblue', value: 0x56c6f9 },
{ label: 'Blue', value: 0x3657f7 },
{ label: 'Purple', value: 0x7b4be7 },
{ label: 'Magenta', value: 0xd065e6 },
{ label: 'Pink', value: 0xfc71d1 },
],
},
}),
};
export function emptyToNull(val?: string): undefined | string | null {
return val === undefined ? val : val || null;
}
export function currentYear(): number {
const todaysDate = new Date();
return todaysDate.getFullYear();
}
export function reformatDateTime(s?: string): string | undefined {
if (!s) return undefined;
return s.replace(/\.[0-9]{3}/, '');
}
export function reformatDate(s?: string): string | undefined {
if (!s) return undefined;
return s.split('T', 2)[0];
}

View File

@@ -0,0 +1,76 @@
export enum AbsenceStatus {
REQUESTED = 0,
APPROVED = 1,
DECLINED = 2,
APPROVAL_CANCELLED = 3,
REQUEST_CANCELLED = 4,
}
export enum AbsenceType {
REGULAR_HOLIDAY = 1,
SPECIAL_LEAVE = 2,
REDUCTION_OF_OVERTIME = 3,
SICK_DAY = 4,
SICK_DAY_OF_CHILD = 5,
EDUCATION = 6,
MATERNITY_PROTECTION = 7,
HOME_OFFICE = 8,
WORK_OUT_OF_OFFICE = 9,
UNPAID_SPECIAL_LEAVE = 10,
UNPAID_SICK_DAY = 11,
UNPAID_SICK_DAY_OF_CHILD = 12,
QUARANTINE = 13,
MILITARY_SERVICE = 14,
SICK_DAY_BENEFIT = 15,
}
export interface Absence {
id: number;
users_id: number;
date_since: string;
date_until?: string;
status: AbsenceStatus;
type: AbsenceType;
note?: string;
count_days?: number;
count_hours?: number;
sick_note?: boolean;
date_enquired?: string;
date_approved?: string;
approved_by?: number;
}
export interface AbsenceCreateRequest {
type: AbsenceType;
date_since: string;
date_until: string | null;
note?: string | null;
users_id?: number;
status?: AbsenceStatus;
sick_note?: boolean;
count_days?: number;
}
export interface AbsenceUpdateRequest {
type?: AbsenceType;
date_since?: string;
date_until?: string | null;
note?: string | null;
users_id?: number;
status?: AbsenceStatus;
sick_note?: boolean;
count_days?: number;
}
export interface AbsenceListRequest {
year: number;
users_id?: number;
}
export interface AbsenceListResponse {
absences: Absence[];
}
export interface AbsenceSingleResponse {
absence: Absence;
}

View File

@@ -0,0 +1,45 @@
import { QueryParams } from '@activepieces/pieces-common';
export interface Paging {
items_per_page: number;
current_page: number;
count_pages: number;
count_items: number;
}
export interface ListRequest<T extends object> {
page?: number;
filter?: T;
}
function emptyValueFilter(
accessor: (key: string) => any
): (key: string) => boolean {
return (key: string) => {
const val = accessor(key);
return (
val !== null &&
val !== undefined &&
(typeof val != 'string' || val.length > 0)
);
};
}
export function prepareListRequest(request: ListRequest<any>): QueryParams {
const params: QueryParams = {};
const requestObj = request as Record<string, any>;
Object.keys(request)
.filter((k) => k != 'filter')
.filter(emptyValueFilter((k) => requestObj[k]))
.forEach((k: string) => {
params[k] = (request as Record<string, any>)[k].toString();
});
if (request.filter) {
Object.keys(request.filter)
.filter(emptyValueFilter((k) => request.filter[k]))
.forEach((k) => {
params['filter[' + k + ']'] = request.filter[k].toString();
});
}
return params;
}

View File

@@ -0,0 +1,42 @@
import { Paging } from './common';
export interface Customer {
id: number;
name: string;
number?: string;
active: boolean;
billable_default: boolean;
note?: string;
color: number;
}
export interface CustomerCreateRequest {
name: string;
number?: string | null;
active?: boolean;
billable_default?: boolean;
note?: string | null;
color?: number;
}
export interface CustomerUpdateRequest {
name?: string;
number?: string | null;
active?: boolean;
billable_default?: boolean;
note?: string | null;
color?: number;
}
export interface CustomerListFilter {
active?: boolean;
}
export interface CustomerListResponse {
paging: Paging;
customers: Customer[];
}
export interface CustomerSingleResponse {
customer: Customer;
}

View File

@@ -0,0 +1,136 @@
import { Paging, ListRequest } from './common';
export enum EntryType {
TIME_RECORD = 1,
LUMP_SUM = 2,
LUMP_SERVICE = 3,
}
export enum BillableType {
NOT_BILLABLE = 0,
BILLABLE = 1,
BILLED = 2,
}
export interface Entry {
id: number;
type: EntryType;
customers_id: number;
projects_id?: number;
users_id: number;
billable: BillableType;
texts_id?: string;
time_since: string;
time_until?: string;
time_insert: string;
time_last_change: string;
customers_name?: string;
projects_name?: string;
users_name?: string;
text?: string;
revenue?: number;
}
export interface TimeRecordEntry extends Entry {
services_id: number;
duration?: number;
offset: number;
clocked: boolean;
clocked_offline: boolean;
time_clocked_since?: string;
time_last_change_worktime: string;
hourly_rate: number;
service_name?: string;
}
export interface LumpSumEntry extends Entry {
services_id: number;
lumpsum: number;
service_name?: string;
}
export interface LumpServiceEntry extends Entry {
lumpsum_services_id: number;
lumpsums_amount: number;
lumpsum_services_price?: number;
}
export interface EntryCreateRequest {
customers_id: number;
}
export interface TimeRecordEntryCreateRequest extends EntryCreateRequest {
services_id: number;
billable: BillableType;
time_since: string;
time_until: string | null;
users_id?: number;
duration?: number;
hourly_rate?: number;
projects_id?: number;
text?: string;
}
export interface LumpSumEntryCreateRequest extends EntryCreateRequest {
services_id: number;
lumpsum: number;
billable: BillableType;
time_since: string;
users_id?: number;
projects_id?: number;
text?: string;
}
export interface LumpServiceEntryCreateRequest extends EntryCreateRequest {
lumpsum_services_id: number;
lumpsum_services_amount: number;
billable: BillableType;
time_since: string;
users_id?: number;
projects_id?: number;
text?: string;
}
export interface EntryUpdateRequest {
customers_id?: number;
projects_id?: number;
services_id?: number;
lumpsum_services_id?: number;
users_id?: number;
billable?: BillableType;
text?: string;
duration?: number;
lumpsum?: number;
lumpsum_services_amount?: number;
hourly_rate?: number;
time_since?: string;
time_until?: string;
}
export interface EntryListFilter {
users_id?: number;
customers_id?: number;
projects_id?: number;
services_id?: number;
lumpsum_services_id?: number;
billable?: BillableType;
text?: string;
texts_id?: number;
budget_type?: string;
}
export interface EntryListRequest extends ListRequest<EntryListFilter> {
time_since: string;
time_until: string;
enhanced_list?: boolean;
calc_also_revenues_for_projects_with_hard_budget?: boolean;
}
export interface EntryListResponse {
paging: Paging;
entries: Entry[];
}
export interface EntrySingleResponse {
entry: Entry;
}

View File

@@ -0,0 +1,60 @@
import { Paging } from './common';
export interface Project {
id: number;
customers_id: number;
name: string;
number?: string;
active: boolean;
billable_default: boolean;
note?: string;
budget_money?: number;
budget_is_hours: boolean;
budget_is_not_strict: boolean;
completed: boolean;
billed_money?: number;
billed_completely?: boolean;
revenue_factor?: number;
}
export interface ProjectCreateRequest {
name: string;
customers_id: number;
number?: string | null;
active?: boolean;
billable_default?: boolean;
note?: string | null;
budget_money?: number | null;
budget_is_hours?: boolean;
budget_is_not_strict?: boolean;
}
export interface ProjectUpdateRequest {
name?: string;
customers_id?: number;
number?: string | null;
active?: boolean;
billable_default?: boolean;
note?: string | null;
budget_money?: number | null;
budget_is_hours?: boolean;
budget_is_not_strict?: boolean;
hourly_rate?: number | null;
completed?: boolean;
billed_money?: number | null;
billed_completely?: boolean;
}
export interface ProjectListFilter {
active?: boolean;
customers_id?: number;
}
export interface ProjectListResponse {
paging: Paging;
projects: Project[];
}
export interface ProjectSingleResponse {
project: Project;
}

View File

@@ -0,0 +1,29 @@
export interface Service {
id: number;
name: string;
number?: string;
active: boolean;
note?: string;
}
export interface ServiceCreateRequest {
name: string;
number?: string | null;
active?: boolean;
note?: string | null;
}
export interface ServiceUpdateRequest {
name?: string;
number?: string | null;
active?: boolean;
note?: string | null;
}
export interface ServiceListResponse {
services: Service[];
}
export interface ServiceSingleResponse {
service: Service;
}

View File

@@ -0,0 +1,20 @@
export interface Team {
id: number;
name: string;
}
export interface TeamCreateRequest {
name: string;
}
export interface TeamUpdateRequest {
name: string;
}
export interface TeamListResponse {
teams: Team[];
}
export interface TeamSingleResponse {
team: Team;
}

View File

@@ -0,0 +1,75 @@
export interface User {
id: number;
name: string;
number?: string;
email: string;
role: string;
active: boolean;
timeformat_12h: boolean;
weekstart_monday: boolean;
weekend_friday: boolean;
language: string;
timezone: string;
wage_type?: number;
can_generally_see_absences: boolean;
can_generally_manage_absences: boolean;
can_add_customers: boolean;
edit_lock?: string;
edit_lock_dyn?: string;
edit_lock_sync?: boolean;
worktime_regulation_id?: number;
teams_id?: number;
nonbusinessgroups_id?: number;
}
export interface UserCreateRequest {
name: string;
number?: string | null;
email: string;
role: string;
timeformat_12h?: boolean;
weekstart_monday?: boolean;
weekend_friday?: boolean;
language?: string;
timezone?: string;
wage_type?: number;
can_generally_see_absences?: boolean;
can_generally_manage_absences?: boolean;
can_add_customers?: boolean;
edit_lock_sync?: boolean;
worktime_regulation_id?: number;
teams_id?: number;
nonbusinessgroups_id?: number;
mail_to_user?: boolean;
}
export interface UserUpdateRequest {
name?: string;
number?: string | null;
email?: string;
role?: string;
active?: boolean;
timeformat_12h?: boolean;
weekstart_monday?: boolean;
weekend_friday?: boolean;
language?: string;
timezone?: string;
wage_type?: number;
can_generally_see_absences?: boolean;
can_generally_manage_absences?: boolean;
can_add_customers?: boolean;
edit_lock?: string;
edit_lock_dyn?: string;
edit_lock_sync?: boolean;
worktime_regulation_id?: number;
teams_id?: number;
nonbusinessgroups_id?: number;
}
export interface UserListResponse {
users: User[];
}
export interface UserSingleResponse {
user: User;
}

View File

@@ -0,0 +1,4 @@
import newEntryTrigger from './new-entry';
import newAbsenceEnquiryTrigger from './new-absence-enquiry';
export default [newEntryTrigger, newAbsenceEnquiryTrigger];

View File

@@ -0,0 +1,69 @@
import { AppConnectionValueForAuthProperty, TriggerStrategy, createTrigger } from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { currentYear } from '../common';
import { ClockodoClient } from '../common/client';
import { clockodoAuth } from '../../';
const polling: Polling<AppConnectionValueForAuthProperty<typeof clockodoAuth>, unknown> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth }) => {
const client = new ClockodoClient(
auth.props.email,
auth.props.token,
auth.props.company_name,
auth.props.company_email
);
const res = await client.listAbsences({ year: currentYear() });
return res.absences
.sort((a, b) => b.id - a.id)
.map((a) => ({
id: a.id,
data: a,
}));
},
};
export default createTrigger({
auth: clockodoAuth,
name: 'new_absence_enquiry',
displayName: 'New Absence Enquiry',
description: 'Triggers when a new absence enquiry is created',
type: TriggerStrategy.POLLING,
props: {},
sampleData: {},
onEnable: async (context) => {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
onDisable: async (context) => {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
run: async (context) => {
return await pollingHelper.poll(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
test: async (context) => {
return await pollingHelper.test(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
});

View File

@@ -0,0 +1,78 @@
import { AppConnectionValueForAuthProperty, TriggerStrategy, createTrigger } from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { currentYear } from '../common';
import { ClockodoClient } from '../common/client';
import { clockodoAuth } from '../../';
const polling: Polling<AppConnectionValueForAuthProperty<typeof clockodoAuth>, unknown> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth }) => {
const { email, token, company_name, company_email } = auth.props;
const client = new ClockodoClient(
email,
token,
company_name,
company_email
);
const time_since = currentYear() - 1 + '-01-01T00:00:00Z';
const time_until = currentYear() + 1 + '-12-31T23:59:59Z';
let res = await client.listEntries({ time_since, time_until });
if (res.paging.count_pages > 1) {
res = await client.listEntries({
time_since,
time_until,
page: res.paging.count_pages,
});
}
return res.entries
.sort((a, b) => b.id - a.id)
.map((a) => ({
id: a.id,
data: a,
}));
},
};
export default createTrigger({
auth: clockodoAuth,
name: 'new_entry',
displayName: 'New Entry',
description: 'Triggers when a new time entry is created',
type: TriggerStrategy.POLLING,
props: {},
sampleData: {},
onEnable: async (context) => {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
onDisable: async (context) => {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
run: async (context) => {
return await pollingHelper.poll(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
test: async (context) => {
return await pollingHelper.test(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
});

View File

@@ -0,0 +1,16 @@
{
"extends": "../../../../tsconfig.base.json",
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
],
"compilerOptions": {
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
}
}

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}