Committing the new Ecommerce system

This commit is contained in:
Martin Kamerbeek 2004-11-29 15:31:22 +00:00
parent 1847a18ec7
commit 5676bf9585
16 changed files with 2576 additions and 0 deletions

View file

@ -0,0 +1,356 @@
package WebGUI::Operation::Commerce;
use strict;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::ErrorHandler;
use WebGUI::Commerce::Transaction;
use WebGUI::Commerce::ShoppingCart;
use WebGUI::Commerce::Payment;
use WebGUI::AdminConsole;
use WebGUI::TabForm;
use WebGUI::Style;
use WebGUI::Commerce;
use WebGUI::Operation;
use WebGUI::URL;
use WebGUI::International;
use WebGUI::Template;
use WebGUI::HTTP;
use WebGUI::Paginator;
#-------------------------------------------------------------------
sub _submenu {
my $i18n = WebGUI::International->new("Commerce");
my $workarea = shift;
my $title = shift;
$title = $i18n->get($title) if ($title);
my $help = shift;
my $ac = WebGUI::AdminConsole->new("commerce");
if ($help) {
$ac->setHelp($help, 'Commerce');
}
$ac->addSubmenuItem(WebGUI::URL::page('op=editCommerceSettings'), $i18n->get('manage commerce settings'));
$ac->addSubmenuItem(WebGUI::URL::page('op=listPendingTransactions'), $i18n->get('pending transactions'));
return $ac->render($workarea, $title);
}
#-------------------------------------------------------------------
sub www_cancelTransaction {
my ($transaction, %var);
$transaction = WebGUI::Commerce::Transaction->new($session{form}{tid});
unless ($transaction->status eq 'Completed') {
$transaction->cancelTransaction;
}
$var{message} = WebGUI::International::get('checkout canceled message', 'Commerce');
return WebGUI::Template::process($session{setting}{commerceCheckoutCanceledTemplateId}, 'Commerce/CheckoutCanceled', \%var);
}
# This operation is here for easier future extensions to the commerce system.
#-------------------------------------------------------------------
sub www_checkout {
return WebGUI::Operation::execute('checkoutConfirm');
}
#-------------------------------------------------------------------
sub www_checkoutConfirm {
my ($plugin, $f, %var, $errors, $i18n, $shoppingCart, $normal, $recurring);
$errors = shift;
$i18n = WebGUI::International->new('Commerce');
unless ($session{setting}{commercePaymentPlugin}) {
$var{errorLoop} = [{message=>$i18n->get('no payment gateway')}];
return WebGUI::Template::process($session{setting}{commerceConfirmCheckoutTemplateId}, 'Commerce/ConfirmCheckout', \%var);
}
$var{errorLoop} = [ map {{message => $_}} @{$errors} ] if $errors;
# Put contents of cart in template vars
$shoppingCart = WebGUI::Commerce::ShoppingCart->new;
($normal, $recurring) = $shoppingCart->getItems;
$var{normalItemLoop} = $normal;
$var{normalItems} = scalar(@$normal);
$var{recurringLoop} = $recurring;
$var{recurringItems} = scalar(@$recurring);
$plugin = WebGUI::Commerce::Payment->load($session{setting}{commercePaymentPlugin});
# If the user isn't logged in yet, let him do so or have him create an account
if ($session{user}{userId} == 1) {
WebGUI::Session::setScratch('redirectAfterLogin', WebGUI::URL::page('op=checkout'));
return WebGUI::Operation::execute('displayLogin');
}
$f = WebGUI::HTMLForm->new;
$f->hidden('op', 'checkoutSubmit');
$f->raw($plugin->checkoutForm);
$f->submit($i18n->get('pay button'));
$var{form} = $f->print;
$var{title} = $i18n->get('checkout confirm title');
return WebGUI::Template::process($session{setting}{commerceConfirmCheckoutTemplateId}, 'Commerce/ConfirmCheckout', \%var);
}
#-------------------------------------------------------------------
sub www_checkoutSubmit {
my ($plugin, $shoppingCart, $transaction, $var, $amount, @cartItems, $i18n, @transactions,
@normal, $currentPurchase, $checkoutError, @resultLoop, %param, $normal, $recurring, $formError);
$i18n = WebGUI::International->new('Commerce');
# check if user has already logged in
if ($session{user}{userId} == 1) {
WebGUI::Session::setScratch('redirectAfterLogin', WebGUI::URL::page('op=checkout'));
return WebGUI::Operation::execute('displayLogin');
}
$plugin = WebGUI::Commerce::Payment->load($session{setting}{commercePaymentPlugin});
$shoppingCart = WebGUI::Commerce::ShoppingCart->new;
($normal, $recurring) = $shoppingCart->getItems;
# Check if shoppingcart contains any items. If not the user probably clicked reload, so we redirect to the current page.
unless (@$normal || @$recurring) {
WebGUI::HTTP::setRedirect(WebGUI::URL::page);
return '';
}
# check submitted form params
$formError = $plugin->validateFormData;
return www_checkoutConfirm($formError) if ($formError);
# Combine all non recurring item in one transaction and combine with all recurring ones
map {push(@transactions, {recurring => 1, items => [$_]})} @$recurring;
push(@transactions, {recurring => 0, items => [@$normal]}) if (@$normal);
$shoppingCart->empty;
foreach $currentPurchase (@transactions) {
$amount = 0;
$var = {};
# Write transaction to the log with status pending
$transaction = WebGUI::Commerce::Transaction->new('new');
foreach (@{$currentPurchase->{items}}) {
$transaction->addItem($_->{item}, $_->{quantity});
$amount += ($_->{item}->price * $_->{quantity});
$var->{purchaseDescription} .= $_->{quantity}.' x '.$_->{item}->name.'<br>';
}
$var->{purchaseAmount} = sprintf('%.2f', $amount);
# submit
if ($currentPurchase->{recurring}) {
$transaction->isRecurring(1);
$plugin->recurringTransaction({
amount => $amount,
id => $transaction->transactionId,
term => 0,
payPeriod => $currentPurchase->{items}->[0]->{item}->duration,
profilename => $currentPurchase->{items}->[0]->{item}->name,
checkCard => 1,
});
} else {
$plugin->normalTransaction({
amount => $amount,
id => $transaction->transactionId,
});
}
$transaction->gatewayId($plugin->gatewayId);
$transaction->gateway($plugin->namespace);
# check transaction result
unless ($plugin->connectionError) {
unless ($plugin->transactionError) {
$transaction->completeTransaction if ($plugin->transactionCompleted);
$var->{status} = $i18n->get('ok');
} elsif ($plugin->transactionPending) {
$checkoutError = 1;
$var->{status} = $i18n->get('pending');
$var->{error} = $plugin->transactionError;
$var->{errorCode} = $plugin->errorCode;
} else {
$checkoutError = 1;
$var->{status} = $i18n->get('transaction error');
$var->{error} = $plugin->transactionError;
$var->{errorCode} = $plugin->errorCode;
$transaction->delete;
}
} else {
$checkoutError = 1;
$var->{status} = $i18n->get('connection error');
$var->{error} = $plugin->connectionError;
$var->{errorCode} = $plugin->errorCode;
$transaction->delete;
}
push(@resultLoop, $var);
}
$param{title} = $i18n->get('transaction error title');
$param{statusExplanation} = $i18n->get('status codes information');
$param{resultLoop} = \@resultLoop;
# If everythings ok show the purchase history
return WebGUI::Operation::execute('viewPurchaseHistory') unless ($checkoutError);
# If an error has occurred show the template errorlog
return WebGUI::Template::process($session{setting}{commerceTransactionErrorTemplateId}, 'Commerce/TransactionError', \%param);
}
#-------------------------------------------------------------------
sub www_completePendingTransaction {
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
WebGUI::Commerce::Transaction->new($session{form}{tid})->completeTransaction;
return WebGUI::Operation::execute('listPendingTransactions');
}
#-------------------------------------------------------------------
sub www_confirmTransaction {
my($plugin, %var);
$plugin = WebGUI::Commerce::Payment->load($session{setting}{commercePaymentPlugin});
if ($plugin->confirmTransaction) {
WebGUI::Commerce::Transaction->new($plugin->getTransactionId)->completeTransaction;
}
}
#-------------------------------------------------------------------
sub www_editCommerceSettings {
my (%tabs, $tabform, $jscript, $currentPlugin, $ac, $jscript, $i18n, $paymentPlugin);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
$i18n = WebGUI::International->new('Commerce');
tie %tabs, 'Tie::IxHash';
%tabs = (
general=>{label=>$i18n->get('general tab')},
payment=>{label=>$i18n->get('payment tab')},
);
$paymentPlugin = $session{setting}{commercePaymentPlugin} || $session{config}{paymentPlugins}->[0];
$tabform = WebGUI::TabForm->new(\%tabs);
$tabform->hidden({name => 'op', value => 'editCommerceSettingsSave'});
# general
$tabform->getTab('general')->template(
-name => 'commerceConfirmCheckoutTemplateId',
-label => $i18n->get('confirm checkout template'),
-value => $session{setting}{commerceConfirmCheckoutTemplateId},
-namespace => 'Commerce/ConfirmCheckout'
);
$tabform->getTab('general')->template(
-name => 'commerceTransactionErrorTemplateId',
-label => $i18n->get('transaction error template'),
-value => $session{setting}{commerceTransactionPendingTemplateId},
-namespace => 'Commerce/TransactionError'
);
$tabform->getTab('general')->template(
-name => 'commerceCheckoutCanceledTemplateId',
-label => $i18n->get('checkout canceled template'),
-value => $session{setting}{commerceCheckoutCanceledTemplateId},
-namespace => 'Commerce/CheckoutCanceled'
);
$tabform->getTab('general')->email(
-name => 'commerceSendDailyReportTo',
-label => $i18n->get('daily report email'),
-value => $session{setting}{commerceSendDailyReportTo}
);
# payment plugin
$tabform->getTab('payment')->raw('<script language="JavaScript" > var activePayment="'.$paymentPlugin.'"; </script>');
$tabform->getTab("payment")->selectList(
-name => 'commercePaymentPlugin',
-options => {map {$_ => $_} @{$session{config}{paymentPlugins}}},
-label => $i18n->get('payment form'),
-value => [$paymentPlugin],
-extras => 'onChange="activePayment=operateHidden(this.options[this.selectedIndex].value,activePayment)"'
);
$jscript = '<script language="JavaScript">';
foreach (@{$session{config}{paymentPlugins}}) {
$currentPlugin = WebGUI::Commerce::Payment->load($_);
$tabform->getTab('payment')->raw('<tr id="'.$_.'"><td colspan="2" width="100%">'.
'<table border=0 cellspacing=0 cellpadding=0 width="100%">'.
$currentPlugin->configurationForm.'<tr><td width="304">&nbsp;</td><td width="496">&nbsp;</td></tr></table></td></tr>');
$jscript .= "document.getElementById(\"$_\").style.display='".(($_ eq $paymentPlugin)?"":"none")."';";
}
$jscript .= '</script>';
$tabform->getTab('payment')->raw($jscript);
$tabform->submit;
WebGUI::Style::setScript($session{config}{extrasURL}.'/swapLayers.js',{language=>"Javascript"});
return _submenu($tabform->print, 'edit commerce settings title', 'commerce manage');
}
#-------------------------------------------------------------------
sub www_editCommerceSettingsSave {
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
foreach (keys(%{$session{form}})) {
# Store the plugin confiuration data in a special table for security and the general settings in the
# normal settings table for easy access.
if (/~([^~]*)~([^~]*)~([^~]*)/) {
WebGUI::Commerce::setCommerceSetting({
type => $1,
namespace => $2,
fieldName => $3,
fieldValue => $session{form}{$_}
});
} elsif ($_ ne 'op') {
WebGUI::SQL->write('update settings set value='.quote($session{form}{$_}).' where name='.quote($_));
}
}
return WebGUI::Operation::execute('adminConsole');
}
#-------------------------------------------------------------------
sub www_listPendingTransactions {
my ($p, $transactions, $output, $properties, $i18n);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
$i18n = WebGUI::International->new("Commerce");
$p = WebGUI::Paginator->new(WebGUI::URL::page('op=listPendingTransactions'));
$p->setDataByArrayRef(WebGUI::Commerce::Transaction->pendingTransactions);
$transactions = $p->getPageData;
$output = $p->getBarTraditional($session{form}{pn});
$output .= '<table border="1" cellpadding="5" cellspacing="0" align="center">';
$output .= '<tr><th>'.$i18n->get('transactionId').'</th><th>'.$i18n->get('gateway').'</th>'.
'<th>'.$i18n->get('gatewayId').'</th><th>'.$i18n->get('init date').'</th></tr>';
foreach (@{$transactions}) {
$properties = $_->get;
$output .= '<tr>';
$output .= '<td>'.$properties->{transactionId}.'</td>';
$output .= '<td>'.$properties->{gatewayId}.'</td>';
$output .= '<td>'.$properties->{gateway}.'</td>';
$output .= '<td>'.WebGUI::DateTime::epochToHuman($properties->{initDate}).'</td>';
$output .= '<td><a href="'.WebGUI::URL::page('op=completePendingTransaction&tid='.$properties->{transactionId}).'">'.$i18n->get('complete pending transaction').'</a></td>';
$output .= '</tr>';
}
$output .= '</table>';
$output .= $p->getBarTraditional($session{form}{pn});
_submenu($output, 'list pending transactions', 'list pending transactions');
}
#-------------------------------------------------------------------
sub www_transactionComplete {
return WebGUI::Operation::execute('viewPurchaseHistory');
}
1;

View file

@ -0,0 +1,413 @@
package WebGUI::Operation::Subscription;
use strict;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::HTMLForm;
use WebGUI::Id;
use Tie::IxHash;
use WebGUI::Paginator;
use WebGUI::Icon;
use WebGUI::FormProcessor;
use WebGUI::Subscription;
use WebGUI::Commerce::ShoppingCart;
use WebGUI::AdminConsole;
use WebGUI::Template;
use WebGUI::Form;
use WebGUI::International;
#-------------------------------------------------------------------
sub _submenu {
my $i18n = WebGUI::International->new("Subscription");
my $workarea = shift;
my $title = shift;
$title = $i18n->get($title) if ($title);
my $help = shift;
my $ac = WebGUI::AdminConsole->new("subscriptions");
if ($help) {
$ac->setHelp($help, 'Subscription');
}
$ac->addSubmenuItem(WebGUI::URL::page('op=editSubscription&sid=new'), $i18n->get('add subscription'));
$ac->addSubmenuItem(WebGUI::URL::page('op=createSubscriptionCodeBatch'), $i18n->get('generate batch'));
$ac->addSubmenuItem(WebGUI::URL::page('op=listSubscriptionCodes'), $i18n->get('manage codes'));
$ac->addSubmenuItem(WebGUI::URL::page('op=listSubscriptionCodeBatches'), $i18n->get('manage batches'));
$ac->addSubmenuItem(WebGUI::URL::page('op=listSubscriptions'), 'Manage Subscriptions');
return $ac->render($workarea, $title);
}
#-------------------------------------------------------------------
sub www_createSubscriptionCodeBatch {
my (%subscriptions, $f, $error, $errorMessage);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
$error = shift;
my $i18n = WebGUI::International->new("Subscription");
$errorMessage = $i18n->get('create batch error').'<ul><li>'.join('</li><li>', @{$error}).'</li></ul>' if ($error);
tie %subscriptions, "Tie::IxHash";
%subscriptions = WebGUI::SQL->buildHash("select subscriptionId, name from subscription where deleted != 1 order by name");
$f = WebGUI::HTMLForm->new;
$f->hidden('op', 'createSubscriptionCodeBatchSave');
$f->integer(
-name => 'noc',
-label => $i18n->get('noc'),
-value => $session{form}{noc} || 1
);
$f->interval(
-name => 'expires',
-label => $i18n->get('codes expire'),
-value => $session{form}{expires}
);
$f->selectList(
-name => 'subscriptionId',
-label => $i18n->get('association'),
-options=> \%subscriptions,
-multiple=>1,
-size => 5,
-value => [ ($session{cgi}->param('subscriptionId'))]
);
$f->textarea(
-name => 'description',
-label => $i18n->get('batch description'),
-value => $session{form}{description}
);
$f->submit;
return _submenu($errorMessage.$f->print, 'create batch menu', 'create batch');
}
#-------------------------------------------------------------------
sub www_createSubscriptionCodeBatchSave {
my ($numberOfCodes, $description, $expires, $batchId, @codeElements, $currentCode, $code, $i, @subscriptions,
@error, $creationEpoch);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
my $i18n = WebGUI::International->new("Subscription");
$numberOfCodes = $session{form}{noc};
$description = $session{form}{description};
$expires = WebGUI::FormProcessor::interval('expires');
$batchId = WebGUI::Id::generate;
push(@error, $i18n->get('no description error')) unless ($description);
push(@error, $i18n->get('no association error')) unless ($session{form}{subscriptionId});
return www_createSubscriptionCodeBatch(\@error) if (@error);
$creationEpoch = time();
WebGUI::SQL->write("insert into subscriptionCodeBatch (batchId, description) values (".
quote($batchId).", ".quote($description).")");
@codeElements = ('A'..'Z', 'a'..'z', 0..9, '-');
for ($currentCode=0; $currentCode < $numberOfCodes; $currentCode++) {
$code = "";
for ($i=0; $i < 64; $i++) {
$code .= $codeElements[rand(63)];
}
WebGUI::SQL->write("insert into subscriptionCode (batchId, code, status, dateCreated, dateUsed, expires, usedBy)".
" values (".quote($batchId).",".quote($code).", 'Unused', ".quote($creationEpoch).", 0, ".quote($expires).", 0)");
@subscriptions = $session{cgi}->param('subscriptionId');
foreach (@subscriptions) {
WebGUI::SQL->write("insert into subscriptionCodeSubscriptions (code, subscriptionId) values (".
quote($code).", ".quote($_).")");
}
}
return www_listSubscriptionCodeBatches();
}
#-------------------------------------------------------------------
sub www_deleteSubscription {
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
WebGUI::Subscription->new($session{form}{sid})->delete;
return www_listSubscriptions();
}
#-------------------------------------------------------------------
sub www_deleteSubscriptionCodeBatch {
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
WebGUI::SQL->write("delete from subscriptionCodeBatch where batchId=".quote($session{form}{bid}));
WebGUI::SQL->write("delete from subscriptionCode where batchId=".quote($session{form}{bid}));
return www_listSubscriptionCodeBatches();
}
#-------------------------------------------------------------------
sub www_deleteSubscriptionCodes {
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
if ($session{form}{selection} eq 'dc') {
WebGUI::SQL->write("delete from subscriptionCode where dateCreated >= ".quote($session{form}{dcStart}).
' and dateCreated <= '.quote($session{form}{dcStop}));
} elsif ($session{form}{selection} eq 'du') {
WebGUI::SQL->write("delete from subscriptionCode where dateUsed >= ".quote($session{form}{duStart}).
' and dateUsed <= '.quote($session{form}{duStop}));
}
return www_listSubscriptionCodes();
}
#-------------------------------------------------------------------
sub www_editSubscription {
my ($properties, $subscriptionId, $durationInterval, $durationUnits, $f);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
my $i18n = WebGUI::International->new("Subscription");
unless ($session{form}{sid} eq 'new') {
$properties = WebGUI::Subscription->new($session{form}{sid})->get;
}
$subscriptionId = $session{form}{sid} || 'new';
$f = WebGUI::HTMLForm->new;
$f->hidden('op', 'editSubscriptionSave');
$f->hidden('sid', $subscriptionId);
$f->readOnly(
-label => $i18n->get('subscriptionId'),
-value => $subscriptionId
);
$f->text(
-name => 'name',
-label => $i18n->get('subscription name'),
-value => $properties->{name}
);
$f->float(
-name => 'price',
-label => $i18n->get('subscription price'),
-value => $properties->{price} || '0.00'
);
$f->textarea(
-name => 'description',
-label => $i18n->get('subscription description'),
-value => $properties->{description}
);
$f->group(
-name => 'subscriptionGroup',
-label => $i18n->get('subscription group'),
-value => [$properties->{subscriptionGroup} || 2]
);
$f->selectList(
-name => 'duration',
-label => $i18n->get('subscription duration'),
-value => [$properties->{duration} || 'Monthly'],
-options=> WebGUI::Commerce::Payment::recurringPeriodValues
);
$f->text(
-name => 'executeOnSubscription',
-label => $i18n->get('execute on subscription'),
-value => $properties->{executeOnSubscription}
);
if ($session{setting}{useKarma}) {
$f->integer(
-name => 'karma',
-label => $i18n->get('subscription karma'),
-value => $properties->{karma} || 0
);
}
$f->submit;
return _submenu($f->print, 'edit subscription title', 'subscription add/edit');
}
#-------------------------------------------------------------------
sub www_editSubscriptionSave {
my (@relevantFields);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
@relevantFields = qw(subscriptionId name price description subscriptionGroup duration executeOnSubscription karma);
WebGUI::Subscription->new($session{form}{sid})->set({map {$_ => $session{form}{$_}} @relevantFields});
return www_listSubscriptions();
}
#-------------------------------------------------------------------
sub www_listSubscriptionCodeBatches {
my ($p, $batches, $output);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
my $i18n = WebGUI::International->new("Subscription");
$p = WebGUI::Paginator->new('op=listSubscriptionCodeBatches');
$p->setDataByQuery("select * from subscriptionCodeBatch");
$batches = $p->getPageData;
$output = $p->getBarTraditional($session{form}{pn});
$output .= '<table border="1" cellpadding="5" cellspacing="0" align="center">';
foreach (@{$batches}) {
$output .= '<tr><td>';
$output .= deleteIcon('op=deleteSubscriptionCodeBatch&bid='.$_->{batchId}, undef, $i18n->get('delete batch confirm'));
$output .= '<td>'.$_->{description}.'</td>';
$output .= '<td><a href="'.WebGUI::URL::page('op=listSubscriptionCodes&selection=b&bid='.$_->{batchId}).'">'.$i18n->get('list codes in batch').'</a></td>';
$output .= '</tr>';
}
$output .= '</table>';
$output .= $p->getBarTraditional($session{form}{pn});
return _submenu($output, 'Manage subscription code batches', 'manage batch');
}
#-------------------------------------------------------------------
sub www_listSubscriptionCodes {
my ($p, $codes, $output, $where, $ops, $delete);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
my $i18n = WebGUI::International->new("Subscription");
my $dcStart = WebGUI::FormProcessor::date('dcStart');
my $dcStop = WebGUI::FormProcessor::date('dcStop');
my $duStart = WebGUI::FormProcessor::date('duStart');
my $duStop = WebGUI::FormProcessor::date('duStop');
my $batches = WebGUI::SQL->buildHashRef("select batchId, description from subscriptionCodeBatch");
$output .= $i18n->get('selection message');
$output .= WebGUI::Form::formHeader;
$output .= WebGUI::Form::hidden({name=>'op', value=>'listSubscriptionCodes'});
$output .= '<table>';
$output .= '<td>'.WebGUI::Form::radio({name=>'selection', value => 'du', checked=>($session{form}{selection} eq 'du')}).'</td>';
$output .= '<td align="left">'.$i18n->get('selection used').'</td>';
$output .= '<td>'.WebGUI::Form::date({name=>'duStart', value=>$duStart}).' '.$i18n->get('and').' '.WebGUI::Form::date({name=>'duStop', value=>$duStop}).'</td>';
$output .= '</tr><tr>';
$output .= '<td>'.WebGUI::Form::radio({name=>'selection', value => 'dc', checked=>($session{form}{selection} eq 'dc')}).'</td>';
$output .= '<td align="left">'.$i18n->get('selection created').'</td>';
$output .= '<td>'.WebGUI::Form::date({name=>'dcStart', value=>$dcStart}).' '.$i18n->get('and').' '.WebGUI::Form::date({name=>'dcStop', value=>$dcStop}).'</td>';
$output .= '</tr><tr>';
$output .= '<td>'.WebGUI::Form::radio({name=>'selection', value => 'b', checked=>($session{form}{selection} eq 'b')}).'</td>';
$output .= '<td align="left">'.$i18n->get('selection batch id').'</td>';
$output .= '<td>'.WebGUI::Form::selectList({name => 'bid', value => [$session{form}{bid}], options => $batches});
$output .= '</tr><tr>';
$output .= '<td></td>';
$output .= '<td>'.WebGUI::Form::submit({value=>$i18n->get('select')}).'</td>';
$output .= '</tr>';
$output .= '</table>';
$output .= WebGUI::Form::formFooter;
if ($session{form}{selection} eq 'du') {
$where = " and dateUsed >= ".quote($duStart)." and dateUsed <= ".quote($duStop);
$ops = '&duStart='.$duStart.'&duStop='.$duStop.'&selection=du';
$delete = '<a href="'.WebGUI::URL::page('op=deleteSubscriptionCodes'.$ops).'">'.$i18n->get('delete codes').'</a>';
} elsif ($session{form}{selection} eq 'dc') {
$where = " and dateCreated >= ".quote($dcStart)." and dateCreated <= ".quote($dcStop);
$ops = '&dcStart='.$dcStart.'&dcStop='.$dcStop.'&selection=dc';
$delete = '<a href="'.WebGUI::URL::page('op=deleteSubscriptionCodes'.$ops).'">'.$i18n->get('delete codes').'</a>';
} elsif ($session{form}{selection} eq 'b') {
$where = " and t1.batchId=".quote($session{form}{bid});
$ops = '&bid='.$session{form}{bid}.'&selection=b';
$delete = '<a href="'.WebGUI::URL::page('op=deleteSubscriptionBatch'.$ops).'">'.$i18n->get('delete codes').'</a>';
}
$p = WebGUI::Paginator->new('op=listSubscriptionCodes'.$ops);
$p->setDataByQuery("select t1.*, t2.* from subscriptionCode as t1, subscriptionCodeBatch as t2 where t1.batchId=t2.batchId ".$where);
$codes = $p->getPageData;
$output .= '<br>'.$delete.'<br>' if ($delete);
$output .= $p->getBarTraditional($session{form}{pn});
$output .= '<br>';
$output .= '<table border="1" cellpadding="5" cellspacing="0" align="center">';
$output .= '<tr>';
$output .= '<th>'.$i18n->get('batchId').'</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>'.WebGUI::DateTime::epochToHuman($_->{dateCreated}).'</td>';
$output .= '<td>';
$output .= WebGUI::DateTime::epochToHuman($_->{dateUsed}) if ($_->{dateUsed});
$output .= '</td>';
$output .= '<td>'.$_->{status}.'</td>';
$output .= '</tr>';
}
$output .= '</table>';
$output .= $p->getBarTraditional($session{form}{pn});
return _submenu($output, 'listSubscriptionCodes title', 'subscription codes manage');
}
#-------------------------------------------------------------------
sub www_listSubscriptions {
my ($p, $subscriptions, $output);
return WebGUI::Privilege::adminOnly() unless (WebGUI::Grouping::isInGroup(3));
my $i18n = WebGUI::International->new("Subscription");
$p = WebGUI::Paginator->new('op=listSubscriptions');
$p->setDataByQuery('select subscriptionId, name from subscription where deleted != 1');
$subscriptions = $p->getPageData;
$output = $p->getBarTraditional($session{form}{pn});
$output .= '<table border="1" cellpadding="5" cellspacing="0" align="center">';
foreach (@{$subscriptions}) {
$output .= '<tr>';
$output .= '<td>'.editIcon('op=editSubscription&sid='.$_->{subscriptionId});
$output .= deleteIcon('op=deleteSubscription&sid='.$_->{subscriptionId}, undef, $i18n->get('delete subscription confirm')).'</td>';
$output .= '<td>'.$_->{name}.'</td>';
$output .= '</tr>';
}
$output .= '</table>';
$output .= $p->getBarTraditional($session{form}{pn});
$output = $i18n->get('no subscriptions') unless (@{$subscriptions});
return _submenu($output, 'manage subscriptions', 'subscription manage');
}
#-------------------------------------------------------------------
sub www_purchaseSubscription {
WebGUI::Commerce::ShoppingCart->new->add($session{form}{sid}, 'Subscription');
return WebGUI::Operation::execute('checkout');
}
#-------------------------------------------------------------------
sub www_redeemSubscriptionCode {
my (%codeProperties, @subscriptions, %var, $f);
my $i18n = WebGUI::International->new("Subscription");
if ($session{form}{code}) {
%codeProperties = WebGUI::SQL->quickHash("select * from subscriptionCode as t1, subscriptionCodeBatch as t2 where ".
"t1.batchId = t2.batchId and t1.code=".quote($session{form}{code})." and (t1.dateCreated + t1.expires) > ".quote(time));
if ($codeProperties{status} eq 'Unused') {
# Code is ok
@subscriptions = WebGUI::SQL->buildArray("select subscriptionId from subscriptionCodeSubscriptions where code=".quote($session{form}{code}));
foreach (@subscriptions) {
WebGUI::Subscription->new($_)->apply;
}
# Set code to Used
WebGUI::SQL->write("update subscriptionCode set status='Used', dateUsed=".quote(time)." where code=".quote($session{form}{code}));
$var{batchDescription} = $codeProperties{description};
$var{message} = $i18n->get('redeem code success');
} else {
$var{message} = $i18n->get('redeem code failure');
}
} else {
$var{message} = $i18n->get('redeem code ask for code');
}
$f = WebGUI::HTMLForm->new;
$f->hidden('op','redeemSubscriptionCode');
$f->text(
-name => 'code',
-label => $i18n->get('code'),
-maxLength => 64,
-size => 64
);
$f->submit;
$var{codeForm} = $f->print;
return WebGUI::Template::process(1, 'Operation/RedeemSubscription', \%var);
}
1;

View file

@ -0,0 +1,52 @@
package WebGUI::Operation::TransactionLog;
use strict;
use WebGUI::Session;
use WebGUI::Commerce::Transaction;
use WebGUI::Template;
use WebGUI::DateTime;
use WebGUI::Operation;
#-------------------------------------------------------------------
sub www_viewPurchaseHistory {
my (@history, @historyLoop, %var, %properties);
$var{errorMessage} = shift;
@history = @{WebGUI::Commerce::Transaction->transactionsByUser($session{user}{userId})};
foreach (@history) {
%properties = %{$_->get};
$properties{initDate} = WebGUI::DateTime::epochToHuman($properties{initDate});
$properties{completionDate} = WebGUI::DateTime::epochToHuman($properties{completionDate}) if ($properties{completionDate});
push(@historyLoop, {
(%properties),
itemLoop => $_->getItems,
cancelUrl => WebGUI::URL::page('op=cancelRecurringTransaction&tid='.$properties{transactionId}),
canCancel => ($properties{recurring} && ($properties{status} eq 'Completed')),
});
}
$var{purchaseHistoryLoop} = \@historyLoop;
return WebGUI::Template::process(1, 'Commerce/ViewPurchaseHistory', \%var);
}
#-------------------------------------------------------------------
sub www_cancelRecurringTransaction {
my ($transaction, $error, $message);
my $i18n = WebGUI::International->new("TransactionLog");
$transaction = WebGUI::Commerce::Transaction->new($session{form}{tid});
if ($transaction->isRecurring) {
$error = $transaction->cancelTransaction;
$message = $i18n->get('cancel error').$error if ($error);
} else {
$message = $i18n->get('cannot cancel');
}
return www_viewPurchaseHistory($message);
}
1;