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

View File

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

View File

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

View File

@@ -0,0 +1,53 @@
{
"Salesforce": "Salesforce",
"CRM software solutions and enterprise cloud computing": "CRM software solutions and enterprise cloud computing",
"Environment": "Environment",
"Choose environment": "Choose environment",
"Production": "Production",
"Development": "Development",
"Authenticate with Salesforce Production": "Authenticate with Salesforce Production",
"Run Query (Advanced)": "Run Query (Advanced)",
"Create Object (Advanced)": "Create Object (Advanced)",
"Update Object (Advanced)": "Update Object (Advanced)",
"Batch Upsert (Advanced)": "Batch Upsert (Advanced)",
"Bulk Upsert (Advanced)": "Bulk Upsert (Advanced)",
"Custom API Call": "Custom API Call",
"Run a salesforce query": "Run a salesforce query",
"Create new object": "Create new object",
"Update object by Id": "Update object by Id",
"Batch upsert a record by external id": "Batch upsert a record by external id",
"Bulk upsert a record by external id": "Bulk upsert a record by external id",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Query": "Query",
"Object": "Object",
"Data": "Data",
"Id": "Id",
"External Field": "External Field",
"Records": "Records",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Enter the query": "Enter the query",
"Select the Object": "Select the Object",
"Select mapped object": "Select mapped object",
"Select the Id": "Select the Id",
"Select the External Field": "Select the External Field",
"Select the Records": "Select the Records",
"Select the Records (CSV format)": "Select the Records (CSV format)",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Record": "New Record",
"New or Updated Record": "New or Updated Record",
"Triggers when there is new record": "Triggers when there is new record",
"Triggers when there is new or updated record": "Triggers when there is new or updated record",
"Conditions (Advanced)": "Conditions (Advanced)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "CRM-Softwarelösungen und Enterprise-Cloud-Computing",
"Environment": "Umgebung",
"Choose environment": "Umgebung auswählen",
"Production": "Produktion",
"Development": "Entwicklung",
"Authenticate with Salesforce Production": "Authentifizieren mit Salesforce Produktion",
"Add Contact to Campaign": "Kontakt zur Kampagne hinzufügen",
"Add File to Record": "Datei zum Datensatz hinzufügen",
"Add Lead to Campaign": "Lead zur Kampagne hinzufügen",
"Create Attachment (Legacy)": "Anhang erstellen (Legacy)",
"Create Case": "Fall erstellen",
"Create Contact": "Kontakt erstellen",
"Create Lead": "Lead erstellen",
"Create Note": "Notiz erstellen",
"Create Opportunity": "Verkaufschance erstellen",
"Create Record": "Datensatz erstellen",
"Create Task": "Aufgabe erstellen",
"Delete Opportunity": "Verkaufschance löschen",
"Delete Record": "Datensatz löschen",
"Find Child Records": "Kind-Datensätze finden",
"Find Record": "Datensatz finden",
"Find Records by Query (Advanced)": "Datensätze über Abfrage finden (Fortgeschritten)",
"Get Record Attachments": "Datensatzanhänge abrufen",
"Run Query (Advanced)": "Abfrage ausführen (Erweitert)",
"Run Report": "Bericht ausführen",
"Send Email": "E-Mail senden",
"Update Contact": "Kontakt aktualisieren",
"Update Lead": "Lead aktualisieren",
"Update Record": "Datensatz aktualisieren",
"Batch Upsert (Advanced)": "Stapelvorlage (Fortgeschritten)",
"Bulk Upsert (Advanced)": "Massenvorrat (Fortgeschritten)",
"Custom API Call": "Eigener API-Aufruf",
"Add a contact to a campaign.": "Füge einen Kontakt zu einer Kampagne hinzu.",
"Uploads a file and attaches it to an existing record.": "Lädt eine Datei hoch und fügt sie an einen vorhandenen Datensatz an.",
"Adds an existing lead to an existing campaign.": "Fügt einen bestehenden Lead zu einer bestehenden Kampagne hinzu.",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "Erstellt einen alten Attachment-Datensatz. Salesforce empfiehlt die Verwendung von \"Datei zum Datensatz hinzufügen\" für moderne Apps.",
"Creates a Case, which represents a customer issue or problem.": "Erstellt einen Fall, der ein Problem oder Problem des Kunden darstellt.",
"Creates a new contact record.": "Erstellt einen neuen Kontakt-Datensatz.",
"Creates a new lead.": "Erstellt einen neuen Vorsprung.",
"Creates a note and attaches it to a record.": "Erstellt eine Notiz und fügt sie an einen Datensatz an.",
"Creates a new opportunity.": "Erstellt eine neue Chance.",
"Create a record of a given object.": "Erstellen Sie einen Datensatz eines bestimmten Objekts.",
"Creates a new task.": "Erstellt eine neue Aufgabe.",
"Deletes an opportunity.": "Löscht eine Chance.",
"Deletes an existing record in an object.": "Löscht einen vorhandenen Datensatz in einem Objekt.",
"Finds child records related to a parent record.": "Findet untergeordnete Datensätze im Zusammenhang mit einem übergeordneten Datensatz.",
"Finds a record by a field value.": "Findet einen Datensatz mit einem Feldwert.",
"Finds records in an object using a SOQL WHERE clause.": "Findet Datensätze in einem Objekt unter Verwendung einer SOQL WHERE-Klausel.",
"Get all attachments (both classic and modern Files) for a record.": "Holen Sie sich alle Anhänge (sowohl klassische als auch moderne Dateien) für einen Datensatz.",
"Run a salesforce query": "Eine salesforce-Abfrage ausführen",
"Execute a Salesforce analytics report.": "Führen Sie einen Salesforce-Analysebericht aus.",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "Sendet eine E-Mail an einen Kontakt oder eine Lead durch das Erstellen eines E-Mail-Nachrichten-Datensatzes.",
"Update an existing contact.": "Aktualisiere einen bestehenden Kontakt.",
"Update an existing lead.": "Vorhandene Leads aktualisieren.",
"Updates an existing record.": "Aktualisiert einen existierenden Datensatz.",
"Batch upsert a record by external id": "Batch upsert einen Datensatz mit externer Id",
"Bulk upsert a record by external id": "Ein Datensatz mit externer ID upsert",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Campaign": "Kampagne",
"Contact": "Kontakt",
"Status": "Status",
"Object": "Objekt",
"Record": "Datensatz",
"File": "Datei",
"File Name": "Dateiname",
"Lead": "Lead",
"Subject": "Betreff",
"Description": "Beschreibung",
"Priority": "Priorität",
"Origin": "Ursprung",
"Account": "Konto",
"Other Fields": "Andere Felder",
"Last Name": "Nachname",
"First Name": "Vorname",
"Email": "E-Mail",
"Phone": "Telefon",
"Title": "Titel",
"Company": "Firma",
"Lead Source": "Lead Quelle",
"Body": "Körper",
"Name": "Name",
"Close Date": "Schließungsdatum",
"Stage": "Teil",
"Amount": "Betrag",
"Record Data": "Daten aufzeichnen",
"Owner": "Besitzer",
"Related To (Contact/Lead ID)": "Ähnlich zu (Kontakt/Lead-ID)",
"Related To (Other Object ID)": "Ähnlich zu (andere Objekt-ID)",
"Opportunity": "Verkaufschance",
"Parent Record": "Eltern-Datensatz",
"Child Relationship": "Kinderbeziehung",
"Field": "Feld",
"Search Value": "Suchwert",
"WHERE Clause": "WHERE Klausel",
"Query": "Abfrage",
"Report": "Bericht",
"Filters": "Filter",
"Recipient": "Empfänger",
"Related To ID (Optional)": "Ähnlich zur ID (Optional)",
"Other Fields (Advanced)": "Andere Felder (Erweitert)",
"Data to Update": "Zu aktualisierende Daten",
"External Field": "Externes Feld",
"Records": "Datensätze",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"The campaign member status (e.g., 'Sent', 'Responded').": "Der Status der Kampagnenmitglieder (z. B. 'Gesendet', 'Antworten').",
"Select the Object": "Objekt auswählen",
"The record to select. The list shows the 20 most recently created records.": "Der auszuwählende Datensatz. Die Liste zeigt die 20 zuletzt erstellten Datensätze.",
"The file to upload.": "Die hochzuladende Datei.",
"The name of the file, including its extension (e.g., \"report.pdf\").": "Der Name der Datei, einschließlich ihrer Endung (z. B. \"report.pdf\").",
"The file to attach.": "Die anzuhängende Datei.",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "Der Name der Datei, einschließlich ihrer Endung (z.B. \"attachment.pdf\").",
"Enter additional fields as a JSON object.": "Zusätzliche Felder als JSON-Objekt eingeben.",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "Geben Sie zusätzliche Felder als JSON-Objekt ein (z. B. {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).",
"The content of the note.": "Der Inhalt der Notiz.",
"The expected close date in YYYY-MM-DD format.": "Das erwartete Enddatum im Format JJJJ-MM-TT.",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "Geben Sie die Felder für den neuen Datensatz als JSON-Objekt ein. Zum Beispiel: {\"Name\": \"Mein neuer Account\", \"Industrie\": \"Technologie\"}",
"The owner of the task.": "Der Besitzer der Aufgabe.",
"The ID of a Contact or Lead to relate the task to.": "Die ID eines Kontakts oder eines Leads, mit der die Aufgabe in Beziehung steht.",
"The ID of an Account, Opportunity, or other object to relate the task to.": "Die ID eines Konto, einer Verkaufschance oder eines anderen Objekts, mit dem die Aufgabe in Beziehung steht.",
"The parent record to find child records for. The list shows the 20 most recently created records.": "Der übergeordnete Datensatz, für den untergeordnete Datensätze gefunden werden. Die Liste zeigt die 20 zuletzt erstellten Datensätze.",
"The child relationship to retrieve records from.": "Die Kindbeziehung, aus der Datensätze abgerufen werden sollen.",
"Select the Field": "Wählen Sie das Feld",
"The value to search for in the selected field.": "Der zu suchende Wert im ausgewählten Feld.",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "Geben Sie die WHERE-Klausel für Ihre SOQL-Abfrage ein. Zum Beispiel: `Name = 'Acme' AND Industry = 'Technology'`. Geben Sie nicht das Schlüsselwort 'WHERE' ein.",
"Enter the query": "Abfrage eingeben",
"Apply dynamic filters to the report run.": "Dynamische Filter auf den Report anwenden.",
"The content of the email. Can be plain text or HTML.": "Der Inhalt der E-Mail. Kann einfacher Text oder HTML sein.",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "Die ID eines Datensatzes, mit dem die E-Mail in Verbindung gebracht werden soll (z. B. ein Konto, eine Verkaufschance oder eine Fall-ID).",
"Enter any additional fields to update as a JSON object.": "Geben Sie weitere Felder ein, die als JSON-Objekt aktualisiert werden sollen.",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "Geben Sie die Felder ein, die als JSON-Objekt aktualisiert werden sollen. Zum Beispiel: {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "Externes Feld auswählen",
"Select the Records": "Datensätze auswählen",
"Select the Records (CSV format)": "Wählen Sie die Datensätze (CSV-Format)",
"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..",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Case Attachment": "Neuer Fall Anhang",
"New Contact": "Neuer Kontakt",
"New Field History Event": "Neues Feldverlauf Ereignis",
"New Lead": "Neuer Lead",
"New or Updated Record": "Neuer oder aktualisierter Datensatz",
"New Outbound Message": "Neue ausgehende Nachricht",
"New Record": "Neuer Datensatz",
"New or Updated File": "Neue oder aktualisierte Datei",
"Fires when a new Attachment or File is added to any Case record.": "Feuert ab, wenn ein neuer Anhang oder Datei zu jedem Fall Datensatz hinzugefügt wird.",
"Fires when a new Contact record is created in Salesforce.": "Feuer, wenn ein neuer Kontakt-Datensatz in Salesforce erstellt wird.",
"Fires when a tracked field is updated on a specified object.": "Feuert ab, wenn ein getragenes Feld auf ein bestimmtes Objekt aktualisiert wird.",
"Fires when a new Lead record is created in Salesforce.": "Feuer, wenn ein neuer Lead-Datensatz in Salesforce erstellt wird.",
"Triggers when there is new or updated record": "Auslöser wenn neuer oder aktualisierter Datensatz vorhanden ist",
"Fires when a new outbound message is received from Salesforce.": "Feuert ab, wenn eine neue ausgehende Nachricht von Salesforce empfangen wird.",
"Triggers when there is new record": "Auslöser wenn neuer Datensatz vorhanden ist",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Feuer, wenn eine Datei (ContentDocument) erstellt oder aktualisiert wird. Feuert nicht auf klassische Anhänge oder Notizen.",
"Conditions (Advanced)": "Bedingungen (Fortgeschritten)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Geben Sie eine SOQL-Abfrage ein, wo Klausel i. e. IsDeleted = TRUE ein."
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "Soluciones CRM de software y computación en la nube empresarial",
"Environment": "Entorno",
"Choose environment": "Elegir entorno",
"Production": "Producción",
"Development": "Desarrollo",
"Authenticate with Salesforce Production": "Autenticar con Producción de Salesforce",
"Add Contact to Campaign": "Añadir contacto a la campaña",
"Add File to Record": "Añadir archivo al registro",
"Add Lead to Campaign": "Añadir jefe a la campaña",
"Create Attachment (Legacy)": "Crear archivo adjunto (antiguo)",
"Create Case": "Crear Caso",
"Create Contact": "Crear contacto",
"Create Lead": "Crear plomo",
"Create Note": "Crear nota",
"Create Opportunity": "Crear Oportunidad",
"Create Record": "Crear registro",
"Create Task": "Crear tarea",
"Delete Opportunity": "Eliminar Oportunidad",
"Delete Record": "Eliminar registro",
"Find Child Records": "Buscar Registros Hijos",
"Find Record": "Buscar registro",
"Find Records by Query (Advanced)": "Buscar registros por consulta (Avanzado)",
"Get Record Attachments": "Obtener archivos adjuntos",
"Run Query (Advanced)": "Ejecutar consulta (Avanzado)",
"Run Report": "Ejecutar informe",
"Send Email": "Enviar Email",
"Update Contact": "Actualizar contacto",
"Update Lead": "Actualizar plomo",
"Update Record": "Actualizar registro",
"Batch Upsert (Advanced)": "Inserción de Lote (Avanzado)",
"Bulk Upsert (Advanced)": "Inserción masiva (Avanzado)",
"Custom API Call": "Llamada API personalizada",
"Add a contact to a campaign.": "Añadir un contacto a una campaña.",
"Uploads a file and attaches it to an existing record.": "Sube un archivo y lo adjunta a un registro existente.",
"Adds an existing lead to an existing campaign.": "Añade un plomo existente a una campaña existente.",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "Crea un registro de adjunto heredado. Salesforce recomienda usar \"Añadir archivo al registro\" para aplicaciones modernas.",
"Creates a Case, which represents a customer issue or problem.": "Crea un Caso, que representa un problema o problema de cliente.",
"Creates a new contact record.": "Crea un nuevo registro de contacto.",
"Creates a new lead.": "Crea un nuevo cliente potencial.",
"Creates a note and attaches it to a record.": "Crea una nota y la adjunta a un registro.",
"Creates a new opportunity.": "Crea una nueva oportunidad.",
"Create a record of a given object.": "Crear un registro de un objeto dado.",
"Creates a new task.": "Crea una nueva tarea.",
"Deletes an opportunity.": "Elimina una oportunidad.",
"Deletes an existing record in an object.": "Elimina un registro existente en un objeto.",
"Finds child records related to a parent record.": "Encuentra registros hijo relacionados con un registro padre.",
"Finds a record by a field value.": "Encuentra un registro por un valor de campo.",
"Finds records in an object using a SOQL WHERE clause.": "Encuentra registros en un objeto usando una cláusula SOQL WHERE.",
"Get all attachments (both classic and modern Files) for a record.": "Obtener todos los archivos adjuntos (tanto clásicos como modernos) para un registro.",
"Run a salesforce query": "Ejecutar una consulta de vendedor",
"Execute a Salesforce analytics report.": "Ejecutar un informe de análisis de Salesforce.",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "Envía un correo electrónico a un contacto o a un cliente potencial mediante la creación de un registro de mensaje de correo electrónico.",
"Update an existing contact.": "Actualizar un contacto existente.",
"Update an existing lead.": "Actualizar un cliente potencial.",
"Updates an existing record.": "Actualiza un registro existente.",
"Batch upsert a record by external id": "Insertar un registro por id externo",
"Bulk upsert a record by external id": "Insertar un registro en masa por id externo",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Campaign": "Campaña",
"Contact": "Contacto",
"Status": "Estado",
"Object": "Objeto",
"Record": "Grabar",
"File": "Archivo",
"File Name": "Nombre del archivo",
"Lead": "Plomo",
"Subject": "Asunto",
"Description": "Descripción",
"Priority": "Prioridad",
"Origin": "Origen",
"Account": "Cuenta",
"Other Fields": "Otros campos",
"Last Name": "Apellido",
"First Name": "Nombre",
"Email": "E-mail",
"Phone": "Teléfono",
"Title": "Título",
"Company": "Empresa",
"Lead Source": "Fuente principal",
"Body": "Cuerpo",
"Name": "Nombre",
"Close Date": "Fecha de cierre",
"Stage": "Etapa",
"Amount": "Cantidad",
"Record Data": "Registrar datos",
"Owner": "Propietario",
"Related To (Contact/Lead ID)": "Relacionado con (Contacto/ID de inicio)",
"Related To (Other Object ID)": "Relacionado con (Otro ID de objeto)",
"Opportunity": "Oportunidad",
"Parent Record": "Registro Padre",
"Child Relationship": "Relación hija",
"Field": "Campo",
"Search Value": "Valor de búsqueda",
"WHERE Clause": "QUÉ Cláusula",
"Query": "Consulta",
"Report": "Reporte",
"Filters": "Filtros",
"Recipient": "Destinatario",
"Related To ID (Optional)": "Relacionado con ID (opcional)",
"Other Fields (Advanced)": "Otros campos (Avanzado)",
"Data to Update": "Datos a actualizar",
"External Field": "Campo externo",
"Records": "Registros",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"The campaign member status (e.g., 'Sent', 'Responded').": "El estado de los miembros de la campaña (por ejemplo, 'Enviado', 'Respondido').",
"Select the Object": "Seleccione el objeto",
"The record to select. The list shows the 20 most recently created records.": "El registro a seleccionar. La lista muestra los 20 registros creados más recientemente.",
"The file to upload.": "El archivo a subir.",
"The name of the file, including its extension (e.g., \"report.pdf\").": "El nombre del archivo, incluyendo su extensión (por ejemplo, \"report.pdf\").",
"The file to attach.": "El archivo a adjuntar.",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "El nombre del archivo, incluyendo su extensión (por ejemplo, \"attachment.pdf\").",
"Enter additional fields as a JSON object.": "Introduzca campos adicionales como un objeto JSON.",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "Introduzca campos adicionales como un objeto JSON (por ejemplo, {\"Título\": \"Administrador\", \"Sitio Web\": \"http://ejemplo.com\"}).",
"The content of the note.": "El contenido de la nota.",
"The expected close date in YYYY-MM-DD format.": "La fecha de cierre esperada en formato AAA-MM-DD.",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "Introduzca los campos para el nuevo registro como un objeto JSON. Por ejemplo: {\"Nombre\": \"Mi Nueva Cuenta\", \"Industria\": \"Tecnología\"}",
"The owner of the task.": "El propietario de la tarea.",
"The ID of a Contact or Lead to relate the task to.": "El ID de un contacto o jefe con el que relacionar la tarea.",
"The ID of an Account, Opportunity, or other object to relate the task to.": "El ID de una Cuenta, Oportunidad u otro objeto con el que relacionar la tarea.",
"The parent record to find child records for. The list shows the 20 most recently created records.": "El registro padre para encontrar registros hijos. La lista muestra los 20 registros creados más recientemente.",
"The child relationship to retrieve records from.": "La relación hijo de la que recuperar registros.",
"Select the Field": "Seleccione el campo",
"The value to search for in the selected field.": "El valor por el que buscar en el campo seleccionado.",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "Introduzca la cláusula WHERE para su consulta SOQL. Por ejemplo: `Name = 'Acme' AND Industry = 'Technology'`. No incluya la palabra clave 'WHERE'.",
"Enter the query": "Introduzca la consulta",
"Apply dynamic filters to the report run.": "Aplicar filtros dinámicos al ejecutar el informe.",
"The content of the email. Can be plain text or HTML.": "El contenido del correo electrónico. Puede ser texto plano o HTML.",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "El ID de un registro con el que relacionar el correo electrónico (por ejemplo, una Cuenta, Oportunidad o ID del Caso).",
"Enter any additional fields to update as a JSON object.": "Introduzca cualquier campo adicional para actualizar como un objeto JSON.",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "Introduzca los campos a actualizar como un objeto JSON. Por ejemplo: {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "Seleccione el campo externo",
"Select the Records": "Seleccione los registros",
"Select the Records (CSV format)": "Seleccione el formato de los Grabados de V)",
"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.",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Case Attachment": "Nuevo Adjunto de Caso",
"New Contact": "Nuevo contacto",
"New Field History Event": "Nuevo Evento Historial de Campos",
"New Lead": "Nuevo plomo",
"New or Updated Record": "Registro nuevo o actualizado",
"New Outbound Message": "Nuevo mensaje saliente",
"New Record": "Nuevo registro",
"New or Updated File": "Archivo nuevo o actualizado",
"Fires when a new Attachment or File is added to any Case record.": "Dispara cuando se añade un nuevo archivo o adjunto a cualquier registro del caso.",
"Fires when a new Contact record is created in Salesforce.": "Dispara cuando se crea un nuevo registro de contacto en Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Dispara cuando un campo rastreado se actualiza en un objeto especificado.",
"Fires when a new Lead record is created in Salesforce.": "Dispara cuando se crea un nuevo registro de plomo en la Fuerza de Ventas.",
"Triggers when there is new or updated record": "Dispara cuando hay registros nuevos o actualizados",
"Fires when a new outbound message is received from Salesforce.": "Dispara cuando se recibe un nuevo mensaje saliente de Salesforce.",
"Triggers when there is new record": "Dispara cuando hay un nuevo registro",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Dispara cuando un archivo (ContentDocument) es creado o actualizado. No se dispara para archivos adjuntos o notas clásicos.",
"Conditions (Advanced)": "Condiciones (Avanzado)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Introduzca una consulta SOQL donde la cláusula i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "Solutions logicielles CRM et informatique cloud d'entreprise",
"Environment": "Environnement",
"Choose environment": "Choisir un environnement",
"Production": "Production",
"Development": "Développement",
"Authenticate with Salesforce Production": "S'authentifier avec la production de Salesforce",
"Add Contact to Campaign": "Ajouter un contact à la campagne",
"Add File to Record": "Ajouter un fichier à l'enregistrement",
"Add Lead to Campaign": "Ajouter un prospect à la campagne",
"Create Attachment (Legacy)": "Créer une pièce jointe (ancienne)",
"Create Case": "Créer un Cas",
"Create Contact": "Créer un contact",
"Create Lead": "Créer Prospect",
"Create Note": "Créer une note",
"Create Opportunity": "Créer une Affaire",
"Create Record": "Créer un enregistrement",
"Create Task": "Créer une tâche",
"Delete Opportunity": "Supprimer l'Affaire",
"Delete Record": "Supprimer l'enregistrement",
"Find Child Records": "Trouver les enregistrements enfants",
"Find Record": "Rechercher un enregistrement",
"Find Records by Query (Advanced)": "Rechercher des enregistrements par requête (Avancé)",
"Get Record Attachments": "Obtenir les pièces jointes des enregistrements",
"Run Query (Advanced)": "Exécuter la requête (Avancé)",
"Run Report": "Exécuter le rapport",
"Send Email": "Envoyer un e-mail",
"Update Contact": "Mettre à jour le contact",
"Update Lead": "Mettre à jour le prospect",
"Update Record": "Mettre à jour l'enregistrement",
"Batch Upsert (Advanced)": "Upsert par lot (Avancé)",
"Bulk Upsert (Advanced)": "Amélioration en vrac (Avancé)",
"Custom API Call": "Appel d'API personnalisé",
"Add a contact to a campaign.": "Ajouter un contact à une campagne.",
"Uploads a file and attaches it to an existing record.": "Télécharge un fichier et l'attache à un enregistrement existant.",
"Adds an existing lead to an existing campaign.": "Ajoute un conduit existant à une campagne existante.",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "Crée un enregistrement de pièce jointe hérité. Salesforce recommande d'utiliser « Ajouter un fichier à un enregistrement» pour les applications modernes.",
"Creates a Case, which represents a customer issue or problem.": "Crée un Cas qui représente un problème ou un problème de client.",
"Creates a new contact record.": "Crée un nouveau dossier de contact.",
"Creates a new lead.": "Crée un nouveau prospect.",
"Creates a note and attaches it to a record.": "Crée une note et la joint à un enregistrement.",
"Creates a new opportunity.": "Crée une nouvelle opportunité.",
"Create a record of a given object.": "Créer un enregistrement d'un objet donné.",
"Creates a new task.": "Crée une nouvelle tâche.",
"Deletes an opportunity.": "Supprime une opportunité.",
"Deletes an existing record in an object.": "Supprime un enregistrement existant dans un objet.",
"Finds child records related to a parent record.": "Trouve les enregistrements enfants liés à un dossier parent.",
"Finds a record by a field value.": "Trouve un enregistrement par une valeur de champ.",
"Finds records in an object using a SOQL WHERE clause.": "Trouve des enregistrements dans un objet en utilisant une clause SOQL WHERE .",
"Get all attachments (both classic and modern Files) for a record.": "Obtenez toutes les pièces jointes (fichiers classiques et modernes) pour un enregistrement.",
"Run a salesforce query": "Exécuter une requête salesforce",
"Execute a Salesforce analytics report.": "Exécuter un rapport d'analyse Salesforce.",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "Envoie un e-mail à un contact ou un prospect en créant un enregistrement EmailMessage.",
"Update an existing contact.": "Mettre à jour un contact existant.",
"Update an existing lead.": "Mettre à jour un prospect existant.",
"Updates an existing record.": "Met à jour un enregistrement existant.",
"Batch upsert a record by external id": "Mettre à jour un enregistrement par ID externe",
"Bulk upsert a record by external id": "Mettre en avant un enregistrement par id externe",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
"Campaign": "Campagnes",
"Contact": "Contacter",
"Status": "Statut",
"Object": "Objet",
"Record": "Enregistrements",
"File": "Ficher",
"File Name": "Nom du fichier",
"Lead": "Prospect",
"Subject": "Sujet",
"Description": "Libellé",
"Priority": "Priorité",
"Origin": "Origine",
"Account": "Compte client",
"Other Fields": "Autres champs",
"Last Name": "Last Name",
"First Name": "First Name",
"Email": "Courriel",
"Phone": "Téléphone",
"Title": "Titre",
"Company": "Entreprise",
"Lead Source": "Source de plomb",
"Body": "Corps",
"Name": "Nom",
"Close Date": "Date de clôture",
"Stage": "Étape",
"Amount": "Montant",
"Record Data": "Enregistrer les données",
"Owner": "Propriétaire",
"Related To (Contact/Lead ID)": "Lié à (Contact/Lead ID)",
"Related To (Other Object ID)": "Lié à (autre ID d'objet)",
"Opportunity": "Opportunité",
"Parent Record": "Enregistrement parent",
"Child Relationship": "Relation enfant",
"Field": "Champ",
"Search Value": "Valeur de la recherche",
"WHERE Clause": "Où, Clause",
"Query": "Requête",
"Report": "Rapporter",
"Filters": "Filtres",
"Recipient": "Destinataire",
"Related To ID (Optional)": "Lié à l'ID (facultatif)",
"Other Fields (Advanced)": "Autres champs (Avancé)",
"Data to Update": "Données à mettre à jour",
"External Field": "Champ externe",
"Records": "Enregistrements",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
"The campaign member status (e.g., 'Sent', 'Responded').": "Le statut du membre de la campagne (par exemple, 'Envoyé', 'Répondu').",
"Select the Object": "Sélectionner l'objet",
"The record to select. The list shows the 20 most recently created records.": "L'enregistrement à sélectionner. La liste montre les 20 enregistrements les plus récents.",
"The file to upload.": "Le fichier à télécharger.",
"The name of the file, including its extension (e.g., \"report.pdf\").": "Le nom du fichier, y compris son extension (par exemple, \"report.pdf\").",
"The file to attach.": "Le fichier à attacher.",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "Le nom du fichier, y compris son extension (par exemple, \"attachment.pdf\").",
"Enter additional fields as a JSON object.": "Entrez des champs supplémentaires en tant qu'objet JSON.",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "Entrez des champs supplémentaires en tant qu'objet JSON (par exemple, {\"Title\": \"Gestionnaire\", \"Site Web\": \"http://example.com\"}).",
"The content of the note.": "Le contenu de la note.",
"The expected close date in YYYY-MM-DD format.": "La date de clôture prévue au format AAAA-MM-JJ.",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "Entrez les champs pour le nouvel enregistrement en tant qu'objet JSON. Par exemple : {\"Nom\": \"Mon nouveau compte\", \"Industrie\": \"Technologie\"}",
"The owner of the task.": "Le propriétaire de la tâche.",
"The ID of a Contact or Lead to relate the task to.": "L'ID d'un contact ou d'un prospect pour relier la tâche.",
"The ID of an Account, Opportunity, or other object to relate the task to.": "L'ID d'un compte, d'une opportunité ou d'un autre objet à relier à la tâche.",
"The parent record to find child records for. The list shows the 20 most recently created records.": "L'enregistrement parent pour lequel trouver des enregistrements enfants. La liste montre les 20 enregistrements les plus récemment créés.",
"The child relationship to retrieve records from.": "La relation enfant depuis laquelle récupérer les enregistrements.",
"Select the Field": "Sélectionner le champ",
"The value to search for in the selected field.": "La valeur à rechercher dans le champ sélectionné.",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "Entrez la clause WHERE pour votre requête SOQL. Par exemple: `Name = 'Acme' AND Industry = 'Technology'`. N'incluez pas le mot-clé 'WHERE'.",
"Enter the query": "Entrez la requête",
"Apply dynamic filters to the report run.": "Appliquer des filtres dynamiques à l'exécution du rapport.",
"The content of the email. Can be plain text or HTML.": "Le contenu de l'email. Peut être du texte brut ou HTML.",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "L'ID d'un enregistrement auquel relier l'e-mail (par exemple, un compte, une opportunité ou un ID de cas).",
"Enter any additional fields to update as a JSON object.": "Entrez tous les champs supplémentaires à mettre à jour en tant qu'objet JSON.",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "Entrez les champs à mettre à jour en tant qu'objet JSON. Par exemple : {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "Sélectionnez le champ externe",
"Select the Records": "Sélectionner les enregistrements",
"Select the Records (CSV format)": "Sélectionnez les enregistrements (format CSV)",
"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.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Case Attachment": "Nouvelle pièce jointe",
"New Contact": "Nouveau contact",
"New Field History Event": "Nouvel événement d'historique de champ",
"New Lead": "Nouveau prospect",
"New or Updated Record": "Nouvel enregistrement ou mis à jour",
"New Outbound Message": "Nouveau message sortant",
"New Record": "Nouvel enregistrement",
"New or Updated File": "Fichier nouveau ou mis à jour",
"Fires when a new Attachment or File is added to any Case record.": "Se déclenche lorsqu'une nouvelle pièce jointe ou un nouveau fichier est ajouté à n'importe quel dossier de cas.",
"Fires when a new Contact record is created in Salesforce.": "Se déclenche lorsqu'un nouveau contact est créé dans la force de vente.",
"Fires when a tracked field is updated on a specified object.": "Tire lorsqu'un champ suivi est mis à jour sur un objet spécifié.",
"Fires when a new Lead record is created in Salesforce.": "Tire quand un nouveau dossier de plomb est créé dans Salesforce.",
"Triggers when there is new or updated record": "Déclenche lorsqu'il y a un enregistrement nouveau ou mis à jour",
"Fires when a new outbound message is received from Salesforce.": "Se déclenche lorsqu'un nouveau message sortant est reçu par Salesforce.",
"Triggers when there is new record": "Déclenche lorsqu'il y a un nouvel enregistrement",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Tire lorsqu'un fichier (ContentDocument) est créé ou mis à jour. Ne tire pas pour les pièces jointes ou notes classiques.",
"Conditions (Advanced)": "Conditions (Avancées)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Entrez une requête SOQL où la clause i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,53 @@
{
"Salesforce": "Salesforce",
"CRM software solutions and enterprise cloud computing": "CRM software solutions and enterprise cloud computing",
"Environment": "Environment",
"Choose environment": "Choose environment",
"Production": "Production",
"Development": "Development",
"Authenticate with Salesforce Production": "Authenticate with Salesforce Production",
"Run Query (Advanced)": "Run Query (Advanced)",
"Create Object (Advanced)": "Create Object (Advanced)",
"Update Object (Advanced)": "Update Object (Advanced)",
"Batch Upsert (Advanced)": "Batch Upsert (Advanced)",
"Bulk Upsert (Advanced)": "Bulk Upsert (Advanced)",
"Custom API Call": "Custom API Call",
"Run a salesforce query": "Run a salesforce query",
"Create new object": "Create new object",
"Update object by Id": "Update object by Id",
"Batch upsert a record by external id": "Batch upsert a record by external id",
"Bulk upsert a record by external id": "Bulk upsert a record by external id",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Query": "Query",
"Object": "Object",
"Data": "Data",
"Id": "Id",
"External Field": "External Field",
"Records": "Records",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Enter the query": "Enter the query",
"Select the Object": "Select the Object",
"Select mapped object": "Select mapped object",
"Select the Id": "Select the Id",
"Select the External Field": "Select the External Field",
"Select the Records": "Select the Records",
"Select the Records (CSV format)": "Select the Records (CSV format)",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Record": "New Record",
"New or Updated Record": "New or Updated Record",
"Triggers when there is new record": "Triggers when there is new record",
"Triggers when there is new or updated record": "Triggers when there is new or updated record",
"Conditions (Advanced)": "Conditions (Advanced)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,53 @@
{
"Salesforce": "Salesforce",
"CRM software solutions and enterprise cloud computing": "CRM software solutions and enterprise cloud computing",
"Environment": "Environment",
"Choose environment": "Choose environment",
"Production": "Production",
"Development": "Development",
"Authenticate with Salesforce Production": "Authenticate with Salesforce Production",
"Run Query (Advanced)": "Run Query (Advanced)",
"Create Object (Advanced)": "Create Object (Advanced)",
"Update Object (Advanced)": "Update Object (Advanced)",
"Batch Upsert (Advanced)": "Batch Upsert (Advanced)",
"Bulk Upsert (Advanced)": "Bulk Upsert (Advanced)",
"Custom API Call": "Custom API Call",
"Run a salesforce query": "Run a salesforce query",
"Create new object": "Create new object",
"Update object by Id": "Update object by Id",
"Batch upsert a record by external id": "Batch upsert a record by external id",
"Bulk upsert a record by external id": "Bulk upsert a record by external id",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Query": "Query",
"Object": "Object",
"Data": "Data",
"Id": "Id",
"External Field": "External Field",
"Records": "Records",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Enter the query": "Enter the query",
"Select the Object": "Select the Object",
"Select mapped object": "Select mapped object",
"Select the Id": "Select the Id",
"Select the External Field": "Select the External Field",
"Select the Records": "Select the Records",
"Select the Records (CSV format)": "Select the Records (CSV format)",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Record": "New Record",
"New or Updated Record": "New or Updated Record",
"Triggers when there is new record": "Triggers when there is new record",
"Triggers when there is new or updated record": "Triggers when there is new or updated record",
"Conditions (Advanced)": "Conditions (Advanced)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "CRMソフトウェアソリューションとエンタープライズクラウドコンピューティング",
"Environment": "環境",
"Choose environment": "環境を選択",
"Production": "Production",
"Development": "開発",
"Authenticate with Salesforce Production": "Salesforce Productionによる認証",
"Add Contact to Campaign": "キャンペーンに連絡先を追加",
"Add File to Record": "ファイルをレコードに追加",
"Add Lead to Campaign": "キャンペーンにリードを追加",
"Create Attachment (Legacy)": "添付ファイルを作成 (レガシー)",
"Create Case": "案件を作成",
"Create Contact": "連絡先を作成",
"Create Lead": "リードを作成",
"Create Note": "ノートを作成",
"Create Opportunity": "案件を作成",
"Create Record": "レコードを作成",
"Create Task": "タスクを作成",
"Delete Opportunity": "商談を削除",
"Delete Record": "レコードを削除",
"Find Child Records": "子レコードを検索",
"Find Record": "レコードを検索",
"Find Records by Query (Advanced)": "クエリでレコードを検索 (高度)",
"Get Record Attachments": "レコード添付ファイルを取得",
"Run Query (Advanced)": "クエリの実行 (高度)",
"Run Report": "レポートの実行",
"Send Email": "メール送信",
"Update Contact": "連絡先を更新",
"Update Lead": "潜在顧客を更新",
"Update Record": "更新記録",
"Batch Upsert (Advanced)": "一括アップサート(上級)",
"Bulk Upsert (Advanced)": "一括アップセルト(上級)",
"Custom API Call": "カスタムAPI通話",
"Add a contact to a campaign.": "キャンペーンに連絡先を追加します。",
"Uploads a file and attaches it to an existing record.": "ファイルをアップロードし、既存のレコードに添付します。",
"Adds an existing lead to an existing campaign.": "既存キャンペーンに既存のリードを追加します。",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "従来の添付ファイルレコードを作成します。最新のアプリケーションでは、Salesforce では「ファイルをレコードに追加」を使用することをお勧めします。",
"Creates a Case, which represents a customer issue or problem.": "顧客の問題または問題を表すケースを作成します。",
"Creates a new contact record.": "新しい連絡先レコードを作成します。",
"Creates a new lead.": "新しいリードを作成します。",
"Creates a note and attaches it to a record.": "ノートを作成し、レコードに添付します。",
"Creates a new opportunity.": "新しい機会を作成します。",
"Create a record of a given object.": "指定したオブジェクトのレコードを作成します。",
"Creates a new task.": "新しいタスクを作成します。",
"Deletes an opportunity.": "商談を削除します。",
"Deletes an existing record in an object.": "オブジェクト内の既存のレコードを削除します。",
"Finds child records related to a parent record.": "親レコードに関連する子レコードを検索します。",
"Finds a record by a field value.": "フィールド値でレコードを検索します。",
"Finds records in an object using a SOQL WHERE clause.": "SOQL WHERE句を使用してオブジェクト内のレコードを検索します。",
"Get all attachments (both classic and modern Files) for a record.": "すべての添付ファイル(クラシックファイルとモダンファイルの両方)をレコードに取得します。",
"Run a salesforce query": "salesforceクエリを実行",
"Execute a Salesforce analytics report.": "Salesforce 分析レポートを実行します。",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "EmailMessage レコードを作成して連絡先またはリードに電子メールを送信します。",
"Update an existing contact.": "既存の連絡先を更新します。",
"Update an existing lead.": "既存のリードを更新します",
"Updates an existing record.": "既存のレコードを更新します。",
"Batch upsert a record by external id": "外部IDによるレコードのバッチアップ",
"Bulk upsert a record by external id": "外部 ID によるレコードの一括アップ",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Campaign": "キャンペーン",
"Contact": "お問い合わせ",
"Status": "ステータス",
"Object": "オブジェクト",
"Record": "レコード",
"File": "ファイル",
"File Name": "ファイル名",
"Lead": "リード",
"Subject": "件名",
"Description": "説明",
"Priority": "優先度",
"Origin": "原点:",
"Account": "アカウント",
"Other Fields": "他のフィールド",
"Last Name": "Last Name",
"First Name": "名",
"Email": "Eメールアドレス",
"Phone": "電話番号",
"Title": "タイトル",
"Company": "会社名",
"Lead Source": "リードソース",
"Body": "本文",
"Name": "Name",
"Close Date": "終了日",
"Stage": "ステージ",
"Amount": "金額",
"Record Data": "データを記録",
"Owner": "所有者",
"Related To (Contact/Lead ID)": "関連先 (連絡先/リードID)",
"Related To (Other Object ID)": "関連 (Other Object ID)",
"Opportunity": "機会",
"Parent Record": "親レコード",
"Child Relationship": "子の関係",
"Field": "フィールド",
"Search Value": "検索値",
"WHERE Clause": "WHERE条項を使用",
"Query": "クエリ",
"Report": "レポート",
"Filters": "絞り込み",
"Recipient": "受信者",
"Related To ID (Optional)": "関連ID任意",
"Other Fields (Advanced)": "他のフィールド (高度)",
"Data to Update": "更新するデータ",
"External Field": "外部フィールド",
"Records": "レコード",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"The campaign member status (e.g., 'Sent', 'Responded').": "キャンペーンメンバーのステータス(例:「送信済み」、「回答済み」)",
"Select the Object": "オブジェクトを選択",
"The record to select. The list shows the 20 most recently created records.": "選択するレコード。一覧には、直近に作成した 20 レコードが表示されます。",
"The file to upload.": "アップロードするファイル",
"The name of the file, including its extension (e.g., \"report.pdf\").": "拡張子を含むファイルの名前(例: \"report.pdf\")。",
"The file to attach.": "添付するファイル。",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "拡張子を含むファイルの名前(例:attachment.pdf)。",
"Enter additional fields as a JSON object.": "JSON オブジェクトとして追加のフィールドを入力します。",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "JSON オブジェクトとして追加のフィールドを入力します (例: {\"Title\": \"Manager\", \"Website\": \"http://example.com\"})。",
"The content of the note.": "ノートの内容。",
"The expected close date in YYYY-MM-DD format.": "YYYY-MM-DD形式で終了する予定です。",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "JSON オブジェクトとして新しいレコードのフィールドを入力します。例: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}",
"The owner of the task.": "タスクの所有者。",
"The ID of a Contact or Lead to relate the task to.": "タスクに関連付けるコンタクトまたはリードのID。",
"The ID of an Account, Opportunity, or other object to relate the task to.": "タスクに関連付けるアカウント、機会、またはその他のオブジェクトの ID 。",
"The parent record to find child records for. The list shows the 20 most recently created records.": "子レコードを検索する親レコード。一覧には、直近に作成された 20 レコードが表示されます。",
"The child relationship to retrieve records from.": "レコードを取得する子の関係",
"Select the Field": "フィールドを選択",
"The value to search for in the selected field.": "選択したフィールドで検索する値。",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "SOQL クエリの WHERE 節を入力します。例: `Name = 'Acme' AND Industry = 'Technology'` 。'WHERE' キーワードは含まないでください。",
"Enter the query": "クエリを入力してください",
"Apply dynamic filters to the report run.": "レポートの実行に動的フィルタを適用します。",
"The content of the email. Can be plain text or HTML.": "メールの内容。プレーンテキストまたはHTMLを使用できます。",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "電子メールを関連付けるレコードの ID (例えば、アカウント、商談、または ケース ID )。",
"Enter any additional fields to update as a JSON object.": "JSON オブジェクトとして更新する追加のフィールドを入力します。",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "JSON オブジェクトとして更新するフィールドを入力します。例: {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "外部フィールドを選択",
"Select the Records": "レコードを選択",
"Select the Records (CSV format)": "レコードを選択 (CSV形式)",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Case Attachment": "新しいケースアタッチメント",
"New Contact": "新しい連絡先",
"New Field History Event": "新しいフィールド履歴イベント",
"New Lead": "新しいリード",
"New or Updated Record": "新規または更新されたレコード",
"New Outbound Message": "新しい送信メッセージ",
"New Record": "新しいレコード",
"New or Updated File": "新規または更新されたファイル",
"Fires when a new Attachment or File is added to any Case record.": "症例レコードに新しい添付ファイルまたはファイルが追加されたときに発生します。",
"Fires when a new Contact record is created in Salesforce.": "Salesforce に新しい連絡先レコードが作成されたときに発行されます。",
"Fires when a tracked field is updated on a specified object.": "トラッキングフィールドが指定されたオブジェクトで更新されたときに発生します。",
"Fires when a new Lead record is created in Salesforce.": "Salesforce で新しいリードレコードが作成されたときに発生します。",
"Triggers when there is new or updated record": "新しいレコードまたは更新されたレコードがあるときにトリガーします",
"Fires when a new outbound message is received from Salesforce.": "Salesforce から新しい送信メッセージを受信したときに発生します。",
"Triggers when there is new record": "新しいレコードがあるときにトリガーします",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "ファイル(ContentDocument)が作成または更新されたときに発行されます。",
"Conditions (Advanced)": "条件 (高度)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "SOQL クエリを入力します。e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "CRM software oplossingen en enterprise cloud computing",
"Environment": "Milieu",
"Choose environment": "Kies omgeving",
"Production": "Productie",
"Development": "Ontwikkeling",
"Authenticate with Salesforce Production": "Authenticeer met Salesforce-productie",
"Add Contact to Campaign": "Contact toevoegen aan campagne",
"Add File to Record": "Voeg bestand toe aan Record",
"Add Lead to Campaign": "Voeg Lead toe aan Campagne",
"Create Attachment (Legacy)": "Nieuwe bijlage (erf)",
"Create Case": "Maak Geval",
"Create Contact": "Contactpersoon aanmaken",
"Create Lead": "Maak Lead",
"Create Note": "Notitie aanmaken",
"Create Opportunity": "Verkoopkans creëren",
"Create Record": "Record Maken",
"Create Task": "Taak maken",
"Delete Opportunity": "Verwijder kans",
"Delete Record": "Record verwijderen",
"Find Child Records": "Onderliggende records zoeken",
"Find Record": "Vind Record",
"Find Records by Query (Advanced)": "Vind Records op Query (Geavanceerd)",
"Get Record Attachments": "Haal Record Bijlagen op",
"Run Query (Advanced)": "Query uitvoeren (Geavanceerd)",
"Run Report": "Rapport uitvoeren",
"Send Email": "E-mail verzenden",
"Update Contact": "Contactpersoon bijwerken",
"Update Lead": "Lead bijwerken",
"Update Record": "Update Record",
"Batch Upsert (Advanced)": "Batch Upsert (Geavanceerd)",
"Bulk Upsert (Advanced)": "Bulk Upsert (Geavanceerd)",
"Custom API Call": "Custom API Call",
"Add a contact to a campaign.": "Een contactpersoon toevoegen aan een campagne.",
"Uploads a file and attaches it to an existing record.": "Uploaden van een bestand en hecht het aan een bestaand record.",
"Adds an existing lead to an existing campaign.": "Voegt een bestaande lead toe aan een bestaande campagne.",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "Maakt een legacy Attachment record. Salesforce raadt het gebruik van \"Add File to Record\" voor moderne apps.",
"Creates a Case, which represents a customer issue or problem.": "Maakt een Kant aan, die een klant issue of probleem biedt.",
"Creates a new contact record.": "Maakt een nieuw contact record.",
"Creates a new lead.": "Maakt een nieuwe lood.",
"Creates a note and attaches it to a record.": "Maakt een notitie aan en hecht die aan een record.",
"Creates a new opportunity.": "Maakt een nieuwe kans.",
"Create a record of a given object.": "Maak een record van een bepaald object.",
"Creates a new task.": "Maakt een nieuwe taak aan.",
"Deletes an opportunity.": "Hiermee verwijdert u een kans.",
"Deletes an existing record in an object.": "Verwijdert een bestaand record in een object.",
"Finds child records related to a parent record.": "Vindt onderliggende records gerelateerd aan een bovenliggend record.",
"Finds a record by a field value.": "Vindt een record met een veldwaarde.",
"Finds records in an object using a SOQL WHERE clause.": "Gevonden records in een object met een SOQL WHERE clausule.",
"Get all attachments (both classic and modern Files) for a record.": "Haal alle bijlagen (zowel klassieke als moderne bestanden) op voor een record.",
"Run a salesforce query": "Voer een sales force-query uit",
"Execute a Salesforce analytics report.": "Voer een Salesforce analytics rapport uit.",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "Stuurt een e-mail naar een Contact of Lead door het aanmaken van een e-mailberichtrecord.",
"Update an existing contact.": "Bestaande contactpersoon bijwerken.",
"Update an existing lead.": "Een bestaande lead bijwerken.",
"Updates an existing record.": "Werkt een bestaand record bij.",
"Batch upsert a record by external id": "Batch upsert een record met externe id",
"Bulk upsert a record by external id": "Bulk boven boven een record met externe id",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Campaign": "Campagne",
"Contact": "Contactpersoon",
"Status": "status",
"Object": "Object",
"Record": "Opnemen",
"File": "Bestand",
"File Name": "File Name",
"Lead": "Lood",
"Subject": "Onderwerp",
"Description": "Beschrijving",
"Priority": "Prioriteit",
"Origin": "Oorsprong",
"Account": "Rekening",
"Other Fields": "Andere velden",
"Last Name": "Achternaam",
"First Name": "Voornaam",
"Email": "E-mail",
"Phone": "Telefoonnummer",
"Title": "Aanspreektitel",
"Company": "Bedrijfsnaam",
"Lead Source": "Lead bron",
"Body": "Lichaam",
"Name": "Naam",
"Close Date": "Sluit datum",
"Stage": "Speelveld",
"Amount": "Hoeveelheid",
"Record Data": "Gegevens opnemen",
"Owner": "Eigenaar",
"Related To (Contact/Lead ID)": "Gerelateerd aan (Contact/Lead ID)",
"Related To (Other Object ID)": "Gerelateerd aan (ander object-ID)",
"Opportunity": "Kans",
"Parent Record": "Bovenliggende Record",
"Child Relationship": "Onderliggende relatie",
"Field": "Veld",
"Search Value": "Waarde zoeken",
"WHERE Clause": "WAARDE Clausule",
"Query": "Zoekopdracht",
"Report": "Rapporteren",
"Filters": "Filters",
"Recipient": "Ontvanger",
"Related To ID (Optional)": "Gerelateerd aan ID (optioneel)",
"Other Fields (Advanced)": "Andere velden (Geavanceerd)",
"Data to Update": "Gegevens om bij te werken",
"External Field": "Extern veld",
"Records": "Records",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"The campaign member status (e.g., 'Sent', 'Responded').": "De campagne lid status (bijv. 'Sent', 'Responded').",
"Select the Object": "Selecteer het object",
"The record to select. The list shows the 20 most recently created records.": "Het te selecteren record. De lijst toont de 20 meest recent gemaakte records.",
"The file to upload.": "Het te uploaden bestand.",
"The name of the file, including its extension (e.g., \"report.pdf\").": "De naam van het bestand, inclusief de extensie (bijv. \"report.pdf\").",
"The file to attach.": "Het bij te voegen bestand.",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "De naam van het bestand, inclusief de extensie (bijv. \"attachment.pdf\").",
"Enter additional fields as a JSON object.": "Voer extra velden in als JSON-object.",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "Voer extra velden in als een JSON object (bijv. {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).",
"The content of the note.": "De inhoud van de notitie.",
"The expected close date in YYYY-MM-DD format.": "De verwachte sluitingsdatum in YYYY-MM-DD formaat.",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "Voer de velden in voor het nieuwe record als JSON-object. Bijvoorbeeld: {\"Naam\": \"Mijn nieuwe account\", \"Industrie\": \"Technology\"}",
"The owner of the task.": "De eigenaar van de taak.",
"The ID of a Contact or Lead to relate the task to.": "Het ID van een contactpersoon of Lead om de taak mee te delen.",
"The ID of an Account, Opportunity, or other object to relate the task to.": "Het ID van een account, Opportunity, of een ander object om de taak aan te koppelen.",
"The parent record to find child records for. The list shows the 20 most recently created records.": "De bovenliggende record om onderliggende records voor te vinden. De lijst toont de 20 meest recent gemaakte records.",
"The child relationship to retrieve records from.": "De onderliggende relatie om records van op te halen.",
"Select the Field": "Selecteer het veld",
"The value to search for in the selected field.": "De waarde waarnaar gezocht moet worden in het geselecteerde veld.",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "Voer de WHERE clausule in voor uw SOQL query. Bijvoorbeeld: `Naam = 'Acme' EN industrie = 'Technology''. Bevat niet het 'WHERE' sleutelwoord.",
"Enter the query": "Voer de query in",
"Apply dynamic filters to the report run.": "Pas dynamische filters toe op het uitgevoerde rapport.",
"The content of the email. Can be plain text or HTML.": "De inhoud van de e-mail. Kan platte tekst of HTML zijn.",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "Het ID van een record om een e-mail te koppelen (bijv. een klant, Opportunity, of Zaak ID).",
"Enter any additional fields to update as a JSON object.": "Voer alle extra velden in om bij te werken als JSON-object.",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "Voer de velden in om bij te werken als JSON-object. Bijvoorbeeld: {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "Selecteer het externe veld",
"Select the Records": "Selecteer de Records",
"Select the Records (CSV format)": "De Records selecteren (CSV formaat)",
"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..",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Case Attachment": "Nieuwe verzoek bijlage",
"New Contact": "Nieuw contactpersoon",
"New Field History Event": "Nieuwe veldgeschiedenis gebeurtenis",
"New Lead": "Nieuwe Lead",
"New or Updated Record": "Nieuwe of bijgewerkte record",
"New Outbound Message": "Nieuw uitgaande bericht",
"New Record": "Nieuwe Record",
"New or Updated File": "Nieuw of bijgewerkt bestand",
"Fires when a new Attachment or File is added to any Case record.": "Vuurt wanneer een nieuwe bijlage of bestand is toegevoegd aan een zaak record.",
"Fires when a new Contact record is created in Salesforce.": "Vuurt wanneer een nieuw Contact record wordt aangemaakt in Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Vuurt wanneer een bijgehouden veld wordt bijgewerkt op een bepaald object.",
"Fires when a new Lead record is created in Salesforce.": "Vuurt af wanneer een nieuw Lead record wordt gemaakt in Salesforce.",
"Triggers when there is new or updated record": "Triggert wanneer er een nieuw of bijgewerkt record is",
"Fires when a new outbound message is received from Salesforce.": "Vuurt af wanneer een nieuw uitgaande bericht wordt ontvangen van Salesforce.",
"Triggers when there is new record": "Triggert wanneer er een nieuw record is",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Vuurt wanneer een bestand (ContentDocument) is gemaakt of bijgewerkt. Vuurt niet voor klassieke bijlagen of notities.",
"Conditions (Advanced)": "Voorwaarden (Geavanceerd)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Voer een SOQL query in waar clausule i is. Verwijderd = TRUE"
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "Soluções de software de CRM e computação empresarial",
"Environment": "Seguros",
"Choose environment": "Escolher ambiente",
"Production": "Produção",
"Development": "Desenvolvimento",
"Authenticate with Salesforce Production": "Autenticar com a produção do Salesforce",
"Add Contact to Campaign": "Adicionar Contato à Campanha",
"Add File to Record": "Adicionar Arquivo para Gravar",
"Add Lead to Campaign": "Adicionar Lead para Campanha",
"Create Attachment (Legacy)": "Criar Anexo (Legado)",
"Create Case": "Criar Ocorrência",
"Create Contact": "Criar contato",
"Create Lead": "Criar Potencial",
"Create Note": "Criar Nota",
"Create Opportunity": "Criar Oportunidade",
"Create Record": "Criar Registro",
"Create Task": "Criar tarefa",
"Delete Opportunity": "Excluir Oportunidade",
"Delete Record": "Excluir registro",
"Find Child Records": "Encontrar registros filhos",
"Find Record": "Localizar Registro",
"Find Records by Query (Advanced)": "Encontrar registros por consulta (Avançado)",
"Get Record Attachments": "Obter anexos de registro",
"Run Query (Advanced)": "Executar Consulta (Avançado)",
"Run Report": "Executar Relatório",
"Send Email": "Enviar e-mail",
"Update Contact": "Atualizar contato",
"Update Lead": "Atualizar Lead",
"Update Record": "Atualizar Registro",
"Batch Upsert (Advanced)": "Melhoria de Lote (Avançada)",
"Bulk Upsert (Advanced)": "Melhoria em Massa (Avançada)",
"Custom API Call": "Chamada de API personalizada",
"Add a contact to a campaign.": "Adicionar um contato a uma campanha.",
"Uploads a file and attaches it to an existing record.": "Carrega um arquivo e o anexa a um registro existente.",
"Adds an existing lead to an existing campaign.": "Adiciona um lead existente a uma campanha existente.",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "Cria um registro antigo de anexos. Salesforce recomenda usar \"Adicionar arquivo a gravação\" para aplicativos modernos.",
"Creates a Case, which represents a customer issue or problem.": "Cria um Caso, que representa um problema ou problema do cliente.",
"Creates a new contact record.": "Cria um novo registro de contato.",
"Creates a new lead.": "Cria um novo lead.",
"Creates a note and attaches it to a record.": "Cria uma nota e a anexa a um registro.",
"Creates a new opportunity.": "Cria uma nova oportunidade.",
"Create a record of a given object.": "Cria um registro de um determinado objeto.",
"Creates a new task.": "Cria uma nova tarefa.",
"Deletes an opportunity.": "Exclui uma oportunidade.",
"Deletes an existing record in an object.": "Exclui um registro existente em um objeto.",
"Finds child records related to a parent record.": "Localiza registros filhos relacionados a um registro pai.",
"Finds a record by a field value.": "Localiza um registro por um valor de campo.",
"Finds records in an object using a SOQL WHERE clause.": "Localiza registros em um objeto usando uma cláusula SOQL WHERE.",
"Get all attachments (both classic and modern Files) for a record.": "Obtenha todos os anexos (arquivos clássicos e modernos) para um registro.",
"Run a salesforce query": "Execute uma consulta salesforce",
"Execute a Salesforce analytics report.": "Execute um relatório de análise do Salesforce.",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "Envia um email para um contato ou chumbo, criando um registro EmailMessage.",
"Update an existing contact.": "Atualizar um contato existente.",
"Update an existing lead.": "Atualizar um lead existente.",
"Updates an existing record.": "Atualiza um registro existente.",
"Batch upsert a record by external id": "Lote upsert de um registro por id externo",
"Bulk upsert a record by external id": "Upsert em massa um registro por id externo",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Campaign": "Campanha",
"Contact": "contato",
"Status": "Estado",
"Object": "Objeto",
"Record": "Gravar",
"File": "Arquivo",
"File Name": "Nome do arquivo",
"Lead": "Conduzir",
"Subject": "Cargo",
"Description": "Descrição",
"Priority": "Prioridade",
"Origin": "Origem",
"Account": "conta",
"Other Fields": "Outros campos",
"Last Name": "Sobrenome",
"First Name": "Nome",
"Email": "e-mail",
"Phone": "Smartphone",
"Title": "Título",
"Company": "Empresas",
"Lead Source": "Fonte do Lead",
"Body": "Conteúdo",
"Name": "Nome",
"Close Date": "Data de Fechamento",
"Stage": "Etapa",
"Amount": "Quantidade",
"Record Data": "Gravar dados",
"Owner": "Proprietário",
"Related To (Contact/Lead ID)": "Relacionado a (Contato/ID do Potencial)",
"Related To (Other Object ID)": "Relacionados com (Outro ID do Objeto)",
"Opportunity": "Oportunidade",
"Parent Record": "Registro Pai",
"Child Relationship": "Relacionamento Filho",
"Field": "Campo",
"Search Value": "Pesquisar Valor",
"WHERE Clause": "WHERE Clause",
"Query": "Requisição",
"Report": "Denunciar",
"Filters": "Filtros",
"Recipient": "Destinatário",
"Related To ID (Optional)": "Relacionado ao ID (opcional)",
"Other Fields (Advanced)": "Outros campos (Avançado)",
"Data to Update": "Dados a serem atualizados",
"External Field": "Campo externo",
"Records": "registros",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"The campaign member status (e.g., 'Sent', 'Responded').": "O status do membro da campanha (ex.: 'Enviado', 'Responde').",
"Select the Object": "Selecionar objeto",
"The record to select. The list shows the 20 most recently created records.": "O registro a selecionar. A lista mostra os 20 registros criados mais recentemente.",
"The file to upload.": "O arquivo a ser enviado.",
"The name of the file, including its extension (e.g., \"report.pdf\").": "O nome do arquivo, incluindo sua extensão (por exemplo, \"report.pdf\").",
"The file to attach.": "O arquivo a ser anexado.",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "O nome do arquivo, incluindo sua extensão (por exemplo, \"attachment.pdf\").",
"Enter additional fields as a JSON object.": "Insira campos adicionais como um objeto JSON.",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "Digite os campos adicionais como um objeto JSON (ex: {\"Title\": \"Gerente\", \"Site\": \"http://exemplo.com\"}).",
"The content of the note.": "O conteúdo da nota.",
"The expected close date in YYYY-MM-DD format.": "A data de fechamento esperada no formato AAAA-MM-DD.",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "Digite os campos para o novo registro como um objeto JSON. Por exemplo: {\"Nome\": \"Minha nova conta\", \"Indústria\": \"Tecnologia\"}",
"The owner of the task.": "O proprietário da tarefa.",
"The ID of a Contact or Lead to relate the task to.": "O ID de um contato ou Lead para relacionar a tarefa.",
"The ID of an Account, Opportunity, or other object to relate the task to.": "A ID de uma Conta, Oportunidade ou outro objeto para relacionar a tarefa.",
"The parent record to find child records for. The list shows the 20 most recently created records.": "O registro pai para qual encontrar registros filhos para. A lista mostra os 20 registros criados mais recentemente.",
"The child relationship to retrieve records from.": "A relação filho para recuperar registros.",
"Select the Field": "Selecione o campo",
"The value to search for in the selected field.": "O valor a procurar no campo selecionado.",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "Digite a cláusula WHERE para a sua consulta SOQL. Por exemplo: `Nome = 'Acme' E Indústria = 'Tecnologia'`. Não inclua a palavra-chave 'WHERE'.",
"Enter the query": "Digite a consulta",
"Apply dynamic filters to the report run.": "Aplicar filtros dinâmicos à execução do relatório.",
"The content of the email. Can be plain text or HTML.": "O conteúdo do e-mail. Pode ser texto simples ou HTML.",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "A ID de um registro para relacionar o e-mail (por exemplo, uma conta, oportunidade ou ID do caso).",
"Enter any additional fields to update as a JSON object.": "Insira qualquer campo adicional para atualizar como um objeto JSON.",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "Digite os campos para atualizar como um objeto JSON. Por exemplo: {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "Selecione o campo externo",
"Select the Records": "Selecione os registros",
"Select the Records (CSV format)": "Selecione os registros (formato CSV)",
"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..",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Case Attachment": "Nova Ocorrência Anexo",
"New Contact": "Novo Contato",
"New Field History Event": "Novo Evento Histórico do Campo",
"New Lead": "Novo Potencial",
"New or Updated Record": "Registro novo ou atualizado",
"New Outbound Message": "Nova Mensagem de Saída",
"New Record": "Novo Registro",
"New or Updated File": "Arquivo novo ou atualizado",
"Fires when a new Attachment or File is added to any Case record.": "Atira quando um novo Anexo ou Arquivo é adicionado a qualquer registro de caso.",
"Fires when a new Contact record is created in Salesforce.": "Atira quando um novo registro de contato é criado no Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Atira quando um campo monitorado é atualizado em um objeto especificado.",
"Fires when a new Lead record is created in Salesforce.": "Atira quando um novo registro de Lead é criado em Salesforce.",
"Triggers when there is new or updated record": "Dispara quando há um registro novo ou atualizado",
"Fires when a new outbound message is received from Salesforce.": "Atira quando uma nova mensagem de saída é recebida do Salesforce.",
"Triggers when there is new record": "Dispara quando há um novo registro",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Atira quando um arquivo (ContentDocument) é criado ou atualizado. Não é acionado para anexos ou notas clássicas.",
"Conditions (Advanced)": "Condições (Avançadas)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Digite uma consulta SOQL onde a cláusula i. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,53 @@
{
"Salesforce": "Сделка",
"CRM software solutions and enterprise cloud computing": "Программные решения CRM и облачные вычисления",
"Environment": "Среда",
"Choose environment": "Выберите окружение",
"Production": "Производство",
"Development": "Развитие",
"Authenticate with Salesforce Production": "Аутентифицироваться с производством Salesforce",
"Run Query (Advanced)": "Запуск запроса (Дополнительно)",
"Create Object (Advanced)": "Создать объект (Дополнительно)",
"Update Object (Advanced)": "Обновить объект (Дополнительно)",
"Batch Upsert (Advanced)": "Пакетная верстка (Advanced)",
"Bulk Upsert (Advanced)": "Массовый Упсерт (продвинутый)",
"Custom API Call": "Пользовательский вызов API",
"Run a salesforce query": "Запустить запрос на продажу",
"Create new object": "Создать новый объект",
"Update object by Id": "Обновить объект по Id",
"Batch upsert a record by external id": "Пакетная вставка записи по внешнему id",
"Bulk upsert a record by external id": "Массовая поддержка записи по внешнему id",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Query": "Запрос",
"Object": "Объект",
"Data": "Данные",
"Id": "Id",
"External Field": "Внешнее поле",
"Records": "Отчеты",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"Enter the query": "Введите запрос",
"Select the Object": "Выберите объект",
"Select mapped object": "Выберите объект с сопоставлением",
"Select the Id": "Выберите Id",
"Select the External Field": "Выберите внешнее поле",
"Select the Records": "Выберите записи",
"Select the Records (CSV format)": "Выберите записи (формат CSV)",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Record": "Новая запись",
"New or Updated Record": "Новая или Обновленная запись",
"Triggers when there is new record": "Триггеры при появлении новой записи",
"Triggers when there is new or updated record": "Триггеры при наличии новых или обновленных записей",
"Conditions (Advanced)": "Условия (Дополнительно)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Введите SOQL запрос, где оператор i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "CRM software solutions and enterprise cloud computing",
"Environment": "Environment",
"Choose environment": "Choose environment",
"Production": "Production",
"Development": "Development",
"Authenticate with Salesforce Production": "Authenticate with Salesforce Production",
"Add Contact to Campaign": "Add Contact to Campaign",
"Add File to Record": "Add File to Record",
"Add Lead to Campaign": "Add Lead to Campaign",
"Create Attachment (Legacy)": "Create Attachment (Legacy)",
"Create Case": "Create Case",
"Create Contact": "Create Contact",
"Create Lead": "Create Lead",
"Create Note": "Create Note",
"Create Opportunity": "Create Opportunity",
"Create Record": "Create Record",
"Create Task": "Create Task",
"Delete Opportunity": "Delete Opportunity",
"Delete Record": "Delete Record",
"Find Child Records": "Find Child Records",
"Find Record": "Find Record",
"Find Records by Query (Advanced)": "Find Records by Query (Advanced)",
"Get Record Attachments": "Get Record Attachments",
"Run Query (Advanced)": "Run Query (Advanced)",
"Run Report": "Run Report",
"Send Email": "Send Email",
"Update Contact": "Update Contact",
"Update Lead": "Update Lead",
"Update Record": "Update Record",
"Batch Upsert (Advanced)": "Batch Upsert (Advanced)",
"Bulk Upsert (Advanced)": "Bulk Upsert (Advanced)",
"Custom API Call": "Custom API Call",
"Add a contact to a campaign.": "Add a contact to a campaign.",
"Uploads a file and attaches it to an existing record.": "Uploads a file and attaches it to an existing record.",
"Adds an existing lead to an existing campaign.": "Adds an existing lead to an existing campaign.",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.",
"Creates a Case, which represents a customer issue or problem.": "Creates a Case, which represents a customer issue or problem.",
"Creates a new contact record.": "Creates a new contact record.",
"Creates a new lead.": "Creates a new lead.",
"Creates a note and attaches it to a record.": "Creates a note and attaches it to a record.",
"Creates a new opportunity.": "Creates a new opportunity.",
"Create a record of a given object.": "Create a record of a given object.",
"Creates a new task.": "Creates a new task.",
"Deletes an opportunity.": "Deletes an opportunity.",
"Deletes an existing record in an object.": "Deletes an existing record in an object.",
"Finds child records related to a parent record.": "Finds child records related to a parent record.",
"Finds a record by a field value.": "Finds a record by a field value.",
"Finds records in an object using a SOQL WHERE clause.": "Finds records in an object using a SOQL WHERE clause.",
"Get all attachments (both classic and modern Files) for a record.": "Get all attachments (both classic and modern Files) for a record.",
"Run a salesforce query": "Run a salesforce query",
"Execute a Salesforce analytics report.": "Execute a Salesforce analytics report.",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "Sends an email to a Contact or Lead by creating an EmailMessage record.",
"Update an existing contact.": "Update an existing contact.",
"Update an existing lead.": "Update an existing lead.",
"Updates an existing record.": "Updates an existing record.",
"Batch upsert a record by external id": "Batch upsert a record by external id",
"Bulk upsert a record by external id": "Bulk upsert a record by external id",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Campaign": "Campaign",
"Contact": "Contact",
"Status": "Status",
"Object": "Object",
"Record": "Record",
"File": "File",
"File Name": "File Name",
"Lead": "Lead",
"Subject": "Subject",
"Description": "Description",
"Priority": "Priority",
"Origin": "Origin",
"Account": "Account",
"Other Fields": "Other Fields",
"Last Name": "Last Name",
"First Name": "First Name",
"Email": "Email",
"Phone": "Phone",
"Title": "Title",
"Company": "Company",
"Lead Source": "Lead Source",
"Body": "Body",
"Name": "Name",
"Close Date": "Close Date",
"Stage": "Stage",
"Amount": "Amount",
"Record Data": "Record Data",
"Owner": "Owner",
"Related To (Contact/Lead ID)": "Related To (Contact/Lead ID)",
"Related To (Other Object ID)": "Related To (Other Object ID)",
"Opportunity": "Opportunity",
"Parent Record": "Parent Record",
"Child Relationship": "Child Relationship",
"Field": "Field",
"Search Value": "Search Value",
"WHERE Clause": "WHERE Clause",
"Query": "Query",
"Report": "Report",
"Filters": "Filters",
"Recipient": "Recipient",
"Related To ID (Optional)": "Related To ID (Optional)",
"Other Fields (Advanced)": "Other Fields (Advanced)",
"Data to Update": "Data to Update",
"External Field": "External Field",
"Records": "Records",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The campaign member status (e.g., 'Sent', 'Responded').": "The campaign member status (e.g., 'Sent', 'Responded').",
"Select the Object": "Select the Object",
"The record to select. The list shows the 20 most recently created records.": "The record to select. The list shows the 20 most recently created records.",
"The file to upload.": "The file to upload.",
"The name of the file, including its extension (e.g., \"report.pdf\").": "The name of the file, including its extension (e.g., \"report.pdf\").",
"The file to attach.": "The file to attach.",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "The name of the file, including its extension (e.g., \"attachment.pdf\").",
"Enter additional fields as a JSON object.": "Enter additional fields as a JSON object.",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).",
"The content of the note.": "The content of the note.",
"The expected close date in YYYY-MM-DD format.": "The expected close date in YYYY-MM-DD format.",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}",
"The owner of the task.": "The owner of the task.",
"The ID of a Contact or Lead to relate the task to.": "The ID of a Contact or Lead to relate the task to.",
"The ID of an Account, Opportunity, or other object to relate the task to.": "The ID of an Account, Opportunity, or other object to relate the task to.",
"The parent record to find child records for. The list shows the 20 most recently created records.": "The parent record to find child records for. The list shows the 20 most recently created records.",
"The child relationship to retrieve records from.": "The child relationship to retrieve records from.",
"Select the Field": "Select the Field",
"The value to search for in the selected field.": "The value to search for in the selected field.",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.",
"Enter the query": "Enter the query",
"Apply dynamic filters to the report run.": "Apply dynamic filters to the report run.",
"The content of the email. Can be plain text or HTML.": "The content of the email. Can be plain text or HTML.",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).",
"Enter any additional fields to update as a JSON object.": "Enter any additional fields to update as a JSON object.",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "Select the External Field",
"Select the Records": "Select the Records",
"Select the Records (CSV format)": "Select the Records (CSV format)",
"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..",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Case Attachment": "New Case Attachment",
"New Contact": "New Contact",
"New Field History Event": "New Field History Event",
"New Lead": "New Lead",
"New or Updated Record": "New or Updated Record",
"New Outbound Message": "New Outbound Message",
"New Record": "New Record",
"New or Updated File": "New or Updated File",
"Fires when a new Attachment or File is added to any Case record.": "Fires when a new Attachment or File is added to any Case record.",
"Fires when a new Contact record is created in Salesforce.": "Fires when a new Contact record is created in Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Fires when a tracked field is updated on a specified object.",
"Fires when a new Lead record is created in Salesforce.": "Fires when a new Lead record is created in Salesforce.",
"Triggers when there is new or updated record": "Triggers when there is new or updated record",
"Fires when a new outbound message is received from Salesforce.": "Fires when a new outbound message is received from Salesforce.",
"Triggers when there is new record": "Triggers when there is new record",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.",
"Conditions (Advanced)": "Conditions (Advanced)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,53 @@
{
"Salesforce": "Salesforce",
"CRM software solutions and enterprise cloud computing": "CRM software solutions and enterprise cloud computing",
"Environment": "Environment",
"Choose environment": "Choose environment",
"Production": "Production",
"Development": "Development",
"Authenticate with Salesforce Production": "Authenticate with Salesforce Production",
"Run Query (Advanced)": "Run Query (Advanced)",
"Create Object (Advanced)": "Create Object (Advanced)",
"Update Object (Advanced)": "Update Object (Advanced)",
"Batch Upsert (Advanced)": "Batch Upsert (Advanced)",
"Bulk Upsert (Advanced)": "Bulk Upsert (Advanced)",
"Custom API Call": "Custom API Call",
"Run a salesforce query": "Run a salesforce query",
"Create new object": "Create new object",
"Update object by Id": "Update object by Id",
"Batch upsert a record by external id": "Batch upsert a record by external id",
"Bulk upsert a record by external id": "Bulk upsert a record by external id",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Query": "Query",
"Object": "Object",
"Data": "Data",
"Id": "Id",
"External Field": "External Field",
"Records": "Records",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Enter the query": "Enter the query",
"Select the Object": "Select the Object",
"Select mapped object": "Select mapped object",
"Select the Id": "Select the Id",
"Select the External Field": "Select the External Field",
"Select the Records": "Select the Records",
"Select the Records (CSV format)": "Select the Records (CSV format)",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Record": "New Record",
"New or Updated Record": "New or Updated Record",
"Triggers when there is new record": "Triggers when there is new record",
"Triggers when there is new or updated record": "Triggers when there is new or updated record",
"Conditions (Advanced)": "Conditions (Advanced)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,166 @@
{
"CRM software solutions and enterprise cloud computing": "CRM software solutions and enterprise cloud computing",
"Environment": "Environment",
"Choose environment": "Choose environment",
"Production": "Production",
"Development": "Development",
"Authenticate with Salesforce Production": "Authenticate with Salesforce Production",
"Add Contact to Campaign": "Add Contact to Campaign",
"Add File to Record": "Add File to Record",
"Add Lead to Campaign": "Add Lead to Campaign",
"Create Attachment (Legacy)": "Create Attachment (Legacy)",
"Create Case": "Create Case",
"Create Contact": "Create Contact",
"Create Lead": "Create Lead",
"Create Note": "Create Note",
"Create Opportunity": "Create Opportunity",
"Create Record": "Create Record",
"Create Task": "Create Task",
"Delete Opportunity": "Delete Opportunity",
"Delete Record": "Delete Record",
"Find Child Records": "Find Child Records",
"Find Record": "Find Record",
"Find Records by Query (Advanced)": "Find Records by Query (Advanced)",
"Get Record Attachments": "Get Record Attachments",
"Run Query (Advanced)": "Run Query (Advanced)",
"Run Report": "Run Report",
"Send Email": "Send Email",
"Update Contact": "Update Contact",
"Update Lead": "Update Lead",
"Update Record": "Update Record",
"Batch Upsert (Advanced)": "Batch Upsert (Advanced)",
"Bulk Upsert (Advanced)": "Bulk Upsert (Advanced)",
"Custom API Call": "自定义 API 呼叫",
"Add a contact to a campaign.": "Add a contact to a campaign.",
"Uploads a file and attaches it to an existing record.": "Uploads a file and attaches it to an existing record.",
"Adds an existing lead to an existing campaign.": "Adds an existing lead to an existing campaign.",
"Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.": "Creates a legacy Attachment record. Salesforce recommends using \"Add File to Record\" for modern apps.",
"Creates a Case, which represents a customer issue or problem.": "Creates a Case, which represents a customer issue or problem.",
"Creates a new contact record.": "Creates a new contact record.",
"Creates a new lead.": "Creates a new lead.",
"Creates a note and attaches it to a record.": "Creates a note and attaches it to a record.",
"Creates a new opportunity.": "Creates a new opportunity.",
"Create a record of a given object.": "Create a record of a given object.",
"Creates a new task.": "Creates a new task.",
"Deletes an opportunity.": "Deletes an opportunity.",
"Deletes an existing record in an object.": "Deletes an existing record in an object.",
"Finds child records related to a parent record.": "Finds child records related to a parent record.",
"Finds a record by a field value.": "Finds a record by a field value.",
"Finds records in an object using a SOQL WHERE clause.": "Finds records in an object using a SOQL WHERE clause.",
"Get all attachments (both classic and modern Files) for a record.": "Get all attachments (both classic and modern Files) for a record.",
"Run a salesforce query": "Run a salesforce query",
"Execute a Salesforce analytics report.": "Execute a Salesforce analytics report.",
"Sends an email to a Contact or Lead by creating an EmailMessage record.": "Sends an email to a Contact or Lead by creating an EmailMessage record.",
"Update an existing contact.": "Update an existing contact.",
"Update an existing lead.": "Update an existing lead.",
"Updates an existing record.": "Updates an existing record.",
"Batch upsert a record by external id": "Batch upsert a record by external id",
"Bulk upsert a record by external id": "Bulk upsert a record by external id",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Campaign": "Campaign",
"Contact": "Contact",
"Status": "状态",
"Object": "Object",
"Record": "Record",
"File": "文件",
"File Name": "File Name",
"Lead": "Lead",
"Subject": "Subject",
"Description": "描述",
"Priority": "Priority",
"Origin": "Origin",
"Account": "Account",
"Other Fields": "Other Fields",
"Last Name": "名字",
"First Name": "名字",
"Email": "电子邮件地址",
"Phone": "Phone",
"Title": "标题",
"Company": "Company",
"Lead Source": "Lead Source",
"Body": "正文内容",
"Name": "名称",
"Close Date": "Close Date",
"Stage": "Stage",
"Amount": "Amount",
"Record Data": "Record Data",
"Owner": "所有者",
"Related To (Contact/Lead ID)": "Related To (Contact/Lead ID)",
"Related To (Other Object ID)": "Related To (Other Object ID)",
"Opportunity": "Opportunity",
"Parent Record": "Parent Record",
"Child Relationship": "Child Relationship",
"Field": "字段",
"Search Value": "搜索值",
"WHERE Clause": "WHERE Clause",
"Query": "Query",
"Report": "Report",
"Filters": "篩選條件",
"Recipient": "Recipient",
"Related To ID (Optional)": "Related To ID (Optional)",
"Other Fields (Advanced)": "Other Fields (Advanced)",
"Data to Update": "Data to Update",
"External Field": "External Field",
"Records": "Records",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"The campaign member status (e.g., 'Sent', 'Responded').": "The campaign member status (e.g., 'Sent', 'Responded').",
"Select the Object": "Select the Object",
"The record to select. The list shows the 20 most recently created records.": "The record to select. The list shows the 20 most recently created records.",
"The file to upload.": "The file to upload.",
"The name of the file, including its extension (e.g., \"report.pdf\").": "The name of the file, including its extension (e.g., \"report.pdf\").",
"The file to attach.": "The file to attach.",
"The name of the file, including its extension (e.g., \"attachment.pdf\").": "The name of the file, including its extension (e.g., \"attachment.pdf\").",
"Enter additional fields as a JSON object.": "Enter additional fields as a JSON object.",
"Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).": "Enter additional fields as a JSON object (e.g., {\"Title\": \"Manager\", \"Website\": \"http://example.com\"}).",
"The content of the note.": "The content of the note.",
"The expected close date in YYYY-MM-DD format.": "The expected close date in YYYY-MM-DD format.",
"Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}": "Enter the fields for the new record as a JSON object. For example: {\"Name\": \"My New Account\", \"Industry\": \"Technology\"}",
"The owner of the task.": "The owner of the task.",
"The ID of a Contact or Lead to relate the task to.": "The ID of a Contact or Lead to relate the task to.",
"The ID of an Account, Opportunity, or other object to relate the task to.": "The ID of an Account, Opportunity, or other object to relate the task to.",
"The parent record to find child records for. The list shows the 20 most recently created records.": "The parent record to find child records for. The list shows the 20 most recently created records.",
"The child relationship to retrieve records from.": "The child relationship to retrieve records from.",
"Select the Field": "Select the Field",
"The value to search for in the selected field.": "The value to search for in the selected field.",
"Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.": "Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.",
"Enter the query": "Enter the query",
"Apply dynamic filters to the report run.": "Apply dynamic filters to the report run.",
"The content of the email. Can be plain text or HTML.": "The content of the email. Can be plain text or HTML.",
"The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).": "The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).",
"Enter any additional fields to update as a JSON object.": "Enter any additional fields to update as a JSON object.",
"Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}": "Enter the fields to update as a JSON object. For example: {\"BillingCity\": \"San Francisco\"}",
"Select the External Field": "Select the External Field",
"Select the Records": "Select the Records",
"Select the Records (CSV format)": "Select the Records (CSV format)",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Case Attachment": "New Case Attachment",
"New Contact": "New Contact",
"New Field History Event": "New Field History Event",
"New Lead": "New Lead",
"New or Updated Record": "New or Updated Record",
"New Outbound Message": "New Outbound Message",
"New Record": "New Record",
"New or Updated File": "New or Updated File",
"Fires when a new Attachment or File is added to any Case record.": "Fires when a new Attachment or File is added to any Case record.",
"Fires when a new Contact record is created in Salesforce.": "Fires when a new Contact record is created in Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Fires when a tracked field is updated on a specified object.",
"Fires when a new Lead record is created in Salesforce.": "Fires when a new Lead record is created in Salesforce.",
"Triggers when there is new or updated record": "Triggers when there is new or updated record",
"Fires when a new outbound message is received from Salesforce.": "Fires when a new outbound message is received from Salesforce.",
"Triggers when there is new record": "Triggers when there is new record",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.",
"Conditions (Advanced)": "Conditions (Advanced)",
"Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE"
}

View File

@@ -0,0 +1,135 @@
import {
PieceAuth,
Property,
createPiece,
OAuth2PropertyValue,
} from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import { addContactToCampaign } from './lib/action/add-contact-to-campaign';
import { addFileToRecord } from './lib/action/add-file-to-record';
import { addLeadToCampaign } from './lib/action/add-lead-to-campaign';
import { createAttachment } from './lib/action/create-attachment';
import { createCase } from './lib/action/create-case';
import { createContact } from './lib/action/create-contact';
import { createLead } from './lib/action/create-lead';
import { createNote } from './lib/action/create-note';
import { createOpportunity } from './lib/action/create-opportunity';
import { createRecord } from './lib/action/create-record';
import { createTask } from './lib/action/create-task';
import { deleteOpportunity } from './lib/action/delete-opportunity';
import { deleteRecord } from './lib/action/delete-record';
import { findChildRecords } from './lib/action/find-child-records';
import { findRecord } from './lib/action/find-record';
import { findRecordsByQuery } from './lib/action/find-records-by-query';
import { getRecordAttachments } from './lib/action/get-record-attachments';
import { runQuery } from './lib/action/run-sf-query';
import { runReport } from './lib/action/run-report';
import { sendEmail } from './lib/action/send-email';
import { updateContact } from './lib/action/update-contact';
import { updateLead } from './lib/action/update-lead';
import { updateRecord } from './lib/action/update-record';
import { upsertByExternalId } from './lib/action/upsert-by-external-id';
import { upsertByExternalIdBulk } from './lib/action/upsert-by-external-id-bulk';
import { newCaseAttachment } from './lib/trigger/new-case-attachment';
import { newContact } from './lib/trigger/new-contact';
import { newFieldHistoryEvent } from './lib/trigger/new-field-history-event';
import { newLead } from './lib/trigger/new-lead';
import { newOrUpdatedRecord } from './lib/trigger/new-updated-record';
import { newOutboundMessage } from './lib/trigger/new-outbound-message';
import { newRecord } from './lib/trigger/new-record';
import { newUpdatedFile } from './lib/trigger/new-updated-file';
export const salesforceAuth = PieceAuth.OAuth2({
props: {
environment: Property.StaticDropdown({
displayName: 'Environment',
description: 'Choose environment',
required: true,
options: {
options: [
{
label: 'Production',
value: 'login',
},
{
label: 'Development',
value: 'test',
},
],
},
defaultValue: 'login',
}),
},
required: true,
description: 'Authenticate with Salesforce Production',
authUrl: 'https://{environment}.salesforce.com/services/oauth2/authorize',
tokenUrl: 'https://{environment}.salesforce.com/services/oauth2/token',
scope: ['refresh_token', 'full' ,'api'],
});
export const salesforce = createPiece({
displayName: 'Salesforce',
description: 'CRM software solutions and enterprise cloud computing',
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/salesforce.png',
authors: [
'HKudria',
'tanoggy',
'landonmoir',
'kishanprmr',
'khaledmashaly',
'abuaboud',
'Pranith124',
],
categories: [PieceCategory.SALES_AND_CRM],
auth: salesforceAuth,
actions: [
addContactToCampaign,
addFileToRecord,
addLeadToCampaign,
createAttachment,
createCase,
createContact,
createLead,
createNote,
createOpportunity,
createRecord,
createTask,
deleteOpportunity,
deleteRecord,
findChildRecords,
findRecord,
findRecordsByQuery,
getRecordAttachments,
runQuery,
runReport,
sendEmail,
updateContact,
updateLead,
updateRecord,
upsertByExternalId,
upsertByExternalIdBulk,
createCustomApiCallAction({
baseUrl: (auth) => (auth as OAuth2PropertyValue).data['instance_url'],
auth: salesforceAuth,
authMapping: async (auth) => ({
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
}),
}),
],
triggers: [
newCaseAttachment,
newContact,
newFieldHistoryEvent,
newLead,
newOrUpdatedRecord,
newOutboundMessage,
newRecord,
newUpdatedFile,
],
});

View File

@@ -0,0 +1,34 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const addContactToCampaign = createAction({
auth: salesforceAuth,
name: 'add_contact_to_campaign',
displayName: 'Add Contact to Campaign',
description: 'Add a contact to a campaign.',
props: {
campaign_id: salesforcesCommon.campaign,
contact_id: salesforcesCommon.contact,
status: salesforcesCommon.status,
},
async run(context) {
const { campaign_id, contact_id, status } = context.propsValue;
const body = {
CampaignId: campaign_id,
ContactId: contact_id,
Status: status,
};
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/CampaignMember',
body
);
return response.body;
},
});

View File

@@ -0,0 +1,44 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const addFileToRecord = createAction({
auth: salesforceAuth,
name: 'add_file_to_record',
displayName: 'Add File to Record',
description: 'Uploads a file and attaches it to an existing record.',
props: {
object: salesforcesCommon.object,
record_id: salesforcesCommon.record,
file: Property.File({
displayName: 'File',
description: 'The file to upload.',
required: true,
}),
file_name: Property.ShortText({
displayName: 'File Name',
description: 'The name of the file, including its extension (e.g., "report.pdf").',
required: true,
})
},
async run(context) {
const { record_id, file, file_name } = context.propsValue;
const body = {
Title: file_name,
PathOnClient: file_name,
VersionData: file.base64,
FirstPublishLocationId: record_id,
};
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/ContentVersion',
body
);
return response.body;
},
});

View File

@@ -0,0 +1,34 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const addLeadToCampaign = createAction({
auth: salesforceAuth,
name: 'add_lead_to_campaign',
displayName: 'Add Lead to Campaign',
description: 'Adds an existing lead to an existing campaign.',
props: {
campaign_id: salesforcesCommon.campaign,
lead_id: salesforcesCommon.lead,
status: salesforcesCommon.status,
},
async run(context) {
const { campaign_id, lead_id, status } = context.propsValue;
const body = {
CampaignId: campaign_id,
LeadId: lead_id,
Status: status,
};
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/CampaignMember',
body
);
return response.body;
},
});

View File

@@ -0,0 +1,43 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createAttachment = createAction({
auth: salesforceAuth,
name: 'create_attachment',
displayName: 'Create Attachment (Legacy)',
description: 'Creates a legacy Attachment record. Salesforce recommends using "Add File to Record" for modern apps.',
props: {
object: salesforcesCommon.object,
parent_id: salesforcesCommon.record,
file: Property.File({
displayName: 'File',
description: 'The file to attach.',
required: true,
}),
file_name: Property.ShortText({
displayName: 'File Name',
description: 'The name of the file, including its extension (e.g., "attachment.pdf").',
required: true,
})
},
async run(context) {
const { parent_id, file, file_name } = context.propsValue;
const body = {
ParentId: parent_id,
Name: file_name,
Body: file.base64,
};
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/Attachment',
body
);
return response.body;
},
});

View File

@@ -0,0 +1,70 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createCase = createAction({
auth: salesforceAuth,
name: 'create_case',
displayName: 'Create Case',
description: 'Creates a Case, which represents a customer issue or problem.',
props: {
Subject: Property.ShortText({
displayName: 'Subject',
required: true,
}),
Description: Property.LongText({
displayName: 'Description',
required: false,
}),
Status: salesforcesCommon.caseStatus,
Priority: salesforcesCommon.casePriority,
Origin: salesforcesCommon.caseOrigin,
AccountId: salesforcesCommon.account,
ContactId: salesforcesCommon.optionalContact,
other_fields: Property.Json({
displayName: 'Other Fields',
description: 'Enter additional fields as a JSON object.',
required: false
})
},
async run(context) {
const {
Subject,
Description,
Status,
Priority,
Origin,
AccountId,
ContactId,
other_fields
} = context.propsValue;
const rawBody = {
Subject,
Description,
Status,
Priority,
Origin,
AccountId,
ContactId,
...(other_fields || {}),
};
const cleanedBody = Object.entries(rawBody).reduce((acc, [key, value]) => {
if (value !== undefined && value !== null && value !== '') {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/Case',
cleanedBody
);
return response.body;
},
});

View File

@@ -0,0 +1,77 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createContact = createAction({
auth: salesforceAuth,
name: 'create_contact',
displayName: 'Create Contact',
description: 'Creates a new contact record.',
props: {
LastName: Property.ShortText({
displayName: 'Last Name',
required: true,
}),
FirstName: Property.ShortText({
displayName: 'First Name',
required: false,
}),
AccountId: salesforcesCommon.account,
Email: Property.ShortText({
displayName: 'Email',
required: false,
}),
Phone: Property.ShortText({
displayName: 'Phone',
required: false,
}),
Title: Property.ShortText({
displayName: 'Title',
required: false,
}),
other_fields: Property.Json({
displayName: 'Other Fields',
description: 'Enter additional fields as a JSON object.',
required: false
})
},
async run(context) {
const {
LastName,
FirstName,
AccountId,
Email,
Phone,
Title,
other_fields
} = context.propsValue;
const rawBody = {
LastName,
FirstName,
AccountId,
Email,
Phone,
Title,
...(other_fields || {}),
};
const cleanedBody = Object.entries(rawBody).reduce((acc, [key, value]) => {
if (value !== undefined && value !== null && value !== '') {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/Contact',
cleanedBody
);
return response.body;
},
});

View File

@@ -0,0 +1,78 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createLead = createAction({
auth: salesforceAuth,
name: 'create_lead',
displayName: 'Create Lead',
description: 'Creates a new lead.',
props: {
LastName: Property.ShortText({
displayName: 'Last Name',
required: true,
}),
Company: Property.ShortText({
displayName: 'Company',
required: true,
}),
FirstName: Property.ShortText({
displayName: 'First Name',
required: false,
}),
Email: Property.ShortText({
displayName: 'Email',
required: false,
}),
Phone: Property.ShortText({
displayName: 'Phone',
required: false,
}),
LeadSource: salesforcesCommon.leadSource,
other_fields: Property.Json({
displayName: 'Other Fields',
description: 'Enter additional fields as a JSON object (e.g., {"Title": "Manager", "Website": "http://example.com"}).',
required: false
})
},
async run(context) {
const {
LastName,
Company,
FirstName,
Email,
Phone,
LeadSource,
other_fields
} = context.propsValue;
const rawBody = {
LastName,
Company,
FirstName,
Email,
Phone,
LeadSource,
...(other_fields || {}),
};
const cleanedBody = Object.entries(rawBody).reduce((acc, [key, value]) => {
if (value !== undefined && value !== null && value !== '') {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/Lead',
cleanedBody
);
return response.body;
},
});

View File

@@ -0,0 +1,32 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { callSalesforceApi, salesforcesCommon } from '../common';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
export const createNewObject = createAction({
auth: salesforceAuth,
name: 'create_new_object',
displayName: 'Create Object (Advanced)',
description: 'Create new object',
props: {
object: salesforcesCommon.object,
data: Property.Json({
displayName: 'Data',
description: 'Select mapped object',
required: true,
defaultValue: {},
}),
},
async run(context) {
const { data, object } = context.propsValue;
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
`/services/data/v56.0/sobjects/${object}`,
{
...data,
}
);
return response;
},
});

View File

@@ -0,0 +1,42 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createNote = createAction({
auth: salesforceAuth,
name: 'create_note',
displayName: 'Create Note',
description: 'Creates a note and attaches it to a record.',
props: {
object: salesforcesCommon.object,
parent_id: salesforcesCommon.record,
Title: Property.ShortText({
displayName: 'Title',
required: true,
}),
Body: Property.LongText({
displayName: 'Body',
description: 'The content of the note.',
required: true,
}),
},
async run(context) {
const { parent_id, Title, Body } = context.propsValue;
const body = {
ParentId: parent_id,
Title: Title,
Body: Body,
};
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/Note',
body
);
return response.body;
},
});

View File

@@ -0,0 +1,69 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createOpportunity = createAction({
auth: salesforceAuth,
name: 'create_opportunity',
displayName: 'Create Opportunity',
description: 'Creates a new opportunity.',
props: {
Name: Property.ShortText({
displayName: 'Name',
required: true,
}),
CloseDate: Property.ShortText({
displayName: 'Close Date',
description: 'The expected close date in YYYY-MM-DD format.',
required: true,
}),
StageName: salesforcesCommon.opportunityStage,
AccountId: salesforcesCommon.account,
Amount: Property.Number({
displayName: 'Amount',
required: false,
}),
other_fields: Property.Json({
displayName: 'Other Fields',
description: 'Enter additional fields as a JSON object.',
required: false
})
},
async run(context) {
const {
Name,
CloseDate,
StageName,
AccountId,
Amount,
other_fields
} = context.propsValue;
const rawBody = {
Name,
CloseDate,
StageName,
AccountId,
Amount,
...(other_fields || {}),
};
const cleanedBody = Object.entries(rawBody).reduce((acc, [key, value]) => {
if (value !== undefined && value !== null && value !== '') {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/Opportunity',
cleanedBody
);
return response.body;
},
});

View File

@@ -0,0 +1,36 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createRecord = createAction({
auth: salesforceAuth,
name: 'create_record',
displayName: 'Create Record',
description: 'Create a record of a given object.',
props: {
object: salesforcesCommon.object,
data: Property.Json({
displayName: 'Record Data',
description: 'Enter the fields for the new record as a JSON object. For example: {"Name": "My New Account", "Industry": "Technology"}',
required: true,
defaultValue: {},
}),
},
async run(context) {
const { object, data } = context.propsValue;
if (!object) {
throw new Error('Object is not defined. Please select an object.');
}
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
`/services/data/v56.0/sobjects/${object}`,
data as Record<string, unknown>
);
return response.body;
},
});

View File

@@ -0,0 +1,71 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const createTask = createAction({
auth: salesforceAuth,
name: 'create_task',
displayName: 'Create Task',
description: 'Creates a new task.',
props: {
Subject: Property.ShortText({
displayName: 'Subject',
required: true,
}),
OwnerId: salesforcesCommon.owner,
Status: salesforcesCommon.taskStatus,
Priority: salesforcesCommon.taskPriority,
Description: Property.LongText({
displayName: 'Description',
required: false,
}),
WhoId: Property.ShortText({
displayName: 'Related To (Contact/Lead ID)',
description: 'The ID of a Contact or Lead to relate the task to.',
required: false,
}),
WhatId: Property.ShortText({
displayName: 'Related To (Other Object ID)',
description: 'The ID of an Account, Opportunity, or other object to relate the task to.',
required: false,
}),
},
async run(context) {
const {
Subject,
OwnerId,
Status,
Priority,
Description,
WhoId,
WhatId
} = context.propsValue;
const rawBody = {
Subject,
OwnerId,
Status,
Priority,
Description,
WhoId,
WhatId
};
const cleanedBody = Object.entries(rawBody).reduce((acc, [key, value]) => {
if (value !== undefined && value !== null && value !== '') {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
'/services/data/v56.0/sobjects/Task',
cleanedBody
);
return response.body;
},
});

View File

@@ -0,0 +1,28 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const deleteOpportunity = createAction({
auth: salesforceAuth,
name: 'delete_opportunity',
displayName: 'Delete Opportunity',
description: 'Deletes an opportunity.',
props: {
opportunity_id: salesforcesCommon.opportunity,
},
async run(context) {
const { opportunity_id } = context.propsValue;
await callSalesforceApi(
HttpMethod.DELETE,
context.auth,
`/services/data/v56.0/sobjects/Opportunity/${opportunity_id}`,
undefined
);
return {
success: true,
};
},
});

View File

@@ -0,0 +1,33 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const deleteRecord = createAction({
auth: salesforceAuth,
name: 'delete_record',
displayName: 'Delete Record',
description: 'Deletes an existing record in an object.',
props: {
object: salesforcesCommon.object,
record_id: salesforcesCommon.record,
},
async run(context) {
const { object, record_id } = context.propsValue;
if (!object) {
throw new Error('Object is not defined. Please select an object.');
}
await callSalesforceApi(
HttpMethod.DELETE,
context.auth,
`/services/data/v56.0/sobjects/${object}/${record_id}`,
undefined
);
return {
success: true,
};
},
});

View File

@@ -0,0 +1,28 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const findChildRecords = createAction({
auth: salesforceAuth,
name: 'find_child_records',
displayName: 'Find Child Records',
description: 'Finds child records related to a parent record.',
props: {
parent_object: salesforcesCommon.object,
parent_id: salesforcesCommon.parentRecord,
child_relationship: salesforcesCommon.childRelationship,
},
async run(context) {
const { parent_id, child_relationship } = context.propsValue;
const response = await callSalesforceApi(
HttpMethod.GET,
context.auth,
`/services/data/v56.0/ui-api/records/${parent_id}/child-relationships/${child_relationship}`,
undefined
);
return response.body;
},
});

View File

@@ -0,0 +1,39 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { querySalesforceApi, salesforcesCommon } from '../common';
export const findRecord = createAction({
auth: salesforceAuth,
name: 'find_record',
displayName: 'Find Record',
description: 'Finds a record by a field value.',
props: {
object: salesforcesCommon.object,
field: salesforcesCommon.field,
search_value: Property.ShortText({
displayName: 'Search Value',
description: 'The value to search for in the selected field.',
required: true,
})
},
async run(context) {
const { object, field, search_value } = context.propsValue;
if (!object || !field) {
throw new Error('Object and Field must be selected.');
}
const escapedSearchValue = search_value.replace(/'/g, "\\'");
const query = `SELECT FIELDS(ALL) FROM ${object} WHERE ${field} = '${escapedSearchValue}' LIMIT 2000`;
const response = await querySalesforceApi(
HttpMethod.GET,
context.auth,
query
);
return response.body;
},
});

View File

@@ -0,0 +1,36 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { querySalesforceApi, salesforcesCommon } from '../common';
export const findRecordsByQuery = createAction({
auth: salesforceAuth,
name: 'find_records_by_query',
displayName: 'Find Records by Query (Advanced)',
description: 'Finds records in an object using a SOQL WHERE clause.',
props: {
object: salesforcesCommon.object,
where_clause: Property.ShortText({
displayName: 'WHERE Clause',
description: "Enter the WHERE clause for your SOQL query. For example: `Name = 'Acme' AND Industry = 'Technology'`. Do not include the 'WHERE' keyword.",
required: true,
})
},
async run(context) {
const { object, where_clause } = context.propsValue;
if (!object) {
throw new Error('Object must be selected.');
}
const query = `SELECT FIELDS(ALL) FROM ${object} WHERE ${where_clause} LIMIT 200`;
const response = await querySalesforceApi(
HttpMethod.GET,
context.auth,
query
);
return response.body;
},
});

View File

@@ -0,0 +1,51 @@
import { createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { querySalesforceApi, salesforcesCommon } from '../common';
interface QueryResult {
records: any[];
}
export const getRecordAttachments = createAction({
auth: salesforceAuth,
name: 'get_record_attachments',
displayName: 'Get Record Attachments',
description: 'Get all attachments (both classic and modern Files) for a record.',
props: {
object: salesforcesCommon.object,
record_id: salesforcesCommon.record,
},
async run(context) {
const { record_id } = context.propsValue;
const classicAttachmentsQuery = `SELECT Id, Name, BodyLength, ContentType FROM Attachment WHERE ParentId = '${record_id}'`;
const classicAttachmentsResponse = await querySalesforceApi<QueryResult>(
HttpMethod.GET,
context.auth,
classicAttachmentsQuery
);
const classicAttachments = classicAttachmentsResponse.body?.records || [];
const filesQuery = `SELECT ContentDocument.Id, ContentDocument.Title FROM ContentDocumentLink WHERE LinkedEntityId = '${record_id}'`;
const filesResponse = await querySalesforceApi<QueryResult>(
HttpMethod.GET,
context.auth,
filesQuery
);
const files = filesResponse.body?.records || [];
const allAttachments = {
classic_attachments: classicAttachments,
files: files.map((file: any) => ({
Id: file.ContentDocument.Id,
Title: file.ContentDocument.Title,
})),
};
return allAttachments;
},
});

View File

@@ -0,0 +1,47 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const runReport = createAction({
auth: salesforceAuth,
name: 'run_report',
displayName: 'Run Report',
description: 'Execute a Salesforce analytics report.',
props: {
report_id: salesforcesCommon.report,
filters: Property.Json({
displayName: 'Filters',
description: 'Apply dynamic filters to the report run.',
required: false,
defaultValue: [
{
"column": "ACCOUNT.NAME",
"operator": "equals",
"value": "Acme"
}
]
})
},
async run(context) {
const { report_id, filters } = context.propsValue;
let body = undefined;
if (filters && Array.isArray(filters) && filters.length > 0) {
body = {
reportMetadata: {
reportFilters: filters,
},
};
}
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
`/services/data/v56.0/analytics/reports/${report_id}`,
body
);
return response.body;
},
});

View File

@@ -0,0 +1,26 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { salesforcesCommon } from '../common';
import { HttpMethod } from '@activepieces/pieces-common';
import { querySalesforceApi } from '../common';
import { salesforceAuth } from '../..';
export const runQuery = createAction({
auth: salesforceAuth,
name: 'run_query',
displayName: 'Run Query (Advanced)',
description: 'Run a salesforce query',
props: {
query: Property.ShortText({
displayName: 'Query',
description: 'Enter the query',
required: true,
}),
},
async run(context) {
const { query } = context.propsValue;
const response = await await querySalesforceApi<{
records: { CreatedDate: string }[];
}>(HttpMethod.GET, context.auth, query);
return response;
},
});

View File

@@ -0,0 +1,55 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi ,salesforcesCommon } from '../common';
export const sendEmail = createAction({
auth: salesforceAuth,
name: 'send_email',
displayName: 'Send Email',
description: 'Sends an email to a Contact or Lead by creating an EmailMessage record.',
props: {
recipientId: salesforcesCommon.recipient,
subject: Property.ShortText({
displayName: 'Subject',
required: true,
}),
body: Property.LongText({
displayName: 'Body',
description: 'The content of the email. Can be plain text or HTML.',
required: true,
}),
relatedToId: Property.ShortText({
displayName: 'Related To ID (Optional)',
description: 'The ID of a record to relate the email to (e.g., an Account, Opportunity, or Case ID).',
required: false,
})
},
async run(context) {
const { recipientId, subject, body, relatedToId } = context.propsValue;
const emailMessage = {
ToIds: [recipientId],
Subject: subject,
HtmlBody: body,
Status: '3',
...(relatedToId && { RelatedToId: relatedToId }),
};
const cleanedBody = Object.entries(emailMessage).reduce((acc, [key, value]) => {
if (value !== undefined && value !== null && value !== '') {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
const response = await callSalesforceApi(
HttpMethod.POST,
context.auth,
`/services/data/v56.0/sobjects/EmailMessage`,
cleanedBody
);
return response.body;
},
});

View File

@@ -0,0 +1,85 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const updateContact = createAction({
auth: salesforceAuth,
name: 'update_contact',
displayName: 'Update Contact',
description: 'Update an existing contact.',
props: {
contact_id: salesforcesCommon.contact,
FirstName: Property.ShortText({
displayName: 'First Name',
required: false,
}),
LastName: Property.ShortText({
displayName: 'Last Name',
required: false,
}),
AccountId: salesforcesCommon.account,
Email: Property.ShortText({
displayName: 'Email',
required: false,
}),
Phone: Property.ShortText({
displayName: 'Phone',
required: false,
}),
Title: Property.ShortText({
displayName: 'Title',
required: false,
}),
other_fields: Property.Json({
displayName: 'Other Fields (Advanced)',
description: 'Enter any additional fields to update as a JSON object.',
required: false
})
},
async run(context) {
const {
contact_id,
FirstName,
LastName,
AccountId,
Email,
Phone,
Title,
other_fields
} = context.propsValue;
const rawBody = {
FirstName,
LastName,
AccountId,
Email,
Phone,
Title,
...(other_fields || {}),
};
const cleanedBody = Object.entries(rawBody).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
if (Object.keys(cleanedBody).length === 0) {
return { success: true, message: "No fields provided to update." };
}
await callSalesforceApi(
HttpMethod.PATCH,
context.auth,
`/services/data/v56.0/sobjects/Contact/${contact_id}`,
cleanedBody
);
return {
success: true,
};
},
});

View File

@@ -0,0 +1,84 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const updateLead = createAction({
auth: salesforceAuth,
name: 'update_lead',
displayName: 'Update Lead',
description: 'Update an existing lead.',
props: {
lead_id: salesforcesCommon.lead,
FirstName: Property.ShortText({
displayName: 'First Name',
required: false,
}),
LastName: Property.ShortText({
displayName: 'Last Name',
required: false,
}),
Company: Property.ShortText({
displayName: 'Company',
required: false,
}),
Email: Property.ShortText({
displayName: 'Email',
required: false,
}),
Phone: Property.ShortText({
displayName: 'Phone',
required: false,
}),
LeadSource: salesforcesCommon.leadSource,
other_fields: Property.Json({
displayName: 'Other Fields (Advanced)',
description: 'Enter any additional fields to update as a JSON object.',
required: false
})
},
async run(context) {
const {
lead_id,
FirstName,
LastName,
Company,
Email,
Phone,
LeadSource,
other_fields
} = context.propsValue;
const rawBody = {
FirstName,
LastName,
Company,
Email,
Phone,
LeadSource,
...(other_fields || {}),
};
const cleanedBody = Object.entries(rawBody).reduce((acc, [key, value]) => {
if (value !== undefined) {
acc[key] = value;
}
return acc;
}, {} as Record<string, unknown>);
if (Object.keys(cleanedBody).length === 0) {
return { success: true, message: "No fields provided to update." };
}
await callSalesforceApi(
HttpMethod.PATCH,
context.auth,
`/services/data/v56.0/sobjects/Lead/${lead_id}`,
cleanedBody
);
return {
success: true,
};
},
});

View File

@@ -0,0 +1,38 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { callSalesforceApi, salesforcesCommon } from '../common';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
export const UpdateObjectById = createAction({
auth: salesforceAuth,
name: 'update_object_by_id',
displayName: 'Update Object (Advanced)',
description: 'Update object by Id',
props: {
object: salesforcesCommon.object,
id: Property.ShortText({
displayName: 'Id',
description: 'Select the Id',
required: true,
}),
data: Property.Json({
displayName: 'Data',
description: 'Select mapped object',
required: true,
defaultValue: {},
}),
},
async run(context) {
const { object, id, data } = context.propsValue;
const response = await callSalesforceApi(
HttpMethod.PATCH,
context.auth,
`/services/data/v56.0/sobjects/${object}/${id}`,
{
...data,
}
);
return response;
},
});

View File

@@ -0,0 +1,39 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
import { callSalesforceApi, salesforcesCommon } from '../common';
export const updateRecord = createAction({
auth: salesforceAuth,
name: 'update_record',
displayName: 'Update Record',
description: 'Updates an existing record.',
props: {
object: salesforcesCommon.object,
record_id: salesforcesCommon.record,
data: Property.Json({
displayName: 'Data to Update',
description: 'Enter the fields to update as a JSON object. For example: {"BillingCity": "San Francisco"}',
required: true,
defaultValue: {},
}),
},
async run(context) {
const { object, record_id, data } = context.propsValue;
if (!object) {
throw new Error('Object is not defined. Please select an object.');
}
await callSalesforceApi(
HttpMethod.PATCH,
context.auth,
`/services/data/v56.0/sobjects/${object}/${record_id}`,
data as Record<string, unknown>
);
return {
success: true,
};
},
});

View File

@@ -0,0 +1,78 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import {
createBulkJob,
getBulkJobInfo,
notifyBulkJobComplete,
salesforcesCommon,
uploadToBulkJob,
} from '../common';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
export const upsertByExternalIdBulk = createAction({
auth: salesforceAuth,
name: 'upsert_by_external_id_bulk',
displayName: 'Bulk Upsert (Advanced)',
description: 'Bulk upsert a record by external id',
props: {
object: salesforcesCommon.object,
external_field: Property.ShortText({
displayName: 'External Field',
description: 'Select the External Field',
required: true,
}),
records: Property.LongText({
displayName: 'Records',
description: 'Select the Records (CSV format)',
required: true,
}),
},
async run(context) {
const records = context.propsValue.records;
let jobId;
if (!records) {
throw new Error('Expect CSV of records to upsert');
}
const { object, external_field } = context.propsValue;
// create bulk job
const create = await createBulkJob(HttpMethod.POST, context.auth, {
object: object,
externalIdFieldName: external_field,
contentType: 'CSV',
operation: 'upsert',
lineEnding: 'CRLF',
});
if (create.status == 200) {
jobId = create.body.id;
} else {
throw new Error(`job creation failed: ${JSON.stringify(create)}`);
}
// upload records to bulk job
await uploadToBulkJob(HttpMethod.PUT, context.auth, jobId, records).catch(
(e) => {
throw new Error(`job upload failed: ${JSON.stringify(e)}`);
}
);
// notify upload complete
await notifyBulkJobComplete(
HttpMethod.PATCH,
context.auth,
{ state: 'UploadComplete' },
jobId
).catch((e) => {
throw new Error(`job failed: ${JSON.stringify(e)}`);
});
const response = await getBulkJobInfo(
HttpMethod.GET,
context.auth,
jobId
).catch((e) => {
throw new Error(`job failed: ${JSON.stringify(e)}`);
});
return response;
},
});

View File

@@ -0,0 +1,46 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { callSalesforceApi, salesforcesCommon } from '../common';
import { HttpMethod } from '@activepieces/pieces-common';
import { salesforceAuth } from '../..';
export const upsertByExternalId = createAction({
auth: salesforceAuth,
name: 'upsert_by_external_id',
displayName: 'Batch Upsert (Advanced)',
description: 'Batch upsert a record by external id',
props: {
object: salesforcesCommon.object,
external_field: Property.ShortText({
displayName: 'External Field',
description: 'Select the External Field',
required: true,
}),
records: Property.Json({
displayName: 'Records',
description: 'Select the Records',
required: true,
defaultValue: {
records: [],
},
}),
},
async run(context) {
const records = context.propsValue?.records?.records;
if (!records) {
throw new Error(
'Expect records field inside json to be an array with records to upsert'
);
}
const { object, external_field } = context.propsValue;
const response = await callSalesforceApi(
HttpMethod.PATCH,
context.auth,
`/services/data/v55.0/composite/sobjects/${object}/${external_field}`,
{
allOrNone: false,
...context.propsValue.records,
}
);
return response;
},
});

View File

@@ -0,0 +1,712 @@
import {
AuthenticationType,
HttpMethod,
HttpMessageBody,
HttpResponse,
httpClient,
} from '@activepieces/pieces-common';
import { OAuth2PropertyValue, Property } from '@activepieces/pieces-framework';
import { salesforceAuth } from '../..';
export const salesforcesCommon = {
account: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Account',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
`SELECT Id, Name FROM Account ORDER BY Name LIMIT 100`
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Name,
value: record.Id,
})),
};
},
}),
object: Property.Dropdown<string,true,typeof salesforceAuth>({
auth: salesforceAuth,
displayName: 'Object',
required: true,
description: 'Select the Object',
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'connect your account first',
options: [],
};
}
const options = await getSalesforceObjects(auth as OAuth2PropertyValue);
return {
disabled: false,
options: options.body['sobjects']
.map((object: any) => {
return {
label: object.label,
value: object.name,
};
})
.sort((a: { label: string }, b: { label: string }) =>
a.label.localeCompare(b.label)
)
.filter((object: { label: string }) => !object.label.startsWith('_')),
};
},
}),
record: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Record',
description: 'The record to select. The list shows the 20 most recently created records.',
required: true,
refreshers: ['object'],
options: async ({ auth, object }) => {
if (!auth || !object) {
return {
disabled: true,
placeholder: 'Select an object first',
options: [],
};
}
try {
const describeResponse = await getSalesforceFields(auth as OAuth2PropertyValue, object as string);
const fields = describeResponse.body['fields'].map((f: any) => f.name);
let displayField = 'Id';
if (fields.includes('Name')) {
displayField = 'Name';
} else if (fields.includes('Subject')) {
displayField = 'Subject';
} else if (fields.includes('Title')) {
displayField = 'Title';
}
const response = await querySalesforceApi<{ records: { Id: string, [key: string]: any }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
`SELECT Id, ${displayField} FROM ${object} ORDER BY CreatedDate DESC LIMIT 20`
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record[displayField] ?? record.Id,
value: record.Id,
})),
};
} catch (e) {
console.error(e);
const fallbackResponse = await querySalesforceApi<{ records: { Id: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
`SELECT Id FROM ${object} LIMIT 20`
);
return {
disabled: false,
options: fallbackResponse.body.records.map((record) => ({
label: record.Id,
value: record.Id,
})),
}
}
},
}),
recipient: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Recipient',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
const contactQuery = `SELECT Id, Name FROM Contact ORDER BY Name LIMIT 50`;
const leadQuery = `SELECT Id, Name FROM Lead ORDER BY Name LIMIT 50`;
const [contactsResponse, leadsResponse] = await Promise.all([
querySalesforceApi<{ records: { Id: string, Name: string }[] }>(HttpMethod.GET, auth as OAuth2PropertyValue, contactQuery),
querySalesforceApi<{ records: { Id: string, Name: string }[] }>(HttpMethod.GET, auth as OAuth2PropertyValue, leadQuery)
]);
const contactOptions = contactsResponse.body.records.map((record) => ({
label: `${record.Name} (Contact)`,
value: record.Id,
}));
const leadOptions = leadsResponse.body.records.map((record) => ({
label: `${record.Name} (Lead)`,
value: record.Id,
}));
return {
disabled: false,
options: [...contactOptions, ...leadOptions].sort((a, b) => a.label.localeCompare(b.label)),
};
},
}),
field: Property.Dropdown<string,true,typeof salesforceAuth>({
auth: salesforceAuth,
displayName: 'Field',
description: 'Select the Field',
required: true,
refreshers: ['object'],
options: async ({ auth, object }) => {
if (auth === undefined || !object) {
return {
disabled: true,
placeholder: 'connect your account first',
options: [],
};
}
const options = await getSalesforceFields(
auth as OAuth2PropertyValue,
object as string
);
return {
disabled: false,
options: options.body['fields'].map((field: any) => {
return {
label: field.label,
value: field.name,
};
}),
};
},
}),
campaign: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Campaign',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
"SELECT Id, Name FROM Campaign ORDER BY Name LIMIT 200"
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Name,
value: record.Id,
})),
};
},
}),
contact: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Contact',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string, Email?: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
"SELECT Id, Name, Email FROM Contact ORDER BY Name LIMIT 200"
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Email ? `${record.Name}${record.Email}` : record.Name,
value: record.Id,
})),
};
},
}),
lead: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Lead',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
"SELECT Id, Name FROM Lead ORDER BY Name LIMIT 200"
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Name,
value: record.Id,
})),
};
},
}),
status: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Status',
description: "The campaign member status (e.g., 'Sent', 'Responded').",
required: true,
refreshers: ['campaign_id'],
options: async ({ auth, campaign_id }) => {
if (!auth || !campaign_id) {
return {
disabled: true,
placeholder: 'Select a campaign first',
options: [],
};
}
// Validate campaign_id to prevent SQL injection (Salesforce IDs are 15-18 alphanumeric characters)
const campaignIdStr = String(campaign_id);
if (!/^[a-zA-Z0-9]{15,18}$/.test(campaignIdStr)) {
return {
disabled: true,
placeholder: 'Invalid campaign ID',
options: [],
};
}
const response = await querySalesforceApi<{ records: { Label: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
`SELECT Label FROM CampaignMemberStatus WHERE CampaignId = '${campaignIdStr}'`
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Label,
value: record.Label,
})),
};
},
}),
leadSource: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Lead Source',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
try {
const describeResponse = await getSalesforceFields(auth as OAuth2PropertyValue, 'Lead');
const leadSourceField = describeResponse.body['fields'].find((field: any) => field.name === 'LeadSource');
if (!leadSourceField || !leadSourceField.picklistValues) {
return { disabled: true, placeholder: 'Lead Source field not found or not a picklist', options: [] };
}
return {
disabled: false,
options: leadSourceField.picklistValues.map((value: any) => {
return {
label: value.label,
value: value.value,
};
}),
};
} catch (e) {
console.error(e);
return {
disabled: true,
placeholder: "Couldn't fetch lead sources",
options: [],
}
}
},
}),
owner: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Owner',
description: 'The owner of the task.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
"SELECT Id, Name FROM User WHERE IsActive = true ORDER BY Name"
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Name,
value: record.Id,
})),
};
},
}),
opportunity: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Opportunity',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
"SELECT Id, Name FROM Opportunity ORDER BY CreatedDate DESC LIMIT 100"
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Name,
value: record.Id,
})),
};
},
}),
report: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Report',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
"SELECT Id, Name FROM Report ORDER BY Name"
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Name,
value: record.Id,
})),
};
},
}),
parentRecord: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Parent Record',
description: 'The parent record to find child records for. The list shows the 20 most recently created records.',
required: true,
refreshers: ['parent_object'],
options: async ({ auth, parent_object }) => {
if (!auth || !parent_object) {
return { disabled: true, placeholder: 'Select a parent object first', options: [] };
}
const response = await querySalesforceApi<{ records: { Id: string, Name?: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
`SELECT Id, Name FROM ${parent_object} ORDER BY CreatedDate DESC LIMIT 20`
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Name ?? record.Id,
value: record.Id,
})),
};
},
}),
childRelationship: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Child Relationship',
description: 'The child relationship to retrieve records from.',
required: true,
refreshers: ['parent_object'],
options: async ({ auth, parent_object }) => {
if (!auth || !parent_object) {
return { disabled: true, placeholder: 'Select a parent object first', options: [] };
}
try {
const describeResponse = await getSalesforceFields(auth as OAuth2PropertyValue, parent_object as string);
const relationships = describeResponse.body['childRelationships'];
if (!relationships) {
return { disabled: true, placeholder: 'No child relationships found for this object', options: [] };
}
return {
disabled: false,
options: relationships.map((rel: any) => ({
label: `${rel.relationshipName} (${rel.childSObject})`,
value: rel.relationshipName,
})),
};
} catch (e) {
console.error(e);
return { disabled: true, placeholder: "Couldn't fetch child relationships", options: [] };
}
},
}),
optionalContact: Property.Dropdown({
auth: salesforceAuth,
displayName: 'Contact',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
const response = await querySalesforceApi<{ records: { Id: string, Name: string, Email?: string }[] }>(
HttpMethod.GET,
auth as OAuth2PropertyValue,
"SELECT Id, Name, Email FROM Contact ORDER BY Name LIMIT 200"
);
return {
disabled: false,
options: response.body.records.map((record) => ({
label: record.Email ? `${record.Name}${record.Email}` : record.Name,
value: record.Id,
})),
};
},
}),
taskStatus: createSalesforcePicklistDropdown({
objectName: 'Task',
fieldName: 'Status',
displayName: 'Status',
required: true
}),
taskPriority: createSalesforcePicklistDropdown({
objectName: 'Task',
fieldName: 'Priority',
displayName: 'Priority',
required: true
}),
caseStatus: createSalesforcePicklistDropdown({
objectName: 'Case',
fieldName: 'Status',
displayName: 'Status',
required: false
}),
casePriority: createSalesforcePicklistDropdown({
objectName: 'Case',
fieldName: 'Priority',
displayName: 'Priority',
required: false
}),
caseOrigin: createSalesforcePicklistDropdown({
objectName: 'Case',
fieldName: 'Origin',
displayName: 'Origin',
required: false
}),
opportunityStage: createSalesforcePicklistDropdown({
objectName: 'Opportunity',
fieldName: 'StageName',
displayName: 'Stage',
required: true
}),
};
function createSalesforcePicklistDropdown(config: {
objectName: string,
fieldName: string,
displayName: string,
required: boolean,
description?: string,
}) {
return Property.Dropdown({
auth: salesforceAuth,
displayName: config.displayName,
description: config.description,
required: config.required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
try {
const describeResponse = await getSalesforceFields(auth as OAuth2PropertyValue, config.objectName);
const field = describeResponse.body['fields'].find((field: any) => field.name === config.fieldName);
if (!field || !field.picklistValues) {
return { disabled: true, placeholder: `${config.fieldName} field not found or not a picklist`, options: [] };
}
return {
disabled: false,
options: field.picklistValues.map((value: any) => ({
label: value.label,
value: value.value,
})),
};
} catch (e) {
console.error(e);
return { disabled: true, placeholder: `Couldn't fetch ${config.fieldName} values`, options: [] };
}
},
});
}
export async function callSalesforceApi<T extends HttpMessageBody>(
method: HttpMethod,
authentication: OAuth2PropertyValue,
url: string,
body: Record<string, unknown> | undefined
): Promise<HttpResponse<T>> {
return await httpClient.sendRequest<T>({
method: method,
url: `${authentication.data['instance_url']}${url}`,
body,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}
export async function querySalesforceApi<T extends HttpMessageBody>(
method: HttpMethod,
authentication: OAuth2PropertyValue,
query: string
): Promise<HttpResponse<T>> {
return await httpClient.sendRequest<T>({
method: method,
url: `${authentication.data['instance_url']}/services/data/v56.0/query`,
queryParams: {
q: query,
},
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}
export async function createBulkJob<T extends HttpMessageBody = any>(
method: HttpMethod,
authentication: OAuth2PropertyValue,
jobDetails: HttpMessageBody
): Promise<HttpResponse<T>> {
return await httpClient.sendRequest<T>({
method: method,
url: `${authentication.data['instance_url']}/services/data/v58.0/jobs/ingest/`,
body: jobDetails,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}
export async function uploadToBulkJob<T extends HttpMessageBody>(
method: HttpMethod,
authentication: OAuth2PropertyValue,
jobId: string,
csv: string
): Promise<HttpResponse<T>> {
return await httpClient.sendRequest<T>({
method: method,
url: `${authentication.data['instance_url']}/services/data/v58.0/jobs/ingest/${jobId}/batches`,
headers: {
'Content-Type': 'text/csv',
},
body: csv as unknown as HttpMessageBody,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}
export async function notifyBulkJobComplete<T extends HttpMessageBody>(
method: HttpMethod,
authentication: OAuth2PropertyValue,
message: HttpMessageBody,
jobId: string
): Promise<HttpResponse<T>> {
return await httpClient.sendRequest<T>({
method: method,
url: `${authentication.data['instance_url']}/services/data/v58.0/jobs/ingest/${jobId}`,
body: message,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}
export async function getBulkJobInfo<T extends HttpMessageBody>(
method: HttpMethod,
authentication: OAuth2PropertyValue,
jobId: string
): Promise<HttpResponse<T>> {
return await httpClient.sendRequest<T>({
method: method,
url: `${authentication.data['instance_url']}/services/data/v58.0/jobs/ingest/${jobId}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}
async function getSalesforceObjects(
authentication: OAuth2PropertyValue
): Promise<HttpResponse<HttpMessageBody>> {
return await httpClient.sendRequest<HttpMessageBody>({
method: HttpMethod.GET,
url: `${authentication.data['instance_url']}/services/data/v56.0/sobjects`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}
// Write function to list all fields name inside salesforce object
async function getSalesforceFields(
authentication: OAuth2PropertyValue,
object: string
): Promise<HttpResponse<HttpMessageBody>> {
return await httpClient.sendRequest<HttpMessageBody>({
method: HttpMethod.GET,
url: `${authentication.data['instance_url']}/services/data/v56.0/sobjects/${object}/describe`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authentication['access_token'],
},
});
}

View File

@@ -0,0 +1,88 @@
import {
DedupeStrategy,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
OAuth2PropertyValue,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { querySalesforceApi } from '../common';
import dayjs from 'dayjs';
import { salesforceAuth } from '../..';
export const newCaseAttachment = createTrigger({
auth: salesforceAuth,
name: 'new_case_attachment',
displayName: 'New Case Attachment',
description: 'Fires when a new Attachment or File is added to any Case record.',
props: {},
sampleData: {
"Id": "00P7Q000002XyA4UAK",
"ParentId": "5007Q000006g75iQAA",
"Name": "sample_attachment.txt",
"ContentType": "text/plain",
"CreatedDate": "2025-10-10T12:00:00.000Z",
"attachment_type": "Classic"
},
type: TriggerStrategy.POLLING,
async test(ctx) {
return await pollingHelper.test(polling, ctx);
},
async onEnable(ctx) {
await pollingHelper.onEnable(polling, ctx);
},
async onDisable(ctx) {
await pollingHelper.onDisable(polling, ctx);
},
async run(ctx) {
return await pollingHelper.poll(polling, ctx);
},
});
const polling: Polling<AppConnectionValueForAuthProperty<typeof salesforceAuth>, Record<string, never>> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, lastFetchEpochMS }) => {
const isoDate = dayjs(lastFetchEpochMS).toISOString();
const classicQuery = `
SELECT FIELDS(ALL) FROM Attachment
WHERE Parent.Type = 'Case' AND SystemModstamp > ${isoDate}
LIMIT 200
`;
const classicResponse = await querySalesforceApi<{ records: { SystemModstamp: string }[] }>(HttpMethod.GET, auth, classicQuery);
const classicAttachments = classicResponse.body?.['records'] || [];
const recentCasesQuery = `SELECT Id FROM Case WHERE SystemModstamp > ${isoDate} LIMIT 200`;
const recentCasesResponse = await querySalesforceApi<{ records: { Id: string }[] }>(HttpMethod.GET, auth, recentCasesQuery);
const recentCaseIds = recentCasesResponse.body?.['records'].map(c => `'${c.Id}'`);
let fileLinks: any[] = [];
if (recentCaseIds && recentCaseIds.length > 0) {
const filesQuery = `
SELECT FIELDS(ALL) FROM ContentDocumentLink
WHERE LinkedEntityId IN (${recentCaseIds.join(',')}) AND SystemModstamp > ${isoDate}
LIMIT 200
`;
const filesResponse = await querySalesforceApi<{ records: { SystemModstamp: string }[] }>(HttpMethod.GET, auth, filesQuery);
fileLinks = filesResponse.body?.['records'] || [];
}
const classicItems = classicAttachments.map((item: any) => ({
epochMilliSeconds: dayjs(item.SystemModstamp).valueOf(),
data: { ...item, attachment_type: 'Classic' },
}));
const fileItems = fileLinks.map((item: any) => ({
epochMilliSeconds: dayjs(item.SystemModstamp).valueOf(),
data: { ...item, attachment_type: 'File' },
}));
const allItems = [...classicItems, ...fileItems];
return allItems.sort((a, b) => a.epochMilliSeconds - b.epochMilliSeconds);
},
};

View File

@@ -0,0 +1,71 @@
import {
DedupeStrategy,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
OAuth2PropertyValue,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { querySalesforceApi } from '../common';
import dayjs from 'dayjs';
import { salesforceAuth } from '../..';
export const newContact = createTrigger({
auth: salesforceAuth,
name: 'new_contact',
displayName: 'New Contact',
description: 'Fires when a new Contact record is created in Salesforce.',
props: {},
sampleData: {
"Id": "0037Q000005x4aXUAQ",
"AccountId": "0017Q00000qM8c9QAC",
"Name": "Jane Doe",
"CreatedDate": "2025-10-10T12:00:00.000Z",
},
type: TriggerStrategy.POLLING,
async test(ctx) {
return await pollingHelper.test(polling, ctx);
},
async onEnable(ctx) {
await pollingHelper.onEnable(polling, ctx);
},
async onDisable(ctx) {
await pollingHelper.onDisable(polling, ctx);
},
async run(ctx) {
return await pollingHelper.poll(polling, ctx);
},
});
const polling: Polling<AppConnectionValueForAuthProperty<typeof salesforceAuth>, Record<string, never>> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, lastFetchEpochMS }) => {
const isoDate = dayjs(lastFetchEpochMS).toISOString();
const query = `
SELECT FIELDS(ALL)
FROM Contact
WHERE CreatedDate > ${isoDate}
ORDER BY CreatedDate ASC
LIMIT 200
`;
const response = await querySalesforceApi<{ records: { CreatedDate: string }[] }>(
HttpMethod.GET,
auth,
query
);
const records = response.body?.['records'] || [];
return records.map((record: { CreatedDate: string }) => ({
epochMilliSeconds: dayjs(record.CreatedDate).valueOf(),
data: record,
}));
},
};

View File

@@ -0,0 +1,93 @@
import {
DedupeStrategy,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { querySalesforceApi, salesforcesCommon } from '../common';
import dayjs from 'dayjs';
import { salesforceAuth } from '../..';
export const newFieldHistoryEvent = createTrigger({
auth: salesforceAuth,
name: 'new_field_history_event',
displayName: 'New Field History Event',
description: 'Fires when a tracked field is updated on a specified object.',
props: {
object: salesforcesCommon.object,
},
sampleData: {
"Id": "0177Q00000s912jQAA",
"IsDeleted": false,
"ParentId": "0017Q00000qM8c9QAC",
"CreatedById": "0057Q000003h3VwQAI",
"CreatedDate": "2025-10-10T12:00:00.000Z",
"Field": "Industry",
"OldValue": "Agriculture",
"NewValue": "Technology"
},
type: TriggerStrategy.POLLING,
async test(ctx) {
return await pollingHelper.test(polling, ctx);
},
async onEnable(ctx) {
await pollingHelper.onEnable(polling, ctx);
},
async onDisable(ctx) {
await pollingHelper.onDisable(polling, ctx);
},
async run(ctx) {
return await pollingHelper.poll(polling, ctx);
},
});
const polling: Polling<AppConnectionValueForAuthProperty<typeof salesforceAuth>, { object: string | undefined }> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
const { object } = propsValue;
if (!object) {
return [];
}
const isoDate = dayjs(lastFetchEpochMS).toISOString();
const historyObject = object.endsWith('__c')
? object.replace('__c', '__History')
: `${object}History`;
const query = `
SELECT FIELDS(ALL)
FROM ${historyObject}
WHERE CreatedDate > ${isoDate}
ORDER BY CreatedDate ASC
LIMIT 200
`;
try {
const response = await querySalesforceApi<{ records: { CreatedDate: string }[] }>(
HttpMethod.GET,
auth,
query
);
const records = response.body?.['records'] || [];
return records.map((record: { CreatedDate: string }) => ({
epochMilliSeconds: dayjs(record.CreatedDate).valueOf(),
data: record,
}));
} catch (error) {
console.warn(`Could not poll for history on ${historyObject}. It might not exist or have history tracking enabled.`);
return [];
}
},
};

View File

@@ -0,0 +1,70 @@
import {
DedupeStrategy,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { querySalesforceApi } from '../common';
import dayjs from 'dayjs';
import { salesforceAuth } from '../..';
export const newLead = createTrigger({
auth: salesforceAuth,
name: 'new_lead',
displayName: 'New Lead',
description: 'Fires when a new Lead record is created in Salesforce.',
props: {},
sampleData: {
"Id": "00Q7Q000003x4aXUAQ",
"Company": "ACME Inc.",
"Name": "John Doe",
"CreatedDate": "2025-10-10T12:00:00.000Z",
},
type: TriggerStrategy.POLLING,
async test(ctx) {
return await pollingHelper.test(polling, ctx);
},
async onEnable(ctx) {
await pollingHelper.onEnable(polling, ctx);
},
async onDisable(ctx) {
await pollingHelper.onDisable(polling, ctx);
},
async run(ctx) {
return await pollingHelper.poll(polling, ctx);
},
});
const polling: Polling<AppConnectionValueForAuthProperty<typeof salesforceAuth>, Record<string, never>> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, lastFetchEpochMS }) => {
const isoDate = dayjs(lastFetchEpochMS).toISOString();
const query = `
SELECT FIELDS(ALL)
FROM Lead
WHERE CreatedDate > ${isoDate}
ORDER BY CreatedDate ASC
LIMIT 200
`;
const response = await querySalesforceApi<{ records: { CreatedDate: string }[] }>(
HttpMethod.GET,
auth,
query
);
const records = response.body?.['records'] || [];
return records.map((record: { CreatedDate: string }) => ({
epochMilliSeconds: dayjs(record.CreatedDate).valueOf(),
data: record,
}));
},
};

View File

@@ -0,0 +1,70 @@
import {
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { XMLParser } from 'fast-xml-parser';
import { salesforceAuth } from '../..';
export const newOutboundMessage = createTrigger({
auth: salesforceAuth,
name: 'new_outbound_message',
displayName: 'New Outbound Message',
description: 'Fires when a new outbound message is received from Salesforce.',
props: {},
// See https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_om_outboundmessaging_notification.htm
sampleData: {
"soapenv:Envelope": {
"@_xmlns:soapenv": "http://schemas.xmlsoap.org/soap/envelope/",
"@_xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
"@_xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"soapenv:Body": {
"notifications": {
"@_xmlns": "http://soap.sforce.com/2005/09/outbound",
"OrganizationId": "00Dxx0000001gEREAY",
"ActionId": "04kxx0000000007EAA",
"SessionId": "00Dxx0000001gER!AQcAQH0dMHZfz972_fL234234_tL2F0M567657_o.6T4x3O3O2_E_i_j_k_l_m_n_o_p",
"EnterpriseUrl": "https://yourInstance.salesforce.com/services/Soap/c/56.0/00Dxx0000001gER",
"PartnerUrl": "https://yourInstance.salesforce.com/services/Soap/u/56.0/00Dxx0000001gER",
"Notification": {
"Id": "04lxx0000000007EAA",
"sObject": {
"@_xsi:type": "sf:Account",
"@_xmlns:sf": "urn:sobject.enterprise.soap.sforce.com",
"Id": "001xx000003D8i1AAC",
"Name": "New Account From Webhook"
}
}
}
}
}
},
type: TriggerStrategy.WEBHOOK,
async onEnable() {
// Webhook triggers don't require setup
},
async onDisable() {
// Webhook triggers don't require cleanup
},
async run(context) {
const requestBody = context.payload.body as string;
const parser = new XMLParser({
attributeNamePrefix: "@_",
textNodeName: "#text",
ignoreAttributes: false,
parseTagValue: true,
parseAttributeValue: true,
trimValues: true,
isArray: (name) => {
return name === "Notification";
}
});
const parsedData = parser.parse(requestBody);
const notifications = parsedData?.['soapenv:Envelope']?.['soapenv:Body']?.['notifications']?.['Notification'] || [];
return [notifications];
},
});

View File

@@ -0,0 +1,119 @@
import {
DedupeStrategy,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
Property,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { querySalesforceApi, salesforcesCommon } from '../common';
import dayjs from 'dayjs';
import { salesforceAuth } from '../..';
export const newRecord = createTrigger({
auth: salesforceAuth,
name: 'new_record',
displayName: 'New Record',
description: 'Triggers when there is new record',
props: {
object: salesforcesCommon.object,
conditions: Property.LongText({
displayName: 'Conditions (Advanced)',
description: 'Enter a SOQL query where clause i. e. IsDeleted = TRUE',
required: false,
}),
},
sampleData: {},
type: TriggerStrategy.POLLING,
async test(ctx) {
return await pollingHelper.test(polling, {
auth: ctx.auth,
store: ctx.store,
propsValue: ctx.propsValue,
files: ctx.files,
});
},
async onEnable(ctx) {
await pollingHelper.onEnable(polling, {
auth: ctx.auth,
store: ctx.store,
propsValue: ctx.propsValue,
});
},
async onDisable(ctx) {
await pollingHelper.onDisable(polling, {
auth: ctx.auth,
store: ctx.store,
propsValue: ctx.propsValue,
});
},
async run(ctx) {
return await pollingHelper.poll(polling, {
auth: ctx.auth,
store: ctx.store,
propsValue: ctx.propsValue,
files: ctx.files,
});
},
});
const polling: Polling<
AppConnectionValueForAuthProperty<typeof salesforceAuth>,
{ object: string | undefined; conditions: string | undefined }
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
const items = await getRecords(
auth,
propsValue.object!,
dayjs(lastFetchEpochMS).toISOString(),
propsValue.conditions
);
return items.map((item) => ({
epochMilliSeconds: dayjs(item.CreatedDate).valueOf(),
data: item,
}));
},
};
const getRecords = async (
authentication: AppConnectionValueForAuthProperty<typeof salesforceAuth>,
object: string,
startDate: string,
conditions: string | undefined
) => {
const response = await querySalesforceApi<{
records: { CreatedDate: string }[];
}>(
HttpMethod.GET,
authentication,
constructQuery(object, 200, 0, startDate, conditions)
);
return response.body['records'];
};
function constructQuery(
object: string,
limit: number,
offset: number,
startDate: string,
conditions: string | undefined
) {
return `
SELECT
FIELDS(ALL)
FROM
${object}
WHERE CreatedDate > ${startDate} ${
conditions != undefined ? `AND ${conditions}` : ''
}
ORDER BY CreatedDate ASC
LIMIT ${limit}
OFFSET ${offset}
`;
}

View File

@@ -0,0 +1,65 @@
import {
DedupeStrategy,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { querySalesforceApi } from '../common';
import dayjs from 'dayjs';
import { salesforceAuth } from '../..';
export const newUpdatedFile = createTrigger({
auth: salesforceAuth,
name: 'new_updated_file',
displayName: 'New or Updated File',
description: 'Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.',
props: {},
sampleData: {
"Id": "0697Q000002qB9iQAE",
"Title": "My Document.pdf",
"LastModifiedDate": "2025-10-10T12:00:00.000Z",
"Type": "ContentDocument"
},
type: TriggerStrategy.POLLING,
async test(ctx) {
return await pollingHelper.test(polling, ctx);
},
async onEnable(ctx) {
await pollingHelper.onEnable(polling, ctx);
},
async onDisable(ctx) {
await pollingHelper.onDisable(polling, ctx);
},
async run(ctx) {
return await pollingHelper.poll(polling, ctx);
},
});
const polling: Polling<AppConnectionValueForAuthProperty<typeof salesforceAuth>, Record<string, never>> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, lastFetchEpochMS }) => {
const isoDate = dayjs(lastFetchEpochMS).toISOString();
const query = `
SELECT FIELDS(ALL)
FROM ContentDocument
WHERE SystemModstamp > ${isoDate}
ORDER BY SystemModstamp ASC
LIMIT 200
`;
const response = await querySalesforceApi<{ records: { SystemModstamp: string }[] }>(HttpMethod.GET, auth, query);
const records = response.body?.['records'] || [];
return records.map((record: any) => ({
epochMilliSeconds: dayjs(record.SystemModstamp).valueOf(),
data: { ...record, Type: 'ContentDocument' },
}));
},
};

View File

@@ -0,0 +1,114 @@
import {
DedupeStrategy,
HttpMethod,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import {
AppConnectionValueForAuthProperty,
Property,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { querySalesforceApi, salesforcesCommon } from '../common';
import dayjs from 'dayjs';
import { salesforceAuth } from '../..';
export const newOrUpdatedRecord = createTrigger({
auth: salesforceAuth,
name: 'new_or_updated_record',
displayName: 'New or Updated Record',
description: 'Triggers when there is new or updated record',
props: {
object: salesforcesCommon.object,
conditions: Property.LongText({
displayName: 'Conditions (Advanced)',
description: 'Enter a SOQL query where clause i. e. IsDeleted = TRUE',
required: false,
}),
},
sampleData: {},
type: TriggerStrategy.POLLING,
async test(ctx) {
return await pollingHelper.test(polling, {
auth: ctx.auth,
store: ctx.store,
propsValue: ctx.propsValue,
files: ctx.files,
});
},
async onEnable(ctx) {
await pollingHelper.onEnable(polling, {
auth: ctx.auth,
store: ctx.store,
propsValue: ctx.propsValue,
});
},
async onDisable(ctx) {
await pollingHelper.onDisable(polling, {
auth: ctx.auth,
store: ctx.store,
propsValue: ctx.propsValue,
});
},
async run(ctx) {
return await pollingHelper.poll(polling, ctx);
},
});
const polling: Polling<
AppConnectionValueForAuthProperty<typeof salesforceAuth>,
{ object: string | undefined; conditions: string | undefined }
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
const items = await getRecords(
auth,
propsValue.object!,
dayjs(lastFetchEpochMS).toISOString(),
propsValue.conditions
);
return items.map((item) => ({
epochMilliSeconds: dayjs(item.LastModifiedDate).valueOf(),
data: item,
}));
},
};
const getRecords = async (
authentication: AppConnectionValueForAuthProperty<typeof salesforceAuth>,
object: string,
startDate: string,
conditions: string | undefined
) => {
const response = await querySalesforceApi<{
records: { LastModifiedDate: string }[];
}>(
HttpMethod.GET,
authentication,
constructQuery(object, 200, 0, startDate, conditions)
);
return response.body['records'];
};
function constructQuery(
object: string,
limit: number,
offset: number,
startDate: string,
conditions: string | undefined
) {
return `
SELECT
FIELDS(ALL)
FROM
${object}
WHERE LastModifiedDate > ${startDate} ${
conditions != undefined ? `AND ${conditions}` : ''
}
ORDER BY LastModifiedDate ASC
LIMIT ${limit}
OFFSET ${offset}
`;
}

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