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,3 @@
|
||||
{
|
||||
"presets": [["@nx/js/babel", { "useBuiltIns": "usage" }]]
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"extends": ["../../../../.eslintrc.json"],
|
||||
"ignorePatterns": ["!**/*"],
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": ["*.ts", "*.tsx"],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": ["*.js", "*.jsx"],
|
||||
"rules": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# pieces-pipedrive
|
||||
|
||||
This library was generated with [Nx](https://nx.dev).
|
||||
|
||||
## Running lint
|
||||
|
||||
Run `nx lint pieces-pipedrive` to execute the lint via [ESLint](https://eslint.org/).
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "@activepieces/piece-pipedrive",
|
||||
"version": "0.7.9"
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"name": "pieces-pipedrive",
|
||||
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "packages/pieces/community/pipedrive/src",
|
||||
"projectType": "library",
|
||||
"targets": {
|
||||
"build": {
|
||||
"executor": "@nx/js:tsc",
|
||||
"outputs": [
|
||||
"{options.outputPath}"
|
||||
],
|
||||
"options": {
|
||||
"outputPath": "dist/packages/pieces/community/pipedrive",
|
||||
"tsConfig": "packages/pieces/community/pipedrive/tsconfig.lib.json",
|
||||
"packageJson": "packages/pieces/community/pipedrive/package.json",
|
||||
"main": "packages/pieces/community/pipedrive/src/index.ts",
|
||||
"assets": [
|
||||
"packages/pieces/community/pipedrive/*.md",
|
||||
{
|
||||
"input": "packages/pieces/community/pipedrive/src/i18n",
|
||||
"output": "./src/i18n",
|
||||
"glob": "**/!(i18n.json)"
|
||||
}
|
||||
],
|
||||
"buildableProjectDepsInPackageJsonType": "dependencies",
|
||||
"updateBuildableProjectDepsInPackageJson": true
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build",
|
||||
"prebuild"
|
||||
]
|
||||
},
|
||||
"lint": {
|
||||
"executor": "@nx/eslint:lint",
|
||||
"outputs": [
|
||||
"{options.outputFile}"
|
||||
]
|
||||
},
|
||||
"prebuild": {
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"cwd": "packages/pieces/community/pipedrive",
|
||||
"command": "bun install --no-save --silent"
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build"
|
||||
]
|
||||
}
|
||||
},
|
||||
"tags": []
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"Pipedrive": "Pipedrive",
|
||||
"Sales CRM and pipeline management software": "Sales CRM and pipeline management software",
|
||||
"Add Follower": "Add Follower",
|
||||
"Retrieve a Note": "Retrieve a Note",
|
||||
"Create Note": "Create Note",
|
||||
"Add Labels to Person": "Add Labels to Person",
|
||||
"Add Product to Deal": "Add Product to Deal",
|
||||
"Attach File": "Attach File",
|
||||
"Create Activity": "Create Activity",
|
||||
"Update Activity": "Update Activity",
|
||||
"Create Deal": "Create Deal",
|
||||
"Update Deal": "Update Deal",
|
||||
"Create Lead": "Create Lead",
|
||||
"Update Lead": "Update Lead",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create Person": "Create Person",
|
||||
"Update Person": "Update Person",
|
||||
"Create Product": "Create Product",
|
||||
"Update Product": "Update Product",
|
||||
"Find Deals Associated With Person": "Find Deals Associated With Person",
|
||||
"Find Product": "Find Product",
|
||||
"Find Products": "Find Products",
|
||||
"Find Notes": "Find Notes",
|
||||
"Retrieve a Product": "Retrieve a Product",
|
||||
"Find Organization": "Find Organization",
|
||||
"Find Person": "Find Person",
|
||||
"Find Deal": "Find Deal",
|
||||
"Find Activity": "Find Activity",
|
||||
"Find User": "Find User",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Adds a follower to a deal, person, organization or product.": "Adds a follower to a deal, person, organization or product.",
|
||||
" Finds a note by ID.": " Finds a note by ID.",
|
||||
"Creates a new note.": "Creates a new note.",
|
||||
"Adds an existing labels to an existing person.": "Adds an existing labels to an existing person.",
|
||||
"Adds a product to a deal.": "Adds a product to a deal.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Uploads a file and attaches it to a deal,person,organization,activity or product.",
|
||||
"Creates a new activity.": "Creates a new activity.",
|
||||
"Updates an existing activity.": "Updates an existing activity.",
|
||||
"Creates a new deal.": "Creates a new deal.",
|
||||
"Updates an existing deal.": "Updates an existing deal.",
|
||||
"Creates a new lead.": "Creates a new lead.",
|
||||
"Updates an existing lead.": "Updates an existing lead.",
|
||||
"Creates a new organization.": "Creates a new organization.",
|
||||
"Updates an existing organization.": "Updates an existing organization.",
|
||||
"Creates a new person.": "Creates a new person.",
|
||||
"Updates an existing person.": "Updates an existing person.",
|
||||
"Creates a new product.": "Creates a new product.",
|
||||
"Finds multiple deals related to a specific person.": "Finds multiple deals related to a specific person.",
|
||||
"Find a product by name.": "Find a product by name.",
|
||||
"Finds a product or products by name or product code.": "Finds a product or products by name or product code.",
|
||||
"Finds notes by Deal,Lead,Person, or Organization ID.": "Finds notes by Deal,Lead,Person, or Organization ID.",
|
||||
" Finds a product by ID.": " Finds a product by ID.",
|
||||
"Finds an organization.": "Finds an organization.",
|
||||
"Finds a person.": "Finds a person.",
|
||||
"Finds a deal by any field.": "Finds a deal by any field.",
|
||||
"Finds an activity by subject.": "Finds an activity by subject.",
|
||||
"Find a user by name or email.": "Find a user by name or email.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Follower": "Follower",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Target Object ID",
|
||||
"Note ID": "Note ID",
|
||||
"Content": "Content",
|
||||
"Deal ID": "Deal ID",
|
||||
"Pin note to deal?": "Pin note to deal?",
|
||||
"Person ID": "Person ID",
|
||||
"Pin note to person?": "Pin note to person?",
|
||||
"Organization ID": "Organization ID",
|
||||
"Pin note to organization?": "Pin note to organization?",
|
||||
"Lead ID": "Lead ID",
|
||||
"Pin note to lead?": "Pin note to lead?",
|
||||
"Label": "Label",
|
||||
"Product ID": "Product ID",
|
||||
"Price": "Price",
|
||||
"Quantity": "Quantity",
|
||||
"Discount": "Discount",
|
||||
"Discount Type": "Discount Type",
|
||||
"Comments": "Comments",
|
||||
"Enable Product?": "Enable Product?",
|
||||
"Tax Method": "Tax Method",
|
||||
"Tax Percentage": "Tax Percentage",
|
||||
"File": "File",
|
||||
"File Name": "File Name",
|
||||
"Activity ID": "Activity ID",
|
||||
"Subject": "Subject",
|
||||
"Assign To": "Assign To",
|
||||
"Activity Type": "Activity Type",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Duration": "Duration",
|
||||
"Mark as Done?": "Mark as Done?",
|
||||
"Free or Busy": "Free or Busy",
|
||||
"Note": "Note",
|
||||
"Public Description": "Public Description",
|
||||
"Activity": "Activity",
|
||||
"Title": "Title",
|
||||
"Creation Time": "Creation Time",
|
||||
"Status": "Status",
|
||||
"Stage": "Stage",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Owner",
|
||||
"Probability": "Probability",
|
||||
"Expected Close Date": "Expected Close Date",
|
||||
"Value": "Value",
|
||||
"Currency": "Currency",
|
||||
"Visible To": "Visible To",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Channel": "Channel",
|
||||
"Lead Value": "Lead Value",
|
||||
"Lead Value Currency": "Lead Value Currency",
|
||||
"Name": "Name",
|
||||
"Address": "Address",
|
||||
"Email": "Email",
|
||||
"Phone": "Phone",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Marketing Status": "Marketing Status",
|
||||
"Code": "Code",
|
||||
"Description": "Description",
|
||||
"Unit": "Unit",
|
||||
"Tax percentage": "Tax percentage",
|
||||
"Is Active ?": "Is Active ?",
|
||||
"Cost": "Cost",
|
||||
"Overhead Cost": "Overhead Cost",
|
||||
"Search Term": "Search Term",
|
||||
"Field to search by": "Field to search by",
|
||||
"Field Value": "Field Value",
|
||||
"Search By": "Search By",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Exact Match",
|
||||
"Filter": "Filter",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Type of object to add the follower to.": "Type of object to add the follower to.",
|
||||
"ID of the object to add the follower to.": "ID of the object to add the follower to.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "You can use Find Deal action to retrieve deal ID.",
|
||||
"You can use Find Person action to retrieve person ID.": "You can use Find Person action to retrieve person ID.",
|
||||
"You can use Find Organization action to retrieve org ID.": "You can use Find Organization action to retrieve org ID.",
|
||||
"You can use Find Product action to retrieve product ID.": "You can use Find Product action to retrieve product ID.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Please enter date in YYYY-MM-DD format.",
|
||||
"Please enter time in HH:MM format.": "Please enter time in HH:MM format.",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "If a stage is chosen above, the pipeline field will be ignored.",
|
||||
"Please enter currency code.": "Please enter currency code.",
|
||||
"Marketing opt-in status": "Marketing opt-in status",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"Deal": "Deal",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Product": "Product",
|
||||
"Percentage": "Percentage",
|
||||
"Amount": "Amount",
|
||||
"Exclusive": "Exclusive",
|
||||
"Inclusive": "Inclusive",
|
||||
"None": "None",
|
||||
"Free": "Free",
|
||||
"Busy": "Busy",
|
||||
"Open": "Open",
|
||||
"Won": "Won",
|
||||
"Lost": "Lost",
|
||||
"Deleted": "Deleted",
|
||||
"Item Owner": "Item Owner",
|
||||
"All Users": "All Users",
|
||||
"No Consent": "No Consent",
|
||||
"Unsubscribed": "Unsubscribed",
|
||||
"Subscribed": "Subscribed",
|
||||
"Archived": "Archived",
|
||||
"Product Code": "Product Code",
|
||||
"Lead": "Lead",
|
||||
"Done": "Done",
|
||||
"Not Done": "Not Done",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Person": "New Person",
|
||||
"New Deal": "New Deal",
|
||||
"New Activity": "New Activity",
|
||||
"New Note": "New Note",
|
||||
"Updated Person": "Updated Person",
|
||||
"Updated Deal": "Updated Deal",
|
||||
"Updated Deal Stage": "Updated Deal Stage",
|
||||
"New Lead": "New Lead",
|
||||
"New Organization": "New Organization",
|
||||
"Updated Organization": "Updated Organization",
|
||||
"Activity Matching Filter": "Activity Matching Filter",
|
||||
"Deal Matching Filter": "Deal Matching Filter",
|
||||
"Person Matching Filter": "Person Matching Filter",
|
||||
"Organization Matching Filter": "Organization Matching Filter",
|
||||
"Triggers when a new person is created": "Triggers when a new person is created",
|
||||
"Triggers when a new deal is created.": "Triggers when a new deal is created.",
|
||||
"Triggers when a new activity is added": "Triggers when a new activity is added",
|
||||
"Triggers when a new note is created.": "Triggers when a new note is created.",
|
||||
"Triggers when a person is updated": "Triggers when a person is updated",
|
||||
"Triggers when a deal is updated": "Triggers when a deal is updated",
|
||||
"Triggers when a deal's stage is updated.": "Triggers when a deal's stage is updated.",
|
||||
"Triggers when a new lead is created.": "Triggers when a new lead is created.",
|
||||
"Triggers when a new organization is created.": "Triggers when a new organization is created.",
|
||||
"Triggers when an existing organization is updated.": "Triggers when an existing organization is updated.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Trigges when an activity newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Trigges when a deal newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a person newly matches a Pipedrive filter for the first time.": "Trigges when a person newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when an organization newly matches a Pipedrive filter for the first time.": "Trigges when an organization newly matches a Pipedrive filter for the first time.",
|
||||
"Filter by": "Filter by",
|
||||
"Field Values": "Field Values",
|
||||
"Field to watch for Changes On": "Field to watch for Changes On",
|
||||
"Stage in Pipeline": "Stage in Pipeline",
|
||||
"Deal Status": "Deal Status",
|
||||
"All(Not Deleted)": "All(Not Deleted)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "Vertriebs-CRM und Pipeline-Management-Software",
|
||||
"Add Follower": "Follower hinzufügen",
|
||||
"Retrieve a Note": "Notiz abrufen",
|
||||
"Create Note": "Notiz erstellen",
|
||||
"Add Labels to Person": "Label zur Person hinzufügen",
|
||||
"Add Product to Deal": "Produkt zum Deal hinzufügen",
|
||||
"Attach File": "Datei anhängen",
|
||||
"Create Activity": "Aktivität erstellen",
|
||||
"Update Activity": "Aktualisiere Aktivität",
|
||||
"Create Deal": "Deal erstellen",
|
||||
"Update Deal": "Angebot aktualisieren",
|
||||
"Create Lead": "Lead erstellen",
|
||||
"Update Lead": "Lead aktualisieren",
|
||||
"Create Organization": "Organisation erstellen",
|
||||
"Update Organization": "Organisation aktualisieren",
|
||||
"Create Person": "Person erstellen",
|
||||
"Update Person": "Person aktualisieren",
|
||||
"Create Product": "Produkt erstellen",
|
||||
"Update Product": "Produkt aktualisieren",
|
||||
"Find Deals Associated With Person": "Angebote finden, die mit Person verknüpft sind",
|
||||
"Find Product": "Produkt finden",
|
||||
"Find Products": "Produkte finden",
|
||||
"Find Notes": "Notizen finden",
|
||||
"Retrieve a Product": "Produkt abrufen",
|
||||
"Find Organization": "Organisation finden",
|
||||
"Find Person": "Person finden",
|
||||
"Find Deal": "Deal finden",
|
||||
"Find Activity": "Aktivität suchen",
|
||||
"Find User": "Benutzer finden",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Adds a follower to a deal, person, organization or product.": "Fügt einem Deal, einer Person, Organisation oder einem Produkt einen Follower hinzu.",
|
||||
"Finds a note by ID.": "Findet eine Notiz nach ID.",
|
||||
"Creates a new note.": "Erstellt eine neue Notiz.",
|
||||
"Adds existing labels to an existing person.": "Fügt vorhandene Labels einer existierenden Person hinzu.",
|
||||
"Adds a product to a deal.": "Fügt ein Produkt einem Deal hinzu.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Laden Sie eine Datei hoch und hängen Sie sie an Deal,Person,Organisation, Aktivität oder Produkt an.",
|
||||
"Creates a new activity.": "Erstellt eine neue Aktivität.",
|
||||
"Updates an existing activity.": "Aktualisiert eine bestehende Aktivität.",
|
||||
"Creates a new deal.": "Erstellt ein neues Deal.",
|
||||
"Updates an existing deal.": "Aktualisiert ein bestehendes Deal.",
|
||||
"Creates a new lead.": "Erstellt einen neuen Vorsprung.",
|
||||
"Updates an existing lead.": "Aktualisiert einen existierenden Lead.",
|
||||
"Creates a new organization.": "Erstellt eine neue Organisation.",
|
||||
"Updates an existing organization.": "Aktualisiert eine bestehende Organisation.",
|
||||
"Creates a new person.": "Erstellt eine neue Person.",
|
||||
"Updates an existing person.": "Aktualisiert eine existierende Person.",
|
||||
"Creates a new product.": "Erstellt ein neues Produkt.",
|
||||
"Finds multiple deals related to a specific person.": "Findet mehrere Angebote im Zusammenhang mit einer bestimmten Person.",
|
||||
"Finds a product by name ": "Findet ein Produkt nach Namen ",
|
||||
"Finds a product or products by name or product code.": "Findet ein Produkt oder ein Produkt nach Namen oder Produktcode.",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "Findet Notizen von Deal, Lead, Person oder Organisations-ID.",
|
||||
"Finds a product by ID.": "Findet ein Produkt nach ID.",
|
||||
"Finds an organization.": "Findet eine Organisation.",
|
||||
"Finds a person.": "Findet eine Person.",
|
||||
"Finds a deal by any field.": "Findet einen Deal nach jedem Feld.",
|
||||
"Finds an activity by subject.": "Findet eine Aktivität nach Betreff.",
|
||||
"Finds a user by name or email.": "Findet einen Benutzer nach Namen oder E-Mail.",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"Follower": "Follower",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Zielobjekt-ID",
|
||||
"Note ID": "Notiz-ID",
|
||||
"Content": "Inhalt",
|
||||
"Deal ID": "Deal-ID",
|
||||
"Pin note to deal?": "Notiz anheben?",
|
||||
"Person ID": "Person-ID",
|
||||
"Pin note to person?": "Notiz an Person anheben?",
|
||||
"Organization ID": "Organisations-ID",
|
||||
"Pin note to organization?": "Notiz an die Organisation anheben?",
|
||||
"Lead ID": "Lead-ID",
|
||||
"Pin note to lead?": "Notiz anheben?",
|
||||
"Label": "Label",
|
||||
"Product ID": "Produkt-ID",
|
||||
"Price": "Preis",
|
||||
"Quantity": "Menge",
|
||||
"Discount": "Rabatt",
|
||||
"Discount Type": "Rabattart",
|
||||
"Comments": "Kommentare",
|
||||
"Enable Product?": "Produkt aktivieren?",
|
||||
"Tax Method": "Steuermethode",
|
||||
"Tax Percentage": "Steuersatz Prozentsatz",
|
||||
"File": "Datei",
|
||||
"File Name": "Dateiname",
|
||||
"Activity ID": "Aktivitäts-ID",
|
||||
"Subject": "Betreff",
|
||||
"Assign To": "Zuweisen an",
|
||||
"Activity Type": "Aktivitätstyp",
|
||||
"Due Date": "Fälligkeitsdatum",
|
||||
"Due Time": "Fällige Zeit",
|
||||
"Duration": "Dauer",
|
||||
"Mark as Done?": "Als erledigt markieren?",
|
||||
"Free or Busy": "Kostenlos oder besetzt",
|
||||
"Note": "Notiz",
|
||||
"Public Description": "Öffentliche Beschreibung",
|
||||
"Title": "Titel",
|
||||
"Creation Time": "Erstellungszeit",
|
||||
"Status": "Status",
|
||||
"Stage": "Teil",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Besitzer",
|
||||
"Probability": "Wahrscheinlichkeit",
|
||||
"Expected Close Date": "Erwartetes Enddatum",
|
||||
"Value": "Wert",
|
||||
"Currency": "Währung",
|
||||
"Visible To": "Sichtbar für",
|
||||
"Custom Fields": "Eigene Felder",
|
||||
"Channel": "Kanal",
|
||||
"Lead Value Amount": "Leadwert Betrag",
|
||||
"Lead Value Currency": "Leadwert Währung",
|
||||
"Name": "Name",
|
||||
"Address": "Adresse",
|
||||
"Email": "E-Mail",
|
||||
"Phone": "Telefon",
|
||||
"First Name": "Vorname",
|
||||
"Last Name": "Nachname",
|
||||
"Marketing Status": "Marketing-Status",
|
||||
"Code": "Code",
|
||||
"Description": "Beschreibung",
|
||||
"Unit": "Einheit",
|
||||
"Tax percentage": "Steuersatz Prozentsatz",
|
||||
"Is Active ?": "Ist aktiv ?",
|
||||
"Cost": "Kosten",
|
||||
"Overhead Cost": "Overhead-Kosten",
|
||||
"Search Term": "Suchbegriff",
|
||||
"Field to search by": "Feld für Suche nach",
|
||||
"Field Value": "Feldwert",
|
||||
"Search By": "Suche nach",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Genaues Match",
|
||||
"Filter": "Filtern",
|
||||
"Method": "Methode",
|
||||
"Headers": "Kopfzeilen",
|
||||
"Query Parameters": "Abfrageparameter",
|
||||
"Body": "Körper",
|
||||
"Response is Binary ?": "Antwort ist binär?",
|
||||
"No Error on Failure": "Kein Fehler bei Fehler",
|
||||
"Timeout (in seconds)": "Timeout (in Sekunden)",
|
||||
"Type of object to add the follower to.": "Typ des Objekts, zu dem der Follower hinzugefügt werden soll.",
|
||||
"ID of the object to add the follower to.": "ID des Objekts, dem der Follower hinzugefügt werden soll.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "Sie können \"Deal finden\"-Aktion verwenden, um die Deal-ID abzurufen.",
|
||||
"You can use Find Person action to retrieve person ID.": "Sie können \"Person finden\"-Aktion verwenden, um die Personen-ID abzurufen.",
|
||||
"You can use Find Organization action to retrieve org ID.": "Sie können die Aktion Organisation suchen verwenden, um die org-ID abzurufen.",
|
||||
"You can use Find Product action to retrieve product ID.": "Sie können Produkt-Suchen zum Abrufen der Produkt-ID verwenden.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Bitte geben Sie das Datum im Format JJJJJ-MM-TT ein.",
|
||||
"Please enter time in HH:MM format.": "Bitte geben Sie die Zeit im HH:MM-Format ein.",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "Bitte geben Sie die Zeit im Format HH:MM ein (z.B. \"01:30\" für 1 Stunde 30 Minuten).",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "Wird oben eine Stufe gewählt, wird das Pipeline-Feld ignoriert.",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "Bitte geben Sie den Währungscode ein (z.B. \"USD\", \"EUR\").",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "Die Währung des Leadwertes (z.B. \"USD\", \"EUR\").",
|
||||
"Marketing opt-in status": "Marketing-Opt-in-Status",
|
||||
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
|
||||
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
|
||||
"Deal": "Deal",
|
||||
"Person": "Person",
|
||||
"Organization": "Organisation",
|
||||
"Product": "Produkt",
|
||||
"Percentage": "Prozentsatz",
|
||||
"Amount": "Betrag",
|
||||
"Exclusive": "Exklusiv",
|
||||
"Inclusive": "Inklusiv",
|
||||
"None": "Keine",
|
||||
"Free": "Kostenlos",
|
||||
"Busy": "Besetzt",
|
||||
"Open": "Öffnen",
|
||||
"Won": "Gewonnen",
|
||||
"Lost": "Verlorene",
|
||||
"Deleted": "Gelöscht",
|
||||
"Owner & followers": "Besitzer & Follower",
|
||||
"Entire company": "Gesamte Firma",
|
||||
"No Consent": "Keine Zustimmung",
|
||||
"Unsubscribed": "Abgemeldet",
|
||||
"Subscribed": "Abonniert",
|
||||
"Archived": "Archiviert",
|
||||
"Product Code": "Produkt-Code",
|
||||
"Lead": "Lead",
|
||||
"Done": "Done",
|
||||
"Not Done": "Nicht fertig",
|
||||
"GET": "ERHALTEN",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "LÖSCHEN",
|
||||
"HEAD": "HEAD",
|
||||
"New Person": "Neue Person",
|
||||
"New Deal": "Neuer Deal",
|
||||
"New Activity": "Neue Aktivität",
|
||||
"New Note": "Neue Notiz",
|
||||
"Updated Person": "Aktualisierte Person",
|
||||
"Updated Deal": "Aktualisierte Deal",
|
||||
"Updated Deal Stage": "Aktualisierte Deal-Phase",
|
||||
"New Lead": "Neuer Lead",
|
||||
"New Organization": "Neue Organisation",
|
||||
"Updated Organization": "Aktualisierte Organisation",
|
||||
"Activity Matching Filter": "Aktivitätsfilter",
|
||||
"Deal Matching Filter": "Angebotsanpassungsfilter",
|
||||
"Person Matching Filter": "Personenzuordnung Filter",
|
||||
"Organization Matching Filter": "Organisations-Filter",
|
||||
"Triggers when a new person is created": "Wird ausgelöst, wenn eine neue Person erstellt wird",
|
||||
"Triggers when a new deal is created.": "Wird ausgelöst, wenn ein neues Deal erstellt wird.",
|
||||
"Triggers when a new activity is added": "Wird ausgelöst, wenn eine neue Aktivität hinzugefügt wird",
|
||||
"Triggers when a new note is created.": "Wird ausgelöst, wenn eine neue Notiz erstellt wird.",
|
||||
"Triggers when a person is updated.": "Wird ausgelöst, wenn eine Person aktualisiert wird.",
|
||||
"Triggers when a deal is updated.": "Wird ausgelöst, wenn ein Deal aktualisiert wird.",
|
||||
"Triggers when a deal's stage is updated.": "Wird ausgelöst, wenn die Phase eines Deals aktualisiert wird.",
|
||||
"Triggers when a new lead is created.": "Wird ausgelöst, wenn ein neuer Lead erstellt wird.",
|
||||
"Triggers when a new organization is created.": "Wird ausgelöst, wenn eine neue Organisation erstellt wird.",
|
||||
"Triggers when an existing organization is updated.": "Wird ausgelöst, wenn eine existierende Organisation aktualisiert wird.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Wird ausgelöst, wenn eine Aktivität zum ersten Mal mit einem Pipedrive Filter übereinstimmt.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Wird ausgelöst, wenn ein Deal zum ersten Mal mit einem Pipedrive Filter übereinstimmt.",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Wird ausgelöst, wenn eine Person zum ersten Mal mit einem Pipedrive Filter übereinstimmt.",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "Wird ausgelöst, wenn eine Organisation zum ersten Mal mit einem Pipedrive Filter übereinstimmt.",
|
||||
"Filter by": "Filtern nach",
|
||||
"Field Values": "Feldwerte",
|
||||
"Field to watch for Changes On": "Feld für Änderungen an",
|
||||
"Stage in Pipeline": "Phase in Pipeline",
|
||||
"Deal Status": "Angebotsstatus",
|
||||
"All(Not Deleted)": "Alle (nicht gelöscht)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "Software de gestión de ventas CRM y tuberías",
|
||||
"Add Follower": "Añadir seguidor",
|
||||
"Retrieve a Note": "Recuperar una nota",
|
||||
"Create Note": "Crear nota",
|
||||
"Add Labels to Person": "Añadir etiquetas a la persona",
|
||||
"Add Product to Deal": "Añadir producto a oferta",
|
||||
"Attach File": "Adjuntar archivo",
|
||||
"Create Activity": "Crear actividad",
|
||||
"Update Activity": "Actualizar actividad",
|
||||
"Create Deal": "Crear oferta",
|
||||
"Update Deal": "Actualizar oferta",
|
||||
"Create Lead": "Crear plomo",
|
||||
"Update Lead": "Actualizar plomo",
|
||||
"Create Organization": "Crear organización",
|
||||
"Update Organization": "Actualizar organización",
|
||||
"Create Person": "Crear Persona",
|
||||
"Update Person": "Actualizar Persona",
|
||||
"Create Product": "Crear Producto",
|
||||
"Update Product": "Actualización del producto",
|
||||
"Find Deals Associated With Person": "Encuentra ofertas asociadas a la persona",
|
||||
"Find Product": "Buscar producto",
|
||||
"Find Products": "Buscar productos",
|
||||
"Find Notes": "Buscar notas",
|
||||
"Retrieve a Product": "Recuperar un producto",
|
||||
"Find Organization": "Buscar organización",
|
||||
"Find Person": "Buscar Persona",
|
||||
"Find Deal": "Encontrar oferta",
|
||||
"Find Activity": "Buscar actividad",
|
||||
"Find User": "Buscar usuario",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Adds a follower to a deal, person, organization or product.": "Añade un seguidor a un trato, persona, organización o producto.",
|
||||
"Finds a note by ID.": "Encuentra una nota por ID.",
|
||||
"Creates a new note.": "Crea una nueva nota.",
|
||||
"Adds existing labels to an existing person.": "Añade etiquetas existentes a una persona existente.",
|
||||
"Adds a product to a deal.": "Añade un producto a una oferta.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Sube un archivo y lo adjunta a una oferta, persona, organización, actividad o producto.",
|
||||
"Creates a new activity.": "Crea una nueva actividad.",
|
||||
"Updates an existing activity.": "Actualiza una actividad existente.",
|
||||
"Creates a new deal.": "Crea una nueva oferta.",
|
||||
"Updates an existing deal.": "Actualiza una oferta existente.",
|
||||
"Creates a new lead.": "Crea un nuevo cliente potencial.",
|
||||
"Updates an existing lead.": "Actualiza un cliente potencial.",
|
||||
"Creates a new organization.": "Crea una nueva organización.",
|
||||
"Updates an existing organization.": "Actualiza una organización existente.",
|
||||
"Creates a new person.": "Crea una nueva persona.",
|
||||
"Updates an existing person.": "Actualiza a una persona existente.",
|
||||
"Creates a new product.": "Crea un nuevo producto.",
|
||||
"Finds multiple deals related to a specific person.": "Encuentra múltiples ofertas relacionadas con una persona específica.",
|
||||
"Finds a product by name ": "Encuentra un producto por nombre ",
|
||||
"Finds a product or products by name or product code.": "Encuentra un producto o productos por nombre o código de producto.",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "Encuentra notas por Oferta, Líder, Persona o Organización ID.",
|
||||
"Finds a product by ID.": "Encuentra un producto por ID.",
|
||||
"Finds an organization.": "Encuentra una organización.",
|
||||
"Finds a person.": "Encuentra a una persona.",
|
||||
"Finds a deal by any field.": "Encuentra un trato por cualquier campo.",
|
||||
"Finds an activity by subject.": "Encuentra una actividad por tema.",
|
||||
"Finds a user by name or email.": "Encuentra un usuario por nombre o correo electrónico.",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"Follower": "Seguidor",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "ID de objeto objetivo",
|
||||
"Note ID": "Nota ID",
|
||||
"Content": "Contenido",
|
||||
"Deal ID": "ID de Oferta",
|
||||
"Pin note to deal?": "¿Anclar nota a tratar?",
|
||||
"Person ID": "ID de la persona",
|
||||
"Pin note to person?": "¿Anclar nota a persona?",
|
||||
"Organization ID": "ID de la organización",
|
||||
"Pin note to organization?": "¿Anclar nota a la organización?",
|
||||
"Lead ID": "ID de plomo",
|
||||
"Pin note to lead?": "¿Anclar nota para liderar?",
|
||||
"Label": "Etiqueta",
|
||||
"Product ID": "ID producto",
|
||||
"Price": "Precio",
|
||||
"Quantity": "Cantidad",
|
||||
"Discount": "Descuento",
|
||||
"Discount Type": "Tipo de descuento",
|
||||
"Comments": "Comentarios",
|
||||
"Enable Product?": "¿Habilitar producto?",
|
||||
"Tax Method": "Método de impuestos",
|
||||
"Tax Percentage": "Porcentaje de impuestos",
|
||||
"File": "Archivo",
|
||||
"File Name": "Nombre del archivo",
|
||||
"Activity ID": "ID de actividad",
|
||||
"Subject": "Asunto",
|
||||
"Assign To": "Asignar a",
|
||||
"Activity Type": "Tipo de actividad",
|
||||
"Due Date": "Fecha de fin",
|
||||
"Due Time": "Hora límite",
|
||||
"Duration": "Duración",
|
||||
"Mark as Done?": "¿Marcar como listo?",
|
||||
"Free or Busy": "Libre o ocupado",
|
||||
"Note": "Nota",
|
||||
"Public Description": "Descripción pública",
|
||||
"Title": "Título",
|
||||
"Creation Time": "Tiempo de Creación",
|
||||
"Status": "Estado",
|
||||
"Stage": "Etapa",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Propietario",
|
||||
"Probability": "Probabilidad",
|
||||
"Expected Close Date": "Fecha de cierre esperada",
|
||||
"Value": "Valor",
|
||||
"Currency": "Moneda",
|
||||
"Visible To": "Visible a",
|
||||
"Custom Fields": "Campos personalizados",
|
||||
"Channel": "Canal",
|
||||
"Lead Value Amount": "Importe del Valor de Contacto",
|
||||
"Lead Value Currency": "Moneda del valor principal",
|
||||
"Name": "Nombre",
|
||||
"Address": "Dirección",
|
||||
"Email": "E-mail",
|
||||
"Phone": "Teléfono",
|
||||
"First Name": "Nombre",
|
||||
"Last Name": "Apellido",
|
||||
"Marketing Status": "Estado de marketing",
|
||||
"Code": "Código",
|
||||
"Description": "Descripción",
|
||||
"Unit": "Unidad",
|
||||
"Tax percentage": "Porcentaje de impuestos",
|
||||
"Is Active ?": "¿Está activo?",
|
||||
"Cost": "Costo",
|
||||
"Overhead Cost": "Costo general",
|
||||
"Search Term": "Buscar término",
|
||||
"Field to search by": "Campo a buscar por",
|
||||
"Field Value": "Valor del campo",
|
||||
"Search By": "Buscar por",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Partida exacta",
|
||||
"Filter": "Filtro",
|
||||
"Method": "Método",
|
||||
"Headers": "Encabezados",
|
||||
"Query Parameters": "Parámetros de consulta",
|
||||
"Body": "Cuerpo",
|
||||
"Response is Binary ?": "¿Respuesta es binaria?",
|
||||
"No Error on Failure": "No hay ningún error en fallo",
|
||||
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
|
||||
"Type of object to add the follower to.": "Tipo de objeto al que agregar el seguidor.",
|
||||
"ID of the object to add the follower to.": "ID del objeto al que agregar el seguidor.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "Puedes usar la acción Buscar Oferta para recuperar el ID de la operación.",
|
||||
"You can use Find Person action to retrieve person ID.": "Puedes usar la acción Buscar Persona para recuperar el ID de la persona.",
|
||||
"You can use Find Organization action to retrieve org ID.": "Puedes usar la acción Buscar Organización para recuperar el ID de org.",
|
||||
"You can use Find Product action to retrieve product ID.": "Puede utilizar la acción Buscar producto para recuperar el ID del producto.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Por favor, introduzca la fecha en formato AAA-MM-DD.",
|
||||
"Please enter time in HH:MM format.": "Por favor, introduzca la hora en formato HH:MM.",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "Introduzca la hora en formato HH:MM (por ejemplo, \"01:30\" durante 1 hora 30 minutos).",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "Si una etapa es elegida arriba, el campo pipeline será ignorado.",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "Por favor, introduzca el código de la moneda (por ejemplo, \"USD\", \"Click\").",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "La moneda del valor inicial (por ej., \"USD\", \"Text\").",
|
||||
"Marketing opt-in status": "Estado de marketing opt-in",
|
||||
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
|
||||
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
|
||||
"Deal": "Oferta",
|
||||
"Person": "Persona",
|
||||
"Organization": "Organización",
|
||||
"Product": "Producto",
|
||||
"Percentage": "Porcentaje",
|
||||
"Amount": "Cantidad",
|
||||
"Exclusive": "Exclusivo",
|
||||
"Inclusive": "Inclusivo",
|
||||
"None": "Ninguna",
|
||||
"Free": "Gratis",
|
||||
"Busy": "Ocupado",
|
||||
"Open": "Abrir",
|
||||
"Won": "Ganado",
|
||||
"Lost": "Perdido",
|
||||
"Deleted": "Eliminado",
|
||||
"Owner & followers": "Propietario y seguidores",
|
||||
"Entire company": "Empresa entera",
|
||||
"No Consent": "Sin consentimiento",
|
||||
"Unsubscribed": "Desuscrito",
|
||||
"Subscribed": "Suscrito",
|
||||
"Archived": "Archivado",
|
||||
"Product Code": "Código de producto",
|
||||
"Lead": "Plomo",
|
||||
"Done": "Hecho",
|
||||
"Not Done": "No hecho",
|
||||
"GET": "RECOGER",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "BORRAR",
|
||||
"HEAD": "LIMPIO",
|
||||
"New Person": "Nueva persona",
|
||||
"New Deal": "Nueva oferta",
|
||||
"New Activity": "Nueva actividad",
|
||||
"New Note": "Nueva nota",
|
||||
"Updated Person": "Persona actualizada",
|
||||
"Updated Deal": "Oferta actualizada",
|
||||
"Updated Deal Stage": "Etapa de oferta actualizada",
|
||||
"New Lead": "Nuevo plomo",
|
||||
"New Organization": "Nueva organización",
|
||||
"Updated Organization": "Organización actualizada",
|
||||
"Activity Matching Filter": "Filtro de actividad coincidente",
|
||||
"Deal Matching Filter": "Filtro de coincidencia de ofertas",
|
||||
"Person Matching Filter": "Filtro de coincidencia de personas",
|
||||
"Organization Matching Filter": "Filtro de coincidencia de organización",
|
||||
"Triggers when a new person is created": "Dispara cuando se crea una nueva persona",
|
||||
"Triggers when a new deal is created.": "Dispara cuando se crea una nueva oferta.",
|
||||
"Triggers when a new activity is added": "Dispara cuando se agrega una nueva actividad",
|
||||
"Triggers when a new note is created.": "Se activa cuando se crea una nueva nota.",
|
||||
"Triggers when a person is updated.": "Dispara cuando una persona es actualizada.",
|
||||
"Triggers when a deal is updated.": "Dispara cuando se actualiza una oferta.",
|
||||
"Triggers when a deal's stage is updated.": "Dispara cuando se actualiza la etapa de un acuerdo.",
|
||||
"Triggers when a new lead is created.": "Dispara cuando se crea un nuevo plomo.",
|
||||
"Triggers when a new organization is created.": "Dispara cuando se crea una nueva organización.",
|
||||
"Triggers when an existing organization is updated.": "Se activa cuando se actualiza una organización existente.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Se activa cuando una actividad recientemente coincide con un filtro de Pipedrive por primera vez.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Se activa cuando una nueva oferta coincide con un filtro de Pipedrive por primera vez.",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Dispara cuando una persona recientemente coincide con un filtro de Pipedrive por primera vez.",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "Dispara cuando una organización recientemente coincide con un filtro de Pipedrive por primera vez.",
|
||||
"Filter by": "Filtrar por",
|
||||
"Field Values": "Valores de campo",
|
||||
"Field to watch for Changes On": "Campo para ver los cambios en",
|
||||
"Stage in Pipeline": "Etapa en Pipeline",
|
||||
"Deal Status": "Estado de la oferta",
|
||||
"All(Not Deleted)": "Todo(no eliminado)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "Logiciel de gestion des ventes CRM et pipeline",
|
||||
"Add Follower": "Ajouter un abonné",
|
||||
"Retrieve a Note": "Récupérer une note",
|
||||
"Create Note": "Créer une note",
|
||||
"Add Labels to Person": "Ajouter des étiquettes à la personne",
|
||||
"Add Product to Deal": "Ajouter un produit à la transaction",
|
||||
"Attach File": "Joindre un fichier",
|
||||
"Create Activity": "Créer une activité",
|
||||
"Update Activity": "Mettre à jour l'activité",
|
||||
"Create Deal": "Créer une transaction",
|
||||
"Update Deal": "Mettre à jour la transaction",
|
||||
"Create Lead": "Créer Prospect",
|
||||
"Update Lead": "Mettre à jour le prospect",
|
||||
"Create Organization": "Créer une organisation",
|
||||
"Update Organization": "Mettre à jour l'organisation",
|
||||
"Create Person": "Créer une personne",
|
||||
"Update Person": "Mettre à jour la personne",
|
||||
"Create Product": "Créer un produit",
|
||||
"Update Product": "Mettre à jour le produit",
|
||||
"Find Deals Associated With Person": "Trouver des offres associées à une personne",
|
||||
"Find Product": "Trouver un produit",
|
||||
"Find Products": "Trouver des produits",
|
||||
"Find Notes": "Rechercher des notes",
|
||||
"Retrieve a Product": "Récupérer un produit",
|
||||
"Find Organization": "Trouver une organisation",
|
||||
"Find Person": "Trouver une personne",
|
||||
"Find Deal": "Trouver une offre",
|
||||
"Find Activity": "Rechercher une activité",
|
||||
"Find User": "Trouver un utilisateur",
|
||||
"Custom API Call": "Appel API personnalisé",
|
||||
"Adds a follower to a deal, person, organization or product.": "Ajoute un abonné à une entente, une personne, une organisation ou un produit.",
|
||||
"Finds a note by ID.": "Trouve une note par ID.",
|
||||
"Creates a new note.": "Crée une nouvelle note.",
|
||||
"Adds existing labels to an existing person.": "Ajoute des étiquettes existantes à une personne existante.",
|
||||
"Adds a product to a deal.": "Ajoute un produit à une offre.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Télécharge un fichier et le joint à une affaire, une personne, une organisation, une activité ou un produit.",
|
||||
"Creates a new activity.": "Crée une nouvelle activité.",
|
||||
"Updates an existing activity.": "Met à jour une activité existante.",
|
||||
"Creates a new deal.": "Crée une nouvelle offre.",
|
||||
"Updates an existing deal.": "Met à jour une transaction existante.",
|
||||
"Creates a new lead.": "Crée un nouveau prospect.",
|
||||
"Updates an existing lead.": "Met à jour un prospect existant.",
|
||||
"Creates a new organization.": "Crée une nouvelle organisation.",
|
||||
"Updates an existing organization.": "Met à jour une organisation existante.",
|
||||
"Creates a new person.": "Crée une nouvelle personne.",
|
||||
"Updates an existing person.": "Met à jour une personne existante.",
|
||||
"Creates a new product.": "Crée un nouveau produit.",
|
||||
"Finds multiple deals related to a specific person.": "Trouve plusieurs affaires liées à une personne spécifique.",
|
||||
"Finds a product by name ": "Trouve un produit par nom ",
|
||||
"Finds a product or products by name or product code.": "Trouve un produit ou des produits par nom ou code produit.",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "Trouve des notes par Deal, Lead, Person, ou Organization ID.",
|
||||
"Finds a product by ID.": "Trouve un produit par ID.",
|
||||
"Finds an organization.": "Trouve une organisation.",
|
||||
"Finds a person.": "Trouve une personne.",
|
||||
"Finds a deal by any field.": "Trouve une transaction par champ.",
|
||||
"Finds an activity by subject.": "Trouve une activité par sujet.",
|
||||
"Finds a user by name or email.": "Trouve un utilisateur par nom ou par email.",
|
||||
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
|
||||
"Follower": "Abonné",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "ID de l'objet cible",
|
||||
"Note ID": "ID de la note",
|
||||
"Content": "Contenus",
|
||||
"Deal ID": "ID de la transaction",
|
||||
"Pin note to deal?": "Épingler la note à traiter?",
|
||||
"Person ID": "ID de la personne",
|
||||
"Pin note to person?": "Épingler la note à la personne ?",
|
||||
"Organization ID": "ID de l'organisation",
|
||||
"Pin note to organization?": "Épingler la note à l'organisation ?",
|
||||
"Lead ID": "ID du prospect",
|
||||
"Pin note to lead?": "Épingler la note pour mener?",
|
||||
"Label": "Étiquette",
|
||||
"Product ID": "ID du produit",
|
||||
"Price": "Prix",
|
||||
"Quantity": "Quantité",
|
||||
"Discount": "Remise",
|
||||
"Discount Type": "Type de réduction",
|
||||
"Comments": "Commentaires",
|
||||
"Enable Product?": "Activer le produit ?",
|
||||
"Tax Method": "Méthode de taxe",
|
||||
"Tax Percentage": "Pourcentage de Taxe",
|
||||
"File": "Ficher",
|
||||
"File Name": "Nom du fichier",
|
||||
"Activity ID": "ID de l'activité",
|
||||
"Subject": "Sujet",
|
||||
"Assign To": "Assigner à",
|
||||
"Activity Type": "Type d'activité",
|
||||
"Due Date": "Date de fin",
|
||||
"Due Time": "Heure d'échéance",
|
||||
"Duration": "Durée",
|
||||
"Mark as Done?": "Marquer comme Terminé ?",
|
||||
"Free or Busy": "Gratuit ou occupé",
|
||||
"Note": "Note",
|
||||
"Public Description": "Description publique",
|
||||
"Title": "Titre de la page",
|
||||
"Creation Time": "Date de création",
|
||||
"Status": "Statut",
|
||||
"Stage": "Étape",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Propriétaire",
|
||||
"Probability": "Probabilité",
|
||||
"Expected Close Date": "Date de clôture prévue",
|
||||
"Value": "Valeur",
|
||||
"Currency": "Devise",
|
||||
"Visible To": "Visible pour",
|
||||
"Custom Fields": "Champs personnalisés",
|
||||
"Channel": "Chaîne",
|
||||
"Lead Value Amount": "Montant de la valeur de plomb",
|
||||
"Lead Value Currency": "Devise de la valeur de plomb",
|
||||
"Name": "Nom",
|
||||
"Address": "Adresses",
|
||||
"Email": "Courriel",
|
||||
"Phone": "Téléphone",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Marketing Status": "Statut Marketing",
|
||||
"Code": "Code",
|
||||
"Description": "Libellé",
|
||||
"Unit": "Unité",
|
||||
"Tax percentage": "Pourcentage de la taxe",
|
||||
"Is Active ?": "Est actif ?",
|
||||
"Cost": "Coûts",
|
||||
"Overhead Cost": "Coût des frais généraux",
|
||||
"Search Term": "Terme de recherche",
|
||||
"Field to search by": "Champ à rechercher par",
|
||||
"Field Value": "Valeur du champ",
|
||||
"Search By": "Rechercher par",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Correspondance exacte",
|
||||
"Filter": "Filtre",
|
||||
"Method": "Méthode",
|
||||
"Headers": "En-têtes",
|
||||
"Query Parameters": "Paramètres de requête",
|
||||
"Body": "Corps",
|
||||
"Response is Binary ?": "La réponse est Binaire ?",
|
||||
"No Error on Failure": "Aucune erreur en cas d'échec",
|
||||
"Timeout (in seconds)": "Délai d'attente (en secondes)",
|
||||
"Type of object to add the follower to.": "Type d'objet auquel ajouter le suiveur.",
|
||||
"ID of the object to add the follower to.": "ID de l'objet auquel ajouter le suiveur.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "Vous pouvez utiliser l'action Trouver une offre pour récupérer l'ID de la transaction.",
|
||||
"You can use Find Person action to retrieve person ID.": "Vous pouvez utiliser l'action Rechercher une personne pour récupérer l'ID de la personne.",
|
||||
"You can use Find Organization action to retrieve org ID.": "Vous pouvez utiliser l'action Rechercher une organisation pour récupérer l'ID de l'organisme.",
|
||||
"You can use Find Product action to retrieve product ID.": "Vous pouvez utiliser l'action Rechercher un produit pour récupérer l'ID du produit.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Veuillez entrer la date au format AAAA-MM-JJ.",
|
||||
"Please enter time in HH:MM format.": "Veuillez entrer l'heure au format HH:MM.",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "Veuillez entrer l'heure au format HH:MM (par exemple, \"01:30\" pour 1 heure 30 minutes).",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "Si une étape est choisie ci-dessus, le champ pipeline sera ignoré.",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "Veuillez entrer le code de la devise (par exemple, \"USD\", \"EUR\").",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "La devise de la valeur principale (par exemple, \"USD\", \"EUR\").",
|
||||
"Marketing opt-in status": "Statut de l'opt-in marketing",
|
||||
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
|
||||
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
|
||||
"Deal": "Affaire",
|
||||
"Person": "Personne",
|
||||
"Organization": "Organisation",
|
||||
"Product": "Produit",
|
||||
"Percentage": "Pourcentage",
|
||||
"Amount": "Montant",
|
||||
"Exclusive": "Exclusif",
|
||||
"Inclusive": "Inclus",
|
||||
"None": "Aucun",
|
||||
"Free": "Gratuit",
|
||||
"Busy": "Occupé",
|
||||
"Open": "Ouvert",
|
||||
"Won": "Gagné",
|
||||
"Lost": "Perdu",
|
||||
"Deleted": "Supprimé",
|
||||
"Owner & followers": "Propriétaire & abonnés",
|
||||
"Entire company": "Entreprise entière",
|
||||
"No Consent": "Aucun consentement",
|
||||
"Unsubscribed": "Désabonné",
|
||||
"Subscribed": "Inscrit",
|
||||
"Archived": "Archivé",
|
||||
"Product Code": "Code du produit",
|
||||
"Lead": "Prospect",
|
||||
"Done": "Terminé",
|
||||
"Not Done": "Non Fait",
|
||||
"GET": "OBTENIR",
|
||||
"POST": "POSTER",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "EFFACER",
|
||||
"DELETE": "SUPPRIMER",
|
||||
"HEAD": "TÊTE",
|
||||
"New Person": "Nouvelle Personne",
|
||||
"New Deal": "Nouvelle offre",
|
||||
"New Activity": "Nouvelle activité",
|
||||
"New Note": "Nouvelle note",
|
||||
"Updated Person": "Personne mise à jour",
|
||||
"Updated Deal": "Offre mise à jour",
|
||||
"Updated Deal Stage": "Phase de Deal mise à jour",
|
||||
"New Lead": "Nouveau prospect",
|
||||
"New Organization": "Nouvelle organisation",
|
||||
"Updated Organization": "Organisation mise à jour",
|
||||
"Activity Matching Filter": "Filtre de correspondance d'activité",
|
||||
"Deal Matching Filter": "Filtre de correspondance des transactions",
|
||||
"Person Matching Filter": "Filtre de correspondance des personnes",
|
||||
"Organization Matching Filter": "Filtre de correspondance de l'organisation",
|
||||
"Triggers when a new person is created": "Déclenche quand une nouvelle personne est créée",
|
||||
"Triggers when a new deal is created.": "Déclenche quand une nouvelle transaction est créée.",
|
||||
"Triggers when a new activity is added": "Déclenche quand une nouvelle activité est ajoutée",
|
||||
"Triggers when a new note is created.": "Déclenche quand une nouvelle note est créée.",
|
||||
"Triggers when a person is updated.": "Déclenche quand une personne est mise à jour.",
|
||||
"Triggers when a deal is updated.": "Déclenche quand une transaction est mise à jour.",
|
||||
"Triggers when a deal's stage is updated.": "Déclenche quand l'étape d'un marché est mise à jour.",
|
||||
"Triggers when a new lead is created.": "Déclenche lorsqu'un nouveau prospect est créé.",
|
||||
"Triggers when a new organization is created.": "Déclenche quand une nouvelle organisation est créée.",
|
||||
"Triggers when an existing organization is updated.": "Déclenche quand une organisation existante est mise à jour.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Déclenche quand une activité correspond à un filtre Pipedrive pour la première fois.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Déclenche lorsqu'une transaction correspond pour la première fois à un filtre Pipedrive.",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Déclenche quand une personne correspond récemment à un filtre Pipedrive pour la première fois.",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "Déclenche lorsqu'une organisation correspond pour la première fois à un filtre Pipedrive.",
|
||||
"Filter by": "Filtrer par",
|
||||
"Field Values": "Valeurs du champ",
|
||||
"Field to watch for Changes On": "Champ à surveiller pour les changements activés",
|
||||
"Stage in Pipeline": "Étape dans le Pipeline",
|
||||
"Deal Status": "Statut de la transaction",
|
||||
"All(Not Deleted)": "Tout (Non Supprimé)"
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"Pipedrive": "Pipedrive",
|
||||
"Sales CRM and pipeline management software": "Sales CRM and pipeline management software",
|
||||
"Add Follower": "Add Follower",
|
||||
"Retrieve a Note": "Retrieve a Note",
|
||||
"Create Note": "Create Note",
|
||||
"Add Labels to Person": "Add Labels to Person",
|
||||
"Add Product to Deal": "Add Product to Deal",
|
||||
"Attach File": "Attach File",
|
||||
"Create Activity": "Create Activity",
|
||||
"Update Activity": "Update Activity",
|
||||
"Create Deal": "Create Deal",
|
||||
"Update Deal": "Update Deal",
|
||||
"Create Lead": "Create Lead",
|
||||
"Update Lead": "Update Lead",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create Person": "Create Person",
|
||||
"Update Person": "Update Person",
|
||||
"Create Product": "Create Product",
|
||||
"Update Product": "Update Product",
|
||||
"Find Deals Associated With Person": "Find Deals Associated With Person",
|
||||
"Find Product": "Find Product",
|
||||
"Find Products": "Find Products",
|
||||
"Find Notes": "Find Notes",
|
||||
"Retrieve a Product": "Retrieve a Product",
|
||||
"Find Organization": "Find Organization",
|
||||
"Find Person": "Find Person",
|
||||
"Find Deal": "Find Deal",
|
||||
"Find Activity": "Find Activity",
|
||||
"Find User": "Find User",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Adds a follower to a deal, person, organization or product.": "Adds a follower to a deal, person, organization or product.",
|
||||
" Finds a note by ID.": " Finds a note by ID.",
|
||||
"Creates a new note.": "Creates a new note.",
|
||||
"Adds an existing labels to an existing person.": "Adds an existing labels to an existing person.",
|
||||
"Adds a product to a deal.": "Adds a product to a deal.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Uploads a file and attaches it to a deal,person,organization,activity or product.",
|
||||
"Creates a new activity.": "Creates a new activity.",
|
||||
"Updates an existing activity.": "Updates an existing activity.",
|
||||
"Creates a new deal.": "Creates a new deal.",
|
||||
"Updates an existing deal.": "Updates an existing deal.",
|
||||
"Creates a new lead.": "Creates a new lead.",
|
||||
"Updates an existing lead.": "Updates an existing lead.",
|
||||
"Creates a new organization.": "Creates a new organization.",
|
||||
"Updates an existing organization.": "Updates an existing organization.",
|
||||
"Creates a new person.": "Creates a new person.",
|
||||
"Updates an existing person.": "Updates an existing person.",
|
||||
"Creates a new product.": "Creates a new product.",
|
||||
"Finds multiple deals related to a specific person.": "Finds multiple deals related to a specific person.",
|
||||
"Find a product by name.": "Find a product by name.",
|
||||
"Finds a product or products by name or product code.": "Finds a product or products by name or product code.",
|
||||
"Finds notes by Deal,Lead,Person, or Organization ID.": "Finds notes by Deal,Lead,Person, or Organization ID.",
|
||||
" Finds a product by ID.": " Finds a product by ID.",
|
||||
"Finds an organization.": "Finds an organization.",
|
||||
"Finds a person.": "Finds a person.",
|
||||
"Finds a deal by any field.": "Finds a deal by any field.",
|
||||
"Finds an activity by subject.": "Finds an activity by subject.",
|
||||
"Find a user by name or email.": "Find a user by name or email.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Follower": "Follower",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Target Object ID",
|
||||
"Note ID": "Note ID",
|
||||
"Content": "Content",
|
||||
"Deal ID": "Deal ID",
|
||||
"Pin note to deal?": "Pin note to deal?",
|
||||
"Person ID": "Person ID",
|
||||
"Pin note to person?": "Pin note to person?",
|
||||
"Organization ID": "Organization ID",
|
||||
"Pin note to organization?": "Pin note to organization?",
|
||||
"Lead ID": "Lead ID",
|
||||
"Pin note to lead?": "Pin note to lead?",
|
||||
"Label": "Label",
|
||||
"Product ID": "Product ID",
|
||||
"Price": "Price",
|
||||
"Quantity": "Quantity",
|
||||
"Discount": "Discount",
|
||||
"Discount Type": "Discount Type",
|
||||
"Comments": "Comments",
|
||||
"Enable Product?": "Enable Product?",
|
||||
"Tax Method": "Tax Method",
|
||||
"Tax Percentage": "Tax Percentage",
|
||||
"File": "File",
|
||||
"File Name": "File Name",
|
||||
"Activity ID": "Activity ID",
|
||||
"Subject": "Subject",
|
||||
"Assign To": "Assign To",
|
||||
"Activity Type": "Activity Type",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Duration": "Duration",
|
||||
"Mark as Done?": "Mark as Done?",
|
||||
"Free or Busy": "Free or Busy",
|
||||
"Note": "Note",
|
||||
"Public Description": "Public Description",
|
||||
"Activity": "Activity",
|
||||
"Title": "Title",
|
||||
"Creation Time": "Creation Time",
|
||||
"Status": "Status",
|
||||
"Stage": "Stage",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Owner",
|
||||
"Probability": "Probability",
|
||||
"Expected Close Date": "Expected Close Date",
|
||||
"Value": "Value",
|
||||
"Currency": "Currency",
|
||||
"Visible To": "Visible To",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Channel": "Channel",
|
||||
"Lead Value": "Lead Value",
|
||||
"Lead Value Currency": "Lead Value Currency",
|
||||
"Name": "Name",
|
||||
"Address": "Address",
|
||||
"Email": "Email",
|
||||
"Phone": "Phone",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Marketing Status": "Marketing Status",
|
||||
"Code": "Code",
|
||||
"Description": "Description",
|
||||
"Unit": "Unit",
|
||||
"Tax percentage": "Tax percentage",
|
||||
"Is Active ?": "Is Active ?",
|
||||
"Cost": "Cost",
|
||||
"Overhead Cost": "Overhead Cost",
|
||||
"Search Term": "Search Term",
|
||||
"Field to search by": "Field to search by",
|
||||
"Field Value": "Field Value",
|
||||
"Search By": "Search By",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Exact Match",
|
||||
"Filter": "Filter",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Type of object to add the follower to.": "Type of object to add the follower to.",
|
||||
"ID of the object to add the follower to.": "ID of the object to add the follower to.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "You can use Find Deal action to retrieve deal ID.",
|
||||
"You can use Find Person action to retrieve person ID.": "You can use Find Person action to retrieve person ID.",
|
||||
"You can use Find Organization action to retrieve org ID.": "You can use Find Organization action to retrieve org ID.",
|
||||
"You can use Find Product action to retrieve product ID.": "You can use Find Product action to retrieve product ID.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Please enter date in YYYY-MM-DD format.",
|
||||
"Please enter time in HH:MM format.": "Please enter time in HH:MM format.",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "If a stage is chosen above, the pipeline field will be ignored.",
|
||||
"Please enter currency code.": "Please enter currency code.",
|
||||
"Marketing opt-in status": "Marketing opt-in status",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"Deal": "Deal",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Product": "Product",
|
||||
"Percentage": "Percentage",
|
||||
"Amount": "Amount",
|
||||
"Exclusive": "Exclusive",
|
||||
"Inclusive": "Inclusive",
|
||||
"None": "None",
|
||||
"Free": "Free",
|
||||
"Busy": "Busy",
|
||||
"Open": "Open",
|
||||
"Won": "Won",
|
||||
"Lost": "Lost",
|
||||
"Deleted": "Deleted",
|
||||
"Item Owner": "Item Owner",
|
||||
"All Users": "All Users",
|
||||
"No Consent": "No Consent",
|
||||
"Unsubscribed": "Unsubscribed",
|
||||
"Subscribed": "Subscribed",
|
||||
"Archived": "Archived",
|
||||
"Product Code": "Product Code",
|
||||
"Lead": "Lead",
|
||||
"Done": "Done",
|
||||
"Not Done": "Not Done",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Person": "New Person",
|
||||
"New Deal": "New Deal",
|
||||
"New Activity": "New Activity",
|
||||
"New Note": "New Note",
|
||||
"Updated Person": "Updated Person",
|
||||
"Updated Deal": "Updated Deal",
|
||||
"Updated Deal Stage": "Updated Deal Stage",
|
||||
"New Lead": "New Lead",
|
||||
"New Organization": "New Organization",
|
||||
"Updated Organization": "Updated Organization",
|
||||
"Activity Matching Filter": "Activity Matching Filter",
|
||||
"Deal Matching Filter": "Deal Matching Filter",
|
||||
"Person Matching Filter": "Person Matching Filter",
|
||||
"Organization Matching Filter": "Organization Matching Filter",
|
||||
"Triggers when a new person is created": "Triggers when a new person is created",
|
||||
"Triggers when a new deal is created.": "Triggers when a new deal is created.",
|
||||
"Triggers when a new activity is added": "Triggers when a new activity is added",
|
||||
"Triggers when a new note is created.": "Triggers when a new note is created.",
|
||||
"Triggers when a person is updated": "Triggers when a person is updated",
|
||||
"Triggers when a deal is updated": "Triggers when a deal is updated",
|
||||
"Triggers when a deal's stage is updated.": "Triggers when a deal's stage is updated.",
|
||||
"Triggers when a new lead is created.": "Triggers when a new lead is created.",
|
||||
"Triggers when a new organization is created.": "Triggers when a new organization is created.",
|
||||
"Triggers when an existing organization is updated.": "Triggers when an existing organization is updated.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Trigges when an activity newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Trigges when a deal newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a person newly matches a Pipedrive filter for the first time.": "Trigges when a person newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when an organization newly matches a Pipedrive filter for the first time.": "Trigges when an organization newly matches a Pipedrive filter for the first time.",
|
||||
"Filter by": "Filter by",
|
||||
"Field Values": "Field Values",
|
||||
"Field to watch for Changes On": "Field to watch for Changes On",
|
||||
"Stage in Pipeline": "Stage in Pipeline",
|
||||
"Deal Status": "Deal Status",
|
||||
"All(Not Deleted)": "All(Not Deleted)"
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"Pipedrive": "Pipedrive",
|
||||
"Sales CRM and pipeline management software": "Sales CRM and pipeline management software",
|
||||
"Add Follower": "Add Follower",
|
||||
"Retrieve a Note": "Retrieve a Note",
|
||||
"Create Note": "Create Note",
|
||||
"Add Labels to Person": "Add Labels to Person",
|
||||
"Add Product to Deal": "Add Product to Deal",
|
||||
"Attach File": "Attach File",
|
||||
"Create Activity": "Create Activity",
|
||||
"Update Activity": "Update Activity",
|
||||
"Create Deal": "Create Deal",
|
||||
"Update Deal": "Update Deal",
|
||||
"Create Lead": "Create Lead",
|
||||
"Update Lead": "Update Lead",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create Person": "Create Person",
|
||||
"Update Person": "Update Person",
|
||||
"Create Product": "Create Product",
|
||||
"Update Product": "Update Product",
|
||||
"Find Deals Associated With Person": "Find Deals Associated With Person",
|
||||
"Find Product": "Find Product",
|
||||
"Find Products": "Find Products",
|
||||
"Find Notes": "Find Notes",
|
||||
"Retrieve a Product": "Retrieve a Product",
|
||||
"Find Organization": "Find Organization",
|
||||
"Find Person": "Find Person",
|
||||
"Find Deal": "Find Deal",
|
||||
"Find Activity": "Find Activity",
|
||||
"Find User": "Find User",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Adds a follower to a deal, person, organization or product.": "Adds a follower to a deal, person, organization or product.",
|
||||
" Finds a note by ID.": " Finds a note by ID.",
|
||||
"Creates a new note.": "Creates a new note.",
|
||||
"Adds an existing labels to an existing person.": "Adds an existing labels to an existing person.",
|
||||
"Adds a product to a deal.": "Adds a product to a deal.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Uploads a file and attaches it to a deal,person,organization,activity or product.",
|
||||
"Creates a new activity.": "Creates a new activity.",
|
||||
"Updates an existing activity.": "Updates an existing activity.",
|
||||
"Creates a new deal.": "Creates a new deal.",
|
||||
"Updates an existing deal.": "Updates an existing deal.",
|
||||
"Creates a new lead.": "Creates a new lead.",
|
||||
"Updates an existing lead.": "Updates an existing lead.",
|
||||
"Creates a new organization.": "Creates a new organization.",
|
||||
"Updates an existing organization.": "Updates an existing organization.",
|
||||
"Creates a new person.": "Creates a new person.",
|
||||
"Updates an existing person.": "Updates an existing person.",
|
||||
"Creates a new product.": "Creates a new product.",
|
||||
"Finds multiple deals related to a specific person.": "Finds multiple deals related to a specific person.",
|
||||
"Find a product by name.": "Find a product by name.",
|
||||
"Finds a product or products by name or product code.": "Finds a product or products by name or product code.",
|
||||
"Finds notes by Deal,Lead,Person, or Organization ID.": "Finds notes by Deal,Lead,Person, or Organization ID.",
|
||||
" Finds a product by ID.": " Finds a product by ID.",
|
||||
"Finds an organization.": "Finds an organization.",
|
||||
"Finds a person.": "Finds a person.",
|
||||
"Finds a deal by any field.": "Finds a deal by any field.",
|
||||
"Finds an activity by subject.": "Finds an activity by subject.",
|
||||
"Find a user by name or email.": "Find a user by name or email.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Follower": "Follower",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Target Object ID",
|
||||
"Note ID": "Note ID",
|
||||
"Content": "Content",
|
||||
"Deal ID": "Deal ID",
|
||||
"Pin note to deal?": "Pin note to deal?",
|
||||
"Person ID": "Person ID",
|
||||
"Pin note to person?": "Pin note to person?",
|
||||
"Organization ID": "Organization ID",
|
||||
"Pin note to organization?": "Pin note to organization?",
|
||||
"Lead ID": "Lead ID",
|
||||
"Pin note to lead?": "Pin note to lead?",
|
||||
"Label": "Label",
|
||||
"Product ID": "Product ID",
|
||||
"Price": "Price",
|
||||
"Quantity": "Quantity",
|
||||
"Discount": "Discount",
|
||||
"Discount Type": "Discount Type",
|
||||
"Comments": "Comments",
|
||||
"Enable Product?": "Enable Product?",
|
||||
"Tax Method": "Tax Method",
|
||||
"Tax Percentage": "Tax Percentage",
|
||||
"File": "File",
|
||||
"File Name": "File Name",
|
||||
"Activity ID": "Activity ID",
|
||||
"Subject": "Subject",
|
||||
"Assign To": "Assign To",
|
||||
"Activity Type": "Activity Type",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Duration": "Duration",
|
||||
"Mark as Done?": "Mark as Done?",
|
||||
"Free or Busy": "Free or Busy",
|
||||
"Note": "Note",
|
||||
"Public Description": "Public Description",
|
||||
"Activity": "Activity",
|
||||
"Title": "Title",
|
||||
"Creation Time": "Creation Time",
|
||||
"Status": "Status",
|
||||
"Stage": "Stage",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Owner",
|
||||
"Probability": "Probability",
|
||||
"Expected Close Date": "Expected Close Date",
|
||||
"Value": "Value",
|
||||
"Currency": "Currency",
|
||||
"Visible To": "Visible To",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Channel": "Channel",
|
||||
"Lead Value": "Lead Value",
|
||||
"Lead Value Currency": "Lead Value Currency",
|
||||
"Name": "Name",
|
||||
"Address": "Address",
|
||||
"Email": "Email",
|
||||
"Phone": "Phone",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Marketing Status": "Marketing Status",
|
||||
"Code": "Code",
|
||||
"Description": "Description",
|
||||
"Unit": "Unit",
|
||||
"Tax percentage": "Tax percentage",
|
||||
"Is Active ?": "Is Active ?",
|
||||
"Cost": "Cost",
|
||||
"Overhead Cost": "Overhead Cost",
|
||||
"Search Term": "Search Term",
|
||||
"Field to search by": "Field to search by",
|
||||
"Field Value": "Field Value",
|
||||
"Search By": "Search By",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Exact Match",
|
||||
"Filter": "Filter",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Type of object to add the follower to.": "Type of object to add the follower to.",
|
||||
"ID of the object to add the follower to.": "ID of the object to add the follower to.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "You can use Find Deal action to retrieve deal ID.",
|
||||
"You can use Find Person action to retrieve person ID.": "You can use Find Person action to retrieve person ID.",
|
||||
"You can use Find Organization action to retrieve org ID.": "You can use Find Organization action to retrieve org ID.",
|
||||
"You can use Find Product action to retrieve product ID.": "You can use Find Product action to retrieve product ID.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Please enter date in YYYY-MM-DD format.",
|
||||
"Please enter time in HH:MM format.": "Please enter time in HH:MM format.",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "If a stage is chosen above, the pipeline field will be ignored.",
|
||||
"Please enter currency code.": "Please enter currency code.",
|
||||
"Marketing opt-in status": "Marketing opt-in status",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"Deal": "Deal",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Product": "Product",
|
||||
"Percentage": "Percentage",
|
||||
"Amount": "Amount",
|
||||
"Exclusive": "Exclusive",
|
||||
"Inclusive": "Inclusive",
|
||||
"None": "None",
|
||||
"Free": "Free",
|
||||
"Busy": "Busy",
|
||||
"Open": "Open",
|
||||
"Won": "Won",
|
||||
"Lost": "Lost",
|
||||
"Deleted": "Deleted",
|
||||
"Item Owner": "Item Owner",
|
||||
"All Users": "All Users",
|
||||
"No Consent": "No Consent",
|
||||
"Unsubscribed": "Unsubscribed",
|
||||
"Subscribed": "Subscribed",
|
||||
"Archived": "Archived",
|
||||
"Product Code": "Product Code",
|
||||
"Lead": "Lead",
|
||||
"Done": "Done",
|
||||
"Not Done": "Not Done",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Person": "New Person",
|
||||
"New Deal": "New Deal",
|
||||
"New Activity": "New Activity",
|
||||
"New Note": "New Note",
|
||||
"Updated Person": "Updated Person",
|
||||
"Updated Deal": "Updated Deal",
|
||||
"Updated Deal Stage": "Updated Deal Stage",
|
||||
"New Lead": "New Lead",
|
||||
"New Organization": "New Organization",
|
||||
"Updated Organization": "Updated Organization",
|
||||
"Activity Matching Filter": "Activity Matching Filter",
|
||||
"Deal Matching Filter": "Deal Matching Filter",
|
||||
"Person Matching Filter": "Person Matching Filter",
|
||||
"Organization Matching Filter": "Organization Matching Filter",
|
||||
"Triggers when a new person is created": "Triggers when a new person is created",
|
||||
"Triggers when a new deal is created.": "Triggers when a new deal is created.",
|
||||
"Triggers when a new activity is added": "Triggers when a new activity is added",
|
||||
"Triggers when a new note is created.": "Triggers when a new note is created.",
|
||||
"Triggers when a person is updated": "Triggers when a person is updated",
|
||||
"Triggers when a deal is updated": "Triggers when a deal is updated",
|
||||
"Triggers when a deal's stage is updated.": "Triggers when a deal's stage is updated.",
|
||||
"Triggers when a new lead is created.": "Triggers when a new lead is created.",
|
||||
"Triggers when a new organization is created.": "Triggers when a new organization is created.",
|
||||
"Triggers when an existing organization is updated.": "Triggers when an existing organization is updated.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Trigges when an activity newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Trigges when a deal newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a person newly matches a Pipedrive filter for the first time.": "Trigges when a person newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when an organization newly matches a Pipedrive filter for the first time.": "Trigges when an organization newly matches a Pipedrive filter for the first time.",
|
||||
"Filter by": "Filter by",
|
||||
"Field Values": "Field Values",
|
||||
"Field to watch for Changes On": "Field to watch for Changes On",
|
||||
"Stage in Pipeline": "Stage in Pipeline",
|
||||
"Deal Status": "Deal Status",
|
||||
"All(Not Deleted)": "All(Not Deleted)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "セールスCRMとパイプライン管理ソフトウェア",
|
||||
"Add Follower": "フォロワーを追加",
|
||||
"Retrieve a Note": "メモを取得する",
|
||||
"Create Note": "ノートを作成",
|
||||
"Add Labels to Person": "ラベルを人物に追加",
|
||||
"Add Product to Deal": "商品を取引に追加",
|
||||
"Attach File": "ファイルを添付",
|
||||
"Create Activity": "アクティビティを作成",
|
||||
"Update Activity": "アクティビティを更新",
|
||||
"Create Deal": "取引を作成",
|
||||
"Update Deal": "取引を更新",
|
||||
"Create Lead": "リードを作成",
|
||||
"Update Lead": "潜在顧客を更新",
|
||||
"Create Organization": "組織を作成",
|
||||
"Update Organization": "組織を更新",
|
||||
"Create Person": "ユーザーを作成",
|
||||
"Update Person": "担当者を更新",
|
||||
"Create Product": "商品を作成",
|
||||
"Update Product": "製品更新",
|
||||
"Find Deals Associated With Person": "関連付けられた取引を探す",
|
||||
"Find Product": "商品を検索",
|
||||
"Find Products": "商品を探す",
|
||||
"Find Notes": "メモを探す",
|
||||
"Retrieve a Product": "商品を取得",
|
||||
"Find Organization": "組織を検索",
|
||||
"Find Person": "人を探す",
|
||||
"Find Deal": "取引を探す",
|
||||
"Find Activity": "アクティビティを検索",
|
||||
"Find User": "ユーザーを検索",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Adds a follower to a deal, person, organization or product.": "取引、人、組織、または製品にフォロワーを追加します。",
|
||||
"Finds a note by ID.": "IDでノートを検索します。",
|
||||
"Creates a new note.": "新しいノートを作成します。",
|
||||
"Adds existing labels to an existing person.": "既存のユーザーに既存のラベルを追加します。",
|
||||
"Adds a product to a deal.": "取引に商品を追加",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "ファイルをアップロードし、取引、人、組織、活動または製品に添付します。",
|
||||
"Creates a new activity.": "新しいアクティビティを作成します。",
|
||||
"Updates an existing activity.": "既存のアクティビティを更新します。",
|
||||
"Creates a new deal.": "新しい取引を作成します。",
|
||||
"Updates an existing deal.": "既存の取引を更新します。",
|
||||
"Creates a new lead.": "新しいリードを作成します。",
|
||||
"Updates an existing lead.": "既存のリードを更新する。",
|
||||
"Creates a new organization.": "新しい組織を作成します。",
|
||||
"Updates an existing organization.": "既存の組織を更新します",
|
||||
"Creates a new person.": "新しいユーザーを作成します。",
|
||||
"Updates an existing person.": "既存のユーザーを更新します。",
|
||||
"Creates a new product.": "新しい商品を作成します。",
|
||||
"Finds multiple deals related to a specific person.": "特定の人に関連する複数の取引を検索します。",
|
||||
"Finds a product by name ": "名前で製品を検索 ",
|
||||
"Finds a product or products by name or product code.": "名前または製品コードで製品または製品を検索します。",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "取引、リード、個人、または組織 ID でノートを検索します。",
|
||||
"Finds a product by ID.": "ID で製品を検索します。",
|
||||
"Finds an organization.": "組織を検索します。",
|
||||
"Finds a person.": "人を見つけます。",
|
||||
"Finds a deal by any field.": "任意のフィールドで取引を検索します。",
|
||||
"Finds an activity by subject.": "件名によるアクティビティを検索します。",
|
||||
"Finds a user by name or email.": "名前またはメールアドレスでユーザーを検索します。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"Follower": "フォロワー",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "ターゲットオブジェクトID",
|
||||
"Note ID": "メモID",
|
||||
"Content": "コンテンツ",
|
||||
"Deal ID": "取引ID",
|
||||
"Pin note to deal?": "ノートを取引にピン留めしますか?",
|
||||
"Person ID": "Person ID",
|
||||
"Pin note to person?": "ノートを個人にピン留めしますか?",
|
||||
"Organization ID": "組織 ID",
|
||||
"Pin note to organization?": "組織にメモをピン留めしますか?",
|
||||
"Lead ID": "リードID",
|
||||
"Pin note to lead?": "リードにメモをピン留めしますか?",
|
||||
"Label": "ラベル",
|
||||
"Product ID": "商品ID",
|
||||
"Price": "価格",
|
||||
"Quantity": "数量",
|
||||
"Discount": "割引",
|
||||
"Discount Type": "割引の種類",
|
||||
"Comments": "コメント",
|
||||
"Enable Product?": "商品を有効にしますか?",
|
||||
"Tax Method": "課税方法",
|
||||
"Tax Percentage": "課税率",
|
||||
"File": "ファイル",
|
||||
"File Name": "ファイル名",
|
||||
"Activity ID": "アクティビティ ID",
|
||||
"Subject": "件名",
|
||||
"Assign To": "割り当て",
|
||||
"Activity Type": "活動タイプ",
|
||||
"Due Date": "締切日",
|
||||
"Due Time": "締切日時",
|
||||
"Duration": "期間",
|
||||
"Mark as Done?": "完了しましたか?",
|
||||
"Free or Busy": "空きまたは忙しいです",
|
||||
"Note": "メモ",
|
||||
"Public Description": "公開説明",
|
||||
"Title": "タイトル",
|
||||
"Creation Time": "作成日時",
|
||||
"Status": "ステータス",
|
||||
"Stage": "ステージ",
|
||||
"Pipeline": "パイプライン",
|
||||
"Owner": "所有者",
|
||||
"Probability": "可能性",
|
||||
"Expected Close Date": "終了予定日",
|
||||
"Value": "値",
|
||||
"Currency": "通貨",
|
||||
"Visible To": "表示先",
|
||||
"Custom Fields": "カスタムフィールド",
|
||||
"Channel": "チャンネル",
|
||||
"Lead Value Amount": "リード値",
|
||||
"Lead Value Currency": "リード価値通貨",
|
||||
"Name": "Name",
|
||||
"Address": "住所",
|
||||
"Email": "Eメールアドレス",
|
||||
"Phone": "電話番号",
|
||||
"First Name": "名",
|
||||
"Last Name": "Last Name",
|
||||
"Marketing Status": "マーケティングステータス",
|
||||
"Code": "Code",
|
||||
"Description": "Description",
|
||||
"Unit": "単位",
|
||||
"Tax percentage": "税率:",
|
||||
"Is Active ?": "アクティブですか?",
|
||||
"Cost": "コスト",
|
||||
"Overhead Cost": "オーバーヘッドコスト",
|
||||
"Search Term": "検索用語",
|
||||
"Field to search by": "検索するフィールド",
|
||||
"Field Value": "フィールド値",
|
||||
"Search By": "検索",
|
||||
"ID": "ID",
|
||||
"Exact Match": "完全一致",
|
||||
"Filter": "フィルター",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"Type of object to add the follower to.": "フォロワーを追加するオブジェクトのタイプ。",
|
||||
"ID of the object to add the follower to.": "フォロワーを追加するオブジェクトのID。",
|
||||
"You can use Find Deal action to retrieve deal ID.": "format@@0アクションを使用して、ディールIDを取得できます。",
|
||||
"You can use Find Person action to retrieve person ID.": "ユーザIDを取得するには、format@@0アクションを使用できます。",
|
||||
"You can use Find Organization action to retrieve org ID.": "組織を検索アクションを使用して組織IDを取得できます。",
|
||||
"You can use Find Product action to retrieve product ID.": "format@@0アクションを使用して、製品IDを取得できます。",
|
||||
"Please enter date in YYYY-MM-DD format.": "日付を YYYY-MM-DD 形式で入力してください。",
|
||||
"Please enter time in HH:MM format.": "時間をHH:MM形式で入力してください。",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "時間をHH:MM形式で入力してください(例:\"01:30\" 1時間30分)。",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "上記でステージを選択した場合、パイプラインフィールドは無視されます。",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "通貨コードを入力してください(例:\"USD\"、\"EUR\")。",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "リード値の通貨(例:\"USD\"、\"EUR\")。",
|
||||
"Marketing opt-in status": "マーケティングオプトインのステータス",
|
||||
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
|
||||
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
|
||||
"Deal": "取引",
|
||||
"Person": "人",
|
||||
"Organization": "組織",
|
||||
"Product": "商品",
|
||||
"Percentage": "割合",
|
||||
"Amount": "金額",
|
||||
"Exclusive": "専用",
|
||||
"Inclusive": "Inclusive",
|
||||
"None": "なし",
|
||||
"Free": "無料",
|
||||
"Busy": "取り込み中",
|
||||
"Open": "開く",
|
||||
"Won": "獲得日",
|
||||
"Lost": "失われた",
|
||||
"Deleted": "削除しました",
|
||||
"Owner & followers": "オーナーとフォロワー",
|
||||
"Entire company": "会社全体",
|
||||
"No Consent": "同意なし",
|
||||
"Unsubscribed": "購読解除済み",
|
||||
"Subscribed": "購読中",
|
||||
"Archived": "アーカイブ済み",
|
||||
"Product Code": "商品コード",
|
||||
"Lead": "リード",
|
||||
"Done": "完了",
|
||||
"Not Done": "完了していません",
|
||||
"GET": "取得",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "削除",
|
||||
"HEAD": "頭",
|
||||
"New Person": "新しい人",
|
||||
"New Deal": "新しい取引",
|
||||
"New Activity": "新しいアクティビティ",
|
||||
"New Note": "新しいメモ",
|
||||
"Updated Person": "更新者",
|
||||
"Updated Deal": "更新された取引",
|
||||
"Updated Deal Stage": "更新されたお得なステージ",
|
||||
"New Lead": "新しいリード",
|
||||
"New Organization": "新しい組織",
|
||||
"Updated Organization": "更新された組織",
|
||||
"Activity Matching Filter": "アクティビティ一致フィルタ",
|
||||
"Deal Matching Filter": "マッチングフィルタ",
|
||||
"Person Matching Filter": "人物マッチングフィルタ",
|
||||
"Organization Matching Filter": "組織一致フィルタ",
|
||||
"Triggers when a new person is created": "新しい人が作成されたときにトリガーします",
|
||||
"Triggers when a new deal is created.": "新しい取引が作成されたときにトリガーします。",
|
||||
"Triggers when a new activity is added": "新しいアクティビティが追加されたときにトリガーします",
|
||||
"Triggers when a new note is created.": "新しいノートが作成されたときにトリガーされます。",
|
||||
"Triggers when a person is updated.": "人が更新されたときにトリガーします.",
|
||||
"Triggers when a deal is updated.": "取引が更新されたときに発生する.",
|
||||
"Triggers when a deal's stage is updated.": "取引のステージが更新されたときに発生します。",
|
||||
"Triggers when a new lead is created.": "新しいリードが作成されたときにトリガーします。",
|
||||
"Triggers when a new organization is created.": "新しい組織が作成されたときにトリガーします。",
|
||||
"Triggers when an existing organization is updated.": "既存の組織が更新されたときにトリガーします。",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "アクティビティが初めてPipedriveフィルターに一致したときにトリガーされます。",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "新規取引がPipedriveフィルターに一致したときにトリガーされます。",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Pipedriveフィルタが新たに一致したときにトリガーします。",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "組織が初めてPipedriveフィルタに一致したときにトリガーします。",
|
||||
"Filter by": "フィルター",
|
||||
"Field Values": "フィールド値",
|
||||
"Field to watch for Changes On": "変更を確認するフィールド",
|
||||
"Stage in Pipeline": "パイプライン内のステージ",
|
||||
"Deal Status": "取引状況",
|
||||
"All(Not Deleted)": "すべて(削除されていません)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "Verkoop CRM en pipeline management software",
|
||||
"Add Follower": "Volger toevoegen",
|
||||
"Retrieve a Note": "Ophalen van een notitie",
|
||||
"Create Note": "Notitie aanmaken",
|
||||
"Add Labels to Person": "Labels aan persoon toevoegen",
|
||||
"Add Product to Deal": "Voeg product toe aan aanbieding",
|
||||
"Attach File": "Bestand toevoegen",
|
||||
"Create Activity": "Activiteit aanmaken",
|
||||
"Update Activity": "Activiteit bijwerken",
|
||||
"Create Deal": "Transactie aanmaken",
|
||||
"Update Deal": "Update Deal",
|
||||
"Create Lead": "Maak Lead",
|
||||
"Update Lead": "Lead bijwerken",
|
||||
"Create Organization": "Nieuwe organisatie aanmaken",
|
||||
"Update Organization": "Organisatie bijwerken",
|
||||
"Create Person": "Maak persoon aan",
|
||||
"Update Person": "Update Persoon",
|
||||
"Create Product": "Product aanmaken",
|
||||
"Update Product": "Update Product",
|
||||
"Find Deals Associated With Person": "Zoek aanbiedingen voor persoon",
|
||||
"Find Product": "Zoek product",
|
||||
"Find Products": "Producten zoeken",
|
||||
"Find Notes": "Notities zoeken",
|
||||
"Retrieve a Product": "Product ophalen",
|
||||
"Find Organization": "Zoek Organisatie",
|
||||
"Find Person": "Persoon zoeken",
|
||||
"Find Deal": "Zoek aanbieding",
|
||||
"Find Activity": "Zoek Activiteit",
|
||||
"Find User": "Gebruiker zoeken",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Adds a follower to a deal, person, organization or product.": "Voegt een volger toe aan een overeenkomst, persoon, organisatie of product.",
|
||||
"Finds a note by ID.": "Vindt een notitie per ID.",
|
||||
"Creates a new note.": "Maakt een nieuwe notitie.",
|
||||
"Adds existing labels to an existing person.": "Voegt bestaande labels toe aan een bestaande persoon.",
|
||||
"Adds a product to a deal.": "Voegt een product toe aan een deal.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Uploaden van een bestand en hecht aan een deal,persoon,organisatie, activiteit of product.",
|
||||
"Creates a new activity.": "Maakt een nieuwe activiteit.",
|
||||
"Updates an existing activity.": "Werkt een bestaande activiteit bij.",
|
||||
"Creates a new deal.": "Maakt een nieuwe deal aan.",
|
||||
"Updates an existing deal.": "Werkt een bestaande overeenkomst bij.",
|
||||
"Creates a new lead.": "Maakt een nieuwe lood.",
|
||||
"Updates an existing lead.": "Werkt een bestaande lead bij.",
|
||||
"Creates a new organization.": "Maakt een nieuwe organisatie aan.",
|
||||
"Updates an existing organization.": "Werkt een bestaande organisatie bij.",
|
||||
"Creates a new person.": "Maakt een nieuw persoon.",
|
||||
"Updates an existing person.": "Een bestaande persoon bijwerken.",
|
||||
"Creates a new product.": "Maakt een nieuw product aan.",
|
||||
"Finds multiple deals related to a specific person.": "Vindt meerdere deals gerelateerd aan een specifieke persoon.",
|
||||
"Finds a product by name ": "Gevonden product op naam ",
|
||||
"Finds a product or products by name or product code.": "Vindt een product of product op naam of product code.",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "Vind notities van Deal, Lead, Persoon of Organisatie ID.",
|
||||
"Finds a product by ID.": "Vindt een product via ID.",
|
||||
"Finds an organization.": "Vindt een organisatie.",
|
||||
"Finds a person.": "Vindt een persoon.",
|
||||
"Finds a deal by any field.": "Vindt een deal door elk veld.",
|
||||
"Finds an activity by subject.": "Vindt een activiteit per onderwerp.",
|
||||
"Finds a user by name or email.": "Vindt een gebruiker op naam of e-mail.",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"Follower": "Volger",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Doel Object ID",
|
||||
"Note ID": "Notitie ID",
|
||||
"Content": "Inhoud",
|
||||
"Deal ID": "Deal ID",
|
||||
"Pin note to deal?": "Notitie aan transactie vastleggen?",
|
||||
"Person ID": "Persoon ID",
|
||||
"Pin note to person?": "Notitie aan persoon vastmaken?",
|
||||
"Organization ID": "Organisatie ID",
|
||||
"Pin note to organization?": "Notitie aan organisatie vaststellen?",
|
||||
"Lead ID": "Lead ID",
|
||||
"Pin note to lead?": "Notitie om te leiden?",
|
||||
"Label": "Omschrijving",
|
||||
"Product ID": "Product ID",
|
||||
"Price": "Prijs",
|
||||
"Quantity": "Aantal",
|
||||
"Discount": "korting",
|
||||
"Discount Type": "Type korting",
|
||||
"Comments": "Opmerkingen",
|
||||
"Enable Product?": "Product inschakelen?",
|
||||
"Tax Method": "Belasting methode",
|
||||
"Tax Percentage": "BTW percentage",
|
||||
"File": "Bestand",
|
||||
"File Name": "File Name",
|
||||
"Activity ID": "Activiteit ID",
|
||||
"Subject": "Onderwerp",
|
||||
"Assign To": "Toewijzen aan",
|
||||
"Activity Type": "Type activiteit",
|
||||
"Due Date": "Inleverdatum",
|
||||
"Due Time": "Achterstallige tijd",
|
||||
"Duration": "Tijdsduur",
|
||||
"Mark as Done?": "Markeren als voltooid?",
|
||||
"Free or Busy": "Gratis of bezet",
|
||||
"Note": "Notitie",
|
||||
"Public Description": "Openbare beschrijving",
|
||||
"Title": "Aanspreektitel",
|
||||
"Creation Time": "Aanmaak tijd",
|
||||
"Status": "status",
|
||||
"Stage": "Speelveld",
|
||||
"Pipeline": "Pijplijn",
|
||||
"Owner": "Eigenaar",
|
||||
"Probability": "Waarschijnlijkheid",
|
||||
"Expected Close Date": "Verwachte afsluitdatum",
|
||||
"Value": "Waarde",
|
||||
"Currency": "valuta",
|
||||
"Visible To": "Zichtbaar voor",
|
||||
"Custom Fields": "Aangepaste velden",
|
||||
"Channel": "Kanaal",
|
||||
"Lead Value Amount": "Lead waarde bedrag",
|
||||
"Lead Value Currency": "Lead waarde valuta",
|
||||
"Name": "Naam",
|
||||
"Address": "Adres:",
|
||||
"Email": "E-mail",
|
||||
"Phone": "Telefoonnummer",
|
||||
"First Name": "Voornaam",
|
||||
"Last Name": "Achternaam",
|
||||
"Marketing Status": "Marketing Status",
|
||||
"Code": "Code",
|
||||
"Description": "Beschrijving",
|
||||
"Unit": "Eenheid",
|
||||
"Tax percentage": "BTW percentage",
|
||||
"Is Active ?": "Is actief ?",
|
||||
"Cost": "Kosten",
|
||||
"Overhead Cost": "Overschrijding kosten",
|
||||
"Search Term": "Zoek term",
|
||||
"Field to search by": "Veld om te zoeken op",
|
||||
"Field Value": "Veld waarde",
|
||||
"Search By": "Zoeken op",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Exacte overeenkomst",
|
||||
"Filter": "Filteren",
|
||||
"Method": "Methode",
|
||||
"Headers": "Kopteksten",
|
||||
"Query Parameters": "Query parameters",
|
||||
"Body": "Lichaam",
|
||||
"Response is Binary ?": "Antwoord is binair?",
|
||||
"No Error on Failure": "Geen fout bij fout",
|
||||
"Timeout (in seconds)": "Time-out (in seconden)",
|
||||
"Type of object to add the follower to.": "Type object waar de volger aan toe te voegen.",
|
||||
"ID of the object to add the follower to.": "ID van het object om de volger aan toe te voegen.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "U kunt \"Zoek Deal action gebruiken\" om transactie-ID op te halen.",
|
||||
"You can use Find Person action to retrieve person ID.": "U kunt \"Zoek Persoon Actie\" gebruiken om het persoon ID op te halen.",
|
||||
"You can use Find Organization action to retrieve org ID.": "U kunt \"Vind Organisatie Actie\" gebruiken om het org ID op te halen.",
|
||||
"You can use Find Product action to retrieve product ID.": "U kunt \"Zoek product-actie\" gebruiken om product-ID op te halen.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Voer de datum in JJJJ-MM-DD formaat in.",
|
||||
"Please enter time in HH:MM format.": "Voer de tijd in HH:MM formaat in.",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "Voer tijd in in HH:MM-formaat (bijv. \"01:30\" gedurende 1 uur 30 minuten).",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "Als hierboven een fase is gekozen, wordt het pipeline veld genegeerd.",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "Voer een valutacode in (bijv. \"USD\", \"EUR\").",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "De valuta van de lead waarde (bijv. \"USD\", \"EUR\").",
|
||||
"Marketing opt-in status": "Marketing opt-in status",
|
||||
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
|
||||
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
|
||||
"Deal": "Koopjes",
|
||||
"Person": "Persoon",
|
||||
"Organization": "Rekening",
|
||||
"Product": "product",
|
||||
"Percentage": "Percentage",
|
||||
"Amount": "Hoeveelheid",
|
||||
"Exclusive": "Exclusief",
|
||||
"Inclusive": "Inclusief",
|
||||
"None": "geen",
|
||||
"Free": "Vrij",
|
||||
"Busy": "Bezig",
|
||||
"Open": "Open",
|
||||
"Won": "Gewonnen",
|
||||
"Lost": "Verloren",
|
||||
"Deleted": "Verwijderd",
|
||||
"Owner & followers": "Eigenaar & volgers",
|
||||
"Entire company": "Hele bedrijf",
|
||||
"No Consent": "Geen toestemming",
|
||||
"Unsubscribed": "Uitgeschreven",
|
||||
"Subscribed": "Ingeschreven",
|
||||
"Archived": "Gearchiveerd",
|
||||
"Product Code": "Product Code",
|
||||
"Lead": "Lood",
|
||||
"Done": "Voltooid",
|
||||
"Not Done": "Niet klaar",
|
||||
"GET": "KRIJG",
|
||||
"POST": "POSTE",
|
||||
"PATCH": "BEKIJK",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "VERWIJDEREN",
|
||||
"HEAD": "HOOFD",
|
||||
"New Person": "Nieuw persoon",
|
||||
"New Deal": "Nieuwe deal",
|
||||
"New Activity": "Nieuwe activiteit",
|
||||
"New Note": "Nieuwe notitie",
|
||||
"Updated Person": "Persoon bijgewerkt",
|
||||
"Updated Deal": "Bijgewerkt Deal",
|
||||
"Updated Deal Stage": "Bijgewerkt Deal Fase",
|
||||
"New Lead": "Nieuwe Lead",
|
||||
"New Organization": "Nieuwe organisatie",
|
||||
"Updated Organization": "Organisatie bijgewerkt",
|
||||
"Activity Matching Filter": "Activiteit overeenkomende filter",
|
||||
"Deal Matching Filter": "Pakket overeenkomende filter",
|
||||
"Person Matching Filter": "Persoon overeenstemmende filter",
|
||||
"Organization Matching Filter": "Organisatie overeenstemmende filter",
|
||||
"Triggers when a new person is created": "Triggert wanneer een nieuwe persoon wordt aangemaakt",
|
||||
"Triggers when a new deal is created.": "Triggert wanneer een nieuwe transactie wordt aangemaakt.",
|
||||
"Triggers when a new activity is added": "Triggert wanneer een nieuwe activiteit wordt toegevoegd",
|
||||
"Triggers when a new note is created.": "Triggert wanneer een nieuwe notitie wordt aangemaakt.",
|
||||
"Triggers when a person is updated.": "Triggert wanneer een persoon wordt bijgewerkt.",
|
||||
"Triggers when a deal is updated.": "Triggert wanneer een transactie wordt bijgewerkt.",
|
||||
"Triggers when a deal's stage is updated.": "Triggert wanneer het podium van een transactie wordt bijgewerkt.",
|
||||
"Triggers when a new lead is created.": "Triggert wanneer een nieuwe lead wordt gemaakt.",
|
||||
"Triggers when a new organization is created.": "Triggert wanneer een nieuwe organisatie wordt aangemaakt.",
|
||||
"Triggers when an existing organization is updated.": "Triggert wanneer een bestaande organisatie wordt bijgewerkt.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Dubbel wanneer een activiteit nieuw overeenkomt met een Pipedrive filter voor de eerste keer.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Dubbel wanneer een transactie voor de eerste keer overeenkomt met een Pipedrive filter.",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Triggert wanneer een persoon voor de eerste keer overeenkomt met een Pipedrive filter.",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "Triggert wanneer een organisatie voor de eerste keer overeenkomt met een Pipedrive filter.",
|
||||
"Filter by": "Filteren op",
|
||||
"Field Values": "Veld Waarden",
|
||||
"Field to watch for Changes On": "Veld om wijzigingen te bekijken",
|
||||
"Stage in Pipeline": "Fase in pijplijn",
|
||||
"Deal Status": "Deal Status",
|
||||
"All(Not Deleted)": "Allen (niet verwijderd)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "CRM de vendas e software de gerenciamento de pipeline",
|
||||
"Add Follower": "Adicionar seguidor",
|
||||
"Retrieve a Note": "Recuperar uma Nota",
|
||||
"Create Note": "Criar Nota",
|
||||
"Add Labels to Person": "Adicionar Rótulos à Pessoa",
|
||||
"Add Product to Deal": "Adicionar Produto à Oferta",
|
||||
"Attach File": "Anexar arquivo",
|
||||
"Create Activity": "Criar Atividade",
|
||||
"Update Activity": "Atualizar atividade",
|
||||
"Create Deal": "Criar oferta",
|
||||
"Update Deal": "Atualizar Oferta",
|
||||
"Create Lead": "Criar Potencial",
|
||||
"Update Lead": "Atualizar Lead",
|
||||
"Create Organization": "Criar Organização",
|
||||
"Update Organization": "Atualizar Organização",
|
||||
"Create Person": "Criar Pessoa",
|
||||
"Update Person": "Atualizar pessoa",
|
||||
"Create Product": "Criar Produto",
|
||||
"Update Product": "Atualização do produto",
|
||||
"Find Deals Associated With Person": "Encontrar ofertas associadas com pessoas",
|
||||
"Find Product": "Encontrar produto",
|
||||
"Find Products": "Encontrar produtos",
|
||||
"Find Notes": "Encontrar Notas",
|
||||
"Retrieve a Product": "Recuperar um produto",
|
||||
"Find Organization": "Encontrar Organização",
|
||||
"Find Person": "Encontrar pessoa",
|
||||
"Find Deal": "Encontrar oferta",
|
||||
"Find Activity": "Encontrar atividade",
|
||||
"Find User": "Localizar usuário",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Adds a follower to a deal, person, organization or product.": "Adiciona um seguidor ao negócio, pessoa, organização ou produto.",
|
||||
"Finds a note by ID.": "Encontra uma nota por ID.",
|
||||
"Creates a new note.": "Cria uma nova nota.",
|
||||
"Adds existing labels to an existing person.": "Adiciona marcadores existentes a uma pessoa existente.",
|
||||
"Adds a product to a deal.": "Adiciona um produto a um negócio.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Carrega um arquivo e o anexa a uma oferta, pessoa, organização, atividade ou produto.",
|
||||
"Creates a new activity.": "Cria uma nova atividade.",
|
||||
"Updates an existing activity.": "Atualiza uma atividade existente.",
|
||||
"Creates a new deal.": "Cria um novo negócio.",
|
||||
"Updates an existing deal.": "Atualiza um acordo existente.",
|
||||
"Creates a new lead.": "Cria um novo lead.",
|
||||
"Updates an existing lead.": "Atualiza um lead existente.",
|
||||
"Creates a new organization.": "Cria uma nova organização.",
|
||||
"Updates an existing organization.": "Atualiza uma organização existente.",
|
||||
"Creates a new person.": "Cria uma nova pessoa.",
|
||||
"Updates an existing person.": "Atualiza uma pessoa existente.",
|
||||
"Creates a new product.": "Cria um novo produto.",
|
||||
"Finds multiple deals related to a specific person.": "Encontra várias ofertas relacionadas a uma pessoa específica.",
|
||||
"Finds a product by name ": "Localiza um produto por nome ",
|
||||
"Finds a product or products by name or product code.": "Encontra um produto ou produto por nome ou código do produto.",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "Encontrar notas por Oferta, Potencial, Pessoa ou ID da Organização.",
|
||||
"Finds a product by ID.": "Encontra um produto por ID.",
|
||||
"Finds an organization.": "Encontra uma organização.",
|
||||
"Finds a person.": "Encontra uma pessoa.",
|
||||
"Finds a deal by any field.": "Encontrar uma oferta por qualquer campo.",
|
||||
"Finds an activity by subject.": "Encontra uma atividade por assunto.",
|
||||
"Finds a user by name or email.": "Localiza um usuário por nome ou e-mail.",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"Follower": "Seguidor",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "ID de Objeto Alvo",
|
||||
"Note ID": "ID da nota",
|
||||
"Content": "Conteúdo",
|
||||
"Deal ID": "ID da oferta",
|
||||
"Pin note to deal?": "Fixar nota a negócio?",
|
||||
"Person ID": "ID da pessoa",
|
||||
"Pin note to person?": "Fixar nota na pessoa?",
|
||||
"Organization ID": "ID da organização",
|
||||
"Pin note to organization?": "Fixar anotação na organização?",
|
||||
"Lead ID": "ID do lead",
|
||||
"Pin note to lead?": "Fixar nota para liderar?",
|
||||
"Label": "Descrição",
|
||||
"Product ID": "ID do Produto",
|
||||
"Price": "Quantidade",
|
||||
"Quantity": "Quantidade",
|
||||
"Discount": "desconto",
|
||||
"Discount Type": "Tipo de desconto",
|
||||
"Comments": "comentários",
|
||||
"Enable Product?": "Habilitar produto?",
|
||||
"Tax Method": "Método de Imposto",
|
||||
"Tax Percentage": "Porcentagem do Imposto",
|
||||
"File": "Arquivo",
|
||||
"File Name": "Nome do arquivo",
|
||||
"Activity ID": "ID da Atividade",
|
||||
"Subject": "Cargo",
|
||||
"Assign To": "Atribuir a",
|
||||
"Activity Type": "Tipo de Atividade",
|
||||
"Due Date": "Data de vencimento",
|
||||
"Due Time": "Hora-Limite",
|
||||
"Duration": "Duração",
|
||||
"Mark as Done?": "Marcar como concluído?",
|
||||
"Free or Busy": "Gratuito ou Ocupado",
|
||||
"Note": "Observação",
|
||||
"Public Description": "Descrição pública",
|
||||
"Title": "Título",
|
||||
"Creation Time": "Hora da Criação",
|
||||
"Status": "Estado",
|
||||
"Stage": "Etapa",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Proprietário",
|
||||
"Probability": "Probabilidade",
|
||||
"Expected Close Date": "Data de fechamento esperada",
|
||||
"Value": "Valor",
|
||||
"Currency": "moeda",
|
||||
"Visible To": "Visível para",
|
||||
"Custom Fields": "Campos Personalizados",
|
||||
"Channel": "Canal",
|
||||
"Lead Value Amount": "Valor do Lead",
|
||||
"Lead Value Currency": "Moeda do Lead",
|
||||
"Name": "Nome",
|
||||
"Address": "Endereço",
|
||||
"Email": "e-mail",
|
||||
"Phone": "Smartphone",
|
||||
"First Name": "Nome",
|
||||
"Last Name": "Sobrenome",
|
||||
"Marketing Status": "Status do marketing",
|
||||
"Code": "Código",
|
||||
"Description": "Descrição",
|
||||
"Unit": "Unidade",
|
||||
"Tax percentage": "Porcentagem de imposto",
|
||||
"Is Active ?": "Está ativo ?",
|
||||
"Cost": "Custo",
|
||||
"Overhead Cost": "Custo de Sobrecarga",
|
||||
"Search Term": "Termo para pesquisa",
|
||||
"Field to search by": "Campo para pesquisar por",
|
||||
"Field Value": "Valor do Campo",
|
||||
"Search By": "Pesquisar por",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Partida exata",
|
||||
"Filter": "filtro",
|
||||
"Method": "Método",
|
||||
"Headers": "Cabeçalhos",
|
||||
"Query Parameters": "Parâmetros da consulta",
|
||||
"Body": "Conteúdo",
|
||||
"Response is Binary ?": "A resposta é binária ?",
|
||||
"No Error on Failure": "Nenhum erro no Failure",
|
||||
"Timeout (in seconds)": "Tempo limite (em segundos)",
|
||||
"Type of object to add the follower to.": "Tipo de objeto ao qual adicionar o seguidor.",
|
||||
"ID of the object to add the follower to.": "ID do objeto ao qual adicionar o seguidor.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "Você pode usar a ação de Encontrar Oferta para recuperar o ID da oferta.",
|
||||
"You can use Find Person action to retrieve person ID.": "Você pode usar a ação Encontrar Pessoa para recuperar a ID da pessoa.",
|
||||
"You can use Find Organization action to retrieve org ID.": "Você pode usar a ação de Encontrar Organização para recuperar o ID do org.",
|
||||
"You can use Find Product action to retrieve product ID.": "Você pode usar a ação 'Encontrar produto' para recuperar o ID do produto.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Por favor, digite a data no formato AAAA-MM-DD.",
|
||||
"Please enter time in HH:MM format.": "Por favor, digite a hora no formato HH:MM.",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "Por favor, digite o tempo no formato HH:MM (por exemplo, \"01:30\" para 1 hora 30 minutos).",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "Se for escolhida uma etapa acima, o campo de pipeline será ignorado.",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "Por favor, insira o código da moeda (ex.: \"USD\", \"EUR\").",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "A moeda do valor do lead (por exemplo, \"USD\", \"EUR\").",
|
||||
"Marketing opt-in status": "Status do opt-in para marketing",
|
||||
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
|
||||
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
|
||||
"Deal": "Negócio",
|
||||
"Person": "Pessoa",
|
||||
"Organization": "Cliente",
|
||||
"Product": "Produto:",
|
||||
"Percentage": "Porcentagem",
|
||||
"Amount": "Quantidade",
|
||||
"Exclusive": "Exclusivo",
|
||||
"Inclusive": "Inclusivo",
|
||||
"None": "Nenhuma",
|
||||
"Free": "Gratuito",
|
||||
"Busy": "Ocupado",
|
||||
"Open": "Abertas",
|
||||
"Won": "Ganhou",
|
||||
"Lost": "Perdido",
|
||||
"Deleted": "Excluído",
|
||||
"Owner & followers": "Proprietário e seguidores",
|
||||
"Entire company": "Toda a empresa",
|
||||
"No Consent": "Sem Consentimento",
|
||||
"Unsubscribed": "Cancelada",
|
||||
"Subscribed": "Subscrito",
|
||||
"Archived": "Arquivado",
|
||||
"Product Code": "Código Produto",
|
||||
"Lead": "Conduzir",
|
||||
"Done": "Concluído",
|
||||
"Not Done": "Não Concluído",
|
||||
"GET": "OBTER",
|
||||
"POST": "POSTAR",
|
||||
"PATCH": "COMPRAR",
|
||||
"PUT": "COLOCAR",
|
||||
"DELETE": "EXCLUIR",
|
||||
"HEAD": "CABEÇA",
|
||||
"New Person": "Nova Pessoa",
|
||||
"New Deal": "Nova Oferta",
|
||||
"New Activity": "Nova atividade",
|
||||
"New Note": "Nova anotação",
|
||||
"Updated Person": "Pessoa atualizada",
|
||||
"Updated Deal": "Oferta atualizada",
|
||||
"Updated Deal Stage": "Estágio de negócio atualizado",
|
||||
"New Lead": "Novo Potencial",
|
||||
"New Organization": "Nova organização",
|
||||
"Updated Organization": "Organização atualizada",
|
||||
"Activity Matching Filter": "Filtro de atividade correspondente",
|
||||
"Deal Matching Filter": "Filtro de negócio correspondente",
|
||||
"Person Matching Filter": "Filtro de pessoa correspondente",
|
||||
"Organization Matching Filter": "Filtro de Organização Associado",
|
||||
"Triggers when a new person is created": "Dispara quando uma nova pessoa é criada",
|
||||
"Triggers when a new deal is created.": "Aciona quando uma nova oferta é criada.",
|
||||
"Triggers when a new activity is added": "Aciona quando uma nova atividade é adicionada",
|
||||
"Triggers when a new note is created.": "Aciona quando uma nova nota é criada.",
|
||||
"Triggers when a person is updated.": "Dispara quando uma pessoa é atualizada.",
|
||||
"Triggers when a deal is updated.": "Dispara quando uma operação é atualizada.",
|
||||
"Triggers when a deal's stage is updated.": "Dispara quando o estágio de uma oferta é atualizado.",
|
||||
"Triggers when a new lead is created.": "Dispara quando um novo lead é criado.",
|
||||
"Triggers when a new organization is created.": "Dispara quando uma nova organização é criada.",
|
||||
"Triggers when an existing organization is updated.": "Dispara quando uma organização existente é atualizada.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Aciona quando uma atividade corresponde a um filtro Pipedrive pela primeira vez.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Aciona quando uma operação se encaixa num filtro Pipedrive pela primeira vez.",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Dispara quando uma pessoa recém-casar com um filtro Pipedrive pela primeira vez.",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "Aciona quando uma organização recém-encontrada num filtro Pipedrive pela primeira vez.",
|
||||
"Filter by": "Filtrar por",
|
||||
"Field Values": "Valores do campo",
|
||||
"Field to watch for Changes On": "Campo para monitorar as alterações ativadas",
|
||||
"Stage in Pipeline": "Fase no Pipeline",
|
||||
"Deal Status": "Status da oferta",
|
||||
"All(Not Deleted)": "Todos(não excluídos)"
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"Pipedrive": "Пипедрив",
|
||||
"Sales CRM and pipeline management software": "CRM продаж и управление трубопроводами",
|
||||
"Add Follower": "Добавить подписку",
|
||||
"Retrieve a Note": "Получить заметку",
|
||||
"Create Note": "Создать заметку",
|
||||
"Add Labels to Person": "Добавить ярлыки к человеку",
|
||||
"Add Product to Deal": "Добавить товар в сделку",
|
||||
"Attach File": "Прикрепить файл",
|
||||
"Create Activity": "Создать активность",
|
||||
"Update Activity": "Обновить активность",
|
||||
"Create Deal": "Создать сделку",
|
||||
"Update Deal": "Обновить сделку",
|
||||
"Create Lead": "Создать предв. контакт",
|
||||
"Update Lead": "Обновить предв. контакт",
|
||||
"Create Organization": "Создать организацию",
|
||||
"Update Organization": "Обновить организацию",
|
||||
"Create Person": "Создать человека",
|
||||
"Update Person": "Обновить лицо",
|
||||
"Create Product": "Создать продукт",
|
||||
"Update Product": "Обновление продукта",
|
||||
"Find Deals Associated With Person": "Найти сделки, связанные с человеком",
|
||||
"Find Product": "Найти продукт",
|
||||
"Find Products": "Найти товары",
|
||||
"Find Notes": "Найти заметки",
|
||||
"Retrieve a Product": "Получить товар",
|
||||
"Find Organization": "Найти организацию",
|
||||
"Find Person": "Найти человека",
|
||||
"Find Deal": "Найти сделку",
|
||||
"Find Activity": "Найти активность",
|
||||
"Find User": "Найти пользователя",
|
||||
"Custom API Call": "Пользовательский вызов API",
|
||||
"Adds a follower to a deal, person, organization or product.": "Добавляет последователя к сделке, лицу, организации или продукту.",
|
||||
" Finds a note by ID.": " Ищет заметку по ID.",
|
||||
"Creates a new note.": "Создает новую заметку.",
|
||||
"Adds an existing labels to an existing person.": "Добавляет существующие подписи к существующему человеку.",
|
||||
"Adds a product to a deal.": "Добавляет товар к сделке.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Загружает файл и прикрепляет его к сделке, лицу, организации, деятельности или продукту.",
|
||||
"Creates a new activity.": "Создает новое действие.",
|
||||
"Updates an existing activity.": "Обновляет существующую активность.",
|
||||
"Creates a new deal.": "Создает новую сделку.",
|
||||
"Updates an existing deal.": "Обновляет существующую сделку.",
|
||||
"Creates a new lead.": "Создает нового лидера.",
|
||||
"Updates an existing lead.": "Обновляет уже ведущего.",
|
||||
"Creates a new organization.": "Создает новую организацию.",
|
||||
"Updates an existing organization.": "Обновляет существующую организацию.",
|
||||
"Creates a new person.": "Создает нового человека.",
|
||||
"Updates an existing person.": "Обновляет существующего человека.",
|
||||
"Creates a new product.": "Создает новый товар.",
|
||||
"Finds multiple deals related to a specific person.": "Находит несколько сделок, связанных с конкретным человеком.",
|
||||
"Find a product by name.": "Найдите товар по имени.",
|
||||
"Finds a product or products by name or product code.": "Поиск товара или товара по названию или коду товара.",
|
||||
"Finds notes by Deal,Lead,Person, or Organization ID.": "Поиск заметок по Deal,Lead,Person, ID организации.",
|
||||
" Finds a product by ID.": " Поиск товара по ID.",
|
||||
"Finds an organization.": "Находит организацию.",
|
||||
"Finds a person.": "Находит человека.",
|
||||
"Finds a deal by any field.": "Находит сделку по любому полю.",
|
||||
"Finds an activity by subject.": "Находит активность по теме.",
|
||||
"Find a user by name or email.": "Найти пользователя по имени или электронной почте.",
|
||||
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
|
||||
"Follower": "Фольклор",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "ID целевого объекта",
|
||||
"Note ID": "ID заметки",
|
||||
"Content": "Содержание",
|
||||
"Deal ID": "ID сделки",
|
||||
"Pin note to deal?": "Закрепить сделку?",
|
||||
"Person ID": "ID человека",
|
||||
"Pin note to person?": "Закрепить заметку к человеку?",
|
||||
"Organization ID": "ID Организации",
|
||||
"Pin note to organization?": "Закрепить к организации?",
|
||||
"Lead ID": "ID контакта",
|
||||
"Pin note to lead?": "Закрепить записку для свинца?",
|
||||
"Label": "Метка",
|
||||
"Product ID": "ID товара",
|
||||
"Price": "Цена",
|
||||
"Quantity": "Количество",
|
||||
"Discount": "Скидка",
|
||||
"Discount Type": "Тип скидки",
|
||||
"Comments": "Комментарии",
|
||||
"Enable Product?": "Включить продукт?",
|
||||
"Tax Method": "Способ налога",
|
||||
"Tax Percentage": "Процент налога",
|
||||
"File": "Файл",
|
||||
"File Name": "Имя файла",
|
||||
"Activity ID": "ID действия",
|
||||
"Subject": "Тема",
|
||||
"Assign To": "Назначить",
|
||||
"Activity Type": "Тип деятельности",
|
||||
"Due Date": "Срок сдачи",
|
||||
"Due Time": "Время выполнения",
|
||||
"Duration": "Duration",
|
||||
"Mark as Done?": "Пометить как Готово?",
|
||||
"Free or Busy": "Бесплатно или занято",
|
||||
"Note": "Примечание",
|
||||
"Public Description": "Публичное описание",
|
||||
"Activity": "Активность",
|
||||
"Title": "Заголовок",
|
||||
"Creation Time": "Время создания",
|
||||
"Status": "Статус",
|
||||
"Stage": "Этап",
|
||||
"Pipeline": "Трубопровод",
|
||||
"Owner": "Владелец",
|
||||
"Probability": "Вероятность",
|
||||
"Expected Close Date": "Ожидаемая дата закрытия",
|
||||
"Value": "Значение",
|
||||
"Currency": "Валюта",
|
||||
"Visible To": "Видимый для",
|
||||
"Custom Fields": "Пользовательские поля",
|
||||
"Channel": "Канал",
|
||||
"Lead Value": "Ведущее значение",
|
||||
"Lead Value Currency": "Валюта Ведущего значения",
|
||||
"Name": "Наименование",
|
||||
"Address": "Адрес",
|
||||
"Email": "Почта",
|
||||
"Phone": "Телефон",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Фамилия",
|
||||
"Marketing Status": "Статус маркетинга",
|
||||
"Code": "Code",
|
||||
"Description": "Описание",
|
||||
"Unit": "Единица измерения",
|
||||
"Tax percentage": "Процент налога",
|
||||
"Is Active ?": "Активный?",
|
||||
"Cost": "Затраты",
|
||||
"Overhead Cost": "Стоимость накладных",
|
||||
"Search Term": "Поиск термина",
|
||||
"Field to search by": "Поле для поиска по",
|
||||
"Field Value": "Значение поля",
|
||||
"Search By": "Поиск по",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Точное совпадение",
|
||||
"Filter": "Фильтр",
|
||||
"Method": "Метод",
|
||||
"Headers": "Заголовки",
|
||||
"Query Parameters": "Параметры запроса",
|
||||
"Body": "Тело",
|
||||
"No Error on Failure": "Нет ошибок при ошибке",
|
||||
"Timeout (in seconds)": "Таймаут (в секундах)",
|
||||
"Type of object to add the follower to.": "Тип объекта, к которому будет добавлен подписчик.",
|
||||
"ID of the object to add the follower to.": "ID объекта, к которому будет добавлен подписчик.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "Вы можете использовать функцию Найти сделку для получения идентификатора сделки.",
|
||||
"You can use Find Person action to retrieve person ID.": "Вы можете использовать действие Find Person для получения идентификатора пользователя.",
|
||||
"You can use Find Organization action to retrieve org ID.": "Вы можете использовать действие Find Organization для получения идентификатора организации.",
|
||||
"You can use Find Product action to retrieve product ID.": "Вы можете использовать действие \"Найти товар\" для получения ID товара.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Введите дату в формате YYYY-MM-DD.",
|
||||
"Please enter time in HH:MM format.": "Пожалуйста, введите время в формате HH:MM.",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "Если выше выбран этап, поле конвейера будет проигнорировано.",
|
||||
"Please enter currency code.": "Пожалуйста, введите код валюты.",
|
||||
"Marketing opt-in status": "Статус участника маркетинга",
|
||||
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
|
||||
"Deal": "Сделка",
|
||||
"Person": "Лицо",
|
||||
"Organization": "Организация",
|
||||
"Product": "Товар",
|
||||
"Percentage": "Процент",
|
||||
"Amount": "Сумма",
|
||||
"Exclusive": "Эксклюзивный",
|
||||
"Inclusive": "Включающий",
|
||||
"None": "Нет",
|
||||
"Free": "Бесплатно",
|
||||
"Busy": "Занят",
|
||||
"Open": "Открыть",
|
||||
"Won": "Выиграно",
|
||||
"Lost": "Потеря",
|
||||
"Deleted": "Удалено",
|
||||
"Item Owner": "Владелец предмета",
|
||||
"All Users": "Все пользователи",
|
||||
"No Consent": "Нет согласия",
|
||||
"Unsubscribed": "Отписано",
|
||||
"Subscribed": "Подписан",
|
||||
"Archived": "Архивировано",
|
||||
"Product Code": "Код товара",
|
||||
"Lead": "Предв. контакт",
|
||||
"Done": "Done",
|
||||
"Not Done": "Не выполнено",
|
||||
"GET": "ПОЛУЧИТЬ",
|
||||
"POST": "ПОСТ",
|
||||
"PATCH": "ПАТЧ",
|
||||
"PUT": "ПОКУПИТЬ",
|
||||
"DELETE": "УДАЛИТЬ",
|
||||
"HEAD": "HEAD",
|
||||
"New Person": "Новое лицо",
|
||||
"New Deal": "Новая сделка",
|
||||
"New Activity": "Новая активность",
|
||||
"New Note": "Новая заметка",
|
||||
"Updated Person": "Обновлен",
|
||||
"Updated Deal": "Обновлена сделка",
|
||||
"Updated Deal Stage": "Обновлена стадия сделок",
|
||||
"New Lead": "Новый предв. контакт",
|
||||
"New Organization": "Новая организация",
|
||||
"Updated Organization": "Организация обновлена",
|
||||
"Activity Matching Filter": "Фильтр сопоставления действий",
|
||||
"Deal Matching Filter": "Фильтр сопоставления сделок",
|
||||
"Person Matching Filter": "Фильтр сопоставления людей",
|
||||
"Organization Matching Filter": "Фильтр сопоставления организаций",
|
||||
"Triggers when a new person is created": "Срабатывает при создании нового человека",
|
||||
"Triggers when a new deal is created.": "Триггеры при создании новой сделки.",
|
||||
"Triggers when a new activity is added": "Триггеры при добавлении новой активности",
|
||||
"Triggers when a new note is created.": "Триггеры при создании новой заметки.",
|
||||
"Triggers when a person is updated": "Включает при обновлении пользователя",
|
||||
"Triggers when a deal is updated": "Триггеры при обновлении сделки",
|
||||
"Triggers when a deal's stage is updated.": "Триггеры при обновлении сцены сделки.",
|
||||
"Triggers when a new lead is created.": "Триггеры при создании нового свинца.",
|
||||
"Triggers when a new organization is created.": "Триггеры при создании новой организации.",
|
||||
"Triggers when an existing organization is updated.": "Триггеры при обновлении существующей организации.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Запускает активность в первый раз совпадает с Pipedrive.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Вызывает срабатывание, когда новая сделка совпадает с Pipedrive фильтром впервые.",
|
||||
"Trigges when a person newly matches a Pipedrive filter for the first time.": "Срабатывает, когда человек впервые совпадает с Pipedrive фильтром.",
|
||||
"Trigges when an organization newly matches a Pipedrive filter for the first time.": "Срабатывает, когда организация впервые совпадает с Pipedrive фильтром.",
|
||||
"Filter by": "Фильтровать по",
|
||||
"Field Values": "Значения полей",
|
||||
"Field to watch for Changes On": "Поле для просмотра изменений вкл",
|
||||
"Stage in Pipeline": "Этап в конвейере",
|
||||
"Deal Status": "Статус сделки",
|
||||
"All(Not Deleted)": "Все(Не удалено)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "Sales CRM and pipeline management software",
|
||||
"Add Follower": "Add Follower",
|
||||
"Retrieve a Note": "Retrieve a Note",
|
||||
"Create Note": "Create Note",
|
||||
"Add Labels to Person": "Add Labels to Person",
|
||||
"Add Product to Deal": "Add Product to Deal",
|
||||
"Attach File": "Attach File",
|
||||
"Create Activity": "Create Activity",
|
||||
"Update Activity": "Update Activity",
|
||||
"Create Deal": "Create Deal",
|
||||
"Update Deal": "Update Deal",
|
||||
"Create Lead": "Create Lead",
|
||||
"Update Lead": "Update Lead",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create Person": "Create Person",
|
||||
"Update Person": "Update Person",
|
||||
"Create Product": "Create Product",
|
||||
"Update Product": "Update Product",
|
||||
"Find Deals Associated With Person": "Find Deals Associated With Person",
|
||||
"Find Product": "Find Product",
|
||||
"Find Products": "Find Products",
|
||||
"Find Notes": "Find Notes",
|
||||
"Retrieve a Product": "Retrieve a Product",
|
||||
"Find Organization": "Find Organization",
|
||||
"Find Person": "Find Person",
|
||||
"Find Deal": "Find Deal",
|
||||
"Find Activity": "Find Activity",
|
||||
"Find User": "Find User",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Adds a follower to a deal, person, organization or product.": "Adds a follower to a deal, person, organization or product.",
|
||||
"Finds a note by ID.": "Finds a note by ID.",
|
||||
"Creates a new note.": "Creates a new note.",
|
||||
"Adds existing labels to an existing person.": "Adds existing labels to an existing person.",
|
||||
"Adds a product to a deal.": "Adds a product to a deal.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Uploads a file and attaches it to a deal,person,organization,activity or product.",
|
||||
"Creates a new activity.": "Creates a new activity.",
|
||||
"Updates an existing activity.": "Updates an existing activity.",
|
||||
"Creates a new deal.": "Creates a new deal.",
|
||||
"Updates an existing deal.": "Updates an existing deal.",
|
||||
"Creates a new lead.": "Creates a new lead.",
|
||||
"Updates an existing lead.": "Updates an existing lead.",
|
||||
"Creates a new organization.": "Creates a new organization.",
|
||||
"Updates an existing organization.": "Updates an existing organization.",
|
||||
"Creates a new person.": "Creates a new person.",
|
||||
"Updates an existing person.": "Updates an existing person.",
|
||||
"Creates a new product.": "Creates a new product.",
|
||||
"Finds multiple deals related to a specific person.": "Finds multiple deals related to a specific person.",
|
||||
"Finds a product by name ": "Finds a product by name ",
|
||||
"Finds a product or products by name or product code.": "Finds a product or products by name or product code.",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "Finds notes by Deal, Lead, Person, or Organization ID.",
|
||||
"Finds a product by ID.": "Finds a product by ID.",
|
||||
"Finds an organization.": "Finds an organization.",
|
||||
"Finds a person.": "Finds a person.",
|
||||
"Finds a deal by any field.": "Finds a deal by any field.",
|
||||
"Finds an activity by subject.": "Finds an activity by subject.",
|
||||
"Finds a user by name or email.": "Finds a user by name or email.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Follower": "Follower",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Target Object ID",
|
||||
"Note ID": "Note ID",
|
||||
"Content": "Content",
|
||||
"Deal ID": "Deal ID",
|
||||
"Pin note to deal?": "Pin note to deal?",
|
||||
"Person ID": "Person ID",
|
||||
"Pin note to person?": "Pin note to person?",
|
||||
"Organization ID": "Organization ID",
|
||||
"Pin note to organization?": "Pin note to organization?",
|
||||
"Lead ID": "Lead ID",
|
||||
"Pin note to lead?": "Pin note to lead?",
|
||||
"Label": "Label",
|
||||
"Product ID": "Product ID",
|
||||
"Price": "Price",
|
||||
"Quantity": "Quantity",
|
||||
"Discount": "Discount",
|
||||
"Discount Type": "Discount Type",
|
||||
"Comments": "Comments",
|
||||
"Enable Product?": "Enable Product?",
|
||||
"Tax Method": "Tax Method",
|
||||
"Tax Percentage": "Tax Percentage",
|
||||
"File": "File",
|
||||
"File Name": "File Name",
|
||||
"Activity ID": "Activity ID",
|
||||
"Subject": "Subject",
|
||||
"Assign To": "Assign To",
|
||||
"Activity Type": "Activity Type",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Duration": "Duration",
|
||||
"Mark as Done?": "Mark as Done?",
|
||||
"Free or Busy": "Free or Busy",
|
||||
"Note": "Note",
|
||||
"Public Description": "Public Description",
|
||||
"Title": "Title",
|
||||
"Creation Time": "Creation Time",
|
||||
"Status": "Status",
|
||||
"Stage": "Stage",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Owner",
|
||||
"Probability": "Probability",
|
||||
"Expected Close Date": "Expected Close Date",
|
||||
"Value": "Value",
|
||||
"Currency": "Currency",
|
||||
"Visible To": "Visible To",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Channel": "Channel",
|
||||
"Lead Value Amount": "Lead Value Amount",
|
||||
"Lead Value Currency": "Lead Value Currency",
|
||||
"Name": "Name",
|
||||
"Address": "Address",
|
||||
"Email": "Email",
|
||||
"Phone": "Phone",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Marketing Status": "Marketing Status",
|
||||
"Code": "Code",
|
||||
"Description": "Description",
|
||||
"Unit": "Unit",
|
||||
"Tax percentage": "Tax percentage",
|
||||
"Is Active ?": "Is Active ?",
|
||||
"Cost": "Cost",
|
||||
"Overhead Cost": "Overhead Cost",
|
||||
"Search Term": "Search Term",
|
||||
"Field to search by": "Field to search by",
|
||||
"Field Value": "Field Value",
|
||||
"Search By": "Search By",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Exact Match",
|
||||
"Filter": "Filter",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Type of object to add the follower to.": "Type of object to add the follower to.",
|
||||
"ID of the object to add the follower to.": "ID of the object to add the follower to.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "You can use Find Deal action to retrieve deal ID.",
|
||||
"You can use Find Person action to retrieve person ID.": "You can use Find Person action to retrieve person ID.",
|
||||
"You can use Find Organization action to retrieve org ID.": "You can use Find Organization action to retrieve org ID.",
|
||||
"You can use Find Product action to retrieve product ID.": "You can use Find Product action to retrieve product ID.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Please enter date in YYYY-MM-DD format.",
|
||||
"Please enter time in HH:MM format.": "Please enter time in HH:MM format.",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "If a stage is chosen above, the pipeline field will be ignored.",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "Please enter currency code (e.g., \"USD\", \"EUR\").",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "The currency of the lead value (e.g., \"USD\", \"EUR\").",
|
||||
"Marketing opt-in status": "Marketing opt-in status",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"Deal": "Deal",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Product": "Product",
|
||||
"Percentage": "Percentage",
|
||||
"Amount": "Amount",
|
||||
"Exclusive": "Exclusive",
|
||||
"Inclusive": "Inclusive",
|
||||
"None": "None",
|
||||
"Free": "Free",
|
||||
"Busy": "Busy",
|
||||
"Open": "Open",
|
||||
"Won": "Won",
|
||||
"Lost": "Lost",
|
||||
"Deleted": "Deleted",
|
||||
"Owner & followers": "Owner & followers",
|
||||
"Entire company": "Entire company",
|
||||
"No Consent": "No Consent",
|
||||
"Unsubscribed": "Unsubscribed",
|
||||
"Subscribed": "Subscribed",
|
||||
"Archived": "Archived",
|
||||
"Product Code": "Product Code",
|
||||
"Lead": "Lead",
|
||||
"Done": "Done",
|
||||
"Not Done": "Not Done",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Person": "New Person",
|
||||
"New Deal": "New Deal",
|
||||
"New Activity": "New Activity",
|
||||
"New Note": "New Note",
|
||||
"Updated Person": "Updated Person",
|
||||
"Updated Deal": "Updated Deal",
|
||||
"Updated Deal Stage": "Updated Deal Stage",
|
||||
"New Lead": "New Lead",
|
||||
"New Organization": "New Organization",
|
||||
"Updated Organization": "Updated Organization",
|
||||
"Activity Matching Filter": "Activity Matching Filter",
|
||||
"Deal Matching Filter": "Deal Matching Filter",
|
||||
"Person Matching Filter": "Person Matching Filter",
|
||||
"Organization Matching Filter": "Organization Matching Filter",
|
||||
"Triggers when a new person is created": "Triggers when a new person is created",
|
||||
"Triggers when a new deal is created.": "Triggers when a new deal is created.",
|
||||
"Triggers when a new activity is added": "Triggers when a new activity is added",
|
||||
"Triggers when a new note is created.": "Triggers when a new note is created.",
|
||||
"Triggers when a person is updated.": "Triggers when a person is updated.",
|
||||
"Triggers when a deal is updated.": "Triggers when a deal is updated.",
|
||||
"Triggers when a deal's stage is updated.": "Triggers when a deal's stage is updated.",
|
||||
"Triggers when a new lead is created.": "Triggers when a new lead is created.",
|
||||
"Triggers when a new organization is created.": "Triggers when a new organization is created.",
|
||||
"Triggers when an existing organization is updated.": "Triggers when an existing organization is updated.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Trigges when an activity newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Trigges when a deal newly matches a Pipedrive filter for the first time.",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Triggers when a person newly matches a Pipedrive filter for the first time.",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "Triggers when an organization newly matches a Pipedrive filter for the first time.",
|
||||
"Filter by": "Filter by",
|
||||
"Field Values": "Field Values",
|
||||
"Field to watch for Changes On": "Field to watch for Changes On",
|
||||
"Stage in Pipeline": "Stage in Pipeline",
|
||||
"Deal Status": "Deal Status",
|
||||
"All(Not Deleted)": "All(Not Deleted)"
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"Pipedrive": "Pipedrive",
|
||||
"Sales CRM and pipeline management software": "Sales CRM and pipeline management software",
|
||||
"Add Follower": "Add Follower",
|
||||
"Retrieve a Note": "Retrieve a Note",
|
||||
"Create Note": "Create Note",
|
||||
"Add Labels to Person": "Add Labels to Person",
|
||||
"Add Product to Deal": "Add Product to Deal",
|
||||
"Attach File": "Attach File",
|
||||
"Create Activity": "Create Activity",
|
||||
"Update Activity": "Update Activity",
|
||||
"Create Deal": "Create Deal",
|
||||
"Update Deal": "Update Deal",
|
||||
"Create Lead": "Create Lead",
|
||||
"Update Lead": "Update Lead",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create Person": "Create Person",
|
||||
"Update Person": "Update Person",
|
||||
"Create Product": "Create Product",
|
||||
"Update Product": "Update Product",
|
||||
"Find Deals Associated With Person": "Find Deals Associated With Person",
|
||||
"Find Product": "Find Product",
|
||||
"Find Products": "Find Products",
|
||||
"Find Notes": "Find Notes",
|
||||
"Retrieve a Product": "Retrieve a Product",
|
||||
"Find Organization": "Find Organization",
|
||||
"Find Person": "Find Person",
|
||||
"Find Deal": "Find Deal",
|
||||
"Find Activity": "Find Activity",
|
||||
"Find User": "Find User",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Adds a follower to a deal, person, organization or product.": "Adds a follower to a deal, person, organization or product.",
|
||||
" Finds a note by ID.": " Finds a note by ID.",
|
||||
"Creates a new note.": "Creates a new note.",
|
||||
"Adds an existing labels to an existing person.": "Adds an existing labels to an existing person.",
|
||||
"Adds a product to a deal.": "Adds a product to a deal.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Uploads a file and attaches it to a deal,person,organization,activity or product.",
|
||||
"Creates a new activity.": "Creates a new activity.",
|
||||
"Updates an existing activity.": "Updates an existing activity.",
|
||||
"Creates a new deal.": "Creates a new deal.",
|
||||
"Updates an existing deal.": "Updates an existing deal.",
|
||||
"Creates a new lead.": "Creates a new lead.",
|
||||
"Updates an existing lead.": "Updates an existing lead.",
|
||||
"Creates a new organization.": "Creates a new organization.",
|
||||
"Updates an existing organization.": "Updates an existing organization.",
|
||||
"Creates a new person.": "Creates a new person.",
|
||||
"Updates an existing person.": "Updates an existing person.",
|
||||
"Creates a new product.": "Creates a new product.",
|
||||
"Finds multiple deals related to a specific person.": "Finds multiple deals related to a specific person.",
|
||||
"Find a product by name.": "Find a product by name.",
|
||||
"Finds a product or products by name or product code.": "Finds a product or products by name or product code.",
|
||||
"Finds notes by Deal,Lead,Person, or Organization ID.": "Finds notes by Deal,Lead,Person, or Organization ID.",
|
||||
" Finds a product by ID.": " Finds a product by ID.",
|
||||
"Finds an organization.": "Finds an organization.",
|
||||
"Finds a person.": "Finds a person.",
|
||||
"Finds a deal by any field.": "Finds a deal by any field.",
|
||||
"Finds an activity by subject.": "Finds an activity by subject.",
|
||||
"Find a user by name or email.": "Find a user by name or email.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Follower": "Follower",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Target Object ID",
|
||||
"Note ID": "Note ID",
|
||||
"Content": "Content",
|
||||
"Deal ID": "Deal ID",
|
||||
"Pin note to deal?": "Pin note to deal?",
|
||||
"Person ID": "Person ID",
|
||||
"Pin note to person?": "Pin note to person?",
|
||||
"Organization ID": "Organization ID",
|
||||
"Pin note to organization?": "Pin note to organization?",
|
||||
"Lead ID": "Lead ID",
|
||||
"Pin note to lead?": "Pin note to lead?",
|
||||
"Label": "Label",
|
||||
"Product ID": "Product ID",
|
||||
"Price": "Price",
|
||||
"Quantity": "Quantity",
|
||||
"Discount": "Discount",
|
||||
"Discount Type": "Discount Type",
|
||||
"Comments": "Comments",
|
||||
"Enable Product?": "Enable Product?",
|
||||
"Tax Method": "Tax Method",
|
||||
"Tax Percentage": "Tax Percentage",
|
||||
"File": "File",
|
||||
"File Name": "File Name",
|
||||
"Activity ID": "Activity ID",
|
||||
"Subject": "Subject",
|
||||
"Assign To": "Assign To",
|
||||
"Activity Type": "Activity Type",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Duration": "Duration",
|
||||
"Mark as Done?": "Mark as Done?",
|
||||
"Free or Busy": "Free or Busy",
|
||||
"Note": "Note",
|
||||
"Public Description": "Public Description",
|
||||
"Activity": "Activity",
|
||||
"Title": "Title",
|
||||
"Creation Time": "Creation Time",
|
||||
"Status": "Status",
|
||||
"Stage": "Stage",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "Owner",
|
||||
"Probability": "Probability",
|
||||
"Expected Close Date": "Expected Close Date",
|
||||
"Value": "Value",
|
||||
"Currency": "Currency",
|
||||
"Visible To": "Visible To",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Channel": "Channel",
|
||||
"Lead Value": "Lead Value",
|
||||
"Lead Value Currency": "Lead Value Currency",
|
||||
"Name": "Name",
|
||||
"Address": "Address",
|
||||
"Email": "Email",
|
||||
"Phone": "Phone",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "Last Name",
|
||||
"Marketing Status": "Marketing Status",
|
||||
"Code": "Code",
|
||||
"Description": "Description",
|
||||
"Unit": "Unit",
|
||||
"Tax percentage": "Tax percentage",
|
||||
"Is Active ?": "Is Active ?",
|
||||
"Cost": "Cost",
|
||||
"Overhead Cost": "Overhead Cost",
|
||||
"Search Term": "Search Term",
|
||||
"Field to search by": "Field to search by",
|
||||
"Field Value": "Field Value",
|
||||
"Search By": "Search By",
|
||||
"ID": "ID",
|
||||
"Exact Match": "Exact Match",
|
||||
"Filter": "Filter",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Type of object to add the follower to.": "Type of object to add the follower to.",
|
||||
"ID of the object to add the follower to.": "ID of the object to add the follower to.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "You can use Find Deal action to retrieve deal ID.",
|
||||
"You can use Find Person action to retrieve person ID.": "You can use Find Person action to retrieve person ID.",
|
||||
"You can use Find Organization action to retrieve org ID.": "You can use Find Organization action to retrieve org ID.",
|
||||
"You can use Find Product action to retrieve product ID.": "You can use Find Product action to retrieve product ID.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Please enter date in YYYY-MM-DD format.",
|
||||
"Please enter time in HH:MM format.": "Please enter time in HH:MM format.",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "If a stage is chosen above, the pipeline field will be ignored.",
|
||||
"Please enter currency code.": "Please enter currency code.",
|
||||
"Marketing opt-in status": "Marketing opt-in status",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"Deal": "Deal",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Product": "Product",
|
||||
"Percentage": "Percentage",
|
||||
"Amount": "Amount",
|
||||
"Exclusive": "Exclusive",
|
||||
"Inclusive": "Inclusive",
|
||||
"None": "None",
|
||||
"Free": "Free",
|
||||
"Busy": "Busy",
|
||||
"Open": "Open",
|
||||
"Won": "Won",
|
||||
"Lost": "Lost",
|
||||
"Deleted": "Deleted",
|
||||
"Item Owner": "Item Owner",
|
||||
"All Users": "All Users",
|
||||
"No Consent": "No Consent",
|
||||
"Unsubscribed": "Unsubscribed",
|
||||
"Subscribed": "Subscribed",
|
||||
"Archived": "Archived",
|
||||
"Product Code": "Product Code",
|
||||
"Lead": "Lead",
|
||||
"Done": "Done",
|
||||
"Not Done": "Not Done",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Person": "New Person",
|
||||
"New Deal": "New Deal",
|
||||
"New Activity": "New Activity",
|
||||
"New Note": "New Note",
|
||||
"Updated Person": "Updated Person",
|
||||
"Updated Deal": "Updated Deal",
|
||||
"Updated Deal Stage": "Updated Deal Stage",
|
||||
"New Lead": "New Lead",
|
||||
"New Organization": "New Organization",
|
||||
"Updated Organization": "Updated Organization",
|
||||
"Activity Matching Filter": "Activity Matching Filter",
|
||||
"Deal Matching Filter": "Deal Matching Filter",
|
||||
"Person Matching Filter": "Person Matching Filter",
|
||||
"Organization Matching Filter": "Organization Matching Filter",
|
||||
"Triggers when a new person is created": "Triggers when a new person is created",
|
||||
"Triggers when a new deal is created.": "Triggers when a new deal is created.",
|
||||
"Triggers when a new activity is added": "Triggers when a new activity is added",
|
||||
"Triggers when a new note is created.": "Triggers when a new note is created.",
|
||||
"Triggers when a person is updated": "Triggers when a person is updated",
|
||||
"Triggers when a deal is updated": "Triggers when a deal is updated",
|
||||
"Triggers when a deal's stage is updated.": "Triggers when a deal's stage is updated.",
|
||||
"Triggers when a new lead is created.": "Triggers when a new lead is created.",
|
||||
"Triggers when a new organization is created.": "Triggers when a new organization is created.",
|
||||
"Triggers when an existing organization is updated.": "Triggers when an existing organization is updated.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Trigges when an activity newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Trigges when a deal newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a person newly matches a Pipedrive filter for the first time.": "Trigges when a person newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when an organization newly matches a Pipedrive filter for the first time.": "Trigges when an organization newly matches a Pipedrive filter for the first time.",
|
||||
"Filter by": "Filter by",
|
||||
"Field Values": "Field Values",
|
||||
"Field to watch for Changes On": "Field to watch for Changes On",
|
||||
"Stage in Pipeline": "Stage in Pipeline",
|
||||
"Deal Status": "Deal Status",
|
||||
"All(Not Deleted)": "All(Not Deleted)"
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
{
|
||||
"Sales CRM and pipeline management software": "Sales CRM and pipeline management software",
|
||||
"Add Follower": "Add Follower",
|
||||
"Retrieve a Note": "Retrieve a Note",
|
||||
"Create Note": "Create Note",
|
||||
"Add Labels to Person": "Add Labels to Person",
|
||||
"Add Product to Deal": "Add Product to Deal",
|
||||
"Attach File": "Attach File",
|
||||
"Create Activity": "Create Activity",
|
||||
"Update Activity": "Update Activity",
|
||||
"Create Deal": "Create Deal",
|
||||
"Update Deal": "Update Deal",
|
||||
"Create Lead": "Create Lead",
|
||||
"Update Lead": "Update Lead",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create Person": "Create Person",
|
||||
"Update Person": "Update Person",
|
||||
"Create Product": "Create Product",
|
||||
"Update Product": "Update Product",
|
||||
"Find Deals Associated With Person": "Find Deals Associated With Person",
|
||||
"Find Product": "Find Product",
|
||||
"Find Products": "Find Products",
|
||||
"Find Notes": "Find Notes",
|
||||
"Retrieve a Product": "Retrieve a Product",
|
||||
"Find Organization": "Find Organization",
|
||||
"Find Person": "Find Person",
|
||||
"Find Deal": "Find Deal",
|
||||
"Find Activity": "Find Activity",
|
||||
"Find User": "Find User",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Adds a follower to a deal, person, organization or product.": "Adds a follower to a deal, person, organization or product.",
|
||||
"Finds a note by ID.": "Finds a note by ID.",
|
||||
"Creates a new note.": "Creates a new note.",
|
||||
"Adds existing labels to an existing person.": "Adds existing labels to an existing person.",
|
||||
"Adds a product to a deal.": "Adds a product to a deal.",
|
||||
"Uploads a file and attaches it to a deal,person,organization,activity or product.": "Uploads a file and attaches it to a deal,person,organization,activity or product.",
|
||||
"Creates a new activity.": "Creates a new activity.",
|
||||
"Updates an existing activity.": "Updates an existing activity.",
|
||||
"Creates a new deal.": "Creates a new deal.",
|
||||
"Updates an existing deal.": "Updates an existing deal.",
|
||||
"Creates a new lead.": "Creates a new lead.",
|
||||
"Updates an existing lead.": "Updates an existing lead.",
|
||||
"Creates a new organization.": "Creates a new organization.",
|
||||
"Updates an existing organization.": "Updates an existing organization.",
|
||||
"Creates a new person.": "Creates a new person.",
|
||||
"Updates an existing person.": "Updates an existing person.",
|
||||
"Creates a new product.": "Creates a new product.",
|
||||
"Finds multiple deals related to a specific person.": "Finds multiple deals related to a specific person.",
|
||||
"Finds a product by name ": "Finds a product by name ",
|
||||
"Finds a product or products by name or product code.": "Finds a product or products by name or product code.",
|
||||
"Finds notes by Deal, Lead, Person, or Organization ID.": "Finds notes by Deal, Lead, Person, or Organization ID.",
|
||||
"Finds a product by ID.": "Finds a product by ID.",
|
||||
"Finds an organization.": "Finds an organization.",
|
||||
"Finds a person.": "Finds a person.",
|
||||
"Finds a deal by any field.": "Finds a deal by any field.",
|
||||
"Finds an activity by subject.": "Finds an activity by subject.",
|
||||
"Finds a user by name or email.": "Finds a user by name or email.",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"Follower": "Follower",
|
||||
"Target Object": "Target Object",
|
||||
"Target Object ID": "Target Object ID",
|
||||
"Note ID": "Note ID",
|
||||
"Content": "Content",
|
||||
"Deal ID": "Deal ID",
|
||||
"Pin note to deal?": "Pin note to deal?",
|
||||
"Person ID": "Person ID",
|
||||
"Pin note to person?": "Pin note to person?",
|
||||
"Organization ID": "Organization ID",
|
||||
"Pin note to organization?": "Pin note to organization?",
|
||||
"Lead ID": "Lead ID",
|
||||
"Pin note to lead?": "Pin note to lead?",
|
||||
"Label": "Label",
|
||||
"Product ID": "Product ID",
|
||||
"Price": "Price",
|
||||
"Quantity": "Quantity",
|
||||
"Discount": "Discount",
|
||||
"Discount Type": "Discount Type",
|
||||
"Comments": "Comments",
|
||||
"Enable Product?": "Enable Product?",
|
||||
"Tax Method": "Tax Method",
|
||||
"Tax Percentage": "Tax Percentage",
|
||||
"File": "文件",
|
||||
"File Name": "File Name",
|
||||
"Activity ID": "Activity ID",
|
||||
"Subject": "Subject",
|
||||
"Assign To": "Assign To",
|
||||
"Activity Type": "Activity Type",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Duration": "期限",
|
||||
"Mark as Done?": "Mark as Done?",
|
||||
"Free or Busy": "Free or Busy",
|
||||
"Note": "说明",
|
||||
"Public Description": "Public Description",
|
||||
"Title": "标题",
|
||||
"Creation Time": "Creation Time",
|
||||
"Status": "状态",
|
||||
"Stage": "Stage",
|
||||
"Pipeline": "Pipeline",
|
||||
"Owner": "所有者",
|
||||
"Probability": "Probability",
|
||||
"Expected Close Date": "Expected Close Date",
|
||||
"Value": "值",
|
||||
"Currency": "Currency",
|
||||
"Visible To": "Visible To",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Channel": "Channel",
|
||||
"Lead Value Amount": "Lead Value Amount",
|
||||
"Lead Value Currency": "Lead Value Currency",
|
||||
"Name": "名称",
|
||||
"Address": "Address",
|
||||
"Email": "电子邮件地址",
|
||||
"Phone": "Phone",
|
||||
"First Name": "First Name",
|
||||
"Last Name": "名字",
|
||||
"Marketing Status": "Marketing Status",
|
||||
"Code": "Code",
|
||||
"Description": "描述",
|
||||
"Unit": "Unit",
|
||||
"Tax percentage": "Tax percentage",
|
||||
"Is Active ?": "Is Active ?",
|
||||
"Cost": "Cost",
|
||||
"Overhead Cost": "Overhead Cost",
|
||||
"Search Term": "Search Term",
|
||||
"Field to search by": "Field to search by",
|
||||
"Field Value": "Field Value",
|
||||
"Search By": "Search By",
|
||||
"ID": "ID",
|
||||
"Exact Match": "精确匹配",
|
||||
"Filter": "Filter",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"Type of object to add the follower to.": "Type of object to add the follower to.",
|
||||
"ID of the object to add the follower to.": "ID of the object to add the follower to.",
|
||||
"You can use Find Deal action to retrieve deal ID.": "You can use Find Deal action to retrieve deal ID.",
|
||||
"You can use Find Person action to retrieve person ID.": "You can use Find Person action to retrieve person ID.",
|
||||
"You can use Find Organization action to retrieve org ID.": "You can use Find Organization action to retrieve org ID.",
|
||||
"You can use Find Product action to retrieve product ID.": "You can use Find Product action to retrieve product ID.",
|
||||
"Please enter date in YYYY-MM-DD format.": "Please enter date in YYYY-MM-DD format.",
|
||||
"Please enter time in HH:MM format.": "Please enter time in HH:MM format.",
|
||||
"Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).": "Please enter time in HH:MM format (e.g., \"01:30\" for 1 hour 30 minutes).",
|
||||
"If a stage is chosen above, the pipeline field will be ignored.": "If a stage is chosen above, the pipeline field will be ignored.",
|
||||
"Please enter currency code (e.g., \"USD\", \"EUR\").": "Please enter currency code (e.g., \"USD\", \"EUR\").",
|
||||
"The currency of the lead value (e.g., \"USD\", \"EUR\").": "The currency of the lead value (e.g., \"USD\", \"EUR\").",
|
||||
"Marketing opt-in status": "Marketing opt-in status",
|
||||
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"Deal": "Deal",
|
||||
"Person": "Person",
|
||||
"Organization": "Organization",
|
||||
"Product": "Product",
|
||||
"Percentage": "Percentage",
|
||||
"Amount": "Amount",
|
||||
"Exclusive": "Exclusive",
|
||||
"Inclusive": "Inclusive",
|
||||
"None": "无",
|
||||
"Free": "Free",
|
||||
"Busy": "Busy",
|
||||
"Open": "Open",
|
||||
"Won": "Won",
|
||||
"Lost": "Lost",
|
||||
"Deleted": "Deleted",
|
||||
"Owner & followers": "Owner & followers",
|
||||
"Entire company": "Entire company",
|
||||
"No Consent": "No Consent",
|
||||
"Unsubscribed": "Unsubscribed",
|
||||
"Subscribed": "Subscribed",
|
||||
"Archived": "Archived",
|
||||
"Product Code": "Product Code",
|
||||
"Lead": "Lead",
|
||||
"Done": "完成",
|
||||
"Not Done": "Not Done",
|
||||
"GET": "获取",
|
||||
"POST": "帖子",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "弹出",
|
||||
"DELETE": "删除",
|
||||
"HEAD": "黑色",
|
||||
"New Person": "New Person",
|
||||
"New Deal": "New Deal",
|
||||
"New Activity": "New Activity",
|
||||
"New Note": "New Note",
|
||||
"Updated Person": "Updated Person",
|
||||
"Updated Deal": "Updated Deal",
|
||||
"Updated Deal Stage": "Updated Deal Stage",
|
||||
"New Lead": "New Lead",
|
||||
"New Organization": "New Organization",
|
||||
"Updated Organization": "Updated Organization",
|
||||
"Activity Matching Filter": "Activity Matching Filter",
|
||||
"Deal Matching Filter": "Deal Matching Filter",
|
||||
"Person Matching Filter": "Person Matching Filter",
|
||||
"Organization Matching Filter": "Organization Matching Filter",
|
||||
"Triggers when a new person is created": "Triggers when a new person is created",
|
||||
"Triggers when a new deal is created.": "Triggers when a new deal is created.",
|
||||
"Triggers when a new activity is added": "Triggers when a new activity is added",
|
||||
"Triggers when a new note is created.": "Triggers when a new note is created.",
|
||||
"Triggers when a person is updated.": "Triggers when a person is updated.",
|
||||
"Triggers when a deal is updated.": "Triggers when a deal is updated.",
|
||||
"Triggers when a deal's stage is updated.": "Triggers when a deal's stage is updated.",
|
||||
"Triggers when a new lead is created.": "Triggers when a new lead is created.",
|
||||
"Triggers when a new organization is created.": "Triggers when a new organization is created.",
|
||||
"Triggers when an existing organization is updated.": "Triggers when an existing organization is updated.",
|
||||
"Trigges when an activity newly matches a Pipedrive filter for the first time.": "Trigges when an activity newly matches a Pipedrive filter for the first time.",
|
||||
"Trigges when a deal newly matches a Pipedrive filter for the first time.": "Trigges when a deal newly matches a Pipedrive filter for the first time.",
|
||||
"Triggers when a person newly matches a Pipedrive filter for the first time.": "Triggers when a person newly matches a Pipedrive filter for the first time.",
|
||||
"Triggers when an organization newly matches a Pipedrive filter for the first time.": "Triggers when an organization newly matches a Pipedrive filter for the first time.",
|
||||
"Filter by": "Filter by",
|
||||
"Field Values": "Field Values",
|
||||
"Field to watch for Changes On": "Field to watch for Changes On",
|
||||
"Stage in Pipeline": "Stage in Pipeline",
|
||||
"Deal Status": "Deal Status",
|
||||
"All(Not Deleted)": "All(Not Deleted)"
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
import { createCustomApiCallAction } from '@activepieces/pieces-common';
|
||||
import { OAuth2PropertyValue, PieceAuth, createPiece } from '@activepieces/pieces-framework';
|
||||
import { PieceCategory } from '@activepieces/shared';
|
||||
import { newActivity } from './lib/trigger/new-activity';
|
||||
import { newDeal } from './lib/trigger/new-deal';
|
||||
import { newPerson } from './lib/trigger/new-person';
|
||||
import { updatedDeal } from './lib/trigger/updated-deal';
|
||||
import { updatedPerson } from './lib/trigger/updated-person';
|
||||
import { newLeadTrigger } from './lib/trigger/new-lead';
|
||||
import { newOrganizationTrigger } from './lib/trigger/new-organization';
|
||||
import { updatedOrganizationTrigger } from './lib/trigger/updated-organization';
|
||||
import { updatedDealStageTrigger } from './lib/trigger/updated-deal-stage';
|
||||
import { createPersonAction } from './lib/actions/create-person';
|
||||
import { updatePersonAction } from './lib/actions/update-person';
|
||||
import { createOrganizationAction } from './lib/actions/create-organization';
|
||||
import { updateOrganizationAction } from './lib/actions/update-organization';
|
||||
import { createLeadAction } from './lib/actions/create-lead';
|
||||
import { updateLeadAction } from './lib/actions/update-lead';
|
||||
import { createDealAction } from './lib/actions/create-deal';
|
||||
import { updateDealAction } from './lib/actions/update-deal';
|
||||
import { createProductAction } from './lib/actions/create-product';
|
||||
import { addProductToDealAction } from './lib/actions/add-product-to-deal';
|
||||
import { addLabelToPersonAction } from './lib/actions/add-label-to-person';
|
||||
import { createActivityAction } from './lib/actions/create-activity';
|
||||
import { updateActivityAction } from './lib/actions/update-activity';
|
||||
import { attachFileAction } from './lib/actions/attach-file';
|
||||
import { addFollowerAction } from './lib/actions/add-follower';
|
||||
import { createNoteAction } from './lib/actions/create-note';
|
||||
import { getNoteAction } from './lib/actions/get-note';
|
||||
import { findUserAction } from './lib/actions/find-user';
|
||||
import { findProductAction } from './lib/actions/find-product';
|
||||
import { organizationMatchingFilterTrigger } from './lib/trigger/organization-matching-filter';
|
||||
import { personMatchingFilterTrigger } from './lib/trigger/person-matching-filter';
|
||||
import { activityMatchingFilterTrigger } from './lib/trigger/activity-matching-filter';
|
||||
import { dealMatchingFilterTrigger } from './lib/trigger/deal-matching-filter';
|
||||
import { newNoteTrigger } from './lib/trigger/new-note';
|
||||
import { findDealsAssociatedWithPersonAction } from './lib/actions/find-deals-associated-with-person';
|
||||
import { findProductsAction } from './lib/actions/find-products';
|
||||
import { getProductAction } from './lib/actions/get-product';
|
||||
import { findNotesAction } from './lib/actions/find-notes';
|
||||
import { findOrganizationAction } from './lib/actions/find-organization';
|
||||
import { findPersonAction } from './lib/actions/find-person';
|
||||
import { findDealAction } from './lib/actions/find-deal';
|
||||
import { findActivityAction } from './lib/actions/find-activity';
|
||||
import { updateProductAction } from './lib/actions/update-product';
|
||||
|
||||
export const pipedriveAuth = PieceAuth.OAuth2({
|
||||
description: '',
|
||||
authUrl: 'https://oauth.pipedrive.com/oauth/authorize',
|
||||
tokenUrl: 'https://oauth.pipedrive.com/oauth/token',
|
||||
required: true,
|
||||
scope: [
|
||||
'base',
|
||||
'admin',
|
||||
'contacts:full',
|
||||
'users:read',
|
||||
'deals:full',
|
||||
'activities:full',
|
||||
'leads:full',
|
||||
'products:full',
|
||||
'webhooks:full'
|
||||
],
|
||||
});
|
||||
|
||||
export const pipedrive = createPiece({
|
||||
displayName: 'Pipedrive',
|
||||
description: 'Sales CRM and pipeline management software',
|
||||
|
||||
minimumSupportedRelease: '0.30.0',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/pipedrive.png',
|
||||
categories: [PieceCategory.SALES_AND_CRM],
|
||||
auth: pipedriveAuth,
|
||||
actions: [
|
||||
addFollowerAction,
|
||||
getNoteAction,
|
||||
createNoteAction,
|
||||
addLabelToPersonAction,
|
||||
addProductToDealAction,
|
||||
attachFileAction,
|
||||
createActivityAction,
|
||||
updateActivityAction,
|
||||
createDealAction,
|
||||
updateDealAction,
|
||||
createLeadAction,
|
||||
updateLeadAction,
|
||||
createOrganizationAction,
|
||||
updateOrganizationAction,
|
||||
createPersonAction,
|
||||
updatePersonAction,
|
||||
createProductAction,
|
||||
updateProductAction,
|
||||
findDealsAssociatedWithPersonAction,
|
||||
findProductAction,
|
||||
findProductsAction,
|
||||
findNotesAction,
|
||||
getProductAction,
|
||||
findOrganizationAction,
|
||||
findPersonAction,
|
||||
findDealAction,
|
||||
findActivityAction,
|
||||
findUserAction,
|
||||
createCustomApiCallAction({
|
||||
baseUrl: () => 'https://api.pipedrive.com/api/v2',
|
||||
auth: pipedriveAuth,
|
||||
authMapping: async (auth) => ({
|
||||
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
authors: ['ashrafsamhouri', 'kishanprmr', 'MoShizzle', 'khaledmashaly', 'abuaboud', 'leocottaz'],
|
||||
triggers: [
|
||||
newPerson,
|
||||
newDeal,
|
||||
newActivity,
|
||||
newNoteTrigger,
|
||||
updatedPerson,
|
||||
updatedDeal,
|
||||
updatedDealStageTrigger,
|
||||
newLeadTrigger,
|
||||
newOrganizationTrigger,
|
||||
updatedOrganizationTrigger,
|
||||
activityMatchingFilterTrigger,
|
||||
dealMatchingFilterTrigger,
|
||||
personMatchingFilterTrigger,
|
||||
organizationMatchingFilterTrigger,
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,82 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { ownerIdProp } from '../common/props';
|
||||
import { pipedriveApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const addFollowerAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'add-follower',
|
||||
displayName: 'Add Follower',
|
||||
description: 'Adds a follower to a deal, person, organization or product.',
|
||||
props: {
|
||||
followerId: ownerIdProp('Follower', true),
|
||||
entity: Property.StaticDropdown({
|
||||
displayName: 'Target Object',
|
||||
description: 'Type of object to add the follower to.',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Deal',
|
||||
value: 'deal',
|
||||
},
|
||||
{
|
||||
label: 'Person',
|
||||
value: 'person',
|
||||
},
|
||||
{
|
||||
label: 'Organization',
|
||||
value: 'organization',
|
||||
},
|
||||
{
|
||||
label: 'Product',
|
||||
value: 'product',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
entityId: Property.ShortText({
|
||||
displayName: 'Target Object ID',
|
||||
description: 'ID of the object to add the follower to.',
|
||||
required:true
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { followerId, entity, entityId } = context.propsValue;
|
||||
|
||||
let endpoint = '';
|
||||
|
||||
switch (entity) {
|
||||
case 'deal':
|
||||
endpoint = `/deals/${entityId}/followers`;
|
||||
break;
|
||||
case 'organization':
|
||||
endpoint = `/organizations/${entityId}/followers`;
|
||||
break;
|
||||
case 'person':
|
||||
endpoint = `/persons/${entityId}/followers`;
|
||||
break;
|
||||
case 'product':
|
||||
endpoint = `/products/${entityId}/followers`;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!endpoint) {
|
||||
throw new Error(`Invalid object type: ${entity}`);
|
||||
}
|
||||
|
||||
const response = await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: `/v2${endpoint}`,
|
||||
body: {
|
||||
user_id: followerId,
|
||||
},
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,58 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { labelIdsProp, personIdProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, GetPersonResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const addLabelToPersonAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'add-labels-to-person',
|
||||
displayName: 'Add Labels to Person',
|
||||
description: 'Adds existing labels to an existing person.',
|
||||
props: {
|
||||
personId: personIdProp(true),
|
||||
labelIds: labelIdsProp('person', 'label_ids', true),
|
||||
},
|
||||
async run(context) {
|
||||
const { personId } = context.propsValue;
|
||||
const labelIds = (context.propsValue.labelIds as number[]) ?? [];
|
||||
|
||||
const personUpdatePayload: Record<string, any> = {};
|
||||
|
||||
if (labelIds.length > 0) {
|
||||
personUpdatePayload.label_ids = labelIds;
|
||||
}
|
||||
|
||||
const updatedPersonResponse = await pipedriveApiCall<GetPersonResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: `/v2/persons/${personId}`,
|
||||
body: {
|
||||
...personUpdatePayload,
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
const transformedPersonData = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
updatedPersonResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...updatedPersonResponse,
|
||||
data: transformedPersonData,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,113 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { dealIdProp, productIdProp } from '../common/props';
|
||||
import { pipedriveApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const addProductToDealAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'add-product-to-deal',
|
||||
displayName: 'Add Product to Deal',
|
||||
description: 'Adds a product to a deal.',
|
||||
props: {
|
||||
dealId: dealIdProp(true),
|
||||
productId: productIdProp(true),
|
||||
price: Property.Number({
|
||||
displayName: 'Price',
|
||||
required: true,
|
||||
}),
|
||||
quantity: Property.Number({
|
||||
displayName: 'Quantity',
|
||||
required: true,
|
||||
}),
|
||||
discount: Property.Number({
|
||||
displayName: 'Discount',
|
||||
required: false,
|
||||
}),
|
||||
discountType: Property.StaticDropdown({
|
||||
displayName: 'Discount Type',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Percentage',
|
||||
value: 'percentage',
|
||||
},
|
||||
{
|
||||
label: 'Amount',
|
||||
value: 'amount',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
comments: Property.LongText({
|
||||
displayName: 'Comments',
|
||||
required: false,
|
||||
}),
|
||||
enableProduct: Property.Checkbox({
|
||||
displayName: 'Enable Product?',
|
||||
required: false,
|
||||
defaultValue: true,
|
||||
}),
|
||||
taxMethod: Property.StaticDropdown({
|
||||
displayName: 'Tax Method',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Exclusive',
|
||||
value: 'exclusive',
|
||||
},
|
||||
{
|
||||
label: 'Inclusive',
|
||||
value: 'inclusive',
|
||||
},
|
||||
{
|
||||
label: 'None',
|
||||
value: 'none',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
taxPercentage: Property.Number({
|
||||
displayName: 'Tax Percentage',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
productId,
|
||||
dealId,
|
||||
price,
|
||||
quantity,
|
||||
discountType,
|
||||
discount,
|
||||
comments,
|
||||
enableProduct,
|
||||
taxPercentage,
|
||||
taxMethod,
|
||||
} = context.propsValue;
|
||||
|
||||
const response = await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: `/v2/deals/${dealId}/products`,
|
||||
body: {
|
||||
product_id: productId,
|
||||
item_price: price,
|
||||
quantity,
|
||||
discount_type: discountType,
|
||||
discount,
|
||||
comments: comments ?? '',
|
||||
is_enabled: enableProduct,
|
||||
tax: taxPercentage,
|
||||
tax_method: taxMethod,
|
||||
},
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,58 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { dealIdProp, organizationIdProp, personIdProp, productIdProp } from '../common/props';
|
||||
import FormData from 'form-data';
|
||||
import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const attachFileAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'attach-file',
|
||||
displayName: 'Attach File',
|
||||
description: 'Uploads a file and attaches it to a deal,person,organization,activity or product.',
|
||||
props: {
|
||||
file: Property.File({
|
||||
displayName: 'File',
|
||||
required: true,
|
||||
}),
|
||||
fileName: Property.ShortText({
|
||||
displayName: 'File Name',
|
||||
required: true,
|
||||
}),
|
||||
dealId: dealIdProp(false),
|
||||
personId: personIdProp(false),
|
||||
organizationId: organizationIdProp(false),
|
||||
productId: productIdProp(false),
|
||||
activityId: Property.Number({
|
||||
displayName: 'Activity ID',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { file, fileName, dealId, personId, organizationId, productId, activityId } =
|
||||
context.propsValue;
|
||||
|
||||
const formatData = new FormData();
|
||||
|
||||
formatData.append('file', file.data, fileName);
|
||||
if (dealId) formatData.append('deal_id', dealId);
|
||||
if (personId) formatData.append('person_id', personId);
|
||||
if (organizationId) formatData.append('org_id', organizationId);
|
||||
if (productId) formatData.append('product_id', productId);
|
||||
if (activityId) formatData.append('activity_id', activityId);
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method: HttpMethod.POST,
|
||||
url: `${context.auth.data['api_domain']}/api/v1/files`,
|
||||
body: formatData,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: context.auth.access_token,
|
||||
},
|
||||
headers: {
|
||||
...formatData.getHeaders(),
|
||||
},
|
||||
});
|
||||
|
||||
return response.body;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,74 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { activityCommonProps } from '../common/props';
|
||||
import { pipedriveApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
export const createActivityAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'create-activity',
|
||||
displayName: 'Create Activity',
|
||||
description: 'Creates a new activity.',
|
||||
props: {
|
||||
subject: Property.ShortText({
|
||||
displayName: 'Subject',
|
||||
required: true,
|
||||
}),
|
||||
...activityCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
subject,
|
||||
organizationId,
|
||||
personId,
|
||||
dealId,
|
||||
leadId,
|
||||
assignTo,
|
||||
type,
|
||||
dueDate,
|
||||
dueTime,
|
||||
duration,
|
||||
isDone,
|
||||
busy,
|
||||
note,
|
||||
publicDescription,
|
||||
} = context.propsValue;
|
||||
|
||||
const activityPayload: Record<string, any> = {
|
||||
subject,
|
||||
org_id: organizationId,
|
||||
deal_id: dealId,
|
||||
lead_id: leadId,
|
||||
public_description: publicDescription,
|
||||
type,
|
||||
owner_id: assignTo,
|
||||
due_time: dueTime,
|
||||
duration,
|
||||
done: isDone,
|
||||
note
|
||||
};
|
||||
|
||||
if (personId) {
|
||||
activityPayload.participants = [{ person_id: personId, primary: true }];
|
||||
}
|
||||
|
||||
if (busy) {
|
||||
activityPayload.busy = busy === 'busy' ? true : false;
|
||||
}
|
||||
|
||||
if (dueDate) {
|
||||
activityPayload.due_date = dayjs(dueDate).format('YYYY-MM-DD');
|
||||
}
|
||||
|
||||
const response = await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v2/activities',
|
||||
body: activityPayload,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,101 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { dealCommonProps } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { GetField, GetDealResponse } from '../common/types';
|
||||
import dayjs from 'dayjs';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const createDealAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'create-deal',
|
||||
displayName: 'Create Deal',
|
||||
description: 'Creates a new deal.',
|
||||
props: {
|
||||
title: Property.ShortText({
|
||||
displayName: 'Title',
|
||||
required: true,
|
||||
}),
|
||||
...dealCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
title,
|
||||
dealValue,
|
||||
dealValueCurrency,
|
||||
expectedCloseDate,
|
||||
visibleTo,
|
||||
probability,
|
||||
stageId,
|
||||
status,
|
||||
pipelineId,
|
||||
ownerId,
|
||||
organizationId,
|
||||
personId,
|
||||
creationTime,
|
||||
} = context.propsValue;
|
||||
|
||||
const labelIds = (context.propsValue.labelIds as number[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const dealPayload: Record<string, any> = {
|
||||
title,
|
||||
pipeline_id: pipelineId,
|
||||
stage_id: stageId,
|
||||
status,
|
||||
add_time: creationTime ? dayjs(creationTime).format('YYYY-MM-DDTHH:mm:ss[Z]') : undefined,
|
||||
probability,
|
||||
visible_to: visibleTo,
|
||||
owner_id: ownerId,
|
||||
org_id: organizationId,
|
||||
person_id: personId,
|
||||
value: dealValue,
|
||||
currency: dealValueCurrency,
|
||||
};
|
||||
|
||||
if (labelIds.length > 0) {
|
||||
dealPayload.label_ids = labelIds;
|
||||
}
|
||||
|
||||
if (expectedCloseDate) {
|
||||
dealPayload.expected_close_date = dayjs(expectedCloseDate).format('YYYY-MM-DD');
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const dealCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(dealCustomFields)) {
|
||||
dealPayload.custom_fields = dealCustomFields;
|
||||
}
|
||||
|
||||
const createdDealResponse = await pipedriveApiCall<GetDealResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v2/deals',
|
||||
body: dealPayload,
|
||||
});
|
||||
|
||||
const transformedPersonProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
createdDealResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...createdDealResponse,
|
||||
data: transformedPersonProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,113 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { leadCommonProps } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
pipedriveTransformV1CustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { GetField, GetLeadResponse } from '../common/types';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
export const createLeadAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'create-lead',
|
||||
displayName: 'Create Lead',
|
||||
description: 'Creates a new lead.',
|
||||
props: {
|
||||
title: Property.ShortText({
|
||||
displayName: 'Title',
|
||||
required: true,
|
||||
}),
|
||||
...leadCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
title,
|
||||
leadValue,
|
||||
leadValueCurrency,
|
||||
expectedCloseDate,
|
||||
visibleTo,
|
||||
ownerId,
|
||||
organizationId,
|
||||
personId,
|
||||
channel,
|
||||
} = context.propsValue;
|
||||
|
||||
if (!personId && !organizationId) {
|
||||
throw new Error(
|
||||
'Neither an Organization nor a Person were provided. One of them must be provided in order to create a lead.',
|
||||
);
|
||||
}
|
||||
|
||||
const labelIds = (context.propsValue.labelIds as string[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const leadDefaultFields: Record<string, any> = {
|
||||
title,
|
||||
owner_id: ownerId,
|
||||
organization_id: organizationId,
|
||||
person_id: personId,
|
||||
channel: channel,
|
||||
visible_to: visibleTo,
|
||||
};
|
||||
|
||||
if (labelIds.length > 0) {
|
||||
leadDefaultFields.label_ids = labelIds;
|
||||
}
|
||||
|
||||
if(expectedCloseDate)
|
||||
{
|
||||
leadDefaultFields.expected_close_date= dayjs(expectedCloseDate).format('YYYY-MM-DD')
|
||||
|
||||
}
|
||||
|
||||
if (leadValue) {
|
||||
if (!leadValueCurrency) {
|
||||
throw new Error('lead Value Currency is required when lead Value is provided');
|
||||
}
|
||||
leadDefaultFields.value = {
|
||||
amount: leadValue,
|
||||
currency: leadValueCurrency,
|
||||
};
|
||||
}
|
||||
|
||||
const leadCustomFields: Record<string, any> = {};
|
||||
|
||||
Object.entries(customFields).forEach(([key, value]) => {
|
||||
// Format values if they are arrays
|
||||
leadCustomFields[key] = Array.isArray(value) ? value.join(',') : value;
|
||||
});
|
||||
|
||||
|
||||
const createdLeadResponse = await pipedriveApiCall<GetLeadResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v1/leads',
|
||||
body: {
|
||||
...leadDefaultFields,
|
||||
...leadCustomFields,
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const updatedLeadProperties = pipedriveTransformV1CustomFields(
|
||||
customFieldsResponse,
|
||||
createdLeadResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...createdLeadResponse,
|
||||
data: updatedLeadProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,83 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { dealIdProp, leadIdProp, organizationIdProp, personIdProp } from '../common/props';
|
||||
import { pipedriveApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const createNoteAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'create-note',
|
||||
displayName: 'Create Note',
|
||||
description: 'Creates a new note.',
|
||||
props: {
|
||||
content: Property.LongText({
|
||||
displayName: 'Content',
|
||||
required: true,
|
||||
}),
|
||||
dealId: dealIdProp(false),
|
||||
pinnedToDeal: Property.Checkbox({
|
||||
displayName: 'Pin note to deal?',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
personId: personIdProp(false),
|
||||
pinnedToPerson: Property.Checkbox({
|
||||
displayName: 'Pin note to person?',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
organizationId: organizationIdProp(false),
|
||||
pinnedToOrganization: Property.Checkbox({
|
||||
displayName: 'Pin note to organization?',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
leadId: leadIdProp(false),
|
||||
pinnedToLead: Property.Checkbox({
|
||||
displayName: 'Pin note to lead?',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
content,
|
||||
dealId,
|
||||
personId,
|
||||
organizationId,
|
||||
leadId,
|
||||
pinnedToDeal,
|
||||
pinnedToPerson,
|
||||
pinnedToOrganization,
|
||||
pinnedToLead,
|
||||
} = context.propsValue;
|
||||
|
||||
if (!dealId && !personId && !organizationId && !leadId) {
|
||||
throw new Error(
|
||||
'Note must be associated with at least one organization, person, deal, lead or project.',
|
||||
);
|
||||
}
|
||||
|
||||
const notePayload: Record<string, any> = {
|
||||
content,
|
||||
pinned_to_deal_flag: pinnedToDeal ? 1 : 0,
|
||||
pinned_to_person_flag: pinnedToPerson ? 1 : 0,
|
||||
pinned_to_organization_flag: pinnedToOrganization ? 1 : 0,
|
||||
pinned_to_lead_flag: pinnedToLead ? 1 : 0,
|
||||
lead_id: leadId,
|
||||
person_id: personId,
|
||||
org_id: organizationId,
|
||||
deal_id: dealId,
|
||||
};
|
||||
|
||||
const response = await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v1/notes',
|
||||
body: notePayload,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,79 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { organizationCommonProps } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, GetOrganizationResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const createOrganizationAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'create-organization',
|
||||
displayName: 'Create Organization',
|
||||
description: 'Creates a new organization.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
required: true,
|
||||
}),
|
||||
...organizationCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const { name, ownerId, address, visibleTo } = context.propsValue;
|
||||
|
||||
const labelIds = (context.propsValue.labelIds as number[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const organizationPayload: Record<string, any> = {
|
||||
name: name,
|
||||
owner_id: ownerId,
|
||||
visible_to: visibleTo,
|
||||
};
|
||||
|
||||
if (address) {
|
||||
if (typeof address === 'string') {
|
||||
organizationPayload.address = { value: address };
|
||||
}
|
||||
}
|
||||
|
||||
if (labelIds.length > 0) {
|
||||
organizationPayload.label_ids = labelIds;
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const orgCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(orgCustomFields)) {
|
||||
organizationPayload.custom_fields = orgCustomFields;
|
||||
}
|
||||
|
||||
const createdOrganizationResponse = await pipedriveApiCall<GetOrganizationResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v2/organizations',
|
||||
body: organizationPayload,
|
||||
});
|
||||
|
||||
const transformedPersonProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
createdOrganizationResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...createdOrganizationResponse,
|
||||
data: transformedPersonProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,106 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { personCommonProps } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, GetPersonResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const createPersonAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'create-person',
|
||||
displayName: 'Create Person',
|
||||
description: 'Creates a new person.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
required: false,
|
||||
}),
|
||||
...personCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const { name, ownerId, organizationId, marketing_status, visibleTo, firstName, lastName } =
|
||||
context.propsValue;
|
||||
|
||||
const rawPhones = (context.propsValue.phone as string[]) ?? [];
|
||||
const rawEmails = (context.propsValue.email as string[]) ?? [];
|
||||
const labelIds = (context.propsValue.labelIds as number[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
// https://pipedrive.readme.io/docs/pipedrive-api-v2-migration-guide#post-apiv1persons-to-post-apiv2persons
|
||||
if (name && (firstName || lastName)) {
|
||||
throw new Error('Provide either Name OR First Name/Last Name, not both.');
|
||||
}
|
||||
|
||||
if (!name && !firstName && !lastName) {
|
||||
throw new Error('Provide Name or at least one of First Name / Last Name.');
|
||||
}
|
||||
|
||||
if (!name && ((firstName && !lastName) || (!firstName && lastName))) {
|
||||
throw new Error('If First Name is provided, Last Name must be provided as well.');
|
||||
}
|
||||
|
||||
const phones = rawPhones.map((value, index) => ({
|
||||
value,
|
||||
label: 'work',
|
||||
primary: index === 0,
|
||||
}));
|
||||
|
||||
const emails = rawEmails.map((value, index) => ({
|
||||
value,
|
||||
label: 'work',
|
||||
primary: index === 0,
|
||||
}));
|
||||
|
||||
const personPayload: Record<string, any> = {
|
||||
name,
|
||||
owner_id: ownerId,
|
||||
org_id: organizationId,
|
||||
visible_to: visibleTo,
|
||||
first_name: firstName,
|
||||
last_name: lastName,
|
||||
marketing_status: marketing_status,
|
||||
};
|
||||
|
||||
// Phones and emails
|
||||
if (phones.length) personPayload.phones = phones;
|
||||
if (emails.length) personPayload.emails = emails;
|
||||
if (labelIds.length) personPayload.label_ids = labelIds;
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
const personCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(personCustomFields)) {
|
||||
personPayload.custom_fields = personCustomFields;
|
||||
}
|
||||
|
||||
const createdPersonResponse = await pipedriveApiCall<GetPersonResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v2/persons',
|
||||
body: personPayload,
|
||||
});
|
||||
|
||||
const transformedPersonProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
createdPersonResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...createdPersonResponse,
|
||||
data: transformedPersonProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,137 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { customFieldsProp, ownerIdProp, visibleToProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, GetProductResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const createProductAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'create-product',
|
||||
displayName: 'Create Product',
|
||||
description: 'Creates a new product.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
required: true,
|
||||
}),
|
||||
code: Property.ShortText({
|
||||
displayName: 'Code',
|
||||
required: false,
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
required: false,
|
||||
}),
|
||||
unit: Property.ShortText({
|
||||
displayName: 'Unit',
|
||||
required: false,
|
||||
}),
|
||||
tax: Property.Number({
|
||||
displayName: 'Tax percentage',
|
||||
required: false,
|
||||
}),
|
||||
isActive: Property.Checkbox({
|
||||
displayName: 'Is Active ?',
|
||||
required: false,
|
||||
defaultValue: true,
|
||||
}),
|
||||
ownerId: ownerIdProp('Owner', false),
|
||||
currency: Property.ShortText({
|
||||
displayName: 'Currency',
|
||||
required: false,
|
||||
description: 'Please enter currency code (e.g., "USD", "EUR").',
|
||||
}),
|
||||
price: Property.Number({
|
||||
displayName: 'Price',
|
||||
required: false,
|
||||
}),
|
||||
cost: Property.Number({
|
||||
displayName: 'Cost',
|
||||
required: false,
|
||||
}),
|
||||
overheadCost: Property.Number({
|
||||
displayName: 'Overhead Cost',
|
||||
required: false,
|
||||
}),
|
||||
visibleTo: visibleToProp,
|
||||
customfields: customFieldsProp('product'),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
name,
|
||||
code,
|
||||
description,
|
||||
unit,
|
||||
tax,
|
||||
isActive,
|
||||
ownerId,
|
||||
currency,
|
||||
price,
|
||||
cost,
|
||||
overheadCost,
|
||||
visibleTo,
|
||||
} = context.propsValue;
|
||||
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const productPayload: Record<string, any> = {
|
||||
name,
|
||||
code,
|
||||
description,
|
||||
unit,
|
||||
tax,
|
||||
is_deleted: !isActive,
|
||||
prices: [
|
||||
{
|
||||
price: price ?? 0,
|
||||
currency: currency ?? 'USD',
|
||||
cost: cost ?? 0,
|
||||
direct_cost: overheadCost ?? 0,
|
||||
},
|
||||
],
|
||||
visible_to: visibleTo,
|
||||
};
|
||||
|
||||
if (ownerId) {
|
||||
productPayload.owner_id = ownerId;
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/productFields',
|
||||
});
|
||||
|
||||
const productCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(productCustomFields)) {
|
||||
productPayload.custom_fields = productCustomFields;
|
||||
}
|
||||
|
||||
const createdProductResponse = await pipedriveApiCall<GetProductResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v2/products',
|
||||
body: productPayload,
|
||||
});
|
||||
|
||||
const updatedProductProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
createdProductResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...createdProductResponse,
|
||||
data: updatedProductProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,102 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { activityTypeIdProp, filterIdProp, ownerIdProp } from '../common/props';
|
||||
import { pipedrivePaginatedV2ApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
export const findActivityAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-activity',
|
||||
displayName: 'Find Activity',
|
||||
description: 'Finds an activity by subject.',
|
||||
props: {
|
||||
subject: Property.ShortText({
|
||||
displayName: 'Subject',
|
||||
required: true,
|
||||
}),
|
||||
exactMatch: Property.Checkbox({
|
||||
displayName: 'Exact Match',
|
||||
required: false,
|
||||
defaultValue: true,
|
||||
}),
|
||||
assignTo: ownerIdProp('Assign To', false),
|
||||
type: activityTypeIdProp(false),
|
||||
filterId: filterIdProp('activity', false),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Done',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: 'Not Done',
|
||||
value: 0,
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { subject, assignTo, type, filterId, status, exactMatch } = context.propsValue;
|
||||
|
||||
const response = await pipedrivePaginatedV2ApiCall<{
|
||||
id: number;
|
||||
subject: string;
|
||||
type: string;
|
||||
}>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/activities',
|
||||
query: {
|
||||
owner_id: assignTo,
|
||||
done: status != null ? status === 1 : undefined,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
filter_id: filterId,
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response) || response.length === 0) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const activity of response) {
|
||||
let matched = false;
|
||||
|
||||
if (activity.subject) {
|
||||
if (exactMatch && activity.subject === subject) {
|
||||
matched = true;
|
||||
} else if (!exactMatch && activity.subject.toLowerCase().includes(subject.toLowerCase())) {
|
||||
matched = true;
|
||||
}
|
||||
}
|
||||
|
||||
// If type is provided, require both subject & type match
|
||||
if (type) {
|
||||
if (matched && activity.type === type) {
|
||||
result.push(activity);
|
||||
}
|
||||
} else {
|
||||
if (matched) {
|
||||
result.push(activity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
found: result.length > 0,
|
||||
data: result,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,117 @@
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { searchFieldProp, searchFieldValueProp } from '../common/props';
|
||||
import { DEAL_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
export const findDealAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-deal',
|
||||
displayName: 'Find Deal',
|
||||
description: 'Finds a deal by any field.',
|
||||
props: {
|
||||
searchField: searchFieldProp('deal'),
|
||||
searchFieldValue: searchFieldValueProp('deal'),
|
||||
},
|
||||
async run(context) {
|
||||
const { searchField } = context.propsValue;
|
||||
const fieldValue = context.propsValue.searchFieldValue['field_value'];
|
||||
|
||||
if (isNil(fieldValue)) {
|
||||
throw new Error('Please enter a value for the field');
|
||||
}
|
||||
|
||||
const filter = await pipedriveApiCall<{ data: { id: number } }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v1/filters',
|
||||
body: {
|
||||
name: `Activepieces Find Deal Filter`,
|
||||
type: 'deals',
|
||||
conditions: {
|
||||
glue: 'and',
|
||||
conditions: [
|
||||
{
|
||||
glue: 'and',
|
||||
conditions: [
|
||||
{
|
||||
object: 'deal',
|
||||
field_id: searchField,
|
||||
operator: '=',
|
||||
value: fieldValue,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
glue: 'or',
|
||||
conditions: [
|
||||
{
|
||||
object: 'deal',
|
||||
field_id: searchField,
|
||||
operator: 'IS NOT NULL',
|
||||
value: null,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// Search for deals using the created filter
|
||||
|
||||
const deals = await pipedriveApiCall<{ data: { id: number }[] }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/deals',
|
||||
query: {
|
||||
filter_id: filter.data.id,
|
||||
limit: 1,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
// Delete the temporary filter
|
||||
await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.DELETE,
|
||||
resourceUri: `/v1/filters/${filter.data.id}`,
|
||||
});
|
||||
|
||||
if (isNil(deals.data) || deals.data.length === 0) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
deals.data[0],
|
||||
);
|
||||
|
||||
return {
|
||||
found: true,
|
||||
data: [updatedDealProperties],
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,63 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { personIdProp } from '../common/props';
|
||||
import {
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedrivePaginatedV2ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { GetField } from '../common/types';
|
||||
import { DEAL_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
export const findDealsAssociatedWithPersonAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-deals-associated-with-person',
|
||||
displayName: 'Find Deals Associated With Person',
|
||||
description: 'Finds multiple deals related to a specific person.',
|
||||
props: {
|
||||
personId: personIdProp(true),
|
||||
},
|
||||
async run(context) {
|
||||
const { personId } = context.propsValue;
|
||||
|
||||
const deals = await pipedrivePaginatedV2ApiCall<Record<string, any>>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/deals`,
|
||||
query: {
|
||||
person_id: personId,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(deals) || deals.length === 0) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
for (const deal of deals) {
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(customFieldsResponse, deal);
|
||||
result.push(updatedDealProperties);
|
||||
}
|
||||
|
||||
return {
|
||||
found: true,
|
||||
data: result,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,67 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { pipedrivePaginatedV1ApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
export const findNotesAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-notes',
|
||||
displayName: 'Find Notes',
|
||||
description: 'Finds notes by Deal, Lead, Person, or Organization ID.',
|
||||
props: {
|
||||
objectType: Property.StaticDropdown({
|
||||
displayName: 'Search By',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Deal',
|
||||
value: 'deal_id',
|
||||
},
|
||||
{
|
||||
label: 'Lead',
|
||||
value: 'lead_id',
|
||||
},
|
||||
{
|
||||
label: 'Person',
|
||||
value: 'person_id',
|
||||
},
|
||||
{
|
||||
label: 'Organization',
|
||||
value: 'org_id',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
objectId: Property.ShortText({
|
||||
displayName: 'ID',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const response = await pipedrivePaginatedV1ApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v1/notes`,
|
||||
query: {
|
||||
sort: 'update_time DESC',
|
||||
[context.propsValue.objectType]:context.propsValue.objectId
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response) || response.length === 0) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
found: response.length > 0,
|
||||
data: response,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,116 @@
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { searchFieldProp, searchFieldValueProp } from '../common/props';
|
||||
import { ORGANIZATION_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
export const findOrganizationAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-organization',
|
||||
displayName: 'Find Organization',
|
||||
description: 'Finds an organization.',
|
||||
props: {
|
||||
searchField: searchFieldProp('organization'),
|
||||
searchFieldValue: searchFieldValueProp('organization'),
|
||||
},
|
||||
async run(context) {
|
||||
const { searchField } = context.propsValue;
|
||||
const fieldValue = context.propsValue.searchFieldValue['field_value'];
|
||||
|
||||
if (isNil(fieldValue)) {
|
||||
throw new Error('Please enter a value for the field');
|
||||
}
|
||||
|
||||
// create Filter
|
||||
const filter = await pipedriveApiCall<{ data: { id: number } }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v1/filters',
|
||||
body: {
|
||||
name: 'Activepieces Find Organization Filter',
|
||||
type: 'org',
|
||||
conditions: {
|
||||
glue: 'and',
|
||||
conditions: [
|
||||
{
|
||||
glue: 'and',
|
||||
conditions: [
|
||||
{
|
||||
object: 'organization',
|
||||
field_id: searchField,
|
||||
operator: '=',
|
||||
value: fieldValue,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
glue: 'or',
|
||||
conditions: [
|
||||
{
|
||||
object: 'organization',
|
||||
field_id: searchField,
|
||||
operator: 'IS NOT NULL',
|
||||
value: null,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const organizations = await pipedriveApiCall<{ data: { id: number }[] }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/organizations',
|
||||
query: {
|
||||
filter_id: filter.data.id,
|
||||
limit: 1,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: ORGANIZATION_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
// delete the filter
|
||||
await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.DELETE,
|
||||
resourceUri: `/v1/filters/${filter.data.id}`,
|
||||
});
|
||||
|
||||
if (isNil(organizations.data) || organizations.data.length === 0) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const updatedOrganizationProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
organizations.data[0],
|
||||
);
|
||||
|
||||
return {
|
||||
found: true,
|
||||
data: [updatedOrganizationProperties],
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,117 @@
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { searchFieldProp, searchFieldValueProp } from '../common/props';
|
||||
import { PERSON_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
export const findPersonAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-person',
|
||||
displayName: 'Find Person',
|
||||
description: 'Finds a person.',
|
||||
props: {
|
||||
searchField: searchFieldProp('person'),
|
||||
searchFieldValue: searchFieldValueProp('person'),
|
||||
},
|
||||
async run(context) {
|
||||
const { searchField } = context.propsValue;
|
||||
const fieldValue = context.propsValue.searchFieldValue['field_value'];
|
||||
|
||||
if (isNil(fieldValue)) {
|
||||
throw new Error('Please enter a value for the field');
|
||||
}
|
||||
|
||||
// create Filter
|
||||
const filter = await pipedriveApiCall<{ data: { id: number } }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v1/filters',
|
||||
body: {
|
||||
name: 'Activepieces Find Person Filter',
|
||||
type: 'people',
|
||||
conditions: {
|
||||
glue: 'and',
|
||||
conditions: [
|
||||
{
|
||||
glue: 'and',
|
||||
conditions: [
|
||||
{
|
||||
object: 'person',
|
||||
field_id: searchField,
|
||||
operator: '=',
|
||||
value: fieldValue,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
glue: 'or',
|
||||
conditions: [
|
||||
{
|
||||
object: 'person',
|
||||
field_id: searchField,
|
||||
operator: 'IS NOT NULL',
|
||||
value: null,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// search for persons using the filter
|
||||
const persons = await pipedriveApiCall<{ data: { id: number }[] }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/persons',
|
||||
query: {
|
||||
filter_id: filter.data.id,
|
||||
limit: 1,
|
||||
sort_by:'update_time',
|
||||
sort_direction:'desc',
|
||||
include_fields:PERSON_OPTIONAL_FIELDS.join(',')
|
||||
},
|
||||
});
|
||||
|
||||
// delete the filter
|
||||
await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.DELETE,
|
||||
resourceUri: `/v1/filters/${filter.data.id}`,
|
||||
});
|
||||
|
||||
if (isNil(persons.data) || persons.data.length === 0) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
const updatedPersonProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
persons.data[0],
|
||||
);
|
||||
|
||||
return {
|
||||
found: true,
|
||||
data: [updatedPersonProperties],
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,76 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
export const findProductAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-product',
|
||||
displayName: 'Find Product',
|
||||
description: 'Finds a product by name ',
|
||||
props: {
|
||||
searchTerm: Property.ShortText({
|
||||
displayName: 'Search Term',
|
||||
required: true,
|
||||
}),
|
||||
|
||||
},
|
||||
async run(context) {
|
||||
const { searchTerm } = context.propsValue;
|
||||
|
||||
|
||||
const searchResponse = await pipedriveApiCall<{
|
||||
success: boolean;
|
||||
data: { items: Array<{ item: { id: number; name: string; } }> };
|
||||
}>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/products/search',
|
||||
query: {
|
||||
term: searchTerm,
|
||||
fields: 'name',
|
||||
limit: 1,
|
||||
include_fields:'product.price'
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(searchResponse.data) || isNil(searchResponse.data.items) || searchResponse.data.items.length === 0) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
|
||||
const productDetailsResponse = await pipedriveApiCall<Record<string, any>>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/products/${searchResponse.data.items[0].item.id}`,
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/productFields',
|
||||
});
|
||||
|
||||
// Transform custom fields in the response data
|
||||
const updatedProductProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
productDetailsResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
found: true,
|
||||
data: [updatedProductProperties],
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,91 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedrivePaginatedV2ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod, QueryParams } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { GetField } from '../common/types';
|
||||
|
||||
export const findProductsAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-products',
|
||||
displayName: 'Find Products',
|
||||
description: 'Finds a product or products by name or product code.',
|
||||
props: {
|
||||
field: Property.StaticDropdown({
|
||||
displayName: 'Field to search by',
|
||||
required: true,
|
||||
defaultValue: 'name',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Name',
|
||||
value: 'name',
|
||||
},
|
||||
{
|
||||
label: 'Product Code',
|
||||
value: 'code',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
fieldValue: Property.ShortText({
|
||||
displayName: 'Field Value',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const qs: QueryParams = {
|
||||
term: context.propsValue.fieldValue,
|
||||
fields: context.propsValue.field,
|
||||
exact_match: 'true',
|
||||
limit: '100',
|
||||
};
|
||||
|
||||
let cursor: string | undefined = undefined;
|
||||
|
||||
let hasMoreItems = true;
|
||||
const products = [];
|
||||
|
||||
do {
|
||||
if (cursor) {
|
||||
qs.cursor = cursor;
|
||||
}
|
||||
const response = await pipedriveApiCall<{
|
||||
success: boolean;
|
||||
data: { items: Array<{ item: { id: number } }> };
|
||||
additional_data: {
|
||||
next_cursor?: string;
|
||||
};
|
||||
}>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/products/search',
|
||||
query: {
|
||||
term: context.propsValue.fieldValue,
|
||||
fields: context.propsValue.field,
|
||||
exact_match: 'true',
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data.items)) break;
|
||||
|
||||
for (const product of response.data.items) {
|
||||
products.push(product.item);
|
||||
}
|
||||
hasMoreItems = response.additional_data?.next_cursor != null;
|
||||
cursor = response.additional_data?.next_cursor;
|
||||
} while (hasMoreItems);
|
||||
|
||||
return {
|
||||
found: products.length > 0,
|
||||
data: products,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,55 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { pipedriveApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const findUserAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'find-user',
|
||||
displayName: 'Find User',
|
||||
description: 'Finds a user by name or email.',
|
||||
props: {
|
||||
field: Property.StaticDropdown({
|
||||
displayName: 'Field to search by',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Name',
|
||||
value: 'name',
|
||||
},
|
||||
{
|
||||
label: 'Email',
|
||||
value: 'email',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
fieldValue: Property.ShortText({
|
||||
displayName: 'Field Value',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { field, fieldValue } = context.propsValue;
|
||||
|
||||
const response = await pipedriveApiCall<{ success: boolean; data: Array<Record<string, any>> }>(
|
||||
{
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/users/find',
|
||||
query: {
|
||||
term: fieldValue,
|
||||
search_by_email: field == 'email' ? 1 : 0,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
return {
|
||||
found: response.data && response.data.length > 0,
|
||||
data: response.data,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,33 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { pipedriveApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const getNoteAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'get-note',
|
||||
displayName: 'Retrieve a Note',
|
||||
description: 'Finds a note by ID.',
|
||||
props: {
|
||||
noteId: Property.Number({
|
||||
displayName: 'Note ID',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
try {
|
||||
const response = await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v1/notes/${context.propsValue.noteId}`,
|
||||
});
|
||||
return response;
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
data:{}
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,54 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { GetField } from '../common/types';
|
||||
|
||||
export const getProductAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'get-product',
|
||||
displayName: 'Retrieve a Product',
|
||||
description: 'Finds a product by ID.',
|
||||
props: {
|
||||
productId: Property.Number({
|
||||
displayName: 'Product ID',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
try {
|
||||
const response = await pipedriveApiCall<Record<string, any>>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/products/${context.propsValue.productId}`,
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/productFields',
|
||||
});
|
||||
|
||||
const updatedProductProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
response.data,
|
||||
);
|
||||
|
||||
return {
|
||||
found: true,
|
||||
data: [updatedProductProperties],
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
found: false,
|
||||
data: [],
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,82 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { activityCommonProps } from '../common/props';
|
||||
import { pipedriveApiCall } from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
export const updateActivityAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'update-activity',
|
||||
displayName: 'Update Activity',
|
||||
description: 'Updates an existing activity.',
|
||||
props: {
|
||||
activityId: Property.Number({
|
||||
displayName: 'Activity ID',
|
||||
required: true,
|
||||
}),
|
||||
subject: Property.ShortText({
|
||||
displayName: 'Subject',
|
||||
required: false,
|
||||
}),
|
||||
...activityCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
activityId,
|
||||
subject,
|
||||
organizationId,
|
||||
personId,
|
||||
dealId,
|
||||
leadId,
|
||||
assignTo, // This is the user ID for the assignee
|
||||
type,
|
||||
dueDate,
|
||||
dueTime,
|
||||
duration,
|
||||
isDone,
|
||||
busy,
|
||||
note,
|
||||
publicDescription,
|
||||
} = context.propsValue;
|
||||
|
||||
const activityPayload: Record<string, any> = {
|
||||
subject,
|
||||
org_id: organizationId,
|
||||
deal_id: dealId,
|
||||
lead_id: leadId,
|
||||
note,
|
||||
public_description: publicDescription,
|
||||
type,
|
||||
owner_id: assignTo,
|
||||
due_time: dueTime,
|
||||
duration,
|
||||
done: isDone,
|
||||
};
|
||||
|
||||
|
||||
if (personId) {
|
||||
activityPayload.participants = [{ person_id: personId, primary: true }];
|
||||
}
|
||||
|
||||
if (busy) {
|
||||
activityPayload.busy = busy === 'busy' ? true : false;
|
||||
}
|
||||
|
||||
if (dueDate) {
|
||||
|
||||
activityPayload.due_date = dayjs(dueDate).format('YYYY-MM-DD');
|
||||
}
|
||||
|
||||
|
||||
const response = await pipedriveApiCall({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: `/v2/activities/${activityId}`,
|
||||
body: activityPayload,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,101 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { dealCommonProps, dealIdProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { GetField, GetDealResponse } from '../common/types';
|
||||
import dayjs from 'dayjs';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const updateDealAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'update-deal',
|
||||
displayName: 'Update Deal',
|
||||
description: 'Updates an existing deal.',
|
||||
props: {
|
||||
dealId: dealIdProp(true),
|
||||
title: Property.ShortText({
|
||||
displayName: 'Title',
|
||||
required: false,
|
||||
}),
|
||||
...dealCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
dealId,
|
||||
title,
|
||||
dealValue,
|
||||
dealValueCurrency,
|
||||
expectedCloseDate,
|
||||
visibleTo,
|
||||
probability,
|
||||
stageId,
|
||||
status,
|
||||
pipelineId,
|
||||
ownerId,
|
||||
organizationId,
|
||||
personId,
|
||||
} = context.propsValue;
|
||||
|
||||
const labelIds = (context.propsValue.labelIds as number[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const dealPayload: Record<string, any> = {
|
||||
title,
|
||||
pipeline_id: pipelineId,
|
||||
stage_id: stageId,
|
||||
status,
|
||||
probability,
|
||||
visible_to: visibleTo,
|
||||
owner_id: ownerId,
|
||||
org_id: organizationId,
|
||||
person_id: personId,
|
||||
value: dealValue,
|
||||
currency: dealValueCurrency,
|
||||
};
|
||||
|
||||
if (labelIds.length > 0) {
|
||||
dealPayload.label_ids = labelIds;
|
||||
}
|
||||
|
||||
if (expectedCloseDate) {
|
||||
dealPayload.expected_close_date = dayjs(expectedCloseDate).format('YYYY-MM-DD');
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const personCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(personCustomFields)) {
|
||||
dealPayload.custom_fields = personCustomFields;
|
||||
}
|
||||
|
||||
const updatedDealResponse = await pipedriveApiCall<GetDealResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: `/v2/deals/${dealId}`,
|
||||
body: dealPayload,
|
||||
});
|
||||
|
||||
const transformedDealProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
updatedDealResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...updatedDealResponse,
|
||||
data: transformedDealProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,105 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { leadCommonProps, leadIdProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformV1CustomFields,
|
||||
} from '../common';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { GetField, GetLeadResponse } from '../common/types';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
export const updateLeadAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'update-lead',
|
||||
displayName: 'Update Lead',
|
||||
description: 'Updates an existing lead.',
|
||||
props: {
|
||||
leadId: leadIdProp(true),
|
||||
title: Property.ShortText({
|
||||
displayName: 'Title',
|
||||
required: false,
|
||||
}),
|
||||
...leadCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
title,
|
||||
ownerId,
|
||||
leadId,
|
||||
channel,
|
||||
organizationId,
|
||||
personId,
|
||||
expectedCloseDate,
|
||||
visibleTo,
|
||||
leadValue,
|
||||
leadValueCurrency,
|
||||
} = context.propsValue;
|
||||
|
||||
const labelIds = (context.propsValue.labelIds as string[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const leadDefaultFields: Record<string, any> = {
|
||||
title,
|
||||
owner_id: ownerId,
|
||||
organization_id: organizationId,
|
||||
person_id: personId,
|
||||
channel: channel,
|
||||
visible_to: visibleTo,
|
||||
};
|
||||
|
||||
if (labelIds.length > 0) {
|
||||
leadDefaultFields.label_ids = labelIds;
|
||||
}
|
||||
|
||||
if (expectedCloseDate) {
|
||||
leadDefaultFields.expected_close_date = dayjs(expectedCloseDate).format('YYYY-MM-DD');
|
||||
}
|
||||
|
||||
if (leadValue) {
|
||||
if (!leadValueCurrency) {
|
||||
throw new Error('lead Value Currency is required when lead Value is provided');
|
||||
}
|
||||
leadDefaultFields.value = {
|
||||
amount: leadValue,
|
||||
currency: leadValueCurrency,
|
||||
};
|
||||
}
|
||||
|
||||
const leadCustomFields: Record<string, any> = {};
|
||||
|
||||
Object.entries(customFields).forEach(([key, value]) => {
|
||||
// Format values if they are arrays
|
||||
leadCustomFields[key] = Array.isArray(value) && value.length > 0 ? value.join(',') : value;
|
||||
});
|
||||
|
||||
const updatedLeadResponse = await pipedriveApiCall<GetLeadResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: `/v1/leads/${leadId}`,
|
||||
body: {
|
||||
...leadDefaultFields,
|
||||
...leadCustomFields,
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const transformedLeadProperties = pipedriveTransformV1CustomFields(
|
||||
customFieldsResponse,
|
||||
updatedLeadResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...updatedLeadResponse,
|
||||
data: transformedLeadProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,80 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { organizationCommonProps, organizationIdProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, GetOrganizationResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const updateOrganizationAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'update-organization',
|
||||
displayName: 'Update Organization',
|
||||
description: 'Updates an existing organization.',
|
||||
props: {
|
||||
organizationId: organizationIdProp(true),
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
required: false,
|
||||
}),
|
||||
...organizationCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const { name, ownerId, address, visibleTo, organizationId } = context.propsValue;
|
||||
|
||||
const labelIds = (context.propsValue.labelIds as number[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const organizationPayload: Record<string, any> = {
|
||||
name: name,
|
||||
owner_id: ownerId,
|
||||
visible_to: visibleTo,
|
||||
};
|
||||
|
||||
if (address) {
|
||||
if (typeof address === 'string') {
|
||||
organizationPayload.address = { value: address };
|
||||
}
|
||||
}
|
||||
|
||||
if (labelIds.length > 0) {
|
||||
organizationPayload.label_ids = labelIds;
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const orgCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(orgCustomFields)) {
|
||||
organizationPayload.custom_fields = orgCustomFields;
|
||||
}
|
||||
|
||||
const updatedOrganizationResponse = await pipedriveApiCall<GetOrganizationResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: `/v2/organizations/${organizationId}`,
|
||||
body: organizationPayload,
|
||||
});
|
||||
|
||||
const transformedOrganizationProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
updatedOrganizationResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...updatedOrganizationResponse,
|
||||
data: transformedOrganizationProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,108 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { personCommonProps, personIdProp, customFieldsProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, GetPersonResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const updatePersonAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'update-person',
|
||||
displayName: 'Update Person',
|
||||
description: 'Updates an existing person.',
|
||||
props: {
|
||||
personId: personIdProp(true),
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
required: false,
|
||||
}),
|
||||
...personCommonProps,
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
name,
|
||||
ownerId,
|
||||
personId,
|
||||
organizationId,
|
||||
marketing_status,
|
||||
visibleTo,
|
||||
firstName,
|
||||
lastName,
|
||||
} = context.propsValue;
|
||||
|
||||
const rawPhones = (context.propsValue.phone as string[]) ?? [];
|
||||
const rawEmails = (context.propsValue.email as string[]) ?? [];
|
||||
const labelIds = (context.propsValue.labelIds as number[]) ?? [];
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
|
||||
|
||||
if ((firstName && !lastName) || (!firstName && lastName)) {
|
||||
throw new Error('If First Name is provided, Last Name must be provided as well.');
|
||||
}
|
||||
|
||||
const phones = rawPhones.map((value, index) => ({
|
||||
value,
|
||||
label: 'work',
|
||||
primary: index === 0,
|
||||
}));
|
||||
|
||||
const emails = rawEmails.map((value, index) => ({
|
||||
value,
|
||||
label: 'work',
|
||||
primary: index === 0,
|
||||
}));
|
||||
|
||||
const personPayload: Record<string, any> = {
|
||||
name: name,
|
||||
owner_id: ownerId,
|
||||
org_id: organizationId,
|
||||
marketing_status: marketing_status,
|
||||
visible_to: visibleTo,
|
||||
first_name: firstName,
|
||||
last_name: lastName,
|
||||
};
|
||||
|
||||
// Phones and emails
|
||||
if (phones.length) personPayload.phones = phones;
|
||||
if (emails.length) personPayload.emails = emails;
|
||||
if (labelIds.length) personPayload.label_ids = labelIds;
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
const personCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(personCustomFields)) {
|
||||
personPayload.custom_fields = personCustomFields;
|
||||
}
|
||||
|
||||
const updatedPersonResponse = await pipedriveApiCall<GetPersonResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: `/v2/persons/${personId}`,
|
||||
body: personPayload,
|
||||
});
|
||||
|
||||
const transformedPersonProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
updatedPersonResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...updatedPersonResponse,
|
||||
data: transformedPersonProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,142 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { customFieldsProp, ownerIdProp, visibleToProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveParseCustomFields,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, GetProductResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
|
||||
export const updateProductAction = createAction({
|
||||
auth: pipedriveAuth,
|
||||
name: 'update-product',
|
||||
displayName: 'Update Product',
|
||||
description: 'Updates an existing product.',
|
||||
props: {
|
||||
id: Property.ShortText({
|
||||
displayName: 'Product ID',
|
||||
required: true,
|
||||
}),
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
required: false,
|
||||
}),
|
||||
code: Property.ShortText({
|
||||
displayName: 'Code',
|
||||
required: false,
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
required: false,
|
||||
}),
|
||||
unit: Property.ShortText({
|
||||
displayName: 'Unit',
|
||||
required: false,
|
||||
}),
|
||||
tax: Property.Number({
|
||||
displayName: 'Tax percentage',
|
||||
required: false,
|
||||
}),
|
||||
isActive: Property.Checkbox({
|
||||
displayName: 'Is Active ?',
|
||||
required: false,
|
||||
defaultValue: true,
|
||||
}),
|
||||
ownerId: ownerIdProp('Owner', false),
|
||||
currency: Property.ShortText({
|
||||
displayName: 'Currency',
|
||||
required: false,
|
||||
description: 'Please enter currency code (e.g., "USD", "EUR").',
|
||||
}),
|
||||
price: Property.Number({
|
||||
displayName: 'Price',
|
||||
required: false,
|
||||
}),
|
||||
cost: Property.Number({
|
||||
displayName: 'Cost',
|
||||
required: false,
|
||||
}),
|
||||
overheadCost: Property.Number({
|
||||
displayName: 'Overhead Cost',
|
||||
required: false,
|
||||
}),
|
||||
visibleTo: visibleToProp,
|
||||
customfields: customFieldsProp('product'),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
id,
|
||||
name,
|
||||
code,
|
||||
description,
|
||||
unit,
|
||||
tax,
|
||||
isActive,
|
||||
ownerId,
|
||||
currency,
|
||||
price,
|
||||
cost,
|
||||
overheadCost,
|
||||
visibleTo,
|
||||
} = context.propsValue;
|
||||
|
||||
const customFields = context.propsValue.customfields ?? {};
|
||||
|
||||
const productPayload: Record<string, any> = {
|
||||
name,
|
||||
code,
|
||||
description,
|
||||
unit,
|
||||
tax,
|
||||
is_deleted: !isActive,
|
||||
prices: [
|
||||
{
|
||||
price: price ?? 0,
|
||||
currency: currency ?? 'USD',
|
||||
cost: cost ?? 0,
|
||||
direct_cost: overheadCost ?? 0,
|
||||
},
|
||||
],
|
||||
visible_to: visibleTo,
|
||||
};
|
||||
|
||||
if (ownerId) {
|
||||
productPayload.owner_id = ownerId;
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/productFields',
|
||||
});
|
||||
|
||||
const productCustomFields = pipedriveParseCustomFields(customFieldsResponse, customFields);
|
||||
|
||||
if (!isEmpty(productCustomFields)) {
|
||||
productPayload.custom_fields = productCustomFields;
|
||||
}
|
||||
|
||||
const updatedProductResponse = await pipedriveApiCall<GetProductResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: '/v2/products/' + id,
|
||||
body: productPayload,
|
||||
});
|
||||
|
||||
const updatedProductProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
updatedProductResponse.data,
|
||||
);
|
||||
|
||||
return {
|
||||
...updatedProductResponse,
|
||||
data: updatedProductProperties,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,62 @@
|
||||
export const PERSON_OPTIONAL_FIELDS = [
|
||||
'next_activity_id',
|
||||
'last_activity_id',
|
||||
'open_deals_count',
|
||||
'related_open_deals_count',
|
||||
'closed_deals_count',
|
||||
'related_closed_deals_count',
|
||||
'participant_open_deals_count',
|
||||
'participant_closed_deals_count',
|
||||
'email_messages_count',
|
||||
'activities_count',
|
||||
'done_activities_count',
|
||||
'undone_activities_count',
|
||||
'files_count',
|
||||
'notes_count',
|
||||
'followers_count',
|
||||
'related_won_deals_count',
|
||||
'lost_deals_count',
|
||||
'related_lost_deals_count',
|
||||
'last_incoming_mail_time',
|
||||
'last_outgoing_mail_time',
|
||||
'won_deals_count',
|
||||
];
|
||||
|
||||
export const DEAL_OPTIONAL_FIELDS = [
|
||||
'next_activity_id',
|
||||
'last_activity_id',
|
||||
'first_won_time',
|
||||
'products_count',
|
||||
'files_count',
|
||||
'notes_count',
|
||||
'followers_count',
|
||||
'email_messages_count',
|
||||
'activities_count',
|
||||
'done_activities_count',
|
||||
'undone_activities_count',
|
||||
'participants_count',
|
||||
'last_incoming_mail_time',
|
||||
'last_outgoing_mail_time',
|
||||
'smart_bcc_email',
|
||||
];
|
||||
|
||||
export const ORGANIZATION_OPTIONAL_FIELDS = [
|
||||
'next_activity_id',
|
||||
'last_activity_id',
|
||||
'open_deals_count',
|
||||
'related_open_deals_count',
|
||||
'closed_deals_count',
|
||||
'related_closed_deals_count',
|
||||
'email_messages_count',
|
||||
'people_count',
|
||||
'activities_count',
|
||||
'done_activities_count',
|
||||
'undone_activities_count',
|
||||
'files_count',
|
||||
'notes_count',
|
||||
'followers_count',
|
||||
'won_deals_count',
|
||||
'related_won_deals_count',
|
||||
'lost_deals_count',
|
||||
'related_lost_deals_count',
|
||||
];
|
||||
@@ -0,0 +1,341 @@
|
||||
import {
|
||||
AuthenticationType,
|
||||
httpClient,
|
||||
HttpError,
|
||||
HttpMessageBody,
|
||||
HttpMethod,
|
||||
HttpRequest,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { GetField, PaginatedV2Response, PaginatedV1Response, RequestParams } from './types';
|
||||
import { isEmpty, isNil } from '@activepieces/shared';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
type FlexibleQueryParams = Record<
|
||||
string,
|
||||
string | number | boolean | string[] | number[] | null | undefined
|
||||
>;
|
||||
|
||||
export const pipedriveCommon = {
|
||||
subscribeWebhook: async (
|
||||
object: string,
|
||||
action: string,
|
||||
webhookUrl: string,
|
||||
apiDomain: string,
|
||||
accessToken: string,
|
||||
) => {
|
||||
const request: HttpRequest = {
|
||||
method: HttpMethod.POST,
|
||||
url: `${apiDomain}/api/v1/webhooks`,
|
||||
body: {
|
||||
event_object: object,
|
||||
event_action: action,
|
||||
subscription_url: webhookUrl,
|
||||
version: '2.0',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: accessToken,
|
||||
},
|
||||
queryParams: {},
|
||||
};
|
||||
|
||||
const { body: webhook } = await httpClient.sendRequest<{
|
||||
data: { id: string };
|
||||
}>(request);
|
||||
return webhook;
|
||||
},
|
||||
|
||||
unsubscribeWebhook: async (webhookId: string, apiDomain: string, accessToken: string) => {
|
||||
const request: HttpRequest = {
|
||||
method: HttpMethod.DELETE,
|
||||
url: `${apiDomain}/api/v1/webhooks/${webhookId}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: accessToken,
|
||||
},
|
||||
};
|
||||
return await httpClient.sendRequest(request);
|
||||
},
|
||||
};
|
||||
|
||||
export type PipedriveApiCallParams = {
|
||||
accessToken: string;
|
||||
apiDomain: string;
|
||||
method: HttpMethod;
|
||||
resourceUri: string;
|
||||
query?: RequestParams;
|
||||
body?: any;
|
||||
};
|
||||
|
||||
export async function pipedriveApiCall<T extends HttpMessageBody>({
|
||||
accessToken,
|
||||
apiDomain,
|
||||
method,
|
||||
resourceUri,
|
||||
query,
|
||||
body,
|
||||
}: PipedriveApiCallParams): Promise<T> {
|
||||
const url = `${apiDomain}/api${resourceUri}`;
|
||||
|
||||
const qs: Record<string, string> = {};
|
||||
if (query) {
|
||||
for (const [key, value] of Object.entries(query)) {
|
||||
if (value !== null && value !== undefined) {
|
||||
qs[key] = Array.isArray(value) ? value.map(String).join(',') : String(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let requestBody: any;
|
||||
if (body) {
|
||||
requestBody = Object.entries(body).reduce((acc, [key, value]) => {
|
||||
if (!isNil(value)) {
|
||||
acc[key] = value;
|
||||
}
|
||||
return acc;
|
||||
}, {} as Record<string, any>);
|
||||
}
|
||||
|
||||
const request: HttpRequest = {
|
||||
method,
|
||||
url,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: accessToken,
|
||||
},
|
||||
queryParams: qs,
|
||||
body: requestBody,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<T>(request);
|
||||
return response.body;
|
||||
} catch (error) {
|
||||
if (error instanceof HttpError) {
|
||||
if (error.response.status === 403) {
|
||||
throw new Error('Please reconnect your Pipedrive account.');
|
||||
}
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
export async function pipedrivePaginatedV1ApiCall<T extends HttpMessageBody>({
|
||||
accessToken,
|
||||
apiDomain,
|
||||
method,
|
||||
resourceUri,
|
||||
query,
|
||||
body,
|
||||
}: PipedriveApiCallParams): Promise<T[]> {
|
||||
const qs = query ? query : {};
|
||||
|
||||
qs.start = 0;
|
||||
qs.limit = 500;
|
||||
|
||||
const resultData: T[] = [];
|
||||
let hasMoreItems = true;
|
||||
|
||||
do {
|
||||
const response = await pipedriveApiCall<PaginatedV1Response<T>>({
|
||||
accessToken,
|
||||
apiDomain,
|
||||
method,
|
||||
resourceUri,
|
||||
query: qs,
|
||||
body,
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
break;
|
||||
}
|
||||
|
||||
resultData.push(...response.data);
|
||||
qs.start = response.additional_data.pagination.next_start;
|
||||
hasMoreItems = response.additional_data.pagination.more_items_in_collection;
|
||||
} while (hasMoreItems);
|
||||
|
||||
return resultData;
|
||||
}
|
||||
|
||||
export async function pipedrivePaginatedV2ApiCall<T extends HttpMessageBody>({
|
||||
accessToken,
|
||||
apiDomain,
|
||||
method,
|
||||
resourceUri,
|
||||
query,
|
||||
body,
|
||||
}: PipedriveApiCallParams): Promise<T[]> {
|
||||
const qs: FlexibleQueryParams = query ? { ...query } : {};
|
||||
|
||||
let cursor: string | undefined = undefined;
|
||||
const resultData: T[] = [];
|
||||
let hasMoreItems = true;
|
||||
|
||||
|
||||
do {
|
||||
const currentQuery: FlexibleQueryParams = { ...qs };
|
||||
if (cursor) {
|
||||
currentQuery.cursor = cursor;
|
||||
}
|
||||
currentQuery.limit = 500;
|
||||
|
||||
const response = await pipedriveApiCall<PaginatedV2Response<T>>({
|
||||
accessToken,
|
||||
apiDomain,
|
||||
method,
|
||||
resourceUri,
|
||||
query: currentQuery as RequestParams,
|
||||
body,
|
||||
});
|
||||
|
||||
|
||||
if (isNil(response.data)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (Array.isArray(response.data)) {
|
||||
resultData.push(...response.data);
|
||||
} else {
|
||||
resultData.push(response.data);
|
||||
}
|
||||
|
||||
hasMoreItems = response.additional_data?.next_cursor != null;
|
||||
cursor = response.additional_data?.next_cursor;
|
||||
} while (hasMoreItems && cursor);
|
||||
|
||||
return resultData;
|
||||
}
|
||||
|
||||
function formatDateIfValid(val: any) {
|
||||
return dayjs(val).isValid() ? dayjs(val).format('YYYY-MM-DD') : val;
|
||||
}
|
||||
|
||||
export function pipedriveParseCustomFields(
|
||||
customFieldsDefinitions: GetField[],
|
||||
inputData: Record<string, any>,
|
||||
): Record<string, any> {
|
||||
const fieldTypeMap: Record<string, GetField> = customFieldsDefinitions.reduce((acc, field) => {
|
||||
acc[field.key] = field;
|
||||
return acc;
|
||||
}, {} as Record<string, GetField>);
|
||||
|
||||
const parsedFields: Record<string, any> = {};
|
||||
|
||||
for (const [key, value] of Object.entries(inputData)) {
|
||||
if (isEmpty(value)) continue;
|
||||
|
||||
const matchedField = fieldTypeMap[key];
|
||||
if (!matchedField) continue;
|
||||
|
||||
// https://pipedrive.readme.io/docs/pipedrive-api-v2-migration-guide#custom-fields
|
||||
if (matchedField.is_subfield) {
|
||||
const parentField = key.split('_')[0];
|
||||
parsedFields[parentField] = {
|
||||
...parsedFields[parentField],
|
||||
[matchedField.id_suffix]: matchedField.field_type === "date" ? formatDateIfValid(value) : value,
|
||||
};
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (matchedField.field_type) {
|
||||
case 'monetary':
|
||||
parsedFields[key] = { ...parsedFields[key], value: Number(value) };
|
||||
break;
|
||||
case 'address':
|
||||
case 'daterange':
|
||||
case 'timerange':
|
||||
case 'time':
|
||||
parsedFields[key] = { ...parsedFields[key], value: formatDateIfValid(value) };
|
||||
break;
|
||||
case 'date':
|
||||
parsedFields[key] = formatDateIfValid(value);
|
||||
break;
|
||||
default:
|
||||
parsedFields[key] = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return parsedFields;
|
||||
}
|
||||
|
||||
export function pipedriveTransformCustomFields(
|
||||
customFieldsDefinitions: GetField[],
|
||||
responseData: Record<string, any>,
|
||||
): Record<string, any> {
|
||||
const updatedResponseData = { ...responseData };
|
||||
|
||||
const rawCustomFields = responseData.custom_fields || {};
|
||||
|
||||
for (const field of customFieldsDefinitions) {
|
||||
if (!field.edit_flag) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const oldKey = field.key;
|
||||
const newKey = field.name;
|
||||
const fieldType = field.field_type;
|
||||
|
||||
if (oldKey in rawCustomFields) {
|
||||
const value = rawCustomFields[oldKey];
|
||||
|
||||
if (isNil(value)) {
|
||||
updatedResponseData[newKey] = null;
|
||||
} else if (fieldType === 'enum') {
|
||||
updatedResponseData[newKey] =
|
||||
field.options?.find((option) => option.id === value)?.label || null;
|
||||
} else if (fieldType === 'set') {
|
||||
if (Array.isArray(value)) {
|
||||
updatedResponseData[newKey] = value.map(
|
||||
(item) => field.options?.find((option) => option.id === item)?.label || null,
|
||||
);
|
||||
} else {
|
||||
updatedResponseData[newKey] = value;
|
||||
}
|
||||
} else {
|
||||
updatedResponseData[newKey] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete updatedResponseData.custom_fields;
|
||||
|
||||
return updatedResponseData;
|
||||
}
|
||||
|
||||
|
||||
export function pipedriveTransformV1CustomFields(
|
||||
CustomFields: GetField[],
|
||||
responseData: Record<string, any>,
|
||||
): Record<string, any> {
|
||||
const updatedResponseData = { ...responseData };
|
||||
|
||||
for (const field of CustomFields) {
|
||||
if (!field.edit_flag) {
|
||||
continue;
|
||||
}
|
||||
const oldKey = field.key;
|
||||
const newKey = field.name;
|
||||
const fieldType = field.field_type;
|
||||
|
||||
if (oldKey in responseData) {
|
||||
if (responseData[oldKey] === null || responseData[oldKey] === undefined) {
|
||||
updatedResponseData[newKey] = null;
|
||||
} else if (fieldType === 'enum') {
|
||||
updatedResponseData[newKey] =
|
||||
field.options?.find((option) => option.id.toString() === responseData[oldKey])?.label ||
|
||||
null;
|
||||
} else if (fieldType === 'set') {
|
||||
const values: string[] = responseData[oldKey].split(',');
|
||||
updatedResponseData[newKey] = values.map(
|
||||
(item) => field.options?.find((option) => option.id.toString() === item)?.label || null,
|
||||
);
|
||||
} else {
|
||||
updatedResponseData[newKey] = responseData[oldKey];
|
||||
}
|
||||
delete updatedResponseData[oldKey];
|
||||
}
|
||||
}
|
||||
return updatedResponseData;
|
||||
}
|
||||
@@ -0,0 +1,963 @@
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { pipedriveApiCall, pipedrivePaginatedV1ApiCall, pipedrivePaginatedV2ApiCall } from '.';
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import {
|
||||
DropdownOption,
|
||||
DynamicPropsValue,
|
||||
PiecePropValueSchema,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { GetField, StageWithPipelineInfo } from './types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { context } from '@opentelemetry/api';
|
||||
|
||||
/**
|
||||
* Fetches options for Pipedrive filters.
|
||||
* @param auth Pipedrive authentication.
|
||||
* @param type The type of object for the filter (e.g., 'deals', 'people', 'org').
|
||||
* @returns Dropdown options for filters.
|
||||
*/
|
||||
export async function fetchFiltersOptions(
|
||||
auth: PiecePropValueSchema<typeof pipedriveAuth>,
|
||||
type: string,
|
||||
): Promise<DropdownOption<number>[]> {
|
||||
const filters = await pipedriveApiCall<{ data: Array<{ id: number; name: string }> }>({
|
||||
accessToken: auth.access_token,
|
||||
apiDomain: auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/filters',
|
||||
query: {
|
||||
type: type,
|
||||
},
|
||||
});
|
||||
|
||||
const options: DropdownOption<number>[] = [];
|
||||
for (const filter of filters.data) {
|
||||
options.push({
|
||||
label: filter.name,
|
||||
value: filter.id,
|
||||
});
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches options for Pipedrive activity types.
|
||||
* @param auth Pipedrive authentication.
|
||||
* @returns Dropdown options for activity types.
|
||||
*/
|
||||
export async function fetchActivityTypesOptions(
|
||||
auth: PiecePropValueSchema<typeof pipedriveAuth>,
|
||||
): Promise<DropdownOption<string>[]> {
|
||||
const activityTypes = await pipedriveApiCall<{
|
||||
data: Array<{ key_string: string; name: string }>;
|
||||
}>({
|
||||
accessToken: auth.access_token,
|
||||
apiDomain: auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/activityTypes',
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [];
|
||||
for (const type of activityTypes.data) {
|
||||
options.push({
|
||||
label: type.name,
|
||||
value: type.key_string,
|
||||
});
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches options for Pipedrive pipelines.
|
||||
* @param auth Pipedrive authentication.
|
||||
* @returns Dropdown options for pipelines.
|
||||
*/
|
||||
export async function fetchPipelinesOptions(
|
||||
auth: PiecePropValueSchema<typeof pipedriveAuth>,
|
||||
): Promise<DropdownOption<number>[]> {
|
||||
const pipelines = await pipedrivePaginatedV2ApiCall<{ id: number; name: string }>({
|
||||
accessToken: auth.access_token,
|
||||
apiDomain: auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/pipelines',
|
||||
});
|
||||
|
||||
const options: DropdownOption<number>[] = [];
|
||||
for (const pipeline of pipelines) {
|
||||
options.push({
|
||||
label: pipeline.name,
|
||||
value: pipeline.id,
|
||||
});
|
||||
}
|
||||
return options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches options for Pipedrive persons.
|
||||
* @param auth Pipedrive authentication.
|
||||
* @returns Dropdown options for persons.
|
||||
*/
|
||||
export async function fetchPersonsOptions(
|
||||
auth: PiecePropValueSchema<typeof pipedriveAuth>,
|
||||
): Promise<DropdownOption<number>[]> {
|
||||
const persons = await pipedriveApiCall<{ data: Array<{ id: number; name: string }> }>({
|
||||
accessToken: auth.access_token,
|
||||
apiDomain: auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/persons',
|
||||
query: {
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
},
|
||||
});
|
||||
|
||||
const options: DropdownOption<number>[] = [];
|
||||
for (const person of persons.data) {
|
||||
options.push({
|
||||
label: person.name,
|
||||
value: person.id,
|
||||
});
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches options for Pipedrive users (owners).
|
||||
* @param auth Pipedrive authentication.
|
||||
* @returns Dropdown options for owners.
|
||||
*/
|
||||
export async function fetchOwnersOptions(
|
||||
auth: PiecePropValueSchema<typeof pipedriveAuth>,
|
||||
): Promise<DropdownOption<number>[]> {
|
||||
const users = await pipedriveApiCall<{ data: Array<{ id: number; email: string }> }>({
|
||||
accessToken: auth.access_token,
|
||||
apiDomain: auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/users:(id,email)',
|
||||
});
|
||||
|
||||
const options: DropdownOption<number>[] = [];
|
||||
for (const user of users.data) {
|
||||
options.push({
|
||||
label: user.email,
|
||||
value: user.id,
|
||||
});
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a property definition for a custom field based on its Pipedrive field type.
|
||||
* @param property The Pipedrive custom field definition.
|
||||
* @returns A Property.ShortText, Property.LongText, Property.StaticDropdown, Property.StaticMultiSelectDropdown, or Property.Number.
|
||||
*/
|
||||
export function createPropertyDefinition(property: GetField) {
|
||||
switch (property.field_type) {
|
||||
case 'varchar':
|
||||
case 'varchar_auto':
|
||||
case 'phone':
|
||||
return Property.ShortText({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
});
|
||||
case 'text':
|
||||
case 'address':
|
||||
return Property.LongText({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
});
|
||||
case 'enum':
|
||||
return Property.StaticDropdown({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: property.options
|
||||
? property.options.map((option) => {
|
||||
return {
|
||||
label: option.label,
|
||||
value: option.id,
|
||||
};
|
||||
})
|
||||
: [],
|
||||
},
|
||||
});
|
||||
case 'set':
|
||||
return Property.StaticMultiSelectDropdown({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: property.options
|
||||
? property.options.map((option) => {
|
||||
return {
|
||||
label: option.label,
|
||||
value: option.id,
|
||||
};
|
||||
})
|
||||
: [],
|
||||
},
|
||||
});
|
||||
case 'double':
|
||||
case 'monetary':
|
||||
return Property.Number({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
});
|
||||
case 'time':
|
||||
case 'timerange':
|
||||
return Property.ShortText({
|
||||
displayName: property.name,
|
||||
description: 'Please enter time in HH:mm:ss format.',
|
||||
required: false,
|
||||
});
|
||||
case 'int':
|
||||
return Property.Number({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
});
|
||||
case 'date':
|
||||
case 'daterange':
|
||||
return Property.DateTime({
|
||||
displayName: property.name,
|
||||
description: 'Please enter date in YYYY-MM-DD format.',
|
||||
required: false,
|
||||
});
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves custom properties for a given Pipedrive object type.
|
||||
* @param auth Pipedrive authentication.
|
||||
* @param objectType The type of object (e.g., 'person', 'deal', 'organization', 'product', 'lead').
|
||||
* @returns Dynamic properties for custom fields.
|
||||
*/
|
||||
export async function retrieveObjectCustomProperties(
|
||||
auth: PiecePropValueSchema<typeof pipedriveAuth>,
|
||||
objectType: string,
|
||||
) {
|
||||
let endpoint = '';
|
||||
|
||||
switch (objectType) {
|
||||
case 'person':
|
||||
endpoint = '/v1/personFields';
|
||||
break;
|
||||
case 'deal':
|
||||
case 'lead':
|
||||
endpoint = '/v1/dealFields';
|
||||
break;
|
||||
case 'organization':
|
||||
endpoint = '/v1/organizationFields';
|
||||
break;
|
||||
case 'product':
|
||||
endpoint = '/v1/productFields';
|
||||
break;
|
||||
}
|
||||
|
||||
const customFields = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: auth.access_token,
|
||||
apiDomain: auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: endpoint,
|
||||
});
|
||||
|
||||
const props: DynamicPropsValue = {};
|
||||
|
||||
for (const field of customFields) {
|
||||
if (!field.edit_flag) {
|
||||
continue;
|
||||
}
|
||||
const propertyDefinition = createPropertyDefinition(field);
|
||||
if (propertyDefinition) {
|
||||
props[field.key] = propertyDefinition;
|
||||
}
|
||||
}
|
||||
return props;
|
||||
}
|
||||
|
||||
/**
|
||||
* Property definition for selecting a search field for an object type.
|
||||
* @param objectType The type of object (e.g., 'deal', 'person').
|
||||
*/
|
||||
export const searchFieldProp = (objectType: string) =>
|
||||
Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Field to search by',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
|
||||
let endpoint = '';
|
||||
|
||||
switch (objectType) {
|
||||
case 'person':
|
||||
endpoint = '/v1/personFields';
|
||||
break;
|
||||
case 'deal':
|
||||
case 'lead':
|
||||
endpoint = '/v1/dealFields';
|
||||
break;
|
||||
case 'organization':
|
||||
endpoint = '/v1/organizationFields';
|
||||
break;
|
||||
case 'product':
|
||||
endpoint = '/v1/productFields';
|
||||
break;
|
||||
}
|
||||
|
||||
const response = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: authValue.access_token,
|
||||
apiDomain: authValue.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: endpoint,
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [];
|
||||
|
||||
for (const field of response) {
|
||||
if (!isNil(field.id)) {
|
||||
options.push({
|
||||
label: field.name,
|
||||
value: field.id.toString(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Property definition for the value of a search field.
|
||||
* Dynamically renders based on the selected searchField's type.
|
||||
* @param objectType The type of object (e.g., 'deal', 'person').
|
||||
*/
|
||||
export const searchFieldValueProp = (objectType: string) =>
|
||||
Property.DynamicProperties({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Field Value',
|
||||
required: true,
|
||||
refreshers: ['searchField'],
|
||||
props: async ({ auth, searchField }) => {
|
||||
if (!auth || !searchField) return {};
|
||||
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const props: DynamicPropsValue = {};
|
||||
|
||||
let endpoint = '';
|
||||
|
||||
switch (objectType) {
|
||||
case 'person':
|
||||
endpoint = '/v1/personFields';
|
||||
break;
|
||||
case 'deal':
|
||||
case 'lead':
|
||||
endpoint = '/v1/dealFields';
|
||||
break;
|
||||
case 'organization':
|
||||
endpoint = '/v1/organizationFields';
|
||||
break;
|
||||
case 'product':
|
||||
endpoint = '/v1/productFields';
|
||||
break;
|
||||
}
|
||||
|
||||
const response = await pipedriveApiCall<{ data: GetField }>({
|
||||
accessToken: authValue.access_token,
|
||||
apiDomain: authValue.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `${endpoint}/${searchField}`,
|
||||
});
|
||||
|
||||
const propertyDefinition =
|
||||
response.data.field_type === 'set'
|
||||
? Property.StaticDropdown({
|
||||
displayName: response.data.name,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: response.data.options
|
||||
? response.data.options.map((option) => {
|
||||
return {
|
||||
label: option.label,
|
||||
value: option.id.toString(),
|
||||
};
|
||||
})
|
||||
: [],
|
||||
},
|
||||
})
|
||||
: createPropertyDefinition(response.data);
|
||||
|
||||
if (propertyDefinition) {
|
||||
props['field_value'] = propertyDefinition;
|
||||
} else {
|
||||
props['field_value'] = Property.ShortText({
|
||||
displayName: response.data.name,
|
||||
required: false,
|
||||
});
|
||||
}
|
||||
return props;
|
||||
},
|
||||
});
|
||||
|
||||
export const ownerIdProp = (displayName: string, required = false) =>
|
||||
Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName,
|
||||
refreshers: [],
|
||||
required,
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const options = await fetchOwnersOptions(authValue);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const filterIdProp = (type: string, required = false) =>
|
||||
Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Filter',
|
||||
refreshers: [],
|
||||
required,
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const options = await fetchFiltersOptions(authValue, type);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const organizationIdProp = (required = false) =>
|
||||
Property.Number({
|
||||
displayName: 'Organization ID',
|
||||
description: 'You can use Find Organization action to retrieve org ID.',
|
||||
required,
|
||||
});
|
||||
|
||||
export const dealPipelineIdProp = (required = false) =>
|
||||
Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Pipeline',
|
||||
refreshers: [],
|
||||
required,
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const options = await fetchPipelinesOptions(authValue);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const dealStageIdProp = (required = false) =>
|
||||
Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Stage',
|
||||
description: 'If a stage is chosen above, the pipeline field will be ignored.',
|
||||
required,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
placeholder: 'Please connect your account.',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
|
||||
const response = await pipedrivePaginatedV2ApiCall<StageWithPipelineInfo>({
|
||||
accessToken: authValue.access_token,
|
||||
apiDomain: authValue.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/stages',
|
||||
});
|
||||
|
||||
const options: DropdownOption<number>[] = [];
|
||||
for (const stage of response) {
|
||||
options.push({
|
||||
label: `${stage.name}`,
|
||||
value: stage.id,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const personIdProp = (required = false) =>
|
||||
Property.Number({
|
||||
displayName: 'Person ID',
|
||||
description: 'You can use Find Person action to retrieve person ID.',
|
||||
required,
|
||||
});
|
||||
|
||||
export const labelIdsProp = (objectType: string, labelFieldName: string, required = false) =>
|
||||
Property.MultiSelectDropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Label',
|
||||
required,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
|
||||
let endpoint = '';
|
||||
|
||||
switch (objectType) {
|
||||
case 'person':
|
||||
endpoint = '/v1/personFields';
|
||||
break;
|
||||
case 'deal':
|
||||
endpoint = '/v1/dealFields';
|
||||
break;
|
||||
case 'organization':
|
||||
endpoint = '/v1/organizationFields';
|
||||
break;
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: authValue.access_token,
|
||||
apiDomain: authValue.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: endpoint,
|
||||
});
|
||||
|
||||
// Find the specific label field within the custom fields response
|
||||
const labelField = customFieldsResponse.find((field) => field.key === labelFieldName);
|
||||
const options: DropdownOption<number>[] = [];
|
||||
|
||||
if (labelField && labelField.options) {
|
||||
for (const option of labelField.options) {
|
||||
options.push({
|
||||
label: option.label,
|
||||
value: option.id,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const leadLabelIdsProp = (required = false) =>
|
||||
Property.MultiSelectDropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Label',
|
||||
required,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
|
||||
const leadLabelsResponse = await pipedriveApiCall<{
|
||||
data: Array<{ id: string; name: string; color: string }>;
|
||||
}>({
|
||||
accessToken: authValue.access_token,
|
||||
apiDomain: authValue.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/leadLabels',
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [];
|
||||
for (const option of leadLabelsResponse.data) {
|
||||
options.push({
|
||||
label: `${option.name} (${option.color})`,
|
||||
value: option.id,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const productIdProp = (required = false) =>
|
||||
Property.Number({
|
||||
displayName: 'Product ID',
|
||||
description: 'You can use Find Product action to retrieve product ID.',
|
||||
required,
|
||||
});
|
||||
|
||||
/**
|
||||
* Property definition for 'Visible To' setting.
|
||||
*/
|
||||
export const visibleToProp = Property.StaticDropdown({
|
||||
displayName: 'Visible To',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Owner & followers',
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: 'Entire company',
|
||||
value: 3,
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
export const leadIdProp = (required = false) =>
|
||||
Property.ShortText({
|
||||
displayName: 'Lead ID',
|
||||
required,
|
||||
});
|
||||
|
||||
export const activityTypeIdProp = (required = false) =>
|
||||
Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Activity Type',
|
||||
refreshers: [],
|
||||
required,
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const options = await fetchActivityTypesOptions(authValue);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const dealIdProp = (required = false) =>
|
||||
Property.Number({
|
||||
displayName: 'Deal ID',
|
||||
description: 'You can use Find Deal action to retrieve deal ID.',
|
||||
required,
|
||||
});
|
||||
|
||||
export const dealCommonProps = {
|
||||
creationTime: Property.DateTime({
|
||||
displayName: 'Creation Time',
|
||||
required: false,
|
||||
}),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Open',
|
||||
value: 'open',
|
||||
},
|
||||
{
|
||||
label: 'Won',
|
||||
value: 'won',
|
||||
},
|
||||
{
|
||||
label: 'Lost',
|
||||
value: 'lost',
|
||||
},
|
||||
{
|
||||
label: 'Deleted',
|
||||
value: 'deleted',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
stageId: dealStageIdProp(false),
|
||||
pipelineId: dealPipelineIdProp(false),
|
||||
ownerId: ownerIdProp('Owner', false),
|
||||
organizationId: organizationIdProp(false),
|
||||
personId: personIdProp(false),
|
||||
labelIds: labelIdsProp('deal', 'label', false),
|
||||
probability: Property.Number({
|
||||
displayName: 'Probability',
|
||||
required: false,
|
||||
}),
|
||||
expectedCloseDate: Property.DateTime({
|
||||
displayName: 'Expected Close Date',
|
||||
required: false,
|
||||
description: 'Please enter date in YYYY-MM-DD format.',
|
||||
}),
|
||||
dealValue: Property.Number({
|
||||
displayName: 'Value',
|
||||
required: false,
|
||||
}),
|
||||
dealValueCurrency: Property.ShortText({
|
||||
displayName: 'Currency',
|
||||
required: false,
|
||||
description: 'Please enter currency code (e.g., "USD", "EUR").',
|
||||
}),
|
||||
visibleTo: visibleToProp,
|
||||
customfields: customFieldsProp('deal'),
|
||||
};
|
||||
|
||||
/**
|
||||
* Common properties for Lead actions.
|
||||
*/
|
||||
export const leadCommonProps = {
|
||||
ownerId: ownerIdProp('Owner', false),
|
||||
organizationId: organizationIdProp(false),
|
||||
personId: personIdProp(false),
|
||||
labelIds: leadLabelIdsProp(false),
|
||||
expectedCloseDate: Property.DateTime({
|
||||
displayName: 'Expected Close Date',
|
||||
required: false,
|
||||
description: 'Please enter date in YYYY-MM-DD format.',
|
||||
}),
|
||||
visibleTo: visibleToProp,
|
||||
channel: Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Channel',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account.',
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: authValue.access_token,
|
||||
apiDomain: authValue.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields:(key,name,options)',
|
||||
});
|
||||
|
||||
const channelField = customFieldsResponse.find((field) => field.key === 'channel');
|
||||
const options: DropdownOption<number>[] = [];
|
||||
if (channelField) {
|
||||
for (const option of channelField.options ?? []) {
|
||||
options.push({
|
||||
label: option.label,
|
||||
value: option.id,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
}),
|
||||
leadValue: Property.Number({
|
||||
displayName: 'Lead Value Amount',
|
||||
required: false,
|
||||
}),
|
||||
leadValueCurrency: Property.ShortText({
|
||||
displayName: 'Lead Value Currency',
|
||||
required: false,
|
||||
description: 'The currency of the lead value (e.g., "USD", "EUR").',
|
||||
}),
|
||||
customfields: customFieldsProp('lead'),
|
||||
};
|
||||
|
||||
/**
|
||||
* Common properties for Organization actions.
|
||||
*/
|
||||
export const organizationCommonProps = {
|
||||
ownerId: ownerIdProp('Owner', false),
|
||||
visibleTo: visibleToProp,
|
||||
labelIds: labelIdsProp('organization', 'label_ids', false),
|
||||
address: Property.LongText({
|
||||
displayName: 'Address',
|
||||
required: false,
|
||||
}),
|
||||
customfields: customFieldsProp('organization'),
|
||||
};
|
||||
|
||||
export const personCommonProps = {
|
||||
ownerId: ownerIdProp('Owner', false),
|
||||
organizationId: organizationIdProp(false),
|
||||
email: Property.Array({
|
||||
displayName: 'Email',
|
||||
required: false,
|
||||
}),
|
||||
phone: Property.Array({
|
||||
displayName: 'Phone',
|
||||
required: false,
|
||||
}),
|
||||
labelIds: labelIdsProp('person', 'label_ids', false),
|
||||
firstName: Property.ShortText({
|
||||
displayName: 'First Name',
|
||||
required: false,
|
||||
}),
|
||||
lastName: Property.ShortText({
|
||||
displayName: 'Last Name',
|
||||
required: false,
|
||||
}),
|
||||
visibleTo: visibleToProp,
|
||||
marketing_status: Property.StaticDropdown<string>({
|
||||
displayName: 'Marketing Status',
|
||||
description: 'Marketing opt-in status',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'No Consent',
|
||||
value: 'no_consent',
|
||||
},
|
||||
{
|
||||
label: 'Unsubscribed',
|
||||
value: 'unsubscribed',
|
||||
},
|
||||
{
|
||||
label: 'Subscribed',
|
||||
value: 'subscribed',
|
||||
},
|
||||
{
|
||||
label: 'Archived',
|
||||
value: 'archived',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
customfields: customFieldsProp('person'),
|
||||
};
|
||||
|
||||
export const activityCommonProps = {
|
||||
organizationId: organizationIdProp(false),
|
||||
personId: personIdProp(false),
|
||||
dealId: dealIdProp(false),
|
||||
leadId: leadIdProp(false),
|
||||
assignTo: ownerIdProp('Assign To', false),
|
||||
type: activityTypeIdProp(false),
|
||||
dueDate: Property.DateTime({
|
||||
displayName: 'Due Date',
|
||||
required: false,
|
||||
description: 'Please enter date in YYYY-MM-DD format.',
|
||||
}),
|
||||
dueTime: Property.ShortText({
|
||||
displayName: 'Due Time',
|
||||
required: false,
|
||||
description: 'Please enter time in HH:MM format.',
|
||||
}),
|
||||
duration: Property.ShortText({
|
||||
displayName: 'Duration',
|
||||
required: false,
|
||||
description: 'Please enter time in HH:MM format (e.g., "01:30" for 1 hour 30 minutes).',
|
||||
}),
|
||||
isDone: Property.Checkbox({
|
||||
displayName: 'Mark as Done?',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
busy: Property.StaticDropdown({
|
||||
displayName: 'Free or Busy',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Free',
|
||||
value: 'free',
|
||||
},
|
||||
{
|
||||
label: 'Busy',
|
||||
value: 'busy',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
note: Property.LongText({
|
||||
displayName: 'Note',
|
||||
required: false,
|
||||
}),
|
||||
publicDescription: Property.LongText({
|
||||
displayName: 'Public Description',
|
||||
required: false,
|
||||
}),
|
||||
};
|
||||
|
||||
// Helper function for custom fields property definition
|
||||
export function customFieldsProp(objectType: string) {
|
||||
return Property.DynamicProperties({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Custom Fields',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) return {};
|
||||
const authValue = auth;
|
||||
return await retrieveObjectCustomProperties(authValue, objectType);
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,410 @@
|
||||
|
||||
export interface PipedriveDealV2 {
|
||||
id: number;
|
||||
title: string;
|
||||
creator_user_id: number; // No longer an object, just the ID
|
||||
owner_id: number;
|
||||
person_id: number | null; // No longer an object, just the ID
|
||||
org_id: number | null; // No longer an object, just the ID
|
||||
stage_id: number;
|
||||
pipeline_id: number;
|
||||
value: number;
|
||||
currency: string;
|
||||
add_time: string; // RFC 3339 format
|
||||
update_time: string; // RFC 3339 format
|
||||
stage_change_time: string; // RFC 3339 format
|
||||
is_deleted: boolean; // Replaces 'active' and 'deleted' flags, is negation of old 'active'
|
||||
status: 'open' | 'won' | 'lost';
|
||||
probability: number | null;
|
||||
lost_reason: string | null;
|
||||
visible_to: number; // Is an integer now
|
||||
close_time: string | null; // RFC 3339 format
|
||||
won_time: string | null; // RFC 3339 format
|
||||
first_won_time?: string; // RFC 3339 format, included only when using `include_fields` parameter
|
||||
lost_time: string | null; // RFC 3339 format
|
||||
products_count?: number; // Included only when using `include_fields` parameter
|
||||
files_count?: number; // Included only when using `include_fields` parameter
|
||||
notes_count?: number; // Included only when using `include_fields` parameter
|
||||
followers_count?: number; // Included only when using `include_fields` parameter
|
||||
email_messages_count?: number; // Included only when using `include_fields` parameter
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
participants_count?: number;
|
||||
expected_close_date: string | null; // YYYY-MM-DD
|
||||
last_incoming_mail_time?: string; // RFC 3339 format
|
||||
last_outgoing_mail_time?: string; // RFC 3339 format
|
||||
label_ids: number[]; // Replaces 'label' (array of IDs)
|
||||
rotten_time: string | null; // RFC 3339 format
|
||||
smart_bcc_email?: string;
|
||||
acv?: number;
|
||||
arr?: number;
|
||||
mrr?: number;
|
||||
custom_fields: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export interface PipedriveActivityV2 {
|
||||
id: number;
|
||||
subject: string;
|
||||
owner_id: number;
|
||||
type: string;
|
||||
is_deleted: boolean;
|
||||
done: boolean;
|
||||
conference_meeting_client: string | null;
|
||||
conference_meeting_url: string | null;
|
||||
conference_meeting_id: string | null;
|
||||
due_date: string; // YYYY-MM-DD
|
||||
due_time: string; // HH:MM
|
||||
duration: string; // HH:MM
|
||||
busy: boolean;
|
||||
add_time: string; // RFC 3339 format
|
||||
update_time: string; // RFC 3339 format
|
||||
marked_as_done_time: string | null; // RFC 3339 format, null if not done
|
||||
public_description: string | null;
|
||||
location: { // Nested object now
|
||||
value: string | null;
|
||||
street_number: string | null;
|
||||
route: string | null;
|
||||
sublocality: string | null;
|
||||
locality: string | null;
|
||||
admin_area_level_1: string | null;
|
||||
admin_area_level_2: string | null;
|
||||
country: string | null;
|
||||
postal_code: string | null;
|
||||
formatted_address: string | null;
|
||||
} | null;
|
||||
org_id: number | null;
|
||||
person_id: number | null;
|
||||
deal_id: number | null;
|
||||
lead_id: string | null;
|
||||
project_id: number | null;
|
||||
private: boolean;
|
||||
priority: number;
|
||||
note: string | null;
|
||||
creator_user_id: number;
|
||||
attendees?: { // Included only when using include_fields parameter
|
||||
email_address: string;
|
||||
name: string;
|
||||
status: string;
|
||||
is_organizer: number;
|
||||
person_id: number | null;
|
||||
user_id: number | null;
|
||||
}[];
|
||||
participants?: {
|
||||
person_id: number;
|
||||
primary: boolean;
|
||||
}[];
|
||||
}
|
||||
|
||||
|
||||
export interface PipedrivePersonV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
owner_id: number;
|
||||
org_id: number | null;
|
||||
picture_id: number | null;
|
||||
add_time: string; // RFC 3339 format
|
||||
update_time: string; // RFC 3339 format
|
||||
is_deleted: boolean;
|
||||
visible_to: number; // Is an integer now (e.g., 1, 3, 5, 7)
|
||||
phones: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
emails: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
label_ids: number[];
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null; // RFC 3339 format
|
||||
last_outgoing_mail_time?: string | null; // RFC 3339 format
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface PipedriveOrganizationV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
owner_id: number; // No longer an object, just the ID
|
||||
add_time: string; // RFC 3339 format
|
||||
update_time: string; // RFC 3339 format
|
||||
is_deleted: boolean; // Replaces active_flag, is negation of old value
|
||||
visible_to: number; // Is an integer now (e.g., 1, 3, 5, 7)
|
||||
picture_id: number | null;
|
||||
label_ids: number[]; // Replaces 'label' (array of IDs)
|
||||
address: { // Is a nested object now
|
||||
value: string | null;
|
||||
street_number: string | null;
|
||||
route: string | null;
|
||||
sublocality: string | null;
|
||||
locality: string | null;
|
||||
admin_area_level_1: string | null;
|
||||
admin_area_level_2: string | null;
|
||||
country: string | null;
|
||||
postal_code: string | null;
|
||||
formatted_address: string | null;
|
||||
} | null;
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null; // RFC 3339 format
|
||||
last_outgoing_mail_time?: string | null; // RFC 3339 format
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
|
||||
export interface PipedriveLeadV2 {
|
||||
id: string; // Lead IDs are UUIDs (strings)
|
||||
title: string;
|
||||
owner_id: number; // No longer an object, just the ID
|
||||
creator_id: number; // No longer an object, just the ID
|
||||
label_ids: string[]; // Array of string UUIDs for labels
|
||||
value: number | null;
|
||||
expected_close_date: string | null; // YYYY-MM-DD
|
||||
person_id: number | null; // No longer an object, just the ID
|
||||
organization_id: number | null; // No longer an object, just the ID
|
||||
is_archived: boolean;
|
||||
source_name: string;
|
||||
origin: string;
|
||||
origin_id: string | null;
|
||||
channel: number | null;
|
||||
channel_id: string | null;
|
||||
was_seen: boolean;
|
||||
next_activity_id: number | null;
|
||||
add_time: string; // RFC 3339 format
|
||||
update_time: string; // RFC 3339 format
|
||||
visible_to: number; // Is an integer now (e.g., 1, 3, 5, 7)
|
||||
custom_fields?: Record<string, unknown>; // Custom fields are now nested here
|
||||
}
|
||||
|
||||
|
||||
export interface PipedriveNoteV2 {
|
||||
id: number;
|
||||
user_id: number; // The user who owns the note (owner_id in other contexts)
|
||||
deal_id: number | null;
|
||||
person_id: number | null;
|
||||
org_id: number | null;
|
||||
lead_id: string | null; // Lead IDs are UUIDs
|
||||
content: string;
|
||||
add_time: string; // RFC 3339 format
|
||||
update_time: string; // RFC 3339 format
|
||||
is_deleted: boolean; // Replaces active_flag, is negation of old value
|
||||
last_update_user_id: number | null;
|
||||
}
|
||||
|
||||
|
||||
export interface PipedriveProductV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
code: string | null;
|
||||
description: string | null;
|
||||
unit: string | null;
|
||||
tax: number | null;
|
||||
prices: Array<{
|
||||
id?: number;
|
||||
product_id?: number;
|
||||
price: number;
|
||||
currency: string;
|
||||
cost?: number;
|
||||
direct_cost?: number;
|
||||
overhead_cost?: number; // Keep for backward compatibility if needed, but direct_cost is preferred
|
||||
}>;
|
||||
owner_id: number;
|
||||
add_time: string; // RFC 3339 format
|
||||
update_time: string; // RFC 3339 format
|
||||
is_deleted: boolean; // Replaces active_flag, is negation of old value
|
||||
visible_to: number; // Is an integer now
|
||||
custom_fields?: Record<string, unknown>;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// --- Common Types ---
|
||||
|
||||
export type GetField = {
|
||||
id: number; // Field ID is a number
|
||||
name: string;
|
||||
key: string; // Field key is a string (e.g., hash for custom fields)
|
||||
edit_flag: boolean;
|
||||
is_subfield:boolean,
|
||||
id_suffix:string,
|
||||
field_type: "varchar" | "text" | "enum" | "set" | "varchar_auto" | "double" | "monetary" | "user" | "org" | "people" | "phone" | "time" | "int" | "timerange" | "date" | "daterange" | "address" | "lead_label"; // Added lead_label
|
||||
options?: Array<{ id: number, label: string }>; // Option IDs are numbers
|
||||
};
|
||||
|
||||
// --- Updated Pagination Types for v2 ---
|
||||
type PaginationInfoV2 = {
|
||||
start?: number; // Optional in response
|
||||
limit?: number; // Optional in response
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
|
||||
};
|
||||
|
||||
type AdditionalDataV2 = {
|
||||
pagination?: PaginationInfoV2;
|
||||
};
|
||||
|
||||
export type PaginatedV2Response<T> = {
|
||||
success: boolean;
|
||||
data: T[];
|
||||
additional_data?: {
|
||||
next_cursor?:string
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
export type PaginatedV1Response<T> =
|
||||
{
|
||||
success: boolean;
|
||||
data: T[];
|
||||
additional_data: {
|
||||
pagination: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_start: number;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
export type FieldsResponse = {
|
||||
success: boolean;
|
||||
data: GetField[];
|
||||
additional_data?: AdditionalDataV2;
|
||||
};
|
||||
|
||||
export type StageWithPipelineInfo = {
|
||||
id: number;
|
||||
name: string;
|
||||
pipeline_id: number;
|
||||
|
||||
};
|
||||
|
||||
export type GetStagesResponse = {
|
||||
success: boolean;
|
||||
data: StageWithPipelineInfo[];
|
||||
additional_data?: AdditionalDataV2;
|
||||
};
|
||||
|
||||
export type ListDealsResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveDealV2[];
|
||||
additional_data?: AdditionalDataV2;
|
||||
};
|
||||
|
||||
export type GetDealResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveDealV2;
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type ListActivitiesResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveActivityV2[];
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type PersonListResponse = {
|
||||
success: boolean;
|
||||
data: PipedrivePersonV2[];
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type GetPersonResponse = {
|
||||
success: boolean;
|
||||
data: PipedrivePersonV2;
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type OrganizationListResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveOrganizationV2[];
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type GetOrganizationResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveOrganizationV2;
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type LeadListResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveLeadV2[];
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type GetLeadResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveLeadV2;
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type GetNoteResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveNoteV2;
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
export type WebhookCreateResponse = {
|
||||
status?: string;
|
||||
success: boolean;
|
||||
data: {
|
||||
id: string;
|
||||
}
|
||||
}
|
||||
|
||||
export type GetProductResponse = {
|
||||
success: boolean;
|
||||
data: PipedriveProductV2;
|
||||
additional_data?: AdditionalDataV2;
|
||||
}
|
||||
|
||||
|
||||
export type RequestParams = Record<string, string | number | boolean | string[] | number[] | null | undefined>;
|
||||
@@ -0,0 +1,181 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { filterIdProp } from '../common/props';
|
||||
import { pipedriveApiCall, pipedrivePaginatedV2ApiCall } from '../common';
|
||||
import { LeadListResponse } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
export const activityMatchingFilterTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'activity-matching-filter',
|
||||
displayName: 'Activity Matching Filter',
|
||||
description: 'Trigges when an activity newly matches a Pipedrive filter for the first time.',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
filterId: filterIdProp('activity', true),
|
||||
},
|
||||
async onEnable(context) {
|
||||
const ids: number[] = [];
|
||||
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/activities',
|
||||
query: { filter_id: context.propsValue.filterId },
|
||||
});
|
||||
|
||||
if (!isNil(response)) {
|
||||
response.forEach((activity) => {
|
||||
ids.push(activity.id);
|
||||
});
|
||||
}
|
||||
|
||||
await context.store.put('activities', JSON.stringify(ids));
|
||||
},
|
||||
async onDisable(context) {
|
||||
await context.store.delete('activities');
|
||||
},
|
||||
async test(context) {
|
||||
const activities = [];
|
||||
|
||||
const response = await pipedriveApiCall<LeadListResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/activities',
|
||||
query: {
|
||||
limit: 10,
|
||||
filter_id: context.propsValue.filterId,
|
||||
sort_by:'update_time',
|
||||
sort_direction:'desc',
|
||||
include_fields:'attendees'
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
for (const activity of response.data) {
|
||||
activities.push(activity);
|
||||
}
|
||||
|
||||
return activities;
|
||||
},
|
||||
async run(context) {
|
||||
const existingIds = (await context.store.get<string>('activities')) ?? '[]';
|
||||
const parsedExistingIds = JSON.parse(existingIds) as number[];
|
||||
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/activities',
|
||||
query: { filter_id: context.propsValue.filterId,include_fields:'attendees'},
|
||||
});
|
||||
|
||||
if (isNil(response) || response.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Filter valid activities
|
||||
const newActivities = response.filter((activity) => !parsedExistingIds.includes(activity.id));
|
||||
|
||||
const newIds = newActivities.map((activity) => activity.id);
|
||||
|
||||
if (newIds.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Store new IDs
|
||||
await context.store.put('activities', JSON.stringify([...newIds, ...parsedExistingIds]));
|
||||
|
||||
return newActivities;
|
||||
},
|
||||
sampleData: {
|
||||
id: 8,
|
||||
company_id: 22122,
|
||||
user_id: 1234,
|
||||
done: false,
|
||||
type: 'deadline',
|
||||
reference_type: 'scheduler-service',
|
||||
reference_id: 7,
|
||||
conference_meeting_client: '871b8bc88d3a1202',
|
||||
conference_meeting_url: 'https://pipedrive.zoom.us/link',
|
||||
conference_meeting_id: '01758746701',
|
||||
due_date: '2020-06-09',
|
||||
due_time: '10:00',
|
||||
duration: '01:00',
|
||||
busy_flag: true,
|
||||
add_time: '2020-06-08 12:37:56',
|
||||
marked_as_done_time: '2020-08-08 08:08:38',
|
||||
last_notification_time: '2020-08-08 12:37:56',
|
||||
last_notification_user_id: 7655,
|
||||
notification_language_id: 1,
|
||||
subject: 'Deadline',
|
||||
public_description: 'This is a description',
|
||||
calendar_sync_include_context: '',
|
||||
location: 'Mustamäe tee 3, Tallinn, Estonia',
|
||||
org_id: 5,
|
||||
person_id: 1101,
|
||||
deal_id: 300,
|
||||
lead_id: '46c3b0e1-db35-59ca-1828-4817378dff71',
|
||||
active_flag: true,
|
||||
update_time: '2020-08-08 12:37:56',
|
||||
update_user_id: 5596,
|
||||
gcal_event_id: '',
|
||||
google_calendar_id: '',
|
||||
google_calendar_etag: '',
|
||||
source_timezone: '',
|
||||
rec_rule: 'RRULE:FREQ=WEEKLY;BYDAY=WE',
|
||||
rec_rule_extension: '',
|
||||
rec_master_activity_id: 1,
|
||||
series: [],
|
||||
note: 'A note for the activity',
|
||||
created_by_user_id: 1234,
|
||||
location_subpremise: '',
|
||||
location_street_number: '3',
|
||||
location_route: 'Mustamäe tee',
|
||||
location_sublocality: 'Kristiine',
|
||||
location_locality: 'Tallinn',
|
||||
location_admin_area_level_1: 'Harju maakond',
|
||||
location_admin_area_level_2: '',
|
||||
location_country: 'Estonia',
|
||||
location_postal_code: '10616',
|
||||
location_formatted_address: 'Mustamäe tee 3, 10616 Tallinn, Estonia',
|
||||
attendees: [
|
||||
{
|
||||
email_address: 'attendee@pipedrivemail.com',
|
||||
is_organizer: 0,
|
||||
name: 'Attendee',
|
||||
person_id: 25312,
|
||||
status: 'noreply',
|
||||
user_id: null,
|
||||
},
|
||||
],
|
||||
participants: [
|
||||
{
|
||||
person_id: 17985,
|
||||
primary_flag: false,
|
||||
},
|
||||
{
|
||||
person_id: 1101,
|
||||
primary_flag: true,
|
||||
},
|
||||
],
|
||||
org_name: 'Organization',
|
||||
person_name: 'Person',
|
||||
deal_title: 'Deal',
|
||||
owner_name: 'Creator',
|
||||
person_dropbox_bcc: 'company@pipedrivemail.com',
|
||||
deal_dropbox_bcc: 'company+deal300@pipedrivemail.com',
|
||||
assigned_to_user_id: 1235,
|
||||
file: {
|
||||
id: '376892,',
|
||||
clean_name: 'Audio 10:55:07.m4a',
|
||||
url: 'https://pipedrive-files.s3-eu-west-1.amazonaws.com/Audio-recording.m4a',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,257 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createTrigger, Property, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { filterIdProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV2ApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, LeadListResponse } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { DEAL_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
export const dealMatchingFilterTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'deal-matching-filter',
|
||||
displayName: 'Deal Matching Filter',
|
||||
description: 'Trigges when a deal newly matches a Pipedrive filter for the first time.',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
filterId: filterIdProp('deals', true),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
required: false,
|
||||
defaultValue: 'all_not_deleted',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Open',
|
||||
value: 'open',
|
||||
},
|
||||
{
|
||||
label: 'Won',
|
||||
value: 'won',
|
||||
},
|
||||
{
|
||||
label: 'Lost',
|
||||
value: 'lost',
|
||||
},
|
||||
{
|
||||
label: 'Deleted',
|
||||
value: 'deleted',
|
||||
},
|
||||
{
|
||||
label: 'All(Not Deleted)',
|
||||
value: 'all_not_deleted',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
async onEnable(context) {
|
||||
const ids: number[] = [];
|
||||
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/deals',
|
||||
query: {
|
||||
filter_id: context.propsValue.filterId,
|
||||
status: context.propsValue.status,
|
||||
},
|
||||
});
|
||||
|
||||
if (!isNil(response)) {
|
||||
response.forEach((deal) => {
|
||||
ids.push(deal.id);
|
||||
});
|
||||
}
|
||||
|
||||
await context.store.put('deals', JSON.stringify(ids));
|
||||
},
|
||||
async onDisable(context) {
|
||||
await context.store.delete('deals');
|
||||
},
|
||||
async test(context) {
|
||||
const deals = [];
|
||||
|
||||
const response = await pipedriveApiCall<LeadListResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/deals',
|
||||
query: {
|
||||
limit: 10,
|
||||
filter_id: context.propsValue.filterId,
|
||||
status: context.propsValue.status,
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
for (const deal of response.data) {
|
||||
deals.push(deal);
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const deal of deals) {
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(customFieldsResponse, deal);
|
||||
result.push(updatedDealProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const existingIds = (await context.store.get<string>('deals')) ?? '[]';
|
||||
const parsedExistingIds = JSON.parse(existingIds) as number[];
|
||||
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/deals',
|
||||
query: {
|
||||
filter_id: context.propsValue.filterId,
|
||||
status: context.propsValue.status,
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response) || response.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Filter valid deals
|
||||
const newDeals = response.filter((deal) => !parsedExistingIds.includes(deal.id));
|
||||
|
||||
const newIds = newDeals.map((deal) => deal.id);
|
||||
|
||||
if (newIds.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Store new IDs
|
||||
await context.store.put('deals', JSON.stringify([...newIds, ...parsedExistingIds]));
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
// Transform valid deal fields
|
||||
for (const deal of newDeals) {
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(customFieldsResponse, deal);
|
||||
result.push(updatedDealProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator_user_id:22701301,
|
||||
person_id: 1101,
|
||||
org_id: 5,
|
||||
stage_id: 2,
|
||||
title: 'Deal One',
|
||||
value: 5000,
|
||||
currency: 'EUR',
|
||||
add_time: '2019-05-29 04:21:51',
|
||||
update_time: '2019-11-28 16:19:50',
|
||||
stage_change_time: '2019-11-28 15:41:22',
|
||||
active: true,
|
||||
deleted: false,
|
||||
status: 'open',
|
||||
probability: null,
|
||||
next_activity_date: '2019-11-29',
|
||||
next_activity_time: '11:30:00',
|
||||
next_activity_id: 128,
|
||||
last_activity_id: null,
|
||||
last_activity_date: null,
|
||||
lost_reason: null,
|
||||
visible_to: '1',
|
||||
close_time: null,
|
||||
pipeline_id: 1,
|
||||
won_time: '2019-11-27 11:40:36',
|
||||
first_won_time: '2019-11-27 11:40:36',
|
||||
lost_time: '',
|
||||
products_count: 0,
|
||||
files_count: 0,
|
||||
notes_count: 2,
|
||||
followers_count: 0,
|
||||
email_messages_count: 4,
|
||||
activities_count: 1,
|
||||
done_activities_count: 0,
|
||||
undone_activities_count: 1,
|
||||
participants_count: 1,
|
||||
expected_close_date: '2019-06-29',
|
||||
last_incoming_mail_time: '2019-05-29 18:21:42',
|
||||
last_outgoing_mail_time: '2019-05-30 03:45:35',
|
||||
label: 11,
|
||||
stage_order_nr: 2,
|
||||
person_name: 'Person',
|
||||
org_name: 'Organization',
|
||||
next_activity_subject: 'Call',
|
||||
next_activity_type: 'call',
|
||||
next_activity_duration: '00:30:00',
|
||||
next_activity_note: 'Note content',
|
||||
formatted_value: '€5,000',
|
||||
weighted_value: 5000,
|
||||
formatted_weighted_value: '€5,000',
|
||||
weighted_value_currency: 'EUR',
|
||||
rotten_time: null,
|
||||
owner_name: 'Creator',
|
||||
cc_email: 'company+deal1@pipedrivemail.com',
|
||||
org_hidden: false,
|
||||
person_hidden: false,
|
||||
average_time_to_won: {
|
||||
y: 0,
|
||||
m: 0,
|
||||
d: 0,
|
||||
h: 0,
|
||||
i: 20,
|
||||
s: 49,
|
||||
total_seconds: 1249,
|
||||
},
|
||||
average_stage_progress: 4.99,
|
||||
age: {
|
||||
y: 0,
|
||||
m: 6,
|
||||
d: 14,
|
||||
h: 8,
|
||||
i: 57,
|
||||
s: 26,
|
||||
total_seconds: 17139446,
|
||||
},
|
||||
stay_in_pipeline_stages: {
|
||||
times_in_stages: {
|
||||
'1': 15721267,
|
||||
'2': 1288449,
|
||||
'3': 4368,
|
||||
'4': 3315,
|
||||
'5': 26460,
|
||||
},
|
||||
order_of_stages: [1, 2, 3, 4, 5],
|
||||
},
|
||||
last_activity: null,
|
||||
next_activity: null,
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,204 @@
|
||||
import { createTrigger } from '@activepieces/pieces-framework';
|
||||
import { TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { pipedriveApiCall, pipedriveCommon } from '../common';
|
||||
import { pipedriveAuth } from '../..';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { LeadListResponse } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
interface PipedriveActivityV2 {
|
||||
id: number;
|
||||
subject: string;
|
||||
owner_id: number;
|
||||
type: string;
|
||||
is_deleted: boolean;
|
||||
done: boolean;
|
||||
conference_meeting_client: string | null;
|
||||
conference_meeting_url: string | null;
|
||||
conference_meeting_id: string | null;
|
||||
due_date: string;
|
||||
due_time: string;
|
||||
duration: string;
|
||||
busy: boolean;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
marked_as_done_time: string | null;
|
||||
public_description: string | null;
|
||||
location: {
|
||||
value: string | null;
|
||||
street_number: string | null;
|
||||
route: string | null;
|
||||
sublocality: string | null;
|
||||
locality: string | null;
|
||||
admin_area_level_1: string | null;
|
||||
admin_area_level_2: string | null;
|
||||
country: string | null;
|
||||
postal_code: string | null;
|
||||
formatted_address: string | null;
|
||||
} | null;
|
||||
org_id: number | null;
|
||||
person_id: number | null;
|
||||
deal_id: number | null;
|
||||
lead_id: string | null;
|
||||
project_id: number | null;
|
||||
private: boolean;
|
||||
priority: number;
|
||||
note: string | null;
|
||||
creator_user_id: number;
|
||||
attendees?: {
|
||||
email_address: string;
|
||||
name: string;
|
||||
status: string;
|
||||
is_organizer: number;
|
||||
person_id: number | null;
|
||||
user_id: number | null;
|
||||
}[];
|
||||
participants?: {
|
||||
person_id: number;
|
||||
primary: boolean;
|
||||
}[];
|
||||
}
|
||||
|
||||
interface ListActivitiesResponse {
|
||||
data: PipedriveActivityV2[];
|
||||
}
|
||||
|
||||
export const newActivity = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'new_activity',
|
||||
displayName: 'New Activity',
|
||||
description: 'Triggers when a new activity is added',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'activity',
|
||||
'create',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<WebhookInformation>('_new_activity_trigger', {
|
||||
webhookId: webhook.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const response = await context.store?.get<WebhookInformation>('_new_activity_trigger');
|
||||
if (response !== null && response !== undefined) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
response.webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const activities = [];
|
||||
|
||||
const response = await pipedriveApiCall<LeadListResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/activities',
|
||||
query: {
|
||||
limit: 10,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: 'attendees',
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
for (const activity of response.data) {
|
||||
activities.push(activity);
|
||||
}
|
||||
|
||||
return activities;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as PayloadBody;
|
||||
|
||||
const response = await pipedriveApiCall<{ data: PipedriveActivityV2 }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/activities/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: 'attendees',
|
||||
},
|
||||
});
|
||||
|
||||
return [response.data];
|
||||
},
|
||||
sampleData: {
|
||||
id: 8,
|
||||
owner_id: 1234,
|
||||
done: false,
|
||||
type: 'deadline',
|
||||
due_date: '2020-06-09',
|
||||
due_time: '10:00',
|
||||
duration: '01:00',
|
||||
busy: true,
|
||||
add_time: '2020-06-08T12:37:56Z',
|
||||
marked_as_done_time: '2020-08-08T08:08:38Z',
|
||||
subject: 'Deadline',
|
||||
public_description: 'This is a description',
|
||||
location: {
|
||||
// Nested object
|
||||
value: 'Mustamäe tee 3, Tallinn, Estonia',
|
||||
street_number: '3',
|
||||
route: 'Mustamäe tee',
|
||||
sublocality: 'Kristiine',
|
||||
locality: 'Tallinn',
|
||||
admin_area_level_1: 'Harju maakond',
|
||||
admin_area_level_2: null,
|
||||
country: 'Estonia',
|
||||
postal_code: '10616',
|
||||
formatted_address: 'Mustamäe tee 3, 10616 Tallinn, Estonia',
|
||||
},
|
||||
org_id: 5,
|
||||
person_id: 1101,
|
||||
deal_id: 300,
|
||||
lead_id: '46c3b0e1-db35-59ca-1828-4817378dff71',
|
||||
is_deleted: false,
|
||||
update_time: '2020-08-08T12:37:56Z',
|
||||
note: 'A note for the activity',
|
||||
creator_user_id: 1234,
|
||||
attendees: [
|
||||
{
|
||||
email_address: 'attendee@pipedrivemail.com',
|
||||
is_organizer: 0,
|
||||
name: 'Attendee',
|
||||
person_id: 25312,
|
||||
status: 'noreply',
|
||||
user_id: null,
|
||||
},
|
||||
],
|
||||
participants: [
|
||||
{
|
||||
person_id: 17985,
|
||||
primary: false,
|
||||
},
|
||||
{
|
||||
person_id: 1101,
|
||||
primary: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
interface WebhookInformation {
|
||||
webhookId: string;
|
||||
}
|
||||
|
||||
type PayloadBody = {
|
||||
data: PipedriveActivityV2;
|
||||
previous: PipedriveActivityV2;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,220 @@
|
||||
import { createTrigger } from '@activepieces/pieces-framework';
|
||||
import { TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedriveCommon,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { pipedriveAuth } from '../..';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { DEAL_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedriveDealV2 {
|
||||
id: number;
|
||||
title: string;
|
||||
creator_user_id: number;
|
||||
owner_id: number;
|
||||
person_id: number | null;
|
||||
org_id: number | null;
|
||||
stage_id: number;
|
||||
pipeline_id: number;
|
||||
value: number;
|
||||
currency: string;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
stage_change_time: string;
|
||||
is_deleted: boolean;
|
||||
status: 'open' | 'won' | 'lost';
|
||||
probability: number | null;
|
||||
lost_reason: string | null;
|
||||
visible_to: number;
|
||||
close_time: string | null;
|
||||
won_time: string | null;
|
||||
first_won_time?: string;
|
||||
lost_time: string | null;
|
||||
products_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
participants_count?: number;
|
||||
expected_close_date: string | null;
|
||||
last_incoming_mail_time?: string;
|
||||
last_outgoing_mail_time?: string;
|
||||
label_ids: number[];
|
||||
rotten_time: string | null;
|
||||
smart_bcc_email?: string;
|
||||
acv?: number;
|
||||
arr?: number;
|
||||
mrr?: number;
|
||||
custom_fields: Record<string, unknown>;
|
||||
}
|
||||
|
||||
interface ListDealsResponseV2 {
|
||||
data: PipedriveDealV2[];
|
||||
additional_data?: {
|
||||
next_cursor?: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface GetDealResponseV2 {
|
||||
data: PipedriveDealV2;
|
||||
}
|
||||
|
||||
export const newDeal = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'new_deal',
|
||||
displayName: 'New Deal',
|
||||
description: 'Triggers when a new deal is created.',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'deal',
|
||||
'create',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<WebhookInformation>('_new_deal_trigger', {
|
||||
webhookId: webhook.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const response = await context.store?.get<WebhookInformation>('_new_deal_trigger');
|
||||
if (response !== null && response !== undefined) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
response.webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const dealsResponse = await pipedriveApiCall<ListDealsResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/deals',
|
||||
query: {
|
||||
limit: 5,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
if (isNil(dealsResponse.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const deal of dealsResponse.data) {
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(customFieldsResponse, deal);
|
||||
result.push(updatedDealProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as PayloadBody;
|
||||
|
||||
const dealResponse = await pipedriveApiCall<GetDealResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/deals/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
dealResponse.data,
|
||||
);
|
||||
|
||||
return [updatedDealProperties];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator_user_id: 8877,
|
||||
owner_id: 8877,
|
||||
person_id: 1101,
|
||||
org_id: 5,
|
||||
stage_id: 2,
|
||||
title: 'Deal One',
|
||||
value: 5000,
|
||||
currency: 'EUR',
|
||||
add_time: '2019-05-29T04:21:51Z',
|
||||
update_time: '2019-11-28T16:19:50Z',
|
||||
stage_change_time: '2019-11-28T15:41:22Z',
|
||||
is_deleted: false,
|
||||
status: 'open',
|
||||
probability: null,
|
||||
next_activity_id: 128,
|
||||
last_activity_id: null,
|
||||
lost_reason: null,
|
||||
visible_to: 1,
|
||||
close_time: null,
|
||||
pipeline_id: 1,
|
||||
won_time: '2019-11-27T11:40:36Z',
|
||||
first_won_time: '2019-11-27T11:40:36Z',
|
||||
lost_time: null,
|
||||
products_count: 0,
|
||||
files_count: 0,
|
||||
notes_count: 2,
|
||||
followers_count: 0,
|
||||
email_messages_count: 4,
|
||||
activities_count: 1,
|
||||
done_activities_count: 0,
|
||||
undone_activities_count: 1,
|
||||
participants_count: 1,
|
||||
expected_close_date: '2019-06-29',
|
||||
last_incoming_mail_time: '2019-05-29T18:21:42Z',
|
||||
last_outgoing_mail_time: '2019-05-30T03:45:35Z',
|
||||
label_ids: [11],
|
||||
rotten_time: null,
|
||||
smart_bcc_email: 'company+deal1@pipedrivemail.com',
|
||||
custom_fields: {
|
||||
d4de1c1518b4531717c676029a45911c340390a6: {
|
||||
value: 2300,
|
||||
currency: 'EUR',
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
interface WebhookInformation {
|
||||
webhookId: string;
|
||||
}
|
||||
|
||||
type PayloadBody = {
|
||||
data: PipedriveDealV2;
|
||||
previous: PipedriveDealV2;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,181 @@
|
||||
import { pipedriveAuth } from '../../';
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
pipedriveTransformV1CustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
interface PipedriveLeadV2 {
|
||||
id: string;
|
||||
title: string;
|
||||
owner_id: number;
|
||||
creator_id: number;
|
||||
label_ids: string[];
|
||||
value: number | null;
|
||||
expected_close_date: string | null;
|
||||
person_id: number | null;
|
||||
organization_id: number | null;
|
||||
is_archived: boolean;
|
||||
source_name: string;
|
||||
origin: string;
|
||||
origin_id: string | null;
|
||||
channel: number | null;
|
||||
channel_id: string | null;
|
||||
was_seen: boolean;
|
||||
next_activity_id: number | null;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
visible_to: number;
|
||||
custom_fields?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
interface LeadListResponseV2 {
|
||||
data: PipedriveLeadV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetLeadResponseV2 {
|
||||
data: PipedriveLeadV2;
|
||||
}
|
||||
|
||||
export const newLeadTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'new-lead',
|
||||
displayName: 'New Lead',
|
||||
description: 'Triggers when a new lead is created.',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const response = await httpClient.sendRequest<{ data: { id: string } }>({
|
||||
method: HttpMethod.POST,
|
||||
url: `${context.auth.data['api_domain']}/api/v1/webhooks`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: context.auth.access_token,
|
||||
},
|
||||
body: {
|
||||
event_object: 'lead',
|
||||
event_action: 'create',
|
||||
subscription_url: context.webhookUrl,
|
||||
version: '2.0',
|
||||
},
|
||||
});
|
||||
|
||||
await context.store?.put<{
|
||||
webhookId: string;
|
||||
}>('_new_lead_trigger', {
|
||||
webhookId: response.body.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const response = await context.store?.get<{
|
||||
webhookId: string;
|
||||
}>('_new_lead_trigger');
|
||||
if (response !== null && !isNil(response.webhookId)) {
|
||||
await httpClient.sendRequest({
|
||||
method: HttpMethod.DELETE,
|
||||
url: `${context.auth.data['api_domain']}/api/v1/webhooks/${response.webhookId}`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: context.auth.access_token,
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const response = await pipedriveApiCall<LeadListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/leads',
|
||||
query: {
|
||||
limit: 10,
|
||||
sort: 'update_time DESC',
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const lead of response.data) {
|
||||
const updatedLeadProperties = pipedriveTransformV1CustomFields(customFieldsResponse, lead);
|
||||
result.push(updatedLeadProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as {
|
||||
data: PipedriveLeadV2;
|
||||
previous: PipedriveLeadV2;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
|
||||
const leadResponse = await pipedriveApiCall<GetLeadResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v1/leads/${payloadBody.data.id}`,
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const updatedLeadProperties = pipedriveTransformV1CustomFields(
|
||||
customFieldsResponse,
|
||||
leadResponse.data,
|
||||
);
|
||||
|
||||
return [updatedLeadProperties];
|
||||
},
|
||||
sampleData: {
|
||||
id: 'f3c23480-c9b1-11ef-bc83-2b8218e028ef',
|
||||
title: 'Test lead',
|
||||
owner_id: 22701301,
|
||||
creator_id: 22701301,
|
||||
label_ids: ['a0e5f330-d2a7-4181-a6e3-a44d634b7bf7', '8a0e6918-1eee-4e56-a615-c81d712a6a77'],
|
||||
value: null,
|
||||
expected_close_date: null,
|
||||
person_id: 2,
|
||||
organization_id: 1,
|
||||
is_archived: false,
|
||||
source_name: 'Manually created',
|
||||
origin: 'ManuallyCreated',
|
||||
origin_id: null,
|
||||
channel: 1,
|
||||
channel_id: null,
|
||||
was_seen: true,
|
||||
next_activity_id: null,
|
||||
add_time: '2025-01-03T09:06:00.776Z',
|
||||
update_time: '2025-01-03T09:06:00.776Z',
|
||||
visible_to: 3,
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,121 @@
|
||||
import { pipedriveAuth } from '../../';
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedriveCommon,
|
||||
} from '../common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
interface PipedriveNoteV2 {
|
||||
id: number;
|
||||
user_id: number;
|
||||
deal_id: number | null;
|
||||
person_id: number | null;
|
||||
org_id: number | null;
|
||||
lead_id: string | null;
|
||||
content: string;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
is_deleted: boolean;
|
||||
last_update_user_id: number | null;
|
||||
}
|
||||
|
||||
interface NoteListResponseV2 {
|
||||
data: PipedriveNoteV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetNoteResponseV2 {
|
||||
data: PipedriveNoteV2;
|
||||
}
|
||||
|
||||
export const newNoteTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'new-note',
|
||||
displayName: 'New Note',
|
||||
description: 'Triggers when a new note is created.',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'note',
|
||||
'create',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<{
|
||||
webhookId: string;
|
||||
}>('_new_note_trigger', {
|
||||
webhookId: webhook.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const response = await context.store?.get<{
|
||||
webhookId: string;
|
||||
}>('_new_note_trigger');
|
||||
if (response !== null && response !== undefined) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
response.webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const response = await pipedriveApiCall<NoteListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/notes',
|
||||
query: {
|
||||
limit: 10,
|
||||
sort: 'update_time DESC',
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
return response.data;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as {
|
||||
data: PipedriveNoteV2;
|
||||
previous: PipedriveNoteV2;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
|
||||
const noteResponse = await pipedriveApiCall<GetNoteResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v1/notes/${payloadBody.data.id}`,
|
||||
});
|
||||
|
||||
return [noteResponse.data];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
user_id: 22701301,
|
||||
deal_id: null,
|
||||
person_id: 1,
|
||||
org_id: 1,
|
||||
lead_id: null,
|
||||
content: 'Note content for v2 API.',
|
||||
add_time: '2024-12-04T06:48:26Z',
|
||||
update_time: '2024-12-04T06:48:26Z',
|
||||
is_deleted: false,
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,202 @@
|
||||
import { pipedriveAuth } from '../../';
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedriveCommon,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { ORGANIZATION_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedriveOrganizationV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
owner_id: number;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
is_deleted: boolean;
|
||||
visible_to: number;
|
||||
picture_id: number | null;
|
||||
label_ids: number[];
|
||||
address: {
|
||||
value: string | null;
|
||||
street_number: string | null;
|
||||
route: string | null;
|
||||
sublocality: string | null;
|
||||
locality: string | null;
|
||||
admin_area_level_1: string | null;
|
||||
admin_area_level_2: string | null;
|
||||
country: string | null;
|
||||
postal_code: string | null;
|
||||
formatted_address: string | null;
|
||||
} | null;
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null;
|
||||
last_outgoing_mail_time?: string | null;
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
interface OrganizationListResponseV2 {
|
||||
data: PipedriveOrganizationV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetOrganizationResponseV2 {
|
||||
data: PipedriveOrganizationV2;
|
||||
}
|
||||
|
||||
export const newOrganizationTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'new-organization',
|
||||
displayName: 'New Organization',
|
||||
description: 'Triggers when a new organization is created.',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'organization',
|
||||
'create',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<{
|
||||
webhookId: string;
|
||||
}>('_new_organization_trigger', {
|
||||
webhookId: webhook.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const response = await context.store?.get<{
|
||||
webhookId: string;
|
||||
}>('_new_organization_trigger');
|
||||
if (response !== null && response !== undefined) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
response.webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const response = await pipedriveApiCall<OrganizationListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/organizations',
|
||||
query: {
|
||||
limit: 10,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: ORGANIZATION_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const org of response.data) {
|
||||
const updatedOrgProperties = pipedriveTransformCustomFields(customFieldsResponse, org);
|
||||
result.push(updatedOrgProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as {
|
||||
data: PipedriveOrganizationV2;
|
||||
previous: PipedriveOrganizationV2;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
|
||||
const orgResponse = await pipedriveApiCall<GetOrganizationResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/organizations/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: ORGANIZATION_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const updatedOrgProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
orgResponse.data,
|
||||
);
|
||||
|
||||
return [updatedOrgProperties];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
owner_id: 22701301,
|
||||
name: 'Pipedrive Sample Org',
|
||||
add_time: '2024-12-04T03:49:06Z',
|
||||
update_time: '2024-12-14T11:03:19Z',
|
||||
is_deleted: false,
|
||||
visible_to: 3,
|
||||
picture_id: null,
|
||||
label_ids: [],
|
||||
address: {
|
||||
value: 'Mustamäe tee 3, Tallinn, Estonia',
|
||||
street_number: '3',
|
||||
route: 'Mustamäe tee',
|
||||
sublocality: 'Kristiine',
|
||||
locality: 'Tallinn',
|
||||
admin_area_level_1: 'Harju maakond',
|
||||
admin_area_level_2: null,
|
||||
country: 'Estonia',
|
||||
postal_code: '10616',
|
||||
formatted_address: 'Mustamäe tee 3, 10616 Tallinn, Estonia',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,215 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { pipedriveAuth } from '../../';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedriveCommon,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { PERSON_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedrivePersonV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
owner_id: number;
|
||||
org_id: number | null;
|
||||
picture_id: number | null;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
is_deleted: boolean;
|
||||
visible_to: number;
|
||||
phones: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
emails: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
label_ids: number[];
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null;
|
||||
last_outgoing_mail_time?: string | null;
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
interface PersonListResponseV2 {
|
||||
data: PipedrivePersonV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetPersonResponseV2 {
|
||||
data: PipedrivePersonV2;
|
||||
}
|
||||
|
||||
export const newPerson = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'new_person',
|
||||
displayName: 'New Person',
|
||||
description: 'Triggers when a new person is created',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'person',
|
||||
'create',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<WebhookInformation>('_new_person_trigger', {
|
||||
webhookId: webhook.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const response = await context.store?.get<WebhookInformation>('_new_person_trigger');
|
||||
if (response !== null && response !== undefined) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
response.webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const personsResponse = await pipedriveApiCall<PersonListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/persons',
|
||||
query: {
|
||||
limit: 5,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: PERSON_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
if (isNil(personsResponse.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const person of personsResponse.data) {
|
||||
const updatedPersonProperties = pipedriveTransformCustomFields(customFieldsResponse, person);
|
||||
result.push(updatedPersonProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as PayloadBody;
|
||||
|
||||
const personResponse = await pipedriveApiCall<GetPersonResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/persons/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: PERSON_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
const updatedPersonProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
personResponse.data,
|
||||
);
|
||||
|
||||
return [updatedPersonProperties];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
owner_id: 123,
|
||||
org_id: 1234,
|
||||
name: 'Will Smith',
|
||||
first_name: 'Will',
|
||||
last_name: 'Smith',
|
||||
is_deleted: false,
|
||||
phones: [
|
||||
{
|
||||
value: '12345',
|
||||
primary: true,
|
||||
label: 'work',
|
||||
},
|
||||
],
|
||||
emails: [
|
||||
{
|
||||
value: 'will.smith@example.com',
|
||||
primary: true,
|
||||
label: 'work',
|
||||
},
|
||||
],
|
||||
add_time: '2017-10-18T13:23:07Z',
|
||||
update_time: '2020-05-08T05:30:20Z',
|
||||
visible_to: 3,
|
||||
picture_id: 4,
|
||||
next_activity_id: 128,
|
||||
last_activity_id: 34,
|
||||
last_incoming_mail_time: '2019-05-29T18:21:42Z',
|
||||
last_outgoing_mail_time: '2019-05-30T03:45:35Z',
|
||||
label_ids: [1],
|
||||
marketing_status: 'no_consent',
|
||||
},
|
||||
});
|
||||
|
||||
interface WebhookInformation {
|
||||
webhookId: string;
|
||||
}
|
||||
|
||||
type PayloadBody = {
|
||||
data: PipedrivePersonV2;
|
||||
previous: PipedrivePersonV2;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,221 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { filterIdProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedrivePaginatedV2ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { ORGANIZATION_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedriveOrganizationV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
owner_id: number;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
is_deleted: boolean;
|
||||
visible_to: number;
|
||||
picture_id: number | null;
|
||||
label_ids: number[];
|
||||
address: {
|
||||
value: string | null;
|
||||
street_number: string | null;
|
||||
route: string | null;
|
||||
sublocality: string | null;
|
||||
locality: string | null;
|
||||
admin_area_level_1: string | null;
|
||||
admin_area_level_2: string | null;
|
||||
country: string | null;
|
||||
postal_code: string | null;
|
||||
formatted_address: string | null;
|
||||
} | null;
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null;
|
||||
last_outgoing_mail_time?: string | null;
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
interface OrganizationListResponseV2 {
|
||||
data: PipedriveOrganizationV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export const organizationMatchingFilterTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'organization-matching-filter',
|
||||
displayName: 'Organization Matching Filter',
|
||||
description: 'Triggers when an organization newly matches a Pipedrive filter for the first time.',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
filterId: filterIdProp('org', true),
|
||||
},
|
||||
async onEnable(context) {
|
||||
const ids: number[] = [];
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/organizations',
|
||||
query: {
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
filter_id: context.propsValue.filterId,
|
||||
},
|
||||
});
|
||||
if (!isNil(response)) {
|
||||
response.forEach((organization) => {
|
||||
ids.push(organization.id);
|
||||
});
|
||||
}
|
||||
await context.store.put('organizations', JSON.stringify(ids));
|
||||
},
|
||||
async onDisable(context) {
|
||||
await context.store.delete('organizations');
|
||||
},
|
||||
async test(context) {
|
||||
const organizations = [];
|
||||
const response = await pipedriveApiCall<OrganizationListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/organizations',
|
||||
query: {
|
||||
limit: 10,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
filter_id: context.propsValue.filterId,
|
||||
include_fields: ORGANIZATION_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
for (const org of response.data) {
|
||||
organizations.push(org);
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const org of organizations) {
|
||||
const updatedOrgProperties = pipedriveTransformCustomFields(customFieldsResponse, org);
|
||||
result.push(updatedOrgProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const existingIds = (await context.store.get<string>('organizations')) ?? '[]';
|
||||
const parsedExistingIds = JSON.parse(existingIds) as number[];
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/organizations',
|
||||
query: {
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
filter_id: context.propsValue.filterId,
|
||||
include_fields: ORGANIZATION_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response) || response.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const newOrganizations = response.filter(
|
||||
(organization) => !parsedExistingIds.includes(organization.id),
|
||||
);
|
||||
|
||||
const newIds = newOrganizations.map((organization) => organization.id);
|
||||
|
||||
if (newIds.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
await context.store.put('organizations', JSON.stringify([...newIds, ...parsedExistingIds]));
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const org of newOrganizations) {
|
||||
const updatedOrgProperties = pipedriveTransformCustomFields(customFieldsResponse, org);
|
||||
result.push(updatedOrgProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
owner_id: 22701301,
|
||||
name: 'Pipedrive Sample Org',
|
||||
add_time: '2024-12-04T03:49:06Z',
|
||||
update_time: '2024-12-14T11:03:19Z',
|
||||
is_deleted: false,
|
||||
visible_to: 3,
|
||||
picture_id: null,
|
||||
label_ids: [],
|
||||
address: {
|
||||
value: 'Mustamäe tee 3, Tallinn, Estonia',
|
||||
street_number: '3',
|
||||
route: 'Mustamäe tee',
|
||||
sublocality: 'Kristiine',
|
||||
locality: 'Tallinn',
|
||||
admin_area_level_1: 'Harju maakond',
|
||||
admin_area_level_2: null,
|
||||
country: 'Estonia',
|
||||
postal_code: '10616',
|
||||
formatted_address: 'Mustamäe tee 3, 10616 Tallinn, Estonia',
|
||||
},
|
||||
custom_fields: {
|
||||
your_custom_field_key: 'your_custom_field_value',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,219 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { filterIdProp } from '../common/props';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedrivePaginatedV2ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { PERSON_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedrivePersonV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
owner_id: number;
|
||||
org_id: number | null;
|
||||
picture_id: number | null;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
is_deleted: boolean;
|
||||
visible_to: number;
|
||||
phones: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
emails: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
label_ids: number[];
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null;
|
||||
last_outgoing_mail_time?: string | null;
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
interface PersonListResponseV2 {
|
||||
data: PipedrivePersonV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetPersonResponseV2 {
|
||||
data: PipedrivePersonV2;
|
||||
}
|
||||
|
||||
export const personMatchingFilterTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'person-matching-filter',
|
||||
displayName: 'Person Matching Filter',
|
||||
description: 'Triggers when a person newly matches a Pipedrive filter for the first time.',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
filterId: filterIdProp('people', true),
|
||||
},
|
||||
async onEnable(context) {
|
||||
const ids: number[] = [];
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/persons',
|
||||
query: {
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
filter_id: context.propsValue.filterId,
|
||||
},
|
||||
});
|
||||
if (!isNil(response)) {
|
||||
response.forEach((person) => {
|
||||
ids.push(person.id);
|
||||
});
|
||||
}
|
||||
await context.store.put('persons', JSON.stringify(ids));
|
||||
},
|
||||
async onDisable(context) {
|
||||
await context.store.delete('persons');
|
||||
},
|
||||
async test(context) {
|
||||
const persons = [];
|
||||
const response = await pipedriveApiCall<PersonListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/persons',
|
||||
query: {
|
||||
limit: 10,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
filter_id: context.propsValue.filterId,
|
||||
include_fields: PERSON_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
for (const person of response.data) {
|
||||
persons.push(person);
|
||||
}
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
const result = [];
|
||||
for (const person of persons) {
|
||||
const updatedPersonProperties = pipedriveTransformCustomFields(customFieldsResponse, person);
|
||||
result.push(updatedPersonProperties);
|
||||
}
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const existingIds = (await context.store.get<string>('persons')) ?? '[]';
|
||||
const parsedExistingIds = JSON.parse(existingIds) as number[];
|
||||
|
||||
const response = await pipedrivePaginatedV2ApiCall<{ id: number }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/persons',
|
||||
query: {
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
filter_id: context.propsValue.filterId,
|
||||
include_fields: PERSON_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
if (isNil(response) || response.length === 0) {
|
||||
return [];
|
||||
}
|
||||
const newPersons = response.filter((person) => !parsedExistingIds.includes(person.id));
|
||||
const newIds = newPersons.map((person) => person.id);
|
||||
|
||||
if (newIds.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
await context.store.put('persons', JSON.stringify([...newIds, ...parsedExistingIds]));
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
const result = [];
|
||||
for (const person of newPersons) {
|
||||
const updatedPersonProperties = pipedriveTransformCustomFields(customFieldsResponse, person);
|
||||
result.push(updatedPersonProperties);
|
||||
}
|
||||
return result;
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
owner_id: 123,
|
||||
org_id: 1234,
|
||||
name: 'Will Smith',
|
||||
first_name: 'Will',
|
||||
last_name: 'Smith',
|
||||
is_deleted: false,
|
||||
phones: [
|
||||
{
|
||||
value: '12345',
|
||||
primary: true,
|
||||
label: 'work',
|
||||
},
|
||||
],
|
||||
emails: [
|
||||
{
|
||||
value: 'will.smith@example.com',
|
||||
primary: true,
|
||||
label: 'work',
|
||||
},
|
||||
],
|
||||
add_time: '2017-10-18T13:23:07Z',
|
||||
update_time: '2020-05-08T05:30:20Z',
|
||||
visible_to: 3,
|
||||
picture_id: 4,
|
||||
next_activity_id: 128,
|
||||
last_activity_id: 34,
|
||||
last_incoming_mail_time: '2019-05-29T18:21:42Z',
|
||||
last_outgoing_mail_time: '2019-05-30T03:45:35Z',
|
||||
label_ids: [1],
|
||||
marketing_status: 'no_consent',
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,331 @@
|
||||
import { pipedriveAuth } from '../../index';
|
||||
import {
|
||||
createTrigger,
|
||||
DropdownOption,
|
||||
PiecePropValueSchema,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedrivePaginatedV2ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField, RequestParams, WebhookCreateResponse } from '../common/types';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { DEAL_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedriveDealV2 {
|
||||
id: number;
|
||||
title: string;
|
||||
creator_user_id: number;
|
||||
owner_id: number;
|
||||
person_id: number | null;
|
||||
org_id: number | null;
|
||||
stage_id: number;
|
||||
pipeline_id: number;
|
||||
value: number;
|
||||
currency: string;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
stage_change_time: string;
|
||||
is_deleted: boolean;
|
||||
status: 'open' | 'won' | 'lost';
|
||||
probability: number | null;
|
||||
lost_reason: string | null;
|
||||
visible_to: number;
|
||||
close_time: string | null;
|
||||
won_time: string | null;
|
||||
first_won_time?: string;
|
||||
lost_time: string | null;
|
||||
products_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
participants_count?: number;
|
||||
expected_close_date: string | null;
|
||||
last_incoming_mail_time?: string;
|
||||
last_outgoing_mail_time?: string;
|
||||
label_ids: number[];
|
||||
rotten_time: string | null;
|
||||
smart_bcc_email?: string;
|
||||
acv?: number;
|
||||
arr?: number;
|
||||
mrr?: number;
|
||||
custom_fields: Record<string, unknown>;
|
||||
}
|
||||
|
||||
interface PipedriveStageV2 {
|
||||
id: number;
|
||||
order_nr: number;
|
||||
name: string;
|
||||
is_deleted: boolean;
|
||||
deal_probability: number;
|
||||
pipeline_id: number;
|
||||
is_deal_rot_enabled: boolean;
|
||||
days_to_rotten: number | null;
|
||||
add_time: string;
|
||||
update_time: string | null;
|
||||
}
|
||||
|
||||
interface ListDealsResponseV2 {
|
||||
data: PipedriveDealV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetDealResponseV2 {
|
||||
data: PipedriveDealV2;
|
||||
}
|
||||
|
||||
export const updatedDealStageTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'updated-deal-stage',
|
||||
displayName: 'Updated Deal Stage',
|
||||
description: "Triggers when a deal's stage is updated.",
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
props: {
|
||||
stage_id: Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Stage in Pipeline',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
placeholder: 'please connect your account.',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const response = await pipedrivePaginatedV2ApiCall<PipedriveStageV2>({
|
||||
accessToken: authValue.access_token,
|
||||
apiDomain: authValue.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/stages',
|
||||
});
|
||||
|
||||
const options: DropdownOption<number>[] = [];
|
||||
for (const stage of response) {
|
||||
options.push({
|
||||
label: `${stage.name}`,
|
||||
value: stage.id,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
}),
|
||||
},
|
||||
async onEnable(context) {
|
||||
const response = await pipedriveApiCall<WebhookCreateResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/v1/webhooks',
|
||||
body: {
|
||||
subscription_url: context.webhookUrl,
|
||||
event_object: 'deal',
|
||||
event_action: 'change',
|
||||
version: '2.0',
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>('updated-deal-stage-trigger', response.data.id);
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhook = await context.store.get<string>('updated-deal-stage-trigger');
|
||||
if (webhook) {
|
||||
await pipedriveApiCall<WebhookCreateResponse>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.DELETE,
|
||||
resourceUri: `/v1/webhooks/${webhook}`,
|
||||
});
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const stageId = context.propsValue.stage_id;
|
||||
|
||||
const qs: RequestParams = {
|
||||
limit: 10,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
};
|
||||
|
||||
if (stageId) {
|
||||
qs['stage_id'] = stageId.toString();
|
||||
}
|
||||
|
||||
const dealsResponse = await pipedriveApiCall<ListDealsResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/deals',
|
||||
query: qs,
|
||||
});
|
||||
|
||||
if (isNil(dealsResponse.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const deal of dealsResponse.data) {
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(customFieldsResponse, deal);
|
||||
|
||||
const stageResponse = await pipedriveApiCall<{ data: PipedriveStageV2 }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/stages/${updatedDealProperties.stage_id}`,
|
||||
});
|
||||
|
||||
updatedDealProperties['stage'] = stageResponse.data;
|
||||
result.push(updatedDealProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const stageId = context.propsValue.stage_id;
|
||||
|
||||
const payloadBody = context.payload.body as PayloadBody;
|
||||
const currentDealData = payloadBody.data;
|
||||
const previousDealData = payloadBody.previous;
|
||||
|
||||
// Check if previous data exists and has stage_id
|
||||
if (!previousDealData || isNil(previousDealData.stage_id)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Only trigger if stage_id actually changed
|
||||
if (currentDealData.stage_id !== previousDealData.stage_id) {
|
||||
// If stage filter is set, only trigger if new stage matches the filter
|
||||
if (stageId && currentDealData.stage_id !== stageId) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const dealResponse = await pipedriveApiCall<GetDealResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/deals/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
dealResponse.data,
|
||||
);
|
||||
|
||||
const stageResponse = await pipedriveApiCall<{ data: PipedriveStageV2 }>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/stages/${currentDealData.stage_id}`,
|
||||
});
|
||||
|
||||
updatedDealProperties['stage'] = stageResponse.data;
|
||||
|
||||
return [updatedDealProperties];
|
||||
}
|
||||
return [];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator_user_id: 8877,
|
||||
owner_id: 8877,
|
||||
person_id: 1101,
|
||||
org_id: 5,
|
||||
stage_id: 2,
|
||||
title: 'Deal One',
|
||||
value: 5000,
|
||||
currency: 'EUR',
|
||||
add_time: '2019-05-29T04:21:51Z',
|
||||
update_time: '2019-11-28T16:19:50Z',
|
||||
stage_change_time: '2019-11-28T15:41:22Z',
|
||||
is_deleted: false,
|
||||
status: 'open',
|
||||
probability: null,
|
||||
next_activity_id: 128,
|
||||
last_activity_id: null,
|
||||
lost_reason: null,
|
||||
visible_to: 1,
|
||||
close_time: null,
|
||||
pipeline_id: 1,
|
||||
won_time: '2019-11-27T11:40:36Z',
|
||||
first_won_time: '2019-11-27T11:40:36Z',
|
||||
lost_time: null,
|
||||
products_count: 0,
|
||||
files_count: 0,
|
||||
notes_count: 2,
|
||||
followers_count: 0,
|
||||
email_messages_count: 4,
|
||||
activities_count: 1,
|
||||
done_activities_count: 0,
|
||||
undone_activities_count: 1,
|
||||
participants_count: 1,
|
||||
expected_close_date: '2019-06-29',
|
||||
last_incoming_mail_time: '2019-05-29T18:21:42Z',
|
||||
last_outgoing_mail_time: '2019-05-30T03:45:35Z',
|
||||
label_ids: [11],
|
||||
rotten_time: null,
|
||||
smart_bcc_email: 'company+deal1@pipedrivemail.com',
|
||||
stage: {
|
||||
id: 2,
|
||||
order_nr: 1,
|
||||
name: 'Qualification',
|
||||
is_deleted: false,
|
||||
deal_probability: false,
|
||||
pipeline_id: 1,
|
||||
is_deal_rot_enabled: false,
|
||||
days_to_rotten: null,
|
||||
add_time: '2018-09-04T06:24:59Z',
|
||||
update_time: null,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
type PayloadBody = {
|
||||
data: PipedriveDealV2;
|
||||
previous: PipedriveDealV2;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,448 @@
|
||||
import {
|
||||
createTrigger,
|
||||
DropdownOption,
|
||||
DynamicPropsValue,
|
||||
PiecePropValueSchema,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedriveCommon,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { pipedriveAuth } from '../..';
|
||||
import { AuthenticationType, httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { FieldsResponse, GetField, RequestParams } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { DEAL_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedriveDealV2 {
|
||||
id: number;
|
||||
title: string;
|
||||
creator_user_id: number;
|
||||
owner_id: number;
|
||||
person_id: number | null;
|
||||
org_id: number | null;
|
||||
stage_id: number;
|
||||
pipeline_id: number;
|
||||
value: number;
|
||||
currency: string;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
stage_change_time: string;
|
||||
is_deleted: boolean;
|
||||
status: 'open' | 'won' | 'lost';
|
||||
probability: number | null;
|
||||
lost_reason: string | null;
|
||||
visible_to: number;
|
||||
close_time: string | null;
|
||||
won_time: string | null;
|
||||
first_won_time?: string;
|
||||
lost_time: string | null;
|
||||
products_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
participants_count?: number;
|
||||
expected_close_date: string | null;
|
||||
last_incoming_mail_time?: string;
|
||||
last_outgoing_mail_time?: string;
|
||||
label_ids: number[];
|
||||
rotten_time: string | null;
|
||||
smart_bcc_email?: string;
|
||||
acv?: number;
|
||||
arr?: number;
|
||||
mrr?: number;
|
||||
custom_fields: Record<string, unknown>;
|
||||
}
|
||||
|
||||
interface PipedriveStageV2 {
|
||||
id: number;
|
||||
order_nr: number;
|
||||
name: string;
|
||||
is_deleted: boolean;
|
||||
deal_probability: number;
|
||||
pipeline_id: number;
|
||||
is_deal_rot_enabled: boolean;
|
||||
days_to_rotten: number | null;
|
||||
add_time: string;
|
||||
update_time: string | null;
|
||||
}
|
||||
|
||||
interface ListDealsResponseV2 {
|
||||
data: PipedriveDealV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetDealResponseV2 {
|
||||
data: PipedriveDealV2;
|
||||
}
|
||||
|
||||
export const updatedDeal = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'updated_deal',
|
||||
displayName: 'Updated Deal',
|
||||
description: 'Triggers when a deal is updated.',
|
||||
props: {
|
||||
filter_by: Property.StaticDropdown({
|
||||
displayName: 'Filter by',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Deal Status',
|
||||
value: 'status',
|
||||
},
|
||||
{
|
||||
label: 'Stage in Pipeline',
|
||||
value: 'stage_id',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
filter_by_field_value: Property.DynamicProperties({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Field Values',
|
||||
required: false,
|
||||
refreshers: ['filter_by'],
|
||||
props: async ({ auth, filter_by }) => {
|
||||
if (!auth || !filter_by) return {};
|
||||
|
||||
const props: DynamicPropsValue = {};
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const filterBy = filter_by as unknown as string;
|
||||
|
||||
if (filterBy === 'status') {
|
||||
props['field_value'] = Property.StaticDropdown({
|
||||
displayName: 'Deal Status',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Open', value: 'open' },
|
||||
{ label: 'Won', value: 'won' },
|
||||
{ label: 'Lost', value: 'lost' },
|
||||
{ label: 'Deleted', value: 'deleted' },
|
||||
],
|
||||
},
|
||||
});
|
||||
}
|
||||
if (filterBy === 'stage_id') {
|
||||
const response = await httpClient.sendRequest<{
|
||||
data: PipedriveStageV2[];
|
||||
}>({
|
||||
method: HttpMethod.GET,
|
||||
url: `${authValue.data['api_domain']}/api/v2/stages`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: authValue.access_token,
|
||||
},
|
||||
});
|
||||
props['field_value'] = Property.StaticDropdown({
|
||||
displayName: 'Stage in Pipeline',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: response.body.data.map((stage) => {
|
||||
return {
|
||||
label: stage.name,
|
||||
value: stage.id,
|
||||
};
|
||||
}),
|
||||
},
|
||||
});
|
||||
}
|
||||
return props;
|
||||
},
|
||||
}),
|
||||
field_to_watch: Property.Dropdown({
|
||||
auth: pipedriveAuth,
|
||||
displayName: 'Field to watch for Changes On',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
placeholder: 'Connect your account',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
const authValue = auth as PiecePropValueSchema<typeof pipedriveAuth>;
|
||||
const response = await httpClient.sendRequest<FieldsResponse>({
|
||||
method: HttpMethod.GET,
|
||||
url: `${authValue.data['api_domain']}/api/v1/dealFields`,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: authValue.access_token,
|
||||
},
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [];
|
||||
|
||||
for (const field of response.body.data) {
|
||||
options.push({
|
||||
label: field.name,
|
||||
value: field.key,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'deal',
|
||||
'change',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<string>('_updated_deal_trigger', webhook.data.id);
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhookId = await context.store.get<string>('_updated_deal_trigger');
|
||||
if (webhookId) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const filterBy = context.propsValue.filter_by;
|
||||
const filterByValue = context.propsValue.filter_by_field_value!['field_value'];
|
||||
|
||||
const qs: RequestParams = {
|
||||
limit: 10,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
};
|
||||
|
||||
if (filterBy && filterByValue) {
|
||||
qs[filterBy] = filterByValue;
|
||||
}
|
||||
|
||||
const dealsResponse = await pipedriveApiCall<ListDealsResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/deals',
|
||||
query: qs,
|
||||
});
|
||||
|
||||
if (isNil(dealsResponse.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const deal of dealsResponse.data) {
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(customFieldsResponse, deal);
|
||||
result.push(updatedDealProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const filterBy = context.propsValue.filter_by;
|
||||
const filterByValue = context.propsValue.filter_by_field_value!['field_value'];
|
||||
const fieldToWatch =
|
||||
context.propsValue.field_to_watch === 'label'
|
||||
? 'label_ids'
|
||||
: context.propsValue.field_to_watch;
|
||||
|
||||
const payloadBody = context.payload.body as {
|
||||
data: Record<string, any>;
|
||||
previous: Record<string, any>;
|
||||
meta: {
|
||||
action: string;
|
||||
entity: string;
|
||||
};
|
||||
};
|
||||
const currentDealData = flattenCustomFields(payloadBody.data);
|
||||
const previousDealData = flattenCustomFields(payloadBody.previous);
|
||||
|
||||
const noFilterAndNoField = !filterBy && !fieldToWatch;
|
||||
const isFieldChanged =
|
||||
fieldToWatch &&
|
||||
fieldToWatch in previousDealData && // The previous object now only contains fields whose values have changed
|
||||
currentDealData[fieldToWatch] !== previousDealData[fieldToWatch];
|
||||
const isFilterMatched = filterBy && currentDealData[filterBy] === filterByValue;
|
||||
|
||||
if (
|
||||
noFilterAndNoField ||
|
||||
(!filterBy && isFieldChanged) ||
|
||||
(isFilterMatched && (!fieldToWatch || isFieldChanged))
|
||||
) {
|
||||
const dealResponse = await pipedriveApiCall<GetDealResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/deals/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: DEAL_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/dealFields',
|
||||
});
|
||||
|
||||
const updatedDealProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
dealResponse.data,
|
||||
);
|
||||
|
||||
return [updatedDealProperties];
|
||||
}
|
||||
return [];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
creator_user_id: 8877,
|
||||
owner_id: 8877,
|
||||
person_id: 1101,
|
||||
org_id: 5,
|
||||
stage_id: 2,
|
||||
title: 'Deal One',
|
||||
value: 5000,
|
||||
currency: 'EUR',
|
||||
add_time: '2019-05-29T04:21:51Z',
|
||||
update_time: '2019-11-28T16:19:50Z',
|
||||
stage_change_time: '2019-11-28T15:41:22Z',
|
||||
is_deleted: false,
|
||||
status: 'open',
|
||||
probability: null,
|
||||
next_activity_id: 128,
|
||||
last_activity_id: null,
|
||||
lost_reason: null,
|
||||
visible_to: 1,
|
||||
close_time: null,
|
||||
pipeline_id: 1,
|
||||
won_time: '2019-11-27T11:40:36Z',
|
||||
first_won_time: '2019-11-27T11:40:36Z',
|
||||
lost_time: null,
|
||||
products_count: 0,
|
||||
files_count: 0,
|
||||
notes_count: 2,
|
||||
followers_count: 0,
|
||||
email_messages_count: 4,
|
||||
activities_count: 1,
|
||||
done_activities_count: 0,
|
||||
undone_activities_count: 1,
|
||||
participants_count: 1,
|
||||
expected_close_date: '2019-06-29',
|
||||
last_incoming_mail_time: '2019-05-29T18:21:42Z',
|
||||
last_outgoing_mail_time: '2019-05-30T03:45:35Z',
|
||||
label_ids: [11],
|
||||
rotten_time: null,
|
||||
smart_bcc_email: 'company+deal1@pipedrivemail.com',
|
||||
},
|
||||
});
|
||||
|
||||
function flattenCustomFields(deal: Record<string, any>): Record<string, any> {
|
||||
const { custom_fields, ...rest } = deal;
|
||||
|
||||
if (!custom_fields) return rest;
|
||||
|
||||
const flatCustomFields: Record<string, any> = {};
|
||||
|
||||
for (const [key, value] of Object.entries(custom_fields as Record<string, any>)) {
|
||||
if (isNil(value)) {
|
||||
flatCustomFields[key] = value;
|
||||
continue;
|
||||
}
|
||||
|
||||
const type = value['type'] as string;
|
||||
|
||||
switch (type) {
|
||||
case 'varchar':
|
||||
case 'text':
|
||||
case 'varchar_auto':
|
||||
case 'double':
|
||||
case 'phone':
|
||||
case 'date':
|
||||
flatCustomFields[key] = value?.value;
|
||||
break;
|
||||
case 'set':
|
||||
flatCustomFields[key] = value?.values?.length
|
||||
? value.values.map((v: any) => v.id).join(',')
|
||||
: '';
|
||||
break;
|
||||
case 'enum':
|
||||
case 'user':
|
||||
case 'org':
|
||||
case 'people':
|
||||
flatCustomFields[key] = value?.id;
|
||||
break;
|
||||
case 'monetary':
|
||||
flatCustomFields[key] = value?.value;
|
||||
flatCustomFields[`${key}_currency`] = value?.currency;
|
||||
break;
|
||||
case 'time':
|
||||
flatCustomFields[key] = value?.value;
|
||||
flatCustomFields[`${key}_timezone_id`] = value?.timezone_id;
|
||||
break;
|
||||
case 'timerange':
|
||||
flatCustomFields[key] = value?.from;
|
||||
flatCustomFields[`${key}_timezone_id`] = value?.timezone_id;
|
||||
flatCustomFields[`${key}_until`] = value?.until;
|
||||
break;
|
||||
case 'daterange':
|
||||
flatCustomFields[key] = value?.from;
|
||||
flatCustomFields[`${key}_until`] = value?.until;
|
||||
break;
|
||||
case 'address':
|
||||
flatCustomFields[key] = value?.value;
|
||||
flatCustomFields[`${key}_subpremise`] = value?.subpremise;
|
||||
flatCustomFields[`${key}_street_number`] = value?.street_number;
|
||||
flatCustomFields[`${key}_route`] = value?.route;
|
||||
flatCustomFields[`${key}_sublocality`] = value?.sublocality;
|
||||
flatCustomFields[`${key}_locality`] = value?.locality;
|
||||
flatCustomFields[`${key}_admin_area_level_1`] = value?.admin_area_level_1;
|
||||
flatCustomFields[`${key}_admin_area_level_2`] = value?.admin_area_level_2;
|
||||
flatCustomFields[`${key}_country`] = value?.country;
|
||||
flatCustomFields[`${key}_postal_code`] = value?.postal_code;
|
||||
flatCustomFields[`${key}_formatted_address`] = value?.formatted_address;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
...rest,
|
||||
...flatCustomFields,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
import { pipedriveAuth } from '../../';
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedriveCommon,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { ORGANIZATION_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedriveOrganizationV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
owner_id: number;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
is_deleted: boolean;
|
||||
visible_to: number;
|
||||
picture_id: number | null;
|
||||
label_ids: number[];
|
||||
address: {
|
||||
value: string | null;
|
||||
street_number: string | null;
|
||||
route: string | null;
|
||||
sublocality: string | null;
|
||||
locality: string | null;
|
||||
admin_area_level_1: string | null;
|
||||
admin_area_level_2: string | null;
|
||||
country: string | null;
|
||||
postal_code: string | null;
|
||||
formatted_address: string | null;
|
||||
} | null;
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null;
|
||||
last_outgoing_mail_time?: string | null;
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
interface OrganizationListResponseV2 {
|
||||
data: PipedriveOrganizationV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetOrganizationResponseV2 {
|
||||
data: PipedriveOrganizationV2;
|
||||
}
|
||||
|
||||
export const updatedOrganizationTrigger = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'updated-organization',
|
||||
displayName: 'Updated Organization',
|
||||
description: 'Triggers when an existing organization is updated.',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'organization',
|
||||
'change',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<string>('_updated_organization_trigger', webhook.data.id);
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhookId = await context.store.get<string>('_updated_organization_trigger');
|
||||
if (webhookId !== null && webhookId !== undefined) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const response = await pipedriveApiCall<OrganizationListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/organizations',
|
||||
query: {
|
||||
limit: 10,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: ORGANIZATION_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
if (isNil(response.data)) {
|
||||
return [];
|
||||
}
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const org of response.data) {
|
||||
const updatedOrgProperties = pipedriveTransformCustomFields(customFieldsResponse, org);
|
||||
result.push(updatedOrgProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as {
|
||||
data: Record<string, any>;
|
||||
previous: Record<string, any>;
|
||||
};
|
||||
|
||||
const orgResponse = await pipedriveApiCall<GetOrganizationResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/organizations/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: ORGANIZATION_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/organizationFields',
|
||||
});
|
||||
|
||||
const updatedOrgProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
orgResponse.data,
|
||||
);
|
||||
|
||||
return [updatedOrgProperties];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
owner_id: 22701301,
|
||||
name: 'Pipedrive Sample Org',
|
||||
add_time: '2024-12-04T03:49:06Z',
|
||||
update_time: '2024-12-14T11:03:19Z',
|
||||
is_deleted: false,
|
||||
visible_to: 3,
|
||||
picture_id: null,
|
||||
label_ids: [],
|
||||
address: {
|
||||
value: 'Mustamäe tee 3, Tallinn, Estonia',
|
||||
street_number: '3',
|
||||
route: 'Mustamäe tee',
|
||||
sublocality: 'Kristiine',
|
||||
locality: 'Tallinn',
|
||||
admin_area_level_1: 'Harju maakond',
|
||||
admin_area_level_2: null,
|
||||
country: 'Estonia',
|
||||
postal_code: '10616',
|
||||
formatted_address: 'Mustamäe tee 3, 10616 Tallinn, Estonia',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,204 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { pipedriveAuth } from '../../';
|
||||
import {
|
||||
pipedriveApiCall,
|
||||
pipedriveCommon,
|
||||
pipedrivePaginatedV1ApiCall,
|
||||
pipedriveTransformCustomFields,
|
||||
} from '../common';
|
||||
import { GetField } from '../common/types';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { PERSON_OPTIONAL_FIELDS } from '../common/constants';
|
||||
|
||||
interface PipedrivePersonV2 {
|
||||
id: number;
|
||||
name: string;
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
owner_id: number;
|
||||
org_id: number | null;
|
||||
picture_id: number | null;
|
||||
add_time: string;
|
||||
update_time: string;
|
||||
is_deleted: boolean;
|
||||
visible_to: number;
|
||||
phones: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
emails: {
|
||||
value: string;
|
||||
primary: boolean;
|
||||
label: string;
|
||||
}[];
|
||||
label_ids: number[];
|
||||
custom_fields: Record<string, unknown>;
|
||||
next_activity_id?: number | null;
|
||||
last_activity_id?: number | null;
|
||||
open_deals_count?: number;
|
||||
related_open_deals_count?: number;
|
||||
closed_deals_count?: number;
|
||||
related_closed_deals_count?: number;
|
||||
participant_open_deals_count?: number;
|
||||
participant_closed_deals_count?: number;
|
||||
email_messages_count?: number;
|
||||
activities_count?: number;
|
||||
done_activities_count?: number;
|
||||
undone_activities_count?: number;
|
||||
files_count?: number;
|
||||
notes_count?: number;
|
||||
followers_count?: number;
|
||||
won_deals_count?: number;
|
||||
related_won_deals_count?: number;
|
||||
lost_deals_count?: number;
|
||||
related_lost_deals_count?: number;
|
||||
last_incoming_mail_time?: string | null;
|
||||
last_outgoing_mail_time?: string | null;
|
||||
marketing_status?: string;
|
||||
doi_status?: string;
|
||||
}
|
||||
|
||||
interface PersonListResponseV2 {
|
||||
data: PipedrivePersonV2[];
|
||||
additional_data?: {
|
||||
pagination?: {
|
||||
start: number;
|
||||
limit: number;
|
||||
more_items_in_collection: boolean;
|
||||
next_cursor?: string;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
interface GetPersonResponseV2 {
|
||||
data: PipedrivePersonV2;
|
||||
}
|
||||
|
||||
export const updatedPerson = createTrigger({
|
||||
auth: pipedriveAuth,
|
||||
name: 'updated_person',
|
||||
displayName: 'Updated Person',
|
||||
description: 'Triggers when a person is updated.',
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const webhook = await pipedriveCommon.subscribeWebhook(
|
||||
'person',
|
||||
'change',
|
||||
context.webhookUrl!,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
await context.store?.put<string>('_updated_person_trigger', webhook.data.id);
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const webhookId = await context.store.get<string>('_updated_person_trigger');
|
||||
if (webhookId !== null && webhookId !== undefined) {
|
||||
await pipedriveCommon.unsubscribeWebhook(
|
||||
webhookId,
|
||||
context.auth.data['api_domain'],
|
||||
context.auth.access_token,
|
||||
);
|
||||
}
|
||||
},
|
||||
async test(context) {
|
||||
const personsResponse = await pipedriveApiCall<PersonListResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v2/persons',
|
||||
query: {
|
||||
limit: 5,
|
||||
sort_by: 'update_time',
|
||||
sort_direction: 'desc',
|
||||
include_fields: PERSON_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
if (isNil(personsResponse.data)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const result = [];
|
||||
|
||||
for (const person of personsResponse.data) {
|
||||
const updatedPersonProperties = pipedriveTransformCustomFields(customFieldsResponse, person);
|
||||
result.push(updatedPersonProperties);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
async run(context) {
|
||||
const payloadBody = context.payload.body as {
|
||||
data: Record<string, any>;
|
||||
previous: Record<string, any>;
|
||||
};
|
||||
|
||||
const personResponse = await pipedriveApiCall<GetPersonResponseV2>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/v2/persons/${payloadBody.data.id}`,
|
||||
query: {
|
||||
include_fields: PERSON_OPTIONAL_FIELDS.join(','),
|
||||
},
|
||||
});
|
||||
|
||||
const customFieldsResponse = await pipedrivePaginatedV1ApiCall<GetField>({
|
||||
accessToken: context.auth.access_token,
|
||||
apiDomain: context.auth.data['api_domain'],
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/v1/personFields',
|
||||
});
|
||||
|
||||
const updatedPersonProperties = pipedriveTransformCustomFields(
|
||||
customFieldsResponse,
|
||||
personResponse.data,
|
||||
);
|
||||
|
||||
return [updatedPersonProperties];
|
||||
},
|
||||
sampleData: {
|
||||
id: 1,
|
||||
owner_id: 123,
|
||||
org_id: 1234,
|
||||
name: 'Will Smith',
|
||||
first_name: 'Will',
|
||||
last_name: 'Smith',
|
||||
is_deleted: false,
|
||||
phones: [
|
||||
{
|
||||
value: '12345',
|
||||
primary: true,
|
||||
label: 'work',
|
||||
},
|
||||
],
|
||||
emails: [
|
||||
{
|
||||
value: 'will.smith@example.com',
|
||||
primary: true,
|
||||
label: 'work',
|
||||
},
|
||||
],
|
||||
add_time: '2017-10-18T13:23:07Z',
|
||||
update_time: '2020-05-08T05:30:20Z',
|
||||
visible_to: 3,
|
||||
picture_id: 4,
|
||||
next_activity_id: 128,
|
||||
last_activity_id: 34,
|
||||
last_incoming_mail_time: '2019-05-29T18:21:42Z',
|
||||
last_outgoing_mail_time: '2019-05-30T03:45:35Z',
|
||||
label_ids: [1],
|
||||
marketing_status: 'no_consent',
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"extends": "../../../../tsconfig.base.json",
|
||||
"files": [],
|
||||
"include": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.lib.json"
|
||||
}
|
||||
],
|
||||
"compilerOptions": {
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"outDir": "../../../../dist/out-tsc",
|
||||
"declaration": true,
|
||||
"types": ["node"]
|
||||
},
|
||||
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
Reference in New Issue
Block a user