diff --git a/plugin/buycourses/src/buy_course_plugin.class.php b/plugin/buycourses/src/buy_course_plugin.class.php
index bc9ae545ff..4402a68a3d 100644
--- a/plugin/buycourses/src/buy_course_plugin.class.php
+++ b/plugin/buycourses/src/buy_course_plugin.class.php
@@ -29,6 +29,7 @@ class BuyCoursesPlugin extends Plugin
const PRODUCT_TYPE_SESSION = 2;
const PAYMENT_TYPE_PAYPAL = 1;
const PAYMENT_TYPE_TRANSFER = 2;
+ const PAYMENT_TYPE_CULQI = 3;
const PAYOUT_STATUS_CANCELED = 2;
const PAYOUT_STATUS_PENDING = 0;
const PAYOUT_STATUS_COMPLETED = 1;
@@ -960,7 +961,8 @@ class BuyCoursesPlugin extends Plugin
{
return [
self::PAYMENT_TYPE_PAYPAL => 'PayPal',
- self::PAYMENT_TYPE_TRANSFER => $this->get_lang('BankTransfer')
+ self::PAYMENT_TYPE_TRANSFER => $this->get_lang('BankTransfer'),
+ self::PAYMENT_TYPE_CULQI => 'Culqi'
];
}
@@ -2086,4 +2088,52 @@ class BuyCoursesPlugin extends Plugin
);
}
+ /**
+ * Register a Service sale
+ * @param int $serviceId The service ID
+ * @param int $paymentType The payment type
+ * @param int $infoSelect The ID for Service Type
+ * @param int $trial trial mode
+ * @return boolean
+ */
+ public function registerServiceSale($serviceId, $paymentType, $infoSelect, $trial = null)
+ {
+ if (!in_array($paymentType, [self::PAYMENT_TYPE_PAYPAL, self::PAYMENT_TYPE_TRANSFER, self::PAYMENT_TYPE_CULQI])) {
+ return false;
+ }
+
+ $userId = api_get_user_id();
+
+ $service = $this->getServices($serviceId);
+
+ if (empty($service)) {
+ return false;
+ }
+
+ $currency = $this->getSelectedCurrency();
+
+ $values = [
+ 'service_id' => $serviceId,
+ 'reference' => $this->generateReference(
+ $userId,
+ $service['applies_to'],
+ $infoSelect
+ ),
+ 'currency_id' => $currency['id'],
+ 'price' => $service['price'],
+ 'node_type' => $service['applies_to'],
+ 'node_id' => intval($infoSelect),
+ 'buyer_id' => $userId,
+ 'buy_date' => api_get_utc_datetime(),
+ 'date_start' => api_get_utc_datetime(),
+ 'date_end' => date_format(date_add(date_create(api_get_utc_datetime()), date_interval_create_from_date_string($service['duration_days'].' days')), 'Y-m-d H:i:s'),
+ 'status' => self::SERVICE_STATUS_PENDING,
+ 'payment_type' => intval($paymentType)
+ ];
+
+ $returnedServiceSaleId = Database::insert(self::TABLE_SERVICES_SALE, $values);
+
+ return $returnedServiceSaleId;
+ }
+
}
diff --git a/plugin/buycourses/src/service_process.php b/plugin/buycourses/src/service_process.php
index 1cbf4b009a..17c70ef322 100644
--- a/plugin/buycourses/src/service_process.php
+++ b/plugin/buycourses/src/service_process.php
@@ -62,69 +62,18 @@ if ($form->validate()) {
header('Location:' . api_get_self() . '?' . $queryString);
exit;
}
-
- $userGroup = $em->getRepository('ChamiloCoreBundle:Usergroup')->findBy(['name' => $formValues['info_select']]);
-
- if ($userGroup) {
- Display::addFlash(
- Display::return_message($plugin->get_lang('StoreNameAlreadyExist'), 'error', false)
- );
- header('Location:' . api_get_self() . '?' . $queryString);
- exit;
- }
$serviceSaleId = $plugin->registerServiceSale($serviceId, $formValues['payment_type'], $formValues['info_select'], $formValues['enable_trial']);
- if (!empty($formValues['store_code'])) {
- $data = [
- 'store_code' => Security::remove_XSS($formValues['store_code']),
- 'store_name' => Security::remove_XSS($formValues['info_select']),
- 'parent_id' => 0,
- 'description' => 'Registered by User in buying process',
- 'type' => 1,
- 'discount' => 0
- ];
-
- $verification = $plugin->getDiscountByCode($data['store_code']);
-
- if (!$verification) {
- $plugin->addDiscountCode($data);
- }
- }
-
if ($serviceSaleId !== false) {
$_SESSION['bc_service_sale_id'] = $serviceSaleId;
-
- if ($verification['discount'] == 100) {
- $serviceSale = $plugin->getServiceSale($serviceSaleId);
-
- $serviceSaleIsCompleted = $plugin->completeServiceSale($serviceSale['id']);
- if ($serviceSaleIsCompleted) {
- Display::addFlash(Display::return_message(sprintf($plugin->get_lang('SubscriptionToServiceXSuccessful'), $serviceSale['service']['name']), 'success'));
-
- $plugin->SendSubscriptionMail(intval($serviceSale['id']));
-
- unset($_SESSION['bc_service_sale_id']);
-
- header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/package_panel.php?id='.$serviceSale['id']);
- exit;
- }
- }
-
- if ($wizard) {
- header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_process_confirm.php?from=register');
- } else {
- header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_process_confirm.php');
- }
+ header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_process_confirm.php');
}
exit;
}
-// Reset discount code
-unset($_SESSION['s_discount']);
-
$paymentTypesOptions = $plugin->getPaymentTypes(true);
$form->addHeader('');
@@ -163,47 +112,6 @@ if ($typeUser) {
}
}
$form->addSelect('info_select', get_lang('Session'), $selectOptions);
-} elseif ($typeSubscriptionPackage) {
- $trial = intval($serviceInfo['allow_trial']);
-
- if ($trial) {
- $trialTime = $serviceInfo['trial_period'] == 'Month' ? get_lang($serviceInfo['trial_period']) . '(es)' : get_lang($serviceInfo['trial_period']) . '(s)';
- $form->addHtml('
-
-
- ');
- }
- $form->addText('store_code', $plugin->get_lang('DiscountCodeProcess'), true, ['cols-size' => [6, 6, 0], 'id' => 'store_code']);
- $form->addText('info_select_trick', $plugin->get_lang('StoreName'), true, ['cols-size' => [6, 6, 0], 'id' => 'info_select_trick']);
- $form->addHidden('info_select', '');
- $form->addHtml('
-
-
-
-
-
- ');
}
@@ -217,11 +125,7 @@ $templateName = $plugin->get_lang('PaymentMethods');
$interbreadcrumb[] = array("url" => "service_catalog.php", "name" => $plugin->get_lang('ListOfServicesOnSale'));
$tpl = new Template($templateName);
-if (isset($_GET['from'])) {
- if($_GET['from'] == 'register') {
- $tpl->assign('wizard', true);
- }
-}
+
$tpl->assign('buying_service', true);
$tpl->assign('service', $serviceInfo);
$tpl->assign('user', api_get_user_info());
diff --git a/plugin/buycourses/src/service_process_confirm.php b/plugin/buycourses/src/service_process_confirm.php
new file mode 100644
index 0000000000..5efa486be3
--- /dev/null
+++ b/plugin/buycourses/src/service_process_confirm.php
@@ -0,0 +1,180 @@
+getServiceSale($serviceSaleId);
+
+if (empty($serviceSale)) {
+ api_not_allowed(true);
+}
+
+$currency = $plugin->getCurrency($serviceSale['currency_id']);
+
+switch ($serviceSale['payment_type']) {
+ case BuyCoursesPlugin::PAYMENT_TYPE_PAYPAL:
+ $paypalParams = $plugin->getPaypalParams();
+
+ $pruebas = $paypalParams['sandbox'] == 1;
+ $paypalUsername = $paypalParams['username'];
+ $paypalPassword = $paypalParams['password'];
+ $paypalSignature = $paypalParams['signature'];
+
+ // This var $itemPrice may be "0" if the transaction does not include a one-time purchase such as when you set up
+ // a billing agreement for a recurring payment that is not immediately charged. When the field is set to 0,
+ // purchase-specific fields are ignored. This little condition handle this fact.
+ $itemPrice = $serviceSale['price'];
+
+ $returnUrl = api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_success.php';
+ $cancelUrl = api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_error.php';
+
+ // The extra params for handle the hard job, this var is VERY IMPORTANT !!
+ $extra = '';
+
+ require_once("paypalfunctions.php");
+
+ $extra .= "&L_PAYMENTREQUEST_0_NAME0={$serviceSale['service']['name']}";
+ $extra .= "&L_PAYMENTREQUEST_0_QTY0=1";
+ $extra .= "&L_PAYMENTREQUEST_0_AMT0=$itemPrice";
+
+ // Full Checkout express
+ $expressCheckout = CallShortcutExpressCheckout(
+ $itemPrice,
+ $currency['iso_code'],
+ 'paypal',
+ $returnUrl,
+ $cancelUrl,
+ $extra
+ );
+
+ if ($expressCheckout["ACK"] !== 'Success') {
+ $erroMessage = vsprintf(
+ $plugin->get_lang('ErrorOccurred'),
+ [$expressCheckout['L_ERRORCODE0'], $expressCheckout['L_LONGMESSAGE0']]
+ );
+ Display::addFlash(
+ Display::return_message($erroMessage, 'error', false)
+ );
+
+ $plugin->cancelServiceSale(intval($serviceSale['id']));
+
+ header('Location: '. api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_catalog.php');
+ exit;
+ }
+
+ RedirectToPayPal($expressCheckout['TOKEN']);
+ break;
+ case BuyCoursesPlugin::PAYMENT_TYPE_TRANSFER:
+
+ switch ($serviceSale['node_type']) {
+ case BuyCoursesPlugin::SERVICE_TYPE_USER:
+ $buyingCourse = true;
+ $user = api_get_user_info(intval($serviceSale['node_id']));
+ break;
+ case BuyCoursesPlugin::SERVICE_TYPE_COURSE:
+ $buyingCourse = true;
+ $course = $plugin->getCourseInfo($serviceSale['node_id']);
+ break;
+ case BuyCoursesPlugin::SERVICE_TYPE_SESSION:
+ $buyingSession = true;
+ $session = $plugin->getSessionInfo($serviceSale['node_id']);
+ break;
+ }
+
+ $transferAccounts = $plugin->getTransferAccounts();
+ $userInfo = api_get_user_info($serviceSale['buyer']['id']);
+
+ $form = new FormValidator('success', 'POST', api_get_self(), null, null, FormValidator::LAYOUT_INLINE);
+
+ if ($form->validate()) {
+ $formValues = $form->getSubmitValues();
+
+ if (isset($formValues['cancel'])) {
+ $plugin->cancelServiceSale(intval($serviceSale['id']));
+
+ unset($_SESSION['bc_service_sale_id']);
+ Display::addFlash(
+ Display::return_message($plugin->get_lang('OrderCancelled'), 'error', false)
+ );
+ header('Location: '. api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_catalog.php');
+ exit;
+ }
+
+ $messageTemplate = new Template();
+ $messageTemplate->assign(
+ 'service_sale',
+ [
+ 'name' => $serviceSale['service']['name'],
+ 'buyer' => $serviceSale['buyer']['name'],
+ 'buy_date' => api_format_date($serviceSale['buy_date'], DATE_TIME_FORMAT_LONG_24H),
+ 'start_date' => api_format_date($serviceSale['start_date'], DATE_TIME_FORMAT_LONG_24H),
+ 'end_date' => api_format_date($serviceSale['end_date'], DATE_TIME_FORMAT_LONG_24H),
+ 'currency' => $currency['currency'],
+ 'price' => $serviceSale['price'],
+ 'reference' => $serviceSale['reference']
+ ]
+ );
+ $messageTemplate->assign('transfer_accounts', $transferAccounts);
+ $buyer = api_get_user_info($serviceSale['buyer']['id']);
+ api_mail_html(
+ $buyer['complete_name'],
+ $buyer['email'],
+ $plugin->get_lang('bc_subject'),
+ $messageTemplate->fetch('buycourses/view/message_transfer.tpl')
+ );
+
+ Display::addFlash(
+ Display::return_message(
+ sprintf(
+ $plugin->get_lang('PurchaseStatusX'),
+ $plugin->get_lang('PendingReasonByTransfer')
+ ),
+ 'success',
+ false
+ )
+ );
+
+ unset($_SESSION['bc_service_sale_id']);
+ header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_catalog.php');
+ exit;
+ }
+
+ $form->addButton('confirm', $plugin->get_lang('ConfirmOrder'), 'check', 'success');
+ $form->addButtonCancel($plugin->get_lang('CancelOrder'), 'cancel');
+
+ $template = new Template();
+
+ $template->assign('title', $serviceSale['service']['name']);
+ $template->assign('price', $serviceSale['price']);
+ $template->assign('currency', $serviceSale['currency_id']);
+ $template->assign('buying_service', $serviceSale);
+ $template->assign('user', $userInfo);
+ $template->assign('service', $serviceSale);
+ $template->assign('transfer_accounts', $transferAccounts);
+ $template->assign('form', $form->returnForm());
+
+ $content = $template->fetch('buycourses/view/process_confirm.tpl');
+
+ $template->assign('content', $content);
+ $template->display_one_col_template();
+ break;
+
+ case BuyCoursesPlugin::PAYMENT_TYPE_CULQI:
+
+ break;
+}
+
diff --git a/plugin/buycourses/src/service_success.php b/plugin/buycourses/src/service_success.php
new file mode 100644
index 0000000000..de8ba4aada
--- /dev/null
+++ b/plugin/buycourses/src/service_success.php
@@ -0,0 +1,179 @@
+get('paypal_enable') === 'true';
+
+if (!$paypalEnabled) {
+ api_not_allowed(true);
+}
+
+$serviceSaleId = $_SESSION['bc_service_sale_id'];
+
+$serviceSale = $plugin->getServiceSale($serviceSaleId);
+$itemPrice = $serviceSale['price'];
+
+if (empty($serviceSale)) {
+ api_not_allowed(true);
+}
+
+$paypalParams = $plugin->getPaypalParams();
+
+$pruebas = $paypalParams['sandbox'] == 1;
+$paypalUsername = $paypalParams['username'];
+$paypalPassword = $paypalParams['password'];
+$paypalSignature = $paypalParams['signature'];
+
+require_once("paypalfunctions.php");
+
+$buyerInformation = GetShippingDetails(urlencode($_SESSION['TOKEN']));
+
+$form = new FormValidator('success', 'POST', api_get_self(), null, null, FormValidator::LAYOUT_INLINE);
+$form->addButton('confirm', $plugin->get_lang('ConfirmOrder'), 'check', 'success');
+$form->addButtonCancel($plugin->get_lang('CancelOrder'), 'cancel');
+
+if ($form->validate()) {
+ $formValues = $form->getSubmitValues();
+ if (isset($formValues['cancel'])) {
+ $plugin->cancelServiceSale($serviceSale['id']);
+
+ unset($_SESSION['bc_service_sale_id']);
+
+ Display::addFlash(
+ Display::return_message($plugin->get_lang('OrderCancelled'), 'error', false)
+ );
+
+ header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_catalog.php');
+ exit;
+ }
+
+ $confirmPayments = ConfirmPayment($itemPrice);
+
+ if ($confirmPayments['ACK'] !== 'Success') {
+ $erroMessage = vsprintf(
+ $plugin->get_lang('ErrorOccurred'),
+ [$expressCheckout['L_ERRORCODE0'], $confirmPayments['L_LONGMESSAGE0']]
+ );
+ Display::addFlash(
+ Display::return_message($erroMessage, 'error', false)
+ );
+ unset($_SESSION['wizard']);
+ header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_catalog.php');
+ exit;
+ }
+
+ switch ($confirmPayments["PAYMENTINFO_0_PAYMENTSTATUS"]) {
+ case 'Completed':
+ $serviceSaleIsCompleted = $plugin->completeServiceSale($serviceSale['id']);
+
+ if ($serviceSaleIsCompleted) {
+ Display::addFlash(
+ Display::return_message(
+ sprintf($plugin->get_lang('SubscriptionToServiceXSuccessful'), $serviceSale['service']['name']),
+ 'success'
+ )
+ );
+
+ break;
+ }
+
+ Display::addFlash(
+ Display::return_message($plugin->get_lang('ErrorContactPlatformAdmin'), 'error')
+ );
+ break;
+ case 'Pending':
+ switch ($confirmPayments["PAYMENTINFO_0_PENDINGREASON"]) {
+ case 'address':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByAddress');
+ break;
+ case 'authorization':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByAuthorization');
+ break;
+ case 'echeck':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByEcheck');
+ break;
+ case 'intl':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByIntl');
+ break;
+ case 'multicurrency':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByMulticurrency');
+ break;
+ case 'order':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByOrder');
+ break;
+ case 'paymentreview':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByPaymentReview');
+ break;
+ case 'regulatoryreview':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByRegulatoryReview');
+ break;
+ case 'unilateral':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByUnilateral');
+ break;
+ case 'upgrade':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByUpgrade');
+ break;
+ case 'verify':
+ $purchaseStatus = $plugin->get_lang('PendingReasonByVerify');
+ break;
+ case 'other':
+ //no break
+ default:
+ $purchaseStatus = $plugin->get_lang('PendingReasonByOther');
+ break;
+ }
+
+ Display::addFlash(
+ Display::return_message(
+ sprintf($plugin->get_lang('PurchaseStatusX'), $purchaseStatus),
+ 'warning',
+ false
+ )
+ );
+ break;
+ default:
+ $plugin->cancelServiceSale(intval($serviceSale['id']));
+
+ Display::addFlash(
+ Display::return_message($plugin->get_lang('ErrorContactPlatformAdmin'), 'error')
+ );
+ break;
+ }
+
+ unset($_SESSION['bc_service_sale_id']);
+
+ header('Location: ' . api_get_path(WEB_PLUGIN_PATH) . 'buycourses/src/service_catalog.php');
+
+ exit;
+}
+
+$token = isset($_GET['token']) ? Security::remove_XSS($_GET['token']) : null;
+
+if (empty($token)) {
+ api_not_allowed(true);
+}
+
+$interbreadcrumb[] = array("url" => "service_catalog.php", "name" => $plugin->get_lang('ListOfServicesOnSale'));
+
+$templateName = $plugin->get_lang('PaymentMethods');
+$tpl = new Template($templateName);
+
+$tpl->assign('title', $serviceSale['service']['name']);
+$tpl->assign('price', $serviceSale['price']);
+$tpl->assign('currency', $serviceSale['currency_id']);
+$tpl->assign('service', $serviceSale);
+$tpl->assign('buying_service', true);
+$tpl->assign('user', api_get_user_info($serviceSale['buyer']['id']));
+$tpl->assign('form', $form->returnForm());
+
+$content = $tpl->fetch('buycourses/view/success.tpl');
+$tpl->assign('content', $content);
+$tpl->display_one_col_template();
diff --git a/plugin/buycourses/view/process.tpl b/plugin/buycourses/view/process.tpl
index 4af0c88912..6c74d094db 100644
--- a/plugin/buycourses/view/process.tpl
+++ b/plugin/buycourses/view/process.tpl
@@ -1,5 +1,3 @@
-
-
{{ 'PurchaseData'|get_plugin_lang('BuyCoursesPlugin') }}
@@ -73,59 +71,12 @@
{% endif %}
diff --git a/plugin/buycourses/view/process_confirm.tpl b/plugin/buycourses/view/process_confirm.tpl
index 418f22863a..5bc9771658 100644
--- a/plugin/buycourses/view/process_confirm.tpl
+++ b/plugin/buycourses/view/process_confirm.tpl
@@ -54,6 +54,30 @@
+ {% elseif buying_service %}
+
+
+
+
+ {% if service.node_type == 0 %}
+
+ {% elseif service.node_type == 1 %}
+
+ {% elseif service.node_type == 2 %}
+
+ {% elseif service.node_type == 3 %}
+
+ {% endif %}
+
+
{{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price }}
+
+
+
{{ 'StartDate'|get_plugin_lang('BuyCoursesPlugin') }}
+
{{ service.date_start | format_date() }}
+
{{ 'EndDate'|get_plugin_lang('BuyCoursesPlugin') }}
+
{{ service.date_end | format_date() }}
+
+
{% endif %}