webgui/lib/WebGUI/Asset/Sku/Subscription.pm
Colin Kuskie 3e2d5c6adf Add a continue shopping url to the Donation, Product, FlatDiscount and Subscription
Sku's.  Update all the templates to display this URL.  The new url takes the
user back to the view method with no extra variables set (like hasAddedToCart).
2008-07-16 01:05:06 +00:00

943 lines
29 KiB
Perl

package WebGUI::Asset::Sku::Subscription;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2008 Plain Black Corporation.
-------------------------------------------------------------------
Please read the legal notices (docs/legal.txt) and the license
(docs/license.txt) that came with this distribution before using
this software.
-------------------------------------------------------------------
http://www.plainblack.com info@plainblack.com
-------------------------------------------------------------------
=cut
use strict;
use Tie::IxHash;
use base 'WebGUI::Asset::Sku';
use WebGUI::Asset::Template;
use WebGUI::Form;
use WebGUI::Shop::Pay;
=head1 NAME
Package WebGUI::Asset::Sku::Subscription
=head1 DESCRIPTION
This asset makes subscriptionss possible.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::Subscription;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 apply ( [ $userId ] )
Method for subscribing a user. Adds user to the proper group and sets the expiration date,
adds karma to the user for purchasing a subscription, and then runs any external commands
as specified by the executeOnSubscription property. Macros in executeOnSubscription are
expanded before the command is executed.
=head3 userId
ID of the user purchasing the subscription. If omitted, uses the current user as
specified by the session variable.
=cut
sub apply {
my $self = shift;
my $userId = shift || $self->session->user->userId;
my $groupId = $self->get('subscriptionGroup');
# Make user part of the right group and adjust the expiration date
my $group = WebGUI::Group->new($self->session,$groupId);
$group->addUsers( [$userId], $self->getExpirationOffset );
# Add karma to the user's account
WebGUI::User->new($self->session,$userId)->karma($self->get('karma'), 'Subscription', 'Added for purchasing subscription '.$self->get('title'));
# Process the executeOnPurchase field
my $command = $self->get('executeOnSubscription');
WebGUI::Macro::process($self->session,\$command);
system($command) if ($self->get('executeOnSubscription') ne "");
}
#-------------------------------------------------------------------
=head2 definition
Adds templateId, thankYouMessage, and defaultPrice fields.
=cut
sub definition {
my $class = shift;
my $session = shift;
my $definition = shift;
my %properties;
tie %properties, 'Tie::IxHash';
my $i18n = WebGUI::International->new($session, "Asset_Subscription");
%properties = (
templateId => {
tab => "display",
fieldType => "template",
namespace => "Subscription",
defaultValue => 'eqb9sWjFEVq0yHunGV8IGw',
label => $i18n->get("template"),
hoverHelp => $i18n->get("template help"),
},
thankYouMessage => {
tab => "properties",
defaultValue => $i18n->get("default thank you message"),
fieldType => "HTMLArea",
label => $i18n->get("thank you message"),
hoverHelp => $i18n->get("thank you message help"),
},
price => {
fieldType => 'float',
label => $i18n->get('subscription price'),
hoverHelp => $i18n->get('subscription price description'),
defaultValue => '0.00',
},
subscriptionGroup => {
fieldType => 'group',
label => $i18n->get('subscription group'),
hoverHelp => $i18n->get('subscription group description'),
defaultvalue => [ 2 ]
},
duration => {
fieldType => 'selectBox',
label => $i18n->get('subscription duration'),
hoverHelp => $i18n->get('subscription duration description'),
defaultValue => 'Monthly',
options => WebGUI::Shop::Pay->new( $session )->getRecurringPeriodValues,
},
executeOnSubscription => {
fieldType => 'text',
label => $i18n->get('execute on subscription'),
hoverHelp => $i18n->get('execute on subscription description'),
defaultValue => '',
},
);
# Show the karma field only if karma is enabled
if ($session->setting->get("useKarma")) {
$properties{ karma } = {
type => 'integer',
label => $i18n->get('subscription karma'),
hoverHelp => $i18n->get('subscription karma description'),
defaultvalue => 0,
};
}
push(@{$definition}, {
assetName => $i18n->get('assetName'),
icon => 'subscription.gif',
autoGenerateForms => 1,
tableName => 'Subscription',
className => 'WebGUI::Asset::Sku::Subscription',
properties => \%properties,
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
=head2 generateSubscriptionCode ( length )
Generates a subscription code with the given length. Does not save to the db.
=head3 length
The length of the code.
=cut
sub generateSubscriptionCode {
my $self = shift;
my $codeLength = shift || 64;
my @codeElements = ('A'..'Z', 'a'..'z', 0..9, '-');
my $code;
for (1 .. $codeLength) {
$code .= $codeElements[rand(63)];
}
return $code;
}
#-------------------------------------------------------------------
=head2 generateSubscriptionCodeBatch ( numberOfCodes, length, expirationDate, name, description )
Creates a batch of subscription codes.
=head3 numberOfCodes
The number of codes in this batch.
=head3 length
The length of each code.
=head3 expirationDate
The epoch for the date when the codes expire.
=head3 name
The name for this batch.
=head3 description
The batch description.
=cut
sub generateSubscriptionCodeBatch {
my $self = shift;
my $numberOfCodes = shift;
my $codeLength = shift;
my $expirationDate = shift;
my $name = shift || 'Untitled';
my $description = shift;
my $session = $self->session;
my $now = time;
# Create a new batch and write its properties to the db
my $batchId = $session->db->setRow( 'Subscription_codeBatch', 'batchId', {
batchId => 'new',
name => $name,
description => $description,
subscriptionId => $self->getId,
expirationDate => $expirationDate,
dateCreated => $now
});
# Generate the codes for this batch
for ( 1 .. $numberOfCodes ) {
# Generate a code
my $code = $self->generateSubscriptionCode( $codeLength );
# Make sure the code is unique
while ( $session->db->quickScalar("select code from Subscription_code where code=?", [ $code ] ) ) {
$code = $self->generateSubscriptionCode( $codeLength );
}
# Code is unique so store it
$session->db->setRow( 'Subscription_code', 'code',
{
batchId => $batchId,
status => 'Unused',
dateUsed => 0,
usedBy => 0,
},
$code
);
}
return $batchId;
}
#-------------------------------------------------------------------
=head2 getAdminConsoleWithSubmenu ( )
Returns an admin console with management links added to the submenu.
=cut
sub getAdminConsoleWithSubmenu {
my $self = shift;
my $session = $self->session;
my $ac = $self->getAdminConsole;
my $i18n = WebGUI::International->new( $session, 'Asset_Subscription' );
$ac->addSubmenuItem( $self->getUrl('func=createSubscriptionCodeBatch'), $i18n->get('generate batch'));
$ac->addSubmenuItem( $self->getUrl('func=listSubscriptionCodes;selection=dc'), $i18n->get('manage codes') );
$ac->addSubmenuItem( $self->getUrl('func=listSubscriptionCodeBatches'), $i18n->get('manage batches'));
return $ac;
}
#-------------------------------------------------------------------
=head2 getCode ( code )
Returns a hashref with the properties of the passed code.
=head3 code
The code for which the properties hould be returned.
=cut
sub getCode {
my $self = shift;
my $code = shift;
my $session = $self->session;
my $codeProperties = $session->db->quickHashRef(
" select * from Subscription_code as t1, Subscription_codeBatch as t2 "
." where t1.batchId = t2.batchId and t1.code=? and t2.subscriptionId=?",
[
$code,
$self->getId,
]
);
return $codeProperties || {};
}
#-------------------------------------------------------------------
=head2 getCodesInBatch ( batchId )
Returns a hashref of hashrefs containing the properties of all the codes in a batch.
The format is as follows:
$codes->{ CODE }->{ PROPERTY }
=head3 batchId
The id of the batch.
=cut
sub getCodesInBatch {
my $self = shift;
my $batchId = shift;
my $session = $self->session;
my $codes = {};
my $sth = $session->db->read('select * from Subscription_code where batchId=?', [
$batchId
]);
while (my $row = $sth->hashRef) {
$codes->{ $row->{code} } = $row;
}
$sth->finish;
return $codes;
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle
Returns title + price
=cut
sub getConfiguredTitle {
my $self = shift;
return $self->getTitle." (".$self->getOptions->{price}.")";
}
#-------------------------------------------------------------------
=head2 getExpirationOffset ( duration )
Returns the number of seconds tied to one of the allowed intervals used by the commerce system.
=head3 duration
The identifier of the interval. Can be either 'Weekly', 'BiWeekly', 'FourWeekly', 'Monthly', 'Quarterly',
'HalfYearly' or 'Yearly'. Defaults to the duration of the subscription.
=cut
sub getExpirationOffset {
my $self = shift;
my $duration = shift || $self->get('duration');
# y, m, d
return $self->session->datetime->addToDate( 1, 0, 0, 7 ) - 1 if $duration eq 'Weekly';
return $self->session->datetime->addToDate( 1, 0, 0, 14 ) - 1 if $duration eq 'BiWeekly';
return $self->session->datetime->addToDate( 1, 0, 0, 28 ) - 1 if $duration eq 'FourWeekly';
return $self->session->datetime->addToDate( 1, 0, 1, 0 ) - 1 if $duration eq 'Monthly';
return $self->session->datetime->addToDate( 1, 0, 3, 0 ) - 1 if $duration eq 'Quarterly';
return $self->session->datetime->addToDate( 1, 0, 6, 0 ) - 1 if $duration eq 'HalfYearly';
return $self->session->datetime->addToDate( 1, 1, 0, 0 ) - 1 if $duration eq 'Yearly';
# TODO: Throw exception
}
#-------------------------------------------------------------------
=head2 getPrice
Returns configured price, 0.00 if neither of those are available.
=cut
sub getPrice {
my $self = shift;
return $self->get('price') || 0.00;
}
#-------------------------------------------------------------------
=head2 getRecurInterval
Returns the duration of this subscription in a format used by the commerce system.
=cut
sub getRecurInterval {
my $self = shift;
return $self->get('duration');
}
#-------------------------------------------------------------------
=head2 isRecurring
Tells the commerce system this Sku is recurring.
=cut
sub isRecurring {
return 1;
}
#-------------------------------------------------------------------
=head2 onCompletePurchase
Applies the first term of the subscription. This method is called when the payment is successful.
=cut
sub onCompletePurchase {
my $self = shift;
$self->apply;
}
#-------------------------------------------------------------------
=head2 prepareView
Prepares the template.
=cut
sub prepareView {
my $self = shift;
$self->SUPER::prepareView();
my $templateId = $self->get("templateId");
my $template = WebGUI::Asset::Template->new($self->session, $templateId);
$template->prepare;
$self->{_viewTemplate} = $template;
}
#-------------------------------------------------------------------
=head2 redeemCode ( code )
Redeems a subscription code. Returns undef if redemption is successful, otherwise an error message is returned.
=head3 code
The code that should be redeemed.
=cut
sub redeemCode {
my $self = shift;
my $code = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset_Subscription");
my $properties = $self->getCode( $code );
if ($properties->{ status } eq 'Unused' && $properties->{ expirationDate } >= time) {
# Code is ok so apply the subscription
$self->apply;
# Set code to Used
$session->db->write("update Subscription_code set status='Used', dateUsed=? where code =?", [
time,
$code,
]);
} else {
return $i18n->get('redeem code failure');
}
return undef;
}
#-------------------------------------------------------------------
=head2 view
Displays the donation form.
=cut
sub view {
my ($self) = @_;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset_Subscription");
my %var = (
formHeader => WebGUI::Form::formHeader($session, { action=>$self->getUrl })
. WebGUI::Form::hidden( $session, { name=>"func", value=>"purchaseSubscription" }),
formFooter => WebGUI::Form::formFooter($session),
purchaseButton => WebGUI::Form::submit( $session, { value => $i18n->get("purchase button") }),
hasAddedToCart => $self->{_hasAddedToCart},
continueShoppingUrl => $self->getUrl,
codeControls => join (' · ', (
'<a href="'.$self->getUrl('func=createSubscriptionCodeBatch') .'">'.$i18n->get('generate batch').'</a>',
'<a href="'.$self->getUrl('func=listSubscriptionCodes') .'">'.$i18n->get('manage codes').'</a>',
'<a href="'.$self->getUrl('func=listSubscriptionCodeBatches') .'">'.$i18n->get('manage batches').'</a>',
)),
price => sprintf("%.2f", $self->getPrice),
);
my $hasCodes = $self->session->db->quickScalar('select count(*) from Subscription_code as t1, Subscription_codeBatch as t2 where t1.batchId = t2.batchId and t2.subscriptionId=?', [$self->getId]);
if ($hasCodes) {
$var{redeemCodeLabel} = $i18n->get('redeem code');
$var{redeemCodeUrl} = $self->getUrl('func=redeemSubscriptionCode');
}
return $self->processTemplate(\%var,undef,$self->{_viewTemplate});
}
#----------------------------------------------------------------------------
=head2 www_createSubscriptionCodeBatch ( $error )
Form to accept parameters to create a batch of subscription codes.
=head3 error
An HTML array ref of an error message to be returned to the user.
=cut
sub www_createSubscriptionCodeBatch {
my $self = shift;
my $error = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset_Subscription");
# Check privs
return $session->privilege->adminOnly() unless $self->canEdit;
# Generate error message if errors occurred
my $errorMessage = $i18n->get('create batch error').'<ul><li>'.join('</li><li>', @{$error}).'</li></ul>' if ($error);
# Generate the properties form for this subscription code batch
my $f = WebGUI::HTMLForm->new( $session );
$f->submit;
$f->hidden(
-name => 'func',
-value => 'createSubscriptionCodeBatchSave'
);
$f->integer(
-name => 'noc',
-label => $i18n->get('noc'),
-hoverHelp => $i18n->get('noc description'),
-value => $session->form->process("noc") || 1
);
$f->integer(
-name => 'codeLength',
-label => $i18n->get('code length'),
-hoverHelp => $i18n->get('code length description'),
-value => $session->form->process("codeLength") || 64
);
$f->interval(
-name => 'expires',
-label => $i18n->get('codes expire'),
-hoverHelp => $i18n->get('codes expire description'),
-value => $session->form->process("expires") || $session->datetime->intervalToSeconds(1, 'months')
);
$f->text(
-name => 'name',
-label => $i18n->get('batch name'),
-hoverHelp => $i18n->get('batch name description'),
-value => $session->form->process('name'),
);
$f->textarea(
-name => 'description',
-label => $i18n->get('batch description'),
-hoverHelp => $i18n->get('batch description description'),
-value => $session->form->process("description"),
);
$f->submit;
return $self->getAdminConsoleWithSubmenu->render( $errorMessage.$f->print, $i18n->get('create batch menu') );
}
#-------------------------------------------------------------------
=head2 www_createSubscriptionCodeBatchSave ( )
Method that accepts the form parameters to create a batch of subscription codes.
=cut
sub www_createSubscriptionCodeBatchSave {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset_Subscription");
# Check privs
return $session->privilege->adminOnly() unless $self->canEdit;
my $numberOfCodes = $session->form->process("noc");
my $description = $session->form->process("description");
my $name = $session->form->process("name");
my $expires = $session->form->interval('expires');
my $batchId = $session->id->generate;
my $codeLength = $session->form->process("codeLength");
# Sanity check input
my @error;
push(@error, $i18n->get('no description error')) unless ($description);
push(@error, $i18n->get('code length error'))
unless (
$codeLength >= 10
&& $codeLength <= 64
&& $codeLength =~ m/^\d\d$/
);
# Return an error message if an error occurred
return $self->www_createSubscriptionCodeBatch( \@error ) if @error;
# Create the code batch
$self->generateSubscriptionCodeBatch(
$numberOfCodes,
$codeLength,
time() + $expires,
$name,
$description,
);
return $self->www_listSubscriptionCodeBatches;
}
#-------------------------------------------------------------------
=head2 www_deleteSubscriptionCodeBatch ( )
Deletes a batch of subscription codes.
=cut
sub www_deleteSubscriptionCodeBatch {
my $self = shift;
my $session = $self->session;
my $batchId = $session->form->process('bid');
return $session->privilege->insufficient unless $self->canEdit;
# Remove code batch properties and codes in batch
$session->db->write( 'delete from Subscription_codeBatch where batchId=?', [ $batchId ] );
$session->db->write( 'delete from Subscription_code where batchId=?', [ $batchId ] );
return $self->www_listSubscriptionCodeBatches;
}
#-------------------------------------------------------------------
=head2 www_deleteSubscriptionCodes ( )
Deletes subscription codes based on either their creation date or their usage date.
=cut
sub www_deleteSubscriptionCodes {
my $self = shift;
my $session = $self->session;
return $session->privilege->insufficient unless $self->canEdit;
my $selectBy = $session->form->process('selection');
if ($selectBy eq 'dc') {
# Delete codes by creation date
my $from = $session->form->date( 'dcStart' );
my $to = $session->form->date( 'dcStop' );
$session->db->write(
'delete from Subscription_code where batchId in '
.' ( select batchId from Subscription_codeBatch '
.' where dateCreated >= ? and dateCreated <= ? and subscriptionId=? '
.' )',
[
$from,
$to,
$self->getId,
]
);
}
elsif ($selectBy eq 'du') {
# Delete codes by usage date
my $from = $session->form->date( 'duStart' );
my $to = $session->form->date( 'duStop' );
$session->db->write(
'delete from Subscription_code where dateUsed >= ? and dateUsed <= ? and batchId in '
.'( select batchId from Subscription_codeBatch where subscriptionId=? )',
[
$from,
$to,
]
);
}
return $self->www_listSubscriptionCodes;
}
#-------------------------------------------------------------------
=head2 www_listSubscriptionCodeBatches
Display a list of code batches for this subscription.
=cut
sub www_listSubscriptionCodeBatches {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new( $session, "Asset_Subscription" );
# Check privs
return $session->privilege->insufficient unless $self->canEdit;
# Set up a paginator to paginate the list of batches
my $p = WebGUI::Paginator->new( $session, $self->getUrl('func=listSubscriptionCodeBatches') );
$p->setDataByQuery( 'select * from Subscription_codeBatch where subscriptionId=?', undef, 1, [
$self->getId,
]);
# Fetch the list of batches at the current paginition index
my $batches = $p->getPageData;
my $output = $p->getBarTraditional($session->form->process("pn"));
$output .= '<table border="1" cellpadding="5" cellspacing="0" align="center">';
foreach my $batch ( @{$batches} ) {
$output .= '<tr><td>';
$output .= $session->icon->delete(
'func=deleteSubscriptionCodeBatch;bid='.$batch->{batchId},
$self->getUrl,
$i18n->get('delete batch confirm'));
$output .= '</td>';
$output .= '<td>' . $batch->{ description } . '</td>';
$output .= '<td>'
. '<a href="' . $self->getUrl('func=listSubscriptionCodes;selection=b;bid=' . $batch->{ batchId }) . '">'
. $i18n->get('list codes in batch').'</a></td>';
$output .= '</tr>';
}
$output .= '</table>';
$output .= $p->getBarTraditional($session->form->process("pn"));
$output = $i18n->get('no subscription code batches') unless ( @{$batches} );
return $self->getAdminConsoleWithSubmenu->render( $output, $i18n->get('manage batches') );
}
#-------------------------------------------------------------------
=head2 www_listSubscriptionCodes ( )
Displays a list of subscription codes for this subscription.
=cut
sub www_listSubscriptionCodes {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset_Subscription");
my ($p, $codes, $output, $where, $ops, $delete);
return $session->privilege->insufficient unless $self->canEdit;
my $dcStart = $session->form->date('dcStart');
my $dcStop = $session->datetime->addToTime($session->form->date('dcStop'), 23, 59);
my $duStart = $session->form->date('duStart');
my $duStop = $session->datetime->addToTime($session->form->date('duStop'), 23, 59);
my $batchId = $session->form->process('bid');
my $selection = $session->form->process('selection');
my $batches =
$session->db->buildHashRef('select batchId, description from Subscription_codeBatch where subscriptionId=?',
[
$self->getId,
]);
# Build a subscription code selection form
my $f = WebGUI::HTMLForm->new( $session );
$f->hidden(
name => 'func',
value => 'listSubscriptionCodes',
);
#--- Selection by date created
$f->readOnly(
label =>
WebGUI::Form::radio( $session, { name => 'selection', value => 'du', checked => ($selection eq 'du') } )
. $i18n->get('selection used'),
value =>
WebGUI::Form::date( $session, { name => 'duStart', value=> $duStart } )
. ' ' . $i18n->get( 'and' ) . ' '
. WebGUI::Form::date( $session, { name => 'duStop', value=> $duStop } ),
);
#--- Selection by date used
$f->readOnly(
label =>
WebGUI::Form::radio( $session, { name => 'selection', value => 'dc', checked => ($selection eq 'dc') } )
. $i18n->get('selection created'),
value =>
WebGUI::Form::date( $session, { name => 'dcStart', value=> $dcStart } )
. ' ' . $i18n->get( 'and' ) . ' '
. WebGUI::Form::date( $session, { name => 'dcStop', value=> $dcStop } ),
);
#--- Selection by batch
$f->readOnly(
label =>
WebGUI::Form::radio( $session, { name => 'selection', value => 'b', checked => ($selection eq 'b') } )
. $i18n->get('selection batch id'),
value =>
WebGUI::Form::selectBox( $session, { name => 'bid', value => $batchId, options => $batches } ),
);
#--- Submit button
$f->submit(
value => $i18n->get('select'),
);
if ($session->form->process("selection") eq 'du') {
$where = " and dateUsed >= ".$session->db->quote($duStart)." and dateUsed <= ".$session->db->quote($duStop);
$ops = ';duStart='.$session->form->process('duStart').';duStop='.$session->form->process('duStop').';selection=du';
$delete = '<a href="'.$self->getUrl('func=deleteSubscriptionCodes'.$ops).'">'.$i18n->get('delete codes').'</a>';
} elsif ($session->form->process("selection") eq 'dc') {
$where = " and dateCreated >= ".$session->db->quote($dcStart)." and dateCreated <= ".$session->db->quote($dcStop);
$ops = ';dcStart='.$session->form->process('dcStart').';dcStop='.$session->form->process('dcStop').';selection=dc';
$delete = '<a href="'.$self->getUrl('func=deleteSubscriptionCodes'.$ops).'">'.$i18n->get('delete codes').'</a>';
} elsif ($session->form->process("selection") eq 'b') {
$where = " and t1.batchId=".$session->db->quote($session->form->process("bid"));
$ops = ';bid='.$session->form->process("bid").';selection=b';
$delete = '<a href="'.$self->getUrl('func=deleteSubscriptionCodeBatch'.$ops).'">'.$i18n->get('delete codes').'</a>';
} else {
return $self->getAdminConsoleWithSubmenu->render( $output, $i18n->get('listSubscriptionCodes title') );
}
$p = WebGUI::Paginator->new( $session, $self->getUrl('func=listSubscriptionCodes'.$ops) );
$p->setDataByQuery(
"select t1.*, t2.* from Subscription_code as t1, Subscription_codeBatch as t2 ".
" where t1.batchId=t2.batchId and subscriptionId=?".$where,
undef, undef,
[
$self->getId,
]
);
$codes = $p->getPageData;
$output = $i18n->get('selection message');
$output .= $f->print;
$output .= '<br />'.$delete.'<br />' if ($delete);
$output .= $p->getBarTraditional($session->form->process("pn"));
$output .= '<br />';
$output .= '<table border="1" cellpadding="5" cellspacing="0" align="center">';
$output .= '<tr>';
$output .= '<th>'.$i18n->get('batch id').'</th><th>'.$i18n->get('code').'</th><th>'.$i18n->get('creation date').
'</th><th>'.$i18n->get('dateUsed').'</th><th>'.$i18n->get('status').'</th>'; $output .= '</tr>';
foreach (@{$codes}) {
$output .= '<tr>';
$output .= '<td>'.$_->{batchId}.'</td>';
$output .= '<td>'.$_->{code}.'</td>';
$output .= '<td>'.$session->datetime->epochToHuman($_->{dateCreated}).'</td>';
$output .= '<td>';
$output .= $session->datetime->epochToHuman($_->{dateUsed}) if ($_->{dateUsed});
$output .= '</td>';
$output .= '<td>'.$_->{status}.'</td>';
$output .= '</tr>';
}
$output .= '</table>';
$output .= $p->getBarTraditional($session->form->process("pn"));
return $self->getAdminConsoleWithSubmenu->render( $output, $i18n->get('listSubscriptionCodes title') );
}
#-------------------------------------------------------------------
=head2 wwww_purchaseSubscription
Add this subscription to the cart.
=cut
sub www_purchaseSubscription {
my $self = shift;
if ($self->canView) {
$self->{_hasAddedToCart} = 1;
$self->addToCart({price => $self->getPrice});
}
return $self->www_view;
}
#-------------------------------------------------------------------
=head2 www_redeemSubscriptionCode ( )
Redeems a subscription code or returns an error.
=cut
sub www_redeemSubscriptionCode {
my $self = shift;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset_Subscription");
my $code = $session->form->process("code");
my $var = {};
if ($code) {
my $error = $self->redeemCode( $code );
my $codeProperties = $self->getCode( $code );
$var->{ batchDescription } = $codeProperties->{ description };
$var->{ message } = $error || $i18n->get('redeem code success');
} else {
$var->{ message } = $i18n->get('redeem code ask for code');
}
my $f = WebGUI::HTMLForm->new( $session );
$f->hidden(
-name => 'func',
-value => 'redeemSubscriptionCode'
);
$f->text(
-name => 'code',
-label => $i18n->get('code'),
-hoverHelp => $i18n->get('code description'),
-maxLength => 64,
-size => 30
);
$f->submit;
$var->{ codeForm } = $f->print;
return $self->processStyle($self->processTemplate($var, 'PBtmpl0000000000000053'));
}
1;