Add v4 order api, access it via order
[civicrm-core.git] / api / v3 / Order.php
index 5f4ef7ed73f7ceb839e55756a6c6e8812135b297..e0529d385c37c31666e0218e8f86dc48108ba6ac 100644 (file)
@@ -16,6 +16,8 @@
  * @package CiviCRM_APIv3
  */
 
+use Civi\Api4\Membership;
+
 /**
  * Retrieve a set of Order.
  *
@@ -139,14 +141,19 @@ function civicrm_api3_order_create(array $params): array {
     }
 
     if ($entityParams['entity'] === 'membership') {
-      $entityParams['status_id'] = 'Pending';
+      if (empty($entityParams['id'])) {
+        $entityParams['status_id:name'] = 'Pending';
+      }
       if (!empty($params['contribution_recur_id'])) {
         $entityParams['contribution_recur_id'] = $params['contribution_recur_id'];
       }
-      $entityParams['skipLineItem'] = TRUE;
-      $entityResult = civicrm_api3('Membership', 'create', $entityParams);
+      // At this stage we need to get this passed through.
+      $entityParams['version'] = 4;
+      _order_create_wrangle_membership_params($entityParams);
+
+      $membershipID = Membership::save($params['check_permissions'] ?? FALSE)->setRecords([$entityParams])->execute()->first()['id'];
       foreach ($entityParams['line_references'] as $lineIndex) {
-        $order->setLineItemValue('entity_id', $entityResult['id'], $lineIndex);
+        $order->setLineItemValue('entity_id', $membershipID, $lineIndex);
       }
     }
   }
@@ -284,3 +291,29 @@ function _civicrm_api3_order_delete_spec(array &$params) {
   ];
   $params['id']['api.aliases'] = ['contribution_id'];
 }
+
+/**
+ * Handle possibility of v3 style params.
+ *
+ * We used to call v3 Membership.create. Now we call v4.
+ * This converts membership input parameters.
+ *
+ * @param array $membershipParams
+ *
+ * @throws \API_Exception
+ */
+function _order_create_wrangle_membership_params(array &$membershipParams) {
+  $fields = Membership::getFields(FALSE)->execute()->indexBy('name');
+  foreach ($fields as $fieldName => $field) {
+    $customFieldName = 'custom_' . ($field['custom_field_id'] ?? NULL);
+    if ($field['type'] === ['Custom'] && isset($membershipParams[$customFieldName])) {
+      $membershipParams[$field['custom_group'] . '.' . $field['custom_field']] = $membershipParams[$customFieldName];
+      unset($membershipParams[$customFieldName]);
+    }
+
+    if (!empty($membershipParams[$fieldName]) && $field['data_type'] === 'Integer' && !is_numeric($membershipParams[$fieldName])) {
+      $membershipParams[$field['name'] . ':name'] = $membershipParams[$fieldName];
+      unset($membershipParams[$field['name']]);
+    }
+  }
+}