New Files to the new payout feature plugin buycourses - Refs #10563

1.10.x
José Loguercio 10 years ago
parent 821a2bae2f
commit 08476b1214
  1. 131
      plugin/buycourses/resources/js/comissions.js
  2. 220
      plugin/buycourses/src/buycourses.ajax.php
  3. 90
      plugin/buycourses/src/payout_report.php
  4. 55
      plugin/buycourses/src/paypal_payout.php
  5. 88
      plugin/buycourses/view/payout_report.tpl
  6. 121
      plugin/buycourses/view/paypal_payout.tpl

@ -0,0 +1,131 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
function showSliders(maxPercentage, type, defaultValues) {
defaultValues = defaultValues || "0";
var sliderCounter = 1;
var percentage = 0;
var minPercentage = 0;
$("#selectBox option:selected").each(function() {
var count = $("#selectBox option:selected").length;
percentage = maxPercentage / count;
percentage = parseInt(percentage);
verifyMaxPercentage = percentage * count;
if (verifyMaxPercentage !== maxPercentage && sliderCounter === 1) {
percentage = percentage + (maxPercentage - verifyMaxPercentage);
}
beneficiaryId = $(this).val();
beneficiaryName = $(this).text();
var slidersValue = defaultValues.toString().split(',');
if (type === 'default') {
percentage = slidersValue[sliderCounter - 1];
percentage = parseInt(percentage);
$("#panelSliders").append("<span>" + beneficiaryName + "</span> - [ <span class='value' >" + percentage + "</span> % ]<div id=" + beneficiaryId + " class='panelSliders'></div>");
} else if (type === 'renew') {
$("#panelSliders").append("<span>" + beneficiaryName + "</span> - [ <span class='value' >" + percentage + "</span> % ]<div id=" + beneficiaryId + " class='panelSliders'></div>");
}
sliderCounter++;
stepSlide = count - 1;
if (stepSlide === 0) {
(type === 'default') ? minPercentage = 0 : minPercentage = 100;
(type === 'default') ? stepSlide = 100 : stepSlide = 1;
}
$( "#panelSliders .panelSliders" ).slider({
value: percentage,
min: minPercentage,
max: maxPercentage,
step: stepSlide,
animate: true,
slide: function( event, ui ) {
$(this).prev(".value").text(ui.value);
var total = 0;
var sliders = $( "#panelSliders .panelSliders" );
sliders.not(this).each(function() {
value = $(this).slider("option", "value");
total += value;
});
total += ui.value;
var delta = 100 - total;
sliders.not(this).each(function() {
var t = $(this);
value = t.slider("option", "value");
var newValue = value + (delta/stepSlide);
if (newValue < 0 || ui.value == 100)
newValue = 0;
if (newValue > 100)
newValue = 100;
t.prev('.value').text(newValue);
t.slider('value', newValue);
});
$("[name=\'comissions\']").val(getSlidersValues());
}
});
});
$("[name=\'comissions\']").val(getSlidersValues());
showCorrectSliderHandler();
};
function getSlidersValues() {
var comissions = "";
$( "#panelSliders .panelSliders" ).each(function() {
comissions += $(this).prev(".value").text() + ',';
});
comissions = comissions.substring(0, comissions.length-1);
return comissions;
}
function showCorrectSliderHandler() {
var correctHandler = [];
$("#panelSliders > span").each(function () {
if ($(this).hasClass('value')) {
correctHandler.push($(this).text());
}
});
var counter = 0;
$("#panelSliders .panelSliders > span").each(function () {
if ($(this).hasClass('ui-slider-handle')) {
$(this).css('left', correctHandler[counter]+'%');
counter++;
}
});
}

@ -0,0 +1,220 @@
<?php
/* For licensing terms, see /chamilo_license.txt */
/**
* Responses to AJAX calls
* @package chamilo.plugin.buycourses
*/
$cidReset = true;
require_once '../../../main/inc/global.inc.php';
api_protect_admin_script(true);
$plugin = BuyCoursesPlugin::create();
$paypalEnable = $plugin->get('paypal_enable');
$comissionsEnable = $plugin->get('comissions_enable');
$action = isset($_GET['a']) ? $_GET['a'] : null;
switch ($action) {
case 'saleInfo':
$saleId = isset($_POST['id']) ? $_POST['id'] : '';
$sale = $plugin->getSale($saleId);
$productType = ($sale['product_type'] == 1) ? get_lang('Course') : get_lang('Session');
$paymentType = ($sale['payment_type'] == 1) ? 'Paypal' : $plugin->get_lang('BankTransfer');
$productInfo = ($sale['product_type'] == 1) ? api_get_course_info_by_id($sale['product_id']) : api_get_session_info($sale['product_id']);
$currency = $plugin->getSelectedCurrency();
if ($sale['product_type'] == 1) {
$productImage = $productInfo['course_image_large'];
} else {
$productImage = ($productInfo['image']) ? $productInfo['image'] : Template::get_icon_path('session_default.png');
}
$userInfo = api_get_user_info($sale['user_id']);
$html = '<h2>' . $sale['product_name'] .'</h2>';
$html .= '<div class="row">';
$html .= '<div class="col-sm-6 col-md-6">';
$html .= '<ul>';
$html .= '<li><b>'. $plugin->get_lang('OrderPrice') . ':</b> '. $sale['price'] . '</li>';
$html .= '<li><b>'. $plugin->get_lang('CurrencyType') . ':</b> '. $currency['iso_code'] . '</li>';
$html .= '<li><b>'. $plugin->get_lang('ProductType') . ':</b> '. $productType . '</li>';
$html .= '<li><b>'. $plugin->get_lang('OrderDate') . ':</b> '. api_format_date($sale['date'], DATE_TIME_FORMAT_LONG_24H) . '</li>';
$html .= '<li><b>'. $plugin->get_lang('Buyer') . ':</b> '. $userInfo['complete_name'] . '</li>';
$html .= '<li><b>'. $plugin->get_lang('PaymentMethods') . ':</b> '. $paymentType . '</li>';
$html .= '</ul>';
$html .= '</div>';
$html .= '<div class="col-sm-6 col-md-6">';
$html .= '<img class="thumbnail" src="'. $productImage .'" >';
$html .= '</div>';
$html .= '</div>';
echo $html;
break;
case 'stats':
$stats = [];
$stats['completed_count'] = 0;
$stats['completed_total_amount'] = 0;
$stats['pending_count'] = 0;
$stats['pending_total_amount'] = 0;
$stats['canceled_count'] = 0;
$stats['canceled_total_amount'] = 0;
$completedPayouts = $plugin->getPayouts(BuyCoursesPlugin::PAYOUT_STATUS_COMPLETED);
$pendingPayouts = $plugin->getPayouts(BuyCoursesPlugin::PAYOUT_STATUS_PENDING);
$canceledPayouts = $plugin->getPayouts(BuyCoursesPlugin::PAYOUT_STATUS_CANCELED);
$currency = $plugin->getSelectedCurrency();
foreach ($completedPayouts as $completed) {
$stats['completed_count'] = count($completedPayouts);
$stats['completed_total_amount'] += $completed['comission'];
$stats['completed_total_amount'] = number_format($stats['completed_total_amount'], 2);
}
foreach ($pendingPayouts as $pending) {
$stats['pending_count'] = count($pendingPayouts);
$stats['pending_total_amount'] += $pending['comission'];
$stats['pending_total_amount'] = number_format($stats['pending_total_amount'], 2);
}
foreach ($canceledPayouts as $canceled) {
$stats['canceled_count'] = count($canceledPayouts);
$stats['canceled_total_amount'] += $canceled['comission'];
$stats['canceled_total_amount'] = number_format($stats['canceled_total_amount'], 2);
}
$html = '<div class="row">'
. '<p>'
. '<ul>'
. '<li>'. get_plugin_lang("PayoutsTotalCompleted", "BuyCoursesPlugin") .' <b>'. $stats['completed_count'] .'</b> - '. get_plugin_lang("TotalAmount", "BuyCoursesPlugin") .' <b>'. $stats['completed_total_amount'] .' '. $currency['iso_code'] . '</b></li>'
. '<li>'. get_plugin_lang("PayoutsTotalPending", "BuyCoursesPlugin") .' <b>'. $stats['pending_count'] .'</b> - '. get_plugin_lang("TotalAmount", "BuyCoursesPlugin") .' <b>'. $stats['pending_total_amount'] .' '. $currency['iso_code'] . '</b></li>'
. '<li>'. get_plugin_lang("PayoutsTotalCanceled", "BuyCoursesPlugin") .' <b>'. $stats['canceled_count'] .'</b> - '. get_plugin_lang("TotalAmount", "BuyCoursesPlugin") .' <b>'. $stats['canceled_total_amount'] .' '. $currency['iso_code'] . '</b></li>'
. '</ul>'
. '</p>';
$html .= '</div>';
echo $html;
break;
case 'processPayout':
if (api_is_anonymous()) {
break;
}
$html = '';
$allPays = [];
$totalAccounts = 0;
$totalPayout = 0;
$payouts = isset($_POST['payouts']) ? $_POST['payouts'] : '';
if (!$payouts) {
echo Display::return_message(get_plugin_lang("SelectOptionToProceed", "BuyCoursesPlugin"), 'error', false);
break;
}
foreach($payouts as $index => $id) {
$allPays[] = $plugin->getPayouts(BuyCoursesPlugin::PAYOUT_STATUS_PENDING, $id);
}
foreach($allPays as $payout) {
$totalPayout += number_format($payout['comission'], 2);
$totalAccounts++;
}
$currentCurrency = $plugin->getSelectedCurrency();
$isoCode = $currentCurrency['iso_code'];
$html .= '<p>'. get_plugin_lang("VerifyTotalAmountToProceedPayout", "BuyCoursesPlugin") .'</p>';
$html .= ''
. '<p>'
. '<ul>'
. '<li>'. get_plugin_lang("TotalAcounts", "BuyCoursesPlugin") .' <b>'. $totalAccounts .'</b></li>'
. '<li>'. get_plugin_lang("TotalPayout", "BuyCoursesPlugin") .' <b>'. $isoCode .' '. $totalPayout .'</b></li>'
. '</ul>'
. '</p>';
$html .= '<p>'. get_plugin_lang("CautionThisProcessCantBeCanceled", "BuyCoursesPlugin") .'</p>';
$html .= '</br></br>';
$html .= '<div id="spinner" class="text-center"></div>';
echo $html;
break;
case 'proceedPayout':
if (api_is_anonymous()) {
break;
}
$paypalParams = $plugin->getPaypalParams();
$pruebas = $paypalParams['sandbox'] == 1;
$paypalUsername = $paypalParams['username'];
$paypalPassword = $paypalParams['password'];
$paypalSignature = $paypalParams['signature'];
require_once("paypalfunctions.php");
$allPayouts = [];
$totalAccounts = 0;
$totalPayout = 0;
$payouts = isset($_POST['payouts']) ? $_POST['payouts'] : '';
if (!$payouts) {
echo Display::return_message(get_plugin_lang("SelectOptionToProceed", "BuyCoursesPlugin"), 'error', false);
break;
}
foreach($payouts as $index => $id) {
$allPayouts[] = $plugin->getPayouts(BuyCoursesPlugin::PAYOUT_STATUS_PENDING, $id);
}
$currentCurrency = $plugin->getSelectedCurrency();
$isoCode = $currentCurrency['iso_code'];
$result = MassPayment($allPayouts, $isoCode);
if($result['ACK'] === 'Success') {
foreach($allPayouts as $payout) {
$plugin->setStatusPayouts($payout['id'], BuyCoursesPlugin::PAYOUT_STATUS_COMPLETED);
}
echo Display::return_message(get_plugin_lang("PayoutSuccess", "BuyCoursesPlugin"), 'success', false);
} else {
echo Display::return_message('<b>'.$result['L_SEVERITYCODE0'].' '.$result['L_ERRORCODE0'].'</b> - '.$result['L_SHORTMESSAGE0'].'</br><ul><li>'. $result['L_LONGMESSAGE0'].'</li></ul>', 'error', false);
}
break;
case 'cancelPayout':
if (api_is_anonymous()) {
break;
}
$payoutId = isset($_POST['id']) ? $_POST['id'] : '';
$plugin->setStatusPayouts($payoutId, BuyCoursesPlugin::PAYOUT_STATUS_CANCELED);
echo '';
break;
}
exit;

@ -0,0 +1,90 @@
<?php
/* For license terms, see /license.txt */
/**
* List of pending payments of the Buy Courses plugin
* @package chamilo.plugin.buycourses
*/
//Initialization
$cidReset = true;
require_once '../../../main/inc/global.inc.php';
$htmlHeadXtra[] = '<link rel="stylesheet" href="../resources/css/style.css" type="text/css">';
$htmlHeadXtra[] = '<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>';
api_protect_admin_script(true);
$plugin = BuyCoursesPlugin::create();
$comissionsEnable = $plugin->get('comissions_enable');
$payoutStatuses = $plugin->getPayoutStatuses();
$selectedStatus = isset($_GET['status']) ? $_GET['status'] : BuyCoursesPlugin::SALE_STATUS_COMPLETED;
if ($comissionsEnable !== "true") {
api_not_allowed(true);
}
$form = new FormValidator('search', 'get');
if ($form->validate()) {
$selectedStatus = $form->getSubmitValue('status');
if ($selectedStatus === false) {
$selectedStatus = BuyCoursesPlugin::PAYOUT_STATUS_PENDING;
}
}
$form->addSelect('status', $plugin->get_lang('PayoutStatus'), $payoutStatuses);
$form->addButtonFilter(get_lang('Search'));
$form->setDefaults([
'status' => $selectedStatus
]);
switch ($selectedStatus) {
case '2':
$payouts = $plugin->getPayouts($selectedStatus);
break;
case '1':
$payouts = $plugin->getPayouts($selectedStatus);
break;
case '0':
//no break
default:
$payouts = $plugin->getPayouts();
break;
}
$payoutList = [];
foreach ($payouts as $payout) {
$payoutList[] = [
'id' => $payout['id'],
'sale_id' => $payout['sale_id'],
'reference' => $payout['sale_reference'],
'date' => api_format_date($payout['date'], DATE_TIME_FORMAT_LONG_24H),
'payout_date' => ($payout['payout_date'] === '0000-00-00 00:00:00') ? '-' : api_format_date($payout['payout_date'], DATE_TIME_FORMAT_LONG_24H),
'currency' => $payout['iso_code'],
'price' => $payout['item_price'],
'comission' => $payout['comission'],
'paypal_account' => $payout['paypal_account'],
'status' => $payout['status']
];
}
$templateName = $plugin->get_lang('PayoutReport');
$template = new Template($templateName);
$template->assign('form', $form->returnForm());
$template->assign('payout_list', $payoutList);
$template->assign('selected_status', $selectedStatus);
$content = $template->fetch('buycourses/view/payout_report.tpl');
$template->assign('header', $templateName);
$template->assign('content', $content);
$template->display_one_col_template();

@ -0,0 +1,55 @@
<?php
/* For license terms, see /license.txt */
/**
* List page for Paypal Payout for the Buy Courses plugin
* @package chamilo.plugin.buycourses
*/
/**
* Initialization
*/
$cidReset = true;
require_once '../../../main/inc/global.inc.php';
$htmlHeadXtra[] = '<link rel="stylesheet" href="../resources/css/style.css" type="text/css">';
api_protect_admin_script(true);
$plugin = BuyCoursesPlugin::create();
$paypalEnable = $plugin->get('paypal_enable');
$comissionsEnable = $plugin->get('comissions_enable');
if ($paypalEnable !== "true" && $comissionsEnable !== "true") {
api_not_allowed(true);
}
$payouts = $plugin->getPayouts();
$payoutList = [];
foreach ($payouts as $payout) {
$payoutList[] = [
'id' => $payout['id'],
'reference' => $payout['sale_reference'],
'date' => api_format_date($payout['date'], DATE_TIME_FORMAT_LONG_24H),
'currency' => $payout['iso_code'],
'price' => $payout['item_price'],
'comission' => $payout['comission'],
'paypal_account' => $payout['paypal_account']
];
}
$templateName = $plugin->get_lang('PaypalPayoutComissions');
$template = new Template($templateName);
$template->assign('payout_list', $payoutList);
$content = $template->fetch('buycourses/view/paypal_payout.tpl');
$template->assign('header', $templateName);
$template->assign('content', $content);
$template->display_one_col_template();

@ -0,0 +1,88 @@
{{ form }}
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="text-center">{{ 'OrderReference'| get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-center">{{ 'PayoutDate'| get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'Comission'| get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'PayPalAccount'| get_plugin_lang('BuyCoursesPlugin') }}</th>
</tr>
</thead>
<tbody>
{% for payout in payout_list %}
<tr>
<td class="text-center" style="vertical-align:middle"><a id="{{ payout.sale_id }}" class="saleInfo" data-toggle="modal" data-target="#saleInfo" href="#">{{ payout.reference }}</a></td>
<td class="text-center" style="vertical-align:middle">{{ payout.payout_date }}</td>
<td class="text-right" style="vertical-align:middle">{{ payout.currency ~ ' ' ~ payout.comission }}</td>
<td class="text-right" style="vertical-align:middle">{{ payout.paypal_account }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div id="saleInfo" class="modal fade" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{ 'SaleInfo'| get_plugin_lang('BuyCoursesPlugin') }}</h4>
</div>
<div class="modal-body" id="contentSale">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'Close' | get_lang }}</button>
</div>
</div>
</div>
</div>
<div id="reportStats" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{ 'Stats'| get_plugin_lang('BuyCoursesPlugin') }}</h4>
</div>
<div class="modal-body" id="contentStats">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'Close' | get_lang }}</button>
</div>
</div>
</div>
</div>
</div>
<div>
<button id="stats" type="button" class="btn btn-primary fa fa-line-chart" data-toggle="modal" data-target="#reportStats"> {{ 'Stats'|get_plugin_lang('BuyCoursesPlugin') }}</button>
</div>
<script>
$(document).ready(function() {
$(".saleInfo").click(function() {
var id = this.id;
$.ajax({
data: 'id='+id,
url: '{{ _p.web_plugin ~ 'buycourses/src/buycourses.ajax.php?' ~ { 'a': 'saleInfo' } | url_encode() }}',
type: 'POST',
success: function(response) {
$("#contentSale").html(response);
}
});
});
$("#stats").click(function() {
var id = this.id;
$.ajax({
data: 'id='+id,
url: '{{ _p.web_plugin ~ 'buycourses/src/buycourses.ajax.php?' ~ { 'a': 'stats' } | url_encode() }}',
type: 'POST',
success: function(response) {
$("#contentStats").html(response);
}
});
});
});
</script>

@ -0,0 +1,121 @@
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th class="text-center"><input type="checkbox" id="checkAll"></th>
<th class="text-center">{{ 'OrderReference'| get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-center">{{ 'OrderDate'| get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'Comission'| get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'PayPalAccount'| get_plugin_lang('BuyCoursesPlugin') }}</th>
<th class="text-right">{{ 'Options'| get_lang }}</th>
</tr>
</thead>
<tbody>
{% for payout in payout_list %}
<tr style="{{ payout.paypal_account ? '' : 'color: red;' }}">
<td class="text-center" style="vertical-align:middle">{% if payout.paypal_account %} <input id="{{ payout.id }}" type="checkbox" name="data[]" value="{{ payout.comission }}"> {% endif %}</td>
<td class="text-center" style="vertical-align:middle">{{ payout.reference }}</td>
<td class="text-center" style="vertical-align:middle">{{ payout.date }}</td>
<td class="text-right" style="vertical-align:middle">{{ payout.currency ~ ' ' ~ payout.comission }}</td>
{% if payout.paypal_account %}
<td class="text-right" style="vertical-align:middle">{{ payout.paypal_account }}</td>
{% else %}
<td class="text-right" style="vertical-align:middle">{{ 'NoPayPalAccountDetected'| get_plugin_lang('BuyCoursesPlugin') }}</td>
{% endif %}
<td class="text-right" style="vertical-align:middle"><button id="{{ payout.id }}" type="button" class="btn btn-danger fa fa-ban cancelPayout"> {{ 'CancelPayout'| get_plugin_lang('BuyCoursesPlugin') }}</button></td>
</tr>
{% endfor %}
</tbody>
</table>
<div id="startPayout" class="modal fade" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">{{ 'PaypalPayoutComissions'|get_plugin_lang('BuyCoursesPlugin') }}</h4>
</div>
<div class="modal-body" id="content">
</div>
<div class="modal-footer">
<button id="proceedPayout" type="button" class="btn btn-success fa fa-paypal"> {{ 'ProceedPayout' | get_plugin_lang('BuyCoursesPlugin') }}</button>
<button id="cancelPayout" type="button" class="btn btn-danger" data-dismiss="modal">{{ 'Cancel' | get_lang }}</button>
<button id="responseButton" type="button" class="btn btn-primary">{{ 'Confirm' | get_lang }}</button>
</div>
</div>
</div>
</div>
</div>
<div>
<button id="continuePayout" type="button" class="btn btn-primary fa fa-caret-square-o-right" data-toggle="modal" data-target="#startPayout" data-backdrop="static" data-keyboard="false"> {{ 'ContinuePayout'|get_plugin_lang('BuyCoursesPlugin') }}</button>
</div>
<script>
$(document).ready(function() {
$("#responseButton").hide();
$("#checkAll").click(function() {
$(':checkbox').prop('checked', this.checked);
});
$('#continuePayout').click(function() {
var val = [];
$(':checkbox:checked').not('#checkAll').each(function(i) {
val[i] = $(this).attr("id");
});
$.ajax({
data: { payouts : val },
url: '{{ _p.web_plugin ~ 'buycourses/src/buycourses.ajax.php?' ~ { 'a': 'processPayout' } | url_encode() }}',
type: 'POST',
success: function(response) {
$("#content").html(response);
(jQuery.isEmptyObject(val)) ? $('#proceedPayout').prop( "disabled", true ) : $('#proceedPayout').prop( "disabled", false );
}
});
});
$('#proceedPayout').click(function() {
var val = [];
$(':checkbox:checked').not('#checkAll').each(function(i) {
val[i] = $(this).attr("id");
});
$.ajax({
data: { payouts : val },
url: '{{ _p.web_plugin ~ 'buycourses/src/buycourses.ajax.php?' ~ { 'a': 'proceedPayout' } | url_encode() }}',
type: 'POST',
beforeSend: function() {
$("#proceedPayout").hide();
$("#cancelPayout").hide();
$("#spinner").html('</br></br><div class="wobblebar-loader"></div><p> {{ 'ProcessingPayoutsDontCloseThisWindow' | get_plugin_lang('BuyCoursesPlugin') }} </p>');
},
success: function(response) {
$("#content").html(response);
$("#responseButton").show();
}
});
});
$(".cancelPayout").click(function() {
var id = this.id;
$.ajax({
data: 'id='+id,
url: '{{ _p.web_plugin ~ 'buycourses/src/buycourses.ajax.php?' ~ { 'a': 'cancelPayout' } | url_encode() }}',
type: 'POST',
success: function() {
window.location.reload();
}
});
});
$('#responseButton').click(function() {
window.location.reload();
});
});
</script>
Loading…
Cancel
Save