Add tax section

pull/2798/head
Nosolored 7 years ago
parent 985510b2c9
commit c48d7e7f7d
  1. 3
      main/inc/lib/CoursesAndSessionsCatalog.class.php
  2. 39
      plugin/buycourses/database.php
  3. 2
      plugin/buycourses/lang/english.php
  4. 16
      plugin/buycourses/lang/spanish.php
  5. 9
      plugin/buycourses/resources/css/style.css
  6. 293
      plugin/buycourses/src/buy_course_plugin.class.php
  7. 9
      plugin/buycourses/src/configuration.php
  8. 17
      plugin/buycourses/src/configure_course.php
  9. 55
      plugin/buycourses/src/paymentsetup.php
  10. 14
      plugin/buycourses/src/service_sales_report.php
  11. 9
      plugin/buycourses/src/services_add.php
  12. 8
      plugin/buycourses/src/services_edit.php
  13. 14
      plugin/buycourses/update.php
  14. 40
      plugin/buycourses/view/configuration.tpl
  15. 18
      plugin/buycourses/view/process.tpl
  16. 10
      plugin/buycourses/view/service_information.tpl
  17. 21
      plugin/buycourses/view/service_process.tpl

@ -477,7 +477,7 @@ class CoursesAndSessionsCatalog
{
$em = Database::getManager();
$urlId = api_get_current_access_url_id();
$date = Database::escape_string($date);
$sql = "SELECT s.id FROM session s ";
$sql .= "
INNER JOIN access_url_rel_session ars
@ -490,6 +490,7 @@ class CoursesAndSessionsCatalog
";
if (!is_null($date)) {
$date = Database::escape_string($date);
$sql .= "
AND (
('$date' BETWEEN DATE(s.access_start_date) AND DATE(s.access_end_date))

@ -90,6 +90,11 @@ $itemTable->addColumn(
\Doctrine\DBAL\Types\Type::INTEGER,
['unsigned' => true]
);
$itemTable->addColumn(
'tax_perc',
\Doctrine\DBAL\Types\Type::INTEGER,
['unsigned' => true, 'notnull' => false]
);
$itemTable->setPrimaryKey(['id']);
$itemTable->addForeignKeyConstraint(
$currencyTable,
@ -195,6 +200,21 @@ $saleTable->addColumn(
\Doctrine\DBAL\Types\Type::DECIMAL,
['scale' => 2]
);
$saleTable->addColumn(
'price_without_tax',
\Doctrine\DBAL\Types\Type::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$saleTable->addColumn(
'tax_perc',
\Doctrine\DBAL\Types\Type::INTEGER,
['unsigned' => true, 'notnull' => false]
);
$saleTable->addColumn(
'tax_amount',
\Doctrine\DBAL\Types\Type::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$saleTable->addColumn(
'currency_id',
\Doctrine\DBAL\Types\Type::INTEGER,
@ -250,6 +270,21 @@ $servicesNodeTable->addColumn(
\Doctrine\DBAL\Types\Type::DECIMAL,
['scale' => 2]
);
$servicesNodeTable->addColumn(
'price_without_tax',
\Doctrine\DBAL\Types\Type::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$servicesNodeTable->addColumn(
'tax_perc',
\Doctrine\DBAL\Types\Type::INTEGER,
['unsigned' => true, 'notnull' => false]
);
$servicesNodeTable->addColumn(
'tax_amount',
\Doctrine\DBAL\Types\Type::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$servicesNodeTable->addColumn('node_type', \Doctrine\DBAL\Types\Type::INTEGER);
$servicesNodeTable->addColumn('node_id', \Doctrine\DBAL\Types\Type::INTEGER);
$servicesNodeTable->addColumn('buyer_id', \Doctrine\DBAL\Types\Type::INTEGER);
@ -291,6 +326,10 @@ $globalTable->addColumn(
['autoincrement' => true, 'unsigned' => true]
);
$globalTable->addColumn('terms_and_conditions', \Doctrine\DBAL\Types\Type::TEXT);
$globalTable->addColumn('global_tax_perc', \Doctrine\DBAL\Types\Type::INTEGER);
$globalTable->addColumn('tax_applies_to', \Doctrine\DBAL\Types\Type::INTEGER);
$globalTable->addColumn('tax_name', \Doctrine\DBAL\Types\Type::STRING);
$globalTable->setPrimaryKey(['id']);
$queries = $pluginSchema->toSql($platform);

@ -9,6 +9,8 @@ $strings['paypal_enable'] = "Enable PayPal";
$strings['commissions_enable'] = "Enable Commissions";
$strings['transfer_enable'] = "Enable bank transfer";
$strings['unregistered_users_enable'] = "Allow anonymous users";
$strings['invoicing_enable'] = "Enable Invoicing";
$strings['tax_enable'] = "Enable Taxation";
$strings['Free'] = "FREE";
$strings['PaypalPayoutCommissions'] = "Paypal Payout Commissions";
$strings['MyPayouts'] = "My payments";

@ -9,8 +9,9 @@ $strings['paypal_enable'] = "Habilitar PayPal";
$strings['commissions_enable'] = "Habilitar Comisiones";
$strings['transfer_enable'] = "Habilitar transferencia";
$strings['unregistered_users_enable'] = "Permitir usuarios sin registro en la plataforma";
$strings['invoicing_enable'] = "Habilitar Facturación";
$strings['tax_enable'] = "Habilitar Impuestos";
$strings['Free'] = "GRATIS";
$strings['PaypalPayoutCommissions'] = "Pagar comisiones por Paypal";
$strings['MyPayouts'] = "Mis Pagos";
$strings['Commission'] = "Comisión";
@ -173,3 +174,16 @@ $strings['DeleteThisService'] = 'Eliminar este servicio';
$strings['YourCoursesNeedAtLeastOneLearningPath'] = 'Los cursos en los que estás registrado necesitan tener al menos una lección que contenga un item de cerficado final';
$strings['NoPaymentOptionAvailable'] = 'No existen opciones de pago. Por favor reporte este problema al administrador.';
$strings['XIsOnlyPaymentMethodAvailable'] = '%s es el único método de pago disponible para esta compra.';
$strings['GlobalTaxPerc'] = "Porcentaje del impuesto global";
$strings['GlobalTaxPercDescription'] = "Porcentaje por defecto que se usará, excepto si existe un impuesto específico en el curso, sesión o servicio.";
$strings['TaxPerc'] = "Porcentaje del impuesto";
$strings['TaxPercDescription'] = "Si se deja vacío se usará valor global por defecto.";
$strings['ByDefault'] = "por defecto (valor global)";
$strings['OnlyCourses'] = "Solo Cursos";
$strings['OnlySessions'] = "Solo Sesiones";
$strings['OnlyServices'] = "Solo Servicios";
$strings['TaxAppliesTo'] = "Impuestos aplicados a";
$strings['AllCoursesSessionsAndServices'] = "Todos (Cursos, sesiones y servicios)";
$strings['TaxNameCustom'] = "Nombre del impuesto";
$strings['TaxNameExamples'] = "VAT, IVA, IGV, TVA, IV ...";
$strings['ErrorUpdateFieldDB'] = "Error al actualizar los campos de la base de datos";

@ -41,6 +41,15 @@
letter-spacing: -0.020em;
}
.buy-info .price-details-tax, .service-buy .price-details-tax {
font-size: 18px;
line-height: 24px;
font-weight: bold;
padding-bottom: 0px;
padding-top: 10px;
letter-spacing: -0.020em;
}
.buy-info .buy-item .title {
margin-top: 5px;
font-weight: bold;

@ -51,6 +51,10 @@ class BuyCoursesPlugin extends Plugin
const SERVICE_TYPE_LP_FINAL_ITEM = 4;
const CULQI_INTEGRATION_TYPE = 'INTEG';
const CULQI_PRODUCTION_TYPE = 'PRODUC';
const TAX_APPLIES_TO_ALL = 1;
const TAX_APPLIES_TO_ONLY_COURSE = 2;
const TAX_APPLIES_TO_ONLY_SESSION = 3;
const TAX_APPLIES_TO_ONLY_SERVICES = 4;
public $isAdminPlugin = true;
@ -81,6 +85,8 @@ class BuyCoursesPlugin extends Plugin
'commissions_enable' => 'boolean',
'unregistered_users_enable' => 'boolean',
'hide_free_text' => 'boolean',
'invoicing_enable' => 'boolean',
'tax_enable' => 'boolean',
]
);
}
@ -163,6 +169,81 @@ class BuyCoursesPlugin extends Plugin
}
$this->manageTab(false);
}
public function update()
{
$table = self::TABLE_GLOBAL_CONFIG;
$sql = "SHOW COLUMNS FROM $table WHERE Field = 'global_tax_perc'";
$res = Database::query($sql);
if (Database::num_rows($res) === 0) {
$sql = "ALTER TABLE $table ADD (
global_tax_perc int(11) unsigned NOT NULL,
tax_applies_to int(11) unsigned NOT NULL,
tax_name varchar(255) NOT NULL
)";
$res = Database::query($sql);
if (!$res) {
echo Display::return_message($this->get_lang('ErrorUpdateFieldDB'), 'warning');
}
}
$table = self::TABLE_ITEM;
$sql = "SHOW COLUMNS FROM $table WHERE Field = 'tax_perc'";
$res = Database::query($sql);
if (Database::num_rows($res) === 0) {
$sql = "ALTER TABLE $table ADD tax_perc int(11) unsigned NULL";
$res = Database::query($sql);
if (!$res) {
echo Display::return_message($this->get_lang('ErrorUpdateFieldDB'), 'warning');
}
}
$table = self::TABLE_SERVICES;
$sql = "SHOW COLUMNS FROM $table WHERE Field = 'tax_perc'";
$res = Database::query($sql);
if (Database::num_rows($res) === 0) {
$sql = "ALTER TABLE $table ADD tax_perc int(11) unsigned NULL";
$res = Database::query($sql);
if (!$res) {
echo Display::return_message($this->get_lang('ErrorUpdateFieldDB'), 'warning');
}
}
$table = self::TABLE_SALE;
$sql = "SHOW COLUMNS FROM $table WHERE Field = 'tax_perc'";
$res = Database::query($sql);
if (Database::num_rows($res) === 0) {
$sql = "ALTER TABLE $table ADD (
price_without_tax decimal(10,2) NULL,
tax_perc int(11) unsigned NULL,
tax_amount decimal(10,2) NULL
)";
$res = Database::query($sql);
if (!$res) {
echo Display::return_message($this->get_lang('ErrorUpdateFieldDB'), 'warning');
}
}
$table = self::TABLE_SERVICES_SALE;
$sql = "SHOW COLUMNS FROM $table WHERE Field = 'tax_perc'";
$res = Database::query($sql);
if (Database::num_rows($res) === 0) {
$sql = "ALTER TABLE $table ADD (
price_without_tax decimal(10,2) NULL,
tax_perc int(11) unsigned NULL,
tax_amount decimal(10,2) NULL
)";
$res = Database::query($sql);
if (!$res) {
echo Display::return_message($this->get_lang('ErrorUpdateFieldDB'), 'warning');
}
}
}
/**
* This function verify if the plugin is enable and return the price info for a course or session in the new grid
@ -525,12 +606,29 @@ class BuyCoursesPlugin extends Plugin
continue;
}
$price = $item['price'];
$taxPerc = null;
$priceWithoutTax = $item['price'];
$taxEnable = $this->get('tax_enable') === 'true';
$globalParameters = $this->getGlobalParameters();
$taxAppliesTo = $globalParameters['tax_applies_to'];
if ($taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_COURSE)
) {
$globalTaxPerc = $globalParameters['global_tax_perc'];
$precision = 2;
$taxPerc = is_null($item['tax_perc']) ? $globalTaxPerc : $item['tax_perc'];
$taxAmount = round($priceWithoutTax * $taxPerc / 100, $precision);
$price = $priceWithoutTax + $taxAmount;
}
$courseItem = [
'id' => $course->getId(),
'title' => $course->getTitle(),
'code' => $course->getCode(),
'course_img' => null,
'price' => $item['price'],
'price' => $price,
'currency' => $item['iso_code'],
'teachers' => [],
'enrolled' => $this->getUserStatusForCourse(api_get_user_id(), $course),
@ -592,6 +690,24 @@ class BuyCoursesPlugin extends Plugin
]
);
$price = $item['price'];
$taxPerc = null;
$priceWithoutTax = $item['price'];
$precision = 2;
$taxEnable = $this->get('tax_enable') === 'true';
$globalParameters = $this->getGlobalParameters();
$taxAppliesTo = $globalParameters['tax_applies_to'];
if ($taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_COURSE)
) {
$globalTaxPerc = $globalParameters['global_tax_perc'];
$precision = 2;
$taxPerc = is_null($item['tax_perc']) ? $globalTaxPerc : $item['tax_perc'];
$taxAmount = round($priceWithoutTax * $taxPerc / 100, $precision);
$price = $priceWithoutTax + $taxAmount;
}
$courseInfo = [
'id' => $course->getId(),
'title' => $course->getTitle(),
@ -599,7 +715,13 @@ class BuyCoursesPlugin extends Plugin
'code' => $course->getCode(),
'visual_code' => $course->getVisualCode(),
'teachers' => [],
'price' => $item['price'],
'price' => number_format($price, $precision),
'price_without_tax' => number_format($priceWithoutTax, $precision),
'tax_amount' => number_format($taxAmount, $precision),
'tax_perc' => $taxPerc,
'tax_name' => $globalParameters['tax_name'],
'tax_enable' => $taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_COURSE),
'currency' => $item['iso_code'],
'course_img' => null,
];
@ -658,13 +780,36 @@ class BuyCoursesPlugin extends Plugin
'coach_access_end_date' => $session->getCoachAccessEndDate(),
]);
$price = $item['price'];
$taxPerc = null;
$priceWithoutTax = $item['price'];
$precision = 2;
$taxEnable = $this->get('tax_enable') === 'true';
$globalParameters = $this->getGlobalParameters();
$taxAppliesTo = $globalParameters['tax_applies_to'];
if ($taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_SESSION)
) {
$globalTaxPerc = $globalParameters['global_tax_perc'];
$taxPerc = is_null($item['tax_perc']) ? $globalTaxPerc : $item['tax_perc'];
$taxAmount = round($priceWithoutTax * $taxPerc / 100, $precision);
$price = $priceWithoutTax + $taxAmount;
}
$sessionInfo = [
'id' => $session->getId(),
'name' => $session->getName(),
'description' => $session->getDescription(),
'dates' => $sessionDates,
'courses' => [],
'price' => $item['price'],
'price' => number_format($price, $precision),
'price_without_tax' => number_format($priceWithoutTax, $precision),
'tax_amount' => number_format($taxAmount, $precision),
'tax_perc' => $taxPerc,
'tax_name' => $globalParameters['tax_name'],
'tax_enable' => $taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_SESSION),
'currency' => $item['iso_code'],
'image' => null,
'nbrCourses' => $session->getNbrCourses(),
@ -771,6 +916,26 @@ class BuyCoursesPlugin extends Plugin
$productName = $session->getName();
}
$price = $item['price'];
$priceWithoutTax = null;
$taxPerc = null;
$taxEnable = $this->get('tax_enable') === 'true';
$globalParameters = $this->getGlobalParameters();
$taxAppliesTo = $globalParameters['tax_applies_to'];
if ($taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL ||
($taxAppliesTo == TAX_APPLIES_TO_ONLY_COURSE && $item['product_type'] == self::PRODUCT_TYPE_COURSE) ||
($taxAppliesTo == TAX_APPLIES_TO_ONLY_SESSION && $item['product_type'] == self::PRODUCT_TYPE_SESSION))
) {
$priceWithoutTax = $item['price'];
$globalTaxPerc = $globalParameters['global_tax_perc'];
$precision = 2;
$taxPerc = is_null($item['tax_perc']) ? $globalTaxPerc : $item['tax_perc'];
$taxAmount = round($priceWithoutTax * $taxPerc / 100, $precision);
$price = $priceWithoutTax + $taxAmount;
}
$values = [
'reference' => $this->generateReference(
api_get_user_id(),
@ -783,7 +948,10 @@ class BuyCoursesPlugin extends Plugin
'product_type' => $item['product_type'],
'product_name' => $productName,
'product_id' => $item['product_id'],
'price' => $item['price'],
'price' => $price,
'price_without_tax' => $priceWithoutTax,
'tax_perc' => $taxPerc,
'tax_amount' => $taxAmount,
'status' => self::SALE_STATUS_PENDING,
'payment_type' => intval($paymentType),
];
@ -926,6 +1094,21 @@ class BuyCoursesPlugin extends Plugin
];
}
/**
* Get Tax's types
*
* @return array
*/
public function getTaxAppliesTo()
{
return [
self::TAX_APPLIES_TO_ALL => $this->get_lang('AllCoursesSessionsAndServices'),
self::TAX_APPLIES_TO_ONLY_COURSE => $this->get_lang('OnlyCourses'),
self::TAX_APPLIES_TO_ONLY_SESSION => $this->get_lang('OnlySessions'),
self::TAX_APPLIES_TO_ONLY_SERVICES=> $this->get_lang('OnlyServices'),
];
}
/**
* Get a list of sales by the status.
*
@ -1155,6 +1338,7 @@ class BuyCoursesPlugin extends Plugin
'visible' => false,
'currency' => empty($defaultCurrency) ? null : $defaultCurrency['iso_code'],
'price' => 0.00,
'tax_perc' => null,
];
$item = $this->getItemByProduct($course->getId(), self::PRODUCT_TYPE_COURSE);
@ -1164,6 +1348,7 @@ class BuyCoursesPlugin extends Plugin
$courseItem['visible'] = true;
$courseItem['currency'] = $item['iso_code'];
$courseItem['price'] = $item['price'];
$courseItem['tax_perc'] = $item['tax_perc'];
}
return $courseItem;
@ -1197,6 +1382,7 @@ class BuyCoursesPlugin extends Plugin
'visible' => false,
'currency' => empty($defaultCurrency) ? null : $defaultCurrency['iso_code'],
'price' => 0.00,
'tax_perc' => null,
];
$displayStartDate = $session->getDisplayStartDate();
@ -1233,6 +1419,7 @@ class BuyCoursesPlugin extends Plugin
$sessionItem['visible'] = true;
$sessionItem['currency'] = $item['iso_code'];
$sessionItem['price'] = $item['price'];
$sessionItem['tax_perc'] = $item['tax_perc'];
}
return $sessionItem;
@ -1604,6 +1791,7 @@ class BuyCoursesPlugin extends Plugin
'name' => Security::remove_XSS($service['name']),
'description' => Security::remove_XSS($service['description']),
'price' => $service['price'],
'tax_perc' => $service['tax_perc'] != '' ? (int) $service['tax_perc'] : null,
'duration_days' => intval($service['duration_days']),
'applies_to' => intval($service['applies_to']),
'owner_id' => intval($service['owner_id']),
@ -1658,15 +1846,16 @@ class BuyCoursesPlugin extends Plugin
'name' => Security::remove_XSS($service['name']),
'description' => Security::remove_XSS($service['description']),
'price' => $service['price'],
'duration_days' => intval($service['duration_days']),
'applies_to' => intval($service['applies_to']),
'owner_id' => intval($service['owner_id']),
'visibility' => intval($service['visibility']),
'tax_perc' => $service['tax_perc'] != '' ? (int) $service['tax_perc'] : null,
'duration_days' => (int) $service['duration_days'],
'applies_to' => (int) $service['applies_to'],
'owner_id' => (int) $service['owner_id'],
'visibility' => (int) $service['visibility'],
'image' => 'simg-'.$id.'.png',
'video_url' => $service['video_url'],
'service_information' => $service['service_information'],
],
['id = ?' => intval($id)]
['id = ?' => (int) $id]
);
}
@ -1723,10 +1912,36 @@ class BuyCoursesPlugin extends Plugin
$services = [];
if ($id) {
$price = $return['price'];
$taxPerc = null;
$priceWithoutTax = $priceWithTax = $return['price'];
$precision = 2;
$taxEnable = $this->get('tax_enable') === 'true';
$globalParameters = $this->getGlobalParameters();
$taxAppliesTo = $globalParameters['tax_applies_to'];
if ($taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_SERVICES)
) {
$globalTaxPerc = $globalParameters['global_tax_perc'];
$precision = 2;
$taxPerc = is_null($return['tax_perc']) ? $globalTaxPerc : $return['tax_perc'];
$taxAmount = round($priceWithoutTax * $taxPerc / 100, $precision);
$priceWithTax = $priceWithoutTax + $taxAmount;
}
$services['id'] = $return['id'];
$services['name'] = $return['name'];
$services['description'] = $return['description'];
$services['price'] = $return['price'];
$services['price'] = $price;
$services['tax_perc'] = $return['tax_perc'];
$services['price_with_tax'] = number_format($priceWithTax, $precision);
$services['price_without_tax'] = number_format($priceWithoutTax, $precision);
$services['tax_amount'] = number_format($taxAmount, $precision);
$services['tax_perc_show'] = $taxPerc;
$services['tax_name'] = $globalParameters['tax_name'];
$services['tax_enable'] = $taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_SERVICES);
$services['currency'] = $return['currency'];
$services['duration_days'] = $return['duration_days'];
$services['applies_to'] = $return['applies_to'];
@ -1747,6 +1962,7 @@ class BuyCoursesPlugin extends Plugin
$services[$index]['name'] = $service['name'];
$services[$index]['description'] = $service['description'];
$services[$index]['price'] = $service['price'];
$services[$index]['tax_perc'] = $service['tax_perc'];
$services[$index]['currency'] = $service['currency'];
$services[$index]['duration_days'] = $service['duration_days'];
$services[$index]['applies_to'] = $service['applies_to'];
@ -2022,10 +2238,27 @@ class BuyCoursesPlugin extends Plugin
$services = [];
foreach ($return as $index => $service) {
$price = $service['price'];
$taxPerc = null;
$priceWithoutTax = $service['price'];
$taxEnable = $this->get('tax_enable') === 'true';
$globalParameters = $this->getGlobalParameters();
$taxAppliesTo = $globalParameters['tax_applies_to'];
if ($taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == self::TAX_APPLIES_TO_ONLY_SERVICES)
) {
$globalTaxPerc = $globalParameters['global_tax_perc'];
$precision = 2;
$taxPerc = is_null($service['tax_perc']) ? $globalTaxPerc : $service['tax_perc'];
$taxAmount = round($priceWithoutTax * $taxPerc / 100, $precision);
$price = $priceWithoutTax + $taxAmount;
}
$services[$index]['id'] = $service['id'];
$services[$index]['name'] = $service['name'];
$services[$index]['description'] = $service['description'];
$services[$index]['price'] = $service['price'];
$services[$index]['price'] = number_format($price, $precision);
$services[$index]['currency'] = $service['currency'];
$services[$index]['duration_days'] = $service['duration_days'];
$services[$index]['applies_to'] = $service['applies_to'];
@ -2070,7 +2303,24 @@ class BuyCoursesPlugin extends Plugin
}
$currency = $this->getSelectedCurrency();
$price = $service['price'];
$priceWithoutTax = null;
$taxPerc = null;
$taxEnable = $this->get('tax_enable') === 'true';
$globalParameters = $this->getGlobalParameters();
$taxAppliesTo = $globalParameters['tax_applies_to'];
if ($taxEnable &&
($taxAppliesTo == self::TAX_APPLIES_TO_ALL || $taxAppliesTo == TAX_APPLIES_TO_ONLY_SERVICES)
) {
$priceWithoutTax = $service['price'];
$globalTaxPerc = $globalParameters['global_tax_perc'];
$precision = 2;
$taxPerc = is_null($service['tax_perc']) ? $globalTaxPerc : $service['tax_perc'];
$taxAmount = round($priceWithoutTax * $taxPerc / 100, $precision);
$price = $priceWithoutTax + $taxAmount;
}
$values = [
'service_id' => $serviceId,
'reference' => $this->generateReference(
@ -2079,7 +2329,10 @@ class BuyCoursesPlugin extends Plugin
$infoSelect
),
'currency_id' => $currency['id'],
'price' => $service['price'],
'price' => $price,
'price_without_tax' => $priceWithoutTax,
'tax_perc' => $taxPerc,
'tax_amount' => $taxAmount,
'node_type' => $service['applies_to'],
'node_id' => intval($infoSelect),
'buyer_id' => $userId,
@ -2145,11 +2398,19 @@ class BuyCoursesPlugin extends Plugin
*/
public function saveGlobalParameters($params)
{
$sqlParams = [
'terms_and_conditions' => $params['terms_and_conditions'],
];
if ($this->get('tax_enable') === 'true') {
$sqlParams['global_tax_perc'] = $params['global_tax_perc'];
$sqlParams['tax_applies_to'] = $params['tax_applies_to'];
$sqlParams['tax_name'] = $params['tax_name'];
}
return Database::update(
Database::get_main_table(self::TABLE_GLOBAL_CONFIG),
[
'terms_and_conditions' => $params['terms_and_conditions'],
],
$sqlParams,
['id = ?' => 1]
);
}

@ -12,6 +12,7 @@ require_once __DIR__.'/../../../main/inc/global.inc.php';
$plugin = BuyCoursesPlugin::create();
$includeSession = $plugin->get('include_sessions') === 'true';
$includeServices = $plugin->get('include_services') === 'true';
$taxEnable = $plugin->get('tax_enable') === 'true';
api_protect_admin_script(true);
@ -39,6 +40,7 @@ $tpl->assign('product_type_session', BuyCoursesPlugin::PRODUCT_TYPE_SESSION);
$tpl->assign('courses', $courses);
$tpl->assign('sessions_are_included', $includeSession);
$tpl->assign('services_are_included', $includeServices);
$tpl->assign('tax_enable', $taxEnable);
if ($includeSession) {
$sessions = $plugin->getSessionsForConfiguration();
@ -50,6 +52,13 @@ if ($includeServices) {
$tpl->assign('services', $services);
}
if ($taxEnable) {
$globalParameters = $plugin->getGlobalParameters();
$tpl->assign('global_tax_perc', $globalParameters['global_tax_perc']);
$tpl->assign('tax_applies_to', $globalParameters['tax_applies_to']);
$tpl->assign('tax_name', $globalParameters['tax_name']);
}
$content = $tpl->fetch('buycourses/view/configuration.tpl');
$tpl->assign('header', $templateName);

@ -88,6 +88,7 @@ if ($editingCourse) {
'name' => $courseItem['course_title'],
'visible' => $courseItem['visible'],
'price' => $courseItem['price'],
'tax_perc' => $courseItem['tax_perc'],
'beneficiaries' => $defaultBeneficiaries,
($commissionsEnable == "true") ? 'commissions' : '' => ($commissionsEnable == "true") ? $commissions : '',
];
@ -154,6 +155,7 @@ if ($editingCourse) {
'name' => $sessionItem['session_name'],
'visible' => $sessionItem['visible'],
'price' => $sessionItem['price'],
'tax_perc' => $sessionItem['tax_perc'],
'beneficiaries' => $defaultBeneficiaries,
($commissionsEnable == "true") ? 'commissions' : '' => ($commissionsEnable == "true") ? $commissions : '',
];
@ -190,6 +192,8 @@ if ($commissionsEnable === 'true') {
";
}
$globalSettingsParams = $plugin->getGlobalParameters();
$form = new FormValidator('beneficiaries');
$form->addText('product_type', $plugin->get_lang('ProductType'), false);
$form->addText('name', get_lang('Name'), false);
@ -204,6 +208,12 @@ $form->addElement(
[$plugin->get_lang('Price'), null, $currencyIso],
['step' => 0.01]
);
$form->addElement(
'number',
'tax_perc',
[$plugin->get_lang('TaxPerc'), $plugin->get_lang('TaxPercDescription'), '%'],
['step' => 1, 'placeholder' => $globalSettingsParams['global_tax_perc'].'% '.$plugin->get_lang('ByDefault')]
);
$beneficiariesSelect = $form->addSelect(
'beneficiaries',
$plugin->get_lang('Beneficiaries'),
@ -252,9 +262,13 @@ if ($form->validate()) {
$productItem = $plugin->getItemByProduct($formValues['i'], $formValues['t']);
if (isset($formValues['visible'])) {
$taxPerc = $formValues['tax_perc'] != '' ? (int) $formValues['tax_perc'] : null;
if (!empty($productItem)) {
$plugin->updateItem(
['price' => floatval($formValues['price'])],
[
'price' => floatval($formValues['price']),
'tax_perc' => $taxPerc,
],
$formValues['i'],
$formValues['t']
);
@ -264,6 +278,7 @@ if ($form->validate()) {
'product_type' => $formValues['t'],
'product_id' => intval($formValues['i']),
'price' => floatval($_POST['price']),
'tax_perc' => $taxPerc,
]);
$productItem['id'] = $itemId;
}

@ -32,14 +32,14 @@ if (isset($_GET['action'], $_GET['id'])) {
}
}
$currencyForm = new FormValidator('currency');
$globalSettingForm = new FormValidator('currency');
if ($currencyForm->validate()) {
$currencyFormValues = $currencyForm->getSubmitValues();
if ($globalSettingForm->validate()) {
$globalSettingFormValues = $globalSettingForm->getSubmitValues();
$plugin->selectCurrency($currencyFormValues['currency']);
unset($currencyFormValues['currency']);
$plugin->saveGlobalParameters($currencyFormValues);
$plugin->selectCurrency($globalSettingFormValues['currency']);
unset($globalSettingFormValues['currency']);
$plugin->saveGlobalParameters($globalSettingFormValues);
Display::addFlash(
Display::return_message(get_lang('Saved'), 'success')
@ -51,7 +51,7 @@ if ($currencyForm->validate()) {
$currencies = $plugin->getCurrencies();
$currencySelect = $currencyForm->addSelect(
$currencySelect = $globalSettingForm->addSelect(
'currency',
[
$plugin->get_lang('CurrencyType'),
@ -77,14 +77,47 @@ foreach ($currencies as $currency) {
}
}
$currencyForm->addTextarea(
$taxEnable = $plugin->get('tax_enable') === 'true';
if ($taxEnable) {
$globalSettingForm->addElement(
'number',
'global_tax_perc',
[$plugin->get_lang('GlobalTaxPerc'), $plugin->get_lang('GlobalTaxPercDescription'), '%'],
['step' => 1]
);
$taxAppliesTo = $plugin->getTaxAppliesTo();
$taxTypeSelect = $globalSettingForm->addSelect(
'tax_applies_to',
$plugin->get_lang('TaxAppliesTo'),
[get_lang('Select')]
);
foreach ($taxAppliesTo as $key => $value) {
$optionText = $value;
$optionyValue = $key;
$taxTypeSelect->addOption($optionText, $optionyValue);
}
$globalSettingForm->addElement(
'text',
'tax_name',
$plugin->get_lang('TaxNameCustom'),
['placeholder' => $plugin->get_lang('TaxNameExamples')]
);
}
$globalSettingForm->addTextarea(
'terms_and_conditions',
[get_lang('TermsAndConditions'),
$plugin->get_lang('WriteHereTheTermsAndConditionsOfYourECommerce'), ],
[]
);
$currencyForm->addButtonSave(get_lang('Save'));
$currencyForm->setDefaults($plugin->getGlobalParameters());
$globalSettingForm->addButtonSave(get_lang('Save'));
$globalSettingForm->setDefaults($plugin->getGlobalParameters());
$termsAndConditionsForm = new FormValidator('termsconditions');
@ -231,7 +264,7 @@ $interbreadcrumb[] = [
$templateName = $plugin->get_lang('PaymentsConfiguration');
$tpl = new Template($templateName);
$tpl->assign('header', $templateName);
$tpl->assign('global_config_form', $currencyForm->returnForm());
$tpl->assign('global_config_form', $globalSettingForm->returnForm());
$tpl->assign('paypal_form', $paypalForm->returnForm());
$tpl->assign('commission_form', $commissionForm->returnForm());
$tpl->assign('transfer_form', $transferForm->returnForm());

@ -21,13 +21,25 @@ $includeServices = $plugin->get('include_services');
$saleStatuses = $plugin->getServiceSaleStatuses();
$paymentTypes = $plugin->getPaymentTypes();
$selectedStatus = isset($_GET['status']) ? $_GET['status'] : BuyCoursesPlugin::SALE_STATUS_PENDING;
$searchTerm = '';
$form = new FormValidator('search', 'get');
if ($form->validate()) {
$selectedStatus = $form->getSubmitValue('status');
$searchTerm = $form->getSubmitValue('user');
if ($selectedStatus === false) {
$selectedStatus = BuyCoursesPlugin::SALE_STATUS_PENDING;
}
}
$form->addSelect('status', $plugin->get_lang('OrderStatus'), $saleStatuses, ['cols-size' => [0, 0, 0]]);
$form->addText('user', get_lang('User'), false, ['cols-size' => [0, 0, 0]]);
$form->addButtonSearch(get_lang('Search'), 'search');
$servicesSales = $plugin->getServiceSale();
$servicesSales = $plugin->getServiceSale(null, null, $selectedStatus);
$serviceSaleList = [];
foreach ($servicesSales as $sale) {

@ -32,8 +32,11 @@ $interbreadcrumb[] = [
'name' => $plugin->get_lang('Configuration'),
];
$globalSettingsParams = $plugin->getGlobalParameters();
$formDefaultValues = [
'price' => 0,
'tax_perc' => $globalSettingsParams['global_tax_perc'],
'duration_days' => 0,
'applies_to' => 0,
'visibility' => true,
@ -48,6 +51,12 @@ $form->addElement(
[$plugin->get_lang('Price'), null, $currency['iso_code']],
['step' => 0.01]
);
$form->addElement(
'number',
'tax_perc',
[$plugin->get_lang('TaxPerc'), $plugin->get_lang('TaxPercDescription'), '%'],
['step' => 1, 'placeholder' => $globalSettingsParams['global_tax_perc'].'% '.$plugin->get_lang('ByDefault')]
);
$form->addElement(
'number',
'duration_days',

@ -37,12 +37,14 @@ $interbreadcrumb[] = [
'name' => $plugin->get_lang('Configuration'),
];
$globalSettingsParams = $plugin->getGlobalParameters();
$service = $plugin->getServices($serviceId);
$formDefaultValues = [
'name' => $service['name'],
'description' => $service['description'],
'price' => $service['price'],
'tax_perc' => $service['tax_perc'],
'duration_days' => $service['duration_days'],
'owner_id' => intval($service['owner_id']),
'applies_to' => intval($service['applies_to']),
@ -63,6 +65,12 @@ $form->addElement(
[$plugin->get_lang('Price'), null, $currency['iso_code']],
['step' => 0.01]
);
$form->addElement(
'number',
'tax_perc',
[$plugin->get_lang('TaxPerc'), $plugin->get_lang('TaxPercDescription'), '%'],
['step' => 1, 'placeholder' => $globalSettingsParams['global_tax_perc'].'% '.$plugin->get_lang('ByDefault')]
);
$form->addElement(
'number',
'duration_days',

@ -0,0 +1,14 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Update the plugin.
*
* @package chamilo.plugin.buycourses
*/
require_once __DIR__.'/config.php';
if (!api_is_platform_admin()) {
die('You must have admin permissions to install plugins');
}
BuyCoursesPlugin::create()->update();

@ -1,13 +1,15 @@
<link rel="stylesheet" type="text/css" href="../resources/css/style.css"/>
{% if sessions_are_included %}
{% if sessions_are_included or services_are_included %}
<ul class="nav nav-tabs buy-courses-tabs" role="tablist">
<li role="presentation" class="active">
<a href="#courses" aria-controls="courses" role="tab" data-toggle="tab">{{ 'Courses'|get_lang }}</a>
</li>
{% if sessions_are_included %}
<li role="presentation">
<a href="#sessions" aria-controls="sessions" role="tab" data-toggle="tab">{{ 'Sessions'|get_lang }}</a>
</li>
{% endif %}
{% if services_are_included %}
<li role="presentation">
<a href="#services" aria-controls="services" role="tab"
@ -27,6 +29,9 @@
<th class="text-center">{{ 'OfficialCode'|get_lang }}</th>
<th class="text-center">{{ 'VisibleInCatalog'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right" width="200">{{ 'Price'|get_plugin_lang('BuyCoursesPlugin') }}</th>
{% if tax_enable and (tax_applies_to == 1 or tax_applies_to == 2) %}
<th class="text-center" width="100">{{ tax_name }}</th>
{% endif %}
<th class="text-right">{{ 'Options'|get_lang }}</th>
</tr>
</thead>
@ -70,6 +75,15 @@
<td width="200" class="text-right">
{{ "#{item.price} #{tem.currency ?: item.currency}" }}
</td>
{% if tax_enable and (tax_applies_to == 1 or tax_applies_to == 2) %}
<td class="text-center">
{% if item.tax_perc is null %}
{{ global_tax_perc }} %
{% else %}
{{ item.tax_perc }} %
{% endif %}
</td>
{% endif %}
<td class="text-right">
<a href="{{ _p.web_plugin ~ 'buycourses/src/configure_course.php?' ~ {'i': item.course_id, 't':product_type_course}|url_encode() }}"
class="btn btn-info btn-sm">
@ -94,6 +108,9 @@
<th class="text-center">{{ 'EndDate'|get_lang }}</th>
<th class="text-center">{{ 'VisibleInCatalog'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'Price'|get_plugin_lang('BuyCoursesPlugin') }}</th>
{% if tax_enable and (tax_applies_to == 1 or tax_applies_to == 3) %}
<th class="text-center" width="100">{{ tax_name }}</th>
{% endif %}
<th class="text-right">{{ 'Options'|get_lang }}</th>
</tr>
</thead>
@ -119,6 +136,15 @@
<td class="text-right" width="200">
{{ "#{item.price} #{tem.currency ?: item.currency}" }}
</td>
{% if tax_enable and (tax_applies_to == 1 or tax_applies_to == 3) %}
<td class="text-center">
{% if item.tax_perc is null %}
{{ global_tax_perc }} %
{% else %}
{{ item.tax_perc }} %
{% endif %}
</td>
{% endif %}
<td class="text-right">
<a href="{{ _p.web_plugin ~ 'buycourses/src/configure_course.php?' ~ {'i': item.session_id, 't': product_type_session}|url_encode() }}"
class="btn btn-info btn-sm">
@ -149,6 +175,9 @@
<th class="text-center">{{ 'VisibleInCatalog'|get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-center">{{ 'Owner'|get_lang }}</th>
<th class="text-right">{{ 'Price'|get_plugin_lang('BuyCoursesPlugin') }}</th>
{% if tax_enable and (tax_applies_to == 1 or tax_applies_to == 4) %}
<th class="text-center" width="100">{{ tax_name }}</th>
{% endif %}
<th class="text-right">{{ 'Options'|get_lang }}</th>
</tr>
</thead>
@ -181,6 +210,15 @@
<td class="text-right" width="200">
{{ "#{item.price} #{tem.currency ?: item.currency}" }}
</td>
{% if tax_enable and (tax_applies_to == 1 or tax_applies_to == 4) %}
<td class="text-center">
{% if item.tax_perc is null %}
{{ global_tax_perc }} %
{% else %}
{{ item.tax_perc }} %
{% endif %}
</td>
{% endif %}
<td class="text-right">
<a href="{{ _p.web_plugin ~ 'buycourses/src/services_edit.php?' ~ {'id': item.id}|url_encode() }}"
class="btn btn-info btn-sm">

@ -20,6 +20,15 @@
<img alt="{{ course.title }}" class="img-rounded img-responsive"
src="{{ course.course_img ? course.course_img : 'session_default.png'|icon() }}">
</a>
{% if course.tax_enable %}
<div class="price-details-tax">
{{ 'Price'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ course.currency == 'BRL' ? 'R$' : course.currency }} {{ course.price_without_tax }}
<br>
{{ course.tax_name }} ({{ course.tax_perc }}%):
{{ course.currency == 'BRL' ? 'R$' : course.currency }} {{ course.tax_amount }}
</div>
{% endif %}
<div class="price">
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ course.currency == 'BRL' ? 'R$' : course.currency }} {{ course.price }}
@ -56,6 +65,15 @@
<div class="col-md-3">
<img alt="{{ session.name }}" class="img-rounded img-responsive""
src="{{ session.image ? session.image : 'session_default.png'|icon() }}">
{% if session.tax_enable %}
<div class="price-details-tax">
{{ 'Price'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ session.currency == 'BRL' ? 'R$' : session.currency }} {{ session.price_without_tax }}
<br>
{{ session.tax_name }} ({{ session.tax_perc }}%):
{{ session.currency == 'BRL' ? 'R$' : session.currency }} {{ session.tax_amount }}
</div>
{% endif %}
<div class="price">
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ session.currency == 'BRL' ? 'R$' : session.currency }} {{ session.price }}

@ -68,14 +68,22 @@
{% endif %}
</p>
<p><em class="fa fa-money"></em> <b>{{ 'Price'|get_plugin_lang('BuyCoursesPlugin') }}</b>
{% if service.tax_enable %}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price_with_tax }}
{% else %}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price }}</p>
{% endif %}
</div>
<div class="service-buy">
<div class="row">
<div class="col-sm-6">
<div class="price">
{{ 'Total'|get_lang }}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price }}
{% if service.tax_enable %}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price_with_tax }}
{% else %}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price }}
{% endif %}
</div>
</div>
<div class="col-sm-6">

@ -19,10 +19,25 @@
<img alt="{{ service.name }}" class="img-rounded img-responsive"
src="{{ service.image ? service.image : 'session_default.png'|icon() }}">
</a>
{% if service.tax_enable %}
<div class="price-details-tax">
{{ 'Price'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price_without_tax }}
<br>
{{ service.tax_name }} ({{ service.tax_perc_show }}%):
{{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.tax_amount }}
</div>
<div class="price">
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price_with_tax }}
</div>
{% else %}
<div class="price">
{{ 'Total'|get_plugin_lang('BuyCoursesPlugin')}} :
{{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price }}
</div>
{% endif %}
</div>
<div class="col-md-9">
<div class="buy-item">
@ -54,7 +69,11 @@
<li>
<em class="fa-li fa fa-money" aria-hidden="true"></em>
{{ 'Price'|get_plugin_lang('BuyCoursesPlugin') }}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price }}
{% if service.tax_enable %}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price_with_tax }}
{% else %}
: {{ service.currency == 'BRL' ? 'R$' : service.currency }} {{ service.price }}
{% endif %}
/ {{ service.duration_days == 0 ? 'NoLimit'|get_lang : service.duration_days ~ ' ' ~ 'Days'|get_lang }}
</li>
<li><em class="fa-li fa fa-user" aria-hidden="true"></em> {{ service.owner_name }}</li>

Loading…
Cancel
Save