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:
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"extends": [
|
||||
"../../../../.eslintrc.base.json"
|
||||
],
|
||||
"ignorePatterns": [
|
||||
"!**/*"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx",
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# pieces-wealthbox
|
||||
|
||||
This library was generated with [Nx](https://nx.dev).
|
||||
|
||||
## Building
|
||||
|
||||
Run `nx build pieces-wealthbox` to build the library.
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "@activepieces/piece-wealthbox",
|
||||
"version": "0.0.3",
|
||||
"type": "commonjs",
|
||||
"main": "./src/index.js",
|
||||
"types": "./src/index.d.ts",
|
||||
"dependencies": {
|
||||
"tslib": "^2.3.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "pieces-wealthbox",
|
||||
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "packages/pieces/community/wealthbox/src",
|
||||
"projectType": "library",
|
||||
"release": {
|
||||
"version": {
|
||||
"manifestRootsToUpdate": [
|
||||
"dist/{projectRoot}"
|
||||
],
|
||||
"currentVersionResolver": "git-tag",
|
||||
"fallbackCurrentVersionResolver": "disk"
|
||||
}
|
||||
},
|
||||
"tags": [],
|
||||
"targets": {
|
||||
"build": {
|
||||
"executor": "@nx/js:tsc",
|
||||
"outputs": [
|
||||
"{options.outputPath}"
|
||||
],
|
||||
"options": {
|
||||
"outputPath": "dist/packages/pieces/community/wealthbox",
|
||||
"tsConfig": "packages/pieces/community/wealthbox/tsconfig.lib.json",
|
||||
"packageJson": "packages/pieces/community/wealthbox/package.json",
|
||||
"main": "packages/pieces/community/wealthbox/src/index.ts",
|
||||
"assets": [
|
||||
"packages/pieces/community/wealthbox/*.md",
|
||||
{
|
||||
"input": "packages/pieces/community/wealthbox/src/i18n",
|
||||
"output": "./src/i18n",
|
||||
"glob": "**/!(i18n.json)"
|
||||
}
|
||||
],
|
||||
"buildableProjectDepsInPackageJsonType": "dependencies",
|
||||
"updateBuildableProjectDepsInPackageJson": true
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build",
|
||||
"prebuild"
|
||||
]
|
||||
},
|
||||
"nx-release-publish": {
|
||||
"options": {
|
||||
"packageRoot": "dist/{projectRoot}"
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"executor": "@nx/eslint:lint",
|
||||
"outputs": [
|
||||
"{options.outputFile}"
|
||||
]
|
||||
},
|
||||
"prebuild": {
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"cwd": "packages/pieces/community/wealthbox",
|
||||
"command": "bun install --no-save --silent"
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Geben Sie Ihr Wealthbox API Zugangs-Token ein. Holen Sie es unter Einstellungen → API Zugangs-Token in Ihrem Wealthbox Konto.",
|
||||
"Create Contact": "Kontakt erstellen",
|
||||
"Create Note": "Notiz erstellen",
|
||||
"Create Project": "Projekt erstellen",
|
||||
"Add Member to Household": "Mitglied zum Haushalt hinzufügen",
|
||||
"Create Household": "Haushalt erstellen",
|
||||
"Create Event": "Ereignis erstellen",
|
||||
"Create Opportunity": "Verkaufschance erstellen",
|
||||
"Create Task": "Aufgabe erstellen",
|
||||
"Start Workflow": "Workflow starten",
|
||||
"Find Contact": "Kontakt finden",
|
||||
"Find Task": "Aufgabe finden",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "Fügt einen neuen Kontakt mit reichhaltigen Details hinzu (Name, Adresse, E-Mail, Tags, etc.)",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "Fügt eine mit einem Kontakt verknüpfte Notiz hinzu. Protokolliert Anrufzusammenfassungen gegen Clientdaten.",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "Startet ein neues Projekt mit Beschreibung und Organisation. Starte projektbasiertes Onboarding, wenn sich neue Kunden anmelden.",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "Fügt ein Mitglied einem existierenden Haushalt hinzu. Verknüpfen Sie mehrere Kontakte unter einer Familieneinheit.",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "Erzeugt einen Haushaltsrekord mit E-Mails, Tags. Kontakte für Familienmitglieder in einem Haushalt.",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "Erzeugt ein Kalenderereignis, das mit dem Kontakt verknüpft ist. Planen Sie Beratungstreffen für Kunden ein.",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "Protokolliert eine Chance inklusive Stufe, Abschlussdatum, Betrag. Automatische Nachverfolgung von Chancen nach Meetings.",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "Erstellt Aufgaben, die mit Kontakten verbunden sind, mit Fälligkeitstypen und Aufgabentypen. Zuweisen von Folgemaßnahmen, wenn Chancen geschaffen werden.",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "Löst eine Workflow-Vorlage auf einem Kontakt/Projekt/Chance aus. Automatisieren Sie mehrstufige Sequenzen basierend auf CRM-Ereignissen.",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "Suchen Sie einen Kontakt nach Namen, E-Mail, Telefon oder erweiterten Filtern. Umfassende Kontakt-Suche mit dynamischen Filteroptionen.",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "Findet vorhandene Aufgaben mit Hilfe eines umfassenden Suchfilters. Suche nach Zuweisung, Ressource, Vervollständigungsstatus und Datumsbereichen.",
|
||||
"First Name": "Vorname",
|
||||
"Last Name": "Nachname",
|
||||
"Prefix": "Präfix",
|
||||
"Middle Name": "Mittlerer Name",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "Spitzname",
|
||||
"Job Title": "Job Titel",
|
||||
"Company Name": "Firmenname",
|
||||
"Contact Type": "Kontakttyp",
|
||||
"Contact Classification": "Kontakt-Klassifikation",
|
||||
"Status": "Status",
|
||||
"Gender": "Geschlecht",
|
||||
"Birth Date": "Geburtsdatum",
|
||||
"Marital Status": "Ehe Status",
|
||||
"Email Address": "E-Mail-Adresse",
|
||||
"Phone Number": "Telefonnummer",
|
||||
"Street Address Line 1": "Straßenadresse Zeile 1",
|
||||
"Street Address Line 2": "Straßenadresse Linie 2",
|
||||
"City": "Stadt",
|
||||
"State": "Bundesland",
|
||||
"ZIP Code": "Postleitzahl",
|
||||
"Country": "Land",
|
||||
"Twitter Handle": "Twitter-Handle",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "Hintergrundinformationen",
|
||||
"Important Information": "Wichtige Informationen",
|
||||
"Personal Interests": "Persönliche Interessen",
|
||||
"Contact Source": "Kontaktquelle",
|
||||
"Tags": "Tags",
|
||||
"External Unique ID": "Externe eindeutige ID",
|
||||
"Note Content": "Notiz Inhalt",
|
||||
"Contact": "Kontakt",
|
||||
"Visible To": "Sichtbar für",
|
||||
"Project Name": "Projekt Name",
|
||||
"Project Description": "Projektbeschreibung",
|
||||
"Organizer": "Organisator",
|
||||
"Custom Fields": "Eigene Felder",
|
||||
"Household": "Haushalt",
|
||||
"Household Title": "Haushaltstitel",
|
||||
"Household Name": "Name des Haushaltes",
|
||||
"Head of Household": "Leiter des Haushaltes",
|
||||
"Spouse/Partner (Optional)": "Ehepartner/Partner (Optional)",
|
||||
"Primary Email Address": "Primäre E-Mail-Adresse",
|
||||
"Primary Phone Number": "Primäre Telefonnummer",
|
||||
"Household Type": "Haushaltstyp",
|
||||
"Event Title": "Ereignis-Titel",
|
||||
"Start Date & Time": "Startdatum & -zeit",
|
||||
"End Date & Time": "Enddatum & -zeit",
|
||||
"Location": "Standort",
|
||||
"Description": "Beschreibung",
|
||||
"All Day Event": "Ganztägige Veranstaltung",
|
||||
"Repeating Event": "Wiederholender Termin",
|
||||
"Event Status": "Ereignisstatus",
|
||||
"Linked Contact": "Verknüpfter Kontakt",
|
||||
"Invitees": "Einladungen",
|
||||
"Event Category": "Ereigniskategorie",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "Opportunity Name",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "Wahrscheinlichkeit (%)",
|
||||
"Amount": "Betrag",
|
||||
"Currency": "Währung",
|
||||
"Amount Type": "Betrag Typ",
|
||||
"Stage": "Teil",
|
||||
"Opportunity Manager": "Opportunity Manager",
|
||||
"Task Name": "Aufgabenname",
|
||||
"Due Date": "Fälligkeitsdatum",
|
||||
"Assigned To": "Zugewiesen an",
|
||||
"Priority": "Priorität",
|
||||
"Mark as Complete": "Als abgeschlossen markieren",
|
||||
"Link To": "Link zu",
|
||||
"Linked Record": "Verknüpfter Datensatz",
|
||||
"Category": "Kategorie",
|
||||
"Due Later": "Später fällig",
|
||||
"Workflow Template": "Workflow-Vorlage",
|
||||
"Workflow Label": "Workflow-Bezeichnung",
|
||||
"Workflow Milestones": "Workflow-Meilensteine",
|
||||
"Name": "Name",
|
||||
"Contact ID": "Kontakt-ID",
|
||||
"Contact Entity Type": "Kontakteigentyp",
|
||||
"Tags Filter": "Schlagwort-Filter",
|
||||
"Active Status": "Aktiver Status",
|
||||
"Include Deleted Contacts": "Gelöschte Kontakte einbeziehen",
|
||||
"Updated Since": "Aktualisiert seit",
|
||||
"Updated Before": "Aktualisiert vor",
|
||||
"Sort Order": "Sortierung",
|
||||
"Result Limit": "Ergebnislimit",
|
||||
"Return Single Result Only": "Nur einzelne Ergebnisse zurückgeben",
|
||||
"Task ID (Optional)": "Task-ID (optional)",
|
||||
"Linked Resource Type": "Verknüpfte Ressourcen Typ",
|
||||
"Linked Resource": "Verknüpfte Ressource",
|
||||
"Assigned to Team ID": "Zugewiesen an Team-ID",
|
||||
"Created By": "Erstellt von",
|
||||
"Completion Status": "Abschlussstatus",
|
||||
"Task Type": "Aufgabentyp",
|
||||
"The first name of the contact": "Der Vorname des Kontakts",
|
||||
"The last name of the contact": "Der Nachname des Kontakts",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "Das bevorzugte Präfix für den Kontakt (z. B. Mr., Ms., Dr.)",
|
||||
"The middle name of the contact": "Der mittlere Name des Kontakts",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "Das Suffix des Kontakts (z.B. Jr., Sr., M.D.)",
|
||||
"A preferred shortname for the contact": "Ein bevorzugter Kurzname für den Kontakt",
|
||||
"The title the contact holds at their present company": "Der Titel, den der Kontakt bei der aktuellen Firma hat",
|
||||
"The name of the contact's present company": "Der Name der aktuellen Firma des Kontakts",
|
||||
"The type of the contact being created": "Der Typ des zu erstellenden Kontakts",
|
||||
"A string further classifying the contact": "Eine Zeichenkette, die den Kontakt weiter klassifiziert",
|
||||
"Whether the contact is currently active": "Gibt an, ob der Kontakt aktiv ist",
|
||||
"The gender of the contact": "Das Geschlecht des Kontakts",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "Das Geburtsdatum des Kontakts (Format JJJJ-MM-TT)",
|
||||
"The marital status of the contact": "Der eheliche Status des Kontakts",
|
||||
"Primary email address for the contact": "Primäre E-Mail-Adresse für den Kontakt",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "Primäre Telefonnummer für den Kontakt (z. B. (555) 123-4567)",
|
||||
"First line of street address": "Erste Straßenanschrift",
|
||||
"Second line of street address (apt, suite, etc.)": "Zweite Straßenanschrift (apt, Suite, etc.)",
|
||||
"City for the address": "Stadt für die Adresse",
|
||||
"State or province for the address": "Bundesland oder Provinz für die Adresse",
|
||||
"ZIP or postal code for the address": "Postleitzahl oder Postleitzahl der Adresse",
|
||||
"Country for the address": "Land für die Adresse",
|
||||
"The twitter handle of the contact": "Der Twitter-Handle des Kontakts",
|
||||
"The LinkedIn URL for the contact": "Die LinkedIn URL für den Kontakt",
|
||||
"A brief description of the contact": "Eine kurze Beschreibung des Kontakts",
|
||||
"Any other important info for the contact": "Alle anderen wichtigen Informationen für den Kontakt",
|
||||
"Personal interests for the contact": "Persönliche Interessen für den Kontakt",
|
||||
"The method in which this contact was acquired": "Die Methode, mit der dieser Kontakt erworben wurde",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "Schlagwörter, die mit dem Kontakt assoziiert werden sollen (z.B. \"Client\", \"VIP\", \"Referral\")",
|
||||
"A unique identifier for this contact in an external system": "Ein eindeutiger Identifikator für diesen Kontakt in einem externen System",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "Der Hauptteil der Notiz (z. B. Anrufzusammenfassung, Sitzungsnotizen, Kundeninteraktionsdetails)",
|
||||
"Select the contact to link this note to": "Wählen Sie den Kontakt, mit dem diese Notiz verlinkt wird",
|
||||
"Select who can view this note": "Auswählen, wer diese Notiz ansehen kann",
|
||||
"Select tags to associate with this note": "Tags für die Verknüpfung mit dieser Notiz auswählen",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "Der Name des Projekts (z.B. \"Client-Onboarding\", \"Q1-Überprüfungsprozess\")",
|
||||
"A detailed explanation of the project goals and scope": "Eine detaillierte Erläuterung der Projektziele und -umfang",
|
||||
"Select the user who will be responsible for organizing this project": "Wählen Sie den Benutzer, der für die Organisation dieses Projekts verantwortlich ist",
|
||||
"Select who can view this project": "Auswählen, wer dieses Projekt ansehen kann",
|
||||
"Add custom fields to this project": "Füge diesem Projekt benutzerdefinierte Felder hinzu",
|
||||
"Select the household that will receive the new member": "Wählen Sie den Haushalt, der das neue Mitglied erhalten wird",
|
||||
"Select the contact to add to the household": "Wählen Sie den Kontakt, der zum Haushalt hinzugefügt werden soll",
|
||||
"The household title to assign to the added contact": "Der Haushaltstitel, der dem hinzugefügten Kontakt zugewiesen werden soll",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "Der Name des Haushaltes (z.B. \"Die Anderson-Familie\", \"Smith Household\")",
|
||||
"Select the contact who will be the head of this household": "Wählen Sie den Kontakt, der der Leiter dieses Haushalts sein soll",
|
||||
"Select the spouse or partner to automatically add to this household": "Wählen Sie den Ehepartner oder Partner, um automatisch diesem Haushalt hinzuzufügen",
|
||||
"Primary email address for the household": "Primäre E-Mail-Adresse für den Haushalt",
|
||||
"City for the household address": "Stadt für die Haushaltsadresse",
|
||||
"State or province for the household address": "Bundesland oder Provinz für die Haushaltsadresse",
|
||||
"ZIP or postal code for the household address": "Postleitzahl oder Postleitzahl der Haushaltsadresse",
|
||||
"Country for the household address": "Land für die Haushaltsadresse",
|
||||
"Primary phone number for the household": "Primäre Telefonnummer für den Haushalt",
|
||||
"The type of household being created": "Die Art des Haushalts, die geschaffen wird",
|
||||
"Whether the household is currently active": "Ob der Haushalt derzeit aktiv ist",
|
||||
"Background information about the household": "Hintergrundinformationen über den Haushalt",
|
||||
"Any important information about the household": "Alle wichtigen Informationen über den Haushalt",
|
||||
"Select tags to associate with this household": "Tags für diesen Haushalt auswählen",
|
||||
"Select who can view this household": "Wählen Sie, wer diesen Haushalt anzeigen kann",
|
||||
"A unique identifier for this household in an external system": "Ein einzigartiger Bezeichner für diesen Haushalt in einem externen System",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "Der Name der Veranstaltung (z.B. \"Client Meeting\", \"Portfolio Review\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "Wenn das Ereignis beginnt (yyy-mm-dd hh:mm Format)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "Wenn das Ereignis endet (yyy-mm-dd hh:mm Format)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "Wo die Veranstaltung stattfindet (z.B. \"Konferenzraum\", \"Kundenbüro\", \"Zoom Meeting\")",
|
||||
"A detailed explanation of the event purpose and agenda": "Eine detaillierte Erklärung des Veranstaltungszwecks und der Tagesordnung",
|
||||
"Check if this is an all-day event": "Überprüfen Sie, ob dies ein ganztägiges Ereignis ist",
|
||||
"Check if this event repeats": "Prüfen, ob dieses Ereignis wiederholt wird",
|
||||
"The current state of the event": "Der aktuelle Status des Ereignisses",
|
||||
"Select the contact to link this event to": "Wählen Sie den Kontakt, mit dem dieses Ereignis verknüpft werden soll",
|
||||
"Add people to invite to this event": "Personen hinzufügen, um zu diesem Event einzuladen",
|
||||
"Select the category for this event": "Wählen Sie die Kategorie für dieses Ereignis",
|
||||
"Send email invitations to invitees": "Einladungen per E-Mail an Einladungen senden",
|
||||
"Select who can view this event": "Auswählen, wer dieses Ereignis ansehen kann",
|
||||
"Add custom fields to this event": "Eigene Felder zu diesem Ereignis hinzufügen",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "Der Name der Chance (z.B. \"Finanzplan\", \"Anlageberatung\", \"Immobilienplanung\")",
|
||||
"When the opportunity should close": "Wann die Chance geschlossen werden soll",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "Die Chance, dass die Chance geschlossen wird, als Prozentsatz (0-100)",
|
||||
"The monetary value of the opportunity": "Der monetäre Wert der Gelegenheit",
|
||||
"The currency for the opportunity amount": "Die Währung für den Opportunitätsbetrag",
|
||||
"The type of amount this represents": "Die Art des Betrags, den dieser Betrag repräsentiert",
|
||||
"Select the current stage of this opportunity": "Wählen Sie die aktuelle Phase dieser Gelegenheit",
|
||||
"Select the contact linked to this opportunity": "Wählen Sie den mit dieser Verkaufschance verbundenen Kontakt aus",
|
||||
"A detailed explanation of the opportunity": "Eine detaillierte Erklärung der Gelegenheit",
|
||||
"Select the user designated as manager of this opportunity": "Wählen Sie den Benutzer, der als Manager dieser Gelegenheit benannt ist",
|
||||
"Select who can view this opportunity": "Auswählen, wer diese Chance sehen kann",
|
||||
"Add custom fields to this opportunity": "Füge benutzerdefinierte Felder zu dieser Gelegenheit hinzu",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "Der Name der Aufgabe (z.B. \"Return Bill's call\", \"Follow up on proposal\")",
|
||||
"When the task is due": "Wenn die Aufgabe fällig ist",
|
||||
"Select the user who the task is assigned to": "Wählen Sie den Benutzer, dem die Aufgabe zugewiesen wird",
|
||||
"A detailed explanation of the task": "Eine detaillierte Erklärung der Aufgabe",
|
||||
"The priority level of the task": "Die Prioritätsebene der Aufgabe",
|
||||
"Check if the task should be created as already completed": "Überprüfen Sie, ob die Aufgabe als bereits erledigt erstellt werden soll",
|
||||
"What type of record to link this task to": "Welcher Typ des Datensatzes, mit dem diese Aufgabe verlinkt werden soll",
|
||||
"Select the record to link this task to": "Wählen Sie den Datensatz, mit dem diese Aufgabe verknüpft werden soll",
|
||||
"Select the category this task belongs to": "Wählen Sie die Kategorie, zu der diese Aufgabe gehört",
|
||||
"Select who can view this task": "Auswählen, wer diese Aufgabe ansehen kann",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "Intervall für den Fall, dass diese Aufgabe nach dem Start fällig ist (z.B. \"2 Tage später um 17:00 Uhr\")",
|
||||
"Add custom fields to this task": "Eigene Felder zu dieser Aufgabe hinzufügen",
|
||||
"Select the workflow template to trigger": "Workflow-Vorlage auswählen",
|
||||
"What type of record to link this workflow to": "Welcher Typ des Datensatzes, mit dem dieser Workflow verknüpft werden soll",
|
||||
"Select the record to link this workflow to": "Wählen Sie den Datensatz, um diesen Workflow zu verknüpfen",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "Ein kurzer Name für den Workflow (z.B. \"Onboard a new client to the firm\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "Wenn der Workflow gestartet werden soll (optional, Standardwert jetzt)",
|
||||
"Select who can view this workflow": "Auswählen, wer diesen Workflow ansehen kann",
|
||||
"Add milestones to this workflow": "Meilensteine zu diesem Workflow hinzufügen",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "Suche nach Namen (unterstützt partielle Übereinstimmungen zwischen Prefix, zuerst, Mitte, Last Suffix, Nickname und voller Name für Haushalte/Unternehmen)",
|
||||
"Search by email address": "Suche nach E-Mail-Adresse",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "Suche nach Telefonnummer (Trennzeichen wie -, (), wird automatisch entfernt)",
|
||||
"Search by specific contact ID (most precise search)": "Suche nach spezifischer Kontakt-ID (genaueste Suche)",
|
||||
"Search by external unique identifier": "Suche nach externer eindeutiger Kennung",
|
||||
"Filter by contact type": "Nach Kontakttyp filtern",
|
||||
"Filter by entity type": "Nach Entitätstyp filtern",
|
||||
"Filter by household title (only applies to household members)": "Nach Haushaltstitel filtern (nur für Haushaltsmitglieder)",
|
||||
"Filter contacts by tags": "Kontakte nach Tags filtern",
|
||||
"Filter by active status": "Nach aktivem Status filtern",
|
||||
"Include contacts that have been deleted": "Gelöschte Kontakte einbeziehen",
|
||||
"Only return contacts updated on or after this date/time": "Nur Kontakte zurückgeben, die am oder nach diesem Datum/der Uhrzeit aktualisiert wurden",
|
||||
"Only return contacts updated on or before this date/time": "Nur Kontakte zurückgeben, die am oder vor diesem Datum/der Uhrzeit aktualisiert wurden",
|
||||
"How to order the results": "Wie man die Ergebnisse bestellt",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "Maximale Anzahl der zurückzugebenden Kontakte (Standard: 50, max: 1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "Wenn aktiviert, gibt nur der erste passende Kontakt zurück. Wenn nicht ausgewählt, werden alle passenden Kontakte zurückgegeben.",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "Suche nach einer bestimmten Aufgabe durch ihre eindeutige ID. Leer lassen für die Suche mit Filtern.",
|
||||
"Filter tasks by the type of resource they are linked to": "Aufgaben nach dem Typ der Ressource filtern, mit der sie verknüpft sind",
|
||||
"Select the specific resource to filter tasks by": "Wählen Sie die spezifische Ressource zum Filtern von Aufgaben nach",
|
||||
"Filter tasks by the user they are assigned to": "Aufgaben nach dem Benutzer filtern, dem sie zugewiesen sind",
|
||||
"Filter tasks by the team they are assigned to": "Aufgaben nach dem zugewiesenen Team filtern",
|
||||
"Filter tasks by the user who created them": "Aufgaben nach dem Benutzer filtern, der sie erstellt hat",
|
||||
"Filter by task completion status": "Filtern nach Aufgabenabschlussstatus",
|
||||
"Filter by task type": "Nach Aufgabentyp filtern",
|
||||
"Only return tasks updated on or after this date/time": "Rückgabewerte nur aktualisierte Aufgaben am oder nach diesem Datum/der Uhrzeit",
|
||||
"Only return tasks updated on or before this date/time": "Rückgabewerte nur aktualisierte Aufgaben am oder vor diesem Datum/der Uhrzeit",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "Maximale Anzahl der zurückzugebenden Aufgaben (Standard: 50, max: 1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "Wenn aktiviert, gibt nur die erste übereinstimmende Aufgabe zurück. Wenn nicht ausgewählt, werden alle passenden Aufgaben zurückgegeben.",
|
||||
"Person": "Person",
|
||||
"Organization": "Organisation",
|
||||
"Trust": "Vertrauen",
|
||||
"Client": "Kunde",
|
||||
"Past Client": "Letzter Kunde",
|
||||
"Prospect": "Erwarten",
|
||||
"Vendor": "Lieferant",
|
||||
"Active": "Aktiv",
|
||||
"Inactive": "Inaktiv",
|
||||
"Female": "Weiblich",
|
||||
"Male": "Mann",
|
||||
"Non-binary": "Nicht-Binärdatei",
|
||||
"Unknown": "Unbekannt",
|
||||
"Married": "Verheiratet",
|
||||
"Single": "Einzeln",
|
||||
"Divorced": "Scheidet",
|
||||
"Widowed": "Witwen",
|
||||
"Life Partner": "Lebenspartner",
|
||||
"Separated": "Getrennt",
|
||||
"Referral": "Empfehlung",
|
||||
"Conference": "Konferenz",
|
||||
"Direct Mail": "Direkte Mail",
|
||||
"Cold Call": "Kalter Anruf",
|
||||
"Other": "Andere",
|
||||
"Head": "Kopf",
|
||||
"Spouse": "Ehepartner",
|
||||
"Partner": "Partner",
|
||||
"Child": "Kind",
|
||||
"Grandchild": "Großkind",
|
||||
"Parent": "Elternteil",
|
||||
"Grandparent": "Großeltern",
|
||||
"Sibling": "Geschwister",
|
||||
"Dependent": "Abhängig",
|
||||
"Unconfirmed": "Unbestätigt",
|
||||
"Confirmed": "Bestätigt",
|
||||
"Tentative": "Vorbeugend",
|
||||
"Completed": "Abgeschlossen",
|
||||
"Cancelled": "Abgebrochen",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP (£)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "AUD (A$)",
|
||||
"Fee": "Gebühr",
|
||||
"Commission": "Provision",
|
||||
"AUM": "AUM",
|
||||
"Low": "Niedrig",
|
||||
"Medium": "Mittel",
|
||||
"High": "Hoch",
|
||||
"Project": "Projekt",
|
||||
"Opportunity": "Verkaufschance",
|
||||
"Active Only": "Nur aktiv",
|
||||
"Inactive Only": "Nur inaktiv",
|
||||
"All Contacts": "Alle Kontakte",
|
||||
"Recent (newest first)": "Letzte (neueste zuerst)",
|
||||
"Created Date (newest first)": "Erstellungsdatum (neueste zuerst)",
|
||||
"Updated Date (newest first)": "Aktualisiertes Datum (neueste zuerst)",
|
||||
"Ascending": "Aufsteigend",
|
||||
"Descending": "Absteigend",
|
||||
"All Tasks": "Alle Aufgaben",
|
||||
"Completed Only": "Nur abgeschlossene",
|
||||
"Incomplete Only": "Nur unvollständig",
|
||||
"Parent Tasks Only": "Nur übergeordnete Aufgaben",
|
||||
"Subtasks Only": "Nur Teilaufgaben",
|
||||
"New Task": "Neue Aufgabe",
|
||||
"New Contact": "Neuer Kontakt",
|
||||
"New Event": "Neues Ereignis",
|
||||
"New Opportunity": "Neue Verkaufschance",
|
||||
"Fires when a new task is created": "Feuert wenn eine neue Aufgabe erstellt wird",
|
||||
"Fires when a new contact is created": "Feuer wenn ein neuer Kontakt erstellt wird",
|
||||
"Fires when a new event is created": "Feuert wenn ein neues Ereignis erstellt wird",
|
||||
"Fires when a new opportunity is created": "Feuer, wenn eine neue Chance erstellt wird",
|
||||
"Assigned To Team ID": "Zugewiesen an Team-ID",
|
||||
"Entity Type": "Entitätstyp",
|
||||
"Start Date Minimum": "Startdatum Minimum",
|
||||
"Start Date Maximum": "Maximales Startdatum",
|
||||
"Opportunity Stage": "Verkaufschance Phase",
|
||||
"Include Closed Opportunities": "Geschlossene Verkaufschancen einbeziehen",
|
||||
"Minimum Probability (%)": "Minimale Wahrscheinlichkeit (%)",
|
||||
"Maximum Probability (%)": "Maximale Wahrscheinlichkeit (%)",
|
||||
"Target Close After": "Ziel schließen nach",
|
||||
"Target Close Before": "Ziel schließen vorher",
|
||||
"Only trigger for tasks assigned to this user (optional)": "Nur für diesem Benutzer zugewiesene Aufgaben auslösen (optional)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "Nur für diesem Team zugewiesene Aufgaben auslösen (optional)",
|
||||
"Only trigger for tasks created by this user (optional)": "Nur für von diesem Benutzer erstellte Aufgaben auslösen (optional)",
|
||||
"Type of tasks to monitor": "Art der zu überwachenden Aufgaben",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "Auslösen nur für Aufgaben, die mit dieser Art von Ressource verknüpft sind (optional)",
|
||||
"Only trigger for contacts of this type (optional)": "Nur für diese Art von Kontakten auslösen (optional)",
|
||||
"Only trigger for contacts of this entity type (optional)": "Nur für Kontakte dieses Entitätstyp auslösen (optional)",
|
||||
"Only trigger for contacts with this household title (optional)": "Auslösen nur für Kontakte mit diesem Haushaltstitel (optional)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "Nur für diesem Benutzer zugewiesene Kontakte auslösen (optional)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "Nur für Kontakte mit einem dieser Tags auslösen (optional)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "Auslösen nur für Ereignisse, die mit dieser Art von Ressource verknüpft sind (optional)",
|
||||
"Select the specific resource to filter events by": "Wählen Sie die spezifische Ressource zum Filtern von Ereignissen nach",
|
||||
"Only trigger for events of this category (optional)": "Nur für Ereignisse dieser Kategorie auslösen (optional)",
|
||||
"Only trigger for events starting on or after this date/time": "Nur für Ereignisse, die am oder nach diesem Datum/der Uhrzeit beginnen",
|
||||
"Only trigger for events starting on or before this date/time": "Nur für Ereignisse, die am oder vor diesem Datum/der Uhrzeit beginnen",
|
||||
"How to order the events": "So bestellen Sie die Termine",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "Auslösen nur für Chancen, die mit dieser Art von Ressource verknüpft sind (optional)",
|
||||
"Select the specific resource to filter opportunities by": "Wählen Sie die spezifische Ressource zum Filtern von Chancen nach",
|
||||
"Only trigger for opportunities in this stage (optional)": "Nur für Chancen in dieser Stufe auslösen (optional)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "Nur für von diesem Benutzer verwaltete Möglichkeiten auslösen (optional)",
|
||||
"Include won and lost opportunities in results": "Gewonnene und verlorene Chancen in die Ergebnisse einbeziehen",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "Auslösen von Chancen mit Wahrscheinlichkeit ab diesem Prozentsatz (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "Auslösen von Chancen mit Wahrscheinlichkeit unter oder unter diesem Prozentsatz (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "Auslösen nur für Opportunitäten mit Zielabschlußdatum vor oder nach diesem Datum/Zeit",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "Auslösen nur für Chancen mit Zielabschlussdatum vor oder vor diesem Datum/Zeit",
|
||||
"Start Date (ascending)": "Startdatum (aufsteigend)",
|
||||
"Start Date (descending)": "Startdatum (absteigend)"
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Introduzca el token de acceso de Wealthbox API. Obtenerlo desde Ajustes → Tokens de acceso API en su cuenta Wealthbox.",
|
||||
"Create Contact": "Crear contacto",
|
||||
"Create Note": "Crear nota",
|
||||
"Create Project": "Crear proyecto",
|
||||
"Add Member to Household": "Añadir miembro a Household",
|
||||
"Create Household": "Crear Casa",
|
||||
"Create Event": "Crear Evento",
|
||||
"Create Opportunity": "Crear Oportunidad",
|
||||
"Create Task": "Crear tarea",
|
||||
"Start Workflow": "Iniciar flujo de trabajo",
|
||||
"Find Contact": "Encontrar contacto",
|
||||
"Find Task": "Buscar tarea",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "Añade un nuevo contacto con datos ricos (nombre, dirección, correo electrónico, etiquetas, etc.)",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "Añade una nota vinculada a un contacto. Registra resúmenes de llamadas contra registros de clientes.",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "Inicia un nuevo proyecto con descripción y organizador. Lanza el proyecto basado en la incorporación de nuevos clientes.",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "Añade un miembro a un hogar existente. Vincula varios contactos bajo una unidad familiar.",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "Crea un registro familiar con correos electrónicos, etiquetas.",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "Crea un evento de calendario vinculado al contacto. Programe reuniones de asesoramiento en nombre de los clientes.",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "Registra una oportunidad incluyendo etapa, fecha de cierre, cantidad. Automatiza el seguimiento de la oportunidad después de las reuniones.",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "Crea tareas vinculadas a contactos con fechas de vencimiento y tipos de asignación. Asigna acciones de seguimiento cuando se crean oportunidades.",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "Activa una plantilla de flujo de trabajo en un contacto/proyecto/oportunidad. Automatiza secuencias de múltiples pasos basándose en eventos CRM.",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "Localice un contacto por nombre, correo electrónico, teléfono o filtros avanzados. Búsqueda completa de contactos con opciones de filtrado dinámico.",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "Encuentra tareas existentes usando filtros de búsqueda completos. Búsqueda por asignación, recurso, estado de terminación y rangos de fechas.",
|
||||
"First Name": "Nombre",
|
||||
"Last Name": "Apellido",
|
||||
"Prefix": "Prefijo",
|
||||
"Middle Name": "Segundo nombre",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "Apodo",
|
||||
"Job Title": "Trabajo",
|
||||
"Company Name": "Nombre De La Empresa",
|
||||
"Contact Type": "Tipo de contacto",
|
||||
"Contact Classification": "Clasificación del contacto",
|
||||
"Status": "Estado",
|
||||
"Gender": "Sexo",
|
||||
"Birth Date": "Fecha de nacimiento",
|
||||
"Marital Status": "Estado civil",
|
||||
"Email Address": "Dirección de email",
|
||||
"Phone Number": "Número de teléfono",
|
||||
"Street Address Line 1": "Línea 1 de dirección",
|
||||
"Street Address Line 2": "Línea de dirección 2",
|
||||
"City": "Ciudad",
|
||||
"State": "Estado",
|
||||
"ZIP Code": "Código postal",
|
||||
"Country": "País",
|
||||
"Twitter Handle": "Manejo de Twitter",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "Información de fondo",
|
||||
"Important Information": "Información importante",
|
||||
"Personal Interests": "Intereses personales",
|
||||
"Contact Source": "Fuente de contacto",
|
||||
"Tags": "Etiquetas",
|
||||
"External Unique ID": "ID único externo",
|
||||
"Note Content": "Contenido de Nota",
|
||||
"Contact": "Contacto",
|
||||
"Visible To": "Visible a",
|
||||
"Project Name": "Nombre del proyecto",
|
||||
"Project Description": "Descripción del proyecto",
|
||||
"Organizer": "Organizador",
|
||||
"Custom Fields": "Campos personalizados",
|
||||
"Household": "Casita",
|
||||
"Household Title": "Título de la Casa",
|
||||
"Household Name": "Nombre del hogar",
|
||||
"Head of Household": "Cabeza de la Casa",
|
||||
"Spouse/Partner (Optional)": "Spous/Partner (opcional)",
|
||||
"Primary Email Address": "Dirección de Email Principal",
|
||||
"Primary Phone Number": "Número de teléfono principal",
|
||||
"Household Type": "Tipo de hogar",
|
||||
"Event Title": "Título del evento",
|
||||
"Start Date & Time": "Fecha y hora de inicio",
|
||||
"End Date & Time": "Fecha y hora de fin",
|
||||
"Location": "Ubicación",
|
||||
"Description": "Descripción",
|
||||
"All Day Event": "Evento de todo el día",
|
||||
"Repeating Event": "Repetir evento",
|
||||
"Event Status": "Estado del evento",
|
||||
"Linked Contact": "Contacto vinculado",
|
||||
"Invitees": "Invitados",
|
||||
"Event Category": "Categoría del evento",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "Nombre de la oportunidad",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "Probabilidad (%)",
|
||||
"Amount": "Cantidad",
|
||||
"Currency": "Moneda",
|
||||
"Amount Type": "Tipo de importe",
|
||||
"Stage": "Etapa",
|
||||
"Opportunity Manager": "Gestor de Oportunidades",
|
||||
"Task Name": "Nombre de tarea",
|
||||
"Due Date": "Fecha de fin",
|
||||
"Assigned To": "Asignado a",
|
||||
"Priority": "Prioridad",
|
||||
"Mark as Complete": "Marcar como completo",
|
||||
"Link To": "Enlace a",
|
||||
"Linked Record": "Registro vinculado",
|
||||
"Category": "Categoría",
|
||||
"Due Later": "Vence más tarde",
|
||||
"Workflow Template": "Plantilla de flujo de trabajo",
|
||||
"Workflow Label": "Etiqueta de flujo de trabajo",
|
||||
"Workflow Milestones": "Hitos de flujo de trabajo",
|
||||
"Name": "Nombre",
|
||||
"Contact ID": "ID de contacto",
|
||||
"Contact Entity Type": "Tipo de entidad de contacto",
|
||||
"Tags Filter": "Filtro de etiquetas",
|
||||
"Active Status": "Estado activo",
|
||||
"Include Deleted Contacts": "Incluye contactos borrados",
|
||||
"Updated Since": "Actualizado desde",
|
||||
"Updated Before": "Actualizado antes",
|
||||
"Sort Order": "Ordenar",
|
||||
"Result Limit": "Límite resultado",
|
||||
"Return Single Result Only": "Devolver solo resultado único",
|
||||
"Task ID (Optional)": "ID de tarea (opcional)",
|
||||
"Linked Resource Type": "Tipo de recurso vinculado",
|
||||
"Linked Resource": "Recurso vinculado",
|
||||
"Assigned to Team ID": "Asignado al ID del equipo",
|
||||
"Created By": "Creado por",
|
||||
"Completion Status": "Estado de finalización",
|
||||
"Task Type": "Tipo de tarea",
|
||||
"The first name of the contact": "El nombre del contacto",
|
||||
"The last name of the contact": "El apellido del contacto",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "El prefijo preferido para el contacto (p.ej., Ms., Dr.)",
|
||||
"The middle name of the contact": "El nombre medio del contacto",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "El sufijo asociado con el contacto (por ej., Jr., A., M.D.)",
|
||||
"A preferred shortname for the contact": "Un nombre corto preferido para el contacto",
|
||||
"The title the contact holds at their present company": "El título que el contacto tiene en su empresa actual",
|
||||
"The name of the contact's present company": "El nombre de la empresa actual del contacto",
|
||||
"The type of the contact being created": "El tipo de contacto que se está creando",
|
||||
"A string further classifying the contact": "Una cadena de clasificación adicional del contacto",
|
||||
"Whether the contact is currently active": "Si el contacto está activo",
|
||||
"The gender of the contact": "El género del contacto",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "Fecha de nacimiento del contacto (formato AAA-MM-DD)",
|
||||
"The marital status of the contact": "El estado civil del contacto",
|
||||
"Primary email address for the contact": "Dirección de correo principal para el contacto",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "Número de teléfono principal para el contacto (por ejemplo, (555) 123-4567)",
|
||||
"First line of street address": "Primera línea de dirección de la calle",
|
||||
"Second line of street address (apt, suite, etc.)": "Segunda línea de la dirección de la calle (apt, suite, etc.)",
|
||||
"City for the address": "Ciudad para la dirección",
|
||||
"State or province for the address": "Estado o provincia para la dirección",
|
||||
"ZIP or postal code for the address": "Código postal o postal para la dirección",
|
||||
"Country for the address": "País para la dirección",
|
||||
"The twitter handle of the contact": "El usuario de twitter del contacto",
|
||||
"The LinkedIn URL for the contact": "La URL de LinkedIn para el contacto",
|
||||
"A brief description of the contact": "Una breve descripción del contacto",
|
||||
"Any other important info for the contact": "Cualquier otra información importante para el contacto",
|
||||
"Personal interests for the contact": "Intereses personales para el contacto",
|
||||
"The method in which this contact was acquired": "El método en el que se adquirió este contacto",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "Etiquetas a asociar con el contacto (por ejemplo, \"Cliente\", \"VIP\", \"Referir\")",
|
||||
"A unique identifier for this contact in an external system": "Un identificador único para este contacto en un sistema externo",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "El cuerpo principal de la nota (por ejemplo, resumen de llamadas, notas de reunión, detalles de interacción del cliente)",
|
||||
"Select the contact to link this note to": "Seleccione el contacto al que enlazar esta nota",
|
||||
"Select who can view this note": "Seleccione quién puede ver esta nota",
|
||||
"Select tags to associate with this note": "Seleccionar etiquetas para asociar con esta nota",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "El nombre del proyecto (por ej., \"Client Onboarding\", \"Q1 Review Process\")",
|
||||
"A detailed explanation of the project goals and scope": "Una explicación detallada de los objetivos y alcance del proyecto",
|
||||
"Select the user who will be responsible for organizing this project": "Seleccione el usuario que será responsable de organizar este proyecto",
|
||||
"Select who can view this project": "Seleccione quién puede ver este proyecto",
|
||||
"Add custom fields to this project": "Añadir campos personalizados a este proyecto",
|
||||
"Select the household that will receive the new member": "Seleccione el hogar que recibirá el nuevo miembro",
|
||||
"Select the contact to add to the household": "Seleccione el contacto para añadir al hogar",
|
||||
"The household title to assign to the added contact": "El título del hogar para asignar al contacto agregado",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "El nombre del hogar (por ej., \"The Anderson Family\", \"Smith Household\")",
|
||||
"Select the contact who will be the head of this household": "Seleccione el contacto que será el jefe de este hogar",
|
||||
"Select the spouse or partner to automatically add to this household": "Seleccione el cónyuge o socio para añadir automáticamente a este hogar",
|
||||
"Primary email address for the household": "Dirección de correo electrónico principal para el hogar",
|
||||
"City for the household address": "Ciudad para la dirección del hogar",
|
||||
"State or province for the household address": "Estado o provincia para la dirección del hogar",
|
||||
"ZIP or postal code for the household address": "Código postal o postal para la dirección del hogar",
|
||||
"Country for the household address": "País para la dirección del hogar",
|
||||
"Primary phone number for the household": "Número de teléfono principal para el hogar",
|
||||
"The type of household being created": "El tipo de hogar que se está creando",
|
||||
"Whether the household is currently active": "Si el hogar está activo",
|
||||
"Background information about the household": "Información de fondo sobre el hogar",
|
||||
"Any important information about the household": "Cualquier información importante sobre el hogar",
|
||||
"Select tags to associate with this household": "Seleccionar etiquetas para asociar con este hogar",
|
||||
"Select who can view this household": "Seleccione quién puede ver este hogar",
|
||||
"A unique identifier for this household in an external system": "Un identificador único para este hogar en un sistema externo",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "El nombre del evento (por ejemplo, \"Reunión de clientes\", \"Revisión de portafolio\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "Cuando comienza el evento (formato aaa-mm-dd hh:mm)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "Cuando el evento termina (formato aaa-mm-dd hh:mm)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "Donde se realiza el evento (por ejemplo, \"Sala de Conferencias\", \"Oficina del Cliente\", \"Reunión de Zero\")",
|
||||
"A detailed explanation of the event purpose and agenda": "Una explicación detallada del propósito y la agenda del evento",
|
||||
"Check if this is an all-day event": "Compruebe si este es un evento de todo el día",
|
||||
"Check if this event repeats": "Comprobar si este evento se repite",
|
||||
"The current state of the event": "El estado actual del evento",
|
||||
"Select the contact to link this event to": "Seleccione el contacto al que vincular este evento",
|
||||
"Add people to invite to this event": "Añadir personas para invitar a este evento",
|
||||
"Select the category for this event": "Seleccione la categoría para este evento",
|
||||
"Send email invitations to invitees": "Enviar invitaciones de correo electrónico a los invitados",
|
||||
"Select who can view this event": "Seleccione quién puede ver este evento",
|
||||
"Add custom fields to this event": "Añadir campos personalizados a este evento",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "El nombre de la oportunidad (por ej., \"Plan Financiero\", \"Asesoramiento de Inversiones\", \"Plane\")",
|
||||
"When the opportunity should close": "Cuando la oportunidad debe cerrarse",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "La probabilidad de que la oportunidad se cierre, como porcentaje (0-100)",
|
||||
"The monetary value of the opportunity": "El valor monetario de la oportunidad",
|
||||
"The currency for the opportunity amount": "La moneda para la cantidad de la oportunidad",
|
||||
"The type of amount this represents": "El tipo de cantidad que representa",
|
||||
"Select the current stage of this opportunity": "Seleccione la etapa actual de esta oportunidad",
|
||||
"Select the contact linked to this opportunity": "Seleccione el contacto vinculado a esta oportunidad",
|
||||
"A detailed explanation of the opportunity": "Una explicación detallada de la oportunidad",
|
||||
"Select the user designated as manager of this opportunity": "Seleccione el usuario designado como administrador de esta oportunidad",
|
||||
"Select who can view this opportunity": "Seleccione quién puede ver esta oportunidad",
|
||||
"Add custom fields to this opportunity": "Añadir campos personalizados a esta oportunidad",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "El nombre de la tarea (por ej., \"Devolver llamada de facturación\", \"Seguimiento de la propuesta\")",
|
||||
"When the task is due": "Cuando la tarea vence",
|
||||
"Select the user who the task is assigned to": "Seleccione el usuario al que la tarea está asignada",
|
||||
"A detailed explanation of the task": "Una explicación detallada de la tarea",
|
||||
"The priority level of the task": "El nivel de prioridad de la tarea",
|
||||
"Check if the task should be created as already completed": "Compruebe si la tarea debe ser creada como ya completada",
|
||||
"What type of record to link this task to": "A qué tipo de registro vincular esta tarea",
|
||||
"Select the record to link this task to": "Seleccione el registro al que vincular esta tarea",
|
||||
"Select the category this task belongs to": "Seleccione la categoría a la que pertenece esta tarea",
|
||||
"Select who can view this task": "Seleccione quién puede ver esta tarea",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "Intervalo para cuando esta tarea se vence después del inicio (por ejemplo, \"2 días más tarde a las 5:00 PM\")",
|
||||
"Add custom fields to this task": "Añadir campos personalizados a esta tarea",
|
||||
"Select the workflow template to trigger": "Seleccione la plantilla de flujo de trabajo a activar",
|
||||
"What type of record to link this workflow to": "Qué tipo de registro enlazar este flujo de trabajo",
|
||||
"Select the record to link this workflow to": "Seleccione el registro al que vincular este flujo de trabajo",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "Un nombre corto para el flujo de trabajo (por ej., \"A bordo de un nuevo cliente para la empresa\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "Cuando desea que el flujo de trabajo comience (opcional, por defecto ahora)",
|
||||
"Select who can view this workflow": "Seleccione quién puede ver este workflow",
|
||||
"Add milestones to this workflow": "Añadir hitos a este flujo de trabajo",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "Buscar por nombre (soporta coincidencias parciales entre el prefijo, el primero, el medio, el último, el sufijo, el apodo y el nombre completo para las familias/empresas)",
|
||||
"Search by email address": "Buscar por correo electrónico",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "La búsqueda por número de teléfono (delimitadores como -, (), se eliminará automáticamente)",
|
||||
"Search by specific contact ID (most precise search)": "Búsqueda por ID de contacto específico (búsqueda más precisa)",
|
||||
"Search by external unique identifier": "Buscar por identificador único externo",
|
||||
"Filter by contact type": "Filtrar por tipo de contacto",
|
||||
"Filter by entity type": "Filtrar por tipo de entidad",
|
||||
"Filter by household title (only applies to household members)": "Filtrar por título del hogar (sólo se aplica a los miembros del hogar)",
|
||||
"Filter contacts by tags": "Filtrar contactos por etiquetas",
|
||||
"Filter by active status": "Filtrar por estado activo",
|
||||
"Include contacts that have been deleted": "Incluye contactos que han sido eliminados",
|
||||
"Only return contacts updated on or after this date/time": "Devolver contactos actualizados el o después de esta fecha/hora",
|
||||
"Only return contacts updated on or before this date/time": "Devolver contactos actualizados el o antes de esta fecha/hora",
|
||||
"How to order the results": "Cómo ordenar los resultados",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "Número máximo de contactos a devolver (por defecto: 50, máximo: 1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "Si está marcado, devuelve sólo el primer contacto coincidente. Si no está marcado, devuelve todos los contactos coincidentes.",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "Buscar una tarea específica por su ID único. Dejar en blanco para buscar usando filtros.",
|
||||
"Filter tasks by the type of resource they are linked to": "Filtrar tareas por el tipo de recurso al que están enlazados",
|
||||
"Select the specific resource to filter tasks by": "Seleccione el recurso específico para filtrar las tareas por",
|
||||
"Filter tasks by the user they are assigned to": "Filtrar tareas por el usuario al que están asignadas",
|
||||
"Filter tasks by the team they are assigned to": "Filtrar tareas por el equipo al que están asignadas",
|
||||
"Filter tasks by the user who created them": "Filtrar tareas por el usuario que las creó",
|
||||
"Filter by task completion status": "Filtrar por estado de finalización de tarea",
|
||||
"Filter by task type": "Filtrar por tipo de tarea",
|
||||
"Only return tasks updated on or after this date/time": "Devolver sólo tareas actualizadas el o después de esta fecha/hora",
|
||||
"Only return tasks updated on or before this date/time": "Devolver sólo las tareas actualizadas el o antes de esta fecha/hora",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "Número máximo de tareas a devolver (por defecto: 50, máximo: 1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "Si está marcado, devuelve sólo la primera tarea coincidente. Si no está marcada, devuelve todas las tareas coincidentes.",
|
||||
"Person": "Persona",
|
||||
"Organization": "Organización",
|
||||
"Trust": "Confiar",
|
||||
"Client": "Cliente",
|
||||
"Past Client": "Cliente anterior",
|
||||
"Prospect": "Prospecto",
|
||||
"Vendor": "Vendedor",
|
||||
"Active": "Activo",
|
||||
"Inactive": "Inactivo",
|
||||
"Female": "Mujer",
|
||||
"Male": "Hombre",
|
||||
"Non-binary": "No binario",
|
||||
"Unknown": "Desconocido",
|
||||
"Married": "Casado",
|
||||
"Single": "Único",
|
||||
"Divorced": "Divorado",
|
||||
"Widowed": "Ancho",
|
||||
"Life Partner": "Socio de la vida",
|
||||
"Separated": "Separados",
|
||||
"Referral": "Referir",
|
||||
"Conference": "Conferencia",
|
||||
"Direct Mail": "Correo directo",
|
||||
"Cold Call": "Llamada fría",
|
||||
"Other": "Otro",
|
||||
"Head": "Cabeza",
|
||||
"Spouse": "Cónyuge",
|
||||
"Partner": "Socio",
|
||||
"Child": "Hijo",
|
||||
"Grandchild": "Niño",
|
||||
"Parent": "Padres",
|
||||
"Grandparent": "Abuelo",
|
||||
"Sibling": "Hermanos",
|
||||
"Dependent": "Dependente",
|
||||
"Unconfirmed": "Sin confirmar",
|
||||
"Confirmed": "Confirmada",
|
||||
"Tentative": "Tentativa",
|
||||
"Completed": "Completado",
|
||||
"Cancelled": "Cancelado",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP (£)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "AUD (A$)",
|
||||
"Fee": "Cuota",
|
||||
"Commission": "Comisión",
|
||||
"AUM": "AU",
|
||||
"Low": "Baja",
|
||||
"Medium": "Medio",
|
||||
"High": "Alta",
|
||||
"Project": "Projekt",
|
||||
"Opportunity": "Oportunidad",
|
||||
"Active Only": "Solo Activo",
|
||||
"Inactive Only": "Solo inactivo",
|
||||
"All Contacts": "Todos los contactos",
|
||||
"Recent (newest first)": "Reciente (último primero)",
|
||||
"Created Date (newest first)": "Fecha de Creación (más reciente primero)",
|
||||
"Updated Date (newest first)": "Fecha actualizada (más reciente primero)",
|
||||
"Ascending": "Ascendiente",
|
||||
"Descending": "Descendiente",
|
||||
"All Tasks": "Todas las tareas",
|
||||
"Completed Only": "Solo completado",
|
||||
"Incomplete Only": "Solo incompleto",
|
||||
"Parent Tasks Only": "Solo tareas padre",
|
||||
"Subtasks Only": "Sólo subtareas",
|
||||
"New Task": "Nueva tarea",
|
||||
"New Contact": "Nuevo contacto",
|
||||
"New Event": "Nuevo evento",
|
||||
"New Opportunity": "Nueva oportunidad",
|
||||
"Fires when a new task is created": "Dispara cuando se crea una nueva tarea",
|
||||
"Fires when a new contact is created": "Dispara cuando se crea un nuevo contacto",
|
||||
"Fires when a new event is created": "Dispara cuando se crea un nuevo evento",
|
||||
"Fires when a new opportunity is created": "Dispara cuando se crea una nueva oportunidad",
|
||||
"Assigned To Team ID": "Asignado al ID del equipo",
|
||||
"Entity Type": "Tipo de entidad",
|
||||
"Start Date Minimum": "Fecha de inicio Mínimo",
|
||||
"Start Date Maximum": "Fecha de inicio máxima",
|
||||
"Opportunity Stage": "Etapa de Oportunidad",
|
||||
"Include Closed Opportunities": "Incluye oportunidades cerradas",
|
||||
"Minimum Probability (%)": "Probabilidad mínima (%)",
|
||||
"Maximum Probability (%)": "Probabilidad máxima (%)",
|
||||
"Target Close After": "Cerrar destino después de",
|
||||
"Target Close Before": "Cerrar objetivo antes de",
|
||||
"Only trigger for tasks assigned to this user (optional)": "Sólo disparar para tareas asignadas a este usuario (opcional)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "Sólo disparador para tareas asignadas a este equipo (opcional)",
|
||||
"Only trigger for tasks created by this user (optional)": "Sólo disparador para tareas creadas por este usuario (opcional)",
|
||||
"Type of tasks to monitor": "Tipo de tareas a monitorear",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "Sólo disparador para tareas vinculadas a este tipo de recurso (opcional)",
|
||||
"Only trigger for contacts of this type (optional)": "Sólo para contactos de este tipo (opcional)",
|
||||
"Only trigger for contacts of this entity type (optional)": "Sólo para contactos de este tipo de entidad (opcional)",
|
||||
"Only trigger for contacts with this household title (optional)": "Sólo para contactos con este título doméstico (opcional)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "Sólo para contactos asignados a este usuario (opcional)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "Sólo para contactos con una de estas etiquetas (opcional)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "Sólo para eventos vinculados a este tipo de recurso (opcional)",
|
||||
"Select the specific resource to filter events by": "Seleccione el recurso específico para filtrar eventos por",
|
||||
"Only trigger for events of this category (optional)": "Sólo para eventos de esta categoría (opcional)",
|
||||
"Only trigger for events starting on or after this date/time": "Sólo para eventos que comienzan en o después de esta fecha/hora",
|
||||
"Only trigger for events starting on or before this date/time": "Sólo para eventos que comienzan en o antes de esta fecha/hora",
|
||||
"How to order the events": "Cómo ordenar los eventos",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "Sólo para oportunidades vinculadas a este tipo de recurso (opcional)",
|
||||
"Select the specific resource to filter opportunities by": "Seleccione el recurso específico para filtrar oportunidades por",
|
||||
"Only trigger for opportunities in this stage (optional)": "Sólo disparar para oportunidades en esta etapa (opcional)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "Sólo disparador para oportunidades gestionadas por este usuario (opcional)",
|
||||
"Include won and lost opportunities in results": "Incluye oportunidades ganadas y perdidas en los resultados",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "Sólo desencadenar para oportunidades con probabilidad en o por encima de este porcentaje (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "Sólo desencadenar para oportunidades con probabilidad en o por debajo de este porcentaje (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "Sólo disparar para oportunidades con fecha de cierre objetivo en o después de esta fecha/hora",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "Sólo disparar para oportunidades con fecha de cierre objetivo en o antes de esta fecha/hora",
|
||||
"Start Date (ascending)": "Fecha de inicio (ascendiendo)",
|
||||
"Start Date (descending)": "Fecha de inicio (descenso)"
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Entrez votre jeton d'accès à l'API Wealthbox. Obtenez le depuis Paramètres → Jetons d'accès API dans votre compte Wealthbox.",
|
||||
"Create Contact": "Créer un contact",
|
||||
"Create Note": "Créer une note",
|
||||
"Create Project": "Créer un projet",
|
||||
"Add Member to Household": "Ajouter un membre à la maison",
|
||||
"Create Household": "Créer une maison",
|
||||
"Create Event": "Créer un événement",
|
||||
"Create Opportunity": "Créer une Affaire",
|
||||
"Create Task": "Créer une tâche",
|
||||
"Start Workflow": "Démarrer le flux de travail",
|
||||
"Find Contact": "Trouver un contact",
|
||||
"Find Task": "Trouver une tâche",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "Ajoute un nouveau contact avec des informations riches (nom, adresse, email, tags, etc.)",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "Ajoute une note liée à un contact. Enregistre les résumés des appels par rapport aux enregistrements du client.",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "Démarre un nouveau projet avec description et organisateur. Lancez l'intégration basée sur le projet lorsque de nouveaux clients s'inscrivent.",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "Ajoute un membre à un foyer existant. Liez plusieurs contacts sous une unité familiale.",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "Crée un dossier ménager avec des courriels, des étiquettes. Groupes de contacts des membres de la famille dans un même foyer.",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "Crée un événement de calendrier lié à un contact. Planifier des réunions consultatives au nom des clients.",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "Enregistre une opportunité incluant une étape, la date de clôture, le montant. Automatiser le suivi des opportunités après les réunions.",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "Crée des tâches liées aux contacts avec des dates d'échéance et des types d'affectation. Assigner des actions de suivi lorsque des opportunités sont créées.",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "Déclenche un modèle de workflow sur un contact/projet/opportunité. Automatiser les séquences multi-étapes en fonction des événements CRM.",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "Localisez un contact par nom, email, téléphone ou filtres avancés. Recherche complète de contacts avec des options de filtrage dynamique.",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "Trouve les tâches existantes en utilisant des filtres de recherche complets. Recherche par devoir, ressource, état de complétion et plage de dates.",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Prefix": "Préfixe",
|
||||
"Middle Name": "Deuxième prénom",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "Pseudo",
|
||||
"Job Title": "Titre du poste",
|
||||
"Company Name": "Nom de l’entreprise",
|
||||
"Contact Type": "Type de contact",
|
||||
"Contact Classification": "Classification des contacts",
|
||||
"Status": "Statut",
|
||||
"Gender": "Sexe",
|
||||
"Birth Date": "Date de naissance",
|
||||
"Marital Status": "Statut matrimonial",
|
||||
"Email Address": "Adresse e-mail",
|
||||
"Phone Number": "Numéro de téléphone",
|
||||
"Street Address Line 1": "Adresse ligne 1",
|
||||
"Street Address Line 2": "Adresse ligne 2",
|
||||
"City": "Ville",
|
||||
"State": "État",
|
||||
"ZIP Code": "Code postal",
|
||||
"Country": "Pays",
|
||||
"Twitter Handle": "Identifiant Twitter",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "Informations sur l'arrière-plan",
|
||||
"Important Information": "Information importante",
|
||||
"Personal Interests": "Intérêts personnels",
|
||||
"Contact Source": "Source du contact",
|
||||
"Tags": "Tags",
|
||||
"External Unique ID": "ID Unique Externe",
|
||||
"Note Content": "Contenu de la note",
|
||||
"Contact": "Contacter",
|
||||
"Visible To": "Visible pour",
|
||||
"Project Name": "Project Name",
|
||||
"Project Description": "Description du projet",
|
||||
"Organizer": "Organisateur",
|
||||
"Custom Fields": "Champs personnalisés",
|
||||
"Household": "Ménage",
|
||||
"Household Title": "Titre de la maison",
|
||||
"Household Name": "Nom de la famille",
|
||||
"Head of Household": "Responsable de la maison",
|
||||
"Spouse/Partner (Optional)": "Époux/partenaire (facultatif)",
|
||||
"Primary Email Address": "Adresse e-mail principale",
|
||||
"Primary Phone Number": "Numéro de téléphone principal",
|
||||
"Household Type": "Type de ménage",
|
||||
"Event Title": "Titre de l'événement",
|
||||
"Start Date & Time": "Date et heure de début",
|
||||
"End Date & Time": "Date et heure de fin",
|
||||
"Location": "Localisation",
|
||||
"Description": "Libellé",
|
||||
"All Day Event": "Evénement de toute la journée",
|
||||
"Repeating Event": "Événement répétitif",
|
||||
"Event Status": "Statut de l'événement",
|
||||
"Linked Contact": "Contact lié",
|
||||
"Invitees": "Invités",
|
||||
"Event Category": "Catégorie d'événement",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "Nom de l'opportunité",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "Probabilité (%)",
|
||||
"Amount": "Montant",
|
||||
"Currency": "Devise",
|
||||
"Amount Type": "Type de montant",
|
||||
"Stage": "Étape",
|
||||
"Opportunity Manager": "Gestionnaire d'Affaires",
|
||||
"Task Name": "Nom de la tâche",
|
||||
"Due Date": "Date de fin",
|
||||
"Assigned To": "Assigné à",
|
||||
"Priority": "Priorité",
|
||||
"Mark as Complete": "Marquer comme terminé",
|
||||
"Link To": "Lien vers",
|
||||
"Linked Record": "Enregistrement lié",
|
||||
"Category": "Catégorie",
|
||||
"Due Later": "Échéance ultérieure",
|
||||
"Workflow Template": "Modèle de Workflow",
|
||||
"Workflow Label": "Libellé du Workflow",
|
||||
"Workflow Milestones": "Jalons du flux de travail",
|
||||
"Name": "Nom",
|
||||
"Contact ID": "ID du contact",
|
||||
"Contact Entity Type": "Type d'entité du contact",
|
||||
"Tags Filter": "Filtre d'étiquettes",
|
||||
"Active Status": "Statut Actif",
|
||||
"Include Deleted Contacts": "Inclure les contacts supprimés",
|
||||
"Updated Since": "Mis à jour depuis",
|
||||
"Updated Before": "Mis à jour avant",
|
||||
"Sort Order": "Ordre de tri",
|
||||
"Result Limit": "Limite de résultat",
|
||||
"Return Single Result Only": "Résultat unique de retour uniquement",
|
||||
"Task ID (Optional)": "ID de la tâche (facultatif)",
|
||||
"Linked Resource Type": "Type de ressource liée",
|
||||
"Linked Resource": "Ressource liée",
|
||||
"Assigned to Team ID": "Assigné à l'ID de l'équipe",
|
||||
"Created By": "Créé par",
|
||||
"Completion Status": "Statut d'achèvement",
|
||||
"Task Type": "Type de tâche",
|
||||
"The first name of the contact": "Le prénom du contact",
|
||||
"The last name of the contact": "Le nom de famille du contact",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "Le préfixe préféré pour le contact (ex: M.M., M.M., M., Dr.)",
|
||||
"The middle name of the contact": "Le prénom du contact",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "Le suffixe associé au contact (par exemple, Jr., Sr., M.D.)",
|
||||
"A preferred shortname for the contact": "Un nom court préféré pour le contact",
|
||||
"The title the contact holds at their present company": "Le titre du contact dans sa société actuelle",
|
||||
"The name of the contact's present company": "Le nom de la société actuelle du contact",
|
||||
"The type of the contact being created": "Le type de contact en cours de création",
|
||||
"A string further classifying the contact": "Une chaîne de caractères classant davantage le contact",
|
||||
"Whether the contact is currently active": "Si le contact est actuellement actif",
|
||||
"The gender of the contact": "Sexe du contact",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "Date de naissance du contact (format AAAA-MM-JJ)",
|
||||
"The marital status of the contact": "L'état matrimonial du contact",
|
||||
"Primary email address for the contact": "Adresse e-mail principale du contact",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "Numéro de téléphone principal pour le contact (par exemple, (555) 123-4567)",
|
||||
"First line of street address": "Première ligne d'adresse",
|
||||
"Second line of street address (apt, suite, etc.)": "Deuxième ligne d'adresse (apt, suite, etc.)",
|
||||
"City for the address": "Ville pour l'adresse",
|
||||
"State or province for the address": "État ou province de l'adresse",
|
||||
"ZIP or postal code for the address": "ZIP ou code postal pour l'adresse",
|
||||
"Country for the address": "Pays pour l'adresse",
|
||||
"The twitter handle of the contact": "La poignée twitter du contact",
|
||||
"The LinkedIn URL for the contact": "L'URL LinkedIn pour le contact",
|
||||
"A brief description of the contact": "Une brève description du contact",
|
||||
"Any other important info for the contact": "Toute autre information importante pour le contact",
|
||||
"Personal interests for the contact": "Intérêts personnels pour le contact",
|
||||
"The method in which this contact was acquired": "La méthode dans laquelle ce contact a été acquis",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "Tags à associer au contact (par exemple, \"Client\", \"VIP\", \"Parrain\")",
|
||||
"A unique identifier for this contact in an external system": "Un identifiant unique pour ce contact dans un système externe",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "Le corps principal de la note (par exemple, résumé d'appel, notes de réunion, détails de l'interaction client)",
|
||||
"Select the contact to link this note to": "Sélectionnez le contact pour lier cette note à",
|
||||
"Select who can view this note": "Sélectionnez qui peut voir cette note",
|
||||
"Select tags to associate with this note": "Sélectionnez les tags à associer avec cette note",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "Le nom du projet (par exemple, \"Client en cours d'intégration\", \"Processus d'évaluation Q1\")",
|
||||
"A detailed explanation of the project goals and scope": "Une explication détaillée des objectifs et de la portée du projet",
|
||||
"Select the user who will be responsible for organizing this project": "Sélectionnez l'utilisateur qui sera responsable de l'organisation de ce projet",
|
||||
"Select who can view this project": "Sélectionnez qui peut voir ce projet",
|
||||
"Add custom fields to this project": "Ajouter des champs personnalisés à ce projet",
|
||||
"Select the household that will receive the new member": "Sélectionnez la famille qui recevra le nouveau membre",
|
||||
"Select the contact to add to the household": "Sélectionnez le contact à ajouter au foyer",
|
||||
"The household title to assign to the added contact": "Le titre du foyer à assigner au contact ajouté",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "Le nom du ménage (par exemple, \"La famille Anderson\", \"Maison Smith\")",
|
||||
"Select the contact who will be the head of this household": "Sélectionnez le contact qui sera la tête de ce foyer",
|
||||
"Select the spouse or partner to automatically add to this household": "Sélectionnez le conjoint ou le partenaire à ajouter automatiquement à ce foyer",
|
||||
"Primary email address for the household": "Adresse e-mail principale pour le foyer",
|
||||
"City for the household address": "Ville pour l'adresse du ménage",
|
||||
"State or province for the household address": "État ou province pour l'adresse du ménage",
|
||||
"ZIP or postal code for the household address": "ZIP ou code postal pour l'adresse du foyer",
|
||||
"Country for the household address": "Pays pour l'adresse du ménage",
|
||||
"Primary phone number for the household": "Numéro de téléphone principal pour le foyer",
|
||||
"The type of household being created": "Le type de foyer en cours de création",
|
||||
"Whether the household is currently active": "Si le ménage est actuellement actif",
|
||||
"Background information about the household": "Informations de fond sur le foyer",
|
||||
"Any important information about the household": "Toute information importante sur le ménage",
|
||||
"Select tags to associate with this household": "Sélectionnez les tags à associer à ce foyer",
|
||||
"Select who can view this household": "Sélectionnez qui peut voir ce foyer",
|
||||
"A unique identifier for this household in an external system": "Un identifiant unique pour ce foyer dans un système externe",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "Le nom de l'événement (ex: \"Rencontre des clients\", \"Revue du portefeuille\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "Quand l'événement démarre (format aaaa-mm-jj hh:mm)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "À la fin de l'événement (format aaaa-mm-jj hh:mm)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "Lorsque l'événement a lieu (par exemple, \"Salle de conférence\", \"Bureau du client\", \"Réunion de zoom\")",
|
||||
"A detailed explanation of the event purpose and agenda": "Une explication détaillée du but et de l'ordre du jour de l'événement",
|
||||
"Check if this is an all-day event": "Cochez cette case si c'est un événement de toute la journée",
|
||||
"Check if this event repeats": "Vérifier si cet événement se répète",
|
||||
"The current state of the event": "L'état actuel de l'événement",
|
||||
"Select the contact to link this event to": "Sélectionnez le contact pour lier cet événement à",
|
||||
"Add people to invite to this event": "Ajouter des personnes à inviter à cet événement",
|
||||
"Select the category for this event": "Sélectionnez la catégorie pour cet événement",
|
||||
"Send email invitations to invitees": "Envoyer des invitations par e-mail aux invités",
|
||||
"Select who can view this event": "Sélectionnez qui peut voir cet événement",
|
||||
"Add custom fields to this event": "Ajouter des champs personnalisés à cet événement",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "Le nom de l’opportunité (ex: « Plan financier », « Conseil en investissement », « Planification de l’immobilier »)",
|
||||
"When the opportunity should close": "Quand l'opportunité doit se fermer",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "La chance que l'occasion se ferme, en pourcentage (0-100)",
|
||||
"The monetary value of the opportunity": "La valeur monétaire de l'opportunité",
|
||||
"The currency for the opportunity amount": "La devise du montant de l’opportunité",
|
||||
"The type of amount this represents": "Le type de montant que cela représente",
|
||||
"Select the current stage of this opportunity": "Sélectionnez l'étape actuelle de cette opportunité",
|
||||
"Select the contact linked to this opportunity": "Sélectionnez le contact lié à cette opportunité",
|
||||
"A detailed explanation of the opportunity": "Une explication détaillée de l'opportunité",
|
||||
"Select the user designated as manager of this opportunity": "Sélectionnez l'utilisateur désigné comme gestionnaire de cette opportunité",
|
||||
"Select who can view this opportunity": "Sélectionnez qui peut voir cette opportunité",
|
||||
"Add custom fields to this opportunity": "Ajouter des champs personnalisés à cette opportunité",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "Le nom de la tâche (par exemple, \"Retourner l'appel de Bil\", \"Suivre la proposition\")",
|
||||
"When the task is due": "Quand la tâche est due",
|
||||
"Select the user who the task is assigned to": "Sélectionnez l'utilisateur auquel la tâche est assignée",
|
||||
"A detailed explanation of the task": "Une explication détaillée de la tâche",
|
||||
"The priority level of the task": "Le niveau de priorité de la tâche",
|
||||
"Check if the task should be created as already completed": "Vérifier si la tâche doit être créée comme déjà terminée",
|
||||
"What type of record to link this task to": "Quel type d'enregistrement lier cette tâche à",
|
||||
"Select the record to link this task to": "Sélectionnez l'enregistrement à lier à cette tâche",
|
||||
"Select the category this task belongs to": "Sélectionnez la catégorie à laquelle cette tâche appartient",
|
||||
"Select who can view this task": "Sélectionnez qui peut voir cette tâche",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "Intervalle pour la date d'échéance de cette tâche après le début (par exemple, \"2 jours plus tard à 17h00\")",
|
||||
"Add custom fields to this task": "Ajouter des champs personnalisés à cette tâche",
|
||||
"Select the workflow template to trigger": "Sélectionnez le modèle de workflow à déclencher",
|
||||
"What type of record to link this workflow to": "Quel type d'enregistrement lier ce workflow à",
|
||||
"Select the record to link this workflow to": "Sélectionnez l'enregistrement pour lier ce workflow à",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "Un nom abrégé pour le workflow (par exemple, \"A bord d'un nouveau client pour la entreprise\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "Lorsque vous voulez que le workflow démarre (optionnel, par défaut)",
|
||||
"Select who can view this workflow": "Sélectionnez qui peut voir ce workflow",
|
||||
"Add milestones to this workflow": "Ajouter des jalons à ce workflow",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "Recherche par nom (prend en charge les correspondances partielles entre le préfixe, le premier, le milieu, le dernier, le suffixe, le surnom et le nom complet des ménages/entreprises)",
|
||||
"Search by email address": "Recherche par adresse e-mail",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "Recherche par numéro de téléphone (les délimiteurs comme -, (), seront automatiquement supprimés)",
|
||||
"Search by specific contact ID (most precise search)": "Recherche par ID de contact spécifique (recherche la plus précise)",
|
||||
"Search by external unique identifier": "Recherche par identifiant unique externe",
|
||||
"Filter by contact type": "Filtrer par type de contact",
|
||||
"Filter by entity type": "Filtrer par type d'entité",
|
||||
"Filter by household title (only applies to household members)": "Filtrer par titre de famille (s'applique uniquement aux membres du ménage)",
|
||||
"Filter contacts by tags": "Filtrer les contacts par tags",
|
||||
"Filter by active status": "Filtrer par statut actif",
|
||||
"Include contacts that have been deleted": "Inclure les contacts qui ont été supprimés",
|
||||
"Only return contacts updated on or after this date/time": "Renvoyer uniquement les contacts mis à jour à ou après cette date/heure",
|
||||
"Only return contacts updated on or before this date/time": "Renvoyer uniquement les contacts mis à jour à ou avant cette date/heure",
|
||||
"How to order the results": "Comment ordonner les résultats",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "Nombre maximum de contacts à retourner (par défaut : 50, max : 1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "Si coché, retourne uniquement le premier contact correspondant. Si décoché, retourne tous les contacts correspondants.",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "Rechercher une tâche spécifique par son ID unique. Laisser vide pour rechercher en utilisant des filtres.",
|
||||
"Filter tasks by the type of resource they are linked to": "Filtrer les tâches par le type de ressource auxquelles elles sont liées",
|
||||
"Select the specific resource to filter tasks by": "Sélectionnez la ressource spécifique pour filtrer les tâches par",
|
||||
"Filter tasks by the user they are assigned to": "Filtrer les tâches par l'utilisateur auquel elles sont assignées",
|
||||
"Filter tasks by the team they are assigned to": "Filtrer les tâches par l'équipe à laquelle elles sont assignées",
|
||||
"Filter tasks by the user who created them": "Filtrer les tâches par l'utilisateur qui les a créées",
|
||||
"Filter by task completion status": "Filtrer par statut d'achèvement de la tâche",
|
||||
"Filter by task type": "Filtrer par type de tâche",
|
||||
"Only return tasks updated on or after this date/time": "Renvoyer uniquement les tâches mises à jour à ou après cette date/heure",
|
||||
"Only return tasks updated on or before this date/time": "Renvoyer uniquement les tâches mises à jour à ou avant cette date/heure",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "Nombre maximum de tâches à retourner (par défaut : 50, max : 1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "Si cochée, retourne uniquement la première tâche correspondante. Si décochée, retourne toutes les tâches correspondantes.",
|
||||
"Person": "Personne",
|
||||
"Organization": "Organisation",
|
||||
"Trust": "Faire confiance à",
|
||||
"Client": "Client",
|
||||
"Past Client": "Client passé",
|
||||
"Prospect": "Prospecter",
|
||||
"Vendor": "Fournisseur",
|
||||
"Active": "Actif",
|
||||
"Inactive": "Inactif",
|
||||
"Female": "Femme",
|
||||
"Male": "Homme",
|
||||
"Non-binary": "Non binaire",
|
||||
"Unknown": "Unknown",
|
||||
"Married": "Marié",
|
||||
"Single": "Simple",
|
||||
"Divorced": "Divorqué",
|
||||
"Widowed": "Veuve",
|
||||
"Life Partner": "Partenaire de la vie",
|
||||
"Separated": "Séparé",
|
||||
"Referral": "Parrainage",
|
||||
"Conference": "Conférence",
|
||||
"Direct Mail": "Courrier direct",
|
||||
"Cold Call": "Appel froid",
|
||||
"Other": "Autres",
|
||||
"Head": "Tête",
|
||||
"Spouse": "Époux",
|
||||
"Partner": "Partenaire",
|
||||
"Child": "Enfant",
|
||||
"Grandchild": "Grand-enfant",
|
||||
"Parent": "Parent",
|
||||
"Grandparent": "Grand-parent",
|
||||
"Sibling": "Frère",
|
||||
"Dependent": "Dépendant",
|
||||
"Unconfirmed": "Non confirmé",
|
||||
"Confirmed": "Confirmé",
|
||||
"Tentative": "Tentative",
|
||||
"Completed": "Terminé",
|
||||
"Cancelled": "Annulé",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP (£)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "AUD (A$)",
|
||||
"Fee": "Frais",
|
||||
"Commission": "Commission",
|
||||
"AUM": "AUM",
|
||||
"Low": "Bas",
|
||||
"Medium": "Moyenne",
|
||||
"High": "Élevé",
|
||||
"Project": "Projet",
|
||||
"Opportunity": "Opportunité",
|
||||
"Active Only": "Actif uniquement",
|
||||
"Inactive Only": "Inactif uniquement",
|
||||
"All Contacts": "Tous les contacts",
|
||||
"Recent (newest first)": "Récent (plus récent en premier)",
|
||||
"Created Date (newest first)": "Date de création (plus récent en premier)",
|
||||
"Updated Date (newest first)": "Date de mise à jour (plus récent en premier)",
|
||||
"Ascending": "Ascendant",
|
||||
"Descending": "Descendant",
|
||||
"All Tasks": "Toutes les tâches",
|
||||
"Completed Only": "Terminé seulement",
|
||||
"Incomplete Only": "Incomplet uniquement",
|
||||
"Parent Tasks Only": "Tâches Parentes uniquement",
|
||||
"Subtasks Only": "Sous-tâches uniquement",
|
||||
"New Task": "Nouvelle tâche",
|
||||
"New Contact": "Nouveau contact",
|
||||
"New Event": "Nouvel événement",
|
||||
"New Opportunity": "Nouvelle opportunité",
|
||||
"Fires when a new task is created": "Tire quand une nouvelle tâche est créée",
|
||||
"Fires when a new contact is created": "Tire quand un nouveau contact est créé",
|
||||
"Fires when a new event is created": "Tire quand un nouvel événement est créé",
|
||||
"Fires when a new opportunity is created": "Tire quand une nouvelle opportunité est créée",
|
||||
"Assigned To Team ID": "Assigné à l'ID de l'équipe",
|
||||
"Entity Type": "Type d'entité",
|
||||
"Start Date Minimum": "Date de début minimum",
|
||||
"Start Date Maximum": "Date de début maximum",
|
||||
"Opportunity Stage": "Étape d'Affaire",
|
||||
"Include Closed Opportunities": "Inclure les opportunités fermées",
|
||||
"Minimum Probability (%)": "Probabilité minimale (%)",
|
||||
"Maximum Probability (%)": "Probabilité maximale (%)",
|
||||
"Target Close After": "Cible fermée après",
|
||||
"Target Close Before": "Cible fermée avant",
|
||||
"Only trigger for tasks assigned to this user (optional)": "Déclenche uniquement les tâches assignées à cet utilisateur (facultatif)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "Déclenche uniquement les tâches assignées à cette équipe (facultatif)",
|
||||
"Only trigger for tasks created by this user (optional)": "Déclenche uniquement les tâches créées par cet utilisateur (facultatif)",
|
||||
"Type of tasks to monitor": "Type de tâches à surveiller",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "Déclenche uniquement les tâches liées à ce type de ressource (facultatif)",
|
||||
"Only trigger for contacts of this type (optional)": "Déclenchement uniquement pour les contacts de ce type (optionnel)",
|
||||
"Only trigger for contacts of this entity type (optional)": "Déclenche uniquement les contacts de ce type d'entité (optionnel)",
|
||||
"Only trigger for contacts with this household title (optional)": "Déclenche uniquement les contacts avec ce titre de foyer (facultatif)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "Déclenchement uniquement pour les contacts assignés à cet utilisateur (optionnel)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "Déclenche uniquement les contacts avec un de ces tags (optionnel)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "Déclenchement uniquement pour les événements liés à ce type de ressource (optionnel)",
|
||||
"Select the specific resource to filter events by": "Sélectionnez la ressource spécifique pour filtrer les événements par",
|
||||
"Only trigger for events of this category (optional)": "Déclenche uniquement pour les événements de cette catégorie (facultatif)",
|
||||
"Only trigger for events starting on or after this date/time": "Ne déclencher que pour les événements commençant à ou après cette date/heure",
|
||||
"Only trigger for events starting on or before this date/time": "Déclenche uniquement les événements commençant à ou avant cette date/heure",
|
||||
"How to order the events": "Comment organiser les événements",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "Déclenche uniquement les opportunités liées à ce type de ressource (facultatif)",
|
||||
"Select the specific resource to filter opportunities by": "Sélectionnez la ressource spécifique pour filtrer les opportunités par",
|
||||
"Only trigger for opportunities in this stage (optional)": "Déclenche uniquement les opportunités de cette étape (facultatif)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "Seulement déclencheur pour les opportunités gérées par cet utilisateur (facultatif)",
|
||||
"Include won and lost opportunities in results": "Inclure les opportunités gagnées et perdues dans les résultats",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "Ne déclenche que pour les opportunités avec une probabilité supérieure ou égale à ce pourcentage (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "Ne déclenche que pour les opportunités avec une probabilité à ou en dessous de ce pourcentage (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "Déclenche uniquement les opportunités avec la date de fermeture de la cible le ou après cette date/heure",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "Déclenche uniquement les opportunités avec la date de fermeture de la cible au plus tard à cette date/heure",
|
||||
"Start Date (ascending)": "Date de début (ascendant)",
|
||||
"Start Date (descending)": "Date de début (décroissante)"
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Wealthbox API アクセストークンを入力します。Wealthbox アカウントの設定 → API アクセストークンから取得できます。",
|
||||
"Create Contact": "連絡先を作成",
|
||||
"Create Note": "ノートを作成",
|
||||
"Create Project": "プロジェクトを作成",
|
||||
"Add Member to Household": "メンバーを家計に追加",
|
||||
"Create Household": "家庭を作成",
|
||||
"Create Event": "イベントを作成",
|
||||
"Create Opportunity": "案件を作成",
|
||||
"Create Task": "タスクを作成",
|
||||
"Start Workflow": "ワークフローを開始",
|
||||
"Find Contact": "連絡先を探す",
|
||||
"Find Task": "タスクを検索",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "豊富な詳細(名前、住所、メールアドレス、タグなど)を持つ新しい連絡先を追加します。",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "取引先責任者にリンクされたメモを追加します。取引先レコードに対するコール要約をログに記録します。",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "プロジェクトの説明とオーガナイザーを含む新しいプロジェクトを開始します。新規クライアント登録時にプロジェクトベースのオンボーディングを開始します。",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "既存のファミリーにメンバーを追加します。1つのファミリーユニットの下に複数の連絡先をリンクします。",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "電子メール、タグ付きの家庭記録を作成します。グループ家族の連絡先を一つの家庭にします。",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "連絡先にリンクされたカレンダーイベントを作成します。クライアントの代わりにスケジュールアドバイザリーミーティングを作成します。",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "ステージ、終了日、金額などの商談を記録します。ミーティング後の商談の追跡を自動化します。",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "期日と課題種別を持つ連絡先に関連付けられたタスクを作成します。 商談が作成されるときにフォローアップアクションを割り当てます。",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "コンタクト/プロジェクト/商談でワークフローテンプレートをトリガーします。CRMイベントに基づいて複数のステップシーケンスを自動化します。",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "名前、メールアドレス、電話番号、または高度なフィルタで連絡先を特定します。ダイナミックなフィルタリングオプションを使用した包括的な連絡先検索。",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "包括的な検索フィルタを使用して既存のタスクを検索します。課題、リソース、完了ステータス、日付範囲で検索します。",
|
||||
"First Name": "名",
|
||||
"Last Name": "Last Name",
|
||||
"Prefix": "プレフィックス",
|
||||
"Middle Name": "ミドルネーム",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "ニックネーム:",
|
||||
"Job Title": "役職名",
|
||||
"Company Name": "会社名",
|
||||
"Contact Type": "連絡先の種類",
|
||||
"Contact Classification": "連絡先分類",
|
||||
"Status": "Status",
|
||||
"Gender": "性別",
|
||||
"Birth Date": "誕生日",
|
||||
"Marital Status": "婚姻状況",
|
||||
"Email Address": "メールアドレス",
|
||||
"Phone Number": "電話番号",
|
||||
"Street Address Line 1": "住所1",
|
||||
"Street Address Line 2": "住所2",
|
||||
"City": "市区町村名",
|
||||
"State": "都道府県:",
|
||||
"ZIP Code": "郵便番号",
|
||||
"Country": "国",
|
||||
"Twitter Handle": "Twitter Handle",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "背景情報",
|
||||
"Important Information": "重要な情報",
|
||||
"Personal Interests": "個人的な関心事項",
|
||||
"Contact Source": "連絡先のソース",
|
||||
"Tags": "タグ",
|
||||
"External Unique ID": "外部一意ID",
|
||||
"Note Content": "ノートコンテンツ",
|
||||
"Contact": "お問い合わせ",
|
||||
"Visible To": "表示先",
|
||||
"Project Name": "プロジェクト名",
|
||||
"Project Description": "プロジェクトの説明",
|
||||
"Organizer": "オーガナイザー",
|
||||
"Custom Fields": "カスタムフィールド",
|
||||
"Household": "家庭用",
|
||||
"Household Title": "戸籍名",
|
||||
"Household Name": "家庭名",
|
||||
"Head of Household": "<unk>",
|
||||
"Spouse/Partner (Optional)": "配偶者/パートナー (オプション)",
|
||||
"Primary Email Address": "プライマリメールアドレス",
|
||||
"Primary Phone Number": "主要電話番号",
|
||||
"Household Type": "家庭の種類",
|
||||
"Event Title": "イベントタイトル",
|
||||
"Start Date & Time": "開始日時",
|
||||
"End Date & Time": "終了日時",
|
||||
"Location": "場所",
|
||||
"Description": "Description",
|
||||
"All Day Event": "終日イベント",
|
||||
"Repeating Event": "繰り返しイベント",
|
||||
"Event Status": "イベントステータス",
|
||||
"Linked Contact": "リンクされた連絡先",
|
||||
"Invitees": "招待",
|
||||
"Event Category": "イベントカテゴリ",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "商談名",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "確率(%)",
|
||||
"Amount": "金額",
|
||||
"Currency": "通貨",
|
||||
"Amount Type": "金額タイプ",
|
||||
"Stage": "ステージ",
|
||||
"Opportunity Manager": "商談マネージャー",
|
||||
"Task Name": "タスク名",
|
||||
"Due Date": "締切日",
|
||||
"Assigned To": "割り当て先",
|
||||
"Priority": "優先度",
|
||||
"Mark as Complete": "完了としてマーク",
|
||||
"Link To": "リンク先",
|
||||
"Linked Record": "リンクされたレコード",
|
||||
"Category": "カテゴリ",
|
||||
"Due Later": "期限は後で",
|
||||
"Workflow Template": "ワークフローテンプレート",
|
||||
"Workflow Label": "ワークフロー ラベル",
|
||||
"Workflow Milestones": "ワークフローのマイルストーン",
|
||||
"Name": "名前",
|
||||
"Contact ID": "連絡先ID",
|
||||
"Contact Entity Type": "連絡先エンティティタイプ",
|
||||
"Tags Filter": "タグフィルタ",
|
||||
"Active Status": "アクティブなステータス",
|
||||
"Include Deleted Contacts": "削除された連絡先を含める",
|
||||
"Updated Since": "更新日時",
|
||||
"Updated Before": "更新前",
|
||||
"Sort Order": "並び順",
|
||||
"Result Limit": "結果の制限",
|
||||
"Return Single Result Only": "返品単一の結果のみ",
|
||||
"Task ID (Optional)": "タスクID(オプション)",
|
||||
"Linked Resource Type": "リンクされたリソースタイプ",
|
||||
"Linked Resource": "リンクされたリソース",
|
||||
"Assigned to Team ID": "チーム ID に割り当て",
|
||||
"Created By": "作成者",
|
||||
"Completion Status": "完了状況",
|
||||
"Task Type": "タスクの種類",
|
||||
"The first name of the contact": "連絡先の名",
|
||||
"The last name of the contact": "連絡先の姓",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "連絡先の推奨プレフィックス(例、Mr、Ms、Dr.)",
|
||||
"The middle name of the contact": "連絡先のミドルネーム",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "連絡先に関連付けられたサフィックス (例: Jr., Sr., M.D.)",
|
||||
"A preferred shortname for the contact": "連絡先の推奨する省略名",
|
||||
"The title the contact holds at their present company": "連絡先が現在の会社に保持するタイトル",
|
||||
"The name of the contact's present company": "連絡先の現在の会社名",
|
||||
"The type of the contact being created": "作成中の連絡先の種類",
|
||||
"A string further classifying the contact": "連絡先をさらに分類する文字列",
|
||||
"Whether the contact is currently active": "連絡先が現在アクティブかどうか",
|
||||
"The gender of the contact": "連絡先の性別",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "連絡先の誕生日(YYYY-MM-DD形式)",
|
||||
"The marital status of the contact": "連絡先の婚姻状況",
|
||||
"Primary email address for the contact": "連絡先のプライマリメールアドレス",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "連絡先の主要な電話番号 (例: 555) 123-4567)",
|
||||
"First line of street address": "住所の最初の行",
|
||||
"Second line of street address (apt, suite, etc.)": "住所の2行目(apt、suiteなど)",
|
||||
"City for the address": "市区町村名",
|
||||
"State or province for the address": "住所の都道府県または州",
|
||||
"ZIP or postal code for the address": "住所の郵便番号",
|
||||
"Country for the address": "住所の国",
|
||||
"The twitter handle of the contact": "連絡先のtwitter handle",
|
||||
"The LinkedIn URL for the contact": "連絡先の LinkedIn URL",
|
||||
"A brief description of the contact": "連絡先の簡単な説明",
|
||||
"Any other important info for the contact": "連絡先のその他の重要な情報",
|
||||
"Personal interests for the contact": "連絡先の個人的な関心事項",
|
||||
"The method in which this contact was acquired": "この連絡先が取得された方法",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "連絡先に関連付けるタグ(例:\"クライアント\"、\"VIP\"、\"リファラル\")",
|
||||
"A unique identifier for this contact in an external system": "外部システムにおけるこの連絡先の一意の識別子",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "ノートの本文(例:コールサマリー、ミーティングノート、クライアントの相互作用の詳細)",
|
||||
"Select the contact to link this note to": "このメモをリンクする連絡先を選択してください",
|
||||
"Select who can view this note": "このメモを閲覧できるユーザーを選択します",
|
||||
"Select tags to associate with this note": "このノートに関連付けるタグを選択してください",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "プロジェクトの名前 (例: \"クライアントのオンボーディング\"、\"Q1 レビュープロセス\")",
|
||||
"A detailed explanation of the project goals and scope": "プロジェクトの目標と範囲の詳細な説明",
|
||||
"Select the user who will be responsible for organizing this project": "このプロジェクトの整理を担当するユーザーを選択してください",
|
||||
"Select who can view this project": "このプロジェクトを閲覧できるユーザーを選択します",
|
||||
"Add custom fields to this project": "このプロジェクトにカスタムフィールドを追加",
|
||||
"Select the household that will receive the new member": "新しいメンバーを受け取る世帯を選択してください",
|
||||
"Select the contact to add to the household": "家庭に追加する連絡先を選択してください",
|
||||
"The household title to assign to the added contact": "追加された連絡先に割り当てるための世帯タイトル",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "世帯名(例:「アンダーソン・ファミリー」「スミスハウス」)",
|
||||
"Select the contact who will be the head of this household": "この世帯のトップになる連絡先を選択してください",
|
||||
"Select the spouse or partner to automatically add to this household": "この世帯に自動的に追加する配偶者またはパートナーを選択してください",
|
||||
"Primary email address for the household": "家庭用の主要なメールアドレス",
|
||||
"City for the household address": "住所の市区町村名",
|
||||
"State or province for the household address": "住所の州または州",
|
||||
"ZIP or postal code for the household address": "住所の郵便番号",
|
||||
"Country for the household address": "住所の国",
|
||||
"Primary phone number for the household": "家庭用の主な電話番号",
|
||||
"The type of household being created": "世帯制作の種類",
|
||||
"Whether the household is currently active": "世帯が現在アクティブであるかどうか",
|
||||
"Background information about the household": "世帯の背景情報",
|
||||
"Any important information about the household": "世帯に関する重要な情報",
|
||||
"Select tags to associate with this household": "この世帯に関連付けるタグを選択してください",
|
||||
"Select who can view this household": "この家計を閲覧できるユーザーを選択します",
|
||||
"A unique identifier for this household in an external system": "外部システムにおけるこの世帯の固有の識別子",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "イベントの名前 (例: \"Client Meeting\", \"Portfolio Review\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "イベント開始時 (yyyy-mm-dd hh:mm フォーマット)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "イベント終了時 (yyyy-mm-dd hh:mm フォーマット)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "イベントが行われる場所 (例: \"会議室\"、\"クライアントオフィス\"、\"ズームミーティング\")",
|
||||
"A detailed explanation of the event purpose and agenda": "イベントの目的と議題の詳細な説明",
|
||||
"Check if this is an all-day event": "これが終日のイベントであるかどうかを確認します",
|
||||
"Check if this event repeats": "このイベントが繰り返されるかどうかチェック",
|
||||
"The current state of the event": "イベントの現在の状態",
|
||||
"Select the contact to link this event to": "このイベントをリンクする連絡先を選択してください",
|
||||
"Add people to invite to this event": "このイベントに招待する人を追加します",
|
||||
"Select the category for this event": "このイベントのカテゴリを選択してください",
|
||||
"Send email invitations to invitees": "招待者に電子メールの招待を送信",
|
||||
"Select who can view this event": "このイベントを閲覧できるユーザーを選択します",
|
||||
"Add custom fields to this event": "このイベントにカスタム項目を追加",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "機会の名前(例:「ファイナンシャルプラン」「投資顧問」「不動産計画」)",
|
||||
"When the opportunity should close": "商談が終了する必要がある場合",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "商談が終了する確率(パーセンテージ)(0-100)",
|
||||
"The monetary value of the opportunity": "機会の金銭的価値",
|
||||
"The currency for the opportunity amount": "商談金額の通貨",
|
||||
"The type of amount this represents": "この表す金額の種類",
|
||||
"Select the current stage of this opportunity": "この商談の現在の段階を選択してください",
|
||||
"Select the contact linked to this opportunity": "この商談にリンクされている連絡先を選択してください",
|
||||
"A detailed explanation of the opportunity": "機会の詳細な説明",
|
||||
"Select the user designated as manager of this opportunity": "この商談の管理者として指定されたユーザーを選択してください",
|
||||
"Select who can view this opportunity": "この機会を閲覧できるユーザーを選択します",
|
||||
"Add custom fields to this opportunity": "この商談にカスタム項目を追加",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "タスクの名前 (例: \"返品請求書\"、\"提案のフォローアップ\")",
|
||||
"When the task is due": "タスクが期限のとき",
|
||||
"Select the user who the task is assigned to": "タスクに割り当てられているユーザーを選択します",
|
||||
"A detailed explanation of the task": "タスクの詳細な説明",
|
||||
"The priority level of the task": "タスクの優先度レベル",
|
||||
"Check if the task should be created as already completed": "タスクがすでに完了して作成されるかどうかを確認します。",
|
||||
"What type of record to link this task to": "このタスクをリンクするレコードの種類",
|
||||
"Select the record to link this task to": "このタスクをリンクするレコードを選択してください",
|
||||
"Select the category this task belongs to": "このタスクが属するカテゴリを選択してください",
|
||||
"Select who can view this task": "このタスクを閲覧できるユーザーを選択します",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "このタスクが開始後に期日が来る場合の間隔 (例: \"2日後午後5時\")",
|
||||
"Add custom fields to this task": "このタスクにカスタムフィールドを追加",
|
||||
"Select the workflow template to trigger": "トリガーするワークフロー テンプレートを選択してください",
|
||||
"What type of record to link this workflow to": "このワークフローをリンクするレコードの種類",
|
||||
"Select the record to link this workflow to": "このワークフローをリンクするレコードを選択してください",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "ワークフローの短い名前 (例: \"会社に新しいクライアントをオンボード\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "ワークフローを開始したい場合 (オプション、既定)",
|
||||
"Select who can view this workflow": "このワークフローを閲覧できるユーザーを選択します",
|
||||
"Add milestones to this workflow": "このワークフローにマイルストーンを追加",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "名前で検索 (プレフィックス、最初、中間、最後、サフィックス、ニックネーム、および世帯/会社のフルネームで部分一致をサポートしています)",
|
||||
"Search by email address": "メールアドレスで検索",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "電話番号で検索(-, ()のような区切り文字は自動的に削除されます)",
|
||||
"Search by specific contact ID (most precise search)": "特定の連絡先IDで検索 (最も正確な検索)",
|
||||
"Search by external unique identifier": "外部の一意の識別子で検索",
|
||||
"Filter by contact type": "連絡先の種類でフィルター",
|
||||
"Filter by entity type": "エンティティタイプでフィルター",
|
||||
"Filter by household title (only applies to household members)": "世帯名で絞り込む(世帯名のみ)",
|
||||
"Filter contacts by tags": "タグで連絡先をフィルター",
|
||||
"Filter by active status": "有効な状態でフィルター",
|
||||
"Include contacts that have been deleted": "削除された連絡先を含める",
|
||||
"Only return contacts updated on or after this date/time": "この日時以降に更新された連絡先のみを返します",
|
||||
"Only return contacts updated on or before this date/time": "この日時以前に更新された連絡先のみを返します",
|
||||
"How to order the results": "結果の注文方法",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "リターンする連絡先の最大数(デフォルト:50、最大:1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "チェックされている場合、最初のマッチングコンタクトのみを返します。チェックされていない場合は、すべてのマッチングコンタクトを返します。",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "一意のIDでタスクを検索します。フィルタを使用して検索するには、空のままにします。",
|
||||
"Filter tasks by the type of resource they are linked to": "リンクされているリソースの種類でタスクを絞り込みます",
|
||||
"Select the specific resource to filter tasks by": "タスクをフィルタリングする特定のリソースを選択",
|
||||
"Filter tasks by the user they are assigned to": "割り当てられているユーザーでタスクをフィルター",
|
||||
"Filter tasks by the team they are assigned to": "割り当てられたチームでタスクをフィルター",
|
||||
"Filter tasks by the user who created them": "タスクを作成したユーザーで絞り込みます",
|
||||
"Filter by task completion status": "タスク完了状態でフィルター",
|
||||
"Filter by task type": "タスクの種類でフィルター",
|
||||
"Only return tasks updated on or after this date/time": "この日時以降に更新されたタスクのみを返します。",
|
||||
"Only return tasks updated on or before this date/time": "この日時以前に更新されたタスクのみを返します",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "リターンするタスクの最大数(デフォルト:50、最大:1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "チェックされている場合、最初のマッチングタスクのみを返します。チェックを外すと、すべてのマッチングタスクを返します。",
|
||||
"Person": "人",
|
||||
"Organization": "組織",
|
||||
"Trust": "Trust",
|
||||
"Client": "クライアント",
|
||||
"Past Client": "過去のクライアント",
|
||||
"Prospect": "プロスペクト",
|
||||
"Vendor": "仕入先",
|
||||
"Active": "有効",
|
||||
"Inactive": "非アクティブ",
|
||||
"Female": "女性",
|
||||
"Male": "男性",
|
||||
"Non-binary": "Non-binary",
|
||||
"Unknown": "不明",
|
||||
"Married": "既婚者",
|
||||
"Single": "Single",
|
||||
"Divorced": "離婚しました",
|
||||
"Widowed": "<unk>",
|
||||
"Life Partner": "ライフパートナー",
|
||||
"Separated": "分離された",
|
||||
"Referral": "紹介する",
|
||||
"Conference": "会議",
|
||||
"Direct Mail": "ダイレクトメール",
|
||||
"Cold Call": "コールドコール",
|
||||
"Other": "その他",
|
||||
"Head": "頭",
|
||||
"Spouse": "配偶者たち",
|
||||
"Partner": "パートナー",
|
||||
"Child": "子要素",
|
||||
"Grandchild": "孫",
|
||||
"Parent": "親",
|
||||
"Grandparent": "Grandparent",
|
||||
"Sibling": "兄弟の数",
|
||||
"Dependent": "依存する",
|
||||
"Unconfirmed": "未確認",
|
||||
"Confirmed": "確認済み",
|
||||
"Tentative": "暫定的",
|
||||
"Completed": "完了",
|
||||
"Cancelled": "キャンセルしました",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP(£)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "オーストラリアドル",
|
||||
"Fee": "手数料",
|
||||
"Commission": "Commission",
|
||||
"AUM": "AUM",
|
||||
"Low": "低い",
|
||||
"Medium": "ミディアム",
|
||||
"High": "高い",
|
||||
"Project": "プロジェクト",
|
||||
"Opportunity": "機会",
|
||||
"Active Only": "アクティブのみ",
|
||||
"Inactive Only": "非アクティブのみ",
|
||||
"All Contacts": "すべての連絡先",
|
||||
"Recent (newest first)": "最近の順",
|
||||
"Created Date (newest first)": "作成日(新しい順)",
|
||||
"Updated Date (newest first)": "更新日時 (最新のもの)",
|
||||
"Ascending": "昇順",
|
||||
"Descending": "降順",
|
||||
"All Tasks": "すべてのタスク",
|
||||
"Completed Only": "完了のみ",
|
||||
"Incomplete Only": "未完了のみ",
|
||||
"Parent Tasks Only": "親タスクのみ",
|
||||
"Subtasks Only": "サブタスクのみ",
|
||||
"New Task": "新しいタスク",
|
||||
"New Contact": "新しい連絡先",
|
||||
"New Event": "新しいイベント",
|
||||
"New Opportunity": "新しい機会",
|
||||
"Fires when a new task is created": "新しいタスクが作成されたときに発生します。",
|
||||
"Fires when a new contact is created": "新しい連絡先が作成されたときに発生します。",
|
||||
"Fires when a new event is created": "新しいイベントが作成されたときに発生します",
|
||||
"Fires when a new opportunity is created": "新しい機会が作成されたときに発火します",
|
||||
"Assigned To Team ID": "チーム ID に割り当て",
|
||||
"Entity Type": "エンティティタイプ",
|
||||
"Start Date Minimum": "開始日",
|
||||
"Start Date Maximum": "開始日の最大値",
|
||||
"Opportunity Stage": "商談ステージ",
|
||||
"Include Closed Opportunities": "閉じた機会を含める",
|
||||
"Minimum Probability (%)": "最小確率(%)",
|
||||
"Maximum Probability (%)": "最大確率(%)",
|
||||
"Target Close After": "ターゲットが閉じた後",
|
||||
"Target Close Before": "ターゲットを閉じる前",
|
||||
"Only trigger for tasks assigned to this user (optional)": "このユーザーに割り当てられたタスクのトリガーのみ (オプション)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "このチームに割り当てられたタスクのみトリガー(オプション)",
|
||||
"Only trigger for tasks created by this user (optional)": "このユーザーによって作成されたタスクのトリガーのみ(オプション)",
|
||||
"Type of tasks to monitor": "監視するタスクの種類",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "この種類のリソースにリンクされているタスクのみトリガーします(オプション)",
|
||||
"Only trigger for contacts of this type (optional)": "このタイプの連絡先のトリガーのみ(オプション)",
|
||||
"Only trigger for contacts of this entity type (optional)": "このエンティティタイプの連絡先のみトリガー(オプション)",
|
||||
"Only trigger for contacts with this household title (optional)": "この世帯タイトルを持つ連絡先のみトリガー(オプション)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "このユーザーに割り当てられた連絡先のトリガーのみ(オプション)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "これらのタグのいずれかを持つ連絡先のみトリガー(オプション)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "この種類のリソースにリンクされたイベントのトリガーのみ(オプション)",
|
||||
"Select the specific resource to filter events by": "イベントをフィルタリングする特定のリソースを選択してください",
|
||||
"Only trigger for events of this category (optional)": "このカテゴリのイベントのトリガーのみ (オプション)",
|
||||
"Only trigger for events starting on or after this date/time": "この日付/時刻以降に開始されるイベントのみトリガーします",
|
||||
"Only trigger for events starting on or before this date/time": "この日付/時刻以前のイベントのトリガーのみ",
|
||||
"How to order the events": "イベントの注文方法",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "この種類のリソースにリンクされている商談のみをトリガーします(オプション)",
|
||||
"Select the specific resource to filter opportunities by": "商談をフィルターする特定のリソースを選択してください",
|
||||
"Only trigger for opportunities in this stage (optional)": "このステージでの機会のトリガーのみ(オプション)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "このユーザーが管理する商談のトリガーのみ(オプション)",
|
||||
"Include won and lost opportunities in results": "勝利と失われた機会を結果に含める",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "このパーセンテージ以上の確率を持つ商談のトリガーのみ (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "この割合以下の確率を持つ商談のトリガーのみ (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "この日付/時刻以降にターゲットの終了日付がある商談のみトリガーします",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "この日付/時刻以前のターゲット終了日付を持つ商談のみトリガーします",
|
||||
"Start Date (ascending)": "開始日(昇順)",
|
||||
"Start Date (descending)": "開始日(降順)"
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Voer uw Wealthbox API-toegangssleutel in. Download het via Instellingen → API toegangstokens in uw Wealthbox-account.",
|
||||
"Create Contact": "Contactpersoon aanmaken",
|
||||
"Create Note": "Notitie aanmaken",
|
||||
"Create Project": "Project aanmaken",
|
||||
"Add Member to Household": "Lid aan huis toevoegen",
|
||||
"Create Household": "Creëer Huishouden",
|
||||
"Create Event": "Gebeurtenis aanmaken",
|
||||
"Create Opportunity": "Verkoopkans creëren",
|
||||
"Create Task": "Taak maken",
|
||||
"Start Workflow": "Start Workflow",
|
||||
"Find Contact": "Contactpersoon zoeken",
|
||||
"Find Task": "Zoek Taak",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "Voegt een nieuwe contactpersoon toe met uitgebreide details (naam, adres, e-mail, tags etc.)",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "Voegt een aan een contactpersoon gelinkte notitie toe. Oproepsamenvattingen ten opzichte van klantrecords loggen.",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "Start een nieuw project met beschrijving en organisator. Start project gebaseerd onboarding wanneer nieuwe klanten zich aanmelden.",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "Voegt een lid toe aan een bestaande huishouding. Koppel meerdere contacten onder één familie eenheid.",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "Maakt een huishouden met e-mails, tags. Groepeer lid contacten in één huishouden.",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "Maakt een kalendergebeurtenis aan die gekoppeld is aan contact. Plan raadplegende vergaderingen namens klanten.",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "Logt een kans zoals fase, sluitdatum, bedrag. Automatiseer gelegenheid volgen na bijeenkomsten.",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "Maakt taken aan gekoppeld aan contactpersonen met vervaldatum en opdrachttypes. Wijs follow-up-acties toe wanneer kansen worden gecreëerd.",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "Triggert een workflow-sjabloon op een contact/project/mogelijkheid. Automatiseer meerdere stappen sequenties gebaseerd op CRM events.",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "Zoek een contact op basis van naam, e-mail, telefoon of geavanceerde filters. Zoeken met dynamische filteropties.",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "Vindt bestaande taken met uitgebreide zoekfilters. Zoek op toewijzing, resource, voltooiingsstatus en datumbereik.",
|
||||
"First Name": "Voornaam",
|
||||
"Last Name": "Achternaam",
|
||||
"Prefix": "Voorvoegsel",
|
||||
"Middle Name": "Tweede naam",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "Gebruikersnaam",
|
||||
"Job Title": "Job titel",
|
||||
"Company Name": "Bedrijfsnaam",
|
||||
"Contact Type": "Type contactpersoon",
|
||||
"Contact Classification": "Classificatie contact",
|
||||
"Status": "status",
|
||||
"Gender": "Geslacht",
|
||||
"Birth Date": "Geboorte datum",
|
||||
"Marital Status": "Basisstatus per huwelijk",
|
||||
"Email Address": "Uw e-mailadres",
|
||||
"Phone Number": "Telefoon nummer",
|
||||
"Street Address Line 1": "Adresregel 1",
|
||||
"Street Address Line 2": "Adresregel 2",
|
||||
"City": "Woonplaats",
|
||||
"State": "Provincie",
|
||||
"ZIP Code": "Postcode code",
|
||||
"Country": "Land:",
|
||||
"Twitter Handle": "Twitter Handle",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "Achtergrond Informatie",
|
||||
"Important Information": "Belangrijke informatie",
|
||||
"Personal Interests": "Persoonlijke interesses",
|
||||
"Contact Source": "Contact bron",
|
||||
"Tags": "Labels",
|
||||
"External Unique ID": "Externe Unieke ID",
|
||||
"Note Content": "Notitie inhoud",
|
||||
"Contact": "Contactpersoon",
|
||||
"Visible To": "Zichtbaar voor",
|
||||
"Project Name": "Projectnaam",
|
||||
"Project Description": "Project beschrijving",
|
||||
"Organizer": "Organisator",
|
||||
"Custom Fields": "Aangepaste velden",
|
||||
"Household": "Huishouden",
|
||||
"Household Title": "Huishouden Titel",
|
||||
"Household Name": "Huishoudelijke naam",
|
||||
"Head of Household": "Hoofd van Huishouden",
|
||||
"Spouse/Partner (Optional)": "Spouse/Partner (optioneel)",
|
||||
"Primary Email Address": "Primair e-mailadres",
|
||||
"Primary Phone Number": "Primair telefoonnummer",
|
||||
"Household Type": "Huishouden type",
|
||||
"Event Title": "Event titel",
|
||||
"Start Date & Time": "Startdatum en -tijd",
|
||||
"End Date & Time": "Einddatum & tijd",
|
||||
"Location": "Locatie",
|
||||
"Description": "Beschrijving",
|
||||
"All Day Event": "Hele Dag Evenement",
|
||||
"Repeating Event": "Herhalende gebeurtenis",
|
||||
"Event Status": "Gebeurtenis status",
|
||||
"Linked Contact": "Gekoppeld contact",
|
||||
"Invitees": "genodigden",
|
||||
"Event Category": "Event Categorie",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "Verkoopkans naam",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "Waarschijnlijkheid (%)",
|
||||
"Amount": "Hoeveelheid",
|
||||
"Currency": "valuta",
|
||||
"Amount Type": "Hoeveelheid type",
|
||||
"Stage": "Speelveld",
|
||||
"Opportunity Manager": "Gelegenheid Manager",
|
||||
"Task Name": "Taak naam",
|
||||
"Due Date": "Inleverdatum",
|
||||
"Assigned To": "Toegewezen Aan",
|
||||
"Priority": "Prioriteit",
|
||||
"Mark as Complete": "Markeren als voltooid",
|
||||
"Link To": "Link naar",
|
||||
"Linked Record": "Gekoppelde Record",
|
||||
"Category": "categorie",
|
||||
"Due Later": "Vervalt later",
|
||||
"Workflow Template": "Workflow sjabloon",
|
||||
"Workflow Label": "Workflow label",
|
||||
"Workflow Milestones": "Workflow Mijlpalen",
|
||||
"Name": "Naam",
|
||||
"Contact ID": "Contact ID",
|
||||
"Contact Entity Type": "Type contactpersoon",
|
||||
"Tags Filter": "Tags filteren",
|
||||
"Active Status": "Actieve status",
|
||||
"Include Deleted Contacts": "Verwijderde contactpersonen opnemen",
|
||||
"Updated Since": "Bijgewerkt sinds",
|
||||
"Updated Before": "Voor Bijgewerkt",
|
||||
"Sort Order": "Sorteren bestelling",
|
||||
"Result Limit": "Resultaat limiet",
|
||||
"Return Single Result Only": "Retourneer Enkel Resultaat Alleen",
|
||||
"Task ID (Optional)": "Taak ID (optioneel)",
|
||||
"Linked Resource Type": "Gekoppeld document type",
|
||||
"Linked Resource": "Gekoppeld document",
|
||||
"Assigned to Team ID": "Toegewezen aan Team ID",
|
||||
"Created By": "Aangemaakt door",
|
||||
"Completion Status": "Voltooiing Status",
|
||||
"Task Type": "Type taak",
|
||||
"The first name of the contact": "De voornaam van het contact",
|
||||
"The last name of the contact": "De achternaam van de contactpersoon",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "De voorvoegsel van de contactpersoon (bijv. Mr., Ms., Dr.)",
|
||||
"The middle name of the contact": "De tweede naam van het contact",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "Het achtervoegsel dat is gekoppeld aan de contactpersoon (bijv. Jr., Sr., M.D.)",
|
||||
"A preferred shortname for the contact": "Een voorkeursshortname voor het contact",
|
||||
"The title the contact holds at their present company": "De titel van de contactpersoon bij hun huidige bedrijf",
|
||||
"The name of the contact's present company": "De naam van het huidige bedrijf van de contactpersoon",
|
||||
"The type of the contact being created": "Het type van de contactpersoon dat wordt gemaakt",
|
||||
"A string further classifying the contact": "Een string die de contactpersoon verder classificeert",
|
||||
"Whether the contact is currently active": "Of de contactpersoon momenteel actief is",
|
||||
"The gender of the contact": "Het geslacht van het contact",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "De geboortedatum van het contact (JJJJ-MM-DD formaat)",
|
||||
"The marital status of the contact": "De burgerlijke staat van het contact",
|
||||
"Primary email address for the contact": "Primair e-mailadres voor de contactpersoon",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "Primair telefoonnummer voor het contact (bijv. (555) 123-4567)",
|
||||
"First line of street address": "Eerste regel van adres",
|
||||
"Second line of street address (apt, suite, etc.)": "Tweede regel straatadres (apt, suite, etc.)",
|
||||
"City for the address": "Plaats voor het adres",
|
||||
"State or province for the address": "Staat of provincie voor het adres",
|
||||
"ZIP or postal code for the address": "Postcode voor het adres",
|
||||
"Country for the address": "Land voor het adres",
|
||||
"The twitter handle of the contact": "De twitter handgreep van het contact",
|
||||
"The LinkedIn URL for the contact": "De LinkedIn URL voor de contactpersoon",
|
||||
"A brief description of the contact": "Een korte beschrijving van de contactpersoon",
|
||||
"Any other important info for the contact": "Alle andere belangrijke informatie voor het contact",
|
||||
"Personal interests for the contact": "Persoonlijke interesses voor de contactpersoon",
|
||||
"The method in which this contact was acquired": "De methode waarop deze contactpersoon is verkregen",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "Tags om te koppelen aan de contactpersoon (bijv. \"Client\", \"VIP\", \"Referral\")",
|
||||
"A unique identifier for this contact in an external system": "Een unieke id voor deze contactpersoon in een extern systeem",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "De hoofdinhoud van de notitie (bijv. oproepsamenvatting, vergadernotities, klantinteractiedetails)",
|
||||
"Select the contact to link this note to": "Selecteer het contact om deze notitie aan te koppelen",
|
||||
"Select who can view this note": "Selecteer wie deze notitie kan bekijken",
|
||||
"Select tags to associate with this note": "Selecteer tags om te koppelen aan deze notitie",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "De naam van het project (bijv. \"Client Onboarding\", \"Q1 Review Process\")",
|
||||
"A detailed explanation of the project goals and scope": "Een gedetailleerde uitleg van de projectdoelen en -toepassingsgebied",
|
||||
"Select the user who will be responsible for organizing this project": "Selecteer de gebruiker die verantwoordelijk is voor het organiseren van dit project",
|
||||
"Select who can view this project": "Selecteer wie dit project kan bekijken",
|
||||
"Add custom fields to this project": "Aangepaste velden toevoegen aan dit project",
|
||||
"Select the household that will receive the new member": "Selecteer het huishouden dat het nieuwe lid zal ontvangen",
|
||||
"Select the contact to add to the household": "Selecteer de contactpersoon om toe te voegen aan de huishouden",
|
||||
"The household title to assign to the added contact": "De huishoudelijke titel om toe te wijzen aan het toegevoegde contact",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "De naam van het huishouden (bijv. \"De Anderson Family\", \"Smith Household\")",
|
||||
"Select the contact who will be the head of this household": "Selecteer de contactpersoon die het hoofd van dit huis zal zijn",
|
||||
"Select the spouse or partner to automatically add to this household": "Selecteer de echtgenoot of partner om automatisch toe te voegen aan dit huis",
|
||||
"Primary email address for the household": "Primaire e-mailadres voor het huishouden",
|
||||
"City for the household address": "Plaats voor het adres van het huishouden",
|
||||
"State or province for the household address": "Staat of provincie voor het huisadres",
|
||||
"ZIP or postal code for the household address": "Postcode voor het huishouden adres",
|
||||
"Country for the household address": "Land voor het huishoudelijke adres",
|
||||
"Primary phone number for the household": "Primair telefoonnummer voor het huishouden",
|
||||
"The type of household being created": "Het type huishouden dat wordt gemaakt",
|
||||
"Whether the household is currently active": "Of het huishouden momenteel actief is",
|
||||
"Background information about the household": "Achtergrondinformatie over het huishouden",
|
||||
"Any important information about the household": "Alle belangrijke informatie over het huishouden",
|
||||
"Select tags to associate with this household": "Selecteer tags om te associëren met dit huishouden",
|
||||
"Select who can view this household": "Selecteer wie dit huis kan bekijken",
|
||||
"A unique identifier for this household in an external system": "Een unieke identificatie voor dit huishouden in een extern systeem",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "De naam van het evenement (bijv. \"Client Meeting\", \"Portfolio Review\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "Wanneer de gebeurtenis begint (jjjjj-mm-dd uu:mm formaat)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "Wanneer de gebeurtenis eindigt (jjjjj-mm-dd uu:mm formaat)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "Waar de gebeurtenis plaatsvindt (bijv. \"Conferentie Kamer\", \"Client Office\" , \"Zoom Meeting\")",
|
||||
"A detailed explanation of the event purpose and agenda": "Een gedetailleerde uitleg van het doel en de agenda van het evenement",
|
||||
"Check if this is an all-day event": "Controleer of dit een alledaagse gebeurtenis is",
|
||||
"Check if this event repeats": "Controleer of deze gebeurtenis zich herhaalt",
|
||||
"The current state of the event": "De huidige status van het evenement",
|
||||
"Select the contact to link this event to": "Selecteer het contact om dit evenement te koppelen aan",
|
||||
"Add people to invite to this event": "Voeg mensen toe voor dit evenement",
|
||||
"Select the category for this event": "Selecteer een categorie voor deze gebeurtenis",
|
||||
"Send email invitations to invitees": "Stuur e-mail uitnodigingen aan genodigden",
|
||||
"Select who can view this event": "Selecteer wie deze gebeurtenis kan bekijken",
|
||||
"Add custom fields to this event": "Aangepaste velden toevoegen aan deze afspraak",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "De naam van de mogelijkheid (bijv. \"Financieel Plan\", \"Investeringsadviseur\", \"Estate Planning\")",
|
||||
"When the opportunity should close": "Wanneer de kans moet sluiten",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "De kans dat de kans wordt beëindigd, als percentage (0-100)",
|
||||
"The monetary value of the opportunity": "De monetaire waarde van de kans",
|
||||
"The currency for the opportunity amount": "De valuta voor het kansbedrag",
|
||||
"The type of amount this represents": "Het type bedrag dat dit vertegenwoordigt",
|
||||
"Select the current stage of this opportunity": "Selecteer de huidige fase van deze gelegenheid",
|
||||
"Select the contact linked to this opportunity": "Selecteer de contactpersoon gekoppeld aan deze kans",
|
||||
"A detailed explanation of the opportunity": "Een gedetailleerde uitleg van de mogelijkheid",
|
||||
"Select the user designated as manager of this opportunity": "Selecteer de gebruiker die aangewezen is als beheerder voor deze kans",
|
||||
"Select who can view this opportunity": "Selecteer wie deze kans kan zien",
|
||||
"Add custom fields to this opportunity": "Voeg aangepaste velden toe aan deze kans",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "De naam van de taak (bijv. \"Return Bill's call\", \"Follow-up bij voorstel\")",
|
||||
"When the task is due": "Wanneer de taak klaar is",
|
||||
"Select the user who the task is assigned to": "Selecteer de gebruiker aan wie de taak is toegewezen",
|
||||
"A detailed explanation of the task": "Een gedetailleerde uitleg van de taak",
|
||||
"The priority level of the task": "Het prioriteitsniveau van de taak",
|
||||
"Check if the task should be created as already completed": "Controleer of de taak moet worden aangemaakt als al voltooid",
|
||||
"What type of record to link this task to": "Welk type record om deze taak te koppelen",
|
||||
"Select the record to link this task to": "Selecteer het record om deze taak te koppelen",
|
||||
"Select the category this task belongs to": "Selecteer de categorie waartoe deze taak behoort",
|
||||
"Select who can view this task": "Selecteer wie deze taak kan bekijken",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "Interval voor wanneer deze taak na het starten is afgerond (bijv. 2 dagen later om 5:00 uur)",
|
||||
"Add custom fields to this task": "Voeg aangepaste velden toe aan deze taak",
|
||||
"Select the workflow template to trigger": "Selecteer het werkstroomsjabloon om te activeren",
|
||||
"What type of record to link this workflow to": "Welk type record om deze workflow te koppelen aan",
|
||||
"Select the record to link this workflow to": "Selecteer het record om deze workflow te koppelen aan",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "Een korte naam voor de workflow (bijv. \"Aan boord een nieuwe client aan de firm\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "Wanneer u wilt dat de workflow start (optioneel, standaard nu)",
|
||||
"Select who can view this workflow": "Selecteer wie deze workflow kan bekijken",
|
||||
"Add milestones to this workflow": "Voeg mijlpalen toe aan deze workflow",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "Zoeken op naam (ondersteunt partiële overeenkomsten in de prefix, eerst, middel, laatste, achtergrond, nickname en volledige naam voor huishouden/bedrijven)",
|
||||
"Search by email address": "Zoeken op e-mailadres",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "Zoek op telefoonnummer (scheidingsteken zoals -, (), wordt automatisch verwijderd)",
|
||||
"Search by specific contact ID (most precise search)": "Zoeken op specifiek contact ID (meest nauwkeurige zoekfunctie)",
|
||||
"Search by external unique identifier": "Zoek op externe unieke identificatie",
|
||||
"Filter by contact type": "Filteren op type contact",
|
||||
"Filter by entity type": "Filteren op entiteittype",
|
||||
"Filter by household title (only applies to household members)": "Filter op huishoudtitel (alleen van toepassing op huishoudelijke leden)",
|
||||
"Filter contacts by tags": "Contactpersonen filteren op tags",
|
||||
"Filter by active status": "Filter op actieve status",
|
||||
"Include contacts that have been deleted": "Contacten opnemen die verwijderd zijn",
|
||||
"Only return contacts updated on or after this date/time": "Retourcontacten alleen bijgewerkt op of na deze datum/tijd",
|
||||
"Only return contacts updated on or before this date/time": "Retourcontacten alleen bijgewerkt op of voor deze datum/tijd",
|
||||
"How to order the results": "Hoe de resultaten te bestellen",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "Maximum aantal contactpersonen om te retourneren (standaard: 50, max: 1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "Indien aangevinkt, retourneert alleen de eerste overeenkomende contactpersoon. Indien niet aangevinkt, retourneert u alle overeenkomende contactpersonen.",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "Zoeken naar een specifieke taak door haar unieke ID. Laat leeg om te zoeken met behulp van filters.",
|
||||
"Filter tasks by the type of resource they are linked to": "Filter taken op het type resource waaraan ze zijn gekoppeld",
|
||||
"Select the specific resource to filter tasks by": "Selecteer de specifieke resource om taken op te filteren",
|
||||
"Filter tasks by the user they are assigned to": "Filter taken door de gebruiker waaraan ze zijn toegewezen",
|
||||
"Filter tasks by the team they are assigned to": "Filter taken door het team waaraan ze zijn toegewezen",
|
||||
"Filter tasks by the user who created them": "Filter taken door de gebruiker die ze heeft gemaakt",
|
||||
"Filter by task completion status": "Filter op taak voltooiingsstatus",
|
||||
"Filter by task type": "Filteren op taaktype",
|
||||
"Only return tasks updated on or after this date/time": "Geeft alleen taken weer die bijgewerkt worden op of na deze datum/tijd",
|
||||
"Only return tasks updated on or before this date/time": "Geeft alleen taken weer die bijgewerkt worden op of voor deze datum/tijd",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "Maximum aantal taken om terug te sturen (standaard: 50, max: 1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "Indien aangevinkt, retourneert alleen de eerste overeenkomende taak. Indien aangevinkt, retourneert u alle overeenkomende taken.",
|
||||
"Person": "Persoon",
|
||||
"Organization": "Rekening",
|
||||
"Trust": "Vertrouwen",
|
||||
"Client": "Klant",
|
||||
"Past Client": "Vorige cliënt",
|
||||
"Prospect": "Prospect",
|
||||
"Vendor": "Leverancier",
|
||||
"Active": "Actief",
|
||||
"Inactive": "Inactief",
|
||||
"Female": "Vrouwelijk",
|
||||
"Male": "Mannelijk",
|
||||
"Non-binary": "Niet-binair",
|
||||
"Unknown": "Onbekend",
|
||||
"Married": "Getrouwd",
|
||||
"Single": "Enkelvoudig",
|
||||
"Divorced": "Gescheiden",
|
||||
"Widowed": "Weduwe/weduwnaar",
|
||||
"Life Partner": "Leven Partner",
|
||||
"Separated": "Gescheiden",
|
||||
"Referral": "Verwijzing",
|
||||
"Conference": "Conferentie",
|
||||
"Direct Mail": "Directe e-mail",
|
||||
"Cold Call": "Koude oproep",
|
||||
"Other": "anders",
|
||||
"Head": "Hoofd",
|
||||
"Spouse": "Huwelijkspartner",
|
||||
"Partner": "Partner",
|
||||
"Child": "Kind",
|
||||
"Grandchild": "Grootkind",
|
||||
"Parent": "Bovenliggende",
|
||||
"Grandparent": "Grootouder",
|
||||
"Sibling": "Neef/nicht",
|
||||
"Dependent": "Afhankelijk",
|
||||
"Unconfirmed": "Onbevestigd",
|
||||
"Confirmed": "Bevestigd",
|
||||
"Tentative": "Voorlopig",
|
||||
"Completed": "Voltooid",
|
||||
"Cancelled": "Geannuleerd",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP (€)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "AUD (A$)",
|
||||
"Fee": "Transactiekosten",
|
||||
"Commission": "Commissie",
|
||||
"AUM": "AUM",
|
||||
"Low": "laag",
|
||||
"Medium": "Middelgroot",
|
||||
"High": "hoog",
|
||||
"Project": "Project",
|
||||
"Opportunity": "Kans",
|
||||
"Active Only": "Alleen actief",
|
||||
"Inactive Only": "Alleen inactief",
|
||||
"All Contacts": "Alle contacten",
|
||||
"Recent (newest first)": "Recente (nieuwste eerst)",
|
||||
"Created Date (newest first)": "Aanmaakdatum (nieuwste eerst)",
|
||||
"Updated Date (newest first)": "Bijgewerkte datum (nieuwste eerst)",
|
||||
"Ascending": "Oplopend",
|
||||
"Descending": "Aflopend",
|
||||
"All Tasks": "Alle taken",
|
||||
"Completed Only": "Alleen voltooid",
|
||||
"Incomplete Only": "Alleen onvolledig",
|
||||
"Parent Tasks Only": "Alleen bovenliggende taken",
|
||||
"Subtasks Only": "Alleen subtaken",
|
||||
"New Task": "Nieuwe taak",
|
||||
"New Contact": "Nieuw contactpersoon",
|
||||
"New Event": "Nieuwe gebeurtenis",
|
||||
"New Opportunity": "Nieuwe kans",
|
||||
"Fires when a new task is created": "Vuurt wanneer een nieuwe taak wordt gemaakt",
|
||||
"Fires when a new contact is created": "Vuurt wanneer een nieuw contact wordt gemaakt",
|
||||
"Fires when a new event is created": "Vuurt wanneer een nieuwe gebeurtenis is gemaakt",
|
||||
"Fires when a new opportunity is created": "Vuurt af wanneer een nieuwe kans wordt gemaakt",
|
||||
"Assigned To Team ID": "Toegewezen Aan Team ID",
|
||||
"Entity Type": "Entiteit type",
|
||||
"Start Date Minimum": "Minimale begindatum",
|
||||
"Start Date Maximum": "Begindatum maximaal",
|
||||
"Opportunity Stage": "Kans stadium",
|
||||
"Include Closed Opportunities": "Inclusief gesloten kansen",
|
||||
"Minimum Probability (%)": "Minimale Waarschijnlijkheid (%)",
|
||||
"Maximum Probability (%)": "Maximale Waarschijnlijkheid (%)",
|
||||
"Target Close After": "Doel sluiten na",
|
||||
"Target Close Before": "Doel sluiten vóór",
|
||||
"Only trigger for tasks assigned to this user (optional)": "Alleen trigger voor taken toegewezen aan deze gebruiker (optioneel)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "Alleen trigger voor taken toegewezen aan dit team (optioneel)",
|
||||
"Only trigger for tasks created by this user (optional)": "Alleen trigger voor taken gemaakt door deze gebruiker (optioneel)",
|
||||
"Type of tasks to monitor": "Soort taken om te monitoren",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "Alleen trigger voor taken gekoppeld aan dit type bron (optioneel)",
|
||||
"Only trigger for contacts of this type (optional)": "Alleen trigger voor contacten van dit type (optioneel)",
|
||||
"Only trigger for contacts of this entity type (optional)": "Alleen trigger voor contacten van dit entiteittype (optioneel)",
|
||||
"Only trigger for contacts with this household title (optional)": "Alleen trigger voor contacten met deze huishoudelijke titel (optioneel)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "Alleen trigger voor contacten toegewezen aan deze gebruiker (optioneel)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "Alleen trigger voor contacten met een van deze tags (optioneel)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "Alleen activeren voor gebeurtenissen die gekoppeld zijn aan dit type bron (optioneel)",
|
||||
"Select the specific resource to filter events by": "Selecteer de specifieke bron om gebeurtenissen op te filteren",
|
||||
"Only trigger for events of this category (optional)": "Trigger alleen voor gebeurtenissen van deze categorie (optioneel)",
|
||||
"Only trigger for events starting on or after this date/time": "Alleen activeren voor gebeurtenissen die starten op of na deze datum/tijd",
|
||||
"Only trigger for events starting on or before this date/time": "Alleen activeren voor gebeurtenissen die starten op of voor deze datum/tijd",
|
||||
"How to order the events": "Hoe de gebeurtenissen te bestellen",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "Alleen voor kansen gekoppeld aan dit type bron (optioneel)",
|
||||
"Select the specific resource to filter opportunities by": "Selecteer de specifieke bron om kansen te filteren op",
|
||||
"Only trigger for opportunities in this stage (optional)": "Alleen mogelijk maken voor kansen in dit stadium (optioneel)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "Alleen voor kansen beheerd door deze gebruiker (optioneel)",
|
||||
"Include won and lost opportunities in results": "Inclusief gewonnen en verloren kansen in resultaten",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "Alleen voor kansen met kans op of boven dit percentage (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "Alleen trigger voor kansen met kans op of onder dit percentage (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "Alleen trigger voor kansen met doel sluitingsdatum op of na deze datum/tijd",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "Alleen activeren voor kansen met doel sluitingsdatum op of voor deze datum/tijd",
|
||||
"Start Date (ascending)": "Startdatum (oplopend)",
|
||||
"Start Date (descending)": "Startdatum (aflopend)"
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Digite seu token de acesso da API Wealthbox. Obtenha em Ajustes → Tokens de acesso API em sua conta Wealthbox.",
|
||||
"Create Contact": "Criar contato",
|
||||
"Create Note": "Criar Nota",
|
||||
"Create Project": "Criar Projeto",
|
||||
"Add Member to Household": "Adicionar membro ao domicílio",
|
||||
"Create Household": "Criar Doméstico",
|
||||
"Create Event": "Criar evento",
|
||||
"Create Opportunity": "Criar Oportunidade",
|
||||
"Create Task": "Criar tarefa",
|
||||
"Start Workflow": "Iniciar Workflow",
|
||||
"Find Contact": "Localizar contato",
|
||||
"Find Task": "Procurar Tarefa",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "Adiciona um novo contato com detalhes ricos (nome, endereço, e-mail, tags, etc.)",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "Adiciona uma nota vinculada a um contato. Registra resumos de chamadas nos registros do cliente.",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "Inicia um novo projeto com descrição e organizador. Inicie a integração baseada em projeto quando novos clientes se inscreverem.",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "Adiciona um membro a uma casa existente. Conecte vários contatos em uma unidade familiar.",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "Cria um registro doméstico com e-mails, etiquetas. Agrupa os contatos do membro da família em uma casa.",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "Cria um evento de calendário vinculado ao contato. Agende reuniões consultivas em nome dos clientes.",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "Registra uma oportunidade incluindo estágio, data de fechamento, valor. Automatize o rastreamento da oportunidade após as reuniões.",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "Cria tarefas vinculadas aos contatos com data limite e tipos de atividade. Atribui ações de acompanhamento quando as oportunidades são criadas.",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "Aciona um modelo de fluxo de trabalho em um contato/projeto/oportunidade. Automatize sequências de várias etapas com base em eventos CRM.",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "Localize um contato por nome, e-mail, telefone ou filtros avançados. Busca de contato abrangente com opções de filtragem dinâmicas.",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "Localiza tarefas existentes usando filtros de pesquisa abrangentes. Pesquisar por atribuição, recurso, status de conclusão e intervalos de datas.",
|
||||
"First Name": "Nome",
|
||||
"Last Name": "Sobrenome",
|
||||
"Prefix": "Prefixo",
|
||||
"Middle Name": "Nome do Meio",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "Apelido",
|
||||
"Job Title": "Título do Cargo",
|
||||
"Company Name": "Nome da Empresa",
|
||||
"Contact Type": "Tipo de contato",
|
||||
"Contact Classification": "Classificação de Contato",
|
||||
"Status": "Estado",
|
||||
"Gender": "Gênero",
|
||||
"Birth Date": "Data de Nascimento",
|
||||
"Marital Status": "Estado civil",
|
||||
"Email Address": "Endereço de e-mail",
|
||||
"Phone Number": "Número de telefone",
|
||||
"Street Address Line 1": "Linha de Endereço 1",
|
||||
"Street Address Line 2": "Linha de Endereço 2",
|
||||
"City": "cidade",
|
||||
"State": "Estado:",
|
||||
"ZIP Code": "Código Postal",
|
||||
"Country": "País/região",
|
||||
"Twitter Handle": "Manipulador do Twitter",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "Informações de fundo",
|
||||
"Important Information": "Informação importante",
|
||||
"Personal Interests": "Interesses pessoais",
|
||||
"Contact Source": "Fonte do contato",
|
||||
"Tags": "Etiquetas",
|
||||
"External Unique ID": "ID único externo",
|
||||
"Note Content": "Conteúdo da Nota",
|
||||
"Contact": "contato",
|
||||
"Visible To": "Visível para",
|
||||
"Project Name": "Nome do Projeto",
|
||||
"Project Description": "Descrição do Projeto",
|
||||
"Organizer": "Organizador",
|
||||
"Custom Fields": "Campos Personalizados",
|
||||
"Household": "Doméstico",
|
||||
"Household Title": "Título de Casa",
|
||||
"Household Name": "Nome do Doméstico",
|
||||
"Head of Household": "Chefe da Casa",
|
||||
"Spouse/Partner (Optional)": "Spouse/Parceiro (Opcional)",
|
||||
"Primary Email Address": "Endereço de e-mail principal",
|
||||
"Primary Phone Number": "Número de telefone primário",
|
||||
"Household Type": "Tipo de Doméstico",
|
||||
"Event Title": "Título da Reunião",
|
||||
"Start Date & Time": "Data e Hora Inicial",
|
||||
"End Date & Time": "Data e Hora Final",
|
||||
"Location": "Local:",
|
||||
"Description": "Descrição",
|
||||
"All Day Event": "Evento de dia inteiro",
|
||||
"Repeating Event": "Repetindo evento",
|
||||
"Event Status": "Estado do Evento",
|
||||
"Linked Contact": "Contato vinculado",
|
||||
"Invitees": "Convidados",
|
||||
"Event Category": "Categoria do evento",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "Oportunidade Nome",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "Probabilidade (%)",
|
||||
"Amount": "Quantidade",
|
||||
"Currency": "moeda",
|
||||
"Amount Type": "Tipo de Quantidade",
|
||||
"Stage": "Etapa",
|
||||
"Opportunity Manager": "Gerenciador de Oportunidade",
|
||||
"Task Name": "Nome da tarefa",
|
||||
"Due Date": "Data de vencimento",
|
||||
"Assigned To": "Atribuído Para",
|
||||
"Priority": "Prioridade",
|
||||
"Mark as Complete": "Marcar como concluída",
|
||||
"Link To": "Link para",
|
||||
"Linked Record": "Registro vinculado",
|
||||
"Category": "categoria",
|
||||
"Due Later": "Devido mais tarde",
|
||||
"Workflow Template": "Modelo de workflow",
|
||||
"Workflow Label": "Etiqueta do Workflow",
|
||||
"Workflow Milestones": "Marcos do workflow",
|
||||
"Name": "Nome",
|
||||
"Contact ID": "ID do contato",
|
||||
"Contact Entity Type": "Tipo de entidade de contato",
|
||||
"Tags Filter": "Filtro de Tags",
|
||||
"Active Status": "Estado ativo",
|
||||
"Include Deleted Contacts": "Incluir contatos excluídos",
|
||||
"Updated Since": "Atualizado desde",
|
||||
"Updated Before": "Atualizado Antes",
|
||||
"Sort Order": "Ordem de classificação",
|
||||
"Result Limit": "Limite de resultado",
|
||||
"Return Single Result Only": "Retornar Apenas o Resultado Único",
|
||||
"Task ID (Optional)": "ID da Tarefa (opcional)",
|
||||
"Linked Resource Type": "Tipo de Recurso Vinculado",
|
||||
"Linked Resource": "Recurso Vinculado",
|
||||
"Assigned to Team ID": "Atribuído à ID da Equipe",
|
||||
"Created By": "Criado Por",
|
||||
"Completion Status": "Status de conclusão",
|
||||
"Task Type": "Tipo de tarefa",
|
||||
"The first name of the contact": "O primeiro nome do contato",
|
||||
"The last name of the contact": "O último nome do contato",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "O prefixo preferido para o contato (por exemplo, Mr., Sr., D.)",
|
||||
"The middle name of the contact": "O nome do meio do contato",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "O sufixo associado ao contato (por exemplo, Jr., Sr., M.D.)",
|
||||
"A preferred shortname for the contact": "Um nome de atalho preferido para o contato",
|
||||
"The title the contact holds at their present company": "O título do contato em sua atual empresa",
|
||||
"The name of the contact's present company": "O nome da atual empresa do contato",
|
||||
"The type of the contact being created": "O tipo de contato que está sendo criado",
|
||||
"A string further classifying the contact": "Uma string classificando ainda mais o contato",
|
||||
"Whether the contact is currently active": "Se o contato está ativo no momento",
|
||||
"The gender of the contact": "O sexo do contato",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "A data de nascimento do contato (YYYY-MM-DD)",
|
||||
"The marital status of the contact": "O estado civil do contato",
|
||||
"Primary email address for the contact": "Endereço de e-mail principal para o contato",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "Número de telefone principal para o contato (por exemplo, (555) 123-4567)",
|
||||
"First line of street address": "Primeira linha de endereço da rua",
|
||||
"Second line of street address (apt, suite, etc.)": "Segunda linha do endereço da rua (apt, suite, etc.)",
|
||||
"City for the address": "Cidade para o endereço",
|
||||
"State or province for the address": "Estado ou província do endereço",
|
||||
"ZIP or postal code for the address": "CEP ou código postal para o endereço",
|
||||
"Country for the address": "País para o endereço",
|
||||
"The twitter handle of the contact": "O twitter do contato",
|
||||
"The LinkedIn URL for the contact": "O URL LinkedIn para o contato",
|
||||
"A brief description of the contact": "Uma breve descrição do contato",
|
||||
"Any other important info for the contact": "Qualquer outra informação importante para o contato",
|
||||
"Personal interests for the contact": "Interesses pessoais para o contato",
|
||||
"The method in which this contact was acquired": "O método pelo qual este contato foi adquirido",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "Tags para associar ao contato (por exemplo, \"Cliente\", \"VIP\", \"Referência\")",
|
||||
"A unique identifier for this contact in an external system": "Um identificador exclusivo para esse contato em um sistema externo",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "O corpo principal da nota (por exemplo, resumo da chamada, notas de reunião, detalhes de interação do cliente)",
|
||||
"Select the contact to link this note to": "Selecione o contato para vincular esta anotação",
|
||||
"Select who can view this note": "Selecione quem pode ver esta nota",
|
||||
"Select tags to associate with this note": "Selecione tags para associar com esta nota",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "O nome do projeto (por exemplo, \"Integração de cliente\", \"Processo de revisão Q1\")",
|
||||
"A detailed explanation of the project goals and scope": "Uma explicação detalhada dos objetivos e âmbito do projeto",
|
||||
"Select the user who will be responsible for organizing this project": "Selecione o usuário que será responsável pela organização deste projeto",
|
||||
"Select who can view this project": "Selecione quem pode visualizar este projeto",
|
||||
"Add custom fields to this project": "Adicionar campos personalizados para este projeto",
|
||||
"Select the household that will receive the new member": "Selecione a família que receberá o novo membro",
|
||||
"Select the contact to add to the household": "Selecione o contato para adicionar ao lar",
|
||||
"The household title to assign to the added contact": "O título do lar para atribuir ao contato adicional",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "O nome da família (por exemplo, \"A família Anderson\", \"Smith Household\")",
|
||||
"Select the contact who will be the head of this household": "Selecione o contato que será o chefe desta casa",
|
||||
"Select the spouse or partner to automatically add to this household": "Selecione o cônjuge ou parceiro para adicionar automaticamente a este lar",
|
||||
"Primary email address for the household": "Endereço de e-mail principal do lar",
|
||||
"City for the household address": "Cidade para o endereço doméstico",
|
||||
"State or province for the household address": "Estado ou província para o endereço de casa",
|
||||
"ZIP or postal code for the household address": "CEP ou código postal para o endereço doméstico",
|
||||
"Country for the household address": "País para o endereço doméstico",
|
||||
"Primary phone number for the household": "Número de telefone primário para o lar",
|
||||
"The type of household being created": "O tipo de agregado familiar criado",
|
||||
"Whether the household is currently active": "Se o lar está ativo no momento",
|
||||
"Background information about the household": "Informações de fundo sobre o agregado familiar",
|
||||
"Any important information about the household": "Qualquer informação importante sobre a família",
|
||||
"Select tags to associate with this household": "Selecione tags para associar com este lar",
|
||||
"Select who can view this household": "Selecione quem pode ver este lar",
|
||||
"A unique identifier for this household in an external system": "Um identificador exclusivo para este agregado familiar em um sistema externo",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "O nome do evento (por exemplo, \"Reunião de cliente\", \"Revisão do Portfólio\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "Quando o evento começa (yyyy-mm-dd hh:mm format)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "Quando o evento terminar (formato aaaa-mm-dd hh:mm)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "Onde o evento ocorre (por exemplo, \"Sala de conferência\", \"Escritório de clientes\", \"Reunião de Zoom\")",
|
||||
"A detailed explanation of the event purpose and agenda": "Uma explicação detalhada sobre a finalidade e a agenda do evento",
|
||||
"Check if this is an all-day event": "Verificar se este é um evento de dia inteiro",
|
||||
"Check if this event repeats": "Verificar se este evento se repete",
|
||||
"The current state of the event": "O estado atual do evento",
|
||||
"Select the contact to link this event to": "Selecione o contato para vincular este evento a",
|
||||
"Add people to invite to this event": "Adicionar pessoas para convidar para este evento",
|
||||
"Select the category for this event": "Selecione a categoria para este evento",
|
||||
"Send email invitations to invitees": "Enviar convites por e-mail aos convidados",
|
||||
"Select who can view this event": "Selecione quem pode ver este evento",
|
||||
"Add custom fields to this event": "Adicionar campos personalizados para este evento",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "O nome da oportunidade (ex.: \"Plano Financeiro\", \"Consultoria de Investimento\", \"Planejamento imobiliário\")",
|
||||
"When the opportunity should close": "Quando a oportunidade deve fechar",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "A chance de fechar a oportunidade, como um percentual (0-100)",
|
||||
"The monetary value of the opportunity": "O valor monetário da oportunidade",
|
||||
"The currency for the opportunity amount": "A moeda para o valor da oportunidade",
|
||||
"The type of amount this represents": "O tipo de valor que isto representa",
|
||||
"Select the current stage of this opportunity": "Selecione a fase atual desta oportunidade",
|
||||
"Select the contact linked to this opportunity": "Selecione o contato vinculado a esta oportunidade",
|
||||
"A detailed explanation of the opportunity": "Uma explicação detalhada da oportunidade",
|
||||
"Select the user designated as manager of this opportunity": "Selecione o usuário designado como gerente desta oportunidade",
|
||||
"Select who can view this opportunity": "Selecionar quem pode ver esta oportunidade",
|
||||
"Add custom fields to this opportunity": "Adicionar campos personalizados para esta oportunidade",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "O nome da tarefa (por exemplo, \"Devolução de chamada da fatura\", \"Acompanhamento da proposta\")",
|
||||
"When the task is due": "Quando a tarefa expira",
|
||||
"Select the user who the task is assigned to": "Selecione o usuário a quem a tarefa está atribuída",
|
||||
"A detailed explanation of the task": "Uma explicação detalhada da tarefa",
|
||||
"The priority level of the task": "O nível de prioridade da tarefa",
|
||||
"Check if the task should be created as already completed": "Verifique se a tarefa deve ser criada como já concluída",
|
||||
"What type of record to link this task to": "A que tipo de registro vincular esta tarefa",
|
||||
"Select the record to link this task to": "Selecione o registro para vincular esta tarefa a",
|
||||
"Select the category this task belongs to": "Selecione a categoria que esta tarefa pertence a",
|
||||
"Select who can view this task": "Selecione quem pode visualizar esta tarefa",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "Intervalo para quando esta tarefa é concluída após o início (por exemplo, \"2 dias mais tarde às 5:00 PM\")",
|
||||
"Add custom fields to this task": "Adicionar campos personalizados para esta tarefa",
|
||||
"Select the workflow template to trigger": "Selecione o modelo do workflow para acionar",
|
||||
"What type of record to link this workflow to": "A que tipo de registro vincular este fluxo de trabalho",
|
||||
"Select the record to link this workflow to": "Selecione o registro para vincular este fluxo de trabalho a",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "Um nome curto para o fluxo de trabalho (por exemplo, \"Inserir um novo cliente para a empresa\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "Quando você deseja que o fluxo de trabalho inicie (opcional, o padrão é agora)",
|
||||
"Select who can view this workflow": "Selecione quem pode visualizar este fluxo de trabalho",
|
||||
"Add milestones to this workflow": "Adicionar marcos para este fluxo de trabalho",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "Pesquisa por nome (suporta partidas parciais entre o prefixo, primeiro, meio, último, sufixo, apelido e nome completo para famílias/empresas)",
|
||||
"Search by email address": "Pesquisar por endereço de e-mail",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "Pesquisar por número de telefone (delimitadores como -, (), será removido automaticamente)",
|
||||
"Search by specific contact ID (most precise search)": "Pesquisar por ID de contato específico (pesquisa mais precisa)",
|
||||
"Search by external unique identifier": "Pesquisar por identificador exclusivo externo",
|
||||
"Filter by contact type": "Filtrar por tipo de contato",
|
||||
"Filter by entity type": "Filtrar por tipo de entidade",
|
||||
"Filter by household title (only applies to household members)": "Filtrar por título doméstico (aplica-se apenas aos membros domésticos)",
|
||||
"Filter contacts by tags": "Filtrar contatos por tags",
|
||||
"Filter by active status": "Filtrar por status ativo",
|
||||
"Include contacts that have been deleted": "Incluir contatos que foram excluídos",
|
||||
"Only return contacts updated on or after this date/time": "Retornar contatos atualizados somente em ou após esta data/hora",
|
||||
"Only return contacts updated on or before this date/time": "Retornar contatos atualizados somente em ou antes desta data/hora",
|
||||
"How to order the results": "Como ordenar os resultados",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "Número máximo de contatos a retornar (padrão: 50, máx: 1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "Se marcado, retorna apenas o primeiro contato correspondente. Se estiver desmarcado, retorna todos os contatos correspondentes.",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "Procurar por uma tarefa específica por seu ID exclusivo. Deixe em branco para pesquisar por filtros.",
|
||||
"Filter tasks by the type of resource they are linked to": "Filtrar tarefas pelo tipo de recurso ao qual estão ligados",
|
||||
"Select the specific resource to filter tasks by": "Selecione o recurso específico para filtrar as tarefas por",
|
||||
"Filter tasks by the user they are assigned to": "Filtrar tarefas pelo usuário que são atribuídas a",
|
||||
"Filter tasks by the team they are assigned to": "Filtrar tarefas pela equipe que são atribuídas a",
|
||||
"Filter tasks by the user who created them": "Filtrar tarefas pelo usuário que as criou",
|
||||
"Filter by task completion status": "Filtrar por status de conclusão da tarefa",
|
||||
"Filter by task type": "Filtrar por tipo de tarefa",
|
||||
"Only return tasks updated on or after this date/time": "Somente tarefas de devolução atualizadas em ou após esta data/hora",
|
||||
"Only return tasks updated on or before this date/time": "Somente tarefas de devolução atualizadas em ou antes desta data/hora",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "Número máximo de tarefas a retornar (padrão: 50, máx: 1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "Se marcado, retorna apenas a primeira tarefa correspondente. Se desmarcado, retorna todas as tarefas correspondentes.",
|
||||
"Person": "Pessoa",
|
||||
"Organization": "Cliente",
|
||||
"Trust": "Confiança",
|
||||
"Client": "Cliente",
|
||||
"Past Client": "Último Cliente",
|
||||
"Prospect": "Prospecto",
|
||||
"Vendor": "Fornecedor",
|
||||
"Active": "Ativo",
|
||||
"Inactive": "Inativo",
|
||||
"Female": "Feminino",
|
||||
"Male": "Masculino",
|
||||
"Non-binary": "Não-binário",
|
||||
"Unknown": "Desconhecido",
|
||||
"Married": "Casado",
|
||||
"Single": "Solitário",
|
||||
"Divorced": "Divorciado",
|
||||
"Widowed": "Viúvo",
|
||||
"Life Partner": "Parceiro de Vida",
|
||||
"Separated": "Separados",
|
||||
"Referral": "Referência",
|
||||
"Conference": "Conferência",
|
||||
"Direct Mail": "O Direct Mail",
|
||||
"Cold Call": "Chamada Perdida",
|
||||
"Other": "Outros",
|
||||
"Head": "Cabeça",
|
||||
"Spouse": "Cônjuge",
|
||||
"Partner": "Parceiro",
|
||||
"Child": "Filho(a)",
|
||||
"Grandchild": "Vovó",
|
||||
"Parent": "Antecessor",
|
||||
"Grandparent": "Avô",
|
||||
"Sibling": "Irmão",
|
||||
"Dependent": "Dependente",
|
||||
"Unconfirmed": "Não confirmada",
|
||||
"Confirmed": "Confirmado",
|
||||
"Tentative": "Tentativa",
|
||||
"Completed": "Concluído",
|
||||
"Cancelled": "Cancelado",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP (£)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "AUD (A$)",
|
||||
"Fee": "Tarifa",
|
||||
"Commission": "Comissões",
|
||||
"AUM": "MÊS",
|
||||
"Low": "baixa",
|
||||
"Medium": "Média",
|
||||
"High": "alta",
|
||||
"Project": "Projecto",
|
||||
"Opportunity": "Oportunidade",
|
||||
"Active Only": "Somente ativo",
|
||||
"Inactive Only": "Apenas inativo",
|
||||
"All Contacts": "Todos os Contatos",
|
||||
"Recent (newest first)": "Recentes (mais recentes primeiro)",
|
||||
"Created Date (newest first)": "Data de Criação (mais recente primeiro)",
|
||||
"Updated Date (newest first)": "Data de atualização (mais recente primeiro)",
|
||||
"Ascending": "Crescente",
|
||||
"Descending": "Decrescente",
|
||||
"All Tasks": "Todas as tarefas",
|
||||
"Completed Only": "Somente Concluída",
|
||||
"Incomplete Only": "Apenas incompleto",
|
||||
"Parent Tasks Only": "Apenas Tarefas Pai",
|
||||
"Subtasks Only": "Apenas subtarefas",
|
||||
"New Task": "Nova tarefa",
|
||||
"New Contact": "Novo Contato",
|
||||
"New Event": "Novo evento",
|
||||
"New Opportunity": "Nova Oportunidade",
|
||||
"Fires when a new task is created": "Efetua quando uma nova tarefa é criada",
|
||||
"Fires when a new contact is created": "Atira quando um novo contato é criado",
|
||||
"Fires when a new event is created": "aciona quando um novo evento é criado",
|
||||
"Fires when a new opportunity is created": "Atira quando uma nova oportunidade é criada",
|
||||
"Assigned To Team ID": "Atribuído Ao Time ID",
|
||||
"Entity Type": "Tipo de entidade",
|
||||
"Start Date Minimum": "Data mínima de início",
|
||||
"Start Date Maximum": "Data Máxima de Início",
|
||||
"Opportunity Stage": "Estágio de oportunidade",
|
||||
"Include Closed Opportunities": "Incluir Oportunidades Fechadas",
|
||||
"Minimum Probability (%)": "Probabilidade mínima (%)",
|
||||
"Maximum Probability (%)": "Probabilidade Máxima (%)",
|
||||
"Target Close After": "Alvo Fechar Depois",
|
||||
"Target Close Before": "Alvo Fechar Antes de",
|
||||
"Only trigger for tasks assigned to this user (optional)": "Ativar apenas tarefas atribuídas a este usuário (opcional)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "Ativar apenas tarefas atribuídas a esta equipe (opcional)",
|
||||
"Only trigger for tasks created by this user (optional)": "Ativar apenas tarefas criadas por este usuário (opcional)",
|
||||
"Type of tasks to monitor": "Tipo de tarefas a monitorar",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "Ativar apenas tarefas vinculadas a este tipo de recurso (opcional)",
|
||||
"Only trigger for contacts of this type (optional)": "Desencadeador somente para contatos deste tipo (opcional)",
|
||||
"Only trigger for contacts of this entity type (optional)": "Ativar apenas contatos deste tipo de entidade (opcional)",
|
||||
"Only trigger for contacts with this household title (optional)": "Somente acionar para contatos com este título doméstico (opcional)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "Ativar apenas contatos associados a este usuário (opcional)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "Ativar apenas contatos com uma destas tags (opcional)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "Apenas gatilho para eventos relacionados a este tipo de recurso (opcional)",
|
||||
"Select the specific resource to filter events by": "Selecione o recurso específico para filtrar eventos por",
|
||||
"Only trigger for events of this category (optional)": "Ativar somente eventos desta categoria (opcional)",
|
||||
"Only trigger for events starting on or after this date/time": "Gatilho somente para eventos que iniciam ou depois desta data/hora",
|
||||
"Only trigger for events starting on or before this date/time": "Apenas gatilho para eventos iniciados em ou antes desta data/hora",
|
||||
"How to order the events": "Como ordenar os eventos",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "Ativar apenas oportunidades ligadas a este tipo de recurso (opcional)",
|
||||
"Select the specific resource to filter opportunities by": "Selecione o recurso específico para filtrar oportunidades por",
|
||||
"Only trigger for opportunities in this stage (optional)": "Ativar apenas as oportunidades nesta fase (opcional)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "Ativar apenas as oportunidades gerenciadas por este usuário (opcional)",
|
||||
"Include won and lost opportunities in results": "Incluir oportunidades ganhas e perdidas nos resultados",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "Ativar apenas para oportunidades com probabilidade ou acima desta porcentagem (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "Ativar apenas para oportunidades com probabilidade ou abaixo desta percentagem (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "Ativar somente para oportunidades com data de fechamento alvo na ou depois desta data/hora",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "Gatilho somente para oportunidades com data de fechamento alvo na ou antes desta data/hora",
|
||||
"Start Date (ascending)": "Data de início (crescente)",
|
||||
"Start Date (descending)": "Data de início (decrescente)"
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.",
|
||||
"Create Contact": "Create Contact",
|
||||
"Create Note": "Create Note",
|
||||
"Create Project": "Create Project",
|
||||
"Add Member to Household": "Add Member to Household",
|
||||
"Create Household": "Create Household",
|
||||
"Create Event": "Create Event",
|
||||
"Create Opportunity": "Create Opportunity",
|
||||
"Create Task": "Create Task",
|
||||
"Start Workflow": "Start Workflow",
|
||||
"Find Contact": "Find Contact",
|
||||
"Find Task": "Find Task",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "Adds a new contact with rich details (name, address, email, tags, etc.)",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "Adds a note linked to a contact. Log call summaries against client records.",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "Adds a member to an existing household. Link multiple contacts under one family unit.",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "Creates a household record with emails, tags. Group family member contacts into one household.",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Prefix": "Prefix",
|
||||
"Middle Name": "Middle Name",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "Nickname",
|
||||
"Job Title": "Job Title",
|
||||
"Company Name": "Company Name",
|
||||
"Contact Type": "Contact Type",
|
||||
"Contact Classification": "Contact Classification",
|
||||
"Status": "Status",
|
||||
"Gender": "Gender",
|
||||
"Birth Date": "Birth Date",
|
||||
"Marital Status": "Marital Status",
|
||||
"Email Address": "Email Address",
|
||||
"Phone Number": "Phone Number",
|
||||
"Street Address Line 1": "Street Address Line 1",
|
||||
"Street Address Line 2": "Street Address Line 2",
|
||||
"City": "City",
|
||||
"State": "State",
|
||||
"ZIP Code": "ZIP Code",
|
||||
"Country": "Country",
|
||||
"Twitter Handle": "Twitter Handle",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "Background Information",
|
||||
"Important Information": "Important Information",
|
||||
"Personal Interests": "Personal Interests",
|
||||
"Contact Source": "Contact Source",
|
||||
"Tags": "Tags",
|
||||
"External Unique ID": "External Unique ID",
|
||||
"Note Content": "Note Content",
|
||||
"Contact": "Contact",
|
||||
"Visible To": "Visible To",
|
||||
"Project Name": "Project Name",
|
||||
"Project Description": "Project Description",
|
||||
"Organizer": "Organizer",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Household": "Household",
|
||||
"Household Title": "Household Title",
|
||||
"Household Name": "Household Name",
|
||||
"Head of Household": "Head of Household",
|
||||
"Spouse/Partner (Optional)": "Spouse/Partner (Optional)",
|
||||
"Primary Email Address": "Primary Email Address",
|
||||
"Primary Phone Number": "Primary Phone Number",
|
||||
"Household Type": "Household Type",
|
||||
"Event Title": "Event Title",
|
||||
"Start Date & Time": "Start Date & Time",
|
||||
"End Date & Time": "End Date & Time",
|
||||
"Location": "Location",
|
||||
"Description": "Description",
|
||||
"All Day Event": "All Day Event",
|
||||
"Repeating Event": "Repeating Event",
|
||||
"Event Status": "Event Status",
|
||||
"Linked Contact": "Linked Contact",
|
||||
"Invitees": "Invitees",
|
||||
"Event Category": "Event Category",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "Opportunity Name",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "Probability (%)",
|
||||
"Amount": "Amount",
|
||||
"Currency": "Currency",
|
||||
"Amount Type": "Amount Type",
|
||||
"Stage": "Stage",
|
||||
"Opportunity Manager": "Opportunity Manager",
|
||||
"Task Name": "Task Name",
|
||||
"Due Date": "Due Date",
|
||||
"Assigned To": "Assigned To",
|
||||
"Priority": "Priority",
|
||||
"Mark as Complete": "Mark as Complete",
|
||||
"Link To": "Link To",
|
||||
"Linked Record": "Linked Record",
|
||||
"Category": "Category",
|
||||
"Due Later": "Due Later",
|
||||
"Workflow Template": "Workflow Template",
|
||||
"Workflow Label": "Workflow Label",
|
||||
"Workflow Milestones": "Workflow Milestones",
|
||||
"Name": "Name",
|
||||
"Contact ID": "Contact ID",
|
||||
"Contact Entity Type": "Contact Entity Type",
|
||||
"Tags Filter": "Tags Filter",
|
||||
"Active Status": "Active Status",
|
||||
"Include Deleted Contacts": "Include Deleted Contacts",
|
||||
"Updated Since": "Updated Since",
|
||||
"Updated Before": "Updated Before",
|
||||
"Sort Order": "Sort Order",
|
||||
"Result Limit": "Result Limit",
|
||||
"Return Single Result Only": "Return Single Result Only",
|
||||
"Task ID (Optional)": "Task ID (Optional)",
|
||||
"Linked Resource Type": "Linked Resource Type",
|
||||
"Linked Resource": "Linked Resource",
|
||||
"Assigned to Team ID": "Assigned to Team ID",
|
||||
"Created By": "Created By",
|
||||
"Completion Status": "Completion Status",
|
||||
"Task Type": "Task Type",
|
||||
"The first name of the contact": "The first name of the contact",
|
||||
"The last name of the contact": "The last name of the contact",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "The preferred prefix for the contact (e.g., Mr., Ms., Dr.)",
|
||||
"The middle name of the contact": "The middle name of the contact",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "The suffix associated with the contact (e.g., Jr., Sr., M.D.)",
|
||||
"A preferred shortname for the contact": "A preferred shortname for the contact",
|
||||
"The title the contact holds at their present company": "The title the contact holds at their present company",
|
||||
"The name of the contact's present company": "The name of the contact's present company",
|
||||
"The type of the contact being created": "The type of the contact being created",
|
||||
"A string further classifying the contact": "A string further classifying the contact",
|
||||
"Whether the contact is currently active": "Whether the contact is currently active",
|
||||
"The gender of the contact": "The gender of the contact",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "The birthdate of the contact (YYYY-MM-DD format)",
|
||||
"The marital status of the contact": "The marital status of the contact",
|
||||
"Primary email address for the contact": "Primary email address for the contact",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "Primary phone number for the contact (e.g., (555) 123-4567)",
|
||||
"First line of street address": "First line of street address",
|
||||
"Second line of street address (apt, suite, etc.)": "Second line of street address (apt, suite, etc.)",
|
||||
"City for the address": "City for the address",
|
||||
"State or province for the address": "State or province for the address",
|
||||
"ZIP or postal code for the address": "ZIP or postal code for the address",
|
||||
"Country for the address": "Country for the address",
|
||||
"The twitter handle of the contact": "The twitter handle of the contact",
|
||||
"The LinkedIn URL for the contact": "The LinkedIn URL for the contact",
|
||||
"A brief description of the contact": "A brief description of the contact",
|
||||
"Any other important info for the contact": "Any other important info for the contact",
|
||||
"Personal interests for the contact": "Personal interests for the contact",
|
||||
"The method in which this contact was acquired": "The method in which this contact was acquired",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")",
|
||||
"A unique identifier for this contact in an external system": "A unique identifier for this contact in an external system",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "The main body of the note (e.g., call summary, meeting notes, client interaction details)",
|
||||
"Select the contact to link this note to": "Select the contact to link this note to",
|
||||
"Select who can view this note": "Select who can view this note",
|
||||
"Select tags to associate with this note": "Select tags to associate with this note",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")",
|
||||
"A detailed explanation of the project goals and scope": "A detailed explanation of the project goals and scope",
|
||||
"Select the user who will be responsible for organizing this project": "Select the user who will be responsible for organizing this project",
|
||||
"Select who can view this project": "Select who can view this project",
|
||||
"Add custom fields to this project": "Add custom fields to this project",
|
||||
"Select the household that will receive the new member": "Select the household that will receive the new member",
|
||||
"Select the contact to add to the household": "Select the contact to add to the household",
|
||||
"The household title to assign to the added contact": "The household title to assign to the added contact",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")",
|
||||
"Select the contact who will be the head of this household": "Select the contact who will be the head of this household",
|
||||
"Select the spouse or partner to automatically add to this household": "Select the spouse or partner to automatically add to this household",
|
||||
"Primary email address for the household": "Primary email address for the household",
|
||||
"City for the household address": "City for the household address",
|
||||
"State or province for the household address": "State or province for the household address",
|
||||
"ZIP or postal code for the household address": "ZIP or postal code for the household address",
|
||||
"Country for the household address": "Country for the household address",
|
||||
"Primary phone number for the household": "Primary phone number for the household",
|
||||
"The type of household being created": "The type of household being created",
|
||||
"Whether the household is currently active": "Whether the household is currently active",
|
||||
"Background information about the household": "Background information about the household",
|
||||
"Any important information about the household": "Any important information about the household",
|
||||
"Select tags to associate with this household": "Select tags to associate with this household",
|
||||
"Select who can view this household": "Select who can view this household",
|
||||
"A unique identifier for this household in an external system": "A unique identifier for this household in an external system",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "When the event starts (yyyy-mm-dd hh:mm format)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "When the event ends (yyyy-mm-dd hh:mm format)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")",
|
||||
"A detailed explanation of the event purpose and agenda": "A detailed explanation of the event purpose and agenda",
|
||||
"Check if this is an all-day event": "Check if this is an all-day event",
|
||||
"Check if this event repeats": "Check if this event repeats",
|
||||
"The current state of the event": "The current state of the event",
|
||||
"Select the contact to link this event to": "Select the contact to link this event to",
|
||||
"Add people to invite to this event": "Add people to invite to this event",
|
||||
"Select the category for this event": "Select the category for this event",
|
||||
"Send email invitations to invitees": "Send email invitations to invitees",
|
||||
"Select who can view this event": "Select who can view this event",
|
||||
"Add custom fields to this event": "Add custom fields to this event",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")",
|
||||
"When the opportunity should close": "When the opportunity should close",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "The chance the opportunity will close, as a percentage (0-100)",
|
||||
"The monetary value of the opportunity": "The monetary value of the opportunity",
|
||||
"The currency for the opportunity amount": "The currency for the opportunity amount",
|
||||
"The type of amount this represents": "The type of amount this represents",
|
||||
"Select the current stage of this opportunity": "Select the current stage of this opportunity",
|
||||
"Select the contact linked to this opportunity": "Select the contact linked to this opportunity",
|
||||
"A detailed explanation of the opportunity": "A detailed explanation of the opportunity",
|
||||
"Select the user designated as manager of this opportunity": "Select the user designated as manager of this opportunity",
|
||||
"Select who can view this opportunity": "Select who can view this opportunity",
|
||||
"Add custom fields to this opportunity": "Add custom fields to this opportunity",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")",
|
||||
"When the task is due": "When the task is due",
|
||||
"Select the user who the task is assigned to": "Select the user who the task is assigned to",
|
||||
"A detailed explanation of the task": "A detailed explanation of the task",
|
||||
"The priority level of the task": "The priority level of the task",
|
||||
"Check if the task should be created as already completed": "Check if the task should be created as already completed",
|
||||
"What type of record to link this task to": "What type of record to link this task to",
|
||||
"Select the record to link this task to": "Select the record to link this task to",
|
||||
"Select the category this task belongs to": "Select the category this task belongs to",
|
||||
"Select who can view this task": "Select who can view this task",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")",
|
||||
"Add custom fields to this task": "Add custom fields to this task",
|
||||
"Select the workflow template to trigger": "Select the workflow template to trigger",
|
||||
"What type of record to link this workflow to": "What type of record to link this workflow to",
|
||||
"Select the record to link this workflow to": "Select the record to link this workflow to",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "A short name for the workflow (e.g., \"Onboard a new client to the firm\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "When you want the workflow to start (optional, defaults to now)",
|
||||
"Select who can view this workflow": "Select who can view this workflow",
|
||||
"Add milestones to this workflow": "Add milestones to this workflow",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)",
|
||||
"Search by email address": "Search by email address",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "Search by phone number (delimiters like -, (), will be stripped automatically)",
|
||||
"Search by specific contact ID (most precise search)": "Search by specific contact ID (most precise search)",
|
||||
"Search by external unique identifier": "Search by external unique identifier",
|
||||
"Filter by contact type": "Filter by contact type",
|
||||
"Filter by entity type": "Filter by entity type",
|
||||
"Filter by household title (only applies to household members)": "Filter by household title (only applies to household members)",
|
||||
"Filter contacts by tags": "Filter contacts by tags",
|
||||
"Filter by active status": "Filter by active status",
|
||||
"Include contacts that have been deleted": "Include contacts that have been deleted",
|
||||
"Only return contacts updated on or after this date/time": "Only return contacts updated on or after this date/time",
|
||||
"Only return contacts updated on or before this date/time": "Only return contacts updated on or before this date/time",
|
||||
"How to order the results": "How to order the results",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "Maximum number of contacts to return (default: 50, max: 1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "If checked, returns only the first matching contact. If unchecked, returns all matching contacts.",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "Search for a specific task by its unique ID. Leave empty to search using filters.",
|
||||
"Filter tasks by the type of resource they are linked to": "Filter tasks by the type of resource they are linked to",
|
||||
"Select the specific resource to filter tasks by": "Select the specific resource to filter tasks by",
|
||||
"Filter tasks by the user they are assigned to": "Filter tasks by the user they are assigned to",
|
||||
"Filter tasks by the team they are assigned to": "Filter tasks by the team they are assigned to",
|
||||
"Filter tasks by the user who created them": "Filter tasks by the user who created them",
|
||||
"Filter by task completion status": "Filter by task completion status",
|
||||
"Filter by task type": "Filter by task type",
|
||||
"Only return tasks updated on or after this date/time": "Only return tasks updated on or after this date/time",
|
||||
"Only return tasks updated on or before this date/time": "Only return tasks updated on or before this date/time",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "Maximum number of tasks to return (default: 50, max: 1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "If checked, returns only the first matching task. If unchecked, returns all matching tasks.",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Trust": "Trust",
|
||||
"Client": "Client",
|
||||
"Past Client": "Past Client",
|
||||
"Prospect": "Prospect",
|
||||
"Vendor": "Vendor",
|
||||
"Active": "Active",
|
||||
"Inactive": "Inactive",
|
||||
"Female": "Female",
|
||||
"Male": "Male",
|
||||
"Non-binary": "Non-binary",
|
||||
"Unknown": "Unknown",
|
||||
"Married": "Married",
|
||||
"Single": "Single",
|
||||
"Divorced": "Divorced",
|
||||
"Widowed": "Widowed",
|
||||
"Life Partner": "Life Partner",
|
||||
"Separated": "Separated",
|
||||
"Referral": "Referral",
|
||||
"Conference": "Conference",
|
||||
"Direct Mail": "Direct Mail",
|
||||
"Cold Call": "Cold Call",
|
||||
"Other": "Other",
|
||||
"Head": "Head",
|
||||
"Spouse": "Spouse",
|
||||
"Partner": "Partner",
|
||||
"Child": "Child",
|
||||
"Grandchild": "Grandchild",
|
||||
"Parent": "Parent",
|
||||
"Grandparent": "Grandparent",
|
||||
"Sibling": "Sibling",
|
||||
"Dependent": "Dependent",
|
||||
"Unconfirmed": "Unconfirmed",
|
||||
"Confirmed": "Confirmed",
|
||||
"Tentative": "Tentative",
|
||||
"Completed": "Completed",
|
||||
"Cancelled": "Cancelled",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP (£)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "AUD (A$)",
|
||||
"Fee": "Fee",
|
||||
"Commission": "Commission",
|
||||
"AUM": "AUM",
|
||||
"Low": "Low",
|
||||
"Medium": "Medium",
|
||||
"High": "High",
|
||||
"Project": "Project",
|
||||
"Opportunity": "Opportunity",
|
||||
"Active Only": "Active Only",
|
||||
"Inactive Only": "Inactive Only",
|
||||
"All Contacts": "All Contacts",
|
||||
"Recent (newest first)": "Recent (newest first)",
|
||||
"Created Date (newest first)": "Created Date (newest first)",
|
||||
"Updated Date (newest first)": "Updated Date (newest first)",
|
||||
"Ascending": "Ascending",
|
||||
"Descending": "Descending",
|
||||
"All Tasks": "All Tasks",
|
||||
"Completed Only": "Completed Only",
|
||||
"Incomplete Only": "Incomplete Only",
|
||||
"Parent Tasks Only": "Parent Tasks Only",
|
||||
"Subtasks Only": "Subtasks Only",
|
||||
"New Task": "New Task",
|
||||
"New Contact": "New Contact",
|
||||
"New Event": "New Event",
|
||||
"New Opportunity": "New Opportunity",
|
||||
"Fires when a new task is created": "Fires when a new task is created",
|
||||
"Fires when a new contact is created": "Fires when a new contact is created",
|
||||
"Fires when a new event is created": "Fires when a new event is created",
|
||||
"Fires when a new opportunity is created": "Fires when a new opportunity is created",
|
||||
"Assigned To Team ID": "Assigned To Team ID",
|
||||
"Entity Type": "Entity Type",
|
||||
"Start Date Minimum": "Start Date Minimum",
|
||||
"Start Date Maximum": "Start Date Maximum",
|
||||
"Opportunity Stage": "Opportunity Stage",
|
||||
"Include Closed Opportunities": "Include Closed Opportunities",
|
||||
"Minimum Probability (%)": "Minimum Probability (%)",
|
||||
"Maximum Probability (%)": "Maximum Probability (%)",
|
||||
"Target Close After": "Target Close After",
|
||||
"Target Close Before": "Target Close Before",
|
||||
"Only trigger for tasks assigned to this user (optional)": "Only trigger for tasks assigned to this user (optional)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "Only trigger for tasks assigned to this team (optional)",
|
||||
"Only trigger for tasks created by this user (optional)": "Only trigger for tasks created by this user (optional)",
|
||||
"Type of tasks to monitor": "Type of tasks to monitor",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "Only trigger for tasks linked to this type of resource (optional)",
|
||||
"Only trigger for contacts of this type (optional)": "Only trigger for contacts of this type (optional)",
|
||||
"Only trigger for contacts of this entity type (optional)": "Only trigger for contacts of this entity type (optional)",
|
||||
"Only trigger for contacts with this household title (optional)": "Only trigger for contacts with this household title (optional)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "Only trigger for contacts assigned to this user (optional)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "Only trigger for contacts with one of these tags (optional)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "Only trigger for events linked to this type of resource (optional)",
|
||||
"Select the specific resource to filter events by": "Select the specific resource to filter events by",
|
||||
"Only trigger for events of this category (optional)": "Only trigger for events of this category (optional)",
|
||||
"Only trigger for events starting on or after this date/time": "Only trigger for events starting on or after this date/time",
|
||||
"Only trigger for events starting on or before this date/time": "Only trigger for events starting on or before this date/time",
|
||||
"How to order the events": "How to order the events",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "Only trigger for opportunities linked to this type of resource (optional)",
|
||||
"Select the specific resource to filter opportunities by": "Select the specific resource to filter opportunities by",
|
||||
"Only trigger for opportunities in this stage (optional)": "Only trigger for opportunities in this stage (optional)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "Only trigger for opportunities managed by this user (optional)",
|
||||
"Include won and lost opportunities in results": "Include won and lost opportunities in results",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "Only trigger for opportunities with probability at or above this percentage (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "Only trigger for opportunities with probability at or below this percentage (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "Only trigger for opportunities with target close date on or after this date/time",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "Only trigger for opportunities with target close date on or before this date/time",
|
||||
"Start Date (ascending)": "Start Date (ascending)",
|
||||
"Start Date (descending)": "Start Date (descending)"
|
||||
}
|
||||
@@ -0,0 +1,360 @@
|
||||
{
|
||||
"Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.": "Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.",
|
||||
"Create Contact": "Create Contact",
|
||||
"Create Note": "Create Note",
|
||||
"Create Project": "Create Project",
|
||||
"Add Member to Household": "Add Member to Household",
|
||||
"Create Household": "Create Household",
|
||||
"Create Event": "Create Event",
|
||||
"Create Opportunity": "Create Opportunity",
|
||||
"Create Task": "Create Task",
|
||||
"Start Workflow": "Start Workflow",
|
||||
"Find Contact": "Find Contact",
|
||||
"Find Task": "Find Task",
|
||||
"Adds a new contact with rich details (name, address, email, tags, etc.)": "Adds a new contact with rich details (name, address, email, tags, etc.)",
|
||||
"Adds a note linked to a contact. Log call summaries against client records.": "Adds a note linked to a contact. Log call summaries against client records.",
|
||||
"Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.": "Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.",
|
||||
"Adds a member to an existing household. Link multiple contacts under one family unit.": "Adds a member to an existing household. Link multiple contacts under one family unit.",
|
||||
"Creates a household record with emails, tags. Group family member contacts into one household.": "Creates a household record with emails, tags. Group family member contacts into one household.",
|
||||
"Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.": "Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.",
|
||||
"Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.": "Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.",
|
||||
"Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.": "Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.",
|
||||
"Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.": "Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.",
|
||||
"Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.": "Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.",
|
||||
"Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.": "Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "名字",
|
||||
"Prefix": "Prefix",
|
||||
"Middle Name": "Middle Name",
|
||||
"Suffix": "Suffix",
|
||||
"Nickname": "Nickname",
|
||||
"Job Title": "Job Title",
|
||||
"Company Name": "Company Name",
|
||||
"Contact Type": "Contact Type",
|
||||
"Contact Classification": "Contact Classification",
|
||||
"Status": "状态",
|
||||
"Gender": "Gender",
|
||||
"Birth Date": "Birth Date",
|
||||
"Marital Status": "Marital Status",
|
||||
"Email Address": "Email Address",
|
||||
"Phone Number": "Phone Number",
|
||||
"Street Address Line 1": "Street Address Line 1",
|
||||
"Street Address Line 2": "Street Address Line 2",
|
||||
"City": "City",
|
||||
"State": "State",
|
||||
"ZIP Code": "ZIP Code",
|
||||
"Country": "Country",
|
||||
"Twitter Handle": "Twitter Handle",
|
||||
"LinkedIn URL": "LinkedIn URL",
|
||||
"Background Information": "Background Information",
|
||||
"Important Information": "Important Information",
|
||||
"Personal Interests": "Personal Interests",
|
||||
"Contact Source": "Contact Source",
|
||||
"Tags": "标签",
|
||||
"External Unique ID": "External Unique ID",
|
||||
"Note Content": "Note Content",
|
||||
"Contact": "Contact",
|
||||
"Visible To": "Visible To",
|
||||
"Project Name": "项目名称",
|
||||
"Project Description": "Project Description",
|
||||
"Organizer": "Organizer",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Household": "Household",
|
||||
"Household Title": "Household Title",
|
||||
"Household Name": "Household Name",
|
||||
"Head of Household": "Head of Household",
|
||||
"Spouse/Partner (Optional)": "Spouse/Partner (Optional)",
|
||||
"Primary Email Address": "Primary Email Address",
|
||||
"Primary Phone Number": "Primary Phone Number",
|
||||
"Household Type": "Household Type",
|
||||
"Event Title": "Event Title",
|
||||
"Start Date & Time": "Start Date & Time",
|
||||
"End Date & Time": "End Date & Time",
|
||||
"Location": "Location",
|
||||
"Description": "描述",
|
||||
"All Day Event": "All Day Event",
|
||||
"Repeating Event": "Repeating Event",
|
||||
"Event Status": "Event Status",
|
||||
"Linked Contact": "Linked Contact",
|
||||
"Invitees": "Invitees",
|
||||
"Event Category": "Event Category",
|
||||
"Email Invitees": "Email Invitees",
|
||||
"Opportunity Name": "Opportunity Name",
|
||||
"Target Close Date": "Target Close Date",
|
||||
"Probability (%)": "Probability (%)",
|
||||
"Amount": "Amount",
|
||||
"Currency": "Currency",
|
||||
"Amount Type": "Amount Type",
|
||||
"Stage": "Stage",
|
||||
"Opportunity Manager": "Opportunity Manager",
|
||||
"Task Name": "Task Name",
|
||||
"Due Date": "Due Date",
|
||||
"Assigned To": "Assigned To",
|
||||
"Priority": "Priority",
|
||||
"Mark as Complete": "Mark as Complete",
|
||||
"Link To": "Link To",
|
||||
"Linked Record": "Linked Record",
|
||||
"Category": "Category",
|
||||
"Due Later": "Due Later",
|
||||
"Workflow Template": "Workflow Template",
|
||||
"Workflow Label": "Workflow Label",
|
||||
"Workflow Milestones": "Workflow Milestones",
|
||||
"Name": "名称",
|
||||
"Contact ID": "Contact ID",
|
||||
"Contact Entity Type": "Contact Entity Type",
|
||||
"Tags Filter": "Tags Filter",
|
||||
"Active Status": "Active Status",
|
||||
"Include Deleted Contacts": "Include Deleted Contacts",
|
||||
"Updated Since": "Updated Since",
|
||||
"Updated Before": "Updated Before",
|
||||
"Sort Order": "Sort Order",
|
||||
"Result Limit": "Result Limit",
|
||||
"Return Single Result Only": "Return Single Result Only",
|
||||
"Task ID (Optional)": "Task ID (Optional)",
|
||||
"Linked Resource Type": "Linked Resource Type",
|
||||
"Linked Resource": "Linked Resource",
|
||||
"Assigned to Team ID": "Assigned to Team ID",
|
||||
"Created By": "Created By",
|
||||
"Completion Status": "Completion Status",
|
||||
"Task Type": "Task Type",
|
||||
"The first name of the contact": "The first name of the contact",
|
||||
"The last name of the contact": "The last name of the contact",
|
||||
"The preferred prefix for the contact (e.g., Mr., Ms., Dr.)": "The preferred prefix for the contact (e.g., Mr., Ms., Dr.)",
|
||||
"The middle name of the contact": "The middle name of the contact",
|
||||
"The suffix associated with the contact (e.g., Jr., Sr., M.D.)": "The suffix associated with the contact (e.g., Jr., Sr., M.D.)",
|
||||
"A preferred shortname for the contact": "A preferred shortname for the contact",
|
||||
"The title the contact holds at their present company": "The title the contact holds at their present company",
|
||||
"The name of the contact's present company": "The name of the contact's present company",
|
||||
"The type of the contact being created": "The type of the contact being created",
|
||||
"A string further classifying the contact": "A string further classifying the contact",
|
||||
"Whether the contact is currently active": "Whether the contact is currently active",
|
||||
"The gender of the contact": "The gender of the contact",
|
||||
"The birthdate of the contact (YYYY-MM-DD format)": "The birthdate of the contact (YYYY-MM-DD format)",
|
||||
"The marital status of the contact": "The marital status of the contact",
|
||||
"Primary email address for the contact": "Primary email address for the contact",
|
||||
"Primary phone number for the contact (e.g., (555) 123-4567)": "Primary phone number for the contact (e.g., (555) 123-4567)",
|
||||
"First line of street address": "First line of street address",
|
||||
"Second line of street address (apt, suite, etc.)": "Second line of street address (apt, suite, etc.)",
|
||||
"City for the address": "City for the address",
|
||||
"State or province for the address": "State or province for the address",
|
||||
"ZIP or postal code for the address": "ZIP or postal code for the address",
|
||||
"Country for the address": "Country for the address",
|
||||
"The twitter handle of the contact": "The twitter handle of the contact",
|
||||
"The LinkedIn URL for the contact": "The LinkedIn URL for the contact",
|
||||
"A brief description of the contact": "A brief description of the contact",
|
||||
"Any other important info for the contact": "Any other important info for the contact",
|
||||
"Personal interests for the contact": "Personal interests for the contact",
|
||||
"The method in which this contact was acquired": "The method in which this contact was acquired",
|
||||
"Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")": "Tags to associate with the contact (e.g., \"Client\", \"VIP\", \"Referral\")",
|
||||
"A unique identifier for this contact in an external system": "A unique identifier for this contact in an external system",
|
||||
"The main body of the note (e.g., call summary, meeting notes, client interaction details)": "The main body of the note (e.g., call summary, meeting notes, client interaction details)",
|
||||
"Select the contact to link this note to": "Select the contact to link this note to",
|
||||
"Select who can view this note": "Select who can view this note",
|
||||
"Select tags to associate with this note": "Select tags to associate with this note",
|
||||
"The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")": "The name of the project (e.g., \"Client Onboarding\", \"Q1 Review Process\")",
|
||||
"A detailed explanation of the project goals and scope": "A detailed explanation of the project goals and scope",
|
||||
"Select the user who will be responsible for organizing this project": "Select the user who will be responsible for organizing this project",
|
||||
"Select who can view this project": "Select who can view this project",
|
||||
"Add custom fields to this project": "Add custom fields to this project",
|
||||
"Select the household that will receive the new member": "Select the household that will receive the new member",
|
||||
"Select the contact to add to the household": "Select the contact to add to the household",
|
||||
"The household title to assign to the added contact": "The household title to assign to the added contact",
|
||||
"The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")": "The name of the household (e.g., \"The Anderson Family\", \"Smith Household\")",
|
||||
"Select the contact who will be the head of this household": "Select the contact who will be the head of this household",
|
||||
"Select the spouse or partner to automatically add to this household": "Select the spouse or partner to automatically add to this household",
|
||||
"Primary email address for the household": "Primary email address for the household",
|
||||
"City for the household address": "City for the household address",
|
||||
"State or province for the household address": "State or province for the household address",
|
||||
"ZIP or postal code for the household address": "ZIP or postal code for the household address",
|
||||
"Country for the household address": "Country for the household address",
|
||||
"Primary phone number for the household": "Primary phone number for the household",
|
||||
"The type of household being created": "The type of household being created",
|
||||
"Whether the household is currently active": "Whether the household is currently active",
|
||||
"Background information about the household": "Background information about the household",
|
||||
"Any important information about the household": "Any important information about the household",
|
||||
"Select tags to associate with this household": "Select tags to associate with this household",
|
||||
"Select who can view this household": "Select who can view this household",
|
||||
"A unique identifier for this household in an external system": "A unique identifier for this household in an external system",
|
||||
"The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")": "The name of the event (e.g., \"Client Meeting\", \"Portfolio Review\")",
|
||||
"When the event starts (yyyy-mm-dd hh:mm format)": "When the event starts (yyyy-mm-dd hh:mm format)",
|
||||
"When the event ends (yyyy-mm-dd hh:mm format)": "When the event ends (yyyy-mm-dd hh:mm format)",
|
||||
"Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")": "Where the event takes place (e.g., \"Conference Room\", \"Client Office\", \"Zoom Meeting\")",
|
||||
"A detailed explanation of the event purpose and agenda": "A detailed explanation of the event purpose and agenda",
|
||||
"Check if this is an all-day event": "Check if this is an all-day event",
|
||||
"Check if this event repeats": "Check if this event repeats",
|
||||
"The current state of the event": "The current state of the event",
|
||||
"Select the contact to link this event to": "Select the contact to link this event to",
|
||||
"Add people to invite to this event": "Add people to invite to this event",
|
||||
"Select the category for this event": "Select the category for this event",
|
||||
"Send email invitations to invitees": "Send email invitations to invitees",
|
||||
"Select who can view this event": "Select who can view this event",
|
||||
"Add custom fields to this event": "Add custom fields to this event",
|
||||
"The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")": "The name of the opportunity (e.g., \"Financial Plan\", \"Investment Advisory\", \"Estate Planning\")",
|
||||
"When the opportunity should close": "When the opportunity should close",
|
||||
"The chance the opportunity will close, as a percentage (0-100)": "The chance the opportunity will close, as a percentage (0-100)",
|
||||
"The monetary value of the opportunity": "The monetary value of the opportunity",
|
||||
"The currency for the opportunity amount": "The currency for the opportunity amount",
|
||||
"The type of amount this represents": "The type of amount this represents",
|
||||
"Select the current stage of this opportunity": "Select the current stage of this opportunity",
|
||||
"Select the contact linked to this opportunity": "Select the contact linked to this opportunity",
|
||||
"A detailed explanation of the opportunity": "A detailed explanation of the opportunity",
|
||||
"Select the user designated as manager of this opportunity": "Select the user designated as manager of this opportunity",
|
||||
"Select who can view this opportunity": "Select who can view this opportunity",
|
||||
"Add custom fields to this opportunity": "Add custom fields to this opportunity",
|
||||
"The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")": "The name of the task (e.g., \"Return Bill's call\", \"Follow up on proposal\")",
|
||||
"When the task is due": "When the task is due",
|
||||
"Select the user who the task is assigned to": "Select the user who the task is assigned to",
|
||||
"A detailed explanation of the task": "A detailed explanation of the task",
|
||||
"The priority level of the task": "The priority level of the task",
|
||||
"Check if the task should be created as already completed": "Check if the task should be created as already completed",
|
||||
"What type of record to link this task to": "What type of record to link this task to",
|
||||
"Select the record to link this task to": "Select the record to link this task to",
|
||||
"Select the category this task belongs to": "Select the category this task belongs to",
|
||||
"Select who can view this task": "Select who can view this task",
|
||||
"Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")": "Interval for when this task is due after start (e.g., \"2 days later at 5:00 PM\")",
|
||||
"Add custom fields to this task": "Add custom fields to this task",
|
||||
"Select the workflow template to trigger": "Select the workflow template to trigger",
|
||||
"What type of record to link this workflow to": "What type of record to link this workflow to",
|
||||
"Select the record to link this workflow to": "Select the record to link this workflow to",
|
||||
"A short name for the workflow (e.g., \"Onboard a new client to the firm\")": "A short name for the workflow (e.g., \"Onboard a new client to the firm\")",
|
||||
"When you want the workflow to start (optional, defaults to now)": "When you want the workflow to start (optional, defaults to now)",
|
||||
"Select who can view this workflow": "Select who can view this workflow",
|
||||
"Add milestones to this workflow": "Add milestones to this workflow",
|
||||
"Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)": "Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)",
|
||||
"Search by email address": "Search by email address",
|
||||
"Search by phone number (delimiters like -, (), will be stripped automatically)": "Search by phone number (delimiters like -, (), will be stripped automatically)",
|
||||
"Search by specific contact ID (most precise search)": "Search by specific contact ID (most precise search)",
|
||||
"Search by external unique identifier": "Search by external unique identifier",
|
||||
"Filter by contact type": "Filter by contact type",
|
||||
"Filter by entity type": "Filter by entity type",
|
||||
"Filter by household title (only applies to household members)": "Filter by household title (only applies to household members)",
|
||||
"Filter contacts by tags": "Filter contacts by tags",
|
||||
"Filter by active status": "Filter by active status",
|
||||
"Include contacts that have been deleted": "Include contacts that have been deleted",
|
||||
"Only return contacts updated on or after this date/time": "Only return contacts updated on or after this date/time",
|
||||
"Only return contacts updated on or before this date/time": "Only return contacts updated on or before this date/time",
|
||||
"How to order the results": "How to order the results",
|
||||
"Maximum number of contacts to return (default: 50, max: 1000)": "Maximum number of contacts to return (default: 50, max: 1000)",
|
||||
"If checked, returns only the first matching contact. If unchecked, returns all matching contacts.": "If checked, returns only the first matching contact. If unchecked, returns all matching contacts.",
|
||||
"Search for a specific task by its unique ID. Leave empty to search using filters.": "Search for a specific task by its unique ID. Leave empty to search using filters.",
|
||||
"Filter tasks by the type of resource they are linked to": "Filter tasks by the type of resource they are linked to",
|
||||
"Select the specific resource to filter tasks by": "Select the specific resource to filter tasks by",
|
||||
"Filter tasks by the user they are assigned to": "Filter tasks by the user they are assigned to",
|
||||
"Filter tasks by the team they are assigned to": "Filter tasks by the team they are assigned to",
|
||||
"Filter tasks by the user who created them": "Filter tasks by the user who created them",
|
||||
"Filter by task completion status": "Filter by task completion status",
|
||||
"Filter by task type": "Filter by task type",
|
||||
"Only return tasks updated on or after this date/time": "Only return tasks updated on or after this date/time",
|
||||
"Only return tasks updated on or before this date/time": "Only return tasks updated on or before this date/time",
|
||||
"Maximum number of tasks to return (default: 50, max: 1000)": "Maximum number of tasks to return (default: 50, max: 1000)",
|
||||
"If checked, returns only the first matching task. If unchecked, returns all matching tasks.": "If checked, returns only the first matching task. If unchecked, returns all matching tasks.",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Trust": "Trust",
|
||||
"Client": "Client",
|
||||
"Past Client": "Past Client",
|
||||
"Prospect": "Prospect",
|
||||
"Vendor": "Vendor",
|
||||
"Active": "使用中",
|
||||
"Inactive": "Inactive",
|
||||
"Female": "Female",
|
||||
"Male": "Male",
|
||||
"Non-binary": "Non-binary",
|
||||
"Unknown": "未知的",
|
||||
"Married": "Married",
|
||||
"Single": "Single",
|
||||
"Divorced": "Divorced",
|
||||
"Widowed": "Widowed",
|
||||
"Life Partner": "Life Partner",
|
||||
"Separated": "Separated",
|
||||
"Referral": "Referral",
|
||||
"Conference": "Conference",
|
||||
"Direct Mail": "Direct Mail",
|
||||
"Cold Call": "Cold Call",
|
||||
"Other": "Other",
|
||||
"Head": "Head",
|
||||
"Spouse": "Spouse",
|
||||
"Partner": "Partner",
|
||||
"Child": "Child",
|
||||
"Grandchild": "Grandchild",
|
||||
"Parent": "Parent",
|
||||
"Grandparent": "Grandparent",
|
||||
"Sibling": "Sibling",
|
||||
"Dependent": "Dependent",
|
||||
"Unconfirmed": "Unconfirmed",
|
||||
"Confirmed": "Confirmed",
|
||||
"Tentative": "Tentative",
|
||||
"Completed": "Completed",
|
||||
"Cancelled": "Cancelled",
|
||||
"USD ($)": "USD ($)",
|
||||
"EUR (€)": "EUR (€)",
|
||||
"GBP (£)": "GBP (£)",
|
||||
"CAD (C$)": "CAD (C$)",
|
||||
"AUD (A$)": "AUD (A$)",
|
||||
"Fee": "Fee",
|
||||
"Commission": "Commission",
|
||||
"AUM": "AUM",
|
||||
"Low": "Low",
|
||||
"Medium": "Medium",
|
||||
"High": "High",
|
||||
"Project": "项目",
|
||||
"Opportunity": "Opportunity",
|
||||
"Active Only": "Active Only",
|
||||
"Inactive Only": "Inactive Only",
|
||||
"All Contacts": "All Contacts",
|
||||
"Recent (newest first)": "Recent (newest first)",
|
||||
"Created Date (newest first)": "Created Date (newest first)",
|
||||
"Updated Date (newest first)": "Updated Date (newest first)",
|
||||
"Ascending": "升序",
|
||||
"Descending": "降序",
|
||||
"All Tasks": "All Tasks",
|
||||
"Completed Only": "Completed Only",
|
||||
"Incomplete Only": "Incomplete Only",
|
||||
"Parent Tasks Only": "Parent Tasks Only",
|
||||
"Subtasks Only": "Subtasks Only",
|
||||
"New Task": "New Task",
|
||||
"New Contact": "New Contact",
|
||||
"New Event": "New Event",
|
||||
"New Opportunity": "New Opportunity",
|
||||
"Fires when a new task is created": "Fires when a new task is created",
|
||||
"Fires when a new contact is created": "Fires when a new contact is created",
|
||||
"Fires when a new event is created": "Fires when a new event is created",
|
||||
"Fires when a new opportunity is created": "Fires when a new opportunity is created",
|
||||
"Assigned To Team ID": "Assigned To Team ID",
|
||||
"Entity Type": "Entity Type",
|
||||
"Start Date Minimum": "Start Date Minimum",
|
||||
"Start Date Maximum": "Start Date Maximum",
|
||||
"Opportunity Stage": "Opportunity Stage",
|
||||
"Include Closed Opportunities": "Include Closed Opportunities",
|
||||
"Minimum Probability (%)": "Minimum Probability (%)",
|
||||
"Maximum Probability (%)": "Maximum Probability (%)",
|
||||
"Target Close After": "Target Close After",
|
||||
"Target Close Before": "Target Close Before",
|
||||
"Only trigger for tasks assigned to this user (optional)": "Only trigger for tasks assigned to this user (optional)",
|
||||
"Only trigger for tasks assigned to this team (optional)": "Only trigger for tasks assigned to this team (optional)",
|
||||
"Only trigger for tasks created by this user (optional)": "Only trigger for tasks created by this user (optional)",
|
||||
"Type of tasks to monitor": "Type of tasks to monitor",
|
||||
"Only trigger for tasks linked to this type of resource (optional)": "Only trigger for tasks linked to this type of resource (optional)",
|
||||
"Only trigger for contacts of this type (optional)": "Only trigger for contacts of this type (optional)",
|
||||
"Only trigger for contacts of this entity type (optional)": "Only trigger for contacts of this entity type (optional)",
|
||||
"Only trigger for contacts with this household title (optional)": "Only trigger for contacts with this household title (optional)",
|
||||
"Only trigger for contacts assigned to this user (optional)": "Only trigger for contacts assigned to this user (optional)",
|
||||
"Only trigger for contacts with one of these tags (optional)": "Only trigger for contacts with one of these tags (optional)",
|
||||
"Only trigger for events linked to this type of resource (optional)": "Only trigger for events linked to this type of resource (optional)",
|
||||
"Select the specific resource to filter events by": "Select the specific resource to filter events by",
|
||||
"Only trigger for events of this category (optional)": "Only trigger for events of this category (optional)",
|
||||
"Only trigger for events starting on or after this date/time": "Only trigger for events starting on or after this date/time",
|
||||
"Only trigger for events starting on or before this date/time": "Only trigger for events starting on or before this date/time",
|
||||
"How to order the events": "How to order the events",
|
||||
"Only trigger for opportunities linked to this type of resource (optional)": "Only trigger for opportunities linked to this type of resource (optional)",
|
||||
"Select the specific resource to filter opportunities by": "Select the specific resource to filter opportunities by",
|
||||
"Only trigger for opportunities in this stage (optional)": "Only trigger for opportunities in this stage (optional)",
|
||||
"Only trigger for opportunities managed by this user (optional)": "Only trigger for opportunities managed by this user (optional)",
|
||||
"Include won and lost opportunities in results": "Include won and lost opportunities in results",
|
||||
"Only trigger for opportunities with probability at or above this percentage (0-100)": "Only trigger for opportunities with probability at or above this percentage (0-100)",
|
||||
"Only trigger for opportunities with probability at or below this percentage (0-100)": "Only trigger for opportunities with probability at or below this percentage (0-100)",
|
||||
"Only trigger for opportunities with target close date on or after this date/time": "Only trigger for opportunities with target close date on or after this date/time",
|
||||
"Only trigger for opportunities with target close date on or before this date/time": "Only trigger for opportunities with target close date on or before this date/time",
|
||||
"Start Date (ascending)": "Start Date (ascending)",
|
||||
"Start Date (descending)": "Start Date (descending)"
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
createContact,
|
||||
createNote,
|
||||
createProject,
|
||||
addHouseholdMember,
|
||||
createHousehold,
|
||||
createEvent,
|
||||
createOpportunity,
|
||||
createTask,
|
||||
startWorkflow,
|
||||
findContact,
|
||||
findTask
|
||||
} from './lib/actions';
|
||||
import {
|
||||
newTask,
|
||||
newContact,
|
||||
newEvent,
|
||||
newOpportunity
|
||||
} from './lib/triggers';
|
||||
|
||||
export const wealthboxAuth = PieceAuth.SecretText({
|
||||
displayName: 'API Access Token',
|
||||
description: 'Enter your Wealthbox API access token. Get it from Settings → API Access Tokens in your Wealthbox account.',
|
||||
required: true,
|
||||
});
|
||||
export const wealthbox = createPiece({
|
||||
displayName: "Wealthbox",
|
||||
auth: wealthboxAuth,
|
||||
minimumSupportedRelease: '0.36.1',
|
||||
logoUrl: "https://cdn.activepieces.com/pieces/wealthbox.png",
|
||||
authors: ["fortunamide", "onyedikachi-david"],
|
||||
actions: [
|
||||
createContact,
|
||||
createNote,
|
||||
createProject,
|
||||
addHouseholdMember,
|
||||
createHousehold,
|
||||
createEvent,
|
||||
createOpportunity,
|
||||
createTask,
|
||||
startWorkflow,
|
||||
findContact,
|
||||
findTask
|
||||
],
|
||||
triggers: [
|
||||
newTask,
|
||||
newContact,
|
||||
newEvent,
|
||||
newOpportunity
|
||||
],
|
||||
});
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchContacts, fetchHouseholds, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const addHouseholdMember = createAction({
|
||||
name: 'add_household_member',
|
||||
displayName: 'Add Member to Household',
|
||||
description: 'Adds a member to an existing household. Link multiple contacts under one family unit.',
|
||||
auth: wealthboxAuth,
|
||||
props: {
|
||||
household_id: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Household',
|
||||
description: 'Select the household that will receive the new member',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const households = await fetchHouseholds(auth.secret_text);
|
||||
return {
|
||||
options: households.map((household: any) => ({
|
||||
label: household.first_name || `Household ${household.id}`,
|
||||
value: household.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load households. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
contact_id: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Contact',
|
||||
description: 'Select the contact to add to the household',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
return {
|
||||
options: contacts.map((contact: any) => ({
|
||||
label: contact.name || `${contact.first_name} ${contact.last_name}`.trim() || `Contact ${contact.id}`,
|
||||
value: contact.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load contacts. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
title: Property.StaticDropdown({
|
||||
displayName: 'Household Title',
|
||||
description: 'The household title to assign to the added contact',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Head', value: 'Head' },
|
||||
{ label: 'Spouse', value: 'Spouse' },
|
||||
{ label: 'Partner', value: 'Partner' },
|
||||
{ label: 'Child', value: 'Child' },
|
||||
{ label: 'Grandchild', value: 'Grandchild' },
|
||||
{ label: 'Parent', value: 'Parent' },
|
||||
{ label: 'Grandparent', value: 'Grandparent' },
|
||||
{ label: 'Sibling', value: 'Sibling' },
|
||||
{ label: 'Other', value: 'Other' },
|
||||
{ label: 'Dependent', value: 'Dependent' }
|
||||
]
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const requestBody = {
|
||||
id: propsValue.contact_id,
|
||||
title: propsValue.title
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/households/${propsValue.household_id}/members`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('add household member', response.status, response.body);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to add member to household: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,319 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const createContact = createAction({
|
||||
name: 'create_contact',
|
||||
displayName: 'Create Contact',
|
||||
description: 'Adds a new contact with rich details (name, address, email, tags, etc.)',
|
||||
auth: wealthboxAuth,
|
||||
props: {
|
||||
first_name: Property.ShortText({
|
||||
displayName: 'First Name',
|
||||
description: 'The first name of the contact',
|
||||
required: true
|
||||
}),
|
||||
last_name: Property.ShortText({
|
||||
displayName: 'Last Name',
|
||||
description: 'The last name of the contact',
|
||||
required: true
|
||||
}),
|
||||
|
||||
prefix: Property.ShortText({
|
||||
displayName: 'Prefix',
|
||||
description: 'The preferred prefix for the contact (e.g., Mr., Ms., Dr.)',
|
||||
required: false
|
||||
}),
|
||||
middle_name: Property.ShortText({
|
||||
displayName: 'Middle Name',
|
||||
description: 'The middle name of the contact',
|
||||
required: false
|
||||
}),
|
||||
suffix: Property.ShortText({
|
||||
displayName: 'Suffix',
|
||||
description: 'The suffix associated with the contact (e.g., Jr., Sr., M.D.)',
|
||||
required: false
|
||||
}),
|
||||
nickname: Property.ShortText({
|
||||
displayName: 'Nickname',
|
||||
description: 'A preferred shortname for the contact',
|
||||
required: false
|
||||
}),
|
||||
|
||||
job_title: Property.ShortText({
|
||||
displayName: 'Job Title',
|
||||
description: 'The title the contact holds at their present company',
|
||||
required: false
|
||||
}),
|
||||
company_name: Property.ShortText({
|
||||
displayName: 'Company Name',
|
||||
description: 'The name of the contact\'s present company',
|
||||
required: false
|
||||
}),
|
||||
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Contact Type',
|
||||
description: 'The type of the contact being created',
|
||||
required: false,
|
||||
defaultValue: 'Person',
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Person', value: 'Person' },
|
||||
{ label: 'Household', value: 'Household' },
|
||||
{ label: 'Organization', value: 'Organization' },
|
||||
{ label: 'Trust', value: 'Trust' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
contact_type: Property.StaticDropdown({
|
||||
displayName: 'Contact Classification',
|
||||
description: 'A string further classifying the contact',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Client', value: 'Client' },
|
||||
{ label: 'Past Client', value: 'Past Client' },
|
||||
{ label: 'Prospect', value: 'Prospect' },
|
||||
{ label: 'Vendor', value: 'Vendor' },
|
||||
{ label: 'Organization', value: 'Organization' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
description: 'Whether the contact is currently active',
|
||||
required: false,
|
||||
defaultValue: 'Active',
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Active', value: 'Active' },
|
||||
{ label: 'Inactive', value: 'Inactive' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
gender: Property.StaticDropdown({
|
||||
displayName: 'Gender',
|
||||
description: 'The gender of the contact',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Female', value: 'Female' },
|
||||
{ label: 'Male', value: 'Male' },
|
||||
{ label: 'Non-binary', value: 'Non-binary' },
|
||||
{ label: 'Unknown', value: 'Unknown' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
birth_date: Property.DateTime({
|
||||
displayName: 'Birth Date',
|
||||
description: 'The birthdate of the contact (YYYY-MM-DD format)',
|
||||
required: false
|
||||
}),
|
||||
marital_status: Property.StaticDropdown({
|
||||
displayName: 'Marital Status',
|
||||
description: 'The marital status of the contact',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Married', value: 'Married' },
|
||||
{ label: 'Single', value: 'Single' },
|
||||
{ label: 'Divorced', value: 'Divorced' },
|
||||
{ label: 'Widowed', value: 'Widowed' },
|
||||
{ label: 'Life Partner', value: 'Life Partner' },
|
||||
{ label: 'Separated', value: 'Separated' },
|
||||
{ label: 'Unknown', value: 'Unknown' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
email_address: Property.ShortText({
|
||||
displayName: 'Email Address',
|
||||
description: 'Primary email address for the contact',
|
||||
required: false
|
||||
}),
|
||||
phone_number: Property.ShortText({
|
||||
displayName: 'Phone Number',
|
||||
description: 'Primary phone number for the contact (e.g., (555) 123-4567)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
street_line_1: Property.ShortText({
|
||||
displayName: 'Street Address Line 1',
|
||||
description: 'First line of street address',
|
||||
required: false
|
||||
}),
|
||||
street_line_2: Property.ShortText({
|
||||
displayName: 'Street Address Line 2',
|
||||
description: 'Second line of street address (apt, suite, etc.)',
|
||||
required: false
|
||||
}),
|
||||
city: Property.ShortText({
|
||||
displayName: 'City',
|
||||
description: 'City for the address',
|
||||
required: false
|
||||
}),
|
||||
state: Property.ShortText({
|
||||
displayName: 'State',
|
||||
description: 'State or province for the address',
|
||||
required: false
|
||||
}),
|
||||
zip_code: Property.ShortText({
|
||||
displayName: 'ZIP Code',
|
||||
description: 'ZIP or postal code for the address',
|
||||
required: false
|
||||
}),
|
||||
country: Property.ShortText({
|
||||
displayName: 'Country',
|
||||
description: 'Country for the address',
|
||||
required: false,
|
||||
defaultValue: 'United States'
|
||||
}),
|
||||
|
||||
twitter_name: Property.ShortText({
|
||||
displayName: 'Twitter Handle',
|
||||
description: 'The twitter handle of the contact',
|
||||
required: false
|
||||
}),
|
||||
linkedin_url: Property.LongText({
|
||||
displayName: 'LinkedIn URL',
|
||||
description: 'The LinkedIn URL for the contact',
|
||||
required: false
|
||||
}),
|
||||
|
||||
background_information: Property.LongText({
|
||||
displayName: 'Background Information',
|
||||
description: 'A brief description of the contact',
|
||||
required: false
|
||||
}),
|
||||
important_information: Property.LongText({
|
||||
displayName: 'Important Information',
|
||||
description: 'Any other important info for the contact',
|
||||
required: false
|
||||
}),
|
||||
personal_interests: Property.LongText({
|
||||
displayName: 'Personal Interests',
|
||||
description: 'Personal interests for the contact',
|
||||
required: false
|
||||
}),
|
||||
|
||||
contact_source: Property.StaticDropdown({
|
||||
displayName: 'Contact Source',
|
||||
description: 'The method in which this contact was acquired',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Referral', value: 'Referral' },
|
||||
{ label: 'Conference', value: 'Conference' },
|
||||
{ label: 'Direct Mail', value: 'Direct Mail' },
|
||||
{ label: 'Cold Call', value: 'Cold Call' },
|
||||
{ label: 'Other', value: 'Other' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Tags to associate with the contact (e.g., "Client", "VIP", "Referral")',
|
||||
required: false
|
||||
}),
|
||||
|
||||
external_unique_id: Property.ShortText({
|
||||
displayName: 'External Unique ID',
|
||||
description: 'A unique identifier for this contact in an external system',
|
||||
required: false
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const requestBody: any = {};
|
||||
|
||||
if (propsValue.type === 'Household') {
|
||||
if (propsValue.first_name) {
|
||||
requestBody.name = propsValue.first_name;
|
||||
}
|
||||
} else {
|
||||
if (propsValue.first_name) requestBody.first_name = propsValue.first_name;
|
||||
if (propsValue.last_name) requestBody.last_name = propsValue.last_name;
|
||||
}
|
||||
|
||||
if (propsValue.prefix) requestBody.prefix = propsValue.prefix;
|
||||
if (propsValue.middle_name) requestBody.middle_name = propsValue.middle_name;
|
||||
if (propsValue.suffix) requestBody.suffix = propsValue.suffix;
|
||||
if (propsValue.nickname) requestBody.nickname = propsValue.nickname;
|
||||
if (propsValue.job_title) requestBody.job_title = propsValue.job_title;
|
||||
if (propsValue.company_name) requestBody.company_name = propsValue.company_name;
|
||||
if (propsValue.type) requestBody.type = propsValue.type;
|
||||
if (propsValue.contact_type) requestBody.contact_type = propsValue.contact_type;
|
||||
if (propsValue.status) requestBody.status = propsValue.status;
|
||||
if (propsValue.gender) requestBody.gender = propsValue.gender;
|
||||
if (propsValue.birth_date) requestBody.birth_date = propsValue.birth_date;
|
||||
if (propsValue.marital_status) requestBody.marital_status = propsValue.marital_status;
|
||||
if (propsValue.twitter_name) requestBody.twitter_name = propsValue.twitter_name;
|
||||
if (propsValue.linkedin_url) requestBody.linkedin_url = propsValue.linkedin_url;
|
||||
if (propsValue.background_information) requestBody.background_information = propsValue.background_information;
|
||||
if (propsValue.important_information) requestBody.important_information = propsValue.important_information;
|
||||
if (propsValue.personal_interests) requestBody.personal_interests = propsValue.personal_interests;
|
||||
if (propsValue.contact_source) requestBody.contact_source = propsValue.contact_source;
|
||||
if (propsValue.external_unique_id) requestBody.external_unique_id = propsValue.external_unique_id;
|
||||
|
||||
if (propsValue.email_address) {
|
||||
requestBody.email_addresses = [{
|
||||
address: propsValue.email_address,
|
||||
principal: true,
|
||||
kind: 'Work'
|
||||
}];
|
||||
}
|
||||
|
||||
if (propsValue.phone_number) {
|
||||
requestBody.phone_numbers = [{
|
||||
address: propsValue.phone_number,
|
||||
principal: true,
|
||||
kind: 'Work'
|
||||
}];
|
||||
}
|
||||
|
||||
if (propsValue.street_line_1 || propsValue.city || propsValue.state || propsValue.zip_code) {
|
||||
requestBody.street_addresses = [{
|
||||
street_line_1: propsValue.street_line_1 || '',
|
||||
street_line_2: propsValue.street_line_2 || '',
|
||||
city: propsValue.city || '',
|
||||
state: propsValue.state || '',
|
||||
zip_code: propsValue.zip_code || '',
|
||||
country: propsValue.country || 'United States',
|
||||
principal: true,
|
||||
kind: 'Work'
|
||||
}];
|
||||
}
|
||||
|
||||
if (propsValue.tags && Array.isArray(propsValue.tags)) {
|
||||
requestBody.tags = propsValue.tags;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: 'https://api.crmworkspace.com/v1/contacts',
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Wealthbox API error: ${response.status} - ${JSON.stringify(response.body)}`);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to create contact: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,454 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchContacts, fetchUsers, fetchUserGroups, fetchEventCategories, fetchCustomFields, WEALTHBOX_API_BASE, handleApiError, DOCUMENT_TYPES, EVENT_STATES } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const createEvent = createAction({
|
||||
name: 'create_event',
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Create Event',
|
||||
description: 'Creates a calendar event linked to contact. Schedule advisory meetings on behalf of clients.',
|
||||
props: {
|
||||
title: Property.ShortText({
|
||||
displayName: 'Event Title',
|
||||
description: 'The name of the event (e.g., "Client Meeting", "Portfolio Review")',
|
||||
required: true
|
||||
}),
|
||||
starts_at: Property.DateTime({
|
||||
displayName: 'Start Date & Time',
|
||||
description: 'When the event starts (yyyy-mm-dd hh:mm format)',
|
||||
required: true
|
||||
}),
|
||||
ends_at: Property.DateTime({
|
||||
displayName: 'End Date & Time',
|
||||
description: 'When the event ends (yyyy-mm-dd hh:mm format)',
|
||||
required: true
|
||||
}),
|
||||
|
||||
location: Property.ShortText({
|
||||
displayName: 'Location',
|
||||
description: 'Where the event takes place (e.g., "Conference Room", "Client Office", "Zoom Meeting")',
|
||||
required: false
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
description: 'A detailed explanation of the event purpose and agenda',
|
||||
required: false
|
||||
}),
|
||||
|
||||
all_day: Property.Checkbox({
|
||||
displayName: 'All Day Event',
|
||||
description: 'Check if this is an all-day event',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
}),
|
||||
repeats: Property.Checkbox({
|
||||
displayName: 'Repeating Event',
|
||||
description: 'Check if this event repeats',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
}),
|
||||
|
||||
state: Property.StaticDropdown({
|
||||
displayName: 'Event Status',
|
||||
description: 'The current state of the event',
|
||||
required: false,
|
||||
defaultValue: EVENT_STATES.UNCONFIRMED,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Unconfirmed', value: EVENT_STATES.UNCONFIRMED },
|
||||
{ label: 'Confirmed', value: EVENT_STATES.CONFIRMED },
|
||||
{ label: 'Tentative', value: EVENT_STATES.TENTATIVE },
|
||||
{ label: 'Completed', value: EVENT_STATES.COMPLETED },
|
||||
{ label: 'Cancelled', value: EVENT_STATES.CANCELLED }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
contact_id: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Contact',
|
||||
description: 'Select the contact to link this event to',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
return {
|
||||
options: contacts.map((contact: any) => ({
|
||||
label: contact.name || `${contact.first_name} ${contact.last_name}`.trim() || `Contact ${contact.id}`,
|
||||
value: contact.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load contacts. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
invitees: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Invitees',
|
||||
description: 'Add people to invite to this event',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
invitees_array: Property.Array({
|
||||
displayName: 'Invitees',
|
||||
description: 'Add invitees to this event',
|
||||
required: false,
|
||||
properties: {
|
||||
invitee: Property.ShortText({
|
||||
displayName: 'Invitee',
|
||||
description: 'Invitee name',
|
||||
required: true
|
||||
}),
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Type',
|
||||
description: 'Type of invitee',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: 'Contact' },
|
||||
{ label: 'User', value: 'User' }
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const [contacts, users] = await Promise.all([
|
||||
fetchContacts(auth.secret_text, { active: true }),
|
||||
fetchUsers(auth.secret_text)
|
||||
]);
|
||||
|
||||
const contactOptions = contacts.map((contact: any) => ({
|
||||
label: `${contact.name || `${contact.first_name} ${contact.last_name}`.trim()} (Contact)`,
|
||||
value: `contact_${contact.id}`
|
||||
}));
|
||||
|
||||
const userOptions = users.map((user: any) => ({
|
||||
label: `${user.name} (User)`,
|
||||
value: `user_${user.id}`
|
||||
}));
|
||||
|
||||
const allInviteeOptions = [...contactOptions, ...userOptions];
|
||||
|
||||
return {
|
||||
invitees_array: Property.Array({
|
||||
displayName: 'Invitees',
|
||||
description: 'Add invitees to this event',
|
||||
required: false,
|
||||
properties: {
|
||||
invitee: Property.StaticDropdown({
|
||||
displayName: 'Invitee',
|
||||
description: 'Select a contact or user to invite',
|
||||
required: true,
|
||||
options: {
|
||||
options: allInviteeOptions
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
invitees_array: Property.Array({
|
||||
displayName: 'Invitees',
|
||||
description: 'Add invitees to this event (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
invitee: Property.ShortText({
|
||||
displayName: 'Invitee Name',
|
||||
description: 'Enter the invitee name',
|
||||
required: true
|
||||
}),
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Type',
|
||||
description: 'Type of invitee',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: 'Contact' },
|
||||
{ label: 'User', value: 'User' }
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
event_category: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Event Category',
|
||||
description: 'Select the category for this event',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const categories = await fetchEventCategories(auth.secret_text);
|
||||
return {
|
||||
options: categories.map((category: any) => ({
|
||||
label: category.name,
|
||||
value: category.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load event categories. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
email_invitees: Property.Checkbox({
|
||||
displayName: 'Email Invitees',
|
||||
description: 'Send email invitations to invitees',
|
||||
required: false,
|
||||
defaultValue: true
|
||||
}),
|
||||
|
||||
visible_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Visible To',
|
||||
description: 'Select who can view this event',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const userGroups = await fetchUserGroups(auth.secret_text);
|
||||
return {
|
||||
options: userGroups.map((group: any) => ({
|
||||
label: group.name,
|
||||
value: group.name
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load user groups. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
custom_fields: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this event',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this event',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Custom field name',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.EVENT);
|
||||
const customFieldOptions = customFields.map((field: any) => ({
|
||||
label: field.name,
|
||||
value: field.name
|
||||
}));
|
||||
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this event',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.StaticDropdown({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Select a custom field for this event',
|
||||
required: true,
|
||||
options: {
|
||||
options: customFieldOptions
|
||||
}
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this event (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field Name',
|
||||
description: 'Enter the custom field name exactly',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const requestBody: any = {
|
||||
title: propsValue.title,
|
||||
starts_at: propsValue.starts_at,
|
||||
ends_at: propsValue.ends_at
|
||||
};
|
||||
|
||||
if (propsValue.location) requestBody.location = propsValue.location;
|
||||
if (propsValue.description) requestBody.description = propsValue.description;
|
||||
if (propsValue.all_day !== undefined) requestBody.all_day = propsValue.all_day;
|
||||
if (propsValue.repeats !== undefined) requestBody.repeats = propsValue.repeats;
|
||||
if (propsValue.state) requestBody.state = propsValue.state;
|
||||
if (propsValue.event_category) requestBody.event_category = propsValue.event_category;
|
||||
if (propsValue.visible_to) requestBody.visible_to = propsValue.visible_to;
|
||||
if (propsValue.email_invitees !== undefined) requestBody.email_invitees = propsValue.email_invitees;
|
||||
|
||||
if (propsValue.contact_id) {
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true });
|
||||
const selectedContact = contacts.find((contact: any) => contact.id === propsValue.contact_id);
|
||||
|
||||
requestBody.linked_to = [{
|
||||
id: propsValue.contact_id,
|
||||
type: 'Contact',
|
||||
name: selectedContact ? (selectedContact.name || `${selectedContact.first_name} ${selectedContact.last_name}`.trim()) : `Contact ${propsValue.contact_id}`
|
||||
}];
|
||||
} catch (error) {
|
||||
requestBody.linked_to = [{
|
||||
id: propsValue.contact_id,
|
||||
type: 'Contact',
|
||||
name: `Contact ${propsValue.contact_id}`
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
const inviteesArray = (propsValue as any).invitees_array;
|
||||
if (inviteesArray && Array.isArray(inviteesArray) && inviteesArray.length > 0) {
|
||||
const invitees: any[] = [];
|
||||
|
||||
for (const inviteeItem of inviteesArray) {
|
||||
const inviteeValue = inviteeItem.invitee;
|
||||
|
||||
if (inviteeValue && typeof inviteeValue === 'string') {
|
||||
if (inviteeValue.startsWith('contact_')) {
|
||||
const contactId = inviteeValue.replace('contact_', '');
|
||||
invitees.push({
|
||||
id: parseInt(contactId),
|
||||
type: 'Contact'
|
||||
});
|
||||
} else if (inviteeValue.startsWith('user_')) {
|
||||
const userId = inviteeValue.replace('user_', '');
|
||||
invitees.push({
|
||||
id: parseInt(userId),
|
||||
type: 'User'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (invitees.length > 0) {
|
||||
requestBody.invitees = invitees;
|
||||
}
|
||||
}
|
||||
|
||||
const customFieldsArray = (propsValue as any).custom_fields_array;
|
||||
if (customFieldsArray && Array.isArray(customFieldsArray) && customFieldsArray.length > 0) {
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.EVENT);
|
||||
const customFieldMap = new Map(customFields.map((field: any) => [field.name, field.id]));
|
||||
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => {
|
||||
const fieldId = customFieldMap.get(field.custom_field);
|
||||
if (!fieldId) {
|
||||
throw new Error(`Custom field "${field.custom_field}" not found. Please check the field name.`);
|
||||
}
|
||||
return {
|
||||
id: fieldId,
|
||||
value: field.value
|
||||
};
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof Error && error.message.includes('Custom field')) {
|
||||
throw error;
|
||||
}
|
||||
console.warn('Could not fetch custom fields for validation:', error);
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => ({
|
||||
id: field.custom_field,
|
||||
value: field.value
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/events`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('create event', response.status, response.body);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to create event: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,391 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchContacts, fetchUserGroups, fetchTags, WEALTHBOX_API_BASE, handleApiError, DOCUMENT_TYPES } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const createHousehold = createAction({
|
||||
name: 'create_household',
|
||||
displayName: 'Create Household',
|
||||
description: 'Creates a household record with emails, tags. Group family member contacts into one household.',
|
||||
auth: wealthboxAuth,
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Household Name',
|
||||
description: 'The name of the household (e.g., "The Anderson Family", "Smith Household")',
|
||||
required: true
|
||||
}),
|
||||
|
||||
head_contact_id: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Head of Household',
|
||||
description: 'Select the contact who will be the head of this household',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
return {
|
||||
options: contacts.map((contact: any) => ({
|
||||
label: contact.name || `${contact.first_name} ${contact.last_name}`.trim() || `Contact ${contact.id}`,
|
||||
value: contact.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load contacts. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
spouse_contact_id: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Spouse/Partner (Optional)',
|
||||
description: 'Select the spouse or partner to automatically add to this household',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
return {
|
||||
options: contacts.map((contact: any) => ({
|
||||
label: contact.name || `${contact.first_name} ${contact.last_name}`.trim() || `Contact ${contact.id}`,
|
||||
value: contact.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load contacts. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
email_address: Property.ShortText({
|
||||
displayName: 'Primary Email Address',
|
||||
description: 'Primary email address for the household',
|
||||
required: false
|
||||
}),
|
||||
|
||||
street_line_1: Property.ShortText({
|
||||
displayName: 'Street Address Line 1',
|
||||
description: 'First line of street address',
|
||||
required: false
|
||||
}),
|
||||
street_line_2: Property.ShortText({
|
||||
displayName: 'Street Address Line 2',
|
||||
description: 'Second line of street address (apt, suite, etc.)',
|
||||
required: false
|
||||
}),
|
||||
city: Property.ShortText({
|
||||
displayName: 'City',
|
||||
description: 'City for the household address',
|
||||
required: false
|
||||
}),
|
||||
state: Property.ShortText({
|
||||
displayName: 'State',
|
||||
description: 'State or province for the household address',
|
||||
required: false
|
||||
}),
|
||||
zip_code: Property.ShortText({
|
||||
displayName: 'ZIP Code',
|
||||
description: 'ZIP or postal code for the household address',
|
||||
required: false
|
||||
}),
|
||||
country: Property.ShortText({
|
||||
displayName: 'Country',
|
||||
description: 'Country for the household address',
|
||||
required: false,
|
||||
defaultValue: 'United States'
|
||||
}),
|
||||
|
||||
phone_number: Property.ShortText({
|
||||
displayName: 'Primary Phone Number',
|
||||
description: 'Primary phone number for the household',
|
||||
required: false
|
||||
}),
|
||||
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Household Type',
|
||||
description: 'The type of household being created',
|
||||
required: false,
|
||||
defaultValue: 'Household',
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Household', value: 'Household' },
|
||||
{ label: 'Organization', value: 'Organization' },
|
||||
{ label: 'Trust', value: 'Trust' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
description: 'Whether the household is currently active',
|
||||
required: false,
|
||||
defaultValue: 'Active',
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Active', value: 'Active' },
|
||||
{ label: 'Inactive', value: 'Inactive' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
background_information: Property.LongText({
|
||||
displayName: 'Background Information',
|
||||
description: 'Background information about the household',
|
||||
required: false
|
||||
}),
|
||||
important_information: Property.LongText({
|
||||
displayName: 'Important Information',
|
||||
description: 'Any important information about the household',
|
||||
required: false
|
||||
}),
|
||||
|
||||
tags: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Tags',
|
||||
description: 'Select tags to associate with this household',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
tags_array: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Add tags to this household',
|
||||
required: false,
|
||||
properties: {
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag',
|
||||
description: 'Tag name',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const tags = await fetchTags(auth.secret_text, DOCUMENT_TYPES.CONTACT);
|
||||
const tagOptions = tags.map((tag: any) => ({
|
||||
label: tag.name,
|
||||
value: tag.name
|
||||
}));
|
||||
|
||||
return {
|
||||
tags_array: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Add tags to this household',
|
||||
required: false,
|
||||
properties: {
|
||||
tag: Property.StaticDropdown({
|
||||
displayName: 'Tag',
|
||||
description: 'Select a tag for this household',
|
||||
required: true,
|
||||
options: {
|
||||
options: tagOptions
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
tags_array: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Add tags to this household (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag Name',
|
||||
description: 'Enter the tag name exactly',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
visible_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Visible To',
|
||||
description: 'Select who can view this household',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const userGroups = await fetchUserGroups(auth.secret_text);
|
||||
|
||||
const filteredGroups = userGroups.filter((group: any) => group.name !== 'Only Me');
|
||||
|
||||
return {
|
||||
options: filteredGroups.map((group: any) => {
|
||||
const displayName = group.user ? `${group.name} (${group.user.name || group.user.email})` : group.name;
|
||||
return {
|
||||
label: displayName,
|
||||
value: group.name
|
||||
};
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load user groups. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
external_unique_id: Property.ShortText({
|
||||
displayName: 'External Unique ID',
|
||||
description: 'A unique identifier for this household in an external system',
|
||||
required: false
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const requestBody: any = {
|
||||
name: propsValue.name,
|
||||
type: 'Household',
|
||||
status: propsValue.status || 'Active'
|
||||
};
|
||||
|
||||
if (propsValue.background_information) requestBody.background_information = propsValue.background_information;
|
||||
if (propsValue.important_information) requestBody.important_information = propsValue.important_information;
|
||||
|
||||
if (propsValue.visible_to && propsValue.visible_to.trim() !== '') {
|
||||
requestBody.visible_to = propsValue.visible_to;
|
||||
}
|
||||
|
||||
if (propsValue.external_unique_id) requestBody.external_unique_id = propsValue.external_unique_id;
|
||||
|
||||
if (propsValue.email_address) {
|
||||
requestBody.email_addresses = [{
|
||||
address: propsValue.email_address,
|
||||
principal: true,
|
||||
kind: 'Work'
|
||||
}];
|
||||
}
|
||||
|
||||
if (propsValue.phone_number) {
|
||||
requestBody.phone_numbers = [{
|
||||
address: propsValue.phone_number,
|
||||
principal: true,
|
||||
kind: 'Work'
|
||||
}];
|
||||
}
|
||||
|
||||
if (propsValue.street_line_1 || propsValue.city || propsValue.state || propsValue.zip_code) {
|
||||
requestBody.street_addresses = [{
|
||||
street_line_1: propsValue.street_line_1 || '',
|
||||
street_line_2: propsValue.street_line_2 || '',
|
||||
city: propsValue.city || '',
|
||||
state: propsValue.state || '',
|
||||
zip_code: propsValue.zip_code || '',
|
||||
country: propsValue.country || 'United States',
|
||||
principal: true,
|
||||
kind: 'Work'
|
||||
}];
|
||||
}
|
||||
|
||||
const tagsArray = (propsValue as any).tags_array;
|
||||
if (tagsArray && Array.isArray(tagsArray) && tagsArray.length > 0) {
|
||||
requestBody.tags = tagsArray.map((tagItem: any) => tagItem.tag);
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/contacts`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('create household', response.status, response.body);
|
||||
}
|
||||
|
||||
const householdContact = response.body;
|
||||
|
||||
const members: any[] = [];
|
||||
|
||||
if (propsValue.head_contact_id && householdContact.id) {
|
||||
try {
|
||||
const memberResponse = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/households/${householdContact.id}/members`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: {
|
||||
id: propsValue.head_contact_id,
|
||||
title: 'Head'
|
||||
}
|
||||
});
|
||||
|
||||
if (memberResponse.status < 400) {
|
||||
members.push(memberResponse.body);
|
||||
}
|
||||
} catch (memberError) {
|
||||
console.warn('Failed to add head of household member:', memberError);
|
||||
}
|
||||
}
|
||||
|
||||
if (propsValue.spouse_contact_id && householdContact.id) {
|
||||
try {
|
||||
const spouseResponse = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/households/${householdContact.id}/members`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: {
|
||||
id: propsValue.spouse_contact_id,
|
||||
title: 'Spouse'
|
||||
}
|
||||
});
|
||||
|
||||
if (spouseResponse.status < 400) {
|
||||
members.push(spouseResponse.body);
|
||||
}
|
||||
} catch (spouseError) {
|
||||
console.warn('Failed to add spouse/partner member:', spouseError);
|
||||
}
|
||||
}
|
||||
|
||||
if (members.length > 0) {
|
||||
return {
|
||||
household: householdContact,
|
||||
members: members
|
||||
};
|
||||
}
|
||||
|
||||
return householdContact;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to create household: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,196 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchUserGroups, fetchContacts, fetchTags, WEALTHBOX_API_BASE, handleApiError, DOCUMENT_TYPES } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const createNote = createAction({
|
||||
name: 'create_note',
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Create Note',
|
||||
description: 'Adds a note linked to a contact. Log call summaries against client records.',
|
||||
props: {
|
||||
content: Property.LongText({
|
||||
displayName: 'Note Content',
|
||||
description: 'The main body of the note (e.g., call summary, meeting notes, client interaction details)',
|
||||
required: true
|
||||
}),
|
||||
|
||||
contact_id: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Contact',
|
||||
description: 'Select the contact to link this note to',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
return {
|
||||
options: contacts.map((contact: any) => ({
|
||||
label: contact.name || `${contact.first_name} ${contact.last_name}`.trim() || `Contact ${contact.id}`,
|
||||
value: contact.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load contacts. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
visible_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Visible To',
|
||||
description: 'Select who can view this note',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const userGroups = await fetchUserGroups(auth.secret_text);
|
||||
return {
|
||||
options: userGroups.map((group: any) => ({
|
||||
label: group.name,
|
||||
value: group.name
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load user groups. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
tags: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Tags',
|
||||
description: 'Select tags to associate with this note',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
tags_array: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Add tags to this note',
|
||||
required: false,
|
||||
properties: {
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag',
|
||||
description: 'Tag name',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const tags = await fetchTags(auth.secret_text, DOCUMENT_TYPES.CONTACT_NOTE);
|
||||
const tagOptions = tags.map((tag: any) => ({
|
||||
label: tag.name,
|
||||
value: tag.name
|
||||
}));
|
||||
|
||||
return {
|
||||
tags_array: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Add tags to this note',
|
||||
required: false,
|
||||
properties: {
|
||||
tag: Property.StaticDropdown({
|
||||
displayName: 'Tag',
|
||||
description: 'Select a tag for this note',
|
||||
required: true,
|
||||
options: {
|
||||
options: tagOptions
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
tags_array: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Add tags to this note (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag Name',
|
||||
description: 'Enter the tag name exactly',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
|
||||
|
||||
const linkedToResource: any = {
|
||||
id: propsValue.contact_id,
|
||||
type: 'Contact'
|
||||
};
|
||||
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true });
|
||||
const selectedContact = contacts.find((contact: any) => contact.id === propsValue.contact_id);
|
||||
if (selectedContact) {
|
||||
linkedToResource.name = selectedContact.name || `${selectedContact.first_name} ${selectedContact.last_name}`.trim();
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Could not fetch contact name for reference:', error);
|
||||
}
|
||||
|
||||
const requestBody: any = {
|
||||
content: propsValue.content,
|
||||
linked_to: [linkedToResource]
|
||||
};
|
||||
|
||||
if (propsValue.visible_to) {
|
||||
requestBody.visible_to = propsValue.visible_to;
|
||||
}
|
||||
|
||||
const tagsArray = (propsValue as any).tags_array;
|
||||
if (tagsArray && Array.isArray(tagsArray) && tagsArray.length > 0) {
|
||||
requestBody.tags = tagsArray.map((tagItem: any) => tagItem.tag);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/notes`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('create note', response.status, response.body);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to create note: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,361 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchContacts, fetchUsers, fetchUserGroups, fetchOpportunityStages, fetchCustomFields, WEALTHBOX_API_BASE, handleApiError, DOCUMENT_TYPES, OPPORTUNITY_AMOUNT_KINDS, CURRENCIES } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const createOpportunity = createAction({
|
||||
name: 'create_opportunity',
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Create Opportunity',
|
||||
description: 'Logs an opportunity including stage, close date, amount. Automate opportunity tracking after meetings.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Opportunity Name',
|
||||
description: 'The name of the opportunity (e.g., "Financial Plan", "Investment Advisory", "Estate Planning")',
|
||||
required: true
|
||||
}),
|
||||
target_close: Property.DateTime({
|
||||
displayName: 'Target Close Date',
|
||||
description: 'When the opportunity should close',
|
||||
required: true
|
||||
}),
|
||||
probability: Property.Number({
|
||||
displayName: 'Probability (%)',
|
||||
description: 'The chance the opportunity will close, as a percentage (0-100)',
|
||||
required: true
|
||||
}),
|
||||
|
||||
amount: Property.Number({
|
||||
displayName: 'Amount',
|
||||
description: 'The monetary value of the opportunity',
|
||||
required: true
|
||||
}),
|
||||
currency: Property.StaticDropdown({
|
||||
displayName: 'Currency',
|
||||
description: 'The currency for the opportunity amount',
|
||||
required: false,
|
||||
defaultValue: CURRENCIES.USD,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'USD ($)', value: CURRENCIES.USD },
|
||||
{ label: 'EUR (€)', value: CURRENCIES.EUR },
|
||||
{ label: 'GBP (£)', value: CURRENCIES.GBP },
|
||||
{ label: 'CAD (C$)', value: CURRENCIES.CAD },
|
||||
{ label: 'AUD (A$)', value: CURRENCIES.AUD }
|
||||
]
|
||||
}
|
||||
}),
|
||||
amount_kind: Property.StaticDropdown({
|
||||
displayName: 'Amount Type',
|
||||
description: 'The type of amount this represents',
|
||||
required: false,
|
||||
defaultValue: OPPORTUNITY_AMOUNT_KINDS.FEE,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Fee', value: OPPORTUNITY_AMOUNT_KINDS.FEE },
|
||||
{ label: 'Commission', value: OPPORTUNITY_AMOUNT_KINDS.COMMISSION },
|
||||
{ label: 'AUM', value: OPPORTUNITY_AMOUNT_KINDS.AUM },
|
||||
{ label: 'Other', value: OPPORTUNITY_AMOUNT_KINDS.OTHER }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
stage: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Stage',
|
||||
description: 'Select the current stage of this opportunity',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const stages = await fetchOpportunityStages(auth.secret_text);
|
||||
return {
|
||||
options: stages.map((stage: any) => ({
|
||||
label: stage.name,
|
||||
value: stage.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load opportunity stages. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
contact_id: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Contact',
|
||||
description: 'Select the contact linked to this opportunity',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
return {
|
||||
options: contacts.map((contact: any) => ({
|
||||
label: contact.name || `${contact.first_name} ${contact.last_name}`.trim() || `Contact ${contact.id}`,
|
||||
value: contact.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load contacts. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
description: 'A detailed explanation of the opportunity',
|
||||
required: false
|
||||
}),
|
||||
|
||||
manager: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Opportunity Manager',
|
||||
description: 'Select the user designated as manager of this opportunity',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
const assignableUsers = users.filter((user: any) => !user.excluded_from_assignments);
|
||||
return {
|
||||
options: assignableUsers.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
visible_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Visible To',
|
||||
description: 'Select who can view this opportunity',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const userGroups = await fetchUserGroups(auth.secret_text);
|
||||
return {
|
||||
options: userGroups.map((group: any) => ({
|
||||
label: group.name,
|
||||
value: group.name
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load user groups. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
custom_fields: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this opportunity',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this opportunity',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Custom field name',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.OPPORTUNITY);
|
||||
const customFieldOptions = customFields.map((field: any) => ({
|
||||
label: field.name,
|
||||
value: field.name
|
||||
}));
|
||||
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this opportunity',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.StaticDropdown({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Select a custom field for this opportunity',
|
||||
required: true,
|
||||
options: {
|
||||
options: customFieldOptions
|
||||
}
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this opportunity (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field Name',
|
||||
description: 'Enter the custom field name exactly',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
if (propsValue.probability < 0 || propsValue.probability > 100) {
|
||||
throw new Error('Probability must be between 0 and 100');
|
||||
}
|
||||
|
||||
const requestBody: any = {
|
||||
name: propsValue.name,
|
||||
target_close: propsValue.target_close,
|
||||
probability: propsValue.probability,
|
||||
stage: propsValue.stage,
|
||||
amounts: [
|
||||
{
|
||||
amount: propsValue.amount,
|
||||
currency: propsValue.currency || CURRENCIES.USD,
|
||||
kind: propsValue.amount_kind || OPPORTUNITY_AMOUNT_KINDS.FEE
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
if (propsValue.contact_id) {
|
||||
try {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true });
|
||||
const selectedContact = contacts.find((contact: any) => contact.id === propsValue.contact_id);
|
||||
|
||||
requestBody.linked_to = [{
|
||||
id: propsValue.contact_id,
|
||||
type: 'Contact',
|
||||
name: selectedContact ? (selectedContact.name || `${selectedContact.first_name} ${selectedContact.last_name}`.trim()) : `Contact ${propsValue.contact_id}`
|
||||
}];
|
||||
} catch (error) {
|
||||
requestBody.linked_to = [{
|
||||
id: propsValue.contact_id,
|
||||
type: 'Contact',
|
||||
name: `Contact ${propsValue.contact_id}`
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
if (propsValue.description) {
|
||||
requestBody.description = propsValue.description;
|
||||
}
|
||||
|
||||
if (propsValue.manager) {
|
||||
requestBody.manager = propsValue.manager;
|
||||
}
|
||||
|
||||
if (propsValue.visible_to) {
|
||||
requestBody.visible_to = propsValue.visible_to;
|
||||
}
|
||||
|
||||
const customFieldsArray = (propsValue as any).custom_fields_array;
|
||||
if (customFieldsArray && Array.isArray(customFieldsArray) && customFieldsArray.length > 0) {
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.OPPORTUNITY);
|
||||
const customFieldMap = new Map(customFields.map((field: any) => [field.name, field.id]));
|
||||
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => {
|
||||
const fieldId = customFieldMap.get(field.custom_field);
|
||||
if (!fieldId) {
|
||||
throw new Error(`Custom field "${field.custom_field}" not found. Please check the field name.`);
|
||||
}
|
||||
return {
|
||||
id: fieldId,
|
||||
value: field.value
|
||||
};
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof Error && error.message.includes('Custom field')) {
|
||||
throw error;
|
||||
}
|
||||
console.warn('Could not fetch custom fields for validation:', error);
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => ({
|
||||
id: field.custom_field,
|
||||
value: field.value
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/opportunities`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('create opportunity', response.status, response.body);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to create opportunity: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,230 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchUserGroups, fetchUsers, fetchCustomFields, WEALTHBOX_API_BASE, handleApiError, DOCUMENT_TYPES } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const createProject = createAction({
|
||||
auth: wealthboxAuth,
|
||||
name: 'create_project',
|
||||
displayName: 'Create Project',
|
||||
description: 'Starts a new project with description and organizer. Launch project-based onboarding when new clients sign up.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Project Name',
|
||||
description: 'The name of the project (e.g., "Client Onboarding", "Q1 Review Process")',
|
||||
required: true
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Project Description',
|
||||
description: 'A detailed explanation of the project goals and scope',
|
||||
required: true
|
||||
}),
|
||||
|
||||
organizer: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Organizer',
|
||||
description: 'Select the user who will be responsible for organizing this project',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
const assignableUsers = users.filter((user: any) => !user.excluded_from_assignments);
|
||||
return {
|
||||
options: assignableUsers.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
visible_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Visible To',
|
||||
description: 'Select who can view this project',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const userGroups = await fetchUserGroups(auth.secret_text);
|
||||
return {
|
||||
options: userGroups.map((group: any) => ({
|
||||
label: group.name,
|
||||
value: group.name
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load user groups. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
custom_fields: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this project',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this project',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Custom field name',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.PROJECT);
|
||||
const customFieldOptions = customFields.map((field: any) => ({
|
||||
label: field.name,
|
||||
value: field.name
|
||||
}));
|
||||
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this project',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.StaticDropdown({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Select a custom field for this project',
|
||||
required: true,
|
||||
options: {
|
||||
options: customFieldOptions
|
||||
}
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this project (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field Name',
|
||||
description: 'Enter the custom field name exactly',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
const requestBody: any = {
|
||||
name: propsValue.name,
|
||||
description: propsValue.description
|
||||
};
|
||||
|
||||
if (propsValue.organizer) {
|
||||
requestBody.organizer = propsValue.organizer;
|
||||
}
|
||||
|
||||
if (propsValue.visible_to) {
|
||||
requestBody.visible_to = propsValue.visible_to;
|
||||
}
|
||||
|
||||
const customFieldsArray = (propsValue as any).custom_fields_array;
|
||||
if (customFieldsArray && Array.isArray(customFieldsArray) && customFieldsArray.length > 0) {
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.PROJECT);
|
||||
const customFieldMap = new Map(customFields.map((field: any) => [field.name, field.id]));
|
||||
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => {
|
||||
const fieldId = customFieldMap.get(field.custom_field);
|
||||
if (!fieldId) {
|
||||
throw new Error(`Custom field "${field.custom_field}" not found. Please check the field name.`);
|
||||
}
|
||||
return {
|
||||
id: fieldId,
|
||||
value: field.value
|
||||
};
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof Error && error.message.includes('Custom field')) {
|
||||
throw error;
|
||||
}
|
||||
console.warn('Could not fetch custom fields for validation:', error);
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => ({
|
||||
id: field.custom_field,
|
||||
value: field.value
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/projects`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('create project', response.status, response.body);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to create project: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,442 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchContacts, fetchUsers, fetchUserGroups, fetchTaskCategories, fetchProjects, fetchOpportunities, fetchCustomFields, WEALTHBOX_API_BASE, handleApiError, DOCUMENT_TYPES, TASK_PRIORITIES, LINK_TYPES } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const createTask = createAction({
|
||||
auth: wealthboxAuth,
|
||||
name: 'create_task',
|
||||
displayName: 'Create Task',
|
||||
description: 'Creates tasks tied to contacts with due dates and assignment types. Assign follow-up actions when opportunities are created.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Task Name',
|
||||
description: 'The name of the task (e.g., "Return Bill\'s call", "Follow up on proposal")',
|
||||
required: true
|
||||
}),
|
||||
due_date: Property.DateTime({
|
||||
displayName: 'Due Date',
|
||||
description: 'When the task is due',
|
||||
required: true
|
||||
}),
|
||||
|
||||
assigned_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Assigned To',
|
||||
description: 'Select the user who the task is assigned to',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
const assignableUsers = users.filter((user: any) => !user.excluded_from_assignments);
|
||||
return {
|
||||
options: assignableUsers.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
description: 'A detailed explanation of the task',
|
||||
required: false
|
||||
}),
|
||||
priority: Property.StaticDropdown({
|
||||
displayName: 'Priority',
|
||||
description: 'The priority level of the task',
|
||||
required: false,
|
||||
defaultValue: TASK_PRIORITIES.MEDIUM,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Low', value: TASK_PRIORITIES.LOW },
|
||||
{ label: 'Medium', value: TASK_PRIORITIES.MEDIUM },
|
||||
{ label: 'High', value: TASK_PRIORITIES.HIGH }
|
||||
]
|
||||
}
|
||||
}),
|
||||
complete: Property.Checkbox({
|
||||
displayName: 'Mark as Complete',
|
||||
description: 'Check if the task should be created as already completed',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
}),
|
||||
|
||||
link_type: Property.StaticDropdown({
|
||||
displayName: 'Link To',
|
||||
description: 'What type of record to link this task to',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: LINK_TYPES.CONTACT },
|
||||
{ label: 'Project', value: LINK_TYPES.PROJECT },
|
||||
{ label: 'Opportunity', value: LINK_TYPES.OPPORTUNITY }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
linked_record: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Record',
|
||||
description: 'Select the record to link this task to',
|
||||
required: false,
|
||||
refreshers: ['link_type'],
|
||||
props: async ({ auth, link_type }) => {
|
||||
if (!auth || !link_type) {
|
||||
return {
|
||||
linked_id: Property.ShortText({
|
||||
displayName: 'Linked Record ID',
|
||||
description: 'Enter the record ID to link to',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const linkTypeStr = link_type as unknown as string;
|
||||
if (linkTypeStr === LINK_TYPES.CONTACT) {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
return {
|
||||
linked_id: Property.StaticDropdown({
|
||||
displayName: 'Contact',
|
||||
description: 'Select the contact to link this task to',
|
||||
required: false,
|
||||
options: {
|
||||
options: contacts.map((contact: any) => ({
|
||||
label: contact.name || `${contact.first_name} ${contact.last_name}`.trim() || `Contact ${contact.id}`,
|
||||
value: contact.id
|
||||
}))
|
||||
}
|
||||
})
|
||||
};
|
||||
} else if (linkTypeStr === LINK_TYPES.PROJECT) {
|
||||
const projects = await fetchProjects(auth.secret_text);
|
||||
return {
|
||||
linked_id: Property.StaticDropdown({
|
||||
displayName: 'Project',
|
||||
description: 'Select the project to link this task to',
|
||||
required: false,
|
||||
options: {
|
||||
options: projects.map((project: any) => ({
|
||||
label: project.name || `Project ${project.id}`,
|
||||
value: project.id
|
||||
}))
|
||||
}
|
||||
})
|
||||
};
|
||||
} else if (linkTypeStr === LINK_TYPES.OPPORTUNITY) {
|
||||
const opportunities = await fetchOpportunities(auth.secret_text);
|
||||
return {
|
||||
linked_id: Property.StaticDropdown({
|
||||
displayName: 'Opportunity',
|
||||
description: 'Select the opportunity to link this task to',
|
||||
required: false,
|
||||
options: {
|
||||
options: opportunities.map((opportunity: any) => ({
|
||||
label: opportunity.name || `Opportunity ${opportunity.id}`,
|
||||
value: opportunity.id
|
||||
}))
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
return {
|
||||
linked_id: Property.ShortText({
|
||||
displayName: 'Linked Record ID',
|
||||
description: 'Enter the record ID to link to (API unavailable)',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
linked_id: Property.ShortText({
|
||||
displayName: 'Linked Record ID',
|
||||
description: 'Enter the record ID to link to',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
}),
|
||||
|
||||
category: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Category',
|
||||
description: 'Select the category this task belongs to',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const categories = await fetchTaskCategories(auth.secret_text);
|
||||
return {
|
||||
options: categories.map((category: any) => ({
|
||||
label: category.name,
|
||||
value: category.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load task categories. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
visible_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Visible To',
|
||||
description: 'Select who can view this task',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const userGroups = await fetchUserGroups(auth.secret_text);
|
||||
return {
|
||||
options: userGroups.map((group: any) => ({
|
||||
label: group.name,
|
||||
value: group.name
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load user groups. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
due_later: Property.ShortText({
|
||||
displayName: 'Due Later',
|
||||
description: 'Interval for when this task is due after start (e.g., "2 days later at 5:00 PM")',
|
||||
required: false
|
||||
}),
|
||||
|
||||
custom_fields: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this task',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this task',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Custom field name',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.TASK);
|
||||
const customFieldOptions = customFields.map((field: any) => ({
|
||||
label: field.name,
|
||||
value: field.name
|
||||
}));
|
||||
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this task',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.StaticDropdown({
|
||||
displayName: 'Custom Field',
|
||||
description: 'Select a custom field for this task',
|
||||
required: true,
|
||||
options: {
|
||||
options: customFieldOptions
|
||||
}
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
custom_fields_array: Property.Array({
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Add custom fields to this task (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
custom_field: Property.ShortText({
|
||||
displayName: 'Custom Field Name',
|
||||
description: 'Enter the custom field name exactly',
|
||||
required: true
|
||||
}),
|
||||
value: Property.ShortText({
|
||||
displayName: 'Value',
|
||||
description: 'The value for this custom field',
|
||||
required: true
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('API access token is required');
|
||||
}
|
||||
|
||||
const requestBody: any = {
|
||||
name: propsValue.name,
|
||||
due_date: propsValue.due_date
|
||||
};
|
||||
|
||||
if (propsValue.assigned_to) {
|
||||
requestBody.assigned_to = propsValue.assigned_to;
|
||||
}
|
||||
|
||||
if (propsValue.description) {
|
||||
requestBody.description = propsValue.description;
|
||||
}
|
||||
|
||||
if (propsValue.priority) {
|
||||
requestBody.priority = propsValue.priority;
|
||||
}
|
||||
|
||||
if (propsValue.complete !== undefined) {
|
||||
requestBody.complete = propsValue.complete;
|
||||
}
|
||||
|
||||
if (propsValue.category) {
|
||||
requestBody.category = propsValue.category;
|
||||
}
|
||||
|
||||
if (propsValue.visible_to) {
|
||||
requestBody.visible_to = propsValue.visible_to;
|
||||
}
|
||||
|
||||
if (propsValue.due_later) {
|
||||
requestBody.due_later = propsValue.due_later;
|
||||
}
|
||||
|
||||
const linkedRecord = (propsValue as any).linked_record;
|
||||
if (propsValue.link_type && linkedRecord?.linked_id) {
|
||||
try {
|
||||
let recordName = `${propsValue.link_type} ${linkedRecord.linked_id}`;
|
||||
|
||||
const linkTypeStr = propsValue.link_type as string;
|
||||
if (linkTypeStr === LINK_TYPES.CONTACT) {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true });
|
||||
const contact = contacts.find((c: any) => c.id === linkedRecord.linked_id);
|
||||
if (contact) {
|
||||
recordName = contact.name || `${contact.first_name} ${contact.last_name}`.trim();
|
||||
}
|
||||
} else if (linkTypeStr === LINK_TYPES.PROJECT) {
|
||||
const projects = await fetchProjects(auth.secret_text);
|
||||
const project = projects.find((p: any) => p.id === linkedRecord.linked_id);
|
||||
if (project) {
|
||||
recordName = project.name;
|
||||
}
|
||||
} else if (linkTypeStr === LINK_TYPES.OPPORTUNITY) {
|
||||
const opportunities = await fetchOpportunities(auth.secret_text);
|
||||
const opportunity = opportunities.find((o: any) => o.id === linkedRecord.linked_id);
|
||||
if (opportunity) {
|
||||
recordName = opportunity.name;
|
||||
}
|
||||
}
|
||||
|
||||
requestBody.linked_to = [{
|
||||
id: linkedRecord.linked_id,
|
||||
type: propsValue.link_type,
|
||||
name: recordName
|
||||
}];
|
||||
} catch (error) {
|
||||
requestBody.linked_to = [{
|
||||
id: linkedRecord.linked_id,
|
||||
type: propsValue.link_type,
|
||||
name: `${propsValue.link_type} ${linkedRecord.linked_id}`
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
const customFieldsArray = (propsValue as any).custom_fields_array;
|
||||
if (customFieldsArray && Array.isArray(customFieldsArray) && customFieldsArray.length > 0) {
|
||||
try {
|
||||
const customFields = await fetchCustomFields(auth.secret_text, DOCUMENT_TYPES.TASK);
|
||||
const customFieldMap = new Map(customFields.map((field: any) => [field.name, field.id]));
|
||||
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => {
|
||||
const fieldId = customFieldMap.get(field.custom_field);
|
||||
if (!fieldId) {
|
||||
throw new Error(`Custom field "${field.custom_field}" not found. Please check the field name.`);
|
||||
}
|
||||
return {
|
||||
id: fieldId,
|
||||
value: field.value
|
||||
};
|
||||
});
|
||||
} catch (error) {
|
||||
if (error instanceof Error && error.message.includes('Custom field')) {
|
||||
throw error;
|
||||
}
|
||||
console.warn('Could not fetch custom fields for validation:', error);
|
||||
requestBody.custom_fields = customFieldsArray.map((field: any) => ({
|
||||
id: field.custom_field,
|
||||
value: field.value
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/tasks`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('create task', response.status, response.body);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to create task: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,333 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchContacts, fetchTags, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const findContact = createAction({
|
||||
name: 'find_contact',
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Find Contact',
|
||||
description: 'Locate a contact by name, email, phone, or advanced filters. Comprehensive contact search with dynamic filtering options.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
description: 'Search by name (supports partial matches across prefix, first, middle, last, suffix, nickname, and full name for households/companies)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
email: Property.ShortText({
|
||||
displayName: 'Email Address',
|
||||
description: 'Search by email address',
|
||||
required: false
|
||||
}),
|
||||
|
||||
phone: Property.ShortText({
|
||||
displayName: 'Phone Number',
|
||||
description: 'Search by phone number (delimiters like -, (), will be stripped automatically)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
contact_id: Property.Number({
|
||||
displayName: 'Contact ID',
|
||||
description: 'Search by specific contact ID (most precise search)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
external_unique_id: Property.ShortText({
|
||||
displayName: 'External Unique ID',
|
||||
description: 'Search by external unique identifier',
|
||||
required: false
|
||||
}),
|
||||
|
||||
contact_type: Property.StaticDropdown({
|
||||
displayName: 'Contact Type',
|
||||
description: 'Filter by contact type',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Client', value: 'Client' },
|
||||
{ label: 'Past Client', value: 'Past Client' },
|
||||
{ label: 'Prospect', value: 'Prospect' },
|
||||
{ label: 'Vendor', value: 'Vendor' },
|
||||
{ label: 'Organization', value: 'Organization' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Contact Entity Type',
|
||||
description: 'Filter by entity type',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Person', value: 'person' },
|
||||
{ label: 'Household', value: 'household' },
|
||||
{ label: 'Organization', value: 'organization' },
|
||||
{ label: 'Trust', value: 'trust' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
household_title: Property.StaticDropdown({
|
||||
displayName: 'Household Title',
|
||||
description: 'Filter by household title (only applies to household members)',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Head', value: 'Head' },
|
||||
{ label: 'Spouse', value: 'Spouse' },
|
||||
{ label: 'Partner', value: 'Partner' },
|
||||
{ label: 'Child', value: 'Child' },
|
||||
{ label: 'Grandchild', value: 'Grandchild' },
|
||||
{ label: 'Parent', value: 'Parent' },
|
||||
{ label: 'Grandparent', value: 'Grandparent' },
|
||||
{ label: 'Sibling', value: 'Sibling' },
|
||||
{ label: 'Other', value: 'Other' },
|
||||
{ label: 'Dependent', value: 'Dependent' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
tags_filter: Property.MultiSelectDropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Tags Filter',
|
||||
description: 'Filter contacts by tags',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Wealthbox account first'
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const availableTags = await fetchTags(auth.secret_text, 'Contact');
|
||||
const tagOptions = availableTags.map((tag: any) => ({
|
||||
label: tag.name,
|
||||
value: tag.name
|
||||
}));
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: tagOptions,
|
||||
placeholder: tagOptions.length === 0 ? 'No tags available' : 'Select tags to filter by'
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading tags: ${errorMessage}`
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
active: Property.StaticDropdown({
|
||||
displayName: 'Active Status',
|
||||
description: 'Filter by active status',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Active Only', value: 'true' },
|
||||
{ label: 'Inactive Only', value: 'false' },
|
||||
{ label: 'All Contacts', value: '' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
include_deleted: Property.Checkbox({
|
||||
displayName: 'Include Deleted Contacts',
|
||||
description: 'Include contacts that have been deleted',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
}),
|
||||
|
||||
updated_since: Property.DateTime({
|
||||
displayName: 'Updated Since',
|
||||
description: 'Only return contacts updated on or after this date/time',
|
||||
required: false
|
||||
}),
|
||||
|
||||
updated_before: Property.DateTime({
|
||||
displayName: 'Updated Before',
|
||||
description: 'Only return contacts updated on or before this date/time',
|
||||
required: false
|
||||
}),
|
||||
|
||||
order: Property.StaticDropdown({
|
||||
displayName: 'Sort Order',
|
||||
description: 'How to order the results',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Recent (newest first)', value: 'recent' },
|
||||
{ label: 'Created Date (newest first)', value: 'created' },
|
||||
{ label: 'Updated Date (newest first)', value: 'updated' },
|
||||
{ label: 'Ascending', value: 'asc' },
|
||||
{ label: 'Descending', value: 'desc' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
limit: Property.Number({
|
||||
displayName: 'Result Limit',
|
||||
description: 'Maximum number of contacts to return (default: 50, max: 1000)',
|
||||
required: false,
|
||||
defaultValue: 50
|
||||
}),
|
||||
|
||||
return_single_result: Property.Checkbox({
|
||||
displayName: 'Return Single Result Only',
|
||||
description: 'If checked, returns only the first matching contact. If unchecked, returns all matching contacts.',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
|
||||
const hasSearchCriteria =
|
||||
propsValue.contact_id ||
|
||||
propsValue.name ||
|
||||
propsValue.email ||
|
||||
propsValue.phone ||
|
||||
propsValue.external_unique_id ||
|
||||
propsValue.contact_type ||
|
||||
propsValue.type ||
|
||||
propsValue.household_title ||
|
||||
(propsValue as any).tags?.tags_filter ||
|
||||
propsValue.active ||
|
||||
propsValue.include_deleted ||
|
||||
propsValue.updated_since ||
|
||||
propsValue.updated_before;
|
||||
|
||||
if (!hasSearchCriteria) {
|
||||
throw new Error('At least one search criteria must be provided (ID, name, email, phone, external ID, or filters)');
|
||||
}
|
||||
|
||||
if (propsValue.contact_id && !(propsValue.name || propsValue.email || propsValue.phone || propsValue.external_unique_id || propsValue.contact_type || propsValue.type || propsValue.household_title || (propsValue as any).tags?.tags_filter || propsValue.active || propsValue.include_deleted || propsValue.updated_since || propsValue.updated_before)) {
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/contacts/${propsValue.contact_id}`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('find contact by ID', response.status, response.body);
|
||||
}
|
||||
|
||||
return {
|
||||
found: true,
|
||||
contact: response.body,
|
||||
contacts: [response.body],
|
||||
total_results: 1,
|
||||
search_criteria: { contact_id: propsValue.contact_id }
|
||||
};
|
||||
} catch (error) {
|
||||
if (error instanceof Error && error.message.includes('404')) {
|
||||
return {
|
||||
found: false,
|
||||
contact: null,
|
||||
contacts: [],
|
||||
total_results: 0,
|
||||
message: `No contact found with ID: ${propsValue.contact_id}`,
|
||||
search_criteria: { contact_id: propsValue.contact_id }
|
||||
};
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
if (propsValue.name) searchParams.append('name', propsValue.name);
|
||||
if (propsValue.email) searchParams.append('email', propsValue.email);
|
||||
if (propsValue.phone) searchParams.append('phone', propsValue.phone);
|
||||
if (propsValue.contact_id) searchParams.append('id', propsValue.contact_id.toString());
|
||||
if (propsValue.external_unique_id) searchParams.append('external_unique_id', propsValue.external_unique_id);
|
||||
|
||||
if (propsValue.contact_type) searchParams.append('contact_type', propsValue.contact_type);
|
||||
if (propsValue.type) searchParams.append('type', propsValue.type);
|
||||
if (propsValue.household_title) searchParams.append('household_title', propsValue.household_title);
|
||||
|
||||
const tagsFilter = propsValue.tags_filter;
|
||||
if (tagsFilter && Array.isArray(tagsFilter) && tagsFilter.length > 0) {
|
||||
tagsFilter.forEach((tag: string) => {
|
||||
searchParams.append('tags[]', tag);
|
||||
});
|
||||
}
|
||||
|
||||
if (propsValue.active && propsValue.active !== '') {
|
||||
searchParams.append('active', propsValue.active);
|
||||
}
|
||||
if (propsValue.include_deleted) {
|
||||
searchParams.append('deleted', 'true');
|
||||
}
|
||||
|
||||
if (propsValue.updated_since) searchParams.append('updated_since', propsValue.updated_since);
|
||||
if (propsValue.updated_before) searchParams.append('updated_before', propsValue.updated_before);
|
||||
|
||||
if (propsValue.order) searchParams.append('order', propsValue.order);
|
||||
|
||||
const limit = Math.min(propsValue.limit || 50, 1000);
|
||||
searchParams.append('limit', limit.toString());
|
||||
|
||||
const queryString = searchParams.toString();
|
||||
const url = queryString ? `${WEALTHBOX_API_BASE}/contacts?${queryString}` : `${WEALTHBOX_API_BASE}/contacts`;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('find contacts', response.status, response.body);
|
||||
}
|
||||
|
||||
const contacts = response.body.contacts || [];
|
||||
const totalResults = contacts.length;
|
||||
|
||||
if (propsValue.return_single_result || totalResults === 1) {
|
||||
return {
|
||||
found: totalResults > 0,
|
||||
contact: totalResults > 0 ? contacts[0] : null,
|
||||
contacts: contacts,
|
||||
total_results: totalResults,
|
||||
search_criteria: Object.fromEntries(searchParams),
|
||||
message: totalResults === 0 ? 'No contacts found matching the search criteria' : undefined
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
found: totalResults > 0,
|
||||
contacts: contacts,
|
||||
total_results: totalResults,
|
||||
search_criteria: Object.fromEntries(searchParams),
|
||||
message: totalResults === 0 ? 'No contacts found matching the search criteria' : undefined
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to find contacts: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,347 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchContacts, fetchProjects, fetchOpportunities, fetchUsers, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const findTask = createAction({
|
||||
auth: wealthboxAuth,
|
||||
name: 'find_task',
|
||||
displayName: 'Find Task',
|
||||
description: 'Finds existing tasks using comprehensive search filters. Search by assignment, resource, completion status, and date ranges.',
|
||||
props: {
|
||||
task_id: Property.Number({
|
||||
displayName: 'Task ID (Optional)',
|
||||
description: 'Search for a specific task by its unique ID. Leave empty to search using filters.',
|
||||
required: false
|
||||
}),
|
||||
|
||||
resource_type: Property.StaticDropdown({
|
||||
displayName: 'Linked Resource Type',
|
||||
description: 'Filter tasks by the type of resource they are linked to',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: 'Contact' },
|
||||
{ label: 'Project', value: 'Project' },
|
||||
{ label: 'Opportunity', value: 'Opportunity' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
resource_record: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Resource',
|
||||
description: 'Select the specific resource to filter tasks by',
|
||||
required: false,
|
||||
refreshers: ['resource_type'],
|
||||
props: async ({ auth, resource_type }) => {
|
||||
if (!auth || !resource_type) {
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
let records: any[] = [];
|
||||
let recordType = '';
|
||||
|
||||
const resourceTypeValue = resource_type as unknown as string;
|
||||
|
||||
switch (resourceTypeValue) {
|
||||
case 'Contact':
|
||||
records = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
recordType = 'Contact';
|
||||
break;
|
||||
case 'Project':
|
||||
records = await fetchProjects(auth.secret_text);
|
||||
recordType = 'Project';
|
||||
break;
|
||||
case 'Opportunity':
|
||||
records = await fetchOpportunities(auth.secret_text);
|
||||
recordType = 'Opportunity';
|
||||
break;
|
||||
default:
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
const recordOptions = records.map((record: any) => ({
|
||||
label: record.name || record.title || `${recordType} ${record.id}`,
|
||||
value: record.id
|
||||
}));
|
||||
|
||||
return {
|
||||
resource_id: Property.StaticDropdown({
|
||||
displayName: `${recordType} Record`,
|
||||
description: `Select the ${recordType.toLowerCase()} to filter tasks by`,
|
||||
required: false,
|
||||
options: {
|
||||
options: recordOptions
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually (API unavailable)',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
assigned_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Assigned To',
|
||||
description: 'Filter tasks by the user they are assigned to',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
return {
|
||||
options: users.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
assigned_to_team: Property.Number({
|
||||
displayName: 'Assigned to Team ID',
|
||||
description: 'Filter tasks by the team they are assigned to',
|
||||
required: false
|
||||
}),
|
||||
|
||||
created_by: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Created By',
|
||||
description: 'Filter tasks by the user who created them',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
return {
|
||||
options: users.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
completed: Property.StaticDropdown({
|
||||
displayName: 'Completion Status',
|
||||
description: 'Filter by task completion status',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'All Tasks', value: '' },
|
||||
{ label: 'Completed Only', value: 'true' },
|
||||
{ label: 'Incomplete Only', value: 'false' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
task_type: Property.StaticDropdown({
|
||||
displayName: 'Task Type',
|
||||
description: 'Filter by task type',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'All Tasks', value: 'all' },
|
||||
{ label: 'Parent Tasks Only', value: 'parents' },
|
||||
{ label: 'Subtasks Only', value: 'subtasks' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
updated_since: Property.DateTime({
|
||||
displayName: 'Updated Since',
|
||||
description: 'Only return tasks updated on or after this date/time',
|
||||
required: false
|
||||
}),
|
||||
|
||||
updated_before: Property.DateTime({
|
||||
displayName: 'Updated Before',
|
||||
description: 'Only return tasks updated on or before this date/time',
|
||||
required: false
|
||||
}),
|
||||
|
||||
limit: Property.Number({
|
||||
displayName: 'Result Limit',
|
||||
description: 'Maximum number of tasks to return (default: 50, max: 1000)',
|
||||
required: false,
|
||||
defaultValue: 50
|
||||
}),
|
||||
|
||||
return_single_result: Property.Checkbox({
|
||||
displayName: 'Return Single Result Only',
|
||||
description: 'If checked, returns only the first matching task. If unchecked, returns all matching tasks.',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
|
||||
|
||||
const hasSearchCriteria =
|
||||
propsValue.task_id ||
|
||||
propsValue.resource_type ||
|
||||
(propsValue as any).resource_record?.resource_id ||
|
||||
propsValue.assigned_to ||
|
||||
propsValue.assigned_to_team ||
|
||||
propsValue.created_by ||
|
||||
propsValue.completed ||
|
||||
propsValue.task_type ||
|
||||
propsValue.updated_since ||
|
||||
propsValue.updated_before;
|
||||
|
||||
if (!hasSearchCriteria) {
|
||||
throw new Error('At least one search criteria must be provided (Task ID, resource, assignment, status, or date filters)');
|
||||
}
|
||||
|
||||
if (propsValue.task_id && !(propsValue.resource_type || (propsValue as any).resource_record?.resource_id || propsValue.assigned_to || propsValue.assigned_to_team || propsValue.created_by || propsValue.completed || propsValue.task_type || propsValue.updated_since || propsValue.updated_before)) {
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/tasks/${propsValue.task_id}`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('find task by ID', response.status, response.body);
|
||||
}
|
||||
|
||||
return {
|
||||
found: true,
|
||||
task: response.body,
|
||||
tasks: [response.body],
|
||||
total_results: 1,
|
||||
search_criteria: { task_id: propsValue.task_id }
|
||||
};
|
||||
} catch (error) {
|
||||
if (error instanceof Error && error.message.includes('404')) {
|
||||
return {
|
||||
found: false,
|
||||
task: null,
|
||||
tasks: [],
|
||||
total_results: 0,
|
||||
message: `No task found with ID: ${propsValue.task_id}`,
|
||||
search_criteria: { task_id: propsValue.task_id }
|
||||
};
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
|
||||
if (propsValue.task_id) searchParams.append('id', propsValue.task_id.toString());
|
||||
|
||||
if (propsValue.resource_type) searchParams.append('resource_type', propsValue.resource_type);
|
||||
const resourceRecord = (propsValue as any).resource_record;
|
||||
if (resourceRecord?.resource_id) {
|
||||
searchParams.append('resource_id', resourceRecord.resource_id.toString());
|
||||
}
|
||||
|
||||
if (propsValue.assigned_to) searchParams.append('assigned_to', propsValue.assigned_to);
|
||||
if (propsValue.assigned_to_team) searchParams.append('assigned_to_team', propsValue.assigned_to_team.toString());
|
||||
if (propsValue.created_by) searchParams.append('created_by', propsValue.created_by);
|
||||
|
||||
if (propsValue.completed && propsValue.completed !== '') {
|
||||
searchParams.append('completed', propsValue.completed);
|
||||
}
|
||||
if (propsValue.task_type && propsValue.task_type !== 'all') {
|
||||
searchParams.append('task_type', propsValue.task_type);
|
||||
}
|
||||
|
||||
if (propsValue.updated_since) searchParams.append('updated_since', propsValue.updated_since);
|
||||
if (propsValue.updated_before) searchParams.append('updated_before', propsValue.updated_before);
|
||||
|
||||
const limit = Math.min(propsValue.limit || 50, 1000);
|
||||
searchParams.append('limit', limit.toString());
|
||||
|
||||
const queryString = searchParams.toString();
|
||||
const url = queryString ? `${WEALTHBOX_API_BASE}/tasks?${queryString}` : `${WEALTHBOX_API_BASE}/tasks`;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('find tasks', response.status, response.body);
|
||||
}
|
||||
|
||||
const tasks = response.body.tasks || [];
|
||||
const totalResults = tasks.length;
|
||||
|
||||
if (propsValue.return_single_result || totalResults === 1) {
|
||||
return {
|
||||
found: totalResults > 0,
|
||||
task: totalResults > 0 ? tasks[0] : null,
|
||||
tasks: tasks,
|
||||
total_results: totalResults,
|
||||
search_criteria: Object.fromEntries(searchParams),
|
||||
message: totalResults === 0 ? 'No tasks found matching the search criteria' : undefined
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
found: totalResults > 0,
|
||||
tasks: tasks,
|
||||
total_results: totalResults,
|
||||
search_criteria: Object.fromEntries(searchParams),
|
||||
message: totalResults === 0 ? 'No tasks found matching the search criteria' : undefined
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to find tasks: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,11 @@
|
||||
export { createContact } from './create-contact';
|
||||
export { createNote } from './create-note';
|
||||
export { createProject } from './create-project';
|
||||
export { addHouseholdMember } from './add-household-member';
|
||||
export { createHousehold } from './create-household';
|
||||
export { createEvent } from './create-event';
|
||||
export { createOpportunity } from './create-opportunity';
|
||||
export { createTask } from './create-task';
|
||||
export { startWorkflow } from './start-workflow';
|
||||
export { findContact } from './find-contact';
|
||||
export { findTask } from './find-task';
|
||||
@@ -0,0 +1,376 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { fetchWorkflowTemplates, fetchContacts, fetchProjects, fetchOpportunities, fetchUserGroups, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
export const startWorkflow = createAction({
|
||||
name: 'start_workflow',
|
||||
displayName: 'Start Workflow',
|
||||
auth: wealthboxAuth,
|
||||
description: 'Triggers a workflow template on a contact/project/opportunity. Automate multi-step sequences based on CRM events.',
|
||||
props: {
|
||||
workflow_template: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Workflow Template',
|
||||
description: 'Select the workflow template to trigger',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const templates = await fetchWorkflowTemplates(auth.secret_text);
|
||||
return {
|
||||
options: templates.map((template: any) => ({
|
||||
label: template.name || template.label || `Template ${template.id}`,
|
||||
value: template.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load workflow templates. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
linked_type: Property.StaticDropdown({
|
||||
displayName: 'Link To',
|
||||
description: 'What type of record to link this workflow to',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: 'Contact' },
|
||||
{ label: 'Project', value: 'Project' },
|
||||
{ label: 'Opportunity', value: 'Opportunity' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
linked_record: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Record',
|
||||
description: 'Select the record to link this workflow to',
|
||||
required: true,
|
||||
refreshers: ['linked_type'],
|
||||
props: async ({ auth, linked_type }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
linked_id: Property.Number({
|
||||
displayName: 'Record ID',
|
||||
description: 'Enter the record ID manually',
|
||||
required: true
|
||||
}),
|
||||
linked_name: Property.ShortText({
|
||||
displayName: 'Record Name',
|
||||
description: 'Enter the record name for reference',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
let records: any[] = [];
|
||||
let recordType = '';
|
||||
|
||||
const linkedTypeValue = linked_type as unknown as string;
|
||||
|
||||
switch (linkedTypeValue) {
|
||||
case 'Contact':
|
||||
records = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
recordType = 'Contact';
|
||||
break;
|
||||
case 'Project':
|
||||
records = await fetchProjects(auth.secret_text);
|
||||
recordType = 'Project';
|
||||
break;
|
||||
case 'Opportunity':
|
||||
records = await fetchOpportunities(auth.secret_text);
|
||||
recordType = 'Opportunity';
|
||||
break;
|
||||
default:
|
||||
return {
|
||||
linked_id: Property.Number({
|
||||
displayName: 'Record ID',
|
||||
description: 'Enter the record ID manually',
|
||||
required: true
|
||||
}),
|
||||
linked_name: Property.ShortText({
|
||||
displayName: 'Record Name',
|
||||
description: 'Enter the record name for reference',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
const recordOptions = records.map((record: any) => ({
|
||||
label: record.name || record.title || record.label || `${recordType} ${record.id}`,
|
||||
value: record.id
|
||||
}));
|
||||
|
||||
return {
|
||||
linked_id: Property.StaticDropdown({
|
||||
displayName: `${recordType} Record`,
|
||||
description: `Select the ${recordType.toLowerCase()} to link this workflow to`,
|
||||
required: true,
|
||||
options: {
|
||||
options: recordOptions
|
||||
}
|
||||
}),
|
||||
linked_name: Property.ShortText({
|
||||
displayName: 'Record Name',
|
||||
description: 'The name will be automatically populated from the selected record',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
linked_id: Property.Number({
|
||||
displayName: 'Record ID',
|
||||
description: 'Enter the record ID manually (API unavailable)',
|
||||
required: true
|
||||
}),
|
||||
linked_name: Property.ShortText({
|
||||
displayName: 'Record Name',
|
||||
description: 'Enter the record name for reference',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
label: Property.ShortText({
|
||||
displayName: 'Workflow Label',
|
||||
description: 'A short name for the workflow (e.g., "Onboard a new client to the firm")',
|
||||
required: false
|
||||
}),
|
||||
|
||||
starts_at: Property.DateTime({
|
||||
displayName: 'Start Date & Time',
|
||||
description: 'When you want the workflow to start (optional, defaults to now)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
visible_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Visible To',
|
||||
description: 'Select who can view this workflow',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const userGroups = await fetchUserGroups(auth.secret_text);
|
||||
return {
|
||||
options: userGroups.map((group: any) => ({
|
||||
label: group.name,
|
||||
value: group.name
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load user groups. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
workflow_milestones: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Workflow Milestones',
|
||||
description: 'Add milestones to this workflow',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
milestones_array: Property.Array({
|
||||
displayName: 'Milestones',
|
||||
description: 'Add workflow milestones',
|
||||
required: false,
|
||||
properties: {
|
||||
milestone_id: Property.ShortText({
|
||||
displayName: 'Milestone ID',
|
||||
description: 'The ID of the milestone',
|
||||
required: true
|
||||
}),
|
||||
milestone_name: Property.ShortText({
|
||||
displayName: 'Milestone Name',
|
||||
description: 'The name of the milestone',
|
||||
required: true
|
||||
}),
|
||||
milestone_date: Property.DateTime({
|
||||
displayName: 'Milestone Date',
|
||||
description: 'When this milestone should occur',
|
||||
required: false
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
return {
|
||||
milestones_array: Property.Array({
|
||||
displayName: 'Milestones',
|
||||
description: 'Add workflow milestones for this template',
|
||||
required: false,
|
||||
properties: {
|
||||
milestone_id: Property.ShortText({
|
||||
displayName: 'Milestone ID',
|
||||
description: 'The ID of the milestone (from template)',
|
||||
required: true
|
||||
}),
|
||||
milestone_name: Property.ShortText({
|
||||
displayName: 'Milestone Name',
|
||||
description: 'The name of the milestone',
|
||||
required: true
|
||||
}),
|
||||
milestone_date: Property.DateTime({
|
||||
displayName: 'Milestone Date',
|
||||
description: 'When this milestone should occur',
|
||||
required: false
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
console.warn('Could not fetch milestones for validation:', error);
|
||||
return {
|
||||
milestones_array: Property.Array({
|
||||
displayName: 'Milestones',
|
||||
description: 'Add workflow milestones (API unavailable)',
|
||||
required: false,
|
||||
properties: {
|
||||
milestone_id: Property.ShortText({
|
||||
displayName: 'Milestone ID',
|
||||
description: 'The ID of the milestone',
|
||||
required: true
|
||||
}),
|
||||
milestone_name: Property.ShortText({
|
||||
displayName: 'Milestone Name',
|
||||
description: 'The name of the milestone',
|
||||
required: true
|
||||
}),
|
||||
milestone_date: Property.DateTime({
|
||||
displayName: 'Milestone Date',
|
||||
description: 'When this milestone should occur',
|
||||
required: false
|
||||
})
|
||||
}
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { auth, propsValue } = context;
|
||||
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
|
||||
|
||||
const requestBody: any = {
|
||||
workflow_template: propsValue.workflow_template
|
||||
};
|
||||
|
||||
const linkedRecord = (propsValue as any).linked_record;
|
||||
if (linkedRecord) {
|
||||
let linkedId: number;
|
||||
let linkedName: string;
|
||||
|
||||
if (linkedRecord.linked_id) {
|
||||
linkedId = linkedRecord.linked_id;
|
||||
linkedName = linkedRecord.linked_name || `${propsValue.linked_type} ${linkedId}`;
|
||||
} else {
|
||||
linkedId = linkedRecord.linked_id;
|
||||
linkedName = linkedRecord.linked_name || `${propsValue.linked_type} ${linkedId}`;
|
||||
}
|
||||
|
||||
try {
|
||||
let recordName = linkedName;
|
||||
|
||||
if (propsValue.linked_type === 'Contact' && linkedId) {
|
||||
const contacts = await fetchContacts(auth.secret_text, { active: true });
|
||||
const contact = contacts.find((c: any) => c.id === linkedId);
|
||||
if (contact) {
|
||||
recordName = contact.name || `${contact.first_name} ${contact.last_name}`.trim();
|
||||
}
|
||||
} else if (propsValue.linked_type === 'Project' && linkedId) {
|
||||
const projects = await fetchProjects(auth.secret_text);
|
||||
const project = projects.find((p: any) => p.id === linkedId);
|
||||
if (project) {
|
||||
recordName = project.name || project.title || `Project ${linkedId}`;
|
||||
}
|
||||
} else if (propsValue.linked_type === 'Opportunity' && linkedId) {
|
||||
const opportunities = await fetchOpportunities(auth.secret_text);
|
||||
const opportunity = opportunities.find((o: any) => o.id === linkedId);
|
||||
if (opportunity) {
|
||||
recordName = opportunity.name || `Opportunity ${linkedId}`;
|
||||
}
|
||||
}
|
||||
|
||||
requestBody.linked_to = {
|
||||
id: linkedId,
|
||||
type: propsValue.linked_type,
|
||||
name: recordName
|
||||
};
|
||||
} catch (error) {
|
||||
requestBody.linked_to = {
|
||||
id: linkedId,
|
||||
type: propsValue.linked_type,
|
||||
name: linkedName
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (propsValue.label) {
|
||||
requestBody.label = propsValue.label;
|
||||
}
|
||||
|
||||
if (propsValue.starts_at) {
|
||||
requestBody.starts_at = propsValue.starts_at;
|
||||
}
|
||||
|
||||
if (propsValue.visible_to) {
|
||||
requestBody.visible_to = propsValue.visible_to;
|
||||
}
|
||||
|
||||
const milestonesArray = (propsValue as any).workflow_milestones?.milestones_array;
|
||||
if (milestonesArray && Array.isArray(milestonesArray) && milestonesArray.length > 0) {
|
||||
requestBody.workflow_milestones = milestonesArray.map((milestone: any) => ({
|
||||
id: milestone.milestone_id,
|
||||
name: milestone.milestone_name,
|
||||
...(milestone.milestone_date && { milestone_date: milestone.milestone_date })
|
||||
}));
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${WEALTHBOX_API_BASE}/workflows`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: requestBody
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('start workflow', response.status, response.body);
|
||||
}
|
||||
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to start workflow: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,270 @@
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { WEALTHBOX_API_BASE } from './constants';
|
||||
|
||||
export const fetchUserGroups = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/user_groups`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch user groups: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.user_groups || [];
|
||||
};
|
||||
|
||||
export const fetchContacts = async (auth: string, filters?: { active?: boolean; order?: string }) => {
|
||||
const params = new URLSearchParams();
|
||||
if (filters?.active !== undefined) params.append('active', filters.active.toString());
|
||||
if (filters?.order) params.append('order', filters.order);
|
||||
|
||||
const url = `${WEALTHBOX_API_BASE}/contacts${params.toString() ? '?' + params.toString() : ''}`;
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch contacts: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.contacts || [];
|
||||
};
|
||||
|
||||
export const fetchTags = async (auth: string, documentType?: string) => {
|
||||
const params = new URLSearchParams();
|
||||
if (documentType) params.append('document_type', documentType);
|
||||
|
||||
const url = `${WEALTHBOX_API_BASE}/categories/tags${params.toString() ? '?' + params.toString() : ''}`;
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch tags: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.tags || [];
|
||||
};
|
||||
|
||||
export const fetchUsers = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/users`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch users: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.users || [];
|
||||
};
|
||||
|
||||
export const fetchCustomFields = async (auth: string, documentType?: string) => {
|
||||
const params = new URLSearchParams();
|
||||
if (documentType) params.append('document_type', documentType);
|
||||
|
||||
const url = `${WEALTHBOX_API_BASE}/categories/custom_fields${params.toString() ? '?' + params.toString() : ''}`;
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch custom fields: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.custom_fields || [];
|
||||
};
|
||||
|
||||
export const fetchEventCategories = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/event_categories`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch event categories: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.event_categories || [];
|
||||
};
|
||||
|
||||
export const fetchHouseholds = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/contacts?type=Household&active=true`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch households: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.contacts || [];
|
||||
};
|
||||
|
||||
export const fetchOpportunityStages = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/opportunity_stages`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch opportunity stages: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.opportunity_stages || [];
|
||||
};
|
||||
|
||||
export const fetchTaskCategories = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/task_categories`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch task categories: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.task_categories || [];
|
||||
};
|
||||
|
||||
export const fetchOpportunities = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/opportunities`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch opportunities: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.opportunities || [];
|
||||
};
|
||||
|
||||
export const fetchProjects = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/projects`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch projects: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.projects || [];
|
||||
};
|
||||
|
||||
export const fetchWorkflowTemplates = async (auth: string) => {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: `${WEALTHBOX_API_BASE}/workflow_templates`,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch workflow templates: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.workflow_templates || [];
|
||||
};
|
||||
|
||||
export const fetchTasks = async (auth: string, filters?: {
|
||||
resource_id?: number;
|
||||
resource_type?: string;
|
||||
assigned_to?: number;
|
||||
completed?: boolean;
|
||||
task_type?: string;
|
||||
updated_since?: string;
|
||||
updated_before?: string;
|
||||
limit?: number;
|
||||
}) => {
|
||||
const params = new URLSearchParams();
|
||||
|
||||
if (filters?.resource_id) params.append('resource_id', filters.resource_id.toString());
|
||||
if (filters?.resource_type) params.append('resource_type', filters.resource_type);
|
||||
if (filters?.assigned_to) params.append('assigned_to', filters.assigned_to.toString());
|
||||
if (filters?.completed !== undefined) params.append('completed', filters.completed.toString());
|
||||
if (filters?.task_type) params.append('task_type', filters.task_type);
|
||||
if (filters?.updated_since) params.append('updated_since', filters.updated_since);
|
||||
if (filters?.updated_before) params.append('updated_before', filters.updated_before);
|
||||
if (filters?.limit) params.append('limit', filters.limit.toString());
|
||||
|
||||
const url = `${WEALTHBOX_API_BASE}/tasks${params.toString() ? '?' + params.toString() : ''}`;
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
throw new Error(`Failed to fetch tasks: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.body.tasks || [];
|
||||
};
|
||||
|
||||
export const createApiHeaders = (auth: string) => ({
|
||||
'ACCESS_TOKEN': auth,
|
||||
'Content-Type': 'application/json'
|
||||
});
|
||||
|
||||
export const handleApiError = (operation: string, status: number, body?: any) => {
|
||||
throw new Error(`Wealthbox API error in ${operation}: ${status} - ${JSON.stringify(body)}`);
|
||||
};
|
||||
@@ -0,0 +1,69 @@
|
||||
|
||||
export const WEALTHBOX_API_BASE = 'https://api.crmworkspace.com/v1';
|
||||
|
||||
export const DOCUMENT_TYPES = {
|
||||
CONTACT_NOTE: 'ContactNote',
|
||||
CONTACT: 'Contact',
|
||||
TASK: 'Task',
|
||||
EVENT: 'Event',
|
||||
OPPORTUNITY: 'Opportunity',
|
||||
PROJECT: 'Project'
|
||||
} as const;
|
||||
|
||||
export const EVENT_STATES = {
|
||||
UNCONFIRMED: 'unconfirmed',
|
||||
CONFIRMED: 'confirmed',
|
||||
TENTATIVE: 'tentative',
|
||||
COMPLETED: 'completed',
|
||||
CANCELLED: 'cancelled'
|
||||
} as const;
|
||||
|
||||
export const OPPORTUNITY_AMOUNT_KINDS = {
|
||||
FEE: 'Fee',
|
||||
COMMISSION: 'Commission',
|
||||
AUM: 'AUM',
|
||||
OTHER: 'Other'
|
||||
} as const;
|
||||
|
||||
export const CURRENCIES = {
|
||||
USD: '$',
|
||||
EUR: '€',
|
||||
GBP: '£',
|
||||
CAD: 'C$',
|
||||
AUD: 'A$'
|
||||
} as const;
|
||||
|
||||
export const TASK_PRIORITIES = {
|
||||
LOW: 'Low',
|
||||
MEDIUM: 'Medium',
|
||||
HIGH: 'High'
|
||||
} as const;
|
||||
|
||||
export const LINK_TYPES = {
|
||||
CONTACT: 'Contact',
|
||||
PROJECT: 'Project',
|
||||
OPPORTUNITY: 'Opportunity'
|
||||
} as const;
|
||||
|
||||
export const CONTACT_TYPES = {
|
||||
PERSON: 'Person',
|
||||
HOUSEHOLD: 'Household',
|
||||
ORGANIZATION: 'Organization',
|
||||
TRUST: 'Trust'
|
||||
} as const;
|
||||
|
||||
export const CONTACT_CLASSIFICATIONS = {
|
||||
CLIENT: 'Client',
|
||||
PAST_CLIENT: 'Past Client',
|
||||
PROSPECT: 'Prospect',
|
||||
VENDOR: 'Vendor',
|
||||
ORGANIZATION: 'Organization'
|
||||
} as const;
|
||||
|
||||
export const ORDER_OPTIONS = {
|
||||
RECENT: 'recent',
|
||||
CREATED: 'created',
|
||||
UPDATED: 'updated',
|
||||
ASCENDING: 'asc',
|
||||
DESCENDING: 'desc'
|
||||
} as const;
|
||||
@@ -0,0 +1,3 @@
|
||||
export * from './api-helpers';
|
||||
export * from './types';
|
||||
export * from './constants';
|
||||
@@ -0,0 +1,73 @@
|
||||
|
||||
export interface UserGroup {
|
||||
id: number;
|
||||
name: string;
|
||||
user: number | null;
|
||||
}
|
||||
|
||||
export interface Contact {
|
||||
id: number;
|
||||
name?: string;
|
||||
first_name?: string;
|
||||
last_name?: string;
|
||||
type?: string;
|
||||
email?: string;
|
||||
phone?: string;
|
||||
active?: boolean;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
export interface Tag {
|
||||
id: number;
|
||||
name: string;
|
||||
type?: string;
|
||||
document_type?: string;
|
||||
}
|
||||
|
||||
export interface User {
|
||||
id: number;
|
||||
name: string;
|
||||
email: string;
|
||||
account: number;
|
||||
excluded_from_assignments: boolean;
|
||||
}
|
||||
|
||||
export interface CustomField {
|
||||
id: number;
|
||||
name: string;
|
||||
field_type?: string;
|
||||
document_type?: string;
|
||||
required?: boolean;
|
||||
}
|
||||
|
||||
export interface Note {
|
||||
id: number;
|
||||
content: string;
|
||||
creator: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
linked_to: LinkedResource[];
|
||||
visible_to?: string;
|
||||
tags: Tag[];
|
||||
}
|
||||
|
||||
export interface LinkedResource {
|
||||
id: number;
|
||||
type: string;
|
||||
name?: string;
|
||||
}
|
||||
|
||||
export interface ContactFilters {
|
||||
active?: boolean;
|
||||
order?: string;
|
||||
name?: string;
|
||||
email?: string;
|
||||
phone?: string;
|
||||
tags?: string[];
|
||||
type?: string;
|
||||
}
|
||||
|
||||
export interface TagFilters {
|
||||
document_type?: string;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export { newTask } from './new-task';
|
||||
export { newContact } from './new-contact';
|
||||
export { newEvent } from './new-event';
|
||||
export { newOpportunity } from './new-opportunity';
|
||||
@@ -0,0 +1,323 @@
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
httpClient,
|
||||
HttpMethod
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
pollingHelper,
|
||||
DedupeStrategy,
|
||||
Polling
|
||||
} from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
import { fetchUsers, fetchTags, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
const polling: Polling<any, any> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ propsValue, lastFetchEpochMS, auth }) => {
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
|
||||
searchParams.append('limit', '100');
|
||||
|
||||
if (propsValue.contact_type) searchParams.append('contact_type', propsValue.contact_type);
|
||||
if (propsValue.type) searchParams.append('type', propsValue.type);
|
||||
if (propsValue.household_title) searchParams.append('household_title', propsValue.household_title);
|
||||
if (propsValue.assigned_to) searchParams.append('assigned_to', propsValue.assigned_to);
|
||||
|
||||
const tagsFilter = propsValue.tags_filter;
|
||||
if (tagsFilter && Array.isArray(tagsFilter) && tagsFilter.length > 0) {
|
||||
tagsFilter.forEach((tag: string) => {
|
||||
searchParams.append('tags[]', tag);
|
||||
});
|
||||
}
|
||||
|
||||
if (propsValue.active !== undefined && propsValue.active !== '') {
|
||||
searchParams.append('active', propsValue.active);
|
||||
}
|
||||
if (propsValue.include_deleted) {
|
||||
searchParams.append('deleted', 'true');
|
||||
}
|
||||
|
||||
if (lastFetchEpochMS) {
|
||||
const lastFetchDate = dayjs(lastFetchEpochMS - 1000).toISOString();
|
||||
searchParams.append('updated_since', lastFetchDate);
|
||||
}
|
||||
|
||||
const queryString = searchParams.toString();
|
||||
const url = queryString ? `${WEALTHBOX_API_BASE}/contacts?${queryString}` : `${WEALTHBOX_API_BASE}/contacts`;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('poll new contacts', response.status, response.body);
|
||||
}
|
||||
|
||||
const contacts = response.body.contacts || [];
|
||||
|
||||
const newContacts = contacts.filter((contact: any) => {
|
||||
if (!lastFetchEpochMS) return true;
|
||||
|
||||
const contactCreatedAt = dayjs(contact.created_at).valueOf();
|
||||
return contactCreatedAt > lastFetchEpochMS;
|
||||
});
|
||||
|
||||
return newContacts.map((contact: any) => ({
|
||||
epochMilliSeconds: dayjs(contact.created_at).valueOf(),
|
||||
data: contact
|
||||
}));
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to poll new contacts: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const newContact = createTrigger({
|
||||
name: 'new_contact',
|
||||
displayName: 'New Contact',
|
||||
description: 'Fires when a new contact is created',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
contact_type: Property.StaticDropdown({
|
||||
displayName: 'Contact Type',
|
||||
description: 'Only trigger for contacts of this type (optional)',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Client', value: 'Client' },
|
||||
{ label: 'Past Client', value: 'Past Client' },
|
||||
{ label: 'Prospect', value: 'Prospect' },
|
||||
{ label: 'Vendor', value: 'Vendor' },
|
||||
{ label: 'Organization', value: 'Organization' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Entity Type',
|
||||
description: 'Only trigger for contacts of this entity type (optional)',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Person', value: 'person' },
|
||||
{ label: 'Household', value: 'household' },
|
||||
{ label: 'Organization', value: 'organization' },
|
||||
{ label: 'Trust', value: 'trust' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
household_title: Property.StaticDropdown({
|
||||
displayName: 'Household Title',
|
||||
description: 'Only trigger for contacts with this household title (optional)',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Head', value: 'Head' },
|
||||
{ label: 'Spouse', value: 'Spouse' },
|
||||
{ label: 'Partner', value: 'Partner' },
|
||||
{ label: 'Child', value: 'Child' },
|
||||
{ label: 'Grandchild', value: 'Grandchild' },
|
||||
{ label: 'Parent', value: 'Parent' },
|
||||
{ label: 'Grandparent', value: 'Grandparent' },
|
||||
{ label: 'Sibling', value: 'Sibling' },
|
||||
{ label: 'Other', value: 'Other' },
|
||||
{ label: 'Dependent', value: 'Dependent' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
assigned_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Assigned To',
|
||||
description: 'Only trigger for contacts assigned to this user (optional)',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
return {
|
||||
options: users.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
tags_filter: Property.MultiSelectDropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Tags Filter',
|
||||
description: 'Only trigger for contacts with one of these tags (optional)',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Wealthbox account first'
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const availableTags = await fetchTags(auth.secret_text, 'Contact');
|
||||
const tagOptions = availableTags.map((tag: any) => ({
|
||||
label: tag.name,
|
||||
value: tag.name
|
||||
}));
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: tagOptions,
|
||||
placeholder: tagOptions.length === 0 ? 'No tags available' : 'Select tags to filter by'
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading tags: ${errorMessage}`
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
active: Property.StaticDropdown({
|
||||
displayName: 'Active Status',
|
||||
description: 'Filter by active status',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'All Contacts', value: '' },
|
||||
{ label: 'Active Only', value: 'true' },
|
||||
{ label: 'Inactive Only', value: 'false' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
include_deleted: Property.Checkbox({
|
||||
displayName: 'Include Deleted Contacts',
|
||||
description: 'Include contacts that have been deleted',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
})
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator: 1,
|
||||
created_at: '2015-05-24 10:00 AM -0400',
|
||||
updated_at: '2015-10-12 11:30 PM -0400',
|
||||
prefix: 'Mr.',
|
||||
first_name: 'Kevin',
|
||||
middle_name: 'James',
|
||||
last_name: 'Anderson',
|
||||
suffix: 'M.D.',
|
||||
nickname: 'Kev',
|
||||
job_title: 'CEO',
|
||||
twitter_name: 'kev.anderson',
|
||||
linkedin_url: 'linkedin.com/in/kanderson',
|
||||
background_information: 'Met Kevin at a conference.',
|
||||
birth_date: '1975-10-27',
|
||||
anniversary: '1998-11-29',
|
||||
client_since: '2002-05-21',
|
||||
assigned_to: 1,
|
||||
referred_by: 1,
|
||||
type: 'Person',
|
||||
gender: 'Male',
|
||||
contact_source: 'Referral',
|
||||
contact_type: 'Client',
|
||||
status: 'Active',
|
||||
marital_status: 'Married',
|
||||
important_information: 'Has 3 kids in college',
|
||||
personal_interests: 'Skiing: Downhill, Traveling',
|
||||
investment_objective: 'Income',
|
||||
time_horizon: 'Intermediate',
|
||||
risk_tolerance: 'Moderate',
|
||||
company_name: 'Acme Co.',
|
||||
tags: [
|
||||
{
|
||||
id: 1,
|
||||
name: 'Clients'
|
||||
}
|
||||
],
|
||||
street_addresses: [
|
||||
{
|
||||
street_line_1: '155 12th Ave.',
|
||||
street_line_2: 'Apt 3B',
|
||||
city: 'New York',
|
||||
state: 'New York',
|
||||
zip_code: '10001',
|
||||
country: 'United States',
|
||||
principal: true,
|
||||
kind: 'Work',
|
||||
id: 1,
|
||||
address: '155 12th Ave., Apt 3B, New York, New York 10001, United States'
|
||||
}
|
||||
],
|
||||
email_addresses: [
|
||||
{
|
||||
id: 1,
|
||||
address: 'kevin.anderson@example.com',
|
||||
principal: true,
|
||||
kind: 'Work'
|
||||
}
|
||||
],
|
||||
phone_numbers: [
|
||||
{
|
||||
id: 1,
|
||||
address: '(555) 555-5555',
|
||||
principal: true,
|
||||
extension: '77',
|
||||
kind: 'Work'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
onEnable: async (context) => {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
onDisable: async (context) => {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
run: async (context) => {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
|
||||
test: async (context) => {
|
||||
return await pollingHelper.test(polling, context);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,294 @@
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
httpClient,
|
||||
HttpMethod
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
pollingHelper,
|
||||
DedupeStrategy,
|
||||
Polling
|
||||
} from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
import { fetchContacts, fetchProjects, fetchOpportunities, fetchEventCategories, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
const polling: Polling<any, any> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ propsValue, lastFetchEpochMS, auth }) => {
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
|
||||
searchParams.append('limit', '100');
|
||||
|
||||
if (propsValue.resource_type) searchParams.append('resource_type', propsValue.resource_type);
|
||||
|
||||
const resourceRecord = (propsValue as any).resource_record;
|
||||
if (resourceRecord?.resource_id) {
|
||||
searchParams.append('resource_id', resourceRecord.resource_id.toString());
|
||||
}
|
||||
|
||||
if (propsValue.event_category) searchParams.append('event_category', propsValue.event_category);
|
||||
|
||||
if (propsValue.start_date_min) searchParams.append('start_date_min', dayjs(propsValue.start_date_min).toISOString());
|
||||
if (propsValue.start_date_max) searchParams.append('start_date_max', dayjs(propsValue.start_date_max).toISOString());
|
||||
|
||||
searchParams.append('order', 'created');
|
||||
|
||||
if (lastFetchEpochMS) {
|
||||
const lastFetchDate = dayjs(lastFetchEpochMS - 1000).toISOString();
|
||||
searchParams.append('updated_since', lastFetchDate);
|
||||
}
|
||||
|
||||
const queryString = searchParams.toString();
|
||||
const url = queryString ? `${WEALTHBOX_API_BASE}/events?${queryString}` : `${WEALTHBOX_API_BASE}/events`;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('poll new events', response.status, response.body);
|
||||
}
|
||||
|
||||
const events = response.body.events || [];
|
||||
|
||||
const newEvents = events.filter((event: any) => {
|
||||
if (!lastFetchEpochMS) return true;
|
||||
|
||||
const eventCreatedAt = dayjs(event.created_at).valueOf();
|
||||
return eventCreatedAt > lastFetchEpochMS;
|
||||
});
|
||||
|
||||
return newEvents.map((event: any) => ({
|
||||
epochMilliSeconds: dayjs(event.created_at).valueOf(),
|
||||
data: event
|
||||
}));
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to poll new events: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const newEvent = createTrigger({
|
||||
name: 'new_event',
|
||||
displayName: 'New Event',
|
||||
description: 'Fires when a new event is created',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
resource_type: Property.StaticDropdown({
|
||||
displayName: 'Linked Resource Type',
|
||||
description: 'Only trigger for events linked to this type of resource (optional)',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: 'Contact' },
|
||||
{ label: 'Project', value: 'Project' },
|
||||
{ label: 'Opportunity', value: 'Opportunity' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
resource_record: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Resource',
|
||||
description: 'Select the specific resource to filter events by',
|
||||
required: false,
|
||||
refreshers: ['resource_type'],
|
||||
props: async ({ auth, resource_type }) => {
|
||||
if (!auth || !resource_type) {
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
let records: any[] = [];
|
||||
let recordType = '';
|
||||
|
||||
const resourceTypeValue = resource_type as unknown as string;
|
||||
|
||||
switch (resourceTypeValue) {
|
||||
case 'Contact':
|
||||
records = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
recordType = 'Contact';
|
||||
break;
|
||||
case 'Project':
|
||||
records = await fetchProjects(auth.secret_text);
|
||||
recordType = 'Project';
|
||||
break;
|
||||
case 'Opportunity':
|
||||
records = await fetchOpportunities(auth.secret_text);
|
||||
recordType = 'Opportunity';
|
||||
break;
|
||||
default:
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
const recordOptions = records.map((record: any) => ({
|
||||
label: record.name || record.title || `${recordType} ${record.id}`,
|
||||
value: record.id
|
||||
}));
|
||||
|
||||
return {
|
||||
resource_id: Property.StaticDropdown({
|
||||
displayName: `${recordType} Record`,
|
||||
description: `Select the ${recordType.toLowerCase()} to filter events by`,
|
||||
required: false,
|
||||
options: {
|
||||
options: recordOptions
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
console.warn('Could not fetch resource options for validation:', error);
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually (API unavailable)',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
event_category: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Event Category',
|
||||
description: 'Only trigger for events of this category (optional)',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const categories = await fetchEventCategories(auth.secret_text);
|
||||
return {
|
||||
options: categories.map((category: any) => ({
|
||||
label: category.name || `Category ${category.id}`,
|
||||
value: category.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load event categories. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
start_date_min: Property.DateTime({
|
||||
displayName: 'Start Date Minimum',
|
||||
description: 'Only trigger for events starting on or after this date/time',
|
||||
required: false
|
||||
}),
|
||||
|
||||
start_date_max: Property.DateTime({
|
||||
displayName: 'Start Date Maximum',
|
||||
description: 'Only trigger for events starting on or before this date/time',
|
||||
required: false
|
||||
}),
|
||||
|
||||
order: Property.StaticDropdown({
|
||||
displayName: 'Sort Order',
|
||||
description: 'How to order the events',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Recent (newest first)', value: 'recent' },
|
||||
{ label: 'Created Date (newest first)', value: 'created' },
|
||||
{ label: 'Start Date (ascending)', value: 'asc' },
|
||||
{ label: 'Start Date (descending)', value: 'desc' }
|
||||
]
|
||||
}
|
||||
})
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator: 1,
|
||||
created_at: '2015-05-24 10:00 AM -0400',
|
||||
updated_at: '2015-10-12 11:30 PM -0400',
|
||||
title: 'Client Meeting',
|
||||
starts_at: '2015-05-24 10:00 AM -0400',
|
||||
ends_at: '2015-05-24 11:00 AM -0400',
|
||||
repeats: true,
|
||||
event_category: 2,
|
||||
all_day: true,
|
||||
location: 'Conference Room',
|
||||
description: 'Review meeting for Kevin...',
|
||||
state: 'confirmed',
|
||||
visible_to: 'Everyone',
|
||||
email_invitees: true,
|
||||
linked_to: [
|
||||
{
|
||||
id: 1,
|
||||
type: 'Contact',
|
||||
name: 'Kevin Anderson'
|
||||
}
|
||||
],
|
||||
invitees: [
|
||||
{
|
||||
id: 1,
|
||||
type: 'Contact',
|
||||
name: 'Kevin Anderson'
|
||||
}
|
||||
],
|
||||
custom_fields: [
|
||||
{
|
||||
id: 1,
|
||||
name: 'My Field',
|
||||
value: '123456789',
|
||||
document_type: 'Contact',
|
||||
field_type: 'single_select'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
onEnable: async (context) => {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
onDisable: async (context) => {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
run: async (context) => {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
|
||||
test: async (context) => {
|
||||
return await pollingHelper.test(polling, context);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,325 @@
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
httpClient,
|
||||
HttpMethod
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
pollingHelper,
|
||||
DedupeStrategy,
|
||||
Polling
|
||||
} from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
import { fetchUsers, fetchContacts, fetchProjects, fetchOpportunities, fetchOpportunityStages, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
const polling: Polling<any, any> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ propsValue, lastFetchEpochMS, auth }) => {
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
|
||||
searchParams.append('limit', '100');
|
||||
|
||||
if (propsValue.resource_type) searchParams.append('resource_type', propsValue.resource_type);
|
||||
|
||||
const resourceRecord = (propsValue as any).resource_record;
|
||||
if (resourceRecord?.resource_id) {
|
||||
searchParams.append('resource_id', resourceRecord.resource_id.toString());
|
||||
}
|
||||
|
||||
if (propsValue.stage) searchParams.append('stage', propsValue.stage);
|
||||
if (propsValue.manager) searchParams.append('manager', propsValue.manager);
|
||||
|
||||
if (propsValue.include_closed) {
|
||||
searchParams.append('include_closed', 'true');
|
||||
}
|
||||
|
||||
if (propsValue.min_probability !== undefined) searchParams.append('min_probability', propsValue.min_probability.toString());
|
||||
if (propsValue.max_probability !== undefined) searchParams.append('max_probability', propsValue.max_probability.toString());
|
||||
|
||||
if (propsValue.target_close_after) searchParams.append('target_close_after', dayjs(propsValue.target_close_after).toISOString());
|
||||
if (propsValue.target_close_before) searchParams.append('target_close_before', dayjs(propsValue.target_close_before).toISOString());
|
||||
|
||||
searchParams.append('order', 'created');
|
||||
|
||||
if (lastFetchEpochMS) {
|
||||
const lastFetchDate = dayjs(lastFetchEpochMS - 1000).toISOString();
|
||||
searchParams.append('updated_since', lastFetchDate);
|
||||
}
|
||||
|
||||
const queryString = searchParams.toString();
|
||||
const url = queryString ? `${WEALTHBOX_API_BASE}/opportunities?${queryString}` : `${WEALTHBOX_API_BASE}/opportunities`;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('poll new opportunities', response.status, response.body);
|
||||
}
|
||||
|
||||
const opportunities = response.body.opportunities || [];
|
||||
|
||||
const newOpportunities = opportunities.filter((opportunity: any) => {
|
||||
if (!lastFetchEpochMS) return true;
|
||||
|
||||
const opportunityCreatedAt = dayjs(opportunity.created_at).valueOf();
|
||||
return opportunityCreatedAt > lastFetchEpochMS;
|
||||
});
|
||||
|
||||
return newOpportunities.map((opportunity: any) => ({
|
||||
epochMilliSeconds: dayjs(opportunity.created_at).valueOf(),
|
||||
data: opportunity
|
||||
}));
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to poll new opportunities: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const newOpportunity = createTrigger({
|
||||
name: 'new_opportunity',
|
||||
displayName: 'New Opportunity',
|
||||
description: 'Fires when a new opportunity is created',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
resource_type: Property.StaticDropdown({
|
||||
displayName: 'Linked Resource Type',
|
||||
description: 'Only trigger for opportunities linked to this type of resource (optional)',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: 'Contact' },
|
||||
{ label: 'Project', value: 'Project' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
resource_record: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Resource',
|
||||
description: 'Select the specific resource to filter opportunities by',
|
||||
required: false,
|
||||
refreshers: ['resource_type'],
|
||||
props: async ({ auth, resource_type }) => {
|
||||
if (!auth || !resource_type) {
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
let records: any[] = [];
|
||||
let recordType = '';
|
||||
|
||||
const resourceTypeValue = resource_type as unknown as string;
|
||||
|
||||
switch (resourceTypeValue) {
|
||||
case 'Contact':
|
||||
records = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
recordType = 'Contact';
|
||||
break;
|
||||
case 'Project':
|
||||
records = await fetchProjects(auth.secret_text);
|
||||
recordType = 'Project';
|
||||
break;
|
||||
default:
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
const recordOptions = records.map((record: any) => ({
|
||||
label: record.name || record.title || `${recordType} ${record.id}`,
|
||||
value: record.id
|
||||
}));
|
||||
|
||||
return {
|
||||
resource_id: Property.StaticDropdown({
|
||||
displayName: `${recordType} Record`,
|
||||
description: `Select the ${recordType.toLowerCase()} to filter opportunities by`,
|
||||
required: false,
|
||||
options: {
|
||||
options: recordOptions
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Error loading resource records:', error);
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually (API unavailable)',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
stage: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Opportunity Stage',
|
||||
description: 'Only trigger for opportunities in this stage (optional)',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const stages = await fetchOpportunityStages(auth.secret_text);
|
||||
return {
|
||||
options: stages.map((stage: any) => ({
|
||||
label: stage.name || `Stage ${stage.id}`,
|
||||
value: stage.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load opportunity stages. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
manager: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Opportunity Manager',
|
||||
description: 'Only trigger for opportunities managed by this user (optional)',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
const assignableUsers = users.filter((user: any) => !user.excluded_from_assignments);
|
||||
return {
|
||||
options: assignableUsers.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
include_closed: Property.Checkbox({
|
||||
displayName: 'Include Closed Opportunities',
|
||||
description: 'Include won and lost opportunities in results',
|
||||
required: false,
|
||||
defaultValue: false
|
||||
}),
|
||||
|
||||
min_probability: Property.Number({
|
||||
displayName: 'Minimum Probability (%)',
|
||||
description: 'Only trigger for opportunities with probability at or above this percentage (0-100)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
max_probability: Property.Number({
|
||||
displayName: 'Maximum Probability (%)',
|
||||
description: 'Only trigger for opportunities with probability at or below this percentage (0-100)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
target_close_after: Property.DateTime({
|
||||
displayName: 'Target Close After',
|
||||
description: 'Only trigger for opportunities with target close date on or after this date/time',
|
||||
required: false
|
||||
}),
|
||||
|
||||
target_close_before: Property.DateTime({
|
||||
displayName: 'Target Close Before',
|
||||
description: 'Only trigger for opportunities with target close date on or before this date/time',
|
||||
required: false
|
||||
})
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator: 1,
|
||||
created_at: '2015-05-24 10:00 AM -0400',
|
||||
updated_at: '2015-10-12 11:30 PM -0400',
|
||||
name: 'Financial Plan',
|
||||
description: 'Opportunity to plan for...',
|
||||
target_close: '2015-11-12 11:00 AM -0500',
|
||||
probability: 70,
|
||||
stage: 1,
|
||||
manager: 1,
|
||||
amounts: [
|
||||
{
|
||||
amount: 56.76,
|
||||
currency: '$',
|
||||
kind: 'Fee'
|
||||
}
|
||||
],
|
||||
linked_to: [
|
||||
{
|
||||
id: 1,
|
||||
type: 'Contact',
|
||||
name: 'Kevin Anderson'
|
||||
}
|
||||
],
|
||||
visible_to: 'Everyone',
|
||||
custom_fields: [
|
||||
{
|
||||
id: 1,
|
||||
name: 'My Field',
|
||||
value: '123456789',
|
||||
document_type: 'Contact',
|
||||
field_type: 'single_select'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
onEnable: async (context) => {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
onDisable: async (context) => {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
run: async (context) => {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
|
||||
test: async (context) => {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,293 @@
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
httpClient,
|
||||
HttpMethod
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
pollingHelper,
|
||||
DedupeStrategy,
|
||||
Polling
|
||||
} from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
import { fetchUsers, fetchContacts, fetchProjects, fetchOpportunities, WEALTHBOX_API_BASE, handleApiError } from '../common';
|
||||
import { wealthboxAuth } from '../..';
|
||||
|
||||
const polling: Polling<any, any> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ propsValue, lastFetchEpochMS, auth }) => {
|
||||
if (!auth) {
|
||||
throw new Error('Authentication is required');
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
|
||||
searchParams.append('limit', '100');
|
||||
|
||||
if (propsValue.assigned_to) searchParams.append('assigned_to', propsValue.assigned_to);
|
||||
if (propsValue.assigned_to_team) searchParams.append('assigned_to_team', propsValue.assigned_to_team.toString());
|
||||
if (propsValue.created_by) searchParams.append('created_by', propsValue.created_by);
|
||||
if (propsValue.task_type && propsValue.task_type !== 'all') searchParams.append('task_type', propsValue.task_type);
|
||||
if (propsValue.resource_type) searchParams.append('resource_type', propsValue.resource_type);
|
||||
|
||||
const resourceRecord = (propsValue as any).resource_record;
|
||||
if (resourceRecord?.resource_id) {
|
||||
searchParams.append('resource_id', resourceRecord.resource_id.toString());
|
||||
}
|
||||
|
||||
if (lastFetchEpochMS) {
|
||||
const lastFetchDate = dayjs(lastFetchEpochMS - 1000).toISOString();
|
||||
searchParams.append('updated_since', lastFetchDate);
|
||||
}
|
||||
|
||||
const queryString = searchParams.toString();
|
||||
const url = queryString ? `${WEALTHBOX_API_BASE}/tasks?${queryString}` : `${WEALTHBOX_API_BASE}/tasks`;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.GET,
|
||||
url: url,
|
||||
headers: {
|
||||
'ACCESS_TOKEN': auth.secret_text,
|
||||
'Accept': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
if (response.status >= 400) {
|
||||
handleApiError('poll new tasks', response.status, response.body);
|
||||
}
|
||||
|
||||
const tasks = response.body.tasks || [];
|
||||
|
||||
const newTasks = tasks.filter((task: any) => {
|
||||
if (!lastFetchEpochMS) return true;
|
||||
|
||||
const taskCreatedAt = dayjs(task.created_at).valueOf();
|
||||
return taskCreatedAt > lastFetchEpochMS;
|
||||
});
|
||||
|
||||
return newTasks.map((task: any) => ({
|
||||
epochMilliSeconds: dayjs(task.created_at).valueOf(),
|
||||
data: task
|
||||
}));
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to poll new tasks: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const newTask = createTrigger({
|
||||
name: 'new_task',
|
||||
displayName: 'New Task',
|
||||
description: 'Fires when a new task is created',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
assigned_to: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Assigned To',
|
||||
description: 'Only trigger for tasks assigned to this user (optional)',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
return {
|
||||
options: users.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
assigned_to_team: Property.Number({
|
||||
displayName: 'Assigned To Team ID',
|
||||
description: 'Only trigger for tasks assigned to this team (optional)',
|
||||
required: false
|
||||
}),
|
||||
|
||||
created_by: Property.Dropdown({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Created By',
|
||||
description: 'Only trigger for tasks created by this user (optional)',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) return { options: [] };
|
||||
|
||||
try {
|
||||
const users = await fetchUsers(auth.secret_text);
|
||||
return {
|
||||
options: users.map((user: any) => ({
|
||||
label: `${user.name} (${user.email})`,
|
||||
value: user.id
|
||||
}))
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
error: 'Failed to load users. Please check your authentication.'
|
||||
};
|
||||
}
|
||||
}
|
||||
}),
|
||||
|
||||
task_type: Property.StaticDropdown({
|
||||
displayName: 'Task Type',
|
||||
description: 'Type of tasks to monitor',
|
||||
required: false,
|
||||
defaultValue: 'all',
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'All Tasks', value: 'all' },
|
||||
{ label: 'Parent Tasks Only', value: 'parents' },
|
||||
{ label: 'Subtasks Only', value: 'subtasks' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
resource_type: Property.StaticDropdown({
|
||||
displayName: 'Linked Resource Type',
|
||||
description: 'Only trigger for tasks linked to this type of resource (optional)',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Contact', value: 'Contact' },
|
||||
{ label: 'Project', value: 'Project' },
|
||||
{ label: 'Opportunity', value: 'Opportunity' }
|
||||
]
|
||||
}
|
||||
}),
|
||||
|
||||
resource_record: Property.DynamicProperties({
|
||||
auth: wealthboxAuth,
|
||||
displayName: 'Linked Resource',
|
||||
description: 'Select the specific resource to filter tasks by',
|
||||
required: false,
|
||||
refreshers: ['resource_type'],
|
||||
props: async ({ auth, resource_type }) => {
|
||||
if (!auth || !resource_type) {
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
let records: any[] = [];
|
||||
let recordType = '';
|
||||
|
||||
const resourceTypeValue = resource_type as unknown as string;
|
||||
|
||||
switch (resourceTypeValue) {
|
||||
case 'Contact':
|
||||
records = await fetchContacts(auth.secret_text, { active: true, order: 'recent' });
|
||||
recordType = 'Contact';
|
||||
break;
|
||||
case 'Project':
|
||||
records = await fetchProjects(auth.secret_text);
|
||||
recordType = 'Project';
|
||||
break;
|
||||
case 'Opportunity':
|
||||
records = await fetchOpportunities(auth.secret_text);
|
||||
recordType = 'Opportunity';
|
||||
break;
|
||||
default:
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
const recordOptions = records.map((record: any) => ({
|
||||
label: record.name || record.title || `${recordType} ${record.id}`,
|
||||
value: record.id
|
||||
}));
|
||||
|
||||
return {
|
||||
resource_id: Property.StaticDropdown({
|
||||
displayName: `${recordType} Record`,
|
||||
description: `Select the ${recordType.toLowerCase()} to filter tasks by`,
|
||||
required: false,
|
||||
options: {
|
||||
options: recordOptions
|
||||
}
|
||||
})
|
||||
};
|
||||
} catch (error) {
|
||||
console.warn('Could not fetch resource options for validation:', error);
|
||||
return {
|
||||
resource_id: Property.Number({
|
||||
displayName: 'Resource ID',
|
||||
description: 'Enter the resource ID manually (API unavailable)',
|
||||
required: false
|
||||
})
|
||||
};
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator: 1,
|
||||
created_at: '2015-05-24 10:00 AM -0400',
|
||||
updated_at: '2015-10-12 11:30 PM -0400',
|
||||
name: "Return Bill's call",
|
||||
due_date: '2015-05-24 11:00 AM -0400',
|
||||
complete: false,
|
||||
category: 1,
|
||||
linked_to: [
|
||||
{
|
||||
id: 1,
|
||||
type: 'Contact',
|
||||
name: 'Kevin Anderson'
|
||||
}
|
||||
],
|
||||
priority: 'Medium',
|
||||
visible_to: 'Everyone',
|
||||
description: 'Follow up from message...',
|
||||
assigned_to: 1,
|
||||
assigned_to_team: 10
|
||||
},
|
||||
|
||||
onEnable: async (context) => {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
onDisable: async (context) => {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
auth: context.auth
|
||||
});
|
||||
},
|
||||
|
||||
run: async (context) => {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
|
||||
test: async (context) => {
|
||||
return await pollingHelper.test(polling, context);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"extends": "../../../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"importHelpers": true,
|
||||
"noImplicitOverride": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noPropertyAccessFromIndexSignature": true
|
||||
},
|
||||
"files": [],
|
||||
"include": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.lib.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../../../dist/out-tsc",
|
||||
"declaration": true,
|
||||
"types": ["node"]
|
||||
},
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
Reference in New Issue
Block a user