Plugin: BuyCourses: Add discount coupons feature by @nosolored

pull/3944/head
Yannick Warnier 4 years ago
parent d8f7ea313c
commit 4d8435ab18
  1. 11
      plugin/buycourses/CHANGELOG.md
  2. 86
      plugin/buycourses/database.php
  3. 30
      plugin/buycourses/lang/english.php
  4. 30
      plugin/buycourses/lang/french.php
  5. 30
      plugin/buycourses/lang/spanish.php
  6. 22
      plugin/buycourses/resources/css/style.css
  7. BIN
      plugin/buycourses/resources/img/128/discount.png
  8. BIN
      plugin/buycourses/resources/img/32/discount.png
  9. BIN
      plugin/buycourses/resources/img/42/discount.png
  10. BIN
      plugin/buycourses/resources/img/64/discount.png
  11. 1027
      plugin/buycourses/src/buy_course_plugin.class.php
  12. 204
      plugin/buycourses/src/configure_coupon.php
  13. 157
      plugin/buycourses/src/coupon_add.php
  14. 109
      plugin/buycourses/src/coupons.php
  15. 96
      plugin/buycourses/src/list_coupon.php
  16. 67
      plugin/buycourses/src/process.php
  17. 16
      plugin/buycourses/src/process_confirm.php
  18. 4
      plugin/buycourses/src/sales_report.php
  19. 58
      plugin/buycourses/src/service_process.php
  20. 11
      plugin/buycourses/src/service_process_confirm.php
  21. 8
      plugin/buycourses/src/service_sales_report.php
  22. 39
      plugin/buycourses/view/coupons.tpl
  23. 25
      plugin/buycourses/view/index.tpl
  24. 6
      plugin/buycourses/view/list.tpl
  25. 49
      plugin/buycourses/view/list_coupon.tpl
  26. 24
      plugin/buycourses/view/process.tpl
  27. 24
      plugin/buycourses/view/service_process.tpl
  28. 4
      plugin/buycourses/view/service_sales_report.tpl

@ -1,3 +1,14 @@
v7.0 - 2021-08-12
====
Added support for discount coupons.
Added a better table view for the sales report.
Multiple fixes to navigation-related issues.
WARNING: Updating this plugin (or Chamilo) without going through the specific update procedure for this plugin will break your sales pages.
The file [your-host]/plugin/buycourses/update.php *MUST* be executed to update the structure of the tables
in the database.
v6.0 - 2020-11-29
====
Added support for purchase instructions e-mail customization (although this

@ -257,6 +257,16 @@ if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_SALE)) {
$saleTable->addColumn('status', Types::INTEGER);
$saleTable->addColumn('payment_type', Types::INTEGER);
$saleTable->addColumn('invoice', Types::INTEGER);
$saleTable->addColumn(
'price_without_discount',
Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$saleTable->addColumn(
'discount_amount',
Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$saleTable->setPrimaryKey(['id']);
$saleTable->addForeignKeyConstraint(
$currencyTable,
@ -340,6 +350,16 @@ if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_SERVICES_SALE)) {
$servicesNodeTable->addColumn('status', Types::INTEGER);
$servicesNodeTable->addColumn('payment_type', Types::INTEGER);
$servicesNodeTable->addColumn('invoice', Types::INTEGER);
$servicesNodeTable->addColumn(
'price_without_discount',
Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$servicesNodeTable->addColumn(
'discount_amount',
Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$servicesNodeTable->setPrimaryKey(['id']);
$servicesNodeTable->addForeignKeyConstraint(
$servicesTable,
@ -414,6 +434,72 @@ if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_INVOICE)) {
$invoiceTable->setPrimaryKey(['id']);
}
if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON)) {
$couponTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON);
$couponTable->addColumn(
'id',
Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$couponTable->addColumn('code', Types::STRING);
$couponTable->addColumn('discount_type', Types::INTEGER);
$couponTable->addColumn('discount_amount', Types::INTEGER);
$couponTable->addColumn('valid_start', Types::DATETIME_MUTABLE);
$couponTable->addColumn('valid_end', Types::DATETIME_MUTABLE);
$couponTable->addColumn('delivered', Types::INTEGER);
$couponTable->addColumn('active', Types::TINYINT);
$couponTable->setPrimaryKey(['id']);
}
if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_ITEM)) {
$couponItemTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_ITEM);
$couponItemTable->addColumn(
'id',
Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$couponItemTable->addColumn('coupon_id', Types::INTEGER);
$couponItemTable->addColumn('product_type', Types::INTEGER);
$couponItemTable->addColumn('product_id', Types::INTEGER);
$couponItemTable->setPrimaryKey(['id']);
}
if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_SERVICE)) {
$couponService = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_SERVICE);
$couponService->addColumn(
'id',
Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$couponService->addColumn('coupon_id', Types::INTEGER);
$couponService->addColumn('service_id', Types::INTEGER);
$couponService->setPrimaryKey(['id']);
}
if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_SALE)) {
$couponSaleTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_SALE);
$couponSaleTable->addColumn(
'id',
Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$couponSaleTable->addColumn('coupon_id', Types::INTEGER);
$couponSaleTable->addColumn('sale_id', Types::INTEGER);
$couponSaleTable->setPrimaryKey(['id']);
}
if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_SERVICE_SALE)) {
$couponSaleTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_SERVICE_SALE);
$couponSaleTable->addColumn(
'id',
Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$couponSaleTable->addColumn('coupon_id', Types::INTEGER);
$couponSaleTable->addColumn('service_sale_id', Types::INTEGER);
$couponSaleTable->setPrimaryKey(['id']);
}
$queries = $pluginSchema->toSql($platform);
foreach ($queries as $query) {

@ -236,3 +236,33 @@ $strings['url_redsys'] = "Redsys connection URL";
$strings['url_redsys_sandbox'] = "Redsys connection URL (Sandbox)";
$strings['InfoTpvRedsysApiCredentials'] = "You must complete the following form fields with the information provided by the Redsys POS Technical Support:";
$strings['InfoEmailExtra'] = "Extra info in payment e-mail";
$strings['Coupon'] = "Coupon";
$strings['DiscountAmount'] = "Discount amount";
$strings['RedeemCoupon'] = "Redeem";
$strings['NeedToAddCouponCode'] = "A coupon code has not been entered";
$strings['CouponNotValid'] = "This coupon is not valid";
$strings['CouponRedeemed'] = "Coupon redeemed";
$strings['CouponDiscount'] = "Discount";
$strings['CouponStatus'] = "Coupon status";
$strings['CouponPercentage'] = "Percentage";
$strings['CouponAmount'] = "Amount";
$strings['CouponList'] = "Coupon list";
$strings['CouponCode'] = "Coupon code";
$strings['CouponDiscountType'] = "Discount type";
$strings['CouponDateStart'] = "Valid from";
$strings['CouponDateEnd'] = "Expires on";
$strings['CouponDelivered'] = "Delivered";
$strings['CouponDisable'] = "Disable";
$strings['CouponEnable'] = "Enable";
$strings['CouponCodeUsed'] = "Coupon code already used";
$strings['CouponNoExists'] = "Coupon no exists";
$strings['CouponErrorInsert'] = "Error inserting new coupon";
$strings['CouponActive'] = "Active";
$strings['CouponDisabled'] = "Disabled";
$strings['CouponUpdate'] = "Coupon updated";
$strings['CouponsConfiguration'] = "Coupons configuration";
$strings['CouponAdd'] = "New coupon";
$strings['ConfigureCoupon'] = "Configure coupon";
$strings['DiscountCoupon'] = "Discount coupons";
$strings['CouponsCode'] = "Code";
$strings['DoYouHaveACoupon'] = "Do you have a coupon?";

@ -164,3 +164,33 @@ $strings['ExportReport'] = "Export du rapport des ventes";
$strings['OrderTime'] = "Heure de commande";
$strings['SelectDateRange'] = "Sélectionnez une date de début et une date de fin pour le rapport";
$strings['InfoEmailExtra'] = "Informations additionnelles dans l'e-mail de paiement";
$strings['Coupon'] = "Coupon";
$strings['DiscountAmount'] = "Ristourne totale";
$strings['RedeemCoupon'] = "Échanger";
$strings['NeedToAddCouponCode'] = "Aucun code de coupon n'a été introduit";
$strings['CouponNotValid'] = "Ce coupon n'est pas valable";
$strings['CouponRedeemed'] = "Coupon échangé";
$strings['CouponDiscount'] = "Ristourne";
$strings['CouponStatus'] = "Statut du coupon";
$strings['CouponPercentage'] = "Pourcentage";
$strings['CouponAmount'] = "Montant";
$strings['CouponList'] = "Liste des coupons";
$strings['CouponCode'] = "Code du coupon";
$strings['CouponDiscountType'] = "Type de ristourne";
$strings['CouponDateStart'] = "Valable apd";
$strings['CouponDateEnd'] = "Expire le";
$strings['CouponDelivered'] = "Livré";
$strings['CouponDisable'] = "Désactivé";
$strings['CouponEnable'] = "Activé";
$strings['CouponCodeUsed'] = "Code de coupon déjà utilisé";
$strings['CouponNoExists'] = "Ce coupon n'existe pas";
$strings['CouponErrorInsert'] = "Erreur lors de l'insertion du coupon";
$strings['CouponActive'] = "Actif";
$strings['CouponDisabled'] = "Désactivé";
$strings['CouponUpdate'] = "Coupon mis à jour";
$strings['CouponsConfiguration'] = "Configuration coupons";
$strings['CouponAdd'] = "Nouveau coupon";
$strings['ConfigureCoupon'] = "Configurer le coupon";
$strings['DiscountCoupon'] = "Coupons de ristourne";
$strings['CouponsCode'] = "Code";
$strings['DoYouHaveACoupon'] = "Vous avez un coupon?";

@ -236,3 +236,33 @@ $strings['url_redsys'] = "URL conexión Redsys";
$strings['url_redsys_sandbox'] = "URL conexión Redsys (Pruebas)";
$strings['InfoTpvRedsysApiCredentials'] = "Deberá completar los siguientes campos del formulario con la información que les facilite el Soporte Técnico del TPV Redsys:";
$strings['InfoEmailExtra'] = "Información extra en e-mail";
$strings['Coupon'] = "Cupón";
$strings['DiscountAmount'] = "Descuento total";
$strings['RedeemCoupon'] = "Canjear";
$strings['NeedToAddCouponCode'] = "No se ha introducido un código de cupón";
$strings['CouponNotValid'] = "El cupón no es valido";
$strings['CouponRedeemed'] = "Cupón canjeado";
$strings['CouponDiscount'] = "Descuento";
$strings['CouponStatus'] = "Estado cupón";
$strings['CouponPercentage'] = "Porcentaje";
$strings['CouponAmount'] = "Valor";
$strings['CouponList'] = "Lista de cupones";
$strings['CouponCode'] = "Código del cupón";
$strings['CouponDiscountType'] = "Tipo de descuento";
$strings['CouponDateStart'] = "Valido desde";
$strings['CouponDateEnd'] = "Caduca el";
$strings['CouponDelivered'] = "Canjeados";
$strings['CouponDisable'] = "Desactivar";
$strings['CouponEnable'] = "Activar";
$strings['CouponCodeUsed'] = "Código de cupón ya usado";
$strings['CouponNoExists'] = "El cupón no existe";
$strings['CouponErrorInsert'] = "Error añadiendo nuevo cupón";
$strings['CouponActive'] = "Activo";
$strings['CouponDisabled'] = "Desactivado";
$strings['CouponUpdate'] = "Cupón actualizado";
$strings['CouponsConfiguration'] = "Configuración de cupones";
$strings['CouponAdd'] = "Nuevo cupón";
$strings['ConfigureCoupon'] = "Configurar cupón";
$strings['DiscountCoupons'] = "Cupones descuento";
$strings['CouponsCode'] = "Código";
$strings['DoYouHaveACoupon'] = "¿Tienes un cupón descuento?";

@ -71,6 +71,23 @@
color: #666666;
}
.buy-info .coupon-question, .service-buy .coupon {
font-size: 16px;
line-height: 6px;
font-weight: bold;
padding-bottom: 10px;
padding-top: 24px;
letter-spacing: -0.020em;
}
.buy-info .coupon, .service-buy .coupon {
line-height: 32px;
font-weight: bold;
padding-bottom: 10px;
padding-top: 10px;
letter-spacing: -0.1em;
}
.buy-summary {
margin-top: 10px;
border-top: 1px solid #CCCCCC;
@ -86,6 +103,11 @@
background-color: #e8f2f8;
border-color: #bce8f1;
}
.btn.btn-default.btn-sm {
white-space: unset;
}
tr.sale-row {
font-size: 12px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because it is too large Load Diff

@ -0,0 +1,204 @@
<?php
/* For license terms, see /license.txt */
/**
* Configuration script for the Buy Courses plugin.
*
* @package chamilo.plugin.buycourses
*/
require_once '../config.php';
api_protect_admin_script();
$couponId = $_REQUEST['id'];
if (!isset($couponId)) {
api_not_allowed();
}
$plugin = BuyCoursesPlugin::create();
$coupon = $plugin->getCouponInfo($couponId);
if (!isset($coupon)) {
api_not_allowed();
}
$couponDateRangeFrom = $coupon['valid_start'];
$couponDateRangeTo = $coupon['valid_end'];
$includeSession = $plugin->get('include_sessions') === 'true';
$includeServices = $plugin->get('include_services') === 'true';
$entityManager = Database::getManager();
$userRepo = UserManager::getRepository();
$currency = $plugin->getSelectedCurrency();
if (empty($currency)) {
Display::addFlash(
Display::return_message($plugin->get_lang('CurrencyIsNotConfigured'), 'error')
);
}
$currencyIso = null;
$coursesList = CourseManager::get_courses_list(
0,
0,
'title',
'asc',
-1,
null,
api_get_current_access_url_id(),
false,
[],
[]
);
foreach ($coursesList as $course) {
$courses[$course['id']] = $course['title'];
}
$sessionsList = SessionManager::get_sessions_list(
[],
[],
null,
null,
api_get_current_access_url_id(),
[]
);
foreach ($sessionsList as $session) {
$sessions[$session['id']] = $session['name'];
}
$servicesList = $plugin->getAllServices();
foreach ($servicesList as $service) {
$services[$service['id']] = $service['name'];
}
$discountTypes = $plugin->getCouponDiscountTypes();
// Build the form
$form = new FormValidator('add_coupon');
$form->addText('code', $plugin->get_lang('CouponCode'), false);
$form->addText('discount_type', $plugin->get_lang('CouponDiscountType'), false);
$form->addText('discount_amount', $plugin->get_lang('CouponDiscount'), false);
$form->addDateRangePicker(
'date',
get_lang('Date'),
true,
[
'value' => "$couponDateRangeFrom / $couponDateRangeTo",
]
);
$form->addCheckBox('active', $plugin->get_lang('CouponActive'));
$form->addElement(
'advmultiselect',
'courses',
get_lang('Courses'),
$courses
);
if ($includeSession) {
$form->addElement(
'advmultiselect',
'sessions',
get_lang('Sessions'),
$sessions
);
}
if ($includeServices) {
$form->addElement(
'advmultiselect',
'services',
get_lang('Services'),
$services
);
}
$form->addHidden('id', null);
$coursesAdded = $coupon["courses"];
if (!empty($coursesAdded)) {
$coursesAdded = array_column($coursesAdded, 'id');
}
$sessionsAdded = $coupon["sessions"];
if (!empty($sessionsAdded)) {
$sessionsAdded = array_column($sessionsAdded, 'id');
}
$servicesAdded = $coupon["services"];
if (!empty($servicesAdded)) {
$servicesAdded = array_column($servicesAdded, 'id');
}
$formDefaults = [
'id' => $coupon['id'],
'code' => $coupon['code'],
'discount_type' => $discountTypes[$coupon['discount_type']],
'discount_amount' => $coupon['discount_amount'],
'date' => "$couponDateRangeFrom / $couponDateRangeTo",
'active' => $coupon['active'],
'courses' => $coursesAdded,
'sessions' => $sessionsAdded,
'services' => $servicesAdded,
];
$button = $form->addButtonSave(get_lang('Save'));
if (empty($currency)) {
$button->setAttribute('disabled');
}
$form->freeze(['code', 'discount_type', 'discount_amount']);
if ($form->validate()) {
$formValues = $form->exportValues();
$coupon['id'] = $formValues['id'];
$coupon['valid_start'] = $formValues['date_start'];
$coupon['valid_end'] = $formValues['date_end'];
$coupon['active'] = $formValues['active'];
$coupon['courses'] = isset($formValues['courses']) ? $formValues['courses'] : [];
$coupon['sessions'] = isset($formValues['sessions']) ? $formValues['sessions'] : [];
$coupon['services'] = isset($formValues['services']) ? $formValues['services'] : [];
$result = $plugin->updateCouponData($coupon);
if ($result) {
Display::addFlash(
Display::return_message(
$plugin->get_lang('CouponUpdate'),
'success',
false
)
);
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/configure_coupon.php?id='.$coupon["id"]);
} else {
header('Location:'.api_get_self().'?'.$queryString);
}
exit;
}
$form->setDefaults($formDefaults);
$templateName = $plugin->get_lang('ConfigureCoupon');
$interbreadcrumb[] = [
'url' => 'paymentsetup.php',
'name' => get_lang('Configuration'),
];
$interbreadcrumb[] = [
'url' => 'coupons.php',
'name' => $plugin->get_lang('CouponList'),
];
$template = new Template($templateName);
$template->assign('header', $templateName);
$template->assign('content', $form->returnForm());
$template->display_one_col_template();

@ -0,0 +1,157 @@
<?php
/* For license terms, see /license.txt */
/**
* Configuration script for the Buy Courses plugin.
*
* @package chamilo.plugin.buycourses
*/
require_once '../config.php';
api_protect_admin_script();
$plugin = BuyCoursesPlugin::create();
$includeSession = $plugin->get('include_sessions') === 'true';
$includeServices = $plugin->get('include_services') === 'true';
$entityManager = Database::getManager();
$userRepo = UserManager::getRepository();
$currency = $plugin->getSelectedCurrency();
if (empty($currency)) {
Display::addFlash(
Display::return_message($plugin->get_lang('CurrencyIsNotConfigured'), 'error')
);
}
$currencyIso = null;
$coursesList = CourseManager::get_courses_list(
0,
0,
'title',
'asc',
-1,
null,
api_get_current_access_url_id(),
false,
[],
[]
);
foreach ($coursesList as $course) {
$courses[$course['id']] = $course['title'];
}
$sessionsList = SessionManager::get_sessions_list(
[],
[],
null,
null,
api_get_current_access_url_id(),
[]
);
foreach ($sessionsList as $session) {
$sessions[$session['id']] = $session['name'];
}
$servicesList = $plugin->getAllServices();
foreach ($servicesList as $service) {
$services[$service['id']] = $service['name'];
}
$discountTypes = $plugin->getCouponDiscountTypes();
// Build the form
$form = new FormValidator('add_coupon');
$form->addText('code', $plugin->get_lang('CouponCode'), true);
$form->addRadio('discount_type', $plugin->get_lang('CouponDiscountType'), $discountTypes);
$form->addElement(
'number',
'discount_amount',
[$plugin->get_lang('CouponDiscount'), null, $currencyIso],
['step' => 1]
);
$form->addDateRangePicker('date', get_lang('Date'), true);
$form->addCheckBox('active', get_lang('Active'));
$form->addElement(
'advmultiselect',
'courses',
get_lang('Courses'),
$courses
);
if ($includeSession) {
$form->addElement(
'advmultiselect',
'sessions',
get_lang('Sessions'),
$sessions
);
}
if ($includeServices) {
$form->addElement(
'advmultiselect',
'services',
get_lang('Services'),
$services
);
}
$button = $form->addButtonSave(get_lang('Save'));
if (empty($currency)) {
$button->setAttribute('disabled');
}
if ($form->validate()) {
$formValues = $form->exportValues();
$coupon['code'] = $formValues['code'];
$coupon['discount_type'] = $formValues['discount_type'];
$coupon['discount_amount'] = $formValues['discount_amount'];
$coupon['valid_start'] = $formValues['date_start'];
$coupon['valid_end'] = $formValues['date_end'];
$coupon['active'] = $formValues['active'];
if ($coupon['discount_type'] == BuyCoursesPlugin::COUPON_DISCOUNT_TYPE_PERCENTAGE && $coupon['discount_amount'] > 100) {
Display::addFlash(
Display::return_message($plugin->get_lang('CouponDiscountExceed100'), 'error', false)
);
}
$coupon['courses'] = isset($formValues['courses']) ? $formValues['courses'] : [];
$coupon['sessions'] = isset($formValues['sessions']) ? $formValues['sessions'] : [];
$coupon['services'] = isset($formValues['services']) ? $formValues['services'] : [];
$result = $plugin->addNewCoupon($coupon);
if ($result) {
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/coupons.php');
} else {
header('Location:'.api_get_self().'?'.$queryString);
}
exit;
}
$form->setDefaults($formDefaults);
$templateName = $plugin->get_lang('CouponAdd');
$interbreadcrumb[] = [
'url' => 'paymentsetup.php',
'name' => get_lang('Configuration'),
];
$interbreadcrumb[] = [
'url' => 'coupons.php',
'name' => $plugin->get_lang('CouponList'),
];
$template = new Template($templateName);
$template->assign('header', $templateName);
$template->assign('content', $form->returnForm());
$template->display_one_col_template();

@ -0,0 +1,109 @@
<?php
/* For license terms, see /license.txt */
/**
* List of couponsof the Buy Courses plugin.
*
* @package chamilo.plugin.buycourses
*/
$cidReset = true;
require_once '../config.php';
api_protect_admin_script();
$plugin = BuyCoursesPlugin::create();
if (isset($_GET['coupon_id'])) {
$coupon = $plugin->getCouponInfo($_GET['coupon_id']);
if (empty($coupon)) {
api_not_allowed(true);
}
$urlToRedirect = api_get_self().'?';
switch ($_GET['action']) {
case 'deactivate':
//activate coupon
break;
case 'activate':
//deactivate coupon
break;
}
header("Location: $urlToRedirect");
exit;
}
$discountTypes = $plugin->getCouponDiscountTypes();
$couponStatuses = $plugin->getCouponStatuses();
$selectedFilterType = '0';
$selectedStatus = isset($_GET['status']) ? $_GET['status'] : BuyCoursesPlugin::COUPON_STATUS_ACTIVE;
$form = new FormValidator('search', 'get');
if ($form->validate()) {
$selectedStatus = $form->getSubmitValue('status');
if ($selectedStatus === false) {
$selectedStatus = BuyCoursesPlugin::COUPON_STATUS_ACTIVE;
}
if ($selectedFilterType === false) {
$selectedFilterType = '0';
}
}
$form->addHtml('<div id="report-by-status" '.($selectedFilterType !== '0' ? 'style="display:none"' : '').'>');
$form->addSelect('status', $plugin->get_lang('CouponStatus'), $couponStatuses);
$form->addHtml('</div>');
$form->addButtonFilter(get_lang('Search'));
$form->setDefaults([
'filter_type' => $selectedFilterType,
'status' => $selectedStatus,
]);
$coupons = $plugin->getCouponsListByStatus($selectedStatus);
$currency = $plugin->getSelectedCurrency();
foreach ($coupons as &$coupon) {
if ($coupon['discount_type'] == BuyCoursesPlugin::COUPON_DISCOUNT_TYPE_PERCENTAGE) {
$coupon['discount_value'] = $coupon['discount_amount']." %";
} elseif ($coupon['discount_type'] == BuyCoursesPlugin::COUPON_DISCOUNT_TYPE_AMOUNT) {
$coupon['discount_value'] = $plugin->getPriceWithCurrencyFromIsoCode($coupon['discount_amount'], $currency['iso_code']);
}
$coupon['discount_type'] = $discountTypes[$coupon['discount_type']];
}
$interbreadcrumb[] = ['url' => '../index.php', 'name' => $plugin->get_lang('plugin_title')];
$htmlHeadXtra[] = api_get_css(api_get_path(WEB_PLUGIN_PATH).'buycourses/resources/css/style.css');
$templateName = $plugin->get_lang('CouponList');
$template = new Template($templateName);
$toolbar = Display::url(
Display::returnFontAwesomeIcon('fas fa-plus').
get_lang('CouponAdd'),
api_get_path(WEB_PLUGIN_PATH).'buycourses/src/coupon_add.php',
['class' => 'btn btn-primary']
);
$template->assign(
'actions',
Display::toolbarAction('toolbar', [$toolbar])
);
$template->assign('form', $form->returnForm());
$template->assign('selected_status', $selectedStatus);
$template->assign('coupon_list', $coupons);
$template->assign('coupon_status_active', BuyCoursesPlugin::COUPON_STATUS_ACTIVE);
$template->assign('coupon_status_disable', BuyCoursesPlugin::COUPON_STATUS_DISABLE);
$content = $template->fetch('buycourses/view/coupons.tpl');
$template->assign('header', $templateName);
$template->assign('content', $content);
$template->display_one_col_template();

@ -0,0 +1,96 @@
<?php
/* For license terms, see /license.txt */
/**
* List of couponsof the Buy Courses plugin.
*
* @package chamilo.plugin.buycourses
*/
$cidReset = true;
require_once '../config.php';
api_protect_admin_script();
$plugin = BuyCoursesPlugin::create();
if (isset($_GET['coupon_id'])) {
$coupon = $plugin->getCouponInfo($_GET['coupon_id']);
if (empty($coupon)) {
api_not_allowed(true);
}
$urlToRedirect = api_get_self().'?';
switch ($_GET['action']) {
case 'deactivate':
//activate coupon
break;
case 'activate':
//deactivate coupon
break;
}
header("Location: $urlToRedirect");
exit;
}
$discountTypes = $plugin->getCouponDiscountTypes();
$couponStatuses = $plugin->getCouponStatuses();
$selectedFilterType = '0';
$selectedStatus = isset($_GET['status']) ? $_GET['status'] : BuyCoursesPlugin::COUPON_STATUS_ACTIVE;
$form = new FormValidator('search', 'get');
if ($form->validate()) {
$selectedStatus = $form->getSubmitValue('status');
if ($selectedStatus === false) {
$selectedStatus = BuyCoursesPlugin::COUPON_STATUS_ACTIVE;
}
if ($selectedFilterType === false) {
$selectedFilterType = '0';
}
}
$form->addHtml('<div id="report-by-status" '.($selectedFilterType !== '0' ? 'style="display:none"' : '').'>');
$form->addSelect('status', $plugin->get_lang('CouponStatus'), $couponStatuses);
$form->addHtml('</div>');
$form->addButtonFilter(get_lang('Search'));
$form->setDefaults([
'filter_type' => $selectedFilterType,
'status' => $selectedStatus,
]);
$coupons = $plugin->getCouponsListByStatus($selectedStatus);
foreach ($coupons as &$coupon) {
if ($coupon['discount_type'] == BuyCoursesPlugin::COUPON_DISCOUNT_TYPE_PERCENTAGE) {
$coupon['discount_value'] = $coupon['discount_amount']." %";
} elseif ($coupon['discount_type'] == BuyCoursesPlugin::COUPON_DISCOUNT_TYPE_AMOUNT) {
$coupon['discount_value'] = $plugin->getPriceWithCurrencyFromIsoCode($coupon['discount_amount'], $coupon['iso_code']);
}
$coupon['discount_type'] = $discountTypes[$coupon['discount_type']];
}
$interbreadcrumb[] = ['url' => '../index.php', 'name' => $plugin->get_lang('plugin_title')];
$htmlHeadXtra[] = api_get_css(api_get_path(WEB_PLUGIN_PATH).'buycourses/resources/css/style.css');
$templateName = $plugin->get_lang('CouponList');
$template = new Template($templateName);
$template->assign('form', $form->returnForm());
$template->assign('selected_status', $selectedStatus);
$template->assign('coupon_list', $coupons);
$template->assign('coupon_status_active', BuyCoursesPlugin::COUPON_STATUS_ACTIVE);
$template->assign('coupon_status_disable', BuyCoursesPlugin::COUPON_STATUS_DISABLE);
$content = $template->fetch('buycourses/view/list_coupon.tpl');
$template->assign('header', $templateName);
$template->assign('content', $content);
$template->display_one_col_template();

@ -34,6 +34,15 @@ $buyingCourse = intval($_REQUEST['t']) === BuyCoursesPlugin::PRODUCT_TYPE_COURSE
$buyingSession = intval($_REQUEST['t']) === BuyCoursesPlugin::PRODUCT_TYPE_SESSION;
$queryString = 'i='.intval($_REQUEST['i']).'&t='.intval($_REQUEST['t']);
if (isset($_REQUEST['c'])) {
$couponCode = $_REQUEST['c'];
if ($buyingCourse) {
$coupon = $plugin->getCouponByCode($couponCode, BuyCoursesPlugin::PRODUCT_TYPE_COURSE, $_REQUEST['i']);
} else {
$coupon = $plugin->getCouponByCode($couponCode, BuyCoursesPlugin::PRODUCT_TYPE_SESSION, $_REQUEST['i']);
}
}
if (empty($currentUserId)) {
Session::write('buy_course_redirect', api_get_self().'?'.$queryString);
header('Location: '.api_get_path(WEB_CODE_PATH).'auth/inscription.php');
@ -41,10 +50,10 @@ if (empty($currentUserId)) {
}
if ($buyingCourse) {
$courseInfo = $plugin->getCourseInfo($_REQUEST['i']);
$courseInfo = $plugin->getCourseInfo($_REQUEST['i'], $coupon);
$item = $plugin->getItemByProduct($_REQUEST['i'], BuyCoursesPlugin::PRODUCT_TYPE_COURSE);
} elseif ($buyingSession) {
$sessionInfo = $plugin->getSessionInfo($_REQUEST['i']);
$sessionInfo = $plugin->getSessionInfo($_REQUEST['i'], $coupon);
$item = $plugin->getItemByProduct($_REQUEST['i'], BuyCoursesPlugin::PRODUCT_TYPE_SESSION);
}
@ -60,10 +69,19 @@ if ($form->validate()) {
exit;
}
$saleId = $plugin->registerSale($item['id'], $formValues['payment_type']);
$saleId = $plugin->registerSale($item['id'], $formValues['payment_type'], $formValues['c']);
if ($saleId !== false) {
$_SESSION['bc_sale_id'] = $saleId;
if (isset($formValues['c'])) {
$couponSaleId = $plugin->registerCouponSale($saleId, $formValues['c']);
if ($couponSaleId !== false) {
$plugin->updateCouponDelivered($formValues['c']);
$_SESSION['bc_coupon_id'] = $formValues['c'];
}
}
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/process_confirm.php');
}
@ -113,8 +131,50 @@ if ($count === 0) {
$form->addHidden('t', intval($_GET['t']));
$form->addHidden('i', intval($_GET['i']));
if ($coupon != null) {
$form->addHidden('c', intval($coupon['id']));
}
$form->addButton('submit', $plugin->get_lang('ConfirmOrder'), 'check', 'success', 'btn-lg pull-right');
$formCoupon = new FormValidator('confirm_coupon');
if ($formCoupon->validate()) {
$formCouponValues = $formCoupon->getSubmitValues();
if (!$formCouponValues['coupon_code']) {
Display::addFlash(
Display::return_message($plugin->get_lang('NeedToAddCouponCode'), 'error', false)
);
header('Location:'.api_get_self().'?'.$queryString);
exit;
}
if ($buyingCourse) {
$coupon = $plugin->getCouponByCode($formCouponValues['coupon_code'], BuyCoursesPlugin::PRODUCT_TYPE_COURSE, $_REQUEST['i']);
} else {
$coupon = $plugin->getCouponByCode($formCouponValues['coupon_code'], BuyCoursesPlugin::PRODUCT_TYPE_SESSION, $_REQUEST['i']);
}
if ($coupon == null) {
Display::addFlash(
Display::return_message($plugin->get_lang('CouponNotValid'), 'error', false)
);
header('Location:'.api_get_self().'?'.$queryString);
exit;
}
Display::addFlash(
Display::return_message($plugin->get_lang('CouponRedeemed'), 'success', false)
);
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/process.php?i='.$_REQUEST['i'].'&t='.$_REQUEST['t'].'&c='.$formCouponValues['coupon_code']);
exit;
}
$formCoupon->addText('coupon_code', $plugin->get_lang('CouponsCode'), true);
$formCoupon->addHidden('t', intval($_GET['t']));
$formCoupon->addHidden('i', intval($_GET['i']));
$formCoupon->addButton('submit', $plugin->get_lang('RedeemCoupon'), 'check', 'success', 'btn-lg pull-right');
// View
$templateName = $plugin->get_lang('PaymentMethods');
$interbreadcrumb[] = ['url' => 'course_catalog.php', 'name' => $plugin->get_lang('CourseListOnSale')];
@ -124,6 +184,7 @@ $tpl->assign('item_type', (int) $_GET['t']);
$tpl->assign('buying_course', $buyingCourse);
$tpl->assign('buying_session', $buyingSession);
$tpl->assign('user', api_get_user_info());
$tpl->assign('form_coupon', $formCoupon->returnForm());
$tpl->assign('form', $form->returnForm());
if ($buyingCourse) {

@ -11,6 +11,7 @@ require_once '../config.php';
$plugin = BuyCoursesPlugin::create();
$saleId = $_SESSION['bc_sale_id'];
$couponId = $_SESSION['bc_coupon_id'];
if (empty($saleId)) {
api_not_allowed(true);
@ -18,6 +19,10 @@ if (empty($saleId)) {
$sale = $plugin->getSale($saleId);
if (!empty($couponId)) {
$coupon = $plugin->getCoupon($couponId, $sale['product_type'], $sale['product_id']);
}
$userInfo = api_get_user_info($sale['user_id']);
if (empty($sale)) {
@ -95,11 +100,11 @@ switch ($sale['payment_type']) {
switch ($sale['product_type']) {
case BuyCoursesPlugin::PRODUCT_TYPE_COURSE:
$buyingCourse = true;
$course = $plugin->getCourseInfo($sale['product_id']);
$course = $plugin->getCourseInfo($sale['product_id'], $coupon);
break;
case BuyCoursesPlugin::PRODUCT_TYPE_SESSION:
$buyingSession = true;
$session = $plugin->getSessionInfo($sale['product_id']);
$session = $plugin->getSessionInfo($sale['product_id'], $coupon);
break;
}
@ -122,6 +127,7 @@ switch ($sale['payment_type']) {
$plugin->cancelSale($sale['id']);
unset($_SESSION['bc_sale_id']);
unset($_SESSION['bc_coupon_id']);
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/index.php');
exit;
@ -182,6 +188,7 @@ switch ($sale['payment_type']) {
);
unset($_SESSION['bc_sale_id']);
unset($_SESSION['bc_coupon_id']);
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/course_catalog.php');
exit;
}
@ -232,11 +239,11 @@ switch ($sale['payment_type']) {
switch ($sale['product_type']) {
case BuyCoursesPlugin::PRODUCT_TYPE_COURSE:
$buyingCourse = true;
$course = $plugin->getCourseInfo($sale['product_id']);
$course = $plugin->getCourseInfo($sale['product_id'], $coupon);
break;
case BuyCoursesPlugin::PRODUCT_TYPE_SESSION:
$buyingSession = true;
$session = $plugin->getSessionInfo($sale['product_id']);
$session = $plugin->getSessionInfo($sale['product_id'], $coupon);
break;
}
@ -256,6 +263,7 @@ switch ($sale['payment_type']) {
$plugin->cancelSale($sale['id']);
unset($_SESSION['bc_sale_id']);
unset($_SESSION['bc_coupon_id']);
Display::addFlash(
Display::return_message(

@ -144,6 +144,10 @@ foreach ($sales as &$sale) {
$sale['complete_user_name'] = api_get_person_name($sale['firstname'], $sale['lastname']);
$sale['num_invoice'] = $plugin->getNumInvoice($sale['id'], 0);
$sale['total_price'] = $plugin->getPriceWithCurrencyFromIsoCode($sale['price'], $sale['iso_code']);
if (isset($sale['discount_amount']) && $sale['discount_amount'] != 0) {
$sale['total_discount'] = $plugin->getPriceWithCurrencyFromIsoCode($sale['discount_amount'], $sale['iso_code']);
$sale['coupon_code'] = $plugin->getSaleCouponCode($sale['id']);
}
}
$interbreadcrumb[] = ['url' => '../index.php', 'name' => $plugin->get_lang('plugin_title')];

@ -46,7 +46,12 @@ $typeSession = $type === BuyCoursesPlugin::SERVICE_TYPE_SESSION;
$typeFinalLp = $type === BuyCoursesPlugin::SERVICE_TYPE_LP_FINAL_ITEM;
$queryString = 'i='.$serviceId.'&t='.$type.$additionalQueryString;
$serviceInfo = $plugin->getService($serviceId);
if (isset($_REQUEST['c'])) {
$couponCode = $_REQUEST['c'];
$coupon = $plugin->getCouponServiceByCode($couponCode, $_REQUEST['i']);
}
$serviceInfo = $plugin->getService($serviceId, $coupon);
$userInfo = api_get_user_info($currentUserId);
$form = new FormValidator('confirm_sale');
@ -238,16 +243,64 @@ if ($form->validate()) {
$serviceSaleId = $plugin->registerServiceSale(
$serviceId,
$formValues['payment_type'],
$infoSelected
$infoSelected,
$formValues['c']
);
if ($serviceSaleId !== false) {
$_SESSION['bc_service_sale_id'] = $serviceSaleId;
if (isset($formValues['c'])) {
$couponSaleId = $plugin->registerCouponServiceSale($serviceSaleId, $formValues['c']);
if ($couponSaleId !== false) {
$plugin->updateCouponDelivered($formValues['c']);
$_SESSION['bc_coupon_id'] = $formValues['c'];
}
}
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/service_process_confirm.php');
}
exit;
}
$formCoupon = new FormValidator('confirm_coupon');
if ($formCoupon->validate()) {
$formCouponValues = $formCoupon->getSubmitValues();
if (!$formCouponValues['coupon_code']) {
Display::addFlash(
Display::return_message($plugin->get_lang('NeedToAddCouponCode'), 'error', false)
);
header('Location:'.api_get_self().'?'.$queryString);
exit;
}
$coupon = $plugin->getCouponServiceByCode($formCouponValues['coupon_code'], $formCouponValues['i']);
if ($coupon == null) {
Display::addFlash(
Display::return_message($plugin->get_lang('CouponNotValid'), 'error', false)
);
header('Location:'.api_get_self().'?'.$queryString);
exit;
}
Display::addFlash(
Display::return_message($plugin->get_lang('CouponRedeemed'), 'success', false)
);
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/service_process.php?i='.$_REQUEST['i'].'&t='.$_REQUEST['t'].'&c='.$formCouponValues['coupon_code']);
exit;
}
$formCoupon->addText('coupon_code', $plugin->get_lang('CouponsCode'), true);
$formCoupon->addHidden('t', intval($_GET['t']));
$formCoupon->addHidden('i', intval($_GET['i']));
if ($coupon != null) {
$form->addHidden('c', intval($coupon['id']));
}
$formCoupon->addButton('submit', $plugin->get_lang('RedeemCoupon'), 'check', 'success', 'btn-lg pull-right');
// View
$templateName = $plugin->get_lang('PaymentMethods');
$interbreadcrumb[] = [
@ -259,6 +312,7 @@ $tpl = new Template($templateName);
$tpl->assign('buying_service', true);
$tpl->assign('service', $serviceInfo);
$tpl->assign('user', api_get_user_info());
$tpl->assign('form_coupon', $formCoupon->returnForm());
$tpl->assign('form', $form->returnForm());
$content = $tpl->fetch('buycourses/view/service_process.tpl');
$tpl->assign('content', $content);

@ -12,14 +12,20 @@ require_once '../config.php';
$plugin = BuyCoursesPlugin::create();
$serviceSaleId = Session::read('bc_service_sale_id');
$couponId = Session::read('bc_coupon_id');
if (empty($serviceSaleId)) {
api_not_allowed(true);
}
$serviceSale = $plugin->getServiceSale($serviceSaleId);
$serviceSale = $plugin->getServiceSale($serviceSaleId, $coupon);
$userInfo = api_get_user_info($serviceSale['buyer']['id']);
if (!empty($couponId)) {
$coupon = $plugin->getCouponService($couponId, $serviceSale['service_id']);
$serviceSale['item'] = $plugin->getService($serviceSale['service_id'], $coupon);
}
if (empty($serviceSale)) {
api_not_allowed(true);
}
@ -119,6 +125,7 @@ switch ($serviceSale['payment_type']) {
$plugin->cancelServiceSale($serviceSale['id']);
unset($_SESSION['bc_service_sale_id']);
unset($_SESSION['bc_coupon_id']);
Display::addFlash(
Display::return_message($plugin->get_lang('OrderCancelled'), 'error', false)
);
@ -183,6 +190,7 @@ switch ($serviceSale['payment_type']) {
);
unset($_SESSION['bc_service_sale_id']);
unset($_SESSION['bc_coupon_id']);
header('Location: '.api_get_path(WEB_PLUGIN_PATH).'buycourses/src/service_catalog.php');
exit;
}
@ -243,6 +251,7 @@ switch ($serviceSale['payment_type']) {
$plugin->cancelServiceSale($serviceSale['id']);
unset($_SESSION['bc_service_sale_id']);
unset($_SESSION['bc_coupon_id']);
Display::addFlash(
Display::return_message(

@ -35,6 +35,14 @@ $form->addText('user', get_lang('User'), false, ['cols-size' => [0, 0, 0]]);
$form->addButtonSearch(get_lang('Search'), 'search');
$servicesSales = $plugin->getServiceSales(null, $selectedStatus);
foreach ($servicesSales as &$sale) {
if (isset($sale['discount_amount']) && $sale['discount_amount'] != 0) {
$sale['total_discount'] = $plugin->getPriceWithCurrencyFromIsoCode($sale['discount_amount'], $sale['iso_code']);
$sale['coupon_code'] = $plugin->getServiceSaleCouponCode($sale['id']);
}
}
$interbreadcrumb[] = ['url' => '../index.php', 'name' => $plugin->get_lang('plugin_title')];
$webPluginPath = api_get_path(WEB_PLUGIN_PATH);

@ -0,0 +1,39 @@
<br />
<br />
{{ form }}
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr class="sale-columns">
<th>{{ 'CouponCode'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDiscountType'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDiscount'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDateStart'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDateEnd'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDelivered'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th width="10%">{{ 'Options'|get_lang }}</th>
</tr>
</thead>
<tbody>
{% for coupon in coupon_list %}
<tr class="sale-row">
<td class="text-center">{{ coupon.code }}</td>
<td class="text-center">{{ coupon.discount_type }}</td>
<td class="text-center">{{ coupon.discount_value }}</td>
<td class="text-center">{{ coupon.valid_start | api_get_local_time }}</td>
<td class="text-center">{{ coupon.valid_end | api_get_local_time }}</td>
<td class="text-center">{{ coupon.delivered }}</td>
<td class="text-center">
<div class="btn-group btn-group-xs" role="group" aria-label="...">
<a title="{{ 'ConfigureCoupon'|get_plugin_lang('BuyCoursesPlugin') }}" href="{{ _p.web_plugin ~ 'buycourses/src/configure_coupon.php?' ~ {'id': coupon.id}|url_encode() }}"
class="btn btn-default">
<em class="fa fa-wrench fa-fw"></em>
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>

@ -20,7 +20,9 @@
{% endif %}
<div class="row">
<div class="col-md-3">
<div class="col-md-1">
</div>
<div class="col-md-2">
<div class="thumbnail">
<a href="src/course_catalog.php">
<img src="resources/img/128/buycourses.png">
@ -35,7 +37,7 @@
</div>
{% if _u.is_admin %}
<div class="col-md-3">
<div class="col-md-2">
<div class="thumbnail">
<a href="src/list.php">
<img src="resources/img/128/settings.png">
@ -48,7 +50,20 @@
</div>
</div>
</div>
<div class="col-md-3">
<div class="col-md-2">
<div class="thumbnail">
<a href="src/coupons.php">
<img src="resources/img/128/discount.png">
</a>
<div class="caption">
<p class="text-center">
<a class="btn btn-default btn-sm"
href="src/coupons.php">{{ 'CouponsConfiguration'|get_plugin_lang('BuyCoursesPlugin') }}</a>
</p>
</div>
</div>
</div>
<div class="col-md-2">
<div class="thumbnail">
<a href="src/paymentsetup.php">
<img src="resources/img/128/paymentsettings.png">
@ -61,7 +76,7 @@
</div>
</div>
</div>
<div class="col-md-3">
<div class="col-md-2">
<div class="thumbnail">
<a href="src/sales_report.php">
<img src="resources/img/128/backlogs.png">
@ -74,5 +89,7 @@
</div>
</div>
</div>
<div class="col-md-1">
</div>
{% endif %}
</div>

@ -154,11 +154,11 @@
</div>
{% endif %}
{% if services_are_included %}
<a href="{{ _p.web_plugin ~ 'buycourses/src/services_add.php' }}" class="btn btn-primary">
<em class="fa fa-cart-plus fa-fw"></em> {{ 'NewService'| get_plugin_lang('BuyCoursesPlugin') }}
</a>
<div role="tabpanel" class="tab-pane {{ services ? 'fade in active' : '' }} " id="services">
<div class="table-responsive">
<a href="{{ _p.web_plugin ~ 'buycourses/src/services_add.php' }}" class="btn btn-primary">
<em class="fa fa-cart-plus fa-fw"></em> {{ 'NewService'| get_plugin_lang('BuyCoursesPlugin') }}
</a>
</br>
</br>
<table id="services_table" class="table">

@ -0,0 +1,49 @@
<br />
<br />
{{ form }}
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr class="sale-columns">
<th>{{ 'CouponCode'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDiscountType'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDiscount'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDateStart'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDateEnd'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th>{{ 'CouponDelivered'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th width="10%">{{ 'Options'|get_lang }}</th>
</tr>
</thead>
<tbody>
{% for coupon in coupon_list %}
<tr class="sale-row">
<td class="text-center">{{ coupon.code }}</td>
<td class="text-center">{{ coupon.discount_type }}</td>
<td class="text-center">{{ coupon.discount_value }}</td>
<td class="text-center">{{ coupon.valid_start | api_get_local_time }}</td>
<td class="text-center">{{ coupon.valid_end | api_get_local_time }}</td>
<td class="text-center">{{ coupon.delivered }}</td>
<td class="text-center">
{% if coupon.active == coupon_status_active %}
<div class="btn-group btn-group-xs" role="group" aria-label="...">
<a title="{{ 'CouponDisable'|get_plugin_lang('BuyCoursesPlugin') }}" href="{{ _p.web_self ~ '?' ~ {'coupon': coupon.id, 'action': 'deactivate'}|url_encode() }}"
class="btn btn-default">
<img src="{{ 'user_subscribe_session.png' | icon(22) }}" width="22" height="22 alt="{{ 'CouponDisable'|get_plugin_lang('BuyCoursesPlugin') }}">
</a>
</div>
{% endif %}
{% if coupon.active == coupon_status_disable %}
<div class="btn-group btn-group-xs" role="group" aria-label="...">
<a title="{{ 'CouponEnable'|get_plugin_lang('BuyCoursesPlugin') }}" href="{{ _p.web_self ~ '?' ~ {'coupon': coupon.id, 'action': 'activate'}|url_encode() }}"
class="btn btn-default">
<img src="{{ 'user_subscribe_session.png' | icon(22) }}" width="22" height="22 alt="{{ 'CouponEnable'|get_plugin_lang('BuyCoursesPlugin') }}">
</a>
</div>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>

@ -41,6 +41,18 @@
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin') }} :
{{ course.item.total_price_formatted }}
</div>
{% if course.item.has_coupon %}
<div class="price-details-tax">
{{ 'DiscountAmount'|get_plugin_lang('BuyCoursesPlugin') }}:
{{ course.item.discount_amount_formatted }}
</div>
{% endif %}
<div class="coupon-question">
{{ 'DoYouHaveACoupon'|get_plugin_lang('BuyCoursesPlugin') }}
</div>
<div class="coupon">
{{ form_coupon }}
</div>
</div>
<div class="col-md-9">
<div class="buy-item">
@ -89,6 +101,18 @@
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin') }} :
{{ session.item.total_price_formatted }}
</div>
{% if session.item.has_coupon %}
<div class="price-details-tax">
{{ 'DiscountAmount'|get_plugin_lang('BuyCoursesPlugin') }}:
{{ session.item.discount_amount_formatted }}
</div>
{% endif %}
<div class="coupon-question">
{{ 'DoYouHaveACoupon'|get_plugin_lang('BuyCoursesPlugin') }}
</div>
<div class="coupon">
{{ form_coupon }}
</div>
</div>
<div class="col-md-9">
<div class="buy-item">

@ -31,11 +31,35 @@
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ service.total_price_formatted }}
</div>
{% if service.has_coupon %}
<div class="price-details-tax">
{{ 'DiscountAmount'|get_plugin_lang('BuyCoursesPlugin') }}:
{{ service.discount_amount_formatted }}
</div>
{% endif %}
<div class="coupon-question">
{{ 'DoYouHaveACoupon'|get_plugin_lang('BuyCoursesPlugin') }}
</div>
<div class="coupon">
{{ form_coupon }}
</div>
{% else %}
<div class="price">
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ service.total_price_formatted }}
</div>
{% if service.has_coupon %}
<div class="price-details-tax">
{{ 'DiscountAmount'|get_plugin_lang('BuyCoursesPlugin') }}:
{{ service.discount_amount_formatted }}
</div>
{% endif %}
<div class="coupon-question">
{{ 'DoYouHaveACoupon'|get_plugin_lang('BuyCoursesPlugin') }}
</div>
<div class="coupon">
{{ form_coupon }}
</div>
{% endif %}
</div>

@ -25,6 +25,8 @@
<th class="text-center">{{ 'OrderStatus'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-center">{{ 'OrderDate'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'Price'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'CouponDiscount'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'Coupon'|get_plugin_lang('BuyCoursesPlugin') }}</th>
{% if invoicing_enable %}
<th class="text-right">{{ 'Invoice'|get_plugin_lang('BuyCoursesPlugin') }}</th>
{% endif %}
@ -47,6 +49,8 @@
</td>
<td class="text-center">{{ sale.buy_date | api_get_local_time}}</td>
<td class="text-right">{{ sale.service.total_price }}</td>
<td class="text-right">{{ sale.total_discount }}</td>
<td class="text-right">{{ sale.coupon_code }}</td>
{% if invoicing_enable %}
<td class="text-center">
{% if sale.invoice == 1 %}

Loading…
Cancel
Save