Tạo x2, x3,... giải thưởng Addons BookieByte
Edit template: aspbb_settle_event từ bảng admin
HTML:
<xf:title>{$event.title}</xf:title>
<xf:h1 hidden="true" />
<xf:breadcrumb href="{{ link('bookiebyte', null, {'category' : $event.Category.sys_id}) }}">{$event.Category.title}</xf:breadcrumb>
<xf:breadcrumb href="{{ link('bookiebyte/event/view', $event) }}">{$event.title}</xf:breadcrumb>
<div class="block-rowMessage block-rowMessage--highlight block-rowMessage--iconic">
{{phrase('aspbb_ota_settle_warning')}}
</div>
<div class="block">
<div class="block-container">
<div class="block-body">
<xf:form action="" method="post" ajax="true" autocomplete="off" class="block" data-force-flash-message="on">
<xf:if is="count($event.Outcomes) > 0">
<xf:foreach loop="$event.Outcomes" value="$outcome">
<xf:formrow label="{{ phrase('aspbb_outcome') }}">
<strong><em>{$outcome.title}</em></strong>
</xf:formrow>
<xf:formrow label="{{ phrase('aspbb_odds') }}">
{$outcome.numerator}/{$outcome.denominator} ({$outcome.fraction|number(2)})
</xf:formrow>
<xf:radiorow name="settle[{$outcome.sys_id}]" label="{{phrase('aspbb_action')}}" value="nopay">
<xf:option value="pay" label="{{phrase('aspbb_payout')}}" />
<xf:option value="payx2" label="{{phrase('aspbb_payout')}}x2" />
<xf:option value="payx3" label="{{phrase('aspbb_payout')}}x3" />
<xf:option value="nopay" label="{{phrase('aspbb_no_payout')}}" />
<xf:option value="push" label="{{phrase('aspbb_push')}}" />
</xf:radiorow>
<hr class="formRowSep" />
</xf:foreach>
</xf:if>
<xf:submitrow submit="{{phrase('aspbb_submit')}}" icon="payment" />
</xf:form>
</div>
</div>
</div>
Đường dẫn /src/addons/Asprin/BB/Service/Event/Settle.php
PHP:
<?php
namespace Asprin\BB\Service\Event;
use Asprin\BB\Entity\Event;
use Asprin\BB\Utils as Utils;
class Settle extends \XF\Service\AbstractService
{
use \XF\Service\ValidateAndSavableTrait;
/**
* @var \Asprin\BB\Entity\Event
*/
protected $event;
protected $total_paid_out = 0;
public function __construct(\XF\App $app, Event $event)
{
parent::__construct($app);
$this->event = $event;
$this->logs = array();
}
public function processSettling(array $settle)
{
$logs = array();
$outcomes = $this->event->Outcomes;
if(count($settle) > 0 && count($outcomes) > 0)
{
foreach($outcomes as $outcome)
{
$outcome_paid_out = 0;
if(isset($settle[$outcome->sys_id]))
{
$selection = $settle[$outcome->sys_id];
$result = 'na';
$multiplier = 0;
$wagers = $outcome->Wagers;
foreach($wagers as $wager)
{
if($selection == 'pay' ||$selection == 'payx2' ||$selection == 'payx3' || $selection == 'push' || $selection == 'cancel')
{
if($selection == 'pay')
{
$result = 'won';
$multiplier = (float) $outcome->fraction;
$multiplierAmount = (int) ceil($wager->staked * $multiplier);
$finalAmount = $wager->staked + $multiplierAmount;
}
else if($selection == 'payx2')
{
$result = 'won';
$multiplier = (float) $outcome->fraction;
$multiplierAmount = (int) ceil($wager->staked *2* $multiplier);
$finalAmount = $wager->staked + $multiplierAmount;
}
else if($selection == 'payx3')
{
$result = 'won';
$multiplier = (float) $outcome->fraction;
$multiplierAmount = (int) ceil($wager->staked *3* $multiplier);
$finalAmount = $wager->staked + $multiplierAmount;
}
else if($selection == 'push')
{
$result = 'returned';
$finalAmount = $wager->staked;
}
else if($selection == 'cancel')
{
$result = 'cancel';
$finalAmount = $wager->staked;
}
}
else if($selection == 'nopay')
{
$result = 'lost';
$finalAmount = $wager->staked;
}
if(in_array($selection, ['pay','payx2','payx3', 'push', 'nopay', 'cancel']))
{
$wagerer = $wager->Owner;
$curr_balance = (int) $wagerer->getCashBalance();
if($selection == 'pay' ||$selection == 'payx2' ||$selection == 'payx3' || $selection == 'push' || $selection == 'cancel')
{
$new_balance = $curr_balance + $finalAmount;
$wagerer->fastUpdate($wagerer->getCashColumn(), $new_balance);
if($selection == 'pay')
{
$this->total_paid_out += $finalAmount;
$outcome_paid_out += $finalAmount;
$wager->fastUpdate('paid', $finalAmount);
$wagerer->setWon($multiplierAmount);
}
else if($selection == 'payx2')
{
$this->total_paid_out += $finalAmount;
$outcome_paid_out += $finalAmount;
$wager->fastUpdate('paid', $finalAmount);
$wagerer->setWon($multiplierAmount);
}
else if($selection == 'payx3')
{
$this->total_paid_out += $finalAmount;
$outcome_paid_out += $finalAmount;
$wager->fastUpdate('paid', $finalAmount);
$wagerer->setWon($multiplierAmount);
}
else if($selection == 'push')
{
$wager->fastUpdate('pushed', 1);
}
else if($selection == 'cancel')
{
$wager->fastUpdate('cancelled', 1);
}
}
else if($selection == 'nopay')
{
$wager->fastUpdate('lost', 1);
}
if($selection != 'cancel')
{
$wager->fastUpdate('settled_on', time());
}
$this->alertVisitor($wagerer, $outcome, $finalAmount, $result);
}
else
{
// log exception, this should ideally not happen
// this would mean the wager on this outcome would be termed invalid entry
Utils::log($outcome->title.' ('.$outcome->Event->title.') wager could not be settled for '.$wager->Owner->username.' via settle form. The selection value was '.$selection);
$unsettled = $this->event->getNewUnsettled();
$unsettled->outcome = $wager->Outcome->sys_id;
$unsettled->wager = $wager->sys_id;
$unsettled->save();
}
}
if($selection == 'push')
{
$outcome->fastUpdate('is_push', 1);
}
else if($selection == 'pay')
{
$outcome->fastUpdate('paid', $outcome_paid_out);
}
else if($selection == 'payx2')
{
$outcome->fastUpdate('paid', $outcome_paid_out);
}
else if($selection == 'payx3')
{
$outcome->fastUpdate('paid', $outcome_paid_out);
}
}
else
{
// log exception, this should ideally not happen
// this would mean that outcome sys_id in the form posted data was wrong
Utils::log($outcome->title.' ('.$outcome->Event->title.') was not passed correctly via settle form. The outcome sys_id was '.$outcome->sys_id);
}
}
$this->event->fastUpdate('num_paid', $this->total_paid_out);
}
$this->logs = $logs;
}
protected function alertVisitor(\XF\Entity\User $wagerer, \Asprin\BB\Entity\Outcome $outcome, $amount, $result)
{
if($result == 'won' || $result == 'lost')
{
$template = 'aspbb_won_or_lost';
}
else if($result == 'returned')
{
$template = 'aspbb_returned';
}
else
{
$template = 'aspbb_cancelled';
}
$amount = number_format($amount, 0, "", ",");
$link = $this->app->router('public')->buildLink('bookiebyte/event/view', $outcome->Event);
$sender = \XF::visitor();
$alertRepo = $this->app->repository('XF:UserAlert');
$alertRepo->alert($wagerer, $sender->user_id, $sender->username, 'user', $wagerer->user_id, $template, array('result' => $result, 'amount' => $amount, 'outcome' => $outcome->title, 'event' => $outcome->Event->title, 'link' => $link));
}
public function finalSteps($cancel = null)
{
if($cancel == 'cancel')
{
$this->event->status = Utils::$cancelled;
}
else
{
$this->event->status = Utils::$awarded;
$this->event->settled_on = time();
$this->event->settled_by = \XF::visitor()->user_id;
}
}
protected function _validate()
{
$this->event->preSave();
$errors = $this->event->getErrors();
return $errors;
}
protected function _save()
{
$this->event->save(true, false);
return $this->event;
}
}
Last edited: