From f01de8604b9ce9a0d52693f0c9a47ca7b9af0f6c Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap@edeveloper.nl>
Date: Tue, 13 Mar 2018 09:40:59 +0100
Subject: [PATCH] added default data actions

---
 .../BAO/FormProcessorDefaultDataAction.php    | 199 ++++++++++++++++++
 .../BAO/FormProcessorInstance.php             |   2 +
 .../DAO/FormProcessorDefaultDataAction.php    | 132 ++++++++++++
 .../Converttitletoname.php                    |   2 +-
 api/v3/FormProcessorAction/Delete.php         |   2 +-
 api/v3/FormProcessorAction/Get.php            |   2 +-
 api/v3/FormProcessorAction/Validatename.php   |   2 +-
 .../Converttitletoname.php                    |  34 +++
 .../FormProcessorDefaultDataAction/Create.php |  72 +++++++
 .../FormProcessorDefaultDataAction/Delete.php |  37 ++++
 api/v3/FormProcessorDefaultDataAction/Get.php |  33 +++
 .../Validatename.php                          |  41 ++++
 api/v3/FormProcessorInstance/Get.php          |   5 +
 form_processor.php                            |   8 +
 sql/create_civicrm_form_processor.sql         |  12 ++
 sql/uninstall.sql                             |   1 +
 16 files changed, 580 insertions(+), 4 deletions(-)
 create mode 100644 CRM/FormProcessor/BAO/FormProcessorDefaultDataAction.php
 create mode 100644 CRM/FormProcessor/DAO/FormProcessorDefaultDataAction.php
 create mode 100644 api/v3/FormProcessorDefaultDataAction/Converttitletoname.php
 create mode 100644 api/v3/FormProcessorDefaultDataAction/Create.php
 create mode 100644 api/v3/FormProcessorDefaultDataAction/Delete.php
 create mode 100644 api/v3/FormProcessorDefaultDataAction/Get.php
 create mode 100644 api/v3/FormProcessorDefaultDataAction/Validatename.php

diff --git a/CRM/FormProcessor/BAO/FormProcessorDefaultDataAction.php b/CRM/FormProcessor/BAO/FormProcessorDefaultDataAction.php
new file mode 100644
index 0000000..64d1487
--- /dev/null
+++ b/CRM/FormProcessor/BAO/FormProcessorDefaultDataAction.php
@@ -0,0 +1,199 @@
+<?php
+
+use CRM_FormProcessor_ExtensionUtil as E;
+
+/**
+ * @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org>
+ * @license http://www.gnu.org/licenses/agpl-3.0.html
+ */
+class CRM_FormProcessor_BAO_FormProcessorDefaultDataAction extends CRM_FormProcessor_DAO_FormProcessorDefaultDataAction {
+  
+	 /**
+   * Function to get values
+   * 
+   * @return array $result found rows with data
+   * @access public
+   * @static
+   */
+  public static function getValues($params) {
+    $result = array();
+    $action = new CRM_FormProcessor_BAO_FormProcessorDefaultDataAction();
+    if (!empty($params)) {
+      $fields = self::fields();
+      foreach ($params as $key => $value) {
+        if (isset($fields[$key])) {
+          $action->$key = $value;
+        }
+      }
+    }
+		$action->orderBy('weight');
+    $action->find();
+    while ($action->fetch()) {
+      $row = array();
+      self::storeValues($action, $row);
+      if (!empty($row['form_processor_instance_id'])) {
+      	$provider = form_processor_get_action_provider();
+				$action_type = $provider->getActionByName($row['type']);
+				
+				if ($action_type) {
+					$configuration = $action_type->getDefaultConfiguration();
+					if (isset($row['configuration']) && is_string($row['configuration'])) {
+						$row['configuration'] = json_decode($row['configuration'], true);
+					}
+					if (empty($row['configuration']) || !is_array($row['configuration'])) {
+						$row['configuration'] = array();
+					}
+					foreach($row['configuration'] as $name => $value) {
+						$configuration->setParameter($name, $value);
+					}
+					$action_type->setConfiguration($configuration);
+					
+					$row['type'] = $action_type;
+				}
+				
+				if (isset($row['mapping']) && is_string($row['mapping'])) {
+						$row['mapping'] = json_decode($row['mapping'], true);
+					}
+					if (empty($row['mapping']) || !is_array($row['mapping'])) {
+						$row['mapping'] = array();
+					}
+				
+        $result[$row['id']] = $row;
+      } else {
+        //invalid input because no there is no form processor
+        CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::deleteWithId($row['id']);
+      }
+    }
+    return $result;
+  }
+
+  /**
+   * Function to add or update form processor action
+   * 
+   * @param array $params 
+   * @return array $result
+   * @access public
+   * @throws Exception when params is empty
+   * @static
+   */
+  public static function add($params) {
+    $result = array();
+    if (empty($params)) {
+      throw new Exception('Params can not be empty when adding or updating a form processor action');
+    }
+		
+		if (!empty($params['id'])) {
+      CRM_Utils_Hook::pre('edit', 'FormProcessorDefaultDataAction', $params['id'], $params);
+    }
+    else {
+      CRM_Utils_Hook::pre('create', 'FormProcessorDefaultDataAction', NULL, $params);
+    }
+		
+    $action = new CRM_FormProcessor_BAO_FormProcessorDefaultDataAction();
+    $fields = self::fields();
+    foreach ($params as $key => $value) {
+      if (isset($fields[$key])) {
+        $action->$key = $value;
+      }
+    }
+
+		if (is_array($action->configuration)) {
+			$action->configuration = json_encode($action->configuration);
+		}
+		if (is_array($action->mapping)) {
+			$action->mapping = json_encode($action->mapping);
+		}
+    $action->save();
+    self::storeValues($action, $result);
+		
+		if (!empty($params['id'])) {
+      CRM_Utils_Hook::post('edit', 'FormProcessorDefaultDataAction', $action->id, $action);
+    }
+    else {
+      CRM_Utils_Hook::post('create', 'FormProcessorDefaultDataAction', $action->id, $action);
+    }
+		
+    return $result;
+  }
+
+  /**
+   * Function to delete a form processor action with id
+   * 
+   * @param int $id
+   * @throws Exception when $id is empty
+   * @access public
+   * @static
+   */
+  public static function deleteWithId($id) {
+    if (empty($id)) {
+      throw new Exception('id can not be empty when attempting to delete a form processor action');
+    }
+		
+		CRM_Utils_Hook::pre('delete', 'FormProcessorDefaultDataAction', $id, CRM_Core_DAO::$_nullArray);
+		
+    $action = new CRM_FormProcessor_BAO_FormProcessorDefaultDataAction();
+    $action->id = $id;
+    if ($action->find(true)) {
+      $action->delete();
+    }
+		
+		CRM_Utils_Hook::post('delete', 'FormProcessorDefaultDataAction', $id, CRM_Core_DAO::$_nullArray);
+		
+    return;
+  }
+
+	/**
+   * Function to delete all actions with a form processor instance id
+   *
+   * @param int $formProcessorInstanceId
+   * @access public
+   * @static
+   */
+  public static function deleteWithFormProcessorInstanceId($formProcessorInstanceId) {
+    $action = new CRM_FormProcessor_BAO_FormProcessorDefaultDataAction();
+    $action->form_processor_instance_id = $formProcessorInstanceId;
+    $action->find(FALSE);
+    while ($action->fetch()) {
+      CRM_Utils_Hook::pre('delete', 'FormProcessorDefaultDataAction', $action->id, CRM_Core_DAO::$_nullArray);
+		
+      $action->delete();
+			
+			CRM_Utils_Hook::post('delete', 'FormProcessorDefaultDataAction', $action->id, CRM_Core_DAO::$_nullArray);
+    }
+  }
+
+	/**
+   * Public function to generate name from title
+   *
+   * @param $title
+   * @return string
+   * @access public
+   * @static
+   */
+  public static function buildNameFromTitle($title) {
+    $titleParts = explode(' ', strtolower($title));
+    $nameString = implode('_', $titleParts);
+    return substr($nameString, 0, 80);
+  }
+	
+	/**
+	 * Returns whether the name is valid or not
+	 * 
+	 * @param string $name
+	 * @param int $id optional
+	 * @return bool
+	 * @static
+	 */
+	public static function isNameValid($name, $id=null) {
+		$sql = "SELECT COUNT(*) FROM `civicrm_form_processor_default_data_action` WHERE `name` = %1";
+		$params[1] = array($name, 'String');
+		if ($id) {
+			$sql .= " AND `id` != %2";
+			$params[2] = array($id, 'Integer');
+		}
+		$count = CRM_Core_DAO::singleValueQuery($sql, $params);
+		return ($count > 0) ? false : true;
+	}
+	
+	
+}
\ No newline at end of file
diff --git a/CRM/FormProcessor/BAO/FormProcessorInstance.php b/CRM/FormProcessor/BAO/FormProcessorInstance.php
index 22a0358..ab965b4 100644
--- a/CRM/FormProcessor/BAO/FormProcessorInstance.php
+++ b/CRM/FormProcessor/BAO/FormProcessorInstance.php
@@ -30,6 +30,7 @@
       self::storeValues($formProcessorInstance, $row); 
 			$row['inputs'] = array_values(CRM_FormProcessor_BAO_FormProcessorInput::getValues(array('form_processor_instance_id' => $formProcessorInstance->id)));
 			$row['actions'] = array_values(CRM_FormProcessor_BAO_FormProcessorAction::getValues(array('form_processor_instance_id' => $formProcessorInstance->id)));
+			$row['default_data_actions'] = array_values(CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::getValues(array('form_processor_instance_id' => $formProcessorInstance->id)));
 			
 			$handler = \Civi::service('form_processor_output_handler_factory')->getHandlerByName($row['output_handler']);
 			if ($handler) {
@@ -123,6 +124,7 @@
 		CRM_FormProcessor_BAO_FormProcessorInput::deleteWithFormProcessorInstanceId($id);
 		// And all actions
 		CRM_FormProcessor_BAO_FormProcessorAction::deleteWithFormProcessorInstanceId($id);
+		CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::deleteWithFormProcessorInstanceId($id);
 
     $formProcessorInstance = new CRM_FormProcessor_BAO_FormProcessorInstance();
     $formProcessorInstance->id = $id;
diff --git a/CRM/FormProcessor/DAO/FormProcessorDefaultDataAction.php b/CRM/FormProcessor/DAO/FormProcessorDefaultDataAction.php
new file mode 100644
index 0000000..a692ab7
--- /dev/null
+++ b/CRM/FormProcessor/DAO/FormProcessorDefaultDataAction.php
@@ -0,0 +1,132 @@
+<?php
+
+use CRM_FormProcessor_ExtensionUtil as E;
+
+/**
+ * @author Jaap Jansma (CiviCooP) <jaap.jansma@civicoop.org>
+ * @license http://www.gnu.org/licenses/agpl-3.0.html
+ */
+class CRM_FormProcessor_DAO_FormProcessorDefaultDataAction extends CRM_Core_DAO {
+  /**
+   * static instance to hold the field values
+   *
+   * @var array
+   * @static
+   */
+  static $_fields = null;
+  static $_export = null;
+  /**
+   * empty definition for virtual function
+   */
+  static function getTableName() {
+    return 'civicrm_form_processor_default_data_action';
+  }
+  /**
+   * returns all the column names of this table
+   *
+   * @access public
+   * @return array
+   */
+  public static function &fields() {
+    if (!(self::$_fields)) {
+      self::$_fields = array(
+        'id' => array(
+          'name' => 'id',
+          'title' => E::ts('ID'),
+          'type' => CRM_Utils_Type::T_INT,
+          'required' => true
+        ),
+        'form_processor_instance_id' => array(
+          'name' => 'form_processor_instance_id',
+          'title' => E::ts('Form Processor ID'),
+          'type' => CRM_Utils_Type::T_INT,
+          'required' => true,
+          'FKApiName' => 'FormProcessorInstance',
+        ),
+        'weight' => array(
+          'name' => 'weight',
+          'title' => E::ts('Weight'),
+          'type' => CRM_Utils_Type::T_INT,
+          'required' => true,
+        ),
+        'name' => array(
+          'name' => 'name',
+          'title' => E::ts('Name'),
+          'type' => CRM_Utils_Type::T_STRING,
+          'maxlength' => 80,
+        ) ,
+        'title' => array(
+          'name' => 'title',
+          'title' => E::ts('Title'),
+          'type' => CRM_Utils_Type::T_STRING,
+          'maxlength' => 80,
+          'required' => true,
+        ) ,
+        'type' => array(
+          'name' => 'type',
+          'title' => E::ts('Type'),
+          'type' => CRM_Utils_Type::T_STRING,
+          'maxlength' => 80,
+          'required' => true,
+        ),
+        'configuration' => array(
+          'name' => 'configuration',
+          'title' => E::ts('Configuration'),
+          'type' => CRM_Utils_Type::T_TEXT,
+        ),
+        'mapping' => array(
+          'name' => 'mapping',
+          'title' => E::ts('Mapping'),
+          'type' => CRM_Utils_Type::T_TEXT,
+        ),
+      );
+    }
+    return self::$_fields;
+  }
+  /**
+   * Returns an array containing, for each field, the array key used for that
+   * field in self::$_fields.
+   *
+   * @access public
+   * @return array
+   */
+  public static function &fieldKeys() {
+    if (!(self::$_fieldKeys)) {
+      self::$_fieldKeys = array(
+        'id' => 'id', 
+        'form_processor_instance_id' => 'form_processor_instance_id',
+        'weight' => 'weight',
+        'name' => 'name',
+        'title' => 'title',
+        'type' => 'type',
+        'configuration' => 'configuration',
+        'mapping' => 'mapping',
+      );
+    }
+    return self::$_fieldKeys;
+  }
+  /**
+   * returns the list of fields that can be exported
+   *
+   * @access public
+   * return array
+   * @static
+   */
+  static function &export($prefix = false)
+  {
+    if (!(self::$_export)) {
+      self::$_export = array();
+      $fields = self::fields();
+      foreach($fields as $name => $field) {
+        if (CRM_Utils_Array::value('export', $field)) {
+          if ($prefix) {
+            self::$_export['form_porcessor_default_dataaction'] = & $fields[$name];
+          } else {
+            self::$_export[$name] = & $fields[$name];
+          }
+        }
+      }
+    }
+    return self::$_export;
+  }
+}
\ No newline at end of file
diff --git a/api/v3/FormProcessorAction/Converttitletoname.php b/api/v3/FormProcessorAction/Converttitletoname.php
index 34d924f..45a7c43 100644
--- a/api/v3/FormProcessorAction/Converttitletoname.php
+++ b/api/v3/FormProcessorAction/Converttitletoname.php
@@ -18,7 +18,7 @@ function civicrm_api3_form_processor_action_converttitletoname($params) {
 }
 
 /**
- * FormProcessor.Convgerttitletoname API specification (optional)
+ * FormProcessorAction.Converttitletoname API specification (optional)
  * This is used for documentation and validation.
  *
  * @param array $spec description of fields supported by this API call
diff --git a/api/v3/FormProcessorAction/Delete.php b/api/v3/FormProcessorAction/Delete.php
index 8e2f905..bbe5c29 100644
--- a/api/v3/FormProcessorAction/Delete.php
+++ b/api/v3/FormProcessorAction/Delete.php
@@ -19,7 +19,7 @@ function _civicrm_api3_form_processor_action_Delete_spec(&$spec) {
 }
 
 /**
- * FormProcessorInput.Delete API
+ * FormProcessorAction.Delete API
  *
  * @param array $params
  * @return array API result descriptor
diff --git a/api/v3/FormProcessorAction/Get.php b/api/v3/FormProcessorAction/Get.php
index 8814605..30c35fe 100644
--- a/api/v3/FormProcessorAction/Get.php
+++ b/api/v3/FormProcessorAction/Get.php
@@ -13,7 +13,7 @@ function civicrm_api3_form_processor_action_get($params) {
 	foreach($returnValues as $index => $action) {
 		$returnValues[$index]['type'] = $action['type']->toArray();
 	}
-  return civicrm_api3_create_success($returnValues, $params, 'FormProcessorInput', 'Get');
+  return civicrm_api3_create_success($returnValues, $params, 'FormProcessorAction', 'Get');
 }
 
 /**
diff --git a/api/v3/FormProcessorAction/Validatename.php b/api/v3/FormProcessorAction/Validatename.php
index 518b53d..7efbe39 100644
--- a/api/v3/FormProcessorAction/Validatename.php
+++ b/api/v3/FormProcessorAction/Validatename.php
@@ -20,7 +20,7 @@ function civicrm_api3_form_processor_action_validatename($params) {
 }
 
 /**
- * FormProcessor.Validatename API specification (optional)
+ * FormProcessorAction.Validatename API specification (optional)
  * This is used for documentation and validation.
  *
  * @param array $spec description of fields supported by this API call
diff --git a/api/v3/FormProcessorDefaultDataAction/Converttitletoname.php b/api/v3/FormProcessorDefaultDataAction/Converttitletoname.php
new file mode 100644
index 0000000..7f17d66
--- /dev/null
+++ b/api/v3/FormProcessorDefaultDataAction/Converttitletoname.php
@@ -0,0 +1,34 @@
+<?php
+
+use CRM_FormProcessor_ExtensionUtil as E;
+
+/**
+ * FormProcessorDefaultDataAction.Converttitletoname API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @see civicrm_api3_create_success
+ * @see civicrm_api3_create_error
+ * @throws API_Exception
+ */
+function civicrm_api3_form_processor_default_data_action_converttitletoname($params) {
+	$title = $params['title'];
+  $returnValues['name'] = CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::buildNameFromTitle($title);
+  return $returnValues;
+}
+
+/**
+ * FormProcessorDefaultDataAction.Converttitletoname API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards
+ */
+function _civicrm_api3_form_processor_default_data_action_converttitletoname_spec(&$spec) {
+	$spec['title'] = array(
+		'title' => E::ts('Title'),
+		'type' => CRM_Utils_Type::T_STRING,
+		'api.required' => true
+	);
+}
\ No newline at end of file
diff --git a/api/v3/FormProcessorDefaultDataAction/Create.php b/api/v3/FormProcessorDefaultDataAction/Create.php
new file mode 100644
index 0000000..3ce4cc8
--- /dev/null
+++ b/api/v3/FormProcessorDefaultDataAction/Create.php
@@ -0,0 +1,72 @@
+<?php
+
+use CRM_FormProcessor_ExtensionUtil as E;
+
+/**
+ * FormProcessorDefaultDataAction.Create API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards
+ */
+function _civicrm_api3_form_processor_default_data_action_create_spec(&$spec) {
+  $spec['id'] = array(
+		'title' => E::ts('ID'),
+		'type' => CRM_Utils_Type::T_INT,
+		'api.required' => false
+	);
+	$spec['form_processor_instance_id'] = array(
+		'title' => E::ts('Form Processor Instance ID'),
+		'type' => CRM_Utils_Type::T_INT,
+		'api.required' => true,
+		'FKApiName' => 'FormProcessorInstance',
+	);
+	$spec['weight'] = array(
+		'title' => E::ts('Weight'),
+		'type' => CRM_Utils_Type::T_INT,
+		'api.required' => true,
+	);
+	$spec['name'] = array(
+		'title' => E::ts('Name'),
+		'type' => CRM_Utils_Type::T_STRING,
+		'api.required' => true
+	);
+	$spec['title'] = array(
+		'title' => E::ts('Title'),
+		'type' => CRM_Utils_Type::T_STRING,
+		'api.required' => true
+	);
+	$spec['type'] = array(
+		'title' => E::ts('Type'),
+		'type' => CRM_Utils_Type::T_STRING,
+		'api.required' => true
+	);
+	$spec['configuration'] = array(
+		'title' => E::ts('Configuration'),
+		'type' => CRM_Utils_Type::T_TEXT,
+		'api.required' => false
+	);
+	$spec['mapping'] = array(
+		'title' => E::ts('Mapping'),
+		'type' => CRM_Utils_Type::T_TEXT,
+		'api.required' => false
+	);
+}
+
+/**
+ * FormProcessorAction.Create API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @see civicrm_api3_create_success
+ * @see civicrm_api3_create_error
+ *
+ *
+ */
+function civicrm_api3_form_processor_default_data_action_create($params) {
+  $returnValue = CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::add($params);
+	$returnValues[$returnValue['id']] = $returnValue;
+  return civicrm_api3_create_success($returnValues, $params, 'FormProcessorDefaultDataAction', 'Create');
+}
+
diff --git a/api/v3/FormProcessorDefaultDataAction/Delete.php b/api/v3/FormProcessorDefaultDataAction/Delete.php
new file mode 100644
index 0000000..5fe438e
--- /dev/null
+++ b/api/v3/FormProcessorDefaultDataAction/Delete.php
@@ -0,0 +1,37 @@
+<?php
+
+use CRM_FormProcessor_ExtensionUtil as E;
+
+/**
+ * FormProcessorDefaultDataAction.Delete API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRMDOC/API+Architecture+Standards
+ */
+function _civicrm_api3_form_processor_default_data_action_Delete_spec(&$spec) {
+  $spec['id'] = array(
+		'title' => E::ts('ID'),
+		'type' => CRM_Utils_Type::T_INT,
+		'api.required' => true
+	);
+}
+
+/**
+ * FormProcessorDefaultDataAction.Delete API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @see civicrm_api3_create_success
+ * @see civicrm_api3_create_error
+ * @throws API_Exception
+ */
+function civicrm_api3_form_processor_default_data_action_Delete($params) {
+  if (!array_key_exists('id', $params) || empty($params['id'])) {
+    throw new API_Exception('Parameter id is mandatory and can not be empty in ' . __METHOD__, 0010);
+  } else {
+    return civicrm_api3_create_success(CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::deleteWithId($params['id']), $params, 'FormProcessorDefaultDataAction', 'Delete');
+  }
+}
+
diff --git a/api/v3/FormProcessorDefaultDataAction/Get.php b/api/v3/FormProcessorDefaultDataAction/Get.php
new file mode 100644
index 0000000..f034a10
--- /dev/null
+++ b/api/v3/FormProcessorDefaultDataAction/Get.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * FormProcessorDefaultDataAction.Get API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @see civicrm_api3_create_success
+ * @see civicrm_api3_create_error
+ * @throws API_Exception
+ */
+function civicrm_api3_form_processor_default_data_action_get($params) {
+  $returnValues = CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::getValues($params);
+	foreach($returnValues as $index => $action) {
+		$returnValues[$index]['type'] = $action['type']->toArray();
+	}
+  return civicrm_api3_create_success($returnValues, $params, 'FormProcessorDefaultDataAction', 'Get');
+}
+
+/**
+ * FormProcessorAction.Get API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards
+ */
+function _civicrm_api3_form_processor_default_data_action_get_spec(&$spec) {
+	$fields = CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::fields();
+	foreach($fields as $fieldname => $field) {
+		$spec[$fieldname] = $field;
+	}
+}
+
diff --git a/api/v3/FormProcessorDefaultDataAction/Validatename.php b/api/v3/FormProcessorDefaultDataAction/Validatename.php
new file mode 100644
index 0000000..9488043
--- /dev/null
+++ b/api/v3/FormProcessorDefaultDataAction/Validatename.php
@@ -0,0 +1,41 @@
+<?php
+
+use CRM_FormProcessor_ExtensionUtil as E;
+
+/**
+ * FormProcessorDefaultDataAction.Validatename API
+ *
+ * @param array $params
+ * @return array API result descriptor
+ * @see civicrm_api3_create_success
+ * @see civicrm_api3_create_error
+ * @throws API_Exception
+ */
+function civicrm_api3_form_processor_default_data_action_validatename($params) {
+	$name = $params['name'];
+	$id = isset($params['id']) ? $params['id'] : null;
+  $returnValues['name'] = $name;
+  $returnValues['is_valid'] = CRM_FormProcessor_BAO_FormProcessorDefaultDataAction::isNameValid($name, $id);
+  return $returnValues;
+}
+
+/**
+ * FormProcessorDefaultDataAction.Validatename API specification (optional)
+ * This is used for documentation and validation.
+ *
+ * @param array $spec description of fields supported by this API call
+ * @return void
+ * @see http://wiki.civicrm.org/confluence/display/CRM/API+Architecture+Standards
+ */
+function _civicrm_api3_form_processor_default_data_action_validatename_spec(&$spec) {
+	$spec['id'] = array(
+		'title' => E::ts('ID'),
+		'type' => CRM_Utils_Type::T_INT,
+		'api.required' => false
+	);
+	$spec['name'] = array(
+		'title' => E::ts('Name'),
+		'type' => CRM_Utils_Type::T_STRING,
+		'api.required' => true
+	);
+}
\ No newline at end of file
diff --git a/api/v3/FormProcessorInstance/Get.php b/api/v3/FormProcessorInstance/Get.php
index 085b7b8..026d7da 100644
--- a/api/v3/FormProcessorInstance/Get.php
+++ b/api/v3/FormProcessorInstance/Get.php
@@ -24,6 +24,11 @@ function civicrm_api3_form_processor_instance_get($params) {
 			$returnValues[$index]['actions'][$key]['type'] = $action['type']->toArray();
 		}
 		
+		// Convert action object to arrays
+		foreach($formProcessor['default_data_actions'] as $key => $action) {
+			$returnValues[$index]['default_data_actions'][$key]['type'] = $action['type']->toArray();
+		}
+		
 		// Convert output handler object to array
 		$returnValues[$index]['output_handler'] = $returnValues[$index]['output_handler']->toArray();
 	}
diff --git a/form_processor.php b/form_processor.php
index f1d633a..c368f4c 100644
--- a/form_processor.php
+++ b/form_processor.php
@@ -54,6 +54,14 @@ function form_processor_civicrm_alterAPIPermissions($entity, $action, &$params,
 		$permissions['form_processor_action']['get'] = array('administer CiviCRM');
 		$permissions['form_processor_action']['create'] = array('administer CiviCRM');
 		$permissions['form_processor_action']['delete'] = array('administer CiviCRM');
+		$permissions['form_processor_action']['converttitletoname'] = array('administer CiviCRM');
+		$permissions['form_processor_action']['validatename'] = array('administer CiviCRM');
+		
+		$permissions['form_processor_default_data_action']['get'] = array('administer CiviCRM');
+		$permissions['form_processor_default_data_action']['create'] = array('administer CiviCRM');
+		$permissions['form_processor_default_data_action']['delete'] = array('administer CiviCRM');
+		$permissions['form_processor_default_data_action']['converttitletoname'] = array('administer CiviCRM');
+		$permissions['form_processor_default_data_action']['validatename'] = array('administer CiviCRM');
 }
 
 /**
diff --git a/sql/create_civicrm_form_processor.sql b/sql/create_civicrm_form_processor.sql
index 5062f63..741937a 100644
--- a/sql/create_civicrm_form_processor.sql
+++ b/sql/create_civicrm_form_processor.sql
@@ -45,3 +45,15 @@ CREATE TABLE IF NOT EXISTS `civicrm_form_processor_action` (
   `mapping` TEXT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE = InnoDB;
+
+CREATE TABLE IF NOT EXISTS `civicrm_form_processor_default_data_action` (
+  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
+  `form_processor_instance_id` INT UNSIGNED NOT NULL,
+  `weight` INT UNSIGNED NOT NULL,
+  `name` VARCHAR(80) NOT NULL,
+  `title` VARCHAR(80) NOT NULL,
+  `type` VARCHAR(80) NOT NULL,
+  `configuration` TEXT NULL,
+  `mapping` TEXT NULL,
+  PRIMARY KEY (`id`)
+) ENGINE = InnoDB;
diff --git a/sql/uninstall.sql b/sql/uninstall.sql
index 0372944..53a0c7f 100644
--- a/sql/uninstall.sql
+++ b/sql/uninstall.sql
@@ -1,4 +1,5 @@
 DROP TABLE IF EXISTS `civicrm_form_processor_input_validation`;
 DROP TABLE IF EXISTS `civicrm_form_processor_input`;
 DROP TABLE IF EXISTS `civicrm_form_processor_action`;
+DROP TABLE IF EXISTS `civicrm_form_processor_default_data_action`;
 DROP TABLE IF EXISTS `civicrm_form_processor_instance`;
-- 
GitLab