Skip to main content
Glama
create-company.ts13.4 kB
import { createAction, Property, OAuth2PropertyValue } from '@activepieces/pieces-framework'; import { bexioAuth } from '../../index'; import { BexioClient } from '../common/client'; export const createCompanyAction = createAction({ auth: bexioAuth, name: 'create_company', displayName: 'Create Company', description: 'Create a new company contact', props: { name_1: Property.ShortText({ displayName: 'Company Name', description: 'The name of the company', required: true, }), name_2: Property.ShortText({ displayName: 'Company Addition', description: 'Additional company name (e.g., "Ltd.", "Inc.")', required: false, }), nr: Property.ShortText({ displayName: 'Contact Number', description: 'Contact number (leave empty to auto-assign)', required: false, }), salutation_id: Property.Dropdown({ auth: bexioAuth, displayName: 'Salutation', description: 'Salutation for the company', required: false, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const salutations = await client.get<Array<{ id: number; name: string }>>('/2.0/salutation'); return { disabled: false, options: salutations.map((sal) => ({ label: sal.name, value: sal.id, })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load salutations', options: [], }; } }, }), title_id: Property.Dropdown({ auth: bexioAuth, displayName: 'Title', description: 'Title for the company', required: false, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const titles = await client.get<Array<{ id: number; name: string }>>('/2.0/title'); return { disabled: false, options: titles.map((title) => ({ label: title.name, value: title.id, })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load titles', options: [], }; } }, }), street_name: Property.ShortText({ displayName: 'Street Name', description: 'Street name', required: false, }), house_number: Property.ShortText({ displayName: 'House Number', description: 'House number', required: false, }), address_addition: Property.ShortText({ displayName: 'Address Addition', description: 'Additional address information (e.g., "Building C")', required: false, }), postcode: Property.ShortText({ displayName: 'Postcode', description: 'Postal code', required: false, }), city: Property.ShortText({ displayName: 'City', description: 'City', required: false, }), country_id: Property.Dropdown({ auth: bexioAuth, displayName: 'Country', description: 'Country', required: false, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const countries = await client.get<Array<{ id: number; name: string; name_short: string; iso3166_alpha2: string }>>('/2.0/country'); return { disabled: false, options: countries.map((country) => ({ label: country.name, value: country.id, })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load countries', options: [], }; } }, }), mail: Property.ShortText({ displayName: 'Email', description: 'Primary email address', required: false, }), mail_second: Property.ShortText({ displayName: 'Secondary Email', description: 'Secondary email address', required: false, }), phone_fixed: Property.ShortText({ displayName: 'Phone', description: 'Fixed phone number', required: false, }), phone_fixed_second: Property.ShortText({ displayName: 'Secondary Phone', description: 'Secondary fixed phone number', required: false, }), phone_mobile: Property.ShortText({ displayName: 'Mobile Phone', description: 'Mobile phone number', required: false, }), fax: Property.ShortText({ displayName: 'Fax', description: 'Fax number', required: false, }), url: Property.ShortText({ displayName: 'Website', description: 'Company website URL', required: false, }), skype_name: Property.ShortText({ displayName: 'Skype Name', description: 'Skype username', required: false, }), remarks: Property.LongText({ displayName: 'Remarks', description: 'Additional notes about the company', required: false, }), language_id: Property.Dropdown({ auth: bexioAuth, displayName: 'Language', description: 'Preferred language', required: false, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const languages = await client.get<Array<{ id: number; name: string }>>('/2.0/language'); return { disabled: false, options: languages.map((lang) => ({ label: lang.name, value: lang.id, })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load languages', options: [], }; } }, }), contact_group_ids: Property.MultiSelectDropdown({ auth: bexioAuth, displayName: 'Contact Groups', description: 'Select contact groups', required: false, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const groups = await client.get<Array<{ id: number; name: string }>>('/2.0/contact_group'); return { disabled: false, options: groups.map((group) => ({ label: group.name, value: group.id.toString(), })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load contact groups', options: [], }; } }, }), contact_branch_ids: Property.MultiSelectDropdown({ auth: bexioAuth, displayName: 'Contact Sectors', description: 'Select contact sectors', required: false, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const branches = await client.get<Array<{ id: number; name: string }>>('/2.0/contact_branch'); return { disabled: false, options: branches.map((branch) => ({ label: branch.name, value: branch.id.toString(), })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load contact sectors', options: [], }; } }, }), user_id: Property.Dropdown({ auth: bexioAuth, displayName: 'User', description: 'User assigned to this contact', required: true, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const users = await client.get<Array<{ id: number; firstname: string | null; lastname: string | null; email: string }>>('/3.0/users'); return { disabled: false, options: users.map((user) => ({ label: `${user.firstname || ''} ${user.lastname || ''}`.trim() || user.email, value: user.id, })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load users', options: [], }; } }, }), owner_id: Property.Dropdown({ auth: bexioAuth, displayName: 'Owner', description: 'Owner of this contact', required: true, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Connect your Bexio account first', options: [], }; } try { const client = new BexioClient(auth); const users = await client.get<Array<{ id: number; firstname: string | null; lastname: string | null; email: string }>>('/3.0/users'); return { disabled: false, options: users.map((user) => ({ label: `${user.firstname || ''} ${user.lastname || ''}`.trim() || user.email, value: user.id, })), }; } catch (error) { return { disabled: true, placeholder: 'Failed to load users', options: [], }; } }, }), }, async run(context) { const client = new BexioClient(context.auth); const props = context.propsValue; const requestBody: Record<string, unknown> = { contact_type_id: 1, // 1 = company name_1: props['name_1'], user_id: props['user_id'], owner_id: props['owner_id'], }; // Add optional fields only if they have values if (props['name_2']) { requestBody['name_2'] = props['name_2']; } if (props['nr'] !== undefined && props['nr'] !== null && props['nr'] !== '') { requestBody['nr'] = props['nr']; } else { requestBody['nr'] = null; // Auto-assign } if (props['salutation_id']) { requestBody['salutation_id'] = props['salutation_id']; } if (props['title_id']) { requestBody['title_id'] = props['title_id']; } if (props['street_name']) { requestBody['street_name'] = props['street_name']; } if (props['house_number']) { requestBody['house_number'] = props['house_number']; } if (props['address_addition']) { requestBody['address_addition'] = props['address_addition']; } if (props['postcode']) { requestBody['postcode'] = props['postcode']; } if (props['city']) { requestBody['city'] = props['city']; } if (props['country_id']) { requestBody['country_id'] = props['country_id']; } if (props['mail']) { requestBody['mail'] = props['mail']; } if (props['mail_second']) { requestBody['mail_second'] = props['mail_second']; } if (props['phone_fixed']) { requestBody['phone_fixed'] = props['phone_fixed']; } if (props['phone_fixed_second']) { requestBody['phone_fixed_second'] = props['phone_fixed_second']; } if (props['phone_mobile']) { requestBody['phone_mobile'] = props['phone_mobile']; } if (props['fax']) { requestBody['fax'] = props['fax']; } if (props['url']) { requestBody['url'] = props['url']; } if (props['skype_name']) { requestBody['skype_name'] = props['skype_name']; } if (props['remarks']) { requestBody['remarks'] = props['remarks']; } if (props['language_id']) { requestBody['language_id'] = props['language_id']; } if (props['contact_group_ids'] && Array.isArray(props['contact_group_ids']) && props['contact_group_ids'].length > 0) { requestBody['contact_group_ids'] = props['contact_group_ids'].join(','); } if (props['contact_branch_ids'] && Array.isArray(props['contact_branch_ids']) && props['contact_branch_ids'].length > 0) { requestBody['contact_branch_ids'] = props['contact_branch_ids'].join(','); } const response = await client.post('/2.0/contact', requestBody); return response; }, });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server