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-invoiceninja
This library was generated with [Nx](https://nx.dev).
## Running lint
Run `nx lint pieces-invoiceninja` to execute the lint via [ESLint](https://eslint.org/).

View File

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

View File

@@ -0,0 +1,51 @@
{
"name": "pieces-invoiceninja",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/invoiceninja/src",
"projectType": "library",
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/invoiceninja",
"tsConfig": "packages/pieces/community/invoiceninja/tsconfig.lib.json",
"packageJson": "packages/pieces/community/invoiceninja/package.json",
"main": "packages/pieces/community/invoiceninja/src/index.ts",
"assets": [
"packages/pieces/community/invoiceninja/*.md",
{
"input": "packages/pieces/community/invoiceninja/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/invoiceninja",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
},
"tags": []
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "Kostenloses Open-Source-Rechnungstool",
"Base URL": "Basis-URL",
"API Token": "API Token",
"Enter the base URL": "Basis-URL eingeben",
"Enter the API token": "API-Token eingeben",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Bitte überprüfe https://invoice-ninja.readthedocs.io/de/latest/api_tokens.html#create-token\n um zu sehen, wie man das API Token bekommt",
"Create Task": "Aufgabe erstellen",
"Check Task Existence": "Vorhandene Aufgabe prüfen",
"Get Client Details from e-mail": "Client-Details von E-Mail erhalten",
"Get Invoices": "Rechnungen erhalten",
"Get Report": "Bericht abrufen",
"Create Invoice": "Rechnung erstellen",
"Create Client": "Kunde erstellen",
"Create Recurring Invoice": "Wiederkehrende Rechnung erstellen",
"Perform Action on Recurring Invoice": "Aktion bei wiederkehrender Rechnung ausführen",
"Custom API Call": "Eigener API-Aufruf",
"Creates a task instance in Invoice Ninja for billing purposes.": "Erstellt eine Task-Instanz in Rechnungs-Ninja für Abrechnungszwecke.",
"Verify if a Task Already Exists": "Überprüfen Sie, ob eine Aufgabe bereits vorhanden ist",
"Gets the client details if they exist by e-mail.": "Gibt die Kundendaten zurück, wenn sie per E-Mail existieren.",
"Gets data for invoices.": "Ruft Daten für Rechnungen ab.",
"Gets report data from InvoiceNinja.": "Ruft Daten von InvoiceNinja ab.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Erstellt eine Rechnung in Rechnung Ninja für Abrechnungszwecke.",
"Creates a new client in InvoiceNinja.": "Erstellt einen neuen Client in InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Erstellt eine wiederkehrende Rechnung in Rechnung Ninja für Abrechnungszwecke.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Aktionen beinhalten: start, stop, send_now, restore, archive, delete.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Task or Ticket Number (alphanumeric)": "Aufgaben- oder Ticketnummer (alphanumerisch)",
"Client ID (alphanumeric)": "Client-ID (alphanumerisch)",
"Project ID (alphanumeric)": "Projekt-ID (alphanumerisch)",
"Description of task": "Beschreibung der Aufgabe",
"Custom hourly rate": "Angepasster Stundensatz",
"Client e-mail address": "E-Mail-Adresse des Kunden",
"Invoice Status": "Rechnungsstatus",
"Client ID": "Kunden-ID",
"Max Results": "Maximale Ergebnisse",
"Report Type": "Berichtstyp",
"Purchase Order Number (alphanumeric)": "Bestellnummer (alphanumerisch)",
"Apply discount": "Rabatt anwenden",
"Type of discount": "Art des Rabatts",
"Public notes for invoice": "Öffentliche Notizen für Rechnung",
"Private notes for invoice": "Private Notizen für Rechnung",
"Order Items JSON string": "Bestellartikel JSON-Zeichenkette",
"Send invoice to the client by InvoiceNinja e-mail?": "Rechnung per E-Mail an den Kunden senden?",
"Mark the invoice as sent?": "Rechnung als gesendet markieren?",
"Invoice due date": "Rechnungsdatum",
"Client First Name (alphanumeric)": "Client Vorname (alphanumerisch)",
"Client Last Name (alphanumeric)": "Client Nachname (alphanumerisch)",
"Client Contact No (alphanumeric)": "Kundenkontakt Nr. (alphanumerisch)",
"Client e-mail (alphanumeric)": "Client-E-Mail (alphanumerisch)",
"Send invoices to the client": "Rechnungen an den Kunden senden",
"Business Name (alphanumeric)": "Geschäftsname (alphanumerisch)",
"Client Tax Number (alphanumeric)": "Kundensteuer-Nummer (alphanumerisch)",
"Private notes for client": "Private Notizen für Kunden",
"Client address 1 (alphanumeric)": "Client-Adresse 1 (alphanumerisch)",
"Client address 2 (alphanumeric)": "Client-Adresse 2 (alphanumerisch)",
"Client City/Town (alphanumeric)": "Kundenstadt/Stadt (alphanumerisch)",
"Client State (alphanumeric)": "Kundenstatus (alphanumerisch)",
"Client Postcode (alphanumeric)": "Client-Postleitzahl (alphanumerisch)",
"Frequency of billing": "Abrechnungshäufigkeit",
"No of billing cycles": "Keine Abrechnungszyklen",
"Override Frequency using Frequency ID (optional)": "Frequenz mit Frequenz-ID überschreiben (optional)",
"Invoice next send date": "Rechnungsdatum",
"Invoice last sent date": "Rechnung zuletzt gesendet am",
"Recurring Invoice ID (alphanumeric)": "Wiederkehrende Rechnungsnummer (alphanumerisch)",
"Action to perform": "durchzuführende Aktion",
"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)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "Eine einzigartige Aufgabe oder Ticket-Nummer, die noch nicht in Rechnungen Ninja verwendet wurde",
"Client ID from Invoice Ninja (optional)": "Client-ID von Rechnungs-Ninja (optional)",
"Project ID from Invoice Ninja (optional)": "Projekt-ID von Rechnungs-Ninja (optional)",
"Description of task to be billed": "Beschreibung der abzurechnenden Aufgabe",
"Custom hourly rate (optional) otherwise default used": "Benutzerdefinierte Stundenrate (optional) ansonsten Standard verwendet",
"A task or ticket number to check": "Eine zu prüfende Aufgabe oder Ticket-Nummer",
"A valid e-mail address to get client details for": "Eine gültige E-Mail-Adresse, um die Kundendetails zu erhalten",
"Select the invoice status for filtering.": "Wählen Sie den Rechnungsstatus für die Filterung aus.",
"Filter by Client ID, default is all clients.": "Nach Client-ID filtern, standardmäßig sind alle Clients.",
"Maximum number of results to return. 9999 is default.": "Maximale Anzahl an Ergebnissen, die zurückgegeben werden sollen. 9999 ist Standard.",
"Select the report type.": "Wählen Sie den Berichtstyp aus.",
"Client ID from Invoice Ninja": "Client-ID von Rechnungs-Ninja",
"Descriptive text or arbitrary number (optional)": "Beschreibender Text oder beliebiger Nummer (optional)",
"Enter a number for the whole invoice discount": "Geben Sie eine Nummer für den gesamten Rechnungsrabatt ein",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Wählen Sie den Betrag oder Prozentsatz für den Rechnungsrabatt. Gilt für Zeilenpositionen und Rechnung.",
"Text that may be visible in the client portal (optional)": "Text, der im Client-Portal sichtbar sein kann (optional)",
"Text not visible for clients (optional)": "Text für Clients nicht sichtbar (optional)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "z. B. [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Sollen wir die Rechnung bei der Erstellung an den Kunden schicken?",
"Makes the invoice active otherwise remains pending.": "Macht die Rechnung aktiv, ansonsten bleibt offen.",
"e.g., 2024-01-20": "z. B. 2024-01-20",
"The contact first name for this client (optional)": "Der Vorname des Kontakts für diesen Client (optional)",
"The contact last name for this client (optional)": "Der Kontakt-Nachname für diesen Client (optional)",
"The contact number for this client (optional)": "Die Kontaktnummer für diesen Client (optional)",
"The contact email for this client (compulsory)": "Die Kontakt-E-Mail für diesen Kunden (obligatorisch)",
"Should we send invoices to the client by e-mail?": "Sollen wir dem Kunden Rechnungen per E-Mail schicken?",
"Name of this business or natural person (compulsory)": "Name dieses Unternehmens oder natürliche Person (obligatorisch)",
"Leave blank if not a business (optional)": "Leer lassen, wenn nicht ein Unternehmen (optional)",
"Usually street name and number (compulsory)": "Normalerweise Straßenname und Straßennummer (obligatorisch)",
"Additional address details (optional)": "Zusätzliche Adressdetails (optional)",
"City or Town name (compulsory)": "Stadt oder Stadt (obligatorisch)",
"State or county or similar (optional)": "Bundesland oder Landkreis oder ähnliches (optional)",
"Postal code (optional)": "Postleitzahl (optional)",
"Choose one": "Wählen Sie eine",
"Enter a number. How many times should this bill be generated": "Geben Sie eine Zahl ein. Wie oft soll diese Rechnung generiert werden",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Geben Sie eine Zahl ein. 1-12 - entspricht dem Dropdown oben [Täglich 1, wöchentlich 2 etc..]!",
"Recurring Invoice ID from Invoice Ninja": "Wiederkehrende Rechnungsnummer von Rechnungs-Ninja",
"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..",
"Unpaid Invoices": "Unbezahlte Rechnungen",
"Paid Invoices": "Bezahlte Rechnungen",
"Overdue Invoices": "Überfällige Rechnungen",
"All Invoices": "Alle Rechnungen",
"Invoices": "Rechnungen",
"Amount": "Betrag",
"Percentage": "Prozentsatz",
"Use override below": "Unten überschreiben",
"Daily": "Täglich",
"Weekly": "Wöchentlich",
"2 Weeks": "2 Wochen",
"4 Weeks": "4 Wochen",
"Monthly": "Monatlich",
"Two Months": "Zwei Monate",
"Quarterly": "Vierteljährlich",
"Four Months": "Vier Monate",
"Semi Annually": "Halbjährlich",
"Annually": "Jährlich",
"Two Years": "Zwei Jahre",
"Three Years": "Drei Jahre",
"Start": "Start",
"Stop": "Stoppen",
"Send Now": "Jetzt senden",
"Restore": "Wiederherstellen",
"Archive": "Archivieren",
"Delete": "Löschen",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD"
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "Herramienta gratuita de facturación de código abierto",
"Base URL": "URL base",
"API Token": "API Token",
"Enter the base URL": "Introduzca la URL base",
"Enter the API token": "Introduzca el token API",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Por favor, comprueba https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n para ver cómo obtener el token API",
"Create Task": "Crear tarea",
"Check Task Existence": "Comprobar la existencia de la tarea",
"Get Client Details from e-mail": "Obtener detalles del cliente del correo electrónico",
"Get Invoices": "Obtener facturas",
"Get Report": "Obtener Reporte",
"Create Invoice": "Crear factura",
"Create Client": "Crear cliente",
"Create Recurring Invoice": "Crear factura recurrente",
"Perform Action on Recurring Invoice": "Realizar acción en la factura recurrente",
"Custom API Call": "Llamada API personalizada",
"Creates a task instance in Invoice Ninja for billing purposes.": "Crea una instancia de tarea en Factura Ninja para fines de facturación.",
"Verify if a Task Already Exists": "Verificar si ya existe una tarea",
"Gets the client details if they exist by e-mail.": "Obtiene los datos del cliente si existen por correo electrónico.",
"Gets data for invoices.": "Obtiene datos para las facturas.",
"Gets report data from InvoiceNinja.": "Obtiene los datos del informe de InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Crea una factura en Factura Ninja para fines de facturación.",
"Creates a new client in InvoiceNinja.": "Crea un nuevo cliente en InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Crea una factura recurrente en Factura Ninja para fines de facturación.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Las acciones incluyen: inicio, detenimiento, send_now, restaurar, archivar, eliminar.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Task or Ticket Number (alphanumeric)": "Tarea o número de ticket (alfanumérico)",
"Client ID (alphanumeric)": "ID de cliente (alfanumérica)",
"Project ID (alphanumeric)": "ID del proyecto (alfanumérica)",
"Description of task": "Descripción de la tarea",
"Custom hourly rate": "Precio por hora personalizado",
"Client e-mail address": "Dirección de correo electrónico del cliente",
"Invoice Status": "Estado de la factura",
"Client ID": "ID de cliente",
"Max Results": "Resultados máximos",
"Report Type": "Tipo de informe",
"Purchase Order Number (alphanumeric)": "Número de orden de compra (alfanumérica)",
"Apply discount": "Aplicar descuento",
"Type of discount": "Tipo de descuento",
"Public notes for invoice": "Notas públicas para la factura",
"Private notes for invoice": "Notas privadas para la factura",
"Order Items JSON string": "Orden de artículos JSON cadena",
"Send invoice to the client by InvoiceNinja e-mail?": "¿Enviar factura al cliente por correo electrónico InvoiceNinja?",
"Mark the invoice as sent?": "¿Marcar la factura como enviada?",
"Invoice due date": "Fecha límite de la factura",
"Client First Name (alphanumeric)": "Nombre del cliente (alfanumérica)",
"Client Last Name (alphanumeric)": "Apellido del cliente (alfanumérico)",
"Client Contact No (alphanumeric)": "Número de contacto del cliente (alfanumérica)",
"Client e-mail (alphanumeric)": "Correo del cliente (alfanumérica)",
"Send invoices to the client": "Enviar facturas al cliente",
"Business Name (alphanumeric)": "Nombre de negocio (alfanumérico)",
"Client Tax Number (alphanumeric)": "Número de impuestos del cliente (alfanumérico)",
"Private notes for client": "Notas privadas para el cliente",
"Client address 1 (alphanumeric)": "Dirección del cliente 1 (alfanumérica)",
"Client address 2 (alphanumeric)": "Dirección del cliente 2 (alfanumérica)",
"Client City/Town (alphanumeric)": "Ciudad/ciudad del cliente (alfanumérico)",
"Client State (alphanumeric)": "Estado del cliente (alfanumérico)",
"Client Postcode (alphanumeric)": "Código Postal del Cliente (alfanumérico)",
"Frequency of billing": "Frecuencia de facturación",
"No of billing cycles": "Núm. de ciclos de facturación",
"Override Frequency using Frequency ID (optional)": "Anular Frecuencia usando Frequency ID (opcional)",
"Invoice next send date": "Factura siguiente fecha de envío",
"Invoice last sent date": "Fecha de última recepción",
"Recurring Invoice ID (alphanumeric)": "ID de factura recurrente (alfanumérica)",
"Action to perform": "Acción a realizar",
"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)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "Una tarea o número de ticket único que no se ha utilizado antes en Ninja de factura",
"Client ID from Invoice Ninja (optional)": "ID de cliente de factura Ninja (opcional)",
"Project ID from Invoice Ninja (optional)": "ID del proyecto de factura Ninja (opcional)",
"Description of task to be billed": "Descripción de la tarea a facturar",
"Custom hourly rate (optional) otherwise default used": "Precio por hora personalizada (opcional) usado de otro modo por defecto",
"A task or ticket number to check": "Una tarea o número de ticket para comprobar",
"A valid e-mail address to get client details for": "Una dirección de correo electrónico válida para obtener los detalles del cliente para",
"Select the invoice status for filtering.": "Seleccione el estado de la factura para filtrar.",
"Filter by Client ID, default is all clients.": "Filtrar por ID de cliente, por defecto son todos los clientes.",
"Maximum number of results to return. 9999 is default.": "Número máximo de resultados a regresar. 9999 es el valor predeterminado.",
"Select the report type.": "Seleccione el tipo de informe.",
"Client ID from Invoice Ninja": "ID de cliente de factura Ninja",
"Descriptive text or arbitrary number (optional)": "Texto descriptivo o número arbitrario (opcional)",
"Enter a number for the whole invoice discount": "Introduzca un número para el descuento de la factura completa",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Seleccione la cantidad o el porcentaje para el descuento de la factura. Se aplica a los artículos de línea y la factura.",
"Text that may be visible in the client portal (optional)": "Texto que puede ser visible en el portal del cliente (opcional)",
"Text not visible for clients (optional)": "Texto no visible para clientes (opcional)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "e.g., [{ \"quantity\":1,\"product_key\":\"clave de producto\", \"descuento\": \"0\" }]",
"Should we send the invoice to the client on creation?": "¿Debemos enviar la factura al cliente en la creación?",
"Makes the invoice active otherwise remains pending.": "Hace que la factura activa de lo contrario permanece pendiente.",
"e.g., 2024-01-20": "p. ej., 2024-01",
"The contact first name for this client (optional)": "El nombre del contacto para este cliente (opcional)",
"The contact last name for this client (optional)": "El apellido del contacto para este cliente (opcional)",
"The contact number for this client (optional)": "El número de contacto para este cliente (opcional)",
"The contact email for this client (compulsory)": "El correo electrónico de contacto para este cliente (lamentablemente)",
"Should we send invoices to the client by e-mail?": "¿Deberíamos enviar facturas al cliente por correo electrónico?",
"Name of this business or natural person (compulsory)": "Nombre de este negocio o persona natural (sentido)",
"Leave blank if not a business (optional)": "Dejar en blanco si no es un negocio (opcional)",
"Usually street name and number (compulsory)": "Usualmente el nombre y el número de la calle (sentido)",
"Additional address details (optional)": "Detalles adicionales de la dirección (opcional)",
"City or Town name (compulsory)": "Nombre de ciudad o ciudad (sentido)",
"State or county or similar (optional)": "Estado o condado o similar (opcional)",
"Postal code (optional)": "Código postal (opcional)",
"Choose one": "Elige uno",
"Enter a number. How many times should this bill be generated": "Introduzca un número. Cuántas veces debe generarse esta factura",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Introduzca un número. 1-12 - corresponde a la lista desplegable de arriba [Ser 1, Semanal 2, etc..]!",
"Recurring Invoice ID from Invoice Ninja": "ID de factura recurrente de Ninja de factura",
"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.",
"Unpaid Invoices": "Facturas pendientes",
"Paid Invoices": "Facturas pagadas",
"Overdue Invoices": "Facturas atrasadas",
"All Invoices": "Todas las facturas",
"Invoices": "Facturas",
"Amount": "Cantidad",
"Percentage": "Porcentaje",
"Use override below": "Usar sobrescribir abajo",
"Daily": "Diario",
"Weekly": "Semanal",
"2 Weeks": "2 Semanas",
"4 Weeks": "4 semanas",
"Monthly": "Mensual",
"Two Months": "Dos Meses",
"Quarterly": "Trimestral",
"Four Months": "Cuatro meses",
"Semi Annually": "Semestral",
"Annually": "Anualmente",
"Two Years": "Dos años",
"Three Years": "Tres años",
"Start": "Comenzar",
"Stop": "Parar",
"Send Now": "Enviar Ahora",
"Restore": "Restaurar",
"Archive": "Archivar",
"Delete": "Eliminar",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO"
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "Outil gratuit de facturation open-source",
"Base URL": "URL de base",
"API Token": "API Token",
"Enter the base URL": "Entrez l'URL de base",
"Enter the API token": "Entrez le jeton de l'API",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Veuillez consulter https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n pour savoir comment obtenir le jeton API",
"Create Task": "Créer une tâche",
"Check Task Existence": "Vérifier Existence de Tâche",
"Get Client Details from e-mail": "Obtenir les détails du client par e-mail",
"Get Invoices": "Obtenir les factures",
"Get Report": "Obtenir le rapport",
"Create Invoice": "Créer une facture",
"Create Client": "Créer un client",
"Create Recurring Invoice": "Créer une facture récurrente",
"Perform Action on Recurring Invoice": "Effectuer une action sur la facture récurrente",
"Custom API Call": "Appel API personnalisé",
"Creates a task instance in Invoice Ninja for billing purposes.": "Crée une instance de tâche dans le Ninja de facture à des fins de facturation.",
"Verify if a Task Already Exists": "Vérifier si une tâche existe déjà",
"Gets the client details if they exist by e-mail.": "Renvoie les informations du client si elles existent par e-mail.",
"Gets data for invoices.": "Récupère les données des factures.",
"Gets report data from InvoiceNinja.": "Récupère les données de rapport de InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Crée une facture dans le Ninja de facture à des fins de facturation.",
"Creates a new client in InvoiceNinja.": "Crée un nouveau client dans InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Crée une facture récurrente dans le Ninja de facture à des fins de facturation.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Les actions incluent : démarrer, arrêter, send_now, restore, archiver, supprimer.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Task or Ticket Number (alphanumeric)": "Numéro de tâche ou de ticket (alphanumérique)",
"Client ID (alphanumeric)": "ID du client (alphanumérique)",
"Project ID (alphanumeric)": "ID du projet (alphanumérique)",
"Description of task": "Description de la tâche",
"Custom hourly rate": "Taux horaire personnalisé",
"Client e-mail address": "Adresse e-mail du client",
"Invoice Status": "Statut de la facture",
"Client ID": "ID client",
"Max Results": "Nombre maximum de résultats",
"Report Type": "Type de rapport",
"Purchase Order Number (alphanumeric)": "Numéro de bon de commande (alphanumérique)",
"Apply discount": "Appliquer la réduction",
"Type of discount": "Type de remise",
"Public notes for invoice": "Notes publiques pour la facture",
"Private notes for invoice": "Notes privées pour la facture",
"Order Items JSON string": "Chaîne JSON des éléments de la commande",
"Send invoice to the client by InvoiceNinja e-mail?": "Envoyer la facture au client par e-mail à InvoiceNinja ?",
"Mark the invoice as sent?": "Marquer la facture comme envoyée?",
"Invoice due date": "Date d'échéance de la facture",
"Client First Name (alphanumeric)": "Prénom du client (alphanumérique)",
"Client Last Name (alphanumeric)": "Nom du client (alphanumérique)",
"Client Contact No (alphanumeric)": "N° de contact client (alphanumérique)",
"Client e-mail (alphanumeric)": "E-mail du client (alphanumérique)",
"Send invoices to the client": "Envoyer des factures au client",
"Business Name (alphanumeric)": "Nom de l'entreprise (alphanumérique)",
"Client Tax Number (alphanumeric)": "Numéro de taxe du client (alphanumérique)",
"Private notes for client": "Notes privées pour le client",
"Client address 1 (alphanumeric)": "Adresse du client 1 (alphanumérique)",
"Client address 2 (alphanumeric)": "Adresse du client 2 (alphanumérique)",
"Client City/Town (alphanumeric)": "Ville cliente (alphanumérique)",
"Client State (alphanumeric)": "État du client (alphanumérique)",
"Client Postcode (alphanumeric)": "Code postal du client (alphanumérique)",
"Frequency of billing": "Fréquence de facturation",
"No of billing cycles": "Pas de cycles de facturation",
"Override Frequency using Frequency ID (optional)": "Remplacer la Fréquence par l'ID de Fréquence (optionnel)",
"Invoice next send date": "Date d'envoi de la facture suivante",
"Invoice last sent date": "Dernière date d'envoi de la facture",
"Recurring Invoice ID (alphanumeric)": "ID de facture récurrente (alphanumérique)",
"Action to perform": "Action à effectuer",
"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)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "Une tâche unique ou un numéro de ticket qui n'a pas été utilisé auparavant dans le Ninja de facture",
"Client ID from Invoice Ninja (optional)": "ID du client depuis le Ninja Facture (optionnel)",
"Project ID from Invoice Ninja (optional)": "ID du projet de la Facture Ninja (facultatif)",
"Description of task to be billed": "Description de la tâche à facturer",
"Custom hourly rate (optional) otherwise default used": "Taux horaire personnalisé (facultatif) sinon utilisé par défaut",
"A task or ticket number to check": "Une tâche ou un numéro de ticket à vérifier",
"A valid e-mail address to get client details for": "Une adresse e-mail valide pour obtenir les détails du client pour",
"Select the invoice status for filtering.": "Sélectionnez le statut de la facture à filtrer.",
"Filter by Client ID, default is all clients.": "Filtrer par ID de client, tous les clients sont par défaut.",
"Maximum number of results to return. 9999 is default.": "Nombre maximum de résultats à renvoyer. 9999 est par défaut.",
"Select the report type.": "Sélectionnez le type de rapport.",
"Client ID from Invoice Ninja": "ID client de la facture Ninja",
"Descriptive text or arbitrary number (optional)": "Texte descriptif ou nombre arbitraire (facultatif)",
"Enter a number for the whole invoice discount": "Entrez un numéro pour la remise complète de la facture",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Sélectionnez un montant ou un pourcentage pour la remise de la facture. S'applique aux articles en ligne et à la facture.",
"Text that may be visible in the client portal (optional)": "Texte qui peut être visible dans le portail client (optionnel)",
"Text not visible for clients (optional)": "Texte non visible pour les clients (facultatif)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "ex: [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Devrions-nous envoyer la facture au client lors de la création ?",
"Makes the invoice active otherwise remains pending.": "Rend la facture active autrement en attente.",
"e.g., 2024-01-20": "par exemple, 2024-01-20",
"The contact first name for this client (optional)": "Le prénom du contact pour ce client (optionnel)",
"The contact last name for this client (optional)": "Nom du contact pour ce client (facultatif)",
"The contact number for this client (optional)": "Le numéro de contact pour ce client (facultatif)",
"The contact email for this client (compulsory)": "L'e-mail de contact pour ce client (obligatoire)",
"Should we send invoices to the client by e-mail?": "Devrions-nous envoyer des factures au client par e-mail?",
"Name of this business or natural person (compulsory)": "Nom de cette entreprise ou personne physique (obligatoire)",
"Leave blank if not a business (optional)": "Laisser vide si ce n'est pas une entreprise (optionnel)",
"Usually street name and number (compulsory)": "Normalement le nom de la rue et le numéro (obligatoire)",
"Additional address details (optional)": "Détails supplémentaires de l'adresse (facultatif)",
"City or Town name (compulsory)": "Nom de la ville (obligatoire)",
"State or county or similar (optional)": "État ou comté ou similaire (optionnel)",
"Postal code (optional)": "Code postal (facultatif)",
"Choose one": "Choisir un",
"Enter a number. How many times should this bill be generated": "Entrez un nombre. Combien de fois cette facture doit-elle être générée",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Entrez un nombre. 1-12 - correspond à la liste déroulante ci-dessus [Quotidiennement 1, Hebdomadaire 2 etc..]!",
"Recurring Invoice ID from Invoice Ninja": "ID de facture récurrente à partir de la facture Ninja",
"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.",
"Unpaid Invoices": "Factures impayées",
"Paid Invoices": "Factures payantes",
"Overdue Invoices": "Factures en retard",
"All Invoices": "Toutes les factures",
"Invoices": "Factures",
"Amount": "Montant",
"Percentage": "Pourcentage",
"Use override below": "Utiliser la substitution ci-dessous",
"Daily": "Tous les jours",
"Weekly": "Hebdomadaire",
"2 Weeks": "2 semaines",
"4 Weeks": "4 semaines",
"Monthly": "Mensuel",
"Two Months": "Deux mois",
"Quarterly": "trimestriel",
"Four Months": "Quatre mois",
"Semi Annually": "Semestre annuel",
"Annually": "Annuellement",
"Two Years": "Deux ans",
"Three Years": "Trois ans",
"Start": "Début",
"Stop": "Arrêter",
"Send Now": "Envoyer maintenant",
"Restore": "Restaurer",
"Archive": "Archiver",
"Delete": "Supprimer",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "TÊTE"
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "無料のオープンソース請求ツール",
"Base URL": "ベースURL",
"API Token": "API Token",
"Enter the base URL": "ベース URL を入力してください",
"Enter the API token": "API トークンを入力してください",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "APIトークンの取得方法については、https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n を確認してください。",
"Create Task": "タスクを作成",
"Check Task Existence": "タスクの存在を確認",
"Get Client Details from e-mail": "メールからクライアントの詳細を取得する",
"Get Invoices": "請求書を取得",
"Get Report": "レポートの取得",
"Create Invoice": "請求書を作成",
"Create Client": "クライアントを作成",
"Create Recurring Invoice": "定期請求書の作成",
"Perform Action on Recurring Invoice": "定期請求書のアクションを実行",
"Custom API Call": "カスタムAPI通話",
"Creates a task instance in Invoice Ninja for billing purposes.": "請求のために請求書忍者にタスクインスタンスを作成します。",
"Verify if a Task Already Exists": "タスクがすでに存在するかどうかを確認します",
"Gets the client details if they exist by e-mail.": "電子メールでクライアントの詳細を取得します。",
"Gets data for invoices.": "請求書データを取得します。",
"Gets report data from InvoiceNinja.": "InvoiceNinjaからレポートデータを取得します。",
"Creates an invoice in Invoice Ninja for billing purposes.": "請求用の請求書を請求書忍者に作成します。",
"Creates a new client in InvoiceNinja.": "InvoiceNinja に新しいクライアントを作成します。",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "請求目的のために請求書を請求書忍者に作成します。",
"Actions include: start, stop, send_now, restore, archive, delete.": "アクションには以下のものがあります: start, stop, send_now, restore, archive, delete.",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Task or Ticket Number (alphanumeric)": "タスクまたはチケット番号 (英数字)",
"Client ID (alphanumeric)": "クライアント ID (英数字)",
"Project ID (alphanumeric)": "プロジェクト ID (英数字)",
"Description of task": "タスクの説明",
"Custom hourly rate": "カスタム時間ごとのレート",
"Client e-mail address": "クライアントのメールアドレス",
"Invoice Status": "請求ステータス",
"Client ID": "クライアント ID",
"Max Results": "最大結果",
"Report Type": "レポートの種類",
"Purchase Order Number (alphanumeric)": "注文番号(英数字)",
"Apply discount": "割引を適用",
"Type of discount": "割引の種類",
"Public notes for invoice": "請求書の公開ノート",
"Private notes for invoice": "請求書のプライベートノート",
"Order Items JSON string": "注文商品JSON文字列",
"Send invoice to the client by InvoiceNinja e-mail?": "InvoiceNinja メールで請求書をクライアントに送信しますか?",
"Mark the invoice as sent?": "請求書を送信済みにしますか?",
"Invoice due date": "請求書締切日",
"Client First Name (alphanumeric)": "クライアント名 (英数字)",
"Client Last Name (alphanumeric)": "Client Last Name (alphanumeric)",
"Client Contact No (alphanumeric)": "クライアントの連絡先番号 (英数字)",
"Client e-mail (alphanumeric)": "クライアントの電子メール (英数字)",
"Send invoices to the client": "クライアントに請求書を送信する",
"Business Name (alphanumeric)": "商号(英数字)",
"Client Tax Number (alphanumeric)": "クライアント税番号(英数字)",
"Private notes for client": "クライアントのプライベートノート",
"Client address 1 (alphanumeric)": "クライアントアドレス 1 (英数字)",
"Client address 2 (alphanumeric)": "クライアントアドレス 2 (英数字)",
"Client City/Town (alphanumeric)": "Client City/Town (英数字)",
"Client State (alphanumeric)": "クライアントの状態(英数字)",
"Client Postcode (alphanumeric)": "クライアント 郵便番号 (英数字)",
"Frequency of billing": "請求頻度",
"No of billing cycles": "No of billing cycle",
"Override Frequency using Frequency ID (optional)": "頻度IDを使用した頻度を上書きする (省略可能)",
"Invoice next send date": "次の送信日",
"Invoice last sent date": "請求書の最終送信日",
"Recurring Invoice ID (alphanumeric)": "繰り返し請求書ID英数字",
"Action to perform": "実行するアクション",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "請求書忍者で以前に使用されていないユニークなタスクまたはチケット番号",
"Client ID from Invoice Ninja (optional)": "請求書忍者からのクライアントID任意",
"Project ID from Invoice Ninja (optional)": "請求書忍者のプロジェクトID任意",
"Description of task to be billed": "請求されるタスクの説明",
"Custom hourly rate (optional) otherwise default used": "カスタム時給(オプション)、そうでない場合はデフォルトで使用",
"A task or ticket number to check": "チェックするタスクまたはチケット番号",
"A valid e-mail address to get client details for": "クライアントの詳細を取得するための有効なメールアドレス",
"Select the invoice status for filtering.": "フィルタリングする請求書ステータスを選択します。",
"Filter by Client ID, default is all clients.": "クライアントIDでフィルタリングします。デフォルトはすべてのクライアントです。",
"Maximum number of results to return. 9999 is default.": "返す結果の最大数です。9999 はデフォルトです。",
"Select the report type.": "レポート タイプを選択します。",
"Client ID from Invoice Ninja": "請求書忍者からのクライアントID",
"Descriptive text or arbitrary number (optional)": "記述テキストまたは任意の数字(任意)",
"Enter a number for the whole invoice discount": "請求書全体の割引の番号を入力してください",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "請求書割引の金額またはパーセンテージを選択します。項目と請求書に適用されます。",
"Text that may be visible in the client portal (optional)": "クライアント・ポータルに表示される可能性のあるテキスト (オプション)",
"Text not visible for clients (optional)": "クライアントに表示されないテキスト (オプション)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "例: [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "作成時に請求書をクライアントに送信しますか?",
"Makes the invoice active otherwise remains pending.": "請求書を有効にして保留中のままにします。",
"e.g., 2024-01-20": "例2024-01-20",
"The contact first name for this client (optional)": "このクライアントの連絡先の名 (オプション)",
"The contact last name for this client (optional)": "このクライアントの連絡先の姓 (オプション)",
"The contact number for this client (optional)": "このクライアントの連絡先番号 (オプション)",
"The contact email for this client (compulsory)": "このクライアントの連絡先メール (必須)",
"Should we send invoices to the client by e-mail?": "請求書をお客様に電子メールで送信しますか?",
"Name of this business or natural person (compulsory)": "この事業者または自然人の氏名(必須)",
"Leave blank if not a business (optional)": "ビジネス (オプション) でなければ空白のままにします",
"Usually street name and number (compulsory)": "通常通りの名前と番号(必須)",
"Additional address details (optional)": "追加の住所の詳細(オプション)",
"City or Town name (compulsory)": "市町村名(必須)",
"State or county or similar (optional)": "都道府県(オプション)",
"Postal code (optional)": "郵便番号 (オプション)",
"Choose one": "1つ選択してください",
"Enter a number. How many times should this bill be generated": "数字を入力してください。何回この請求書を生成する必要がありますか?",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "数字を入力してください。1-12 - [毎日 1、ウィークリー2など] の上にあるドロップダウンに該当します。",
"Recurring Invoice ID from Invoice Ninja": "請求書忍者から反復請求書ID",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"Unpaid Invoices": "未払い請求書",
"Paid Invoices": "有料請求書",
"Overdue Invoices": "延滞請求書",
"All Invoices": "すべての請求書",
"Invoices": "請求書",
"Amount": "金額",
"Percentage": "割合",
"Use override below": "以下の上書きを使用する",
"Daily": "毎日",
"Weekly": "Weekly",
"2 Weeks": "2 週間",
"4 Weeks": "4 週間",
"Monthly": "月ごと",
"Two Months": "2ヶ月",
"Quarterly": "四半期ごと",
"Four Months": "4 ヶ月",
"Semi Annually": "半年ごと",
"Annually": "毎年",
"Two Years": "2年",
"Three Years": "3年",
"Start": "開始",
"Stop": "停止",
"Send Now": "今すぐ送信",
"Restore": "復元",
"Archive": "アーカイブ",
"Delete": "削除",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭"
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "Gratis open-source factureringsgereedschap",
"Base URL": "Basis URL",
"API Token": "API Token",
"Enter the base URL": "Voer de basis-URL in",
"Enter the API token": "Voer het API token in",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Kijk op https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n om te zien hoe je de API-token kunt verkrijgen",
"Create Task": "Taak maken",
"Check Task Existence": "Controleer Bestaande Taak",
"Get Client Details from e-mail": "Klantgegevens ophalen uit e-mail",
"Get Invoices": "Facturen ophalen",
"Get Report": "Rapport ophalen",
"Create Invoice": "Factuur aanmaken",
"Create Client": "Client aanmaken",
"Create Recurring Invoice": "Maak periodieke factuur",
"Perform Action on Recurring Invoice": "Actie uitvoeren op periodieke factuur",
"Custom API Call": "Custom API Call",
"Creates a task instance in Invoice Ninja for billing purposes.": "Maakt een taak instantie in factuur Ninja voor factureringsdoeleinden.",
"Verify if a Task Already Exists": "Verifieer of een taak al bestaat",
"Gets the client details if they exist by e-mail.": "Haalt de klantgegevens op als deze per e-mail bestaan.",
"Gets data for invoices.": "Gegevens voor facturen ophalen.",
"Gets report data from InvoiceNinja.": "Haalt gegevens op van InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Maakt een factuur in factuur Ninja voor factureringsdoeleinden.",
"Creates a new client in InvoiceNinja.": "Maakt een nieuwe klant aan in InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Maakt een periodieke factuur in factuur Ninja voor factureringsdoeleinden.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Acties omvatten: start, stop, send_now herstellen, archief, verwijderen.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Task or Ticket Number (alphanumeric)": "Taak of ticket nummer (alfanumeriek)",
"Client ID (alphanumeric)": "Client-ID (alfanumeriek)",
"Project ID (alphanumeric)": "Project ID (alfanumeriek)",
"Description of task": "Beschrijving van taak",
"Custom hourly rate": "Aangepast uurtarief",
"Client e-mail address": "E-mailadres klant",
"Invoice Status": "Factuur Status",
"Client ID": "Klant ID",
"Max Results": "Max. aantal resultaten",
"Report Type": "Rapport Type",
"Purchase Order Number (alphanumeric)": "Inkoopordernummer (alfanumeriek)",
"Apply discount": "Korting toepassen",
"Type of discount": "Type korting",
"Public notes for invoice": "Openbare notities voor factuur",
"Private notes for invoice": "Privé notities voor factuur",
"Order Items JSON string": "Bestelitems JSON tekenreeks",
"Send invoice to the client by InvoiceNinja e-mail?": "Factuur per e-mail naar de klant versturen?",
"Mark the invoice as sent?": "Markeer de factuur als verzonden?",
"Invoice due date": "Vervaldatum factuur",
"Client First Name (alphanumeric)": "Voornaam klant (alfanumeriek)",
"Client Last Name (alphanumeric)": "Klant achternaam (alfanumeriek)",
"Client Contact No (alphanumeric)": "Klant Contact nr. (alfanumeriek)",
"Client e-mail (alphanumeric)": "Klant e-mail (alfanumeriek)",
"Send invoices to the client": "Stuur facturen naar de klant",
"Business Name (alphanumeric)": "Bedrijfsnaam (alfanumeriek)",
"Client Tax Number (alphanumeric)": "Klant BTW-nummer (alfanumeriek)",
"Private notes for client": "Privé notities voor klant",
"Client address 1 (alphanumeric)": "Klant adres 1 (alfanumeriek)",
"Client address 2 (alphanumeric)": "Klant adres 2 (alfanumeriek)",
"Client City/Town (alphanumeric)": "Klant stad/stad (alfanumeriek)",
"Client State (alphanumeric)": "Provincie klant (alfanumeriek)",
"Client Postcode (alphanumeric)": "Klant postcode (alfanumeriek)",
"Frequency of billing": "Frequentie van facturering",
"No of billing cycles": "Aantal factureringscycli",
"Override Frequency using Frequency ID (optional)": "Frequentie overschrijven met Frequentie ID (optioneel)",
"Invoice next send date": "Factuur volgende verzenddatum",
"Invoice last sent date": "Factuur laatste verzonden datum",
"Recurring Invoice ID (alphanumeric)": "Terugkerende factuur ID (alfanumeriek)",
"Action to perform": "Uit te voeren actie",
"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)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "Een unieke taak of ticketnummer dat nog niet eerder is gebruikt in factuur Ninja",
"Client ID from Invoice Ninja (optional)": "Client-ID van factuur Ninja (optioneel)",
"Project ID from Invoice Ninja (optional)": "Project-ID van factuur Ninja (optioneel)",
"Description of task to be billed": "Te factureren taak omschrijving",
"Custom hourly rate (optional) otherwise default used": "Aangepaste uurtarief (optioneel) anders standaard gebruikt",
"A task or ticket number to check": "Een taak of ticket nummer om te controleren",
"A valid e-mail address to get client details for": "Een geldig e-mailadres om klantgegevens te krijgen voor",
"Select the invoice status for filtering.": "Selecteer de factuur status voor het filteren.",
"Filter by Client ID, default is all clients.": "Filter op Client ID, standaard zijn alle clients.",
"Maximum number of results to return. 9999 is default.": "Maximum aantal resultaten om terug te zenden. 9999 is niet meer dan standaard.",
"Select the report type.": "Selecteer het type rapport.",
"Client ID from Invoice Ninja": "Client-ID van factuur Ninja",
"Descriptive text or arbitrary number (optional)": "Beschrijvende tekst of willekeurig nummer (optioneel)",
"Enter a number for the whole invoice discount": "Voer een getal in voor de gehele factuur",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Selecteer bedrag of percentage voor factuurkorting. Geldt voor regelitems en factuurfactuur.",
"Text that may be visible in the client portal (optional)": "Tekst die zichtbaar kan zijn in de klantenportaal (optioneel)",
"Text not visible for clients (optional)": "Tekst niet zichtbaar voor klanten (optioneel)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "b.v. [{ \"quantity\":1,\"product_key\":\"productsleutel\", \"korting\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Moeten we de factuur bij aanmaak naar de klant sturen?",
"Makes the invoice active otherwise remains pending.": "Maakt de factuur actief anders in behandeling.",
"e.g., 2024-01-20": "bijv. 2024-01-20",
"The contact first name for this client (optional)": "De voornaam van de contactpersoon voor deze klant (optioneel)",
"The contact last name for this client (optional)": "De achternaam van de contactpersoon voor deze klant (optioneel)",
"The contact number for this client (optional)": "Het contactnummer voor deze klant (optioneel)",
"The contact email for this client (compulsory)": "De contactmail voor deze klant (verplicht)",
"Should we send invoices to the client by e-mail?": "Moeten we per e-mail facturen naar de klant sturen?",
"Name of this business or natural person (compulsory)": "Naam van dit bedrijf of natuurlijk persoon (verplicht)",
"Leave blank if not a business (optional)": "Laat leeg indien geen bedrijf (optioneel)",
"Usually street name and number (compulsory)": "Normaal gesproken straatnaam en nummer (verplicht)",
"Additional address details (optional)": "Extra adresgegevens (optioneel)",
"City or Town name (compulsory)": "Naam stad of stad (verplicht)",
"State or county or similar (optional)": "Provincie of gemeente of iets dergelijks (optioneel)",
"Postal code (optional)": "Postcode (optioneel)",
"Choose one": "Kies er een",
"Enter a number. How many times should this bill be generated": "Voer een getal in. Hoeveel keer moet dit contract gegenereerd worden",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Voer een getal in. 1-12 - correspondeert met de dropdown boven [Dagelijks zijn 1, Wekelijks 2 etc..]!",
"Recurring Invoice ID from Invoice Ninja": "Periodieke factuur ID van factuur Ninja",
"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..",
"Unpaid Invoices": "Onbetaalde facturen",
"Paid Invoices": "Betaalde facturen",
"Overdue Invoices": "Achterstallige facturen",
"All Invoices": "Alle facturen",
"Invoices": "Rekeningen",
"Amount": "Hoeveelheid",
"Percentage": "Percentage",
"Use override below": "Gebruik overschrijving onderaan",
"Daily": "Dagelijks",
"Weekly": "wekelijks",
"2 Weeks": "2 weken",
"4 Weeks": "4 weken",
"Monthly": "maandelijks",
"Two Months": "Twee maanden",
"Quarterly": "Driemaandelijks",
"Four Months": "Vier maanden",
"Semi Annually": "Dagelijks Semi",
"Annually": "Jaarlijks",
"Two Years": "Twee jaar",
"Three Years": "Drie jaar",
"Start": "Beginnen",
"Stop": "Stoppen",
"Send Now": "Nu verzenden",
"Restore": "Herstellen",
"Archive": "Archief",
"Delete": "Verwijderen",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD"
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "Ferramenta de faturação open-source gratuita",
"Base URL": "URL Base",
"API Token": "API Token",
"Enter the base URL": "Digite a URL base",
"Enter the API token": "Digite o token de API",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Por favor, verifique https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n para ver como obter o token de API",
"Create Task": "Criar tarefa",
"Check Task Existence": "Verificar a existência da tarefa",
"Get Client Details from e-mail": "Obter detalhes do cliente de e-mail",
"Get Invoices": "Obter Faturas",
"Get Report": "Obter Relatório",
"Create Invoice": "Criar fatura",
"Create Client": "Criar Cliente",
"Create Recurring Invoice": "Criar Fatura Recorrente",
"Perform Action on Recurring Invoice": "Executar Ação na Fatura Recorrente",
"Custom API Call": "Chamada de API personalizada",
"Creates a task instance in Invoice Ninja for billing purposes.": "Cria uma instância de tarefa no Ninja da Fatura para fins de faturamento.",
"Verify if a Task Already Exists": "Verifique se uma tarefa já existe",
"Gets the client details if they exist by e-mail.": "Obtém os detalhes do cliente se eles existem por e-mail.",
"Gets data for invoices.": "Obtém dados para faturas.",
"Gets report data from InvoiceNinja.": "Obtém dados de relatório da InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Cria uma fatura no Ninja da fatura para fins de faturamento.",
"Creates a new client in InvoiceNinja.": "Cria um novo cliente na InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Cria uma fatura recorrente na fatura Ninja para fins de faturamento.",
"Actions include: start, stop, send_now, restore, archive, delete.": "As ações incluem: iniciar, parar, enviar_agora, restaurar, arquivar, excluir.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Task or Ticket Number (alphanumeric)": "Task ou Ticket Number (alfanumérico)",
"Client ID (alphanumeric)": "ID do cliente (alfanumérico)",
"Project ID (alphanumeric)": "ID do Projeto (alfanumérico)",
"Description of task": "Descrição da tarefa",
"Custom hourly rate": "Preço por hora personalizado",
"Client e-mail address": "Endereço de e-mail cliente",
"Invoice Status": "Status da fatura",
"Client ID": "ID do Cliente",
"Max Results": "Resultados no Máx.",
"Report Type": "Tipo De Relatório",
"Purchase Order Number (alphanumeric)": "Número do pedido (alfanumérico)",
"Apply discount": "Aplicar desconto",
"Type of discount": "Tipo de desconto",
"Public notes for invoice": "Notas públicas para fatura",
"Private notes for invoice": "Notas privadas para fatura",
"Order Items JSON string": "Itens do pedido JSON",
"Send invoice to the client by InvoiceNinja e-mail?": "Enviar fatura para o cliente por e-mail InvoiceNinj?",
"Mark the invoice as sent?": "Marcar a fatura como enviada?",
"Invoice due date": "Data de vencimento",
"Client First Name (alphanumeric)": "Primeiro Nome do Cliente (alfanumérico)",
"Client Last Name (alphanumeric)": "Sobrenome do Cliente (alfanumérico)",
"Client Contact No (alphanumeric)": "Número de Contato do Cliente (alfanumérico)",
"Client e-mail (alphanumeric)": "E-mail do cliente (alfanumérico)",
"Send invoices to the client": "Enviar faturas para o cliente",
"Business Name (alphanumeric)": "Nome Comercial (alfanumérico)",
"Client Tax Number (alphanumeric)": "Número Imposto do Cliente (alfanumérico)",
"Private notes for client": "Notas privadas para o cliente",
"Client address 1 (alphanumeric)": "Endereço do cliente 1 (alfanumérico)",
"Client address 2 (alphanumeric)": "Endereço do cliente 2 (alfanumérico)",
"Client City/Town (alphanumeric)": "Cidade do cliente/Cidade (alfanumérico)",
"Client State (alphanumeric)": "Estado do Cliente (alfanumérico)",
"Client Postcode (alphanumeric)": "CEP do Cliente (alfanumérico)",
"Frequency of billing": "Frequência da cobrança",
"No of billing cycles": "Sem ciclos de faturamento",
"Override Frequency using Frequency ID (optional)": "Sobrescrever Frequência usando ID de Frequência (opcional)",
"Invoice next send date": "Data do próximo envio",
"Invoice last sent date": "Data do último envio",
"Recurring Invoice ID (alphanumeric)": "ID da Fatura Recorrente (alfanumérico)",
"Action to perform": "Ação a executar",
"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)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "Uma tarefa ou tíquete única que não foi utilizada anteriormente na Invoice Ninja",
"Client ID from Invoice Ninja (optional)": "ID do cliente a partir da fatura Ninja (opcional)",
"Project ID from Invoice Ninja (optional)": "ID do Projeto da Fatura Ninja (opcional)",
"Description of task to be billed": "Descrição da tarefa a ser cobrada",
"Custom hourly rate (optional) otherwise default used": "Tarifa por hora personalizada (opcional) caso contrário padrão usado",
"A task or ticket number to check": "Uma tarefa ou número do ticket para verificar",
"A valid e-mail address to get client details for": "Um endereço de e-mail válido para obter detalhes do cliente",
"Select the invoice status for filtering.": "Selecione o status da fatura para filtragem.",
"Filter by Client ID, default is all clients.": "Filtro por ID do cliente, padrão é todos os clientes.",
"Maximum number of results to return. 9999 is default.": "O número máximo de resultados a retornar. 9999 é o padrão.",
"Select the report type.": "Selecione o tipo de relatório.",
"Client ID from Invoice Ninja": "ID do cliente a partir de Invoice Ninja",
"Descriptive text or arbitrary number (optional)": "Texto descritivo ou número arbitrário (opcional)",
"Enter a number for the whole invoice discount": "Insira um número para todo o desconto da fatura",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Selecione qualquer valor ou porcentagem para o desconto da fatura. Aplica-se à linha de itens e faturas.",
"Text that may be visible in the client portal (optional)": "Texto que pode ser visível no portal do cliente (opcional)",
"Text not visible for clients (optional)": "Texto não visível para os clientes (opcional)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "ex., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Devemos enviar o pedido ao cliente ao criar?",
"Makes the invoice active otherwise remains pending.": "Mantém a fatura ativa caso contrário permanece pendente.",
"e.g., 2024-01-20": "ex.: 2024-01-20",
"The contact first name for this client (optional)": "O primeiro nome do contato para este cliente (opcional)",
"The contact last name for this client (optional)": "O sobrenome do contato para este cliente (opcional)",
"The contact number for this client (optional)": "O número de contato para este cliente (opcional)",
"The contact email for this client (compulsory)": "O e-mail de contato para este cliente (obrigatório)",
"Should we send invoices to the client by e-mail?": "Devemos enviar faturas para o cliente por e-mail?",
"Name of this business or natural person (compulsory)": "Nome desta empresa ou pessoa natural (obrigatório)",
"Leave blank if not a business (optional)": "Deixe em branco se não for um negócio (opcional)",
"Usually street name and number (compulsory)": "Geralmente o nome e o número da rua (obrigatório)",
"Additional address details (optional)": "Detalhes adicionais do endereço (opcional)",
"City or Town name (compulsory)": "Cidade ou da cidade (obrigatório)",
"State or county or similar (optional)": "Estado ou país ou semelhante (opcional)",
"Postal code (optional)": "Código postal (opcional)",
"Choose one": "Escolha um",
"Enter a number. How many times should this bill be generated": "Insira um número. Quantas vezes esta fatura deve ser gerada",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Insira um número. 1-12 - corresponde à lista suspensa acima [Diariamente sendo 1, Semanal 2, etc..]!",
"Recurring Invoice ID from Invoice Ninja": "Recorrente ID de Fatura de Ninja",
"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..",
"Unpaid Invoices": "Faturas não pagas",
"Paid Invoices": "Faturas pagas",
"Overdue Invoices": "Faturas Vencidas",
"All Invoices": "Todas as Faturas",
"Invoices": "Faturas",
"Amount": "Quantidade",
"Percentage": "Porcentagem",
"Use override below": "Use substituição abaixo",
"Daily": "Diariamente",
"Weekly": "Semanalmente",
"2 Weeks": "2 Semanas",
"4 Weeks": "4 Semanas",
"Monthly": "Mensual",
"Two Months": "Dois meses",
"Quarterly": "Trimestralmente",
"Four Months": "Quatro meses",
"Semi Annually": "Semi Anualmente",
"Annually": "Anualmente",
"Two Years": "Dois anos",
"Three Years": "Três anos",
"Start": "Iniciar",
"Stop": "Interromper",
"Send Now": "Envie Agora",
"Restore": "RESTAURAR",
"Archive": "Arquivo",
"Delete": "Apagar",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA"
}

View File

@@ -0,0 +1,144 @@
{
"Invoice Ninja": "Счет Ниндзя",
"Free open-source invoicing tool": "Бесплатный инструмент выставления счетов с открытым исходным кодом",
"Base URL": "Базовый URL",
"API Token": "API Token",
"Enter the base URL": "Введите базовый URL",
"Enter the API token": "Введите API token",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Пожалуйста, проверьте https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n чтобы узнать, как получить API токен",
"Create Task": "Создать задачу",
"Check Task Existence": "Проверить наличие задачи",
"Get Client Details from e-mail": "Получить детали клиента по электронной почте",
"Get Invoices": "Получать счета",
"Get Report": "Получить отчет",
"Create Invoice": "Создать счет",
"Create Client": "Создать клиента",
"Create Recurring Invoice": "Создать повторяющийся счет",
"Perform Action on Recurring Invoice": "Выполнить действия по периодическому счету",
"Custom API Call": "Пользовательский вызов API",
"Creates a task instance in Invoice Ninja for billing purposes.": "Создает экземпляр задачи в счет-фактуре Ninja для целей выставления счетов.",
"Verify if a Task Already Exists": "Проверьте, существует ли задача",
"Gets the client details if they exist by e-mail.": "Получает данные клиента, если они существуют по электронной почте.",
"Gets data for invoices.": "Получает данные для счетов-фактур.",
"Gets report data from InvoiceNinja.": "Получает отчет от InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Создает счет в счет-фактуре Ninja для расчетов.",
"Creates a new client in InvoiceNinja.": "Создает нового клиента в InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Создает повторяющийся счет в счет-фактуре Ninja для расчетов.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Действия включают: start, stop, send_now, restore, archive, delete.",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Task or Ticket Number (alphanumeric)": "Номер задачи или Заявки (буквенно-цифровый)",
"Client ID (alphanumeric)": "ID клиента (буквенно-цифровый)",
"Project ID (alphanumeric)": "ID проекта (буквенно-цифровый)",
"Description of task": "Описание задачи",
"Custom hourly rate": "Настраиваемая почасовая ставка",
"Client e-mail address": "Адрес электронной почты клиента",
"Invoice Status": "Статус счета",
"Client ID": "ID клиента",
"Max Results": "Макс. результатов",
"Report Type": "Тип отчета",
"Purchase Order Number (alphanumeric)": "Номер заказа на покупку (буквенно-цифровый)",
"Apply discount": "Применить скидку",
"Type of discount": "Тип скидки",
"Public notes for invoice": "Публичные заметки к счету",
"Private notes for invoice": "Приватные заметки к счету",
"Order Items JSON string": "Строка заказа JSON элементов",
"Send invoice to the client by InvoiceNinja e-mail?": "Отправить счет клиенту по электронной почте InvoiceNinja?",
"Mark the invoice as sent?": "Отметить счет-фактуру как отправленный?",
"Invoice due date": "Срок оплаты счёта",
"Client First Name (alphanumeric)": "Имя клиента (буквенно-цифровый)",
"Client Last Name (alphanumeric)": "Фамилия клиента (буквенно-цифровый)",
"Client Contact No (alphanumeric)": "Контакт клиента № (буквенно-цифровый)",
"Client e-mail (alphanumeric)": "Электронная почта клиента (буквенно-цифровый)",
"Send invoices to the client": "Отправлять счета клиенту",
"Business Name (alphanumeric)": "Бизнес Имя (буквенно-цифровый)",
"Client Tax Number (alphanumeric)": "Номер налога клиента (буквенно-цифровый)",
"Private notes for client": "Личные заметки для клиента",
"Client address 1 (alphanumeric)": "Адрес клиента 1 (буквенно-цифровый)",
"Client address 2 (alphanumeric)": "Адрес клиента 2 (буквенно-цифровый)",
"Client City/Town (alphanumeric)": "Город клиента/город (буквенно-цифровый)",
"Client State (alphanumeric)": "Состояние клиента (альфанумерический)",
"Client Postcode (alphanumeric)": "Почтовый индекс клиента (альфанумерический)",
"Frequency of billing": "Частота выставления счетов",
"No of billing cycles": "Нет биллинговых циклов",
"Override Frequency using Frequency ID (optional)": "Переопределить частоту с помощью идентификатора частоты (опционально)",
"Invoice next send date": "Счет на дату следующей отправки",
"Invoice last sent date": "Дата последней отправки счёта",
"Recurring Invoice ID (alphanumeric)": "Код повторяющегося счета (буквенно-цифровый)",
"Action to perform": "Действие для выполнения",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "Уникальная задача или номер билета, которые не были использованы ранее в Счете Нинджа",
"Client ID from Invoice Ninja (optional)": "ID клиента из счета-фактуры Ninja (опционально)",
"Project ID from Invoice Ninja (optional)": "ID проекта из счета-фактуры Ninja (опционально)",
"Description of task to be billed": "Описание задачи, подлежащей оплате",
"Custom hourly rate (optional) otherwise default used": "Пользовательская почасовая ставка (необязательно) в противном случае используется по умолчанию",
"A task or ticket number to check": "Номер задачи или заявки для проверки",
"A valid e-mail address to get client details for": "Действительный адрес электронной почты для получения информации о клиенте",
"Select the invoice status for filtering.": "Выберите статус счета для фильтрации.",
"Filter by Client ID, default is all clients.": "Фильтр по ID клиента, по умолчанию - все клиенты.",
"Maximum number of results to return. 9999 is default.": "Максимальное количество результатов возврата. 9999 по умолчанию.",
"Select the report type.": "Выберите тип отчета.",
"Client ID from Invoice Ninja": "ID клиента из счета-фактуры Ninja",
"Descriptive text or arbitrary number (optional)": "Описательный текст или произвольное число (необязательно)",
"Enter a number for the whole invoice discount": "Введите номер для всей скидки на счет",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Выберите сумму или процент для скидки на счет-фактуру. Применяется к позициям и счету.",
"Text that may be visible in the client portal (optional)": "Текст, который может быть виден на портале клиента (опционально)",
"Text not visible for clients (optional)": "Текст не виден для клиентов (опционально)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "например, [{ \"quantity\":1,\"product_key\":\"Ключ продукта\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Должны ли мы выслать счет клиенту при его создании?",
"Makes the invoice active otherwise remains pending.": "Активирует счет-фактуру в противном случае остается в ожидании.",
"e.g., 2024-01-20": "например, 2024-01-20",
"The contact first name for this client (optional)": "Имя контакта для этого клиента (опционально)",
"The contact last name for this client (optional)": "Фамилия контакта для этого клиента (опционально)",
"The contact number for this client (optional)": "Контактный номер для этого клиента (опционально)",
"The contact email for this client (compulsory)": "Контактное письмо для этого клиента (обязательно)",
"Should we send invoices to the client by e-mail?": "Должны ли мы отправлять счета клиенту по электронной почте?",
"Name of this business or natural person (compulsory)": "Имя этого предприятия или физического лица (обязательно)",
"Leave blank if not a business (optional)": "Оставить пустым, если не бизнес (опционально)",
"Usually street name and number (compulsory)": "Обычно название и номер улицы (обязательно)",
"Additional address details (optional)": "Дополнительная информация об адресе (опционально)",
"City or Town name (compulsory)": "Название города или города (обязательно)",
"State or county or similar (optional)": "Государство или графство или аналогичное (факультативно)",
"Postal code (optional)": "Почтовый индекс (опционально)",
"Choose one": "Выберите один",
"Enter a number. How many times should this bill be generated": "Введите число. Сколько раз должен быть сгенерирован счет",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Введите число. 1-12 - соответствует выпадающему списку [Ежедневно 1, неделю 2 и т.д..]!",
"Recurring Invoice ID from Invoice Ninja": "Повторяющийся идентификатор счета-фактуры Ninja",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"Unpaid Invoices": "Неоплаченные счета",
"Paid Invoices": "Платные счета",
"Overdue Invoices": "Просроченные счета",
"All Invoices": "Все счета",
"Invoices": "Счета",
"Amount": "Сумма",
"Percentage": "Процент",
"Use override below": "Использовать переопределение ниже",
"Daily": "Ежедневно",
"Weekly": "Еженедельно",
"2 Weeks": "2 недели",
"4 Weeks": "4 недели",
"Monthly": "Ежемесячно",
"Two Months": "Два месяца",
"Quarterly": "Квартал",
"Four Months": "Четыре месяца",
"Semi Annually": "Пол на ежегодной основе",
"Annually": "Ежегодно",
"Two Years": "Два года",
"Three Years": "Три года",
"Start": "Начать",
"Stop": "Остановить",
"Send Now": "Отправить сейчас",
"Restore": "Восстановить",
"Archive": "Архивировать",
"Delete": "Delete",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD"
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "Free open-source invoicing tool",
"Base URL": "Base URL",
"API Token": "API Token",
"Enter the base URL": "Enter the base URL",
"Enter the API token": "Enter the API token",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token",
"Create Task": "Create Task",
"Check Task Existence": "Check Task Existence",
"Get Client Details from e-mail": "Get Client Details from e-mail",
"Get Invoices": "Get Invoices",
"Get Report": "Get Report",
"Create Invoice": "Create Invoice",
"Create Client": "Create Client",
"Create Recurring Invoice": "Create Recurring Invoice",
"Perform Action on Recurring Invoice": "Perform Action on Recurring Invoice",
"Custom API Call": "Custom API Call",
"Creates a task instance in Invoice Ninja for billing purposes.": "Creates a task instance in Invoice Ninja for billing purposes.",
"Verify if a Task Already Exists": "Verify if a Task Already Exists",
"Gets the client details if they exist by e-mail.": "Gets the client details if they exist by e-mail.",
"Gets data for invoices.": "Gets data for invoices.",
"Gets report data from InvoiceNinja.": "Gets report data from InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Creates an invoice in Invoice Ninja for billing purposes.",
"Creates a new client in InvoiceNinja.": "Creates a new client in InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Creates a recurring invoice in Invoice Ninja for billing purposes.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Actions include: start, stop, send_now, restore, archive, delete.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Task or Ticket Number (alphanumeric)": "Task or Ticket Number (alphanumeric)",
"Client ID (alphanumeric)": "Client ID (alphanumeric)",
"Project ID (alphanumeric)": "Project ID (alphanumeric)",
"Description of task": "Description of task",
"Custom hourly rate": "Custom hourly rate",
"Client e-mail address": "Client e-mail address",
"Invoice Status": "Invoice Status",
"Client ID": "Client ID",
"Max Results": "Max Results",
"Report Type": "Report Type",
"Purchase Order Number (alphanumeric)": "Purchase Order Number (alphanumeric)",
"Apply discount": "Apply discount",
"Type of discount": "Type of discount",
"Public notes for invoice": "Public notes for invoice",
"Private notes for invoice": "Private notes for invoice",
"Order Items JSON string": "Order Items JSON string",
"Send invoice to the client by InvoiceNinja e-mail?": "Send invoice to the client by InvoiceNinja e-mail?",
"Mark the invoice as sent?": "Mark the invoice as sent?",
"Invoice due date": "Invoice due date",
"Client First Name (alphanumeric)": "Client First Name (alphanumeric)",
"Client Last Name (alphanumeric)": "Client Last Name (alphanumeric)",
"Client Contact No (alphanumeric)": "Client Contact No (alphanumeric)",
"Client e-mail (alphanumeric)": "Client e-mail (alphanumeric)",
"Send invoices to the client": "Send invoices to the client",
"Business Name (alphanumeric)": "Business Name (alphanumeric)",
"Client Tax Number (alphanumeric)": "Client Tax Number (alphanumeric)",
"Private notes for client": "Private notes for client",
"Client address 1 (alphanumeric)": "Client address 1 (alphanumeric)",
"Client address 2 (alphanumeric)": "Client address 2 (alphanumeric)",
"Client City/Town (alphanumeric)": "Client City/Town (alphanumeric)",
"Client State (alphanumeric)": "Client State (alphanumeric)",
"Client Postcode (alphanumeric)": "Client Postcode (alphanumeric)",
"Frequency of billing": "Frequency of billing",
"No of billing cycles": "No of billing cycles",
"Override Frequency using Frequency ID (optional)": "Override Frequency using Frequency ID (optional)",
"Invoice next send date": "Invoice next send date",
"Invoice last sent date": "Invoice last sent date",
"Recurring Invoice ID (alphanumeric)": "Recurring Invoice ID (alphanumeric)",
"Action to perform": "Action to perform",
"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)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "A unique task or ticket number that has not been used before in Invoice Ninja",
"Client ID from Invoice Ninja (optional)": "Client ID from Invoice Ninja (optional)",
"Project ID from Invoice Ninja (optional)": "Project ID from Invoice Ninja (optional)",
"Description of task to be billed": "Description of task to be billed",
"Custom hourly rate (optional) otherwise default used": "Custom hourly rate (optional) otherwise default used",
"A task or ticket number to check": "A task or ticket number to check",
"A valid e-mail address to get client details for": "A valid e-mail address to get client details for",
"Select the invoice status for filtering.": "Select the invoice status for filtering.",
"Filter by Client ID, default is all clients.": "Filter by Client ID, default is all clients.",
"Maximum number of results to return. 9999 is default.": "Maximum number of results to return. 9999 is default.",
"Select the report type.": "Select the report type.",
"Client ID from Invoice Ninja": "Client ID from Invoice Ninja",
"Descriptive text or arbitrary number (optional)": "Descriptive text or arbitrary number (optional)",
"Enter a number for the whole invoice discount": "Enter a number for the whole invoice discount",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Select either amount or percentage for invoice discount. Applies to line items and invoice.",
"Text that may be visible in the client portal (optional)": "Text that may be visible in the client portal (optional)",
"Text not visible for clients (optional)": "Text not visible for clients (optional)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Should we send the invoice to the client on creation?",
"Makes the invoice active otherwise remains pending.": "Makes the invoice active otherwise remains pending.",
"e.g., 2024-01-20": "e.g., 2024-01-20",
"The contact first name for this client (optional)": "The contact first name for this client (optional)",
"The contact last name for this client (optional)": "The contact last name for this client (optional)",
"The contact number for this client (optional)": "The contact number for this client (optional)",
"The contact email for this client (compulsory)": "The contact email for this client (compulsory)",
"Should we send invoices to the client by e-mail?": "Should we send invoices to the client by e-mail?",
"Name of this business or natural person (compulsory)": "Name of this business or natural person (compulsory)",
"Leave blank if not a business (optional)": "Leave blank if not a business (optional)",
"Usually street name and number (compulsory)": "Usually street name and number (compulsory)",
"Additional address details (optional)": "Additional address details (optional)",
"City or Town name (compulsory)": "City or Town name (compulsory)",
"State or county or similar (optional)": "State or county or similar (optional)",
"Postal code (optional)": "Postal code (optional)",
"Choose one": "Choose one",
"Enter a number. How many times should this bill be generated": "Enter a number. How many times should this bill be generated",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!",
"Recurring Invoice ID from Invoice Ninja": "Recurring Invoice ID from Invoice Ninja",
"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..",
"Unpaid Invoices": "Unpaid Invoices",
"Paid Invoices": "Paid Invoices",
"Overdue Invoices": "Overdue Invoices",
"All Invoices": "All Invoices",
"Invoices": "Invoices",
"Amount": "Amount",
"Percentage": "Percentage",
"Use override below": "Use override below",
"Daily": "Daily",
"Weekly": "Weekly",
"2 Weeks": "2 Weeks",
"4 Weeks": "4 Weeks",
"Monthly": "Monthly",
"Two Months": "Two Months",
"Quarterly": "Quarterly",
"Four Months": "Four Months",
"Semi Annually": "Semi Annually",
"Annually": "Annually",
"Two Years": "Two Years",
"Three Years": "Three Years",
"Start": "Start",
"Stop": "Stop",
"Send Now": "Send Now",
"Restore": "Restore",
"Archive": "Archive",
"Delete": "Delete",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD"
}

View File

@@ -0,0 +1,144 @@
{
"Invoice Ninja": "Invoice Ninja",
"Free open-source invoicing tool": "Free open-source invoicing tool",
"Base URL": "Base URL",
"API Token": "API Token",
"Enter the base URL": "Enter the base URL",
"Enter the API token": "Enter the API token",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token",
"Create Task": "Create Task",
"Check Task Existence": "Check Task Existence",
"Get Client Details from e-mail": "Get Client Details from e-mail",
"Get Invoices": "Get Invoices",
"Get Report": "Get Report",
"Create Invoice": "Create Invoice",
"Create Client": "Create Client",
"Create Recurring Invoice": "Create Recurring Invoice",
"Perform Action on Recurring Invoice": "Perform Action on Recurring Invoice",
"Custom API Call": "Custom API Call",
"Creates a task instance in Invoice Ninja for billing purposes.": "Creates a task instance in Invoice Ninja for billing purposes.",
"Verify if a Task Already Exists": "Verify if a Task Already Exists",
"Gets the client details if they exist by e-mail.": "Gets the client details if they exist by e-mail.",
"Gets data for invoices.": "Gets data for invoices.",
"Gets report data from InvoiceNinja.": "Gets report data from InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Creates an invoice in Invoice Ninja for billing purposes.",
"Creates a new client in InvoiceNinja.": "Creates a new client in InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Creates a recurring invoice in Invoice Ninja for billing purposes.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Actions include: start, stop, send_now, restore, archive, delete.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Task or Ticket Number (alphanumeric)": "Task or Ticket Number (alphanumeric)",
"Client ID (alphanumeric)": "Client ID (alphanumeric)",
"Project ID (alphanumeric)": "Project ID (alphanumeric)",
"Description of task": "Description of task",
"Custom hourly rate": "Custom hourly rate",
"Client e-mail address": "Client e-mail address",
"Invoice Status": "Invoice Status",
"Client ID": "ID khách hàng",
"Max Results": "Max Results",
"Report Type": "Report Type",
"Purchase Order Number (alphanumeric)": "Purchase Order Number (alphanumeric)",
"Apply discount": "Apply discount",
"Type of discount": "Type of discount",
"Public notes for invoice": "Public notes for invoice",
"Private notes for invoice": "Private notes for invoice",
"Order Items JSON string": "Order Items JSON string",
"Send invoice to the client by InvoiceNinja e-mail?": "Send invoice to the client by InvoiceNinja e-mail?",
"Mark the invoice as sent?": "Mark the invoice as sent?",
"Invoice due date": "Invoice due date",
"Client First Name (alphanumeric)": "Client First Name (alphanumeric)",
"Client Last Name (alphanumeric)": "Client Last Name (alphanumeric)",
"Client Contact No (alphanumeric)": "Client Contact No (alphanumeric)",
"Client e-mail (alphanumeric)": "Client e-mail (alphanumeric)",
"Send invoices to the client": "Send invoices to the client",
"Business Name (alphanumeric)": "Business Name (alphanumeric)",
"Client Tax Number (alphanumeric)": "Client Tax Number (alphanumeric)",
"Private notes for client": "Private notes for client",
"Client address 1 (alphanumeric)": "Client address 1 (alphanumeric)",
"Client address 2 (alphanumeric)": "Client address 2 (alphanumeric)",
"Client City/Town (alphanumeric)": "Client City/Town (alphanumeric)",
"Client State (alphanumeric)": "Client State (alphanumeric)",
"Client Postcode (alphanumeric)": "Client Postcode (alphanumeric)",
"Frequency of billing": "Frequency of billing",
"No of billing cycles": "No of billing cycles",
"Override Frequency using Frequency ID (optional)": "Override Frequency using Frequency ID (optional)",
"Invoice next send date": "Invoice next send date",
"Invoice last sent date": "Invoice last sent date",
"Recurring Invoice ID (alphanumeric)": "Recurring Invoice ID (alphanumeric)",
"Action to perform": "Action to perform",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "A unique task or ticket number that has not been used before in Invoice Ninja",
"Client ID from Invoice Ninja (optional)": "Client ID from Invoice Ninja (optional)",
"Project ID from Invoice Ninja (optional)": "Project ID from Invoice Ninja (optional)",
"Description of task to be billed": "Description of task to be billed",
"Custom hourly rate (optional) otherwise default used": "Custom hourly rate (optional) otherwise default used",
"A task or ticket number to check": "A task or ticket number to check",
"A valid e-mail address to get client details for": "A valid e-mail address to get client details for",
"Select the invoice status for filtering.": "Select the invoice status for filtering.",
"Filter by Client ID, default is all clients.": "Filter by Client ID, default is all clients.",
"Maximum number of results to return. 9999 is default.": "Maximum number of results to return. 9999 is default.",
"Select the report type.": "Select the report type.",
"Client ID from Invoice Ninja": "Client ID from Invoice Ninja",
"Descriptive text or arbitrary number (optional)": "Descriptive text or arbitrary number (optional)",
"Enter a number for the whole invoice discount": "Enter a number for the whole invoice discount",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Select either amount or percentage for invoice discount. Applies to line items and invoice.",
"Text that may be visible in the client portal (optional)": "Text that may be visible in the client portal (optional)",
"Text not visible for clients (optional)": "Text not visible for clients (optional)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Should we send the invoice to the client on creation?",
"Makes the invoice active otherwise remains pending.": "Makes the invoice active otherwise remains pending.",
"e.g., 2024-01-20": "e.g., 2024-01-20",
"The contact first name for this client (optional)": "The contact first name for this client (optional)",
"The contact last name for this client (optional)": "The contact last name for this client (optional)",
"The contact number for this client (optional)": "The contact number for this client (optional)",
"The contact email for this client (compulsory)": "The contact email for this client (compulsory)",
"Should we send invoices to the client by e-mail?": "Should we send invoices to the client by e-mail?",
"Name of this business or natural person (compulsory)": "Name of this business or natural person (compulsory)",
"Leave blank if not a business (optional)": "Leave blank if not a business (optional)",
"Usually street name and number (compulsory)": "Usually street name and number (compulsory)",
"Additional address details (optional)": "Additional address details (optional)",
"City or Town name (compulsory)": "City or Town name (compulsory)",
"State or county or similar (optional)": "State or county or similar (optional)",
"Postal code (optional)": "Postal code (optional)",
"Choose one": "Choose one",
"Enter a number. How many times should this bill be generated": "Enter a number. How many times should this bill be generated",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!",
"Recurring Invoice ID from Invoice Ninja": "Recurring Invoice ID from Invoice Ninja",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Unpaid Invoices": "Unpaid Invoices",
"Paid Invoices": "Paid Invoices",
"Overdue Invoices": "Overdue Invoices",
"All Invoices": "All Invoices",
"Invoices": "Invoices",
"Amount": "Amount",
"Percentage": "Percentage",
"Use override below": "Use override below",
"Daily": "Daily",
"Weekly": "Weekly",
"2 Weeks": "2 Weeks",
"4 Weeks": "4 Weeks",
"Monthly": "Monthly",
"Two Months": "Two Months",
"Quarterly": "Quarterly",
"Four Months": "Four Months",
"Semi Annually": "Semi Annually",
"Annually": "Annually",
"Two Years": "Two Years",
"Three Years": "Three Years",
"Start": "Start",
"Stop": "Stop",
"Send Now": "Send Now",
"Restore": "Restore",
"Archive": "Archive",
"Delete": "Delete",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD"
}

View File

@@ -0,0 +1,145 @@
{
"Free open-source invoicing tool": "Free open-source invoicing tool",
"Base URL": "基本网址",
"API Token": "API Token",
"Enter the base URL": "Enter the base URL",
"Enter the API token": "Enter the API token",
"Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token": "Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token\n to see how to get the API token",
"Create Task": "Create Task",
"Check Task Existence": "Check Task Existence",
"Get Client Details from e-mail": "Get Client Details from e-mail",
"Get Invoices": "Get Invoices",
"Get Report": "Get Report",
"Create Invoice": "Create Invoice",
"Create Client": "Create Client",
"Create Recurring Invoice": "Create Recurring Invoice",
"Perform Action on Recurring Invoice": "Perform Action on Recurring Invoice",
"Custom API Call": "自定义 API 呼叫",
"Creates a task instance in Invoice Ninja for billing purposes.": "Creates a task instance in Invoice Ninja for billing purposes.",
"Verify if a Task Already Exists": "Verify if a Task Already Exists",
"Gets the client details if they exist by e-mail.": "Gets the client details if they exist by e-mail.",
"Gets data for invoices.": "Gets data for invoices.",
"Gets report data from InvoiceNinja.": "Gets report data from InvoiceNinja.",
"Creates an invoice in Invoice Ninja for billing purposes.": "Creates an invoice in Invoice Ninja for billing purposes.",
"Creates a new client in InvoiceNinja.": "Creates a new client in InvoiceNinja.",
"Creates a recurring invoice in Invoice Ninja for billing purposes.": "Creates a recurring invoice in Invoice Ninja for billing purposes.",
"Actions include: start, stop, send_now, restore, archive, delete.": "Actions include: start, stop, send_now, restore, archive, delete.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Task or Ticket Number (alphanumeric)": "Task or Ticket Number (alphanumeric)",
"Client ID (alphanumeric)": "Client ID (alphanumeric)",
"Project ID (alphanumeric)": "Project ID (alphanumeric)",
"Description of task": "Description of task",
"Custom hourly rate": "Custom hourly rate",
"Client e-mail address": "Client e-mail address",
"Invoice Status": "Invoice Status",
"Client ID": "客户端ID",
"Max Results": "Max Results",
"Report Type": "Report Type",
"Purchase Order Number (alphanumeric)": "Purchase Order Number (alphanumeric)",
"Apply discount": "Apply discount",
"Type of discount": "Type of discount",
"Public notes for invoice": "Public notes for invoice",
"Private notes for invoice": "Private notes for invoice",
"Order Items JSON string": "Order Items JSON string",
"Send invoice to the client by InvoiceNinja e-mail?": "Send invoice to the client by InvoiceNinja e-mail?",
"Mark the invoice as sent?": "Mark the invoice as sent?",
"Invoice due date": "Invoice due date",
"Client First Name (alphanumeric)": "Client First Name (alphanumeric)",
"Client Last Name (alphanumeric)": "Client Last Name (alphanumeric)",
"Client Contact No (alphanumeric)": "Client Contact No (alphanumeric)",
"Client e-mail (alphanumeric)": "Client e-mail (alphanumeric)",
"Send invoices to the client": "Send invoices to the client",
"Business Name (alphanumeric)": "Business Name (alphanumeric)",
"Client Tax Number (alphanumeric)": "Client Tax Number (alphanumeric)",
"Private notes for client": "Private notes for client",
"Client address 1 (alphanumeric)": "Client address 1 (alphanumeric)",
"Client address 2 (alphanumeric)": "Client address 2 (alphanumeric)",
"Client City/Town (alphanumeric)": "Client City/Town (alphanumeric)",
"Client State (alphanumeric)": "Client State (alphanumeric)",
"Client Postcode (alphanumeric)": "Client Postcode (alphanumeric)",
"Frequency of billing": "Frequency of billing",
"No of billing cycles": "No of billing cycles",
"Override Frequency using Frequency ID (optional)": "Override Frequency using Frequency ID (optional)",
"Invoice next send date": "Invoice next send date",
"Invoice last sent date": "Invoice last sent date",
"Recurring Invoice ID (alphanumeric)": "Recurring Invoice ID (alphanumeric)",
"Action to perform": "Action to perform",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"A unique task or ticket number that has not been used before in Invoice Ninja": "A unique task or ticket number that has not been used before in Invoice Ninja",
"Client ID from Invoice Ninja (optional)": "Client ID from Invoice Ninja (optional)",
"Project ID from Invoice Ninja (optional)": "Project ID from Invoice Ninja (optional)",
"Description of task to be billed": "Description of task to be billed",
"Custom hourly rate (optional) otherwise default used": "Custom hourly rate (optional) otherwise default used",
"A task or ticket number to check": "A task or ticket number to check",
"A valid e-mail address to get client details for": "A valid e-mail address to get client details for",
"Select the invoice status for filtering.": "Select the invoice status for filtering.",
"Filter by Client ID, default is all clients.": "Filter by Client ID, default is all clients.",
"Maximum number of results to return. 9999 is default.": "Maximum number of results to return. 9999 is default.",
"Select the report type.": "Select the report type.",
"Client ID from Invoice Ninja": "Client ID from Invoice Ninja",
"Descriptive text or arbitrary number (optional)": "Descriptive text or arbitrary number (optional)",
"Enter a number for the whole invoice discount": "Enter a number for the whole invoice discount",
"Select either amount or percentage for invoice discount. Applies to line items and invoice.": "Select either amount or percentage for invoice discount. Applies to line items and invoice.",
"Text that may be visible in the client portal (optional)": "Text that may be visible in the client portal (optional)",
"Text not visible for clients (optional)": "Text not visible for clients (optional)",
"e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]": "e.g., [{ \"quantity\":1,\"product_key\":\"product key\", \"discount\": \"0\" }]",
"Should we send the invoice to the client on creation?": "Should we send the invoice to the client on creation?",
"Makes the invoice active otherwise remains pending.": "Makes the invoice active otherwise remains pending.",
"e.g., 2024-01-20": "e.g., 2024-01-20",
"The contact first name for this client (optional)": "The contact first name for this client (optional)",
"The contact last name for this client (optional)": "The contact last name for this client (optional)",
"The contact number for this client (optional)": "The contact number for this client (optional)",
"The contact email for this client (compulsory)": "The contact email for this client (compulsory)",
"Should we send invoices to the client by e-mail?": "Should we send invoices to the client by e-mail?",
"Name of this business or natural person (compulsory)": "Name of this business or natural person (compulsory)",
"Leave blank if not a business (optional)": "Leave blank if not a business (optional)",
"Usually street name and number (compulsory)": "Usually street name and number (compulsory)",
"Additional address details (optional)": "Additional address details (optional)",
"City or Town name (compulsory)": "City or Town name (compulsory)",
"State or county or similar (optional)": "State or county or similar (optional)",
"Postal code (optional)": "Postal code (optional)",
"Choose one": "Choose one",
"Enter a number. How many times should this bill be generated": "Enter a number. How many times should this bill be generated",
"Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!": "Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!",
"Recurring Invoice ID from Invoice Ninja": "Recurring Invoice ID from Invoice Ninja",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Unpaid Invoices": "Unpaid Invoices",
"Paid Invoices": "Paid Invoices",
"Overdue Invoices": "Overdue Invoices",
"All Invoices": "All Invoices",
"Invoices": "Invoices",
"Amount": "Amount",
"Percentage": "Percentage",
"Use override below": "Use override below",
"Daily": "Daily",
"Weekly": "Weekly",
"2 Weeks": "2 Weeks",
"4 Weeks": "4 Weeks",
"Monthly": "Monthly",
"Two Months": "Two Months",
"Quarterly": "Quarterly",
"Four Months": "Four Months",
"Semi Annually": "Semi Annually",
"Annually": "Annually",
"Two Years": "Two Years",
"Three Years": "Three Years",
"Start": "Start",
"Stop": "停止",
"Send Now": "Send Now",
"Restore": "Restore",
"Archive": "Archive",
"Delete": "删除",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色"
}

View File

@@ -0,0 +1,65 @@
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import {
PieceAuth,
Property,
createPiece,
} from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { createTask } from './lib/actions/create-task';
import { getClient } from './lib/actions/get-client';
import { getInvoices } from './lib/actions/get-invoices';
import { getReport } from './lib/actions/get-report';
import { existsTask } from './lib/actions/task-exists';
import { createInvoice } from './lib/actions/create-invoice';
import { createClient } from './lib/actions/create-client';
import { createRecurringInvoice } from './lib/actions/create-recurring';
import { actionRecurringInvoice } from './lib/actions/action-recurring';
export const invoiceninjaAuth = PieceAuth.CustomAuth({
props: {
base_url: Property.ShortText({
displayName: 'Base URL',
description: 'Enter the base URL',
required: true,
}),
access_token: Property.ShortText({
displayName: 'API Token',
description: 'Enter the API token',
required: true,
}),
},
description: `Please check https://invoice-ninja.readthedocs.io/en/latest/api_tokens.html#create-token
to see how to get the API token`,
required: true,
});
export const invoiceninja = createPiece({
displayName: 'Invoice Ninja',
description: 'Free open-source invoicing tool',
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/invoiceninja.png',
categories: [PieceCategory.ACCOUNTING],
authors: ["buttonsbond","kishanprmr","MoShizzle","AbdulTheActivePiecer","khaledmashaly","abuaboud"],
auth: invoiceninjaAuth,
actions: [
createTask,
existsTask,
getClient,
getInvoices,
getReport,
createInvoice,
createClient,
createRecurringInvoice,
actionRecurringInvoice,
createCustomApiCallAction({
baseUrl: (auth) =>
auth ? `${(auth).props.base_url.replace(/\/$/, '')}/api/v1` : '',
auth: invoiceninjaAuth,
authMapping: async (auth) => ({
'X-Api-Token': (auth).props.access_token,
}),
}),
],
triggers: [],
});

View File

@@ -0,0 +1,89 @@
import {
createAction,
Property,
} from '@activepieces/pieces-framework';
import { invoiceninjaAuth } from '../..';
export const actionRecurringInvoice = createAction({
auth: invoiceninjaAuth,
name: 'action_recurring_invoice',
displayName: 'Perform Action on Recurring Invoice',
description:
'Actions include: start, stop, send_now, restore, archive, delete.',
props: {
recurring_id: Property.LongText({
displayName: 'Recurring Invoice ID (alphanumeric)',
description: 'Recurring Invoice ID from Invoice Ninja',
required: true,
}),
actionRecurring: Property.StaticDropdown({
displayName: 'Action to perform',
description: 'Choose one',
defaultValue: 1,
required: true,
options: {
options: [
{
label: 'Start',
value: 'start',
},
{
label: 'Stop',
value: 'stop',
},
{
label: 'Send Now',
value: 'send_now',
},
{
label: 'Restore',
value: 'restore',
},
{
label: 'Archive',
value: 'archive',
},
{
label: 'Delete',
value: 'delete',
},
],
},
}),
},
async run(context) {
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
'Content-Type': 'application/json',
};
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
const i: string[] = [context.propsValue.recurring_id];
const createRequestBody = {
action: context.propsValue.actionRecurring,
ids: i,
};
const createRequestResponse = await fetch(
`${baseUrl}/api/v1/recurring_invoices/bulk`,
{
method: 'POST',
headers,
body: JSON.stringify(createRequestBody),
}
);
if (!createRequestResponse.ok) {
throw new Error(
`Failed to perform action on recurring invoice. Status: ${createRequestResponse.status}`
);
}
const createResponseBody = await createRequestResponse.json();
return createResponseBody;
},
});

View File

@@ -0,0 +1,119 @@
import {
createAction,
Property,
} from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { invoiceninjaAuth } from '../..';
export const createClient = createAction({
auth: invoiceninjaAuth,
name: 'create_client',
displayName: 'Create Client',
description: 'Creates a new client in InvoiceNinja.',
props: {
client_first_name: Property.LongText({
displayName: 'Client First Name (alphanumeric)',
description: 'The contact first name for this client (optional)',
required: false,
}),
client_last_name: Property.ShortText({
displayName: 'Client Last Name (alphanumeric)',
description: 'The contact last name for this client (optional)',
required: false,
}),
client_phone: Property.ShortText({
displayName: 'Client Contact No (alphanumeric)',
description: 'The contact number for this client (optional)',
required: false,
}),
client_email: Property.ShortText({
displayName: 'Client e-mail (alphanumeric)',
description: 'The contact email for this client (compulsory)',
required: true,
}),
client_send_email: Property.Checkbox({
displayName: 'Send invoices to the client',
description: 'Should we send invoices to the client by e-mail?',
defaultValue: false,
required: true,
}),
client_business_name: Property.ShortText({
displayName: 'Business Name (alphanumeric)',
description: 'Name of this business or natural person (compulsory)',
required: true,
}),
client_tax_no: Property.ShortText({
displayName: 'Client Tax Number (alphanumeric)',
description: 'Leave blank if not a business (optional)',
required: false,
}),
client_private_notes: Property.ShortText({
displayName: 'Private notes for client',
description: 'Text not visible for clients (optional)',
required: false,
}),
client_address1: Property.LongText({
displayName: 'Client address 1 (alphanumeric)',
description: 'Usually street name and number (compulsory)',
required: true,
}),
client_address2: Property.LongText({
displayName: 'Client address 2 (alphanumeric)',
description: 'Additional address details (optional)',
required: false,
}),
client_city: Property.ShortText({
displayName: 'Client City/Town (alphanumeric)',
description: 'City or Town name (compulsory)',
required: true,
}),
client_state: Property.ShortText({
displayName: 'Client State (alphanumeric)',
description: 'State or county or similar (optional)',
required: false,
}),
client_postcode: Property.ShortText({
displayName: 'Client Postcode (alphanumeric)',
description: 'Postal code (optional)',
required: false,
}),
},
async run(context) {
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
'Content-Type': 'application/json',
};
const queryParams = new URLSearchParams();
queryParams.append('name', context.propsValue.client_business_name);
queryParams.append('private_notes', context.propsValue.client_private_notes || '');
queryParams.append('address1', context.propsValue.client_address1 || '');
queryParams.append('address2', context.propsValue.client_address2 || '');
queryParams.append('city', context.propsValue.client_city || '');
queryParams.append('state', context.propsValue.client_state || '');
queryParams.append('postal_code', context.propsValue.client_postcode || '');
queryParams.append('vat_number', context.propsValue.client_tax_no || '');
const body = {
"contacts": {
"first_name": context.propsValue.client_first_name || "", "last_name": context.propsValue.client_last_name || "",
"phone": context.propsValue.client_phone || "", "email": context.propsValue.client_email || "", "send_email": context.propsValue.client_send_email || false
}
};
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
const url = `${baseUrl}/api/v1/clients/?${queryParams.toString()}`;
const httprequestdata = {
method: HttpMethod.POST,
url,
headers,
body,
};
const response = await httpClient.sendRequest(httprequestdata);
return response.body;
},
});

View File

@@ -0,0 +1,215 @@
import {
createAction,
Property,
} from '@activepieces/pieces-framework';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
import { invoiceninjaAuth } from '../..';
export const createInvoice = createAction({
auth: invoiceninjaAuth,
name: 'create_invoice',
displayName: 'Create Invoice',
description: 'Creates an invoice in Invoice Ninja for billing purposes.',
props: {
client_id: Property.LongText({
displayName: 'Client ID (alphanumeric)',
description: 'Client ID from Invoice Ninja',
required: true,
}),
purchase_order_no: Property.LongText({
displayName: 'Purchase Order Number (alphanumeric)',
description: 'Descriptive text or arbitrary number (optional)',
required: false,
}),
discount: Property.LongText({
displayName: 'Apply discount',
description: 'Enter a number for the whole invoice discount',
defaultValue: '0',
required: true,
}),
discount_type: Property.StaticDropdown({
displayName: 'Type of discount',
description: 'Select either amount or percentage for invoice discount. Applies to line items and invoice.',
defaultValue: true,
required: true,
options: {
options: [
{
label: 'Amount',
value: true
},
{
label: 'Percentage',
value: false
}
]
}
}),
public_notes: Property.LongText({
displayName: 'Public notes for invoice',
description: 'Text that may be visible in the client portal (optional)',
required: false,
}),
private_notes: Property.LongText({
displayName: 'Private notes for invoice',
description: 'Text not visible for clients (optional)',
required: false,
}),
order_items_json: Property.LongText({
displayName: 'Order Items JSON string',
description: 'e.g., [{ "quantity":1,"product_key":"product key", "discount": "0" }]',
required: true,
}),
send_email: Property.Checkbox({
displayName: 'Send invoice to the client by InvoiceNinja e-mail?',
description: 'Should we send the invoice to the client on creation?',
defaultValue: false,
required: true,
}),
mark_sent: Property.Checkbox({
displayName: 'Mark the invoice as sent?',
description: 'Makes the invoice active otherwise remains pending.',
defaultValue: false,
required: true,
}),
due_date: Property.DateTime({
displayName: 'Invoice due date',
description: 'e.g., 2024-01-20',
required: false,
}),
},
async run(context) {
await propsValidation.validateZod(context.propsValue, {
due_date: z.string().datetime().optional(),
});
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
'Content-Type': 'application/json',
};
const lineItemsArray = JSON.parse(context.propsValue.order_items_json);
if (!Array.isArray(lineItemsArray)) {
throw new Error('Invalid format for order_items_json. It should be an array of objects.');
}
if (lineItemsArray.length === 0) {
throw new Error('The line_items array must not be empty.');
}
const isValidLineItem = lineItemsArray.every(item => (
typeof item === 'object' &&
'quantity' in item && typeof item.quantity === 'number' &&
'product_key' in item && typeof item.product_key === 'string' &&
'discount' in item && typeof item.discount === 'string'
));
if (!isValidLineItem) {
throw new Error('Each item in the line_items array must be an object with "quantity" (number), "product_key" (string), and "discount" (string).');
}
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
let errorMessages = '';
try {
const lineItemsWithDetailsPromises = lineItemsArray.map(async item => {
try {
const getProductDetailsResponse = await fetch(`${baseUrl}/api/v1/products/?product_key=${item.product_key}`, {
method: 'GET',
headers,
});
if (!getProductDetailsResponse.ok) {
console.error(`Failed to get product details for ${item.product_key}. Status: ${getProductDetailsResponse.status}`);
errorMessages += `Failed to get product details for ${item.product_key}\n`;
return null;
}
const productDetailsResponseBody = await getProductDetailsResponse.json();
const productCount = productDetailsResponseBody.meta.pagination.count;
if (productCount < 1) {
console.error(`No product details found for ${item.product_key}.`);
errorMessages += `No product details found for ${item.product_key}\n`;
return null;
}
const productDetails = productDetailsResponseBody.data[0];
return {
quantity: item.quantity,
product_key: item.product_key,
product_cost: productDetails.price,
cost: productDetails.price,
notes: productDetails.notes,
discount: item.discount || '0',
is_amount_discount: context.propsValue.discount_type,
tax_name1: productDetails.tax_name1,
tax_rate1: productDetails.tax_rate1,
tax_id: productDetails.tax_id,
};
} catch (error) {
console.error(`Error getting product details for ${item.product_key}:`, error);
errorMessages += `Error getting product details for ${item.product_key}: ${error}\n`;
return null;
}
});
const lineItemsWithDetails = await Promise.all(lineItemsWithDetailsPromises);
if (errorMessages) {
// If there are error messages, throw an error with the accumulated messages
throw new Error(errorMessages.trim());
}
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth() + 1;
const day = today.getDate();
const formattedDate = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
const createInvoiceRequestBody = {
due_date: context.propsValue.due_date,
date: formattedDate,
client_id: context.propsValue.client_id || '',
po_number: context.propsValue.purchase_order_no || '',
public_notes: context.propsValue.public_notes || '',
private_notes: context.propsValue.private_notes || '',
line_items: lineItemsWithDetails,
discount: context.propsValue.discount,
is_amount_discount: context.propsValue.discount_type,
send_email: context.propsValue.send_email,
mark_sent: context.propsValue.mark_sent,
};
const createInvoiceResponse = await fetch(`${baseUrl}/api/v1/invoices`, {
method: 'POST',
headers,
body: JSON.stringify(createInvoiceRequestBody),
});
if (!createInvoiceResponse.ok) {
throw new Error(`Failed to create invoice. Status: ${createInvoiceResponse.status}`);
}
const createInvoiceResponseBody = await createInvoiceResponse.json();
return createInvoiceResponseBody;
} catch (error) {
console.error('Error creating invoice or getting product details:', error);
if (errorMessages) {
// If there are error messages, throw an error with the accumulated messages
throw new Error(errorMessages.trim());
} else {
// If there are no error messages, throw the original error
throw error;
}
}
},
});

View File

@@ -0,0 +1,286 @@
import {
createAction,
Property,
} from '@activepieces/pieces-framework';
import { z } from 'zod';
import { propsValidation } from '@activepieces/pieces-common';
import { invoiceninjaAuth } from '../..';
export const createRecurringInvoice = createAction({
auth: invoiceninjaAuth,
name: 'create_recurring_invoice',
displayName: 'Create Recurring Invoice',
description: 'Creates a recurring invoice in Invoice Ninja for billing purposes.',
props: {
client_id: Property.LongText({
displayName: 'Client ID (alphanumeric)',
description: 'Client ID from Invoice Ninja',
required: true,
}),
purchase_order_no: Property.LongText({
displayName: 'Purchase Order Number (alphanumeric)',
description: 'Descriptive text or arbitrary number (optional)',
required: false,
}),
discount: Property.LongText({
displayName: 'Apply discount',
description: 'Enter a number for the whole invoice discount',
defaultValue: '0',
required: true,
}),
discount_type: Property.StaticDropdown({
displayName: 'Type of discount',
description: 'Select either amount or percentage for invoice discount. Applies to line items and invoice.',
defaultValue: true,
required: true,
options: {
options: [
{
label: 'Amount',
value: true
},
{
label: 'Percentage',
value: false
}
]
}
}),
public_notes: Property.LongText({
displayName: 'Public notes for invoice',
description: 'Text that may be visible in the client portal (optional)',
required: false,
}),
private_notes: Property.LongText({
displayName: 'Private notes for invoice',
description: 'Text not visible for clients (optional)',
required: false,
}),
order_items_json: Property.LongText({
displayName: 'Order Items JSON string',
description: 'e.g., [{ "quantity":1,"product_key":"product key", "discount": "0" }]',
required: true,
}),
frequency: Property.StaticDropdown({
displayName: 'Frequency of billing',
description: 'Choose one',
defaultValue: 5,
required: true,
options: {
options: [
{
label: 'Use override below',
value:0,
},
{
label: 'Daily',
value: 1
},
{
label: 'Weekly',
value: 2
},
{
label: '2 Weeks',
value: 3
},
{
label: '4 Weeks',
value: 4
},
{
label: 'Monthly',
value: 5
},
{
label: 'Two Months',
value: 6
},
{
label: 'Quarterly',
value: 7
},
{
label: 'Four Months',
value: 8
},
{
label: 'Semi Annually',
value: 9
},
{
label: 'Annually',
value: 10
},
{
label: 'Two Years',
value: 11
},
{
label: 'Three Years',
value: 12
}
]
},
}),
nocycles: Property.Number({
displayName: 'No of billing cycles',
description: 'Enter a number. How many times should this bill be generated',
required: false,
}),
auto_frequency: Property.Number({
displayName: 'Override Frequency using Frequency ID (optional)',
description: 'Enter a number. 1-12 - corresponds to dropdown above [Daily being 1, Weekly 2 etc..]!',
required: false,
}),
due_date: Property.DateTime({
displayName: 'Invoice next send date',
description: 'e.g., 2024-01-20',
required: true,
}),
last_date: Property.DateTime({
displayName: 'Invoice last sent date',
description: 'e.g., 2024-01-20',
required: false,
}),
},
async run(context) {
await propsValidation.validateZod(context.propsValue, {
nocycles: z.number().min(0).max(999).optional(),
auto_frequency: z.number().min(1).max(12).optional(),
due_date: z.string().datetime(),
last_date: z.string().datetime().optional(),
});
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
'Content-Type': 'application/json',
};
const lineItemsArray = JSON.parse(context.propsValue.order_items_json);
if (!Array.isArray(lineItemsArray)) {
throw new Error('Invalid format for order_items_json. It should be an array of objects.');
}
if (lineItemsArray.length === 0) {
throw new Error('The line_items array must not be empty.');
}
const isValidLineItem = lineItemsArray.every(item => (
typeof item === 'object' &&
'quantity' in item && typeof item.quantity === 'number' &&
'product_key' in item && typeof item.product_key === 'string' &&
'discount' in item && typeof item.discount === 'string'
));
if (!isValidLineItem) {
throw new Error('Each item in the line_items array must be an object with "quantity" (number), "product_key" (string), and "discount" (string).');
}
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
let errorMessages = '';
try {
const lineItemsWithDetailsPromises = lineItemsArray.map(async item => {
try {
const getProductDetailsResponse = await fetch(`${baseUrl}/api/v1/products/?product_key=${item.product_key}`, {
method: 'GET',
headers,
});
if (!getProductDetailsResponse.ok) {
console.error(`Failed to get product details for ${item.product_key}. Status: ${getProductDetailsResponse.status}`);
errorMessages += `Failed to get product details for ${item.product_key}\n`;
return null;
}
const productDetailsResponseBody = await getProductDetailsResponse.json();
const productCount = productDetailsResponseBody.meta.pagination.count;
if (productCount < 1) {
console.error(`No product details found for ${item.product_key}.`);
errorMessages += `No product details found for ${item.product_key}\n`;
return null;
}
const productDetails = productDetailsResponseBody.data[0];
return {
quantity: item.quantity,
product_key: item.product_key,
product_cost: productDetails.price,
cost: productDetails.price,
notes: productDetails.notes,
discount: item.discount || '0',
is_amount_discount: context.propsValue.discount_type,
tax_name1: productDetails.tax_name1,
tax_rate1: productDetails.tax_rate1,
tax_id: productDetails.tax_id,
};
} catch (error) {
console.error(`Error getting product details for ${item.product_key}:`, error);
errorMessages += `Error getting product details for ${item.product_key}: ${error}\n`;
return null;
}
});
const lineItemsWithDetails = await Promise.all(lineItemsWithDetailsPromises);
if (errorMessages) {
// If there are error messages, throw an error with the accumulated messages
throw new Error(errorMessages.trim());
}
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth() + 1;
const day = today.getDate();
const formattedDate = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
const createInvoiceRequestBody = {
//status_id: 2, // seems cant set the status id when creating need another api call either using the recurring invoice ID and updating the status that way
// or possibly calling /bulk with action=start there's also an action send_now
next_send_date: context.propsValue.due_date,
date: formattedDate,
client_id: context.propsValue.client_id || '',
po_number: context.propsValue.purchase_order_no || '',
public_notes: context.propsValue.public_notes || '',
private_notes: context.propsValue.private_notes || '',
line_items: lineItemsWithDetails,
discount: context.propsValue.discount,
is_amount_discount: context.propsValue.discount_type,
frequency_id: context.propsValue.auto_frequency || context.propsValue.frequency,
remaining_cycles:context.propsValue.nocycles || -1,
};
// if remaining cycles is set to 0 it will automatically go completed -1 is endless!
// status_id 2 is pending ie start scheduling
const createInvoiceResponse = await fetch(`${baseUrl}/api/v1/recurring_invoices`, {
method: 'POST',
headers,
body: JSON.stringify(createInvoiceRequestBody),
});
if (!createInvoiceResponse.ok) {
throw new Error(`Failed to create recurring invoice. Status: ${createInvoiceResponse.status}`);
}
const createInvoiceResponseBody = await createInvoiceResponse.json();
return createInvoiceResponseBody;
} catch (error) {
console.error('Error creating recurring invoice or getting product details:', error);
if (errorMessages) {
// If there are error messages, throw an error with the accumulated messages
throw new Error(errorMessages.trim());
} else {
// If there are no error messages, throw the original error
throw error;
}
}
},
});

View File

@@ -0,0 +1,68 @@
import {
createAction,
Property,
} from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { invoiceninjaAuth } from '../..';
export const createTask = createAction({
auth: invoiceninjaAuth,
name: 'create_task',
displayName: 'Create Task',
description: 'Creates a task instance in Invoice Ninja for billing purposes.',
props: {
number: Property.LongText({
displayName: 'Task or Ticket Number (alphanumeric)',
description:
'A unique task or ticket number that has not been used before in Invoice Ninja',
required: true,
}),
client_id: Property.LongText({
displayName: 'Client ID (alphanumeric)',
description: 'Client ID from Invoice Ninja (optional)',
required: false,
}),
project_id: Property.LongText({
displayName: 'Project ID (alphanumeric)',
description: 'Project ID from Invoice Ninja (optional)',
required: false,
}),
description: Property.LongText({
displayName: 'Description of task',
description: 'Description of task to be billed',
required: true,
}),
rate: Property.Number({
displayName: 'Custom hourly rate',
description: 'Custom hourly rate (optional) otherwise default used',
required: false,
}),
},
async run(context) {
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
};
const queryParams = new URLSearchParams();
queryParams.append('number', context.propsValue.number || '');
queryParams.append('client_id', context.propsValue.client_id || '');
queryParams.append('project_id', context.propsValue.project_id || '');
queryParams.append('description', context.propsValue.description || '');
// bugfix - only append rate if a rate has been specified in the piece
if (context.propsValue.rate?.valueOf != null) {
queryParams.append('rate', context.propsValue.rate?.toString() || '0');
}
// Remove trailing slash from base_url
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
const url = `${baseUrl}/api/v1/tasks?${queryParams.toString()}`;
const httprequestdata = {
method: HttpMethod.POST,
url,
headers,
};
const response = await httpClient.sendRequest(httprequestdata);
return response.body;
},
});

View File

@@ -0,0 +1,102 @@
import {
createAction,
Property,
} from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, propsValidation } from '@activepieces/pieces-common';
import { z } from 'zod';
import { invoiceninjaAuth } from '../..';
export const getClient = createAction({
auth: invoiceninjaAuth,
name: 'getclient_task',
displayName: 'Get Client Details from e-mail',
description: 'Gets the client details if they exist by e-mail.',
props: {
email: Property.LongText({
displayName: 'Client e-mail address',
description: 'A valid e-mail address to get client details for',
required: true,
}),
},
async run(context) {
await propsValidation.validateZod(context.propsValue, {
email: z.string().email(),
});
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
};
const queryParams = new URLSearchParams();
queryParams.append('email', context.propsValue.email || '');
// Remove trailing slash from base_url
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
const url = `${baseUrl}/api/v1/clients/?${queryParams.toString()}`;
const httprequestdata = {
method: HttpMethod.GET,
url,
headers,
};
try {
const response = await httpClient.sendRequest(httprequestdata);
// Process the successful response here (status 2xx).
//
if (response.body.meta.pagination.total > 0) {
// Each client that is found will have one or more contacts
const NumberOfContactsThisClient =
response.body.data[0].contacts.length;
for (let i = 0; i < NumberOfContactsThisClient; i++) {
// theres a lot of extra data I don't really want in the actual response of contacts so I want to tr and just pick out
// firstname, lastname, email, etc as I don't think we need the rest, just to keep it simpler
delete response.body.data[0].contacts[i].id;
delete response.body.data[0].contacts[i].created_at;
delete response.body.data[0].contacts[i].updated_at;
delete response.body.data[0].contacts[i].archived_at;
delete response.body.data[0].contacts[i].is_primary;
delete response.body.data[0].contacts[i].is_locked;
delete response.body.data[0].contacts[i].contact_key;
delete response.body.data[0].contacts[i].send_email;
delete response.body.data[0].contacts[i].last_login;
delete response.body.data[0].contacts[i].password;
delete response.body.data[0].contacts[i].link;
}
const json = [
{
client_no_contacts: NumberOfContactsThisClient,
client_id: response.body.data[0].id,
client_name: response.body.data[0].name,
client_web: response.body.data[0].website,
client_private_notes: response.body.data[0].private_notes,
client_balance: response.body.data[0].balance,
client_paid_to_date: response.body.data[0].paid_to_date,
client_payment_balance: response.body.data[0].payment_balance,
client_credit_balance: response.body.data[0].credit_balance,
client_public_notes: response.body.data[0].public_notes,
client_address1: response.body.data[0].address1,
client_address2: response.body.data[0].address2,
client_phone: response.body.data[0].phone,
client_city: response.body.data[0].city,
client_state: response.body.data[0].state,
client_postcode: response.body.data[0].postal_code,
client_vat: response.body.data[0].vat_number,
client_display_name: response.body.data[0].display_name,
client_contacts: response.body.data[0].contacts,
//meta: response.body.meta,
},
];
return json;
return true;
} else {
return false;
} // this is still returned so if it is false we'll return notfound or similar
} catch (error) {
// Handle the error when the request fails (status other than 2xx).
return 'There was a problem getting information from your Invoice Ninja';
}
},
});

View File

@@ -0,0 +1,128 @@
// action to return invoices from InvoiceNinja with filtering by invoice status and client id
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { invoiceninjaAuth } from '../..';
export const getInvoices = createAction({
auth: invoiceninjaAuth,
name: 'getinvoices_task',
displayName: 'Get Invoices',
description: 'Gets data for invoices.',
props: {
invoiceStatus: Property.StaticDropdown({
displayName: 'Invoice Status',
description: 'Select the invoice status for filtering.',
required: true,
options: {
options: [
{
label: 'Unpaid Invoices',
value: 'unpaid',
},
{
label: 'Paid Invoices',
value: 'paid',
},
{
label: 'Overdue Invoices',
value: 'overdue',
},
{
label: 'All Invoices',
value: 'all',
},
],
},
}),
clientID: Property.LongText({
displayName: 'Client ID',
description: 'Filter by Client ID, default is all clients.',
required: false,
}),
numberOfResults: Property.Number({
displayName: 'Max Results',
description: 'Maximum number of results to return. 9999 is default.',
required: false,
}),
},
async run(context) {
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
};
const queryParams = new URLSearchParams();
queryParams.append(
'client_status',
context.propsValue.invoiceStatus || 'unpaid'
);
// only include client_id in the query parameters if it has been specified
if (
context.propsValue.clientID?.valueOf != null ||
context.propsValue.clientID != undefined
) {
queryParams.append('client_id', context.propsValue.clientID || '');
}
queryParams.append('is_deleted', 'false'); // only return invoices that are not deleted
queryParams.append(
'per_page',
context.propsValue.numberOfResults?.toString() || '9999'
); // otherwise it only returns 20 per page hopefully
// Remove trailing slash from base_url
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
const url = `${baseUrl}/api/v1/invoices/?${queryParams.toString()}`;
// console.log("INVOICENINJA: " + url);
const httprequestdata = {
method: HttpMethod.GET,
url,
headers,
};
try {
const response = await httpClient.sendRequest(httprequestdata);
const my = [];
// Process the response here (status 2xx).
if (response.body.meta.pagination.total > 0) {
// Each invoice that is found will have lots of information, lets remove the guff
// changed from .total to .count because we're only interested in those in the first page of results which
// is what we set the per_page to to correspond to the number of records we wanted
const NumberOfInvoices = response.body.meta.pagination.count;
for (let i = 0; i < NumberOfInvoices; i++) {
my.push({
invoice: {
clientid: response.body.data[i].client_id,
invoiceno: response.body.data[i].number,
ponumber: response.body.data[i].po_number,
invdate: response.body.data[i].date,
duedate: response.body.data[i].due_date,
punote: response.body.data[i].public_notes,
prnote: response.body.data[i].private_notes,
reminder1: response.body.data[i].reminder1_sent,
reminder2: response.body.data[i].reminder2_sent,
reminder3: response.body.data[i].reminder3_sent,
lastreminder: response.body.data[i].reminder_last_sent,
firstsku: response.body.data[i].line_items[0].product_key,
firstitem: response.body.data[i].line_items[0].notes,
amount: response.body.data[i].amount,
balance: response.body.data[i].balance,
paid: response.body.data[i].paid_to_date,
},
});
// console.log("INVOICENINJA: (" + i.toString() + ") " + response.body.data[i].amount);
}
return my;
} else {
return false;
} // this is still returned so if it is false we'll return notfound or similar
} catch (error) {
// Handle the error when the request fails (status other than 2xx).
// console.log((error as Error).message);
return (error as Error).message;
// return "There was a problem getting information from your Invoice Ninja";
}
},
});

View File

@@ -0,0 +1,111 @@
// action to return reports from InvoiceNinja with filtering
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { invoiceninjaAuth } from '../..';
export const getReport = createAction({
auth: invoiceninjaAuth,
name: 'getreport_task',
displayName: 'Get Report',
description: 'Gets report data from InvoiceNinja.',
props: {
reportType: Property.StaticDropdown({
displayName: 'Report Type',
description: 'Select the report type.',
required: true,
options: {
options: [
{
label: 'Invoices',
value: 'invoices',
},
],
},
}),
clientID: Property.LongText({
displayName: 'Client ID',
description: 'Filter by Client ID, default is all clients.',
required: false,
}),
numberOfResults: Property.Number({
displayName: 'Max Results',
description: 'Maximum number of results to return. 9999 is default.',
required: false,
}),
},
async run(context) {
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
serializers: 'JSON',
'Content-Type': 'application/json',
};
const report_keys = JSON.stringify(['client', 'name', 'date']);
const queryParams = new URLSearchParams();
queryParams.append('report_keys', report_keys);
queryParams.append('date_range', 'last7');
// date range - last7, last_quarter, last_year etc..
queryParams.append(
'per_page',
context.propsValue.numberOfResults?.toString() || '9999'
); // otherwise it only returns 20 per page hopefully
// Remove trailing slash from base_url
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
const url = `${baseUrl}/api/v1/reports/${
context.propsValue.reportType
}?${queryParams.toString()}`;
// console.log("INVOICENINJA: " + url);
const httprequestdata = {
method: HttpMethod.GET,
url,
headers,
};
try {
const response = await httpClient.sendRequest(httprequestdata);
const my = [];
// Process the response here (status 2xx).
if (response.body.meta.pagination.total > 0) {
return response.body;
const NumberOfInvoices = response.body.meta.pagination.count;
for (let i = 0; i < NumberOfInvoices; i++) {
my.push({
invoice: {
clientid: response.body.data[i].client_id,
invoiceno: response.body.data[i].number,
ponumber: response.body.data[i].po_number,
invdate: response.body.data[i].date,
duedate: response.body.data[i].due_date,
punote: response.body.data[i].public_notes,
prnote: response.body.data[i].private_notes,
reminder1: response.body.data[i].reminder1_sent,
reminder2: response.body.data[i].reminder2_sent,
reminder3: response.body.data[i].reminder3_sent,
lastreminder: response.body.data[i].reminder_last_sent,
firstsku: response.body.data[i].line_items[0].product_key,
firstitem: response.body.data[i].line_items[0].notes,
amount: response.body.data[i].amount,
balance: response.body.data[i].balance,
paid: response.body.data[i].paid_to_date,
},
});
// console.log("INVOICENINJA: (" + i.toString() + ") " + response.body.data[i].amount);
}
return my;
} else {
return false;
} // this is still returned so if it is false we'll return notfound or similar
} catch (error) {
// Handle the error when the request fails (status other than 2xx).
// console.log((error as Error).message);
return (error as Error).message;
// return "There was a problem getting information from your Invoice Ninja";
}
},
});

View File

@@ -0,0 +1,53 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { invoiceninjaAuth } from '../..';
// 05/09/23 - returns 1 or 0 instead of true or false as was having issues
export const existsTask = createAction({
auth: invoiceninjaAuth,
name: 'exists_task',
displayName: 'Check Task Existence',
description: 'Verify if a Task Already Exists',
props: {
number: Property.LongText({
displayName: 'Task or Ticket Number (alphanumeric)',
description: 'A task or ticket number to check',
required: true,
}),
},
async run(context) {
const INapiToken = context.auth.props.access_token;
const headers = {
'X-Api-Token': INapiToken,
};
const queryParams = new URLSearchParams();
// number=context.propsValue.number - last update 'number' was also on the const url which
// was incorrect
queryParams.append('number', context.propsValue.number || '');
// Remove trailing slash from base_url
const baseUrl = context.auth.props.base_url.replace(/\/$/, '');
const url = `${baseUrl}/api/v1/tasks?${queryParams.toString()}`;
const httprequestdata = {
method: HttpMethod.GET,
url,
headers,
};
try {
const response = await httpClient.sendRequest(httprequestdata);
// meta data only present if ticket exists. had issues testing true and false on
// branch piece so switched to 1 and 0 respectively instead to see if that works
// better.
if (response.body.meta.pagination.total > 0) {
return 1;
} else {
return 0;
}
} catch (error) {
// Handle the error when the request fails (status other than 2xx).
return 'There was a problem getting information from your Invoice Ninja';
}
},
});

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"]
}