Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,22 @@ to work with specific APIs, new workflow jobs and bridge templates.

Forms Bridge has the following addons:

- [REST API](https://en.wikipedia.org/wiki/REST)
- [Bigin](https://www.bigin.com/developer/docs/apis/v2/?source=developer)
- [Brevo](https://developers.brevo.com/)
- [Dolibarr](<https://wiki.dolibarr.org/index.php/Module_Web_Services_API_REST_(developer)>)
- [FinanCoop](https://somit.coop/financoop/)
- [Google Sheets](https://workspace.google.com/products/sheets/)
- [Holded](https://developers.holded.com/reference/api-key)
- [Listmonk](https://listmonk.app/docs/apis/apis/)
- [Nextcloud](https://docs.nextcloud.com/server/20/user_manual/en/files/access_webdav.html)
- [Mailchimp](https://mailchimp.com/developer/)
- [Odoo](https://www.odoo.com/)
- [Rocket.Chat](https://developer.rocket.chat/apidocs)
- [Slack](https://docs.slack.dev/reference/)
- [Zoho CRM](https://www.zoho.com/developer/rest-api.html)
- [Zulip](https://zulip.com/api/rest)
- [REST API](https://formsbridge.codeccoop.org/documentation/#backends)
- [Bigin](https://formsbridge.codeccoop.org/documentation/bigin/)
- [Brevo](https://formsbridge.codeccoop.org/documentation/brevo/)
- [Dolibarr](https://formsbridge.codeccoop.org/documentation/dolibarr/)
- [FinanCoop](https://formsbridge.codeccoop.org/documentation/financoop/)
- [Google Sheets](https://formsbridge.codeccoop.org/documentation/google-sheets/)
- [Holded](https://formsbridge.codeccoop.org/documentation/holded/)
- [Listmonk](https://formsbridge.codeccoop.org/documentation/listmonk/)
- [Nextcloud](https://formsbridge.codeccoop.org/documentation/nextcloud/)
- [Mailchimp](https://formsbridge.codeccoop.org/documentation/mailchimp/)
- [Odoo](https://formsbridge.codeccoop.org/documentation/odoo/)
- [Rocket.Chat](https://formsbridge.codeccoop.org/documentation/rocket-chat/)
- [Slack](https://formsbridge.codeccoop.org/documentation/slack/)
- [SuiteCRM](https://formsbridge.codeccoop.org/documentation/suitecrm/)
- [Zoho CRM](https://formsbridge.codeccoop.org/documentation/zoho-crm/)
- [Zulip](https://formsbridge.codeccoop.org/documentation/zulip/)

## Backends

Expand Down
7 changes: 6 additions & 1 deletion forms-bridge/addons/dolibarr/jobs/appointment-dates.php
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
<?php
/**
* Dolibarr appointment dates job
*
* @package formsbridge
*/

if ( ! defined( 'ABSPATH' ) ) {
exit();
}

function forms_bridge_dolibarr_appointment_dates( $payload ) {
$datetime = DateTime::createFromFormat( 'Y-m-d H:i:s', $payload['date'] );
if ( $datetime === false ) {
if ( false === $datetime ) {
return new WP_Error(
'invalid-date',
__( 'Invalid date time value', 'forms-bridge' )
Expand Down
Binary file added forms-bridge/addons/suitecrm/assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
195 changes: 195 additions & 0 deletions forms-bridge/addons/suitecrm/class-suitecrm-addon.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
<?php
/**
* Class SuiteCRM_Addon
*
* @package formsbridge
*/

namespace FORMS_BRIDGE;

if ( ! defined( 'ABSPATH' ) ) {
exit();
}

require_once 'class-suitecrm-form-bridge.php';
require_once 'hooks.php';

/**
* SuiteCRM Addon class.
*
* Provides integration with SuiteCRM v4_1 REST API.
*/
class SuiteCRM_Addon extends Addon {

/**
* Holds the addon's title.
*
* @var string
*/
public const TITLE = 'SuiteCRM';

/**
* Holds the addon's name.
*
* @var string
*/
public const NAME = 'suitecrm';

/**
* Holds the addon's custom bridge class.
*
* @var string
*/
public const BRIDGE = '\FORMS_BRIDGE\SuiteCRM_Form_Bridge';

/**
* Performs a request against the backend to check the connexion status.
*
* @param string $backend Target backend name.
*
* @return boolean
*/
public function ping( $backend ) {
$bridge = new SuiteCRM_Form_Bridge(
array(
'name' => '__suitecrm-' . time(),
'method' => 'get_user_id',
'endpoint' => '',
'backend' => $backend,
)
);

$response = $bridge->submit();

if ( is_wp_error( $response ) ) {
Logger::log( 'SuiteCRM backend ping error response', Logger::ERROR );
Logger::log( $response, Logger::ERROR );
return false;
}

return true;
}

/**
* Performs a GET request against the backend module and retrieve the response data.
*
* @param string $endpoint Target module name.
* @param string $backend Target backend name.
*
* @return array|WP_Error
*/
public function fetch( $endpoint, $backend ) {
$bridge = new SuiteCRM_Form_Bridge(
array(
'name' => '__suitecrm-' . time(),
'method' => 'get_entry_list',
'endpoint' => $endpoint,
'backend' => $backend,
)
);

return $bridge->submit(
array(
'select_fields' => array( 'id', 'name' ),
'max_results' => 100,
)
);
}

/**
* Fetch available modules from the backend.
*
* @param Backend $backend HTTP backend object.
*
* @return array
*/
public function get_endpoints( $backend ) {
$bridge = new SuiteCRM_Form_Bridge(
array(
'name' => '__suitecrm-' . time(),
'method' => 'get_available_modules',
'endpoint' => '',
'backend' => $backend,
)
);

$response = $bridge->submit();

if ( is_wp_error( $response ) ) {
return array();
}

if ( ! isset( $response['data']['modules'] ) ) {
return array();
}

return array_map(
function ( $module ) {
return $module['module_key'];
},
$response['data']['modules']
);
}

/**
* Performs an introspection of the backend module and returns API fields
* and accepted content type.
*
* @param string $module Target module name.
* @param string $backend Target backend name.
* @param string|null $method API method.
*
* @return array List of fields and content type of the module.
*/
public function get_endpoint_schema( $module, $backend, $method = null ) {
if ( 'set_entry' !== $method ) {
return array();
}

$bridge = new SuiteCRM_Form_Bridge(
array(
'name' => '__suitecrm-' . time(),
'method' => 'get_module_fields',
'endpoint' => $module,
'backend' => $backend,
)
);

$response = $bridge->submit();

if ( is_wp_error( $response ) ) {
return array();
}

if ( ! isset( $response['data']['module_fields'] ) ) {
return array();
}

$fields = array();
foreach ( $response['data']['module_fields'] as $name => $spec ) {
$type = 'string';

if ( in_array( $spec['type'], array( 'int', 'integer' ), true ) ) {
$type = 'integer';
} elseif ( in_array( $spec['type'], array( 'decimal', 'float', 'currency' ), true ) ) {
$type = 'number';
} elseif ( 'bool' === $spec['type'] ) {
$type = 'boolean';
}

$schema = array(
'type' => $type,
'required' => ! empty( $spec['required'] ),
);

$fields[] = array(
'name' => $name,
'schema' => $schema,
);
}

return $fields;
}
}

SuiteCRM_Addon::setup();
Loading