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(' -
- -
-
-
-
-
-
-

' . sprintf($plugin->get_lang('EnableTrialSubscriptionHelpText'), $serviceInfo['trial_frequency'] . ' ' . $trialTime) . '

-
-
- '); - } - $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(' -
-
- ' . $plugin->get_lang('Check') . ' -
-
-
-
-
- -
-
-
-

' . $plugin->get_lang('DiscountCodeInfoText') . '

-
-
- '); } @@ -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 %} + {{ service.service.name }} + {% elseif service.node_type == 1 %} + {{ service.service.name }} + {% elseif service.node_type == 2 %} + {{ service.service.name }} + {% elseif service.node_type == 3 %} + {{ service.service.name }} + {% 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 %}