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).
943 lines
29 KiB
Perl
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;
|
|
|