made event handlers for cart/sku

created baseline emsbadge and emsticket
added completePurchase() and denyPurchase() utility methods for transaction
This commit is contained in:
JT Smith 2008-03-19 20:18:00 +00:00
parent f3fd67378f
commit 2a2e683dd9
9 changed files with 884 additions and 170 deletions

View file

@ -66,25 +66,7 @@ A hash reference as generated by getOptions().
sub addToCart {
my ($self, $options) = @_;
$self->applyOptions($options);
my $cart = WebGUI::Shop::Cart->create($self->session);
$cart->addItem($self);
}
#-------------------------------------------------------------------
=head2 adjustQuantityAvailable ( amount )
Adjust the quantity of this product that is available. Send a negative number to decrease, or a positive number to increase. Returns getQuantityAvailable.
=head3 amount
A signed integer that represents the amount to adjust
=cut
sub adjustQuantityAvailable {
my ($self, $amount) = @_;
return $self->setQuantityAvailable($self->getQuantityAvailable + $amount);
$self->getCart->addItem($self);
}
#-------------------------------------------------------------------
@ -175,6 +157,13 @@ sub definition {
}
#-------------------------------------------------------------------
=head2 getCart ( ) {
my $self = shift;
return WebGUI::Shop::Cart->getCartBySession($self->session);
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle ( )
@ -345,6 +334,61 @@ sub newBySku {
return WebGUI::Asset->newByDynamicClass($session, $assetId);
}
#-------------------------------------------------------------------
=head2 onAdjustQuantityInCart ( item, amount )
Called just after the quantity is adjusted in the cart. Should be overridden by subclasses that need to account for inventory or other bookkeeping.
=head3 item
Receives a reference to the WebGUI::Shop::CartItem so it can determine things like itemId and quantity if it needs them for book keeping purposes.
=head3 amount
The amount to be adjusted for. Could be positive if more are being added to the cart or negative if more are being removed from the cart.
=cut
sub onAdjustQuantityInCart {
my ($self, $item, $amount) = @_;
return undef;
}
#-------------------------------------------------------------------
=head2 onCompletePurchase ( item )
Called just after payment has been made. It allows for privileges to be given, or bookkeeping
tasks to be performed. It should be overriden by subclasses that need to do special processing after the purchase.
=head3 item
Receives a reference to the WebGUI::Shop::CartItem so it can determine things like itemId and quantity if it needs them for book keeping purposes.
=cut
sub onCompletePurchase {
my ($self, $item) = @_;
return undef;
}
#-------------------------------------------------------------------
=head2 onRemoveFromCart ( item )
Called by the cart just B<before> the item is removed from the cart. This allows for cleanup. Should be overridden by subclasses for inventory control or other housekeeping.
=head3 item
Receives a reference to the WebGUI::Shop::CartItem so it can determine things like itemId and quantity if it needs them for book keeping purposes.
=cut
sub onRemoveFromCart {
my ($self, $item) = @_;
return undef;
}
#-------------------------------------------------------------------
@ -366,23 +410,6 @@ sub processStyle {
#-------------------------------------------------------------------
=head2 setQuantityAvailable ( amount )
Set the quantity of this product that is available. Returns getQuantityAvailable(). Should be overridden by skus that keep track of quantity.
=head3 amount
A signed integer that represents the quantity to set it to.
=cut
sub setQuantityAvailable {
my ($self, $amount) = @_;
return $self->getQuantityAvailable;
}
#-------------------------------------------------------------------
=head2 www_view ( )
Renders self->view based upon current style, subject to timeouts. Returns Privilege::noAccess() if canView is False.

View file

@ -0,0 +1,271 @@
package WebGUI::Asset::Sku::EMSBadge;
=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 JSON;
use WebGUI::HTMLForm;
use WebGUI::International;
=head1 NAME
Package WebGUI::Asset::Sku::EMSBadge
=head1 DESCRIPTION
A badge for the Event Manager.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::EMSBadge;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
sub addToCart {
my ($self, $badgeInfo) = @_;
$badgeInfo->{badgeId} = "new";
$badgeInfo->{badgeAssetId} = $self->getId;
$badgeInfo->{emsAssetId} = $self->getParent->getId;
my $badgeId = $self->session->db->setRow("EMSRegistrant","badgeId", $badgeInfo);
$self->SUPER::addToCart({badgeId=>$badgeId, name=>$badgeInfo->{name}});
}
#-------------------------------------------------------------------
sub definition {
my $class = shift;
my $session = shift;
my $definition = shift;
my %properties;
tie %properties, 'Tie::IxHash';
my $i18n = WebGUI::International->new($session, "Asset_EventManagementSystem");
%properties = (
price => {
tab => "commerce",
fieldType => "float",
defaultValue => 0.00,
label => $i18n->get("price"),
hoverHelp => $i18n->get("price help"),
},
seatsAvailable => {
tab => "properties",
fieldType => "integer",
defaultValue => 100,
label => $i18n->get("seats available"),
hoverHelp => $i18n->get("seats available help"),
},
);
push(@{$definition}, {
assetName => $i18n->get('ems badge'),
icon => 'EMSBadge.gif',
autoGenerateForms => 1,
tableName => 'EMSBadge',
className => 'WebGUI::Asset::Sku::EMSBadge',
properties => \%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
sub getConfiguredTitle {
my $self = shift;
return $self->getTitle." (".$self->getOptions->{name}.")";
}
#-------------------------------------------------------------------
sub getMaxAllowedInCart {
return 1;
}
#-------------------------------------------------------------------
sub getPrice {
my $self = shift;
return $self->get("price");
}
#-------------------------------------------------------------------
sub getQuantityAvailable {
my $self = shift;
my $seatsTaken = $self->session->db->quickScalar("select count(*) from EMSRegistrant where badgeAssetId=? and purchaseComplete=1",[$self->getId]);
return $self->get("seatsAvailable") - $seatsTaken;
}
#-------------------------------------------------------------------
sub onCompletePurchase {
my ($self, $item) = @_;
my $badgeInfo = $self->getOptions;
$badgeInfo->{purchaseComplete} = 1;
$badgeInfo->{userId} = $self->session->user->userId; # they have to be logged in at this point
$self->session->db->setRow("EMSRegistrant","badgeId", $badgeInfo);
return undef;
}
#-------------------------------------------------------------------
sub onRemoveFromCart {
my ($self, $item) = @_;
my $badgeId = $self->getOptions->{badgeId};
foreach my $cartitem (@{$item->cart->getItems()}) {
if (isIn((ref $cartitem), qw(WebGUI::Asset::Sku::EMSTicket WebGUI::Asset::Sku::EMSRibbon WebGUI::Asset::Sku::EMSToken))) {
if ($cartitem->getSku->getOptions->{badgeId} eq $badgeId) {
$cartitem->remove;
}
}
}
$self->session->db->deleteRow('EMSRegistrant','badgeId',$badgeId);
}
#-------------------------------------------------------------------
sub purge {
my $self = shift;
$self->session->db->write("delete from EMSRegistrant where badgeAssetId=?",[$self->getId]);
$self->SUPER::purge;
}
#-------------------------------------------------------------------
sub view {
my ($self) = @_;
my $error = $self->{_errorMessage};
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
my $form = $self->session->form;
# build the form to allow the user to choose from their address book
my $book = WebGUI::HTMLForm->new($self->session, action=>$self->getUrl);
$book->hidden(name=>"shop", value=>"address");
$book->hidden(name=>"method", value=>"view");
$book->hidden(name=>"callback", value=>JSON::to_json({
url => $self->getUrl,
}));
$book->submit(value=>$i18n->get("populate from address book"));
# instanciate address
my $address = WebGUI::Shop::Address->new($self->session, $form->get("addressId")) if ($form->get("addressId"));
# build the form that the user needs to fill out with badge holder information
my $info = WebGUI::HTMLForm->new($self->session, action=>$self->getUrl);
$info->hidden(name=>"func", value=>"addToCart");
$info->text(
name => 'name',
defaultValue => (defined $address) ? $address->get("name") : $form->get('name'),
label => $i18n->get('name','Shop'),
);
$info->text(
name => 'organization',
defaultValue => $form->get("organization"),
label => $i18n->get('organization'),
);
$info->text(
name => 'address1',
defaultValue => (defined $address) ? $address->get("address1") : $form->get('address1'),
label => $i18n->get('address','Shop'),
);
$info->text(
name => 'address2',
defaultValue => (defined $address) ? $address->get("address2") : $form->get('address2'),
);
$info->text(
name => 'address3',
defaultValue => (defined $address) ? $address->get("address3") : $form->get('address3'),
);
$info->text(
name => 'city',
defaultValue => (defined $address) ? $address->get("city") : $form->get('city'),
label => $i18n->get('city','Shop'),
);
$info->text(
name => 'state',
defaultValue => (defined $address) ? $address->get("state") : $form->get('state'),
label => $i18n->get('state','Shop'),
);
$info->zipcode(
name => 'zipcode',
defaultValue => (defined $address) ? $address->get("code") : $form->get('zipcode','zipcode'),
label => $i18n->get('code','Shop'),
);
$info->country(
name => 'country',
defaultValue => (defined $address) ? $address->get("country") : ($form->get('country') || 'United States'),
label => $i18n->get('country','Shop'),
);
$info->phone(
name => 'phoneNumber',
defaultValue => (defined $address) ? $address->get("phoneNumber") : $form->get("phone","phone"),
label => $i18n->get('phone number','Shop'),
);
$info->email(
name => 'email',
label => $i18n->get('email address'),
defaultValue => $form->get("email","email")
);
$info->submit(value=>"add to cart");
# render the page;
my $output = '<h1>'.$self->getTitle.'</h1>'
.'<p>'.$self->get('description').'</p>'
.'<h2>'.$i18n->get("badge holder information").'</h2>'
.$book->print;
if ($error ne "") {
$output .= '<p><b>'.$error.'</b></p>';
}
$output .= $info->print;
return $output;
}
#-------------------------------------------------------------------
sub www_addToCart {
my ($self) = @_;
return $self->session->privilege->noAccess() unless $self->getParent->canView;
# gather badge info
my $form = $self->session->form;
my %badgeInfo = ();
foreach my $field (qw(name address1 address2 address3 city state organization)) {
$badgeInfo{$field} = $form->get($field, "text");
}
$badgeInfo{'phoneNumber'} = $form->get('phoneNumber', 'phone');
$badgeInfo{'email'} = $form->get('email', 'email');
$badgeInfo{'country'} = $form->get('country', 'country');
$badgeInfo{'zipcode'} = $form->get('zipcode', 'zipcode');
# check for required fields
my $error = "";
my $i18n = WebGUI::International->new($self->session, 'Asset_EventManagementSystem');
if ($badgeInfo{name} eq "") {
$error = sprintf $i18n->get('is required'), $i18n->get('name','Shop');
}
# return them back to the previous screen if they messed up
if ($error) {
$self->{_errorMessage} = $error;
return $self->www_view($error);
}
# add it to the cart
$self->addToCart(\%badgeInfo);
return $self->getParent->www_view;
}
1;

View file

@ -0,0 +1,169 @@
package WebGUI::Asset::Sku::EMSTicket;
=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';
=head1 NAME
Package WebGUI::Asset::Sku::EMSBadge
=head1 DESCRIPTION
A badge for the Event Manager.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::EMSBadge;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
sub addToCart {
my ($self, $badgeInfo) = @_;
$self->session->db->write("insert into EMSRegistrantTicket (badgeId, ticketAssetId) values (?,?)",
[$badgeInfo->{badgeId},$self->getId]);
$self->addToCart($badgeInfo);
}
#-------------------------------------------------------------------
sub definition {
my $class = shift;
my $session = shift;
my $definition = shift;
my %properties;
tie %properties, 'Tie::IxHash';
my $i18n = WebGUI::International->new($session, "Asset_EventManagementSystem");
my $date = WebGUI::DateTime->new($session, time());
%properties = (
price => {
tab => "commerce",
fieldType => "float",
defaultValue => 0.00,
label => $i18n->get("price"),
hoverHelp => $i18n->get("price help"),
},
seatsAvailable => {
tab => "properties",
fieldType => "integer",
defaultValue => 25,
label => $i18n->get("seats available"),
hoverHelp => $i18n->get("seats available help"),
},
eventNumber => {
tab => "properties",
fieldType => "integer",
defaultValue => $session->db->quickScalar("select max(eventNumber)+1 from EMSTicket"),
label => $i18n->get("seats available"),
hoverHelp => $i18n->get("seats available help"),
},
startDate => {
tab => "properties",
fieldType => "dateTime",
defaultValue => $date->toDatabase,
label => $i18n->get("add/edit event start date"),
hoverHelp => $i18n->get("add/edit event start date description"),
},
endDate => {
tab => "properties",
fieldType => "dateTime",
defaultValue => $date->toDatabase,
label => $i18n->get("add/edit event end date"),
hoverHelp => $i18n->get("add/edit event end date description"),
},
relatedBadges => {
tab => "properties",
fieldType => "checkList",
options => {},
defaultValue => undef,
label => $i18n->get("related badges"),
hoverHelp => $i18n->get("related badges help"),
},
);
push(@{$definition}, {
assetName => $i18n->get('ems ticket'),
icon => 'EMSTicket.gif',
autoGenerateForms => 1,
tableName => 'EMSTicket',
className => 'WebGUI::Asset::Sku::EMSTicket',
properties => \%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
sub getConfiguredTitle {
my $self = shift;
return $self->getTitle." (".$self->getOptions->{name}.")";
}
#-------------------------------------------------------------------
sub getMaxAllowedInCart {
return 1;
}
#-------------------------------------------------------------------
sub getPrice {
my $self = shift;
return $self->get("price");
}
#-------------------------------------------------------------------
sub getQuantityAvailable {
my $self = shift;
my $seatsTaken = $self->session->db->quickScalar("select count(*) from EMSRegistrantTicket where ticketAssetId=? and purchaseComplete=1",[$self->getId]);
return $self->get("seatsAvailable") - $seatsTaken;
}
#-------------------------------------------------------------------
sub onCompletePurchase {
my ($self, $item) = @_;
$self->session->db->write("update EMSRegistrantTicket set purchaseComplete=1 where ticketAssetId=? and badgeId=?",
[$self->getId, $self->getOptions->{badgeId}]);
return undef;
}
#-------------------------------------------------------------------
sub onRemoveFromCart {
my ($self, $item) = @_;
$self->session->db->write("delete from EMSRegistrantTicket where ticketAssetId=? and badgeId=?",
[$self->getId, $self->getOptions->{badgeId}]);
}
#-------------------------------------------------------------------
sub purge {
my $self = shift;
$self->session->db->write("delete from EMSRegistrantTicket where ticketAssetId=?",[$self->getId]);
$self->SUPER::purge;
}
#-------------------------------------------------------------------
sub view {
my ($self) = @_;
my $session = $self->session;
return "Don't know what it is to view this thing.";
}
1;

View file

@ -454,95 +454,88 @@ sub definition {
tie %properties, 'Tie::IxHash';
my $i18n = WebGUI::International->new($session,'Asset_EventManagementSystem');
%properties = (
displayTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000001',
tab=>"display",
namespace=>"EventManagementSystem",
hoverHelp=>$i18n->get('display template description'),
label=>$i18n->get('display template')
},
checkoutTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000003',
tab=>"display",
namespace=>"EventManagementSystem_checkout",
hoverHelp=>$i18n->get('checkout template description'),
label=>$i18n->get('checkout template')
},
managePurchasesTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000004',
tab=>"display",
namespace=>"EventManagementSystem_managePurchas",
hoverHelp=>$i18n->get('manage purchases template description'),
label=>$i18n->get('manage purchases template')
},
viewPurchaseTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000005',
tab=>"display",
namespace=>"EventManagementSystem_viewPurchase",
hoverHelp=>$i18n->get('view purchase template description'),
label=>$i18n->get('view purchase template')
},
searchTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000006',
tab=>"display",
namespace=>"EventManagementSystem_search",
hoverHelp=>$i18n->get('search template description'),
label=>$i18n->get('search template')
},
badgePrinterTemplateId => {
fieldType => "template",
defaultValue => "emsbadgeprintout000000",
tab => "display",
namespace => "emsbadgeprint",
lable => "Badge Printer Template",
},
ticketPrinterTemplateId => {
fieldType => "template",
defaultValue => "emsticketprintout00000",
tab => "display",
namespace => "emsticketprint",
lable => "Ticket Printer Template",
},
paginateAfter =>{
fieldType=>"integer",
defaultValue=>10,
tab=>"display",
hoverHelp=>$i18n->get('paginate after description'),
label=>$i18n->get('paginate after')
},
groupToAddEvents =>{
fieldType=>"group",
defaultValue=>3,
tab=>"security",
hoverHelp=>$i18n->get('group to add events description'),
label=>$i18n->get('group to add events')
},
groupToApproveEvents =>{
fieldType=>"group",
defaultValue=>3,
tab=>"security",
hoverHelp=>$i18n->get('group to approve events description'),
label=>$i18n->get('group to approve events')
},
globalPrerequisites =>{
fieldType=>"yesNo",
defaultValue=>1,
tab=>"properties",
label=>$i18n->get('global prerequisite'),
hoverHelp=>$i18n->get('global prerequisite description')
},
globalMetadata =>{
fieldType=>"yesNo",
defaultValue=>1,
tab=>"properties",
label=>$i18n->get('global metadata'),
hoverHelp=>$i18n->get('global metadata description')
},
timezone => {
fieldType => 'TimeZone',
defaultValue => 'America/Chicago',
tab => 'properties',
label => $i18n->get('time zone'),
hoverHelp => $i18n->get('time zone help'),
},
displayTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000001',
tab=>"display",
namespace=>"EventManagementSystem",
hoverHelp=>$i18n->get('display template description'),
label=>$i18n->get('display template')
},
checkoutTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000003',
tab=>"display",
namespace=>"EventManagementSystem_checkout",
hoverHelp=>$i18n->get('checkout template description'),
label=>$i18n->get('checkout template')
},
managePurchasesTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000004',
tab=>"display",
namespace=>"EventManagementSystem_managePurchas",
hoverHelp=>$i18n->get('manage purchases template description'),
label=>$i18n->get('manage purchases template')
},
viewPurchaseTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000005',
tab=>"display",
namespace=>"EventManagementSystem_viewPurchase",
hoverHelp=>$i18n->get('view purchase template description'),
label=>$i18n->get('view purchase template')
},
searchTemplateId =>{
fieldType=>"template",
defaultValue=>'EventManagerTmpl000006',
tab=>"display",
namespace=>"EventManagementSystem_search",
hoverHelp=>$i18n->get('search template description'),
label=>$i18n->get('search template')
},
badgePrinterTemplateId => {
fieldType => "template",
defaultValue => "emsbadgeprintout000000",
tab => "display",
namespace => "emsbadgeprint",
lable => "Badge Printer Template",
},
ticketPrinterTemplateId => {
fieldType => "template",
defaultValue => "emsticketprintout00000",
tab => "display",
namespace => "emsticketprint",
lable => "Ticket Printer Template",
},
paginateAfter =>{
fieldType=>"integer",
defaultValue=>10,
tab=>"display",
hoverHelp=>$i18n->get('paginate after description'),
label=>$i18n->get('paginate after')
},
groupToAddEvents =>{
fieldType=>"group",
defaultValue=>3,
tab=>"security",
hoverHelp=>$i18n->get('group to add events description'),
label=>$i18n->get('group to add events')
},
groupToApproveEvents =>{
fieldType=>"group",
defaultValue=>3,
tab=>"security",
hoverHelp=>$i18n->get('group to approve events description'),
label=>$i18n->get('group to approve events')
},
);
push(@{$definition}, {
assetName=>$i18n->get('assetName'),
@ -4114,8 +4107,29 @@ $self->getUrl('func=addToScratchCart;pid='.$event->{'productId'}.";mid=".$master
return $self->processStyle($self->processTemplate(\%var,$self->getValue("searchTemplateId")));
}
#-------------------------------------------------------------------
sub view {
my ($self) = @_;
my $session = $self->session;
return $session->privilege->noAccess() unless $self->canView;
# set up objects we'll need
my $i18n = WebGUI::International->new($session, "Asset_EventManagementSystem");
my %var = ();
# get our badges
foreach my $badge (@{$self->getLineage(["children"],{returnObjects=>1, includeOnlyClasses=>["WebGUI::Asset::Sku::EMSBadge"]})}) {
push(@{$var{availableBadges}}, $self->get);
$var{availableBadges}[-1]{isFull} = $badge->getQuantityAvailable;
$var{availableBadges}[-1]{url} = $badge->getUrl;
}
}
#-------------------------------------------------------------------
sub viewOLD {
my $self = shift;
my %var;
return $self->session->privilege->noAccess() unless $self->canView;