/
var
/
www
/
html
/
sugar13
/
modules
/
SF_Subscriptions
/
Upload File
HOME
<?php /* * SubscriptionFlow Package for SugarCRM * * Copyright (C) SubscriptionFlow. All rights reserved. * * Your installation or use of this package is subject to the applicable * terms available at https://www.subscriptionflow.com/terms-and-conditions * If you do not agree to all of the applicable terms, do not install or use this package. * Support: https://support.subscriptionflow.com */ require_once("modules/SF_Subscriptions/SF_SubscriptionFlow_Sync.php"); require_once('modules/SF_Subscriptions/license/SugarSubscriptionFlowOutfittersLicense.php'); require_once("include/utils/autoloader.php"); class SF_SubscriptionsController extends SugarController { public function validateLicense() { global $current_user, $currentModule, $sugar_config, $sugar_version; $validate_license = SugarSubscriptionFlowOutfittersLicense::isValid($currentModule, $current_user->id, false); if ($validate_license !== true) { if (is_admin($current_user)) { echo '<script type="text/javascript"> var app = window.parent.SUGAR.App; app.router.navigate("#bwc/index.php?module=' . $currentModule . '&action=license", {trigger:true, replace:true}); </script>'; } } return true; } public function action_Configure() { $this->validateLicense(); $this->view = 'configure'; } public function action_CreateSubscription() { $this->validateLicense(); $this->view = 'subscription'; } public function action_LinkPlans() { $this->validateLicense(); $this->view = 'linkplans'; } public function action_License() { $this->view = 'license'; } private function handleCustomFields() { require_once('include/MetaDataManager/MetaDataManager.php'); require_once('ModuleInstall/ModuleInstaller.php'); $mdd = new MetaDataManager(); $fields = [ 0 => array( 'id' => 'sf_product_id_c', 'name' => 'sf_product_id_c', 'label' => 'LBL_SF_PRODUCT_ID', 'comments' => 'Custom field to store SubscriptionFlow Product ID', 'help' => NULL, 'module' => 'RevenueLineItems', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ), 1 => array( 'id' => 'sf_plan_id_c', 'name' => 'sf_plan_id_c', 'label' => 'LBL_SF_PLAN_ID', 'comments' => 'Custom field to store SubscriptionFlow Plan ID', 'help' => NULL, 'module' => 'RevenueLineItems', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ), 2 => array( 'id' => 'sf_price_id_c', 'name' => 'sf_price_id_c', 'label' => 'LBL_SF_PRICE_ID', 'comments' => 'Custom field to store SubscriptionFlow Price ID', 'help' => NULL, 'module' => 'RevenueLineItems', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ), 3 => array( 'id' => 'sf_customer_id_c', 'name' => 'sf_customer_id_c', 'label' => 'LBL_SF_CUSTOMER_ID', 'comments' => 'Custom field to store SubscriptionFlow Customer ID', 'help' => NULL, 'module' => 'Accounts', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ), 4 => array( 'id' => 'sf_product_id_c', 'name' => 'sf_product_id_c', 'label' => 'LBL_SF_PRODUCT_ID', 'comments' => 'Custom field to store SubscriptionFlow Product ID', 'help' => NULL, 'module' => 'PurchasedLineItems', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ), 5 => array( 'id' => 'sf_plan_id_c', 'name' => 'sf_plan_id_c', 'label' => 'LBL_SF_PLAN_ID', 'comments' => 'Custom field to store SubscriptionFlow Plan ID', 'help' => NULL, 'module' => 'PurchasedLineItems', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ), 6 => array( 'id' => 'sf_price_id_c', 'name' => 'sf_price_id_c', 'label' => 'LBL_SF_PRICE_ID', 'comments' => 'Custom field to store SubscriptionFlow Price ID', 'help' => NULL, 'module' => 'PurchasedLineItems', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ), 7 => array( 'id' => 'sf_invoice_id_c', 'name' => 'sf_invoice_id_c', 'label' => 'LBL_SF_INVOICE_ID', 'comments' => 'Custom field to store SubscriptionFlow Invoice ID', 'help' => NULL, 'module' => 'SF_Invoices', 'type' => 'varchar', 'max_size' => '255', 'require_option' => '0', 'default_value' => NULL, 'date_modified' => $GLOBALS['timedate']->nowDb(), 'deleted' => '0', 'audited' => '0', 'mass_update' => '0', 'duplicate_merge' => '1', 'reportable' => '1', 'importable' => 'true', 'ext1' => NULL, 'ext2' => NULL, 'ext3' => NULL, 'ext4' => NULL, ) ]; foreach ($fields as $index => $field) { $fieldName = $field['name']; $fieldDefs = $mdd->getVarDef($field['module']); if ($fieldDefs && isset($fieldDefs['fields'][$fieldName])) { unset($fields[$fieldName]); //field already exists in vardef } } if (is_array($fields) && count($fields) > 0) { $moduleInstaller = new ModuleInstaller(); $moduleInstaller->install_custom_fields($fields); } } public function action_SaveLinkPlans() { global $current_user; $response = []; $response['status'] = false; if (!SugarAutoloader::fileExists("custom/Extension/modules/RevenueLineItems/Ext/Vardefs/sugarfield_sf_plan_id_c.php")) { //when this file exists, it means the custom fields were already added to CRM $this->handleCustomFields(); } $opportunity_currency = $_REQUEST["opportunity_currency"] ?? null; $account_id = $_REQUEST["account_id"] ?? null; $opportunity_id = $_REQUEST["opportunity_id"] ?? null; $currency = null; if ($opportunity_currency) { $currency = BeanFactory::newBean('Currencies'); $currency->retrieve_by_string_fields(['iso4217' => $opportunity_currency]); } if (isset($_REQUEST["products"]) && is_array($_REQUEST["products"]) && count($_REQUEST["products"]) > 0 && isset($_REQUEST["plans"]) && is_array($_REQUEST["plans"]) && count($_REQUEST["plans"]) > 0) { $success = 0; foreach ($_REQUEST["products"] as $index => $product_id) { $plan_id = $_REQUEST["plans"][$index] ?? null; $price_ids = $_REQUEST["price_id"][$index] ?? []; $names = $_REQUEST["name"][$index] ?? []; $categories = $_REQUEST["category"][$index] ?? []; $charge_models = $_REQUEST["chargemodel"][$index] ?? []; $list_prices = $_REQUEST["listprice"][$index] ?? []; $quantities = $_REQUEST["quantity"][$index] ?? []; $totals = $_REQUEST["total"][$index] ?? []; $descriptions = $_REQUEST["description"][$index] ?? []; $renewables = $_REQUEST["renewables"][$index] ?? []; $service_durations = $_REQUEST["service_durations"][$index] ?? []; $service_duration_units = $_REQUEST["service_duration_units"][$index] ?? []; foreach ($categories as $cIndex => $category) { $price_id = $price_ids[$cIndex] ?? null; $name = $names[$cIndex] ?? null; $charge_model = $charge_models[$cIndex] ?? null; $list_price = $list_prices[$cIndex] ?? null; $quantity = $quantities[$cIndex] ?? null; $total = $totals[$cIndex] ?? null; $description = $descriptions[$cIndex] ?? null; $renewable = $renewables[$cIndex] ?? null; $service_duration = $service_durations[$cIndex] ?? null; $service_duration_unit = $service_duration_units[$cIndex] ?? null; if ($name && $charge_model && $list_price && $quantity && $total) { $revenue_line_item = BeanFactory::newBean('RevenueLineItems'); $revenue_line_item->name = $name; $date_entered = $GLOBALS['timedate']->nowDb(); $date_entered = date('Y-m-d H:i:s', strtotime($date_entered . ' +1 second')); $revenue_line_item->date_entered = $date_entered; $revenue_line_item->date_modified = $date_entered; $revenue_line_item->created_by = $current_user->id; $revenue_line_item->modified_user_id = $current_user->id; $revenue_line_item->assigned_user_id = $current_user->id; if ($description == 'null') { $revenue_line_item->description = null; } else { $revenue_line_item->description = $description; } $revenue_line_item->account_id = $account_id; $revenue_line_item->subtotal = $total; $revenue_line_item->total_amount = $total; $revenue_line_item->type_id = null; $revenue_line_item->quote_id = null; $revenue_line_item->manufacturer_id = null; $revenue_line_item->category_id = null; $revenue_line_item->mft_part_num = null; $revenue_line_item->cost_price = $list_price; $revenue_line_item->discount_price = 0; $revenue_line_item->discount_amount = 0; $revenue_line_item->discount_select = 1; $revenue_line_item->discount_rate_percent = 0; $revenue_line_item->deal_calc = 0; $revenue_line_item->deal_calc_usdollar = 0; $revenue_line_item->cost_usdollar = $list_price; $revenue_line_item->discount_usdollar = 0; $revenue_line_item->list_usdollar = $list_price; $revenue_line_item->status = null; $revenue_line_item->book_value_usdollar = null; $revenue_line_item->generate_purchase = "Yes"; $revenue_line_item->purchasedlineitem_id = null; $revenue_line_item->best_case = $total; $revenue_line_item->likely_case = $total; $revenue_line_item->worst_case = $total; $revenue_line_item->date_closed = null; $revenue_line_item->date_closed_timestamp = null; $revenue_line_item->next_step = null; $revenue_line_item->commit_stage = 'exclude'; $revenue_line_item->sales_stage = 'Prospecting'; $revenue_line_item->probability = null; $revenue_line_item->lead_source = null; $revenue_line_item->campaign_id = null; $revenue_line_item->forecasted_likely = 0; $revenue_line_item->opportunity_id = $opportunity_id; $revenue_line_item->product_type = "SubscriptionFlow"; $revenue_line_item->add_on_to_id = null; $revenue_line_item->renewal_rli_id = null; $revenue_line_item->team_id = $current_user->default_team; $revenue_line_item->team_set_id = $current_user->default_team; $revenue_line_item->acl_team_set_id = $current_user->default_team; $revenue_line_item->list_price = $list_price; $revenue_line_item->quantity = $quantity; $revenue_line_item->pricing_factor = 1; $revenue_line_item->renewable = $renewable; $revenue_line_item->service = 1; if ($service_duration == 'null') { $revenue_line_item->service_duration_value = null; } else { $revenue_line_item->service_duration_value = $service_duration; } if ($service_duration_unit == 'null') { $revenue_line_item->service_duration_unit = null; } else { $revenue_line_item->service_duration_unit = $service_duration_unit; } $revenue_line_item->base_rate = 1.0; $revenue_line_item->sf_product_id_c = $product_id; $revenue_line_item->sf_plan_id_c = $plan_id; $revenue_line_item->sf_price_id_c = $price_id; if ($currency && $currency->id) { $revenue_line_item->currency_id = $currency->id; } $revenue_line_item->save(); $success++; } } } if ($success > 0) { $response['status'] = true; $response['message'] = "Successfully linked $success products"; } else { $response['message'] = "Please select at least one product, plan and load it's prices to link"; } } else { $response['message'] = "Please select at least one product"; } echo json_encode($response); exit(0); } public function action_SaveSubscription() { global $current_user; $response = []; $response['status'] = false; if (!SugarAutoloader::fileExists("custom/Extension/modules/Accounts/Ext/Vardefs/sugarfield_sf_customer_id_c.php") && !SugarAutoloader::fileExists("custom/Extension/modules/PurchasedLineItems/Ext/Vardefs/sugarfield_sf_product_id_c.php")) { //when this file exists, it means the custom fields were already added to CRM $this->handleCustomFields(); } $opportunity_currency = $_REQUEST["opportunity_currency"] ?? null; $account_id = $_REQUEST["account_id"] ?? null; $opportunity_id = $_REQUEST["opportunity_id"] ?? null; $subscription_type = $_REQUEST["subscription_type"] ?? null; $subscription_start_date = $_REQUEST["subscription_start_date"] ?? null; $term_initial_period = $_REQUEST["term_initial_period"] ?? null; $term_initial_period_type = $_REQUEST["term_initial_period_type"] ?? null; $is_auto_renew = $_REQUEST["is_auto_renew"] ?? null; $currency = null; if ($opportunity_currency) { $currency = BeanFactory::newBean('Currencies'); $currency->retrieve_by_string_fields(['iso4217' => $opportunity_currency]); } if (isset($_REQUEST["product_id"]) && is_array($_REQUEST["product_id"]) && count($_REQUEST["product_id"]) > 0 && isset($_REQUEST["plan_id"]) && is_array($_REQUEST["plan_id"]) && count($_REQUEST["plan_id"]) > 0) { $success = 0; $account = BeanFactory::getBean('Accounts', $account_id); $sf_customer_id = null; $sf_sync = new SF_SubscriptionFlow_Sync(); $sf_sync->loadConnection(); if ($account && $account->id) { if (!$account->sf_customer_id_c || empty($account->sf_customer_id_c)) { if ($sf_sync->status) { $customerPayload = [ 'name' => $account->name, 'email' => $account->email1, 'portal_email' => $account->email1, 'billing_email' => $account->email1, 'billing_address_1' => $account->billing_address_street, 'billing_city' => $account->billing_address_city, 'billing_state' => $account->billing_address_state, 'billing_postal_code' => $account->billing_address_postalcode, 'billing_country' => $account->billing_address_country, 'shipping_address_1' => $account->shipping_address_street, 'shipping_city' => $account->shipping_address_city, 'shipping_state' => $account->shipping_address_state, 'shipping_county' => $account->shipping_address_postalcode, 'shipping_postal_code' => $account->shipping_address_country, 'phone_number' => $account->phone_office, 'notes' => $account->description, ]; $customer = $sf_sync->createCustomer($customerPayload); if ($customer && isset($customer['id'])) { $account->sf_customer_id_c = $sf_customer_id = $customer['id']; $account->save(); } } }else{ $sf_customer_id = $account->sf_customer_id_c; } } if ($sf_customer_id) { $subscriptionPayload = []; $subscriptionPayload['customer_id'] = $sf_customer_id; $subscriptionPayload['type'] = $subscription_type; $subscriptionPayload['trigger_dates'] = $subscription_start_date; $subscriptionPayload['termed_start_date'] = $subscription_start_date; $subscriptionPayload['is_auto_renew'] = $is_auto_renew; $subscriptionPayload['invoice_separate'] = "No"; $subscriptionPayload['order_date'] = date('Y-m-d'); if($subscription_type == 'Termed'){ $subscriptionPayload['termed_initial_period'] = $term_initial_period; $subscriptionPayload['termed_initial_period_type'] = $term_initial_period_type; $subscriptionPayload['renewal_type'] = 'Renew with Specific Term'; $subscriptionPayload['renewal_period'] = $term_initial_period; $subscriptionPayload['renewal_period_type'] = $term_initial_period_type; } $items = []; foreach ($_REQUEST["product_id"] as $index => $product_id) { $item = []; $item["product_id"] = $product_id ?? null; $item["plan_id"] = $_REQUEST["plan_id"][$index] ?? null; $charges = []; //$totals = $_REQUEST["total"][$index] ?? []; //$descriptions = $_REQUEST["description"][$index] ?? []; $charges['plan_id'] = $_REQUEST["plan_id"][$index] ?? null; $charges['id'] = $_REQUEST["price_id"][$index] ?? null; $charges['price'] = $_REQUEST["listprice"][$index] ?? 0; $charges['quantity'] = $_REQUEST["quantity"][$index] ?? 1; $item["charges"][$charges['id']] = $charges; $items[] = $item; } $subscriptionPayload['items'] = $items; /* $subscriptionPayload['name'] = ""; $subscriptionPayload['display_name'] = ""; $subscriptionPayload['total_amount'] = null; $subscriptionPayload['status'] = null; $subscriptionPayload['payment_status'] = null; $subscriptionPayload['created_at'] = null; $subscriptionPayload['updated_at'] = null; $subscriptionPayload['suspended_at'] = null; $subscriptionPayload['renewed_at'] = null; $subscriptionPayload['cancelled_at'] = null; $subscriptionPayload['billing_end_date'] = null; $subscriptionPayload['data_source'] = null; $subscriptionPayload['trial_period'] = null; $subscriptionPayload['trial_period_unit'] = null; $subscriptionPayload['is_gift'] = null; */ $sfSubscription = $sf_sync->createSubscription($subscriptionPayload); if ($sfSubscription && isset($sfSubscription['id'])) { $subscription = BeanFactory::newBean('SF_Subscriptions'); $subscription->name = $sfSubscription['name']; $subscription->title = $sfSubscription['display_name']; $date_entered = $sfSubscription['created_at']; $date_entered = date('Y-m-d H:i:s', strtotime($date_entered . ' +1 second')); $subscription->date_entered = $date_entered; $subscription->date_modified = $date_entered; $subscription->created_by = $current_user->id; $subscription->modified_user_id = $current_user->id; $subscription->assigned_user_id = $current_user->id; $subscription->is_auto_renew = $sfSubscription['is_auto_renew']; $subscription->trigger_date = $sfSubscription['trigger_dates']; $subscription->subscription_start_date = $sfSubscription['termed_start_date']; $subscription->separate_invoice = $sfSubscription['invoice_separate']; $subscription->payment_status = $sfSubscription['payment_status']; $subscription->status = $sfSubscription['status']; $subscription->order_date = $sfSubscription['termed_start_date']; $subscription->subscription_type = $sfSubscription['type']; $subscription->sf_subscription_id = $sfSubscription['id']; $subscription->term_initial_period = $sfSubscription['termed_initial_period']; $subscription->term_initial_period_type = $sfSubscription['termed_initial_period_type']; if($sfSubscription['renewal_type'] == 'Renew with Specific Term'){ $subscription->renewal_is_different = 0; }else{ $subscription->renewal_is_different = 1; } if($sfSubscription['trial_period'] && $sfSubscription['trial_period_unit']){ $subscription->enable_trial = 1; }else{ $subscription->enable_trial = 0; } $subscription->trial_period = $sfSubscription['trial_period']; $subscription->trial_period_unit = $sfSubscription['trial_period_unit']; $subscription->next_bill_date = $sfSubscription['next_bill_date']; $subscription->billing_end_date = $sfSubscription['billing_end_date']; $subscription->suspended_at = $sfSubscription['suspended_at']; $subscription->cancelled_at = $sfSubscription['cancelled_at']; $subscription->resume_suspended_at = $sfSubscription['resume_suspended_at']; $subscription->extend_term_on_resume = null; $subscription->enable_gift = $sfSubscription['is_gift']; $subscription->contact_id_c = null; $subscription->team_id = $current_user->default_team; $subscription->team_set_id = $current_user->default_team; $subscription->acl_team_set_id = $current_user->default_team; $subscription->save(); if($subscription->id){ $success++; } if($opportunity_id){ $subscription->load_relationship('sf_subscriptions_opportunities'); $subscription->sf_subscriptions_opportunities->add($opportunity_id); } if($account_id){ $subscription->load_relationship('sf_subscriptions_accounts'); $subscription->sf_subscriptions_accounts->add($account_id); } if(isset($sfSubscription["items"]) && is_array($sfSubscription["items"]) && count($sfSubscription["items"]) > 0){ foreach ($sfSubscription["items"] as $index => $productPlan) { if(isset($productPlan['charges']) && is_array($productPlan['charges']) && count($productPlan['charges']) > 0){ foreach($productPlan['charges'] as $charge){ $purchased_line_item = BeanFactory::newBean('PurchasedLineItems'); $purchased_line_item->name = $charge['name']; $date_entered = $GLOBALS['timedate']->nowDb(); $date_entered = date('Y-m-d H:i:s', strtotime($date_entered . ' +1 second')); $purchased_line_item->date_entered = $date_entered; $purchased_line_item->date_modified = $date_entered; $purchased_line_item->created_by = $current_user->id; $purchased_line_item->modified_user_id = $current_user->id; $purchased_line_item->assigned_user_id = $current_user->id; if (isset($charge['plan_price']['description'])) { $purchased_line_item->description = $charge['plan_price']['description']; } else { $purchased_line_item->description = null; } $list_price = $charge['list_price']; $quantity = $charge['default_quantity'] ?? 1; $subtotal = $list_price * $quantity; $purchased_line_item->account_id = $account_id; $purchased_line_item->subtotal = $subtotal; $purchased_line_item->total_amount = $subtotal; $purchased_line_item->product_type_id = null; $purchased_line_item->manufacturer_id = null; $purchased_line_item->category_id = null; $purchased_line_item->mft_part_num = null; $purchased_line_item->cost_price = $list_price; $purchased_line_item->discount_price = 0; $purchased_line_item->discount_amount = 0; $purchased_line_item->discount_select = 1; $purchased_line_item->deal_calc = 0; $purchased_line_item->deal_calc_usdollar = 0; $purchased_line_item->cost_usdollar = $list_price; $purchased_line_item->discount_usdollar = 0; $purchased_line_item->list_usdollar = $list_price; $purchased_line_item->status = null; $purchased_line_item->book_value_usdollar = null; $purchased_line_item->date_closed = null; $purchased_line_item->date_closed_timestamp = null; //$purchased_line_item->product_type = "SubscriptionFlow"; $purchased_line_item->team_id = $current_user->default_team; $purchased_line_item->team_set_id = $current_user->default_team; $purchased_line_item->acl_team_set_id = $current_user->default_team; $purchased_line_item->list_price = $list_price; $purchased_line_item->quantity = $quantity; $purchased_line_item->pricing_factor = 1; if (isset($charge['category']) && $charge['category'] == 'recurring') { $purchased_line_item->renewable = 1; } else { $purchased_line_item->renewable = 0; } $purchased_line_item->renewal = 0; if($subscription->subscription_type == 'Termed'){ $purchased_line_item->date_support_starts = $sfSubscription['termed_start_date']; $purchased_line_item->service_start_date = $sfSubscription['termed_start_date']; }else{ $purchased_line_item->date_support_starts = $sfSubscription['trigger_dates']; $purchased_line_item->service_start_date = $sfSubscription['trigger_dates']; } $purchased_line_item->support_name = "SubscriptionFlow"; $purchased_line_item->date_support_expires = $sfSubscription['billing_end_date']; $purchased_line_item->service_end_date = $sfSubscription['billing_end_date']; $purchased_line_item->service = 1; $purchased_line_item->date_purchased = $date_entered; $purchased_line_item->annual_revenue = null; $purchased_line_item->discount_amount_signed = null; $purchased_line_item->discount_amount_usdollar = null; $purchased_line_item->revenue = null; $purchased_line_item->revenue_usdollar = null; $purchased_line_item->product_template_id = null; $purchased_line_item->lock_duration = null; $purchased_line_item->sync_key = null; $purchased_line_item->asset_number = null; $purchased_line_item->book_value = null; $purchased_line_item->book_value_date = null; $purchased_line_item->serial_number = null; $purchased_line_item->catalog_service_duration_value = null; $purchased_line_item->catalog_service_duration_unit = null; $purchased_line_item->service_duration_multiplier = null; $purchased_line_item->support_contact = null; $purchased_line_item->support_description = null; $purchased_line_item->support_term = null; $purchased_line_item->tax_class = null; $purchased_line_item->vendor_part_num = null; $purchased_line_item->website = null; $purchased_line_item->weight = null; if(isset($charge['billing_period_id'])){ switch ($charge['billing_period_id']){ case 1: $purchased_line_item->service_duration_value = 1; $purchased_line_item->service_duration_unit = 'Month'; break; case 2: $purchased_line_item->service_duration_value = 3; $purchased_line_item->service_duration_unit = 'Months'; break; case 3: $purchased_line_item->service_duration_value = 6; $purchased_line_item->service_duration_unit = 'Months'; break; case 4: $purchased_line_item->service_duration_value = 1; $purchased_line_item->service_duration_unit = 'Year'; break; case 5: $purchased_line_item->service_duration_value = 1; $purchased_line_item->service_duration_unit = 'Week'; break; case 6: $purchased_line_item->service_duration_value = 2; $purchased_line_item->service_duration_unit = 'Years'; break; case 7: $purchased_line_item->service_duration_value = 18; $purchased_line_item->service_duration_unit = 'Months'; break; case 8: $purchased_line_item->service_duration_value = 3; $purchased_line_item->service_duration_unit = 'Years'; break; case 9: $purchased_line_item->service_duration_value = 5; $purchased_line_item->service_duration_unit = 'Years'; break; case 10: $purchased_line_item->service_duration_value = 1; $purchased_line_item->service_duration_unit = 'Subscription'; break; case 11: $purchased_line_item->service_duration_value = 0; $purchased_line_item->service_duration_unit = 'Weeks'; break; case 12: $purchased_line_item->service_duration_value = 0; $purchased_line_item->service_duration_unit = 'Months'; break; default: $purchased_line_item->service_duration_value = null; $purchased_line_item->service_duration_unit = null; break; } } foreach ($_REQUEST["product_id"] as $index => $product_id) { $plan_id = $_REQUEST["plan_id"][$index] ?? null; $price_id = $_REQUEST["price_id"][$index] ?? null; $revenew_line_id = $_REQUEST["id"][$index] ?? null; if(isset($productPlan['product_id']) && $productPlan['product_id'] == $product_id && isset($productPlan['plan_id']) && $productPlan['plan_id'] == $plan_id && isset($charge['plan_price']['id']) && $charge['plan_price']['id'] == $price_id){ $purchased_line_item->revenuelineitem_id = $revenew_line_id; } } $purchased_line_item->base_rate = 1.0; $purchased_line_item->sf_product_id_c = $productPlan['product_id'] ?? null; $purchased_line_item->sf_plan_id_c = $productPlan['plan_id'] ?? null; $purchased_line_item->sf_price_id_c = $charge['id'] ?? null; if ($currency && $currency->id) { $purchased_line_item->currency_id = $currency->id; } $purchased_line_item->save(); $purchased_line_item->load_relationship('sf_subscriptions_purchasedlineitems'); $purchased_line_item->sf_subscriptions_purchasedlineitems->add($subscription->id); } } } } if ($success > 0) { $response['status'] = true; $response['message'] = "Subscription created successfully."; } if(isset($sfSubscription["subscription_invoice_id"]) && !empty($sfSubscription["subscription_invoice_id"])){ $this->syncInvoice($subscription, $subscription->id, $account->id, $opportunity_id, $sfSubscription["subscription_invoice_id"]); } } if ($success > 0) { $response['status'] = true; $response['message'] = "Subscription created successfully."; } else { $response['message'] = "Something went wrong. Please try again."; } } else { $response['message'] = "Unable to locate the SubscriptionFlow customer and failed to generate new one. Please try again."; } } else { $GLOBALS['log']->fatal("invalid data"); $response['message'] = "Please select at least one product & plan to create a subscription"; } echo json_encode($response); exit(0); } public function action_GetProducts() { $query = null; if (isset($_REQUEST["q"])) { $query = $_REQUEST["q"]; } $filters = []; if ($query) { $filters["name"] = $query; } $sf_sync = new SF_SubscriptionFlow_Sync(); $sf_sync->loadConnection(); $products = []; if ($sf_sync->status) { $products = $sf_sync->syncProducts($filters); } echo json_encode(["results" => $products]); exit(0); } public function action_GetPlanPrices() { $plan_id = null; $product_id = null; $currency = null; if (isset($_REQUEST["plan"])) { $plan_id = $_REQUEST["plan"]; } if (isset($_REQUEST["product"])) { $product_id = $_REQUEST["product"]; } if (isset($_REQUEST["currency"])) { $currency = $_REQUEST["currency"]; } $sf_sync = new SF_SubscriptionFlow_Sync(); $sf_sync->loadConnection(); $prices = []; if ($sf_sync->status) { $prices = $sf_sync->syncPlanPrices($plan_id, $product_id, $currency); } echo json_encode($prices); exit(0); } public function action_GetPlans() { $product = null; $query = null; if (isset($_REQUEST["q"])) { $query = $_REQUEST["q"]; } if (isset($_REQUEST["product"])) { $product = $_REQUEST["product"]; } $filters = []; if ($query) { $filters["name"] = $query; } $sf_sync = new SF_SubscriptionFlow_Sync(); $sf_sync->loadConnection(); $plans = []; if ($sf_sync->status) { $plans = $sf_sync->syncPlans($filters, $product); } echo json_encode(["results" => $plans]); exit(0); } public function action_TestSaveConfiguration() { global $mod_strings; $status_code = 400; $response = []; $response['status'] = false; $response['message'] = 'Something went wrong'; if (isset($_REQUEST["sf_domain"]) && isset($_REQUEST["sf_client_id"]) && isset($_REQUEST["sf_client_secret"])) { $sf_sync = new SF_SubscriptionFlow_Sync(); $sf_sync->setCredentials($_REQUEST["sf_domain"], $_REQUEST["sf_client_id"], $_REQUEST["sf_client_secret"]); $status = $sf_sync->testConnection(); if ($status) { $sf_sync->saveConnection(); $status_code = 200; $response['status'] = true; $response['message'] = "Test Connection Successfully"; } else { $response['message'] = $sf_sync->error ?? "Something went wrong"; $response['message'] .= " Please check the sugarcrm.log for more details."; } } else { $response['message'] = $mod_strings["LBL_MISSING_REQUIRED_FIELD"] ?? "Missing Required Field"; } http_response_code($status_code); echo json_encode($response); exit(0); } public function action_Revoke() { global $mod_strings; $status_code = 400; $response = []; $response['status'] = false; $response['message'] = 'Something went wrong'; if (isset($_REQUEST["sf_domain"]) && isset($_REQUEST["sf_client_id"]) && isset($_REQUEST["sf_client_secret"])) { $sf_sync = new SF_SubscriptionFlow_Sync(); $sf_sync->loadConnection(); if ($sf_sync->status) { $sf_sync->revokeConnection(); $status_code = 200; $response['status'] = true; $response['message'] = "SubscriptionFlow access revoked successfully"; } else { $response['message'] = "SubscriptionFlow access already revoked."; } } else { $response['message'] = $mod_strings["LBL_MISSING_REQUIRED_FIELD"] ?? "Missing Required Field"; } http_response_code($status_code); echo json_encode($response); exit(0); } private function syncInvoice($subscriptionObject = null, $subscription_id = null, $account_id = null, $opportunity_id = null, $invoice_id = null) { global $current_user; $invoice = null; /*if (!SugarAutoloader::file_exists("custom/Extension/modules/SF_Invoices/Ext/Vardefs/sugarfield_sf_invoice_id_c.php")) { $GLOBALS['log']->fatal("handle custom fields"); $this->handleCustomFields(); }*/ if($invoice_id){ $sf_sync = new SF_SubscriptionFlow_Sync(); $sf_sync->loadConnection(); $sfInvoice = $sf_sync->getInvoice($invoice_id); $invoice = BeanFactory::newBean('SF_Invoices'); $invoice->sf_invoice_id_c = $sfInvoice['id']; $invoice->name = $sfInvoice['name']; $date_entered = $sfInvoice['created_at']; $date_entered = date('Y-m-d H:i:s', strtotime($date_entered . ' +1 second')); $invoice->date_entered = $date_entered; $invoice->date_modified = $date_entered; $invoice->created_by = $current_user->id; $invoice->modified_user_id = $current_user->id; $invoice->assigned_user_id = $current_user->id; $invoice->invoice_date = $sfInvoice['invoice_date']; $invoice->due_date = $sfInvoice['due_date']; $invoice->terms = $sfInvoice['terms']; $invoice->status = $sfInvoice['status']; $invoice->status_reason = $sfInvoice['note']; $invoice->discount_amount = $sfInvoice['discount_value']; $invoice->tax_amount = $sfInvoice['tax_amount']; $invoice->miscellaneous_charges = $sfInvoice['miscellaneous_charges']; $invoice->sub_total = $sfInvoice['sub_total']; $invoice->total_amount = $sfInvoice['total_amount']; $invoice->received_payment = $sfInvoice['received_payment']; $invoice->additional_info = $sfInvoice['additional_info']; $invoice->opening_balance = $sfInvoice['opening_balance']; $invoice->closing_balance = $sfInvoice['closing_balance']; $invoice->reversed_reference = $sfInvoice['reversed_reference']; $invoice->accounting_resource_id = $sfInvoice['accounting_resource_id']; $invoice->description = $sfInvoice['description']; $invoice->currency_id = $subscriptionObject ? $subscriptionObject->currency_id : null; $invoice->base_rate = 1.0; $invoice->team_id = $current_user->default_team; $invoice->team_set_id = $current_user->default_team; $invoice->acl_team_set_id = $current_user->default_team; $invoice->save(); if($invoice->id){ } if($opportunity_id){ $invoice->load_relationship('sf_invoices_opportunities'); $invoice->sf_invoices_opportunities->add($opportunity_id); } if($account_id){ $invoice->load_relationship('sf_invoices_accounts'); $invoice->sf_invoices_accounts->add($account_id); } if($subscription_id){ $invoice->load_relationship('sf_invoices_sf_subscriptions'); $invoice->sf_invoices_sf_subscriptions->add($subscription_id); } if(isset($sfInvoice["items"]) && is_array($sfInvoice["items"]) && count($sfInvoice["items"]) > 0){ foreach ($sfInvoice["items"] as $index => $productPlan) { if(isset($productPlan['charges']) && is_array($productPlan['charges']) && count($productPlan['charges']) > 0){ foreach($productPlan['charges'] as $charge){ $purchased_line_item = BeanFactory::newBean('PurchasedLineItems'); $purchased_line_item->name = $charge['name']; $date_entered = $GLOBALS['timedate']->nowDb(); $date_entered = date('Y-m-d H:i:s', strtotime($date_entered . ' +1 second')); $purchased_line_item->date_entered = $date_entered; $purchased_line_item->date_modified = $date_entered; $purchased_line_item->created_by = $current_user->id; $purchased_line_item->modified_user_id = $current_user->id; $purchased_line_item->assigned_user_id = $current_user->id; if (isset($charge['plan_price']['description'])) { $purchased_line_item->description = $charge['plan_price']['description']; } else { $purchased_line_item->description = null; } $charge_price = $charge['charge_price']; $quantity = $charge['default_quantity'] ?? 1; $subtotal = $charge['sub_total']; $purchased_line_item->account_id = $account_id; $purchased_line_item->subtotal = $subtotal; $purchased_line_item->total_amount = $subtotal; $purchased_line_item->product_type_id = null; $purchased_line_item->manufacturer_id = null; $purchased_line_item->category_id = null; $purchased_line_item->mft_part_num = null; $purchased_line_item->cost_price = $charge_price; $purchased_line_item->discount_price = 0; $purchased_line_item->discount_amount = 0; $purchased_line_item->discount_select = 1; $purchased_line_item->deal_calc = 0; $purchased_line_item->deal_calc_usdollar = 0; $purchased_line_item->cost_usdollar = $charge_price; $purchased_line_item->discount_usdollar = 0; $purchased_line_item->list_usdollar = $charge_price; $purchased_line_item->status = null; $purchased_line_item->book_value_usdollar = null; $purchased_line_item->date_closed = null; $purchased_line_item->date_closed_timestamp = null; $purchased_line_item->team_id = $current_user->default_team; $purchased_line_item->team_set_id = $current_user->default_team; $purchased_line_item->acl_team_set_id = $current_user->default_team; $purchased_line_item->list_price = $charge_price; $purchased_line_item->quantity = $quantity; $purchased_line_item->pricing_factor = 1; if (isset($charge['plan_price']['category']) && $charge['plan_price']['category'] == 'recurring') { $purchased_line_item->renewable = 1; } else { $purchased_line_item->renewable = 0; } $purchased_line_item->renewal = 0; $purchased_line_item->date_support_starts = $charge['service_from']; $purchased_line_item->service_start_date = $charge['service_from']; $purchased_line_item->support_name = "SubscriptionFlow"; $purchased_line_item->date_support_expires = $charge['service_to']; $purchased_line_item->service_end_date = $charge['service_to']; $purchased_line_item->service = 1; $purchased_line_item->date_purchased = $date_entered; $purchased_line_item->annual_revenue = null; $purchased_line_item->discount_amount_signed = $charge['discount']; $purchased_line_item->discount_amount_usdollar = $charge['discount']; $purchased_line_item->revenue = null; $purchased_line_item->revenue_usdollar = null; $purchased_line_item->product_template_id = null; $purchased_line_item->lock_duration = null; $purchased_line_item->sync_key = null; $purchased_line_item->asset_number = null; $purchased_line_item->book_value = null; $purchased_line_item->book_value_date = null; $purchased_line_item->serial_number = null; $purchased_line_item->catalog_service_duration_value = null; $purchased_line_item->catalog_service_duration_unit = null; $purchased_line_item->service_duration_multiplier = null; $purchased_line_item->support_contact = null; $purchased_line_item->support_description = null; $purchased_line_item->support_term = null; $purchased_line_item->tax_class = null; $purchased_line_item->vendor_part_num = null; $purchased_line_item->website = null; $purchased_line_item->weight = null; $purchased_line_item->base_rate = 1.0; $purchased_line_item->sf_product_id_c = $productPlan['product_id'] ?? null; $purchased_line_item->sf_plan_id_c = $productPlan['plan_id'] ?? null; $purchased_line_item->sf_price_id_c = $charge['id'] ?? null; if ($subscriptionObject && $subscriptionObject->currency_id) { $purchased_line_item->currency_id = $subscriptionObject->currency_id; } $purchased_line_item->save(); $purchased_line_item->load_relationship('sf_invoices_purchasedlineitems'); $purchased_line_item->sf_invoices_purchasedlineitems->add($invoice->id); } } } } } return $invoice; } }