merging commerce branch back into head

This commit is contained in:
JT Smith 2008-04-20 18:08:26 +00:00
commit 5fb4807edc
1326 changed files with 55293 additions and 41167 deletions

471
lib/WebGUI/Asset/Sku.pm Normal file
View file

@ -0,0 +1,471 @@
package WebGUI::Asset::Sku;
=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';
use WebGUI::Shop::Cart;
=head1 NAME
Package WebGUI::Asset::Sku
=head1 DESCRIPTION
This is the base class for all products in the commerce system.
=head1 SYNOPSIS
use WebGUI::Asset::Sku;
$self = WebGUI::Asset::Sku->newBySku($session, $sku);
$self->addToCart;
$self->applyOptions;
$hashRef = $self->getOptions;
$integer = $self->getMaxAllowedInCart;
$float = $self->getPrice;
$float = $self->getTaxRate;
$boolean = $self->isShippingRequired;
$html = $self->processStyle($output);
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 addToCart ( options )
Adds this sku to the current session's cart.
=head3 options
A hash reference as generated by getOptions().
=cut
sub addToCart {
my ($self, $options) = @_;
$self->applyOptions($options);
$self->getCart->addItem($self);
}
#-------------------------------------------------------------------
=head2 applyOptions ( options )
Accepts a configuration data hash reference that configures a sku a certain way. For example to turn "a t-shirt" into "an XL red t-shirt". See also getOptions().
=head3 options
A hash reference containing the sku options.
=cut
sub applyOptions {
my ($self, $options) = @_;
$self->{_skuOptions} = $options;
}
#-------------------------------------------------------------------
=head2 definition ( session, definition )
See super class.
=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_Sku");
%properties = (
description => {
tab => "properties",
fieldType => "HTMLArea",
defaultValue => undef,
label => $i18n->get("description"),
hoverHelp => $i18n->get("description help")
},
sku => {
tab => "shop",
fieldType => "text",
defaultValue => $session->id->generate,
label => $i18n->get("sku"),
hoverHelp => $i18n->get("sku help")
},
displayTitle => {
tab => "display",
fieldType => "yesNo",
defaultValue => 1,
label => $i18n->get("display title"),
hoverHelp => $i18n->get("display title")
},
overrideTaxRate => {
tab => "shop",
fieldType => "yesNo",
defaultValue => 0,
label => $i18n->get("override tax rate"),
hoverHelp => $i18n->get("override tax rate help")
},
taxRateOverride => {
tab => "shop",
fieldType => "float",
defaultValue => 0.00,
label => $i18n->get("tax rate override"),
hoverHelp => $i18n->get("tax rate override help")
},
salesAgentId => {
tab => "shop",
fieldType => "hidden",
defaultValue => undef,
label => $i18n->get("sales agent"),
hoverHelp => $i18n->get("sales agent help")
},
);
push(@{$definition}, {
assetName=>$i18n->get('assetName'),
icon=>'Sku.gif',
autoGenerateForms=>1,
tableName=>'sku',
className=>'WebGUI::Asset::Sku',
properties=>\%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
=head2 getCart ( )
Returns a reference to the current session's cart.
=cut
sub getCart {
my $self = shift;
return WebGUI::Shop::Cart->getCartBySession($self->session);
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle ( )
Returns a configured title like "Red XL T-Shirt" rather than just "T-Shirt". Needs to be overridden by subclasses to support this. Defaultly just returns getTitle().
=cut
sub getConfiguredTitle {
my $self = shift;
return $self->getTitle;
}
#-------------------------------------------------------------------
=head2 getEditTabs ( )
Not to be modified, just defines a new tab.
=cut
sub getEditTabs {
my $self = shift;
my $i18n = WebGUI::International->new($self->session,"Asset_Sku");
return (['shop', $i18n->get('shop'), 9]);
}
#-------------------------------------------------------------------
=head2 getOptions ( )
Returns a hash reference of configuration data that can return this sku to a configured state. See also applyOptions().
=cut
sub getOptions {
my $self = shift;
if (ref $self->{_skuOptions} eq "HASH") {
return $self->{_skuOptions};
}
return {};
}
#-------------------------------------------------------------------
=head2 getMaxAllowedInCart ( )
Returns getQuantityAvailable(). Should be overriden by subclasses that have a specific value. Subclasses that are unique should return 1. Subclasses that have an inventory count should return the amount in inventory.
=cut
sub getMaxAllowedInCart {
my $self = shift;
return $self->getQuantityAvailable;
}
#-------------------------------------------------------------------
=head2 getPrice ( )
Returns 0.00. Needs to be overriden by subclasses.
=cut
sub getPrice {
return 0.00;
}
#-------------------------------------------------------------------
=head2 getQuantityAvailable ( )
Returns 99999999. Needs to be overriden by subclasses. Tells the commerce system how many of this item is on hand.
=cut
sub getQuantityAvailable {
return 99999999;
}
#-------------------------------------------------------------------
=head2 getRecurInterval ( )
Returns the recur interval, which must be one of the following: 'Weekly', 'BiWeekly', 'FourWeekly',
'Monthly', 'Quarterly', 'HalfYearly' or 'Yearly'. Must be overriden by subclass if that is a recurring Sku.
=cut
sub getRecurInterval {
return undef;
}
#-------------------------------------------------------------------
=head2 getTaxRate ( )
Returns undef unless the "Override tax rate?" switch is set to yes. If it is, then it returns the value of the "Tax Rate Override" field.
=cut
sub getTaxRate {
my $self = shift;
return ($self->get("overrideTaxRate")) ? $self->get("taxRateOverride") : undef;
}
#-------------------------------------------------------------------
=head2 getWeight ( )
Returns 0. Needs to be overriden by subclasses.
=cut
sub getWeight {
my $self = shift;
return 0;
}
#-------------------------------------------------------------------
=head2 indexContent ( )
Adding sku as a keyword. See WebGUI::Asset::indexContent() for additonal details.
=cut
sub indexContent {
my $self = shift;
my $indexer = $self->SUPER::indexContent;
$indexer->addKeywords($self->get('sku'));
return $indexer;
}
#-------------------------------------------------------------------
=head2 isRecurring
Returns a boolean indicating whether this sku is recurring. Defaultly returns 0. Needs to be overriden by subclasses that do recurring transactions, because not all payment gateways can process recurring transactions.
=cut
sub isRecurring {
return 0;
}
#-------------------------------------------------------------------
=head2 isShippingRequired
Returns a boolean indicating whether shipping is required. Defaultly returns 0. Needs to be overriden by subclasses that use shipping.
=cut
sub isShippingRequired {
return 0;
}
#-------------------------------------------------------------------
=head2 newBySku ( session, sku )
Returns a sku subclass based upon a sku lookup.
=head3 session
A reference to the current session.
=head3 sku
The sku attached to the object you wish to instanciate.
=cut
sub newBySku {
my ($class, $session, $sku) = @_;
my $assetId = $session->db->quickScalar("select assetId from Sku where sku=?", [$sku]);
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::TransactionItem 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 onRefund ( item )
Called by a transaction upon issuing a refund for this item. Extend to do extra book keeping or restocking.
=head3 item
The WebGUI::Shop::TransactionItem being refunded.
=cut
sub onRefund {
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;
}
#-------------------------------------------------------------------
=head2 processStyle ( output )
Returns output parsed under the current style.
=head3 output
An HTML blob to be parsed into the current style.
=cut
sub processStyle {
my $self = shift;
my $output = shift;
return $self->getParent->processStyle($output);
}
#-------------------------------------------------------------------
=head2 www_view ( )
Renders self->view based upon current style, subject to timeouts. Returns Privilege::noAccess() if canView is False.
=cut
sub www_view {
my $self = shift;
my $check = $self->checkView;
return $check if (defined $check);
$self->session->http->setLastModified($self->getContentLastModified);
$self->session->http->sendHeader;
$self->prepareView;
my $style = $self->processStyle("~~~");
my ($head, $foot) = split("~~~",$style);
$self->session->output->print($head, 1);
$self->session->output->print($self->view);
$self->session->output->print($foot, 1);
return "chunked";
}
1;

View file

@ -0,0 +1,179 @@
package WebGUI::Asset::Sku::Donation;
=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;
=head1 NAME
Package WebGUI::Asset::Sku::Donation
=head1 DESCRIPTION
This asset makes donations possible.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::Dnoation;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=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_Donation");
%properties = (
templateId => {
tab => "display",
fieldType => "template",
namespace => "Donation",
defaultValue => "vrKXEtluIhbmAS9xmPukDA",
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"),
},
defaultPrice => {
tab => "shop",
fieldType => "float",
defaultValue => 100.00,
label => $i18n->get("default price"),
hoverHelp => $i18n->get("default price help"),
},
);
push(@{$definition}, {
assetName => $i18n->get('assetName'),
icon => 'Donation.gif',
autoGenerateForms => 1,
tableName => 'donation',
className => 'WebGUI::Asset::Sku::Donation',
properties => \%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle
Returns title + price
=cut
sub getConfiguredTitle {
my $self = shift;
return $self->getTitle." (".$self->getOptions->{price}.")";
}
#-------------------------------------------------------------------
=head2 getPrice
Returns configured price, or default price, or 100 if neither of those are available.
=cut
sub getPrice {
my $self = shift;
return $self->getOptions->{price} || $self->get("defaultPrice") || 100.00;
}
#-------------------------------------------------------------------
=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 view
Displays the donation form.
=cut
sub view {
my ($self) = @_;
my $session = $self->session;
my $i18n = WebGUI::International->new($session, "Asset_Donation");
my %var = (
formHeader => WebGUI::Form::formHeader($session, { action=>$self->getUrl })
. WebGUI::Form::hidden( $session, { name=>"func", value=>"donate" }),
formFooter => WebGUI::Form::formFooter($session),
donateButton => WebGUI::Form::submit( $session, { value => $i18n->get("donate button") }),
priceField => WebGUI::Form::float($session, { name => "price", defaultValue => $self->getPrice }),
hasAddedToCart => $self->{_hasAddedToCart},
);
return $self->processTemplate(\%var,undef,$self->{_viewTemplate});
}
#-------------------------------------------------------------------
=head2 wwww_donate
Accepts the information from the donation form and adds it to the cart.
=cut
sub www_donate {
my $self = shift;
if ($self->canView) {
$self->{_hasAddedToCart} = 1;
$self->addToCart({price => ($self->session->form->get("price") || $self->getPrice) });
}
return $self->www_view;
}
1;

View file

@ -0,0 +1,468 @@
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;
use WebGUI::Shop::AddressBook;
use WebGUI::Utility;
=head1 NAME
Package WebGUI::Asset::Sku::EMSBadge
=head1 DESCRIPTION
A badge for the Event Manager. Badges allow you into the convention.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::EMSBadge;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 addToCart ( badgeInfo )
Adds this badge as configured for an individual to the cart.
=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});
}
#-------------------------------------------------------------------
=head2 definition
Adds price, seatsAvailable 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_EventManagementSystem");
%properties = (
price => {
tab => "shop",
fieldType => "float",
defaultValue => 0.00,
label => $i18n->get("price"),
hoverHelp => $i18n->get("price help"),
},
seatsAvailable => {
tab => "shop",
fieldType => "integer",
defaultValue => 100,
label => $i18n->get("seats available"),
hoverHelp => $i18n->get("seats available help"),
},
relatedBadgeGroups => {
tab => "properties",
fieldType => "checkList",
customDrawMethod=> 'drawRelatedBadgeGroupsField',
label => $i18n->get("related badge groups"),
hoverHelp => $i18n->get("related badge groups badge 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);
}
#-------------------------------------------------------------------
=head2 drawRelatedBadgeGroupsField ()
Draws the field for the relatedBadgeGroups property.
=cut
sub drawRelatedBadgeGroupsField {
my ($self, $params) = @_;
return WebGUI::Form::checkList($self->session, {
name => $params->{name},
value => $self->get($params->{name}),
vertical => 1,
options => $self->getParent->getBadgeGroups,
});
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle
Returns title + badgeholder name
=cut
sub getConfiguredTitle {
my $self = shift;
my $name = $self->session->db->quickScalar("select name from EMSRegistrant where badgeId=?",[$self->getOptions->{badgeId}]);
return $self->getTitle." (".$name.")";
}
#-------------------------------------------------------------------
=head2 getMaxAllowedInCart
Returns 1
=cut
sub getMaxAllowedInCart {
return 1;
}
#-------------------------------------------------------------------
=head2 getPrice
Returns the price field value.
=cut
sub getPrice {
my $self = shift;
return $self->get("price");
}
#-------------------------------------------------------------------
=head2 getQuantityAvailable
Returns seatsAvailable - the count from the EMSRegistrant table.
=cut
sub getQuantityAvailable {
my $self = shift;
my $seatsTaken = $self->session->db->quickScalar("select count(*) from EMSRegistrant where badgeAssetId=?",[$self->getId]);
return $self->get("seatsAvailable") - $seatsTaken;
}
#-------------------------------------------------------------------
=head2 onCompletePurchase (item)
Marks badge order as paid.
=cut
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
$badgeInfo->{transactionItemId} = $item->getId;
$self->session->db->setRow("EMSRegistrant","badgeId", $badgeInfo);
return undef;
}
#-------------------------------------------------------------------
=head2 onRefund ( item)
Destroys the badge so that it can be resold.
=cut
sub onRefund {
my ($self, $item) = @_;
my $db = $self->session->db;
my $badgeId = $self->getOptions->{badgeId};
# refund any purchased tickets related to the badge
foreach my $id ($db->buildArray("select transactionItemId from EMSRegistrantTicket where badgeId=?",[$badgeId])) {
my $item = WebGUI::Shop::TransactionItem->newByDynamicTransaction($self->session, $id);
if (defined $item) {
$item->issueCredit;
}
}
# refund any purchased ribbons related to the badge
foreach my $id ($db->buildArray("select transactionItemId from EMSRegistrantRibbon where badgeId=?",[$badgeId])) {
my $item = WebGUI::Shop::TransactionItem->newByDynamicTransaction($self->session, $id);
if (defined $item) {
$item->issueCredit;
}
}
# refund any purchased tokens related to this badge
foreach my $ids ($db->buildArray("select transactionItemIds from EMSRegistrantToken where badgeId=?",[$badgeId])) {
foreach my $id (split(',', $ids)) {
my $item = WebGUI::Shop::TransactionItem->newByDynamicTransaction($self->session, $id);
if (defined $item) {
$item->issueCredit;
}
}
}
# get rid of any items in the cart related to this badge
foreach my $cartitem (@{$self->getCart->getItems()}) {
my $sku = $cartitem->getSku;
if (isIn((ref $sku), qw(WebGUI::Asset::Sku::EMSTicket WebGUI::Asset::Sku::EMSRibbon WebGUI::Asset::Sku::EMSToken))) {
if ($sku->getOptions->{badgeId} eq $badgeId) {
$cartitem->remove;
}
}
}
# get rid ofthe badge itself
$db->write("delete from EMSRegistrant where transactionItemId=?",[$item->getId]);
return undef;
}
#-------------------------------------------------------------------
=head2 onRemoveFromCart ( item )
Destroys badge.
=cut
sub onRemoveFromCart {
my ($self, $item) = @_;
my $badgeId = $self->getOptions->{badgeId};
foreach my $cartitem (@{$item->cart->getItems()}) {
my $sku = $cartitem->getSku;
if (isIn((ref $sku), qw(WebGUI::Asset::Sku::EMSTicket WebGUI::Asset::Sku::EMSRibbon WebGUI::Asset::Sku::EMSToken))) {
if ($sku->getOptions->{badgeId} eq $badgeId) {
$cartitem->remove;
}
}
}
$self->session->db->deleteRow('EMSRegistrant','badgeId',$badgeId);
}
#-------------------------------------------------------------------
=head2 purge
Deletes all badges and things attached to the badges. No refunds are given.
=cut
sub purge {
my $self = shift;
my $db = $self->session->db;
$db->write("delete from EMSRegistrantTicket where badgeAssetId=?",[$self->getId]);
$db->write("delete from EMSRegistrantToken where badgeAssetId=?",[$self->getId]);
$db->write("delete from EMSRegistrantRibbon where badgeAssetId=?",[$self->getId]);
$db->write("delete from EMSRegistrant where badgeAssetId=?",[$self->getId]);
$self->SUPER::purge;
}
#-------------------------------------------------------------------
=head2 view
Displays badge description.
=cut
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->new->utf8->encode({
url => $self->getUrl,
}));
$book->submit(value=>$i18n->get("populate from address book"));
# instanciate address
my $address = WebGUI::Shop::AddressBook->newBySession($self->session)->getAddress($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',
label => $i18n->get('name','Shop'),
defaultValue => (defined $address) ? $address->get("name") : $form->get('name'),
);
$info->text(
name => 'organization',
label => $i18n->get('organization'),
defaultValue => $form->get("organization"),
);
$info->text(
name => 'address1',
label => $i18n->get('address','Shop'),
defaultValue => (defined $address) ? $address->get("address1") : $form->get('address1'),
);
$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',
label => $i18n->get('city','Shop'),
defaultValue => (defined $address) ? $address->get("city") : $form->get('city'),
);
$info->text(
name => 'state',
label => $i18n->get('state','Shop'),
defaultValue => (defined $address) ? $address->get("state") : $form->get('state'),
);
$info->zipcode(
name => 'zipcode',
label => $i18n->get('code','Shop'),
defaultValue => (defined $address) ? $address->get("code") : $form->get('zipcode','zipcode'),
);
$info->country(
name => 'country',
label => $i18n->get('country','Shop'),
defaultValue => (defined $address) ? $address->get("country") : ($form->get('country') || 'United States'),
);
$info->phone(
name => 'phoneNumber',
label => $i18n->get('phone number','Shop'),
defaultValue => (defined $address) ? $address->get("phoneNumber") : $form->get("phone","phone"),
);
$info->email(
name => 'email',
label => $i18n->get('email address'),
defaultValue => $form->get("email","email")
);
$info->submit(value=>$i18n->get('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;
}
#-------------------------------------------------------------------
=head2 www_addToCart
Processes form from view() and then adds to cart.
=cut
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_buildBadge($self->getOptions->{badgeId});
}
#-------------------------------------------------------------------
=head2 www_edit ()
Displays the edit form.
=cut
sub www_edit {
my ($self) = @_;
return $self->session->privilege->insufficient() unless $self->canEdit;
return $self->session->privilege->locked() unless $self->canEditIfLocked;
$self->session->style->setRawHeadTags(q|
<style type="text/css">
.forwardButton {
background-color: green;
color: white;
font-weight: bold;
padding: 3px;
}
.backwardButton {
background-color: red;
color: white;
font-weight: bold;
padding: 3px;
}
</style>
|);
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
return $self->processStyle('<h1>'.$i18n->get('ems badge').'</h1>'.$self->getEditForm->print);
}
1;

View file

@ -0,0 +1,279 @@
package WebGUI::Asset::Sku::EMSRibbon;
=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::HTMLForm;
=head1 NAME
Package WebGUI::Asset::Sku::EMSRibbon
=head1 DESCRIPTION
A ribbon for the Event Manager. Ribbons are like coupons that give you discounts on events.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::EMSRibbon;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 definition
Add price field to the definition.
=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_EventManagementSystem");
my $date = WebGUI::DateTime->new($session, time());
%properties = (
price => {
tab => "shop",
fieldType => "float",
defaultValue => 0.00,
label => $i18n->get("price"),
hoverHelp => $i18n->get("price help"),
},
percentageDiscount => {
tab => "shop",
fieldType => "float",
defaultValue => 10.0,
label => $i18n->get("percentage discount"),
hoverHelp => $i18n->get("percentage discount help"),
},
);
push(@{$definition}, {
assetName => $i18n->get('ems ribbon'),
icon => 'EMSRibbon.gif',
autoGenerateForms => 1,
tableName => 'EMSRibbon',
className => 'WebGUI::Asset::Sku::EMSRibbon',
properties => \%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle
Return title + badge holder name.
=cut
sub getConfiguredTitle {
my $self = shift;
my $name = $self->session->db->quickScalar("select name from EMSRegistrant where badgeId=?",[$self->getOptions->{badgeId}]);
return $self->getTitle." (".$name.")";
}
#-------------------------------------------------------------------
=head2 getMaxAllowedInCart
Return 1;
=cut
sub getMaxAllowedInCart {
return 1;
}
#-------------------------------------------------------------------
=head2 getPrice
Returns the price from the definition.
=cut
sub getPrice {
my $self = shift;
return $self->get("price");
}
#-------------------------------------------------------------------
=head2 onCompletePurchase
Does bookkeeping on EMSRegistrationRibbon table.
=cut
sub onCompletePurchase {
my ($self, $item) = @_;
$self->session->db->write("insert into EMSRegistrantRibbon (transactionItemId, ribbonAssetId, badgeId) values (?,?,?)",
[$item->getId, $self->getId, $self->getOptions->{badgeId}]);
return undef;
}
#-------------------------------------------------------------------
=head2 onRefund ( item)
Destroys the ribbon so that it can be resold.
=cut
sub onRefund {
my ($self, $item) = @_;
$self->session->db->write("delete from EMSRegistrantRibbon where transactionItemId=?",[$item->getId]);
return undef;
}
#-------------------------------------------------------------------
=head2 purge
Deletes all entries in EMSRegistrationRibbon table for this sku. No refunds are given.
=cut
sub purge {
my $self = shift;
$self->session->db->write("delete from EMSRegistrantRibbon where tokenAssetId=?",[$self->getId]);
$self->SUPER::purge;
}
#-------------------------------------------------------------------
=head2 view
Displays the ribbon description.
=cut
sub view {
my ($self) = @_;
# build objects we'll need
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
my $form = $self->session->form;
# render the page;
my $output = '<h1>'.$self->getTitle.'</h1>'
.'<p>'.$self->get('description').'</p>';
# build the add to cart form
if ($form->get('badgeId') ne '') {
my $addToCart = WebGUI::HTMLForm->new($self->session, action=>$self->getUrl);
$addToCart->hidden(name=>"func", value=>"addToCart");
$addToCart->hidden(name=>"badgeId", value=>$form->get('badgeId'));
$addToCart->submit(value=>$i18n->get('add to cart','Shop'), label=>$self->getPrice);
$output .= $addToCart->print;
}
return $output;
}
#-------------------------------------------------------------------
=head2 www_addToCart
Takes form variable badgeId and add the ribbon to the cart.
=cut
sub www_addToCart {
my ($self) = @_;
return $self->session->privilege->noAccess() unless $self->getParent->canView;
my $badgeId = $self->session->form->get('badgeId');
$self->addToCart({badgeId=>$badgeId});
return $self->getParent->www_buildBadge($badgeId);
}
#-------------------------------------------------------------------
=head2 www_delete
Override to return to appropriate page.
=cut
sub www_delete {
my ($self) = @_;
$self->SUPER::www_delete;
return $self->getParent->www_buildBadge(undef,'ribbons');
}
#-------------------------------------------------------------------
=head2 www_edit ()
Displays the edit form.
=cut
sub www_edit {
my ($self) = @_;
return $self->session->privilege->insufficient() unless $self->canEdit;
return $self->session->privilege->locked() unless $self->canEditIfLocked;
$self->session->style->setRawHeadTags(q|
<style type="text/css">
.forwardButton {
background-color: green;
color: white;
font-weight: bold;
padding: 3px;
}
.backwardButton {
background-color: red;
color: white;
font-weight: bold;
padding: 3px;
}
</style>
|);
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
my $form = $self->getEditForm;
$form->hidden({name=>'proceed', value=>'viewAll'});
return $self->processStyle('<h1>'.$i18n->get('ems ribbon').'</h1>'.$form->print);
}
#-------------------------------------------------------------------
=head2 www_viewAll ()
Displays the list of ribbons in the parent.
=cut
sub www_viewAll {
my $self = shift;
return $self->getParent->www_buildBadge(undef,"ribbons");
}
1;

View file

@ -0,0 +1,533 @@
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 base 'WebGUI::Asset::Sku';
use Tie::IxHash;
use JSON;
=head1 NAME
Package WebGUI::Asset::Sku::EMSTicket
=head1 DESCRIPTION
A ticket for the Event Manager. Tickets allow you into invidivual events at a convention.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::EMSTicket;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 addToCart ( {badgeId=>$badgeId })
Does some bookkeeping to keep track of limited quantities of tickets that are available, then adds to cart.
=cut
sub addToCart {
my ($self, $badgeInfo) = @_;
my $db = $self->session->db;
my @params = ($badgeInfo->{badgeId},$self->getId);
# don't let them add a ticket they already have
unless ($db->quickScalar("select count(*) from EMSRegistrantTicket where badgeId=? and ticketAssetId=?",\@params)) {
$db->write("insert into EMSRegistrantTicket (badgeId, ticketAssetId) values (?,?)", \@params);
$self->SUPER::addToCart($badgeInfo);
}
}
#-------------------------------------------------------------------
=head2 definition
Adds price, seatsAvailable, eventNumber, startDate, endDate and relatedBadges 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_EventManagementSystem");
my $date = WebGUI::DateTime->new($session, time());
%properties = (
price => {
tab => "shop",
fieldType => "float",
defaultValue => 0.00,
label => $i18n->get("price"),
hoverHelp => $i18n->get("price help"),
},
seatsAvailable => {
tab => "shop",
fieldType => "integer",
defaultValue => 25,
label => $i18n->get("seats available"),
hoverHelp => $i18n->get("seats available help"),
},
eventNumber => {
tab => "properties",
fieldType => "integer",
customDrawMethod=> 'drawEventNumberField',
label => $i18n->get("event number"),
hoverHelp => $i18n->get("event number help"),
},
startDate => {
tab => "properties",
fieldType => "dateTime",
defaultValue => $date->toDatabase,
label => $i18n->get("event start date"),
hoverHelp => $i18n->get("start date help"),
},
duration => {
tab => "properties",
fieldType => "float",
defaultValue => 1.0,
subtext => $i18n->get('hours'),
label => $i18n->get("duration"),
hoverHelp => $i18n->get("duration help"),
},
location => {
fieldType => "combo",
tab => "properties",
customDrawMethod=> 'drawLocationField',
label => $i18n->get("location"),
hoverHelp => $i18n->get("location help"),
},
relatedBadgeGroups => {
tab => "properties",
fieldType => "checkList",
customDrawMethod=> 'drawRelatedBadgeGroupsField',
label => $i18n->get("related badge groups"),
hoverHelp => $i18n->get("related badge groups ticket help"),
},
relatedRibbons => {
tab => "properties",
fieldType => "checkList",
customDrawMethod=> 'drawRelatedRibbonsField',
label => $i18n->get("related ribbons"),
hoverHelp => $i18n->get("related ribbons help"),
},
eventMetaData => {
noFormPost => 1,
fieldType => "hidden",
defaultValue => '{}',
},
);
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);
}
#-------------------------------------------------------------------
=head2 drawEventNumberField ()
Draws the field for the eventNumber property.
=cut
sub drawEventNumberField {
my ($self, $params) = @_;
my $default = $self->session->db->quickScalar("select max(eventNumber)+1 from EMSTicket left join asset using (assetId)
where parentId=?",[$self->get('parentId')]);
return WebGUI::Form::integer($self->session, {
name => $params->{name},
value => $self->get($params->{name}),
defaultValue => $default,
});
}
#-------------------------------------------------------------------
=head2 drawLocationField ()
Draws the field for the location property.
=cut
sub drawLocationField {
my ($self, $params) = @_;
my $options = $self->session->db->buildHashRef("select distinct(location) from EMSTicket left join asset using (assetId)
where parentId=? order by location",[$self->get('parentId')]);
return WebGUI::Form::combo($self->session, {
name => $params->{name},
value => $self->get($params->{name}),
options => $options,
});
}
#-------------------------------------------------------------------
=head2 drawRelatedBadgeGroupsField ()
Draws the field for the relatedBadgeGroups property.
=cut
sub drawRelatedBadgeGroupsField {
my ($self, $params) = @_;
return WebGUI::Form::checkList($self->session, {
name => $params->{name},
value => $self->get($params->{name}),
vertical => 1,
options => $self->getParent->getBadgeGroups,
});
}
#-------------------------------------------------------------------
=head2 drawRelatedRibbonsField ()
Draws the field for the relatedRibbons property.
=cut
sub drawRelatedRibbonsField {
my ($self, $params) = @_;
my %ribbons = ();
foreach my $ribbon (@{$self->getParent->getRibbons}) {
$ribbons{$ribbon->getId} = $ribbon->getTitle;
}
return WebGUI::Form::checkList($self->session, {
name => $params->{name},
value => $self->get($params->{name}),
vertical => 1,
options => \%ribbons,
});
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle
Returns title + badgeholder name.
=cut
sub getConfiguredTitle {
my $self = shift;
my $name = $self->session->db->quickScalar("select name from EMSRegistrant where badgeId=?",[$self->getOptions->{badgeId}]);
return $self->getTitle." (".$name.")";
}
#-------------------------------------------------------------------
=head2 getEditForm ()
Extended to support event metadata.
=cut
sub getEditForm {
my $self = shift;
my $form = $self->SUPER::getEditForm(@_);
my $metadata = JSON->new->utf8->decode($self->get("eventMetaData") || '{}');
foreach my $field (@{$self->getParent->getEventMetaFields}) {
$form->getTab("meta")->DynamicField(
name => "eventmeta ".$field->{label},
value => $metadata->{$field->{label}},
defaultValue => $field->{defaultValues},
options => $field->{possibleValues},
fieldType => $field->{dataType},
label => $field->{label},
);
}
return $form;
}
#-------------------------------------------------------------------
=head2 getMaxAllowedInCart
Returns 1.
=cut
sub getMaxAllowedInCart {
return 1;
}
#-------------------------------------------------------------------
=head2 getPrice
Returns the value of the price field, after applying ribbon discounts.
=cut
sub getPrice {
my $self = shift;
my @ribbonIds = split("\n", $self->get('relatedRibbons'));
my $price = $self->get("price");
my $discount = 0;
my $badgeId = $self->getOptions->{badgeId};
my $ribbonId = $self->session->db->quickScalar("select ribbonAssetId from EMSRegistrantRibbon where badgeId=? limit 1",[$badgeId]);
if (defined $ribbonId) {
my $ribbon = WebGUI::Asset->new($self->session,$ribbonId,'WebGUI::Asset::Sku::EMSRibbon');
$discount = $ribbon->get('percentageDiscount');
}
else {
foreach my $item (@{$self->getCart->getItemsByAssetId(\@ribbonIds)}) {
if ($item->get('options')->{badgeId} eq $badgeId) {
my $ribbon = $item->getSku;
$discount = $ribbon->get('percentageDiscount');
last;
}
}
}
$price -= ($price * $discount / 100);
return $price;
}
#-------------------------------------------------------------------
=head2 getQuantityAvailable
Returns seatsAvailable minus the count from the EMSRegistrantTicket table.
=cut
sub getQuantityAvailable {
my $self = shift;
my $seatsTaken = $self->session->db->quickScalar("select count(*) from EMSRegistrantTicket where ticketAssetId=?",[$self->getId]);
return $self->get("seatsAvailable") - $seatsTaken;
}
#-------------------------------------------------------------------
=head2 indexContent ( )
Adding location and eventNumber as a keyword. See WebGUI::Asset::indexContent() for additonal details.
=cut
sub indexContent {
my $self = shift;
my $indexer = $self->SUPER::indexContent;
$indexer->addKeywords($self->get('location').' '.$self->get('eventNumber'));
return $indexer;
}
#-------------------------------------------------------------------
=head2 onCompletePurchase
Marks the ticket as purchased.
=cut
sub onCompletePurchase {
my ($self, $item) = @_;
$self->session->db->write("update EMSRegistrantTicket set purchaseComplete=1, transactionItemId=? where ticketAssetId=? and badgeId=?",
[$item->getId, $self->getId, $self->getOptions->{badgeId}]);
return undef;
}
#-------------------------------------------------------------------
=head2 onRefund ( item)
Destroys the ticket so that it can be resold.
=cut
sub onRefund {
my ($self, $item) = @_;
$self->session->db->write("delete from EMSRegistrantTicket where transactionItemId=?",[$item->getId]);
return undef;
}
#-------------------------------------------------------------------
=head2 onRemoveFromCart
Frees up the ticket to be purchased by someone else.
=cut
sub onRemoveFromCart {
my ($self, $item) = @_;
$self->session->db->write("delete from EMSRegistrantTicket where ticketAssetId=? and badgeId=?",
[$self->getId, $self->getOptions->{badgeId}]);
}
#-------------------------------------------------------------------
=head2 processPropertiesFromFormPost ( )
Extended to support event meta fields.
=cut
sub processPropertiesFromFormPost {
my $self = shift;
$self->SUPER::processPropertiesFromFormPost(@_);
my $form = $self->session->form;
my %metadata = ();
foreach my $field (@{$self->getParent->getEventMetaFields}) {
$metadata{$field->{label}} = $form->process('eventmeta '.$field->{label}, $field->{dataType},
{ defaultValue => $field->{defaultValues}, options => $field->{possibleValues}});
}
$self->update({eventMetaData => JSON->new->utf8->encode(\%metadata)});
}
#-------------------------------------------------------------------
=head2 purge
Deletes all ticket purchases of this type. No refunds are given.
=cut
sub purge {
my $self = shift;
$self->session->db->write("delete from EMSRegistrantTicket where ticketAssetId=?",[$self->getId]);
$self->SUPER::purge;
}
#-------------------------------------------------------------------
=head2 view
Displays the ticket description.
=cut
sub view {
my ($self) = @_;
# build objects we'll need
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
my $form = $self->session->form;
# render the page;
my $output = '<h1>'.$self->getTitle.' ('.$self->get('eventNumber').')</h1>'
.'<p>'.$self->get('description').'</p>'
.'<p>'.$self->get('startDate').'</p>';
# build the add to cart form
if ($form->get('badgeId') ne '') {
my $addToCart = WebGUI::HTMLForm->new($self->session, action=>$self->getUrl);
$addToCart->hidden(name=>"func", value=>"addToCart");
$addToCart->hidden(name=>"badgeId", value=>$form->get('badgeId'));
$addToCart->submit(value=>$i18n->get('add to cart','Shop'), label=>$self->getPrice);
$output .= $addToCart->print;
}
return $output;
}
#-------------------------------------------------------------------
=head2 www_addToCart
Takes form variable badgeId and add the ticket to the cart.
=cut
sub www_addToCart {
my ($self) = @_;
return $self->session->privilege->noAccess() unless $self->getParent->canView;
my $badgeId = $self->session->form->get('badgeId');
$self->addToCart({badgeId=>$badgeId});
return $self->getParent->www_buildBadge($badgeId);
}
#-------------------------------------------------------------------
=head2 www_delete
Override to return to appropriate page.
=cut
sub www_delete {
my ($self) = @_;
$self->SUPER::www_delete;
return $self->getParent->www_buildBadge(undef,'tickets');
}
#-------------------------------------------------------------------
=head2 www_edit ()
Displays the edit form.
=cut
sub www_edit {
my ($self) = @_;
return $self->session->privilege->insufficient() unless $self->canEdit;
return $self->session->privilege->locked() unless $self->canEditIfLocked;
$self->session->style->setRawHeadTags(q|
<style type="text/css">
.forwardButton {
background-color: green;
color: white;
font-weight: bold;
padding: 3px;
}
.backwardButton {
background-color: red;
color: white;
font-weight: bold;
padding: 3px;
}
</style>
|);
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
my $form = $self->getEditForm;
$form->hidden({name=>'proceed', value=>'viewAll'});
return $self->processStyle('<h1>'.$i18n->get('ems ticket').'</h1>'.$form->print);
}
#-------------------------------------------------------------------
=head2 www_viewAll ()
Displays the list of tickets in the parent.
=cut
sub www_viewAll {
my $self = shift;
return $self->getParent->www_buildBadge(undef,"tickets");
}
1;

View file

@ -0,0 +1,285 @@
package WebGUI::Asset::Sku::EMSToken;
=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::EMSToken
=head1 DESCRIPTION
A token for the Event Manager. Tokens are like convention currency.
=head1 SYNOPSIS
use WebGUI::Asset::Sku::EMSToken;
=head1 METHODS
These methods are available from this class:
=cut
#-------------------------------------------------------------------
=head2 definition
Adds price field.
=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_EventManagementSystem");
my $date = WebGUI::DateTime->new($session, time());
%properties = (
price => {
tab => "shop",
fieldType => "float",
defaultValue => 0.00,
label => $i18n->get("price"),
hoverHelp => $i18n->get("price help"),
},
);
push(@{$definition}, {
assetName => $i18n->get('ems token'),
icon => 'EMSToken.gif',
autoGenerateForms => 1,
tableName => 'EMSToken',
className => 'WebGUI::Asset::Sku::EMSToken',
properties => \%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
=head2 getConfiguredTitle
Returns title + badgeholder name.
=cut
sub getConfiguredTitle {
my $self = shift;
my $name = $self->session->db->quickScalar("select name from EMSRegistrant where badgeId=?",[$self->getOptions->{badgeId}]);
return $self->getTitle." (".$name.")";
}
#-------------------------------------------------------------------
=head2 getPrice
Returns the value of the price field.
=cut
sub getPrice {
my $self = shift;
return $self->get("price");
}
#-------------------------------------------------------------------
=head2 onCompletePurchase
Adds tokens to the badge.
=cut
sub onCompletePurchase {
my ($self, $item) = @_;
my $db = $self->session->db;
my @params = ($self->getId, $self->getOptions->{badgeId});
my ($currentQuantity, $currentItemIds) = $db->quickArray("select quantity, transactionItemids from EMSRegistrantToken where tokenAssetId=? and badgeId=?",\@params);
unshift @params, $item->get("quantity");
if (defined $currentQuantity) {
unshift @params, join(",", $currentItemIds, $item->getId);
$db->write("update EMSRegistrantToken set transactionItemIds=?, quantity=quantity+? where tokenAssetId=? and badgeId=?",\@params);
}
else {
unshift @params, $item->getId;
$db->write("insert into EMSRegistrantToken (transactionItemIds, quantity, tokenAssetId, badgeId) values (?,?,?,?)",\@params);
}
return undef;
}
#-------------------------------------------------------------------
=head2 onRefund ( item)
Destroys the token so that it can be resold.
=cut
sub onRefund {
my ($self, $item) = @_;
my $db = $self->session->db;
my $token = $db->quickHashRef("select * from EMSRegistrantToken where transactionItemIds like ?",['%'.$item->getId.'%']);
my @itemIds = split ',', $token->{transactionItemIds};
for (my $i=0; $i<scalar @itemIds; $i++) {
if ($itemIds[$i] eq $item->getId) {
delete $itemIds[$i];
}
}
if (scalar @itemIds < 2) {
$db->write("delete from EMSRegistrantToken where badgeId=? and tokenAssetId=?",[$token->{badgeId}, $self->getId]);
}
else {
$db->write("update EMSRegistrantToken set quantity=?, transactionItemIds=? where badgeId=? and tokenAssetId=?",
[($token->{quantity} - $item->get('quantity')), join(',', @itemIds), $token->{badgeId}, $self->getId]);
}
return undef;
}
#-------------------------------------------------------------------
=head2 purge
Destroys all tokens of this type. No refunds are given.
=cut
sub purge {
my $self = shift;
$self->session->db->write("delete from EMSRegistrantToken where tokenAssetId=?",[$self->getId]);
$self->SUPER::purge;
}
#-------------------------------------------------------------------
=head2 view
Displays the token description.
=cut
sub view {
my ($self) = @_;
# build objects we'll need
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
my $form = $self->session->form;
# render the page;
my $output = '<h1>'.$self->getTitle.'</h1>'
.'<p>'.$self->get('description').'</p>';
# build the add to cart form
if ($form->get('badgeId') ne '') {
my $addToCart = WebGUI::HTMLForm->new($self->session, action=>$self->getUrl);
$addToCart->hidden(name=>"func", value=>"addToCart");
$addToCart->hidden(name=>"badgeId", value=>$form->get('badgeId'));
$addToCart->integer(name=>'quantity', value=>1, label=>$i18n->get('quantity','Shop'));
$addToCart->submit(value=>$i18n->get('add to cart','Shop'), label=>$self->getPrice);
$output .= $addToCart->print;
}
return $output;
}
#-------------------------------------------------------------------
=head2 www_addToCart
Takes form variable badgeId and add the token to the cart.
=cut
sub www_addToCart {
my ($self) = @_;
return $self->session->privilege->noAccess() unless $self->getParent->canView;
my $badgeId = $self->session->form->get('badgeId');
$self->addToCart({badgeId=>$badgeId});
return $self->getParent->www_buildBadge($badgeId);
}
#-------------------------------------------------------------------
=head2 www_delete
Override to return to appropriate page.
=cut
sub www_delete {
my ($self) = @_;
$self->SUPER::www_delete;
return $self->getParent->www_buildBadge(undef,'tokens');
}
#-------------------------------------------------------------------
=head2 www_edit ()
Displays the edit form.
=cut
sub www_edit {
my ($self) = @_;
return $self->session->privilege->insufficient() unless $self->canEdit;
return $self->session->privilege->locked() unless $self->canEditIfLocked;
$self->session->style->setRawHeadTags(q|
<style type="text/css">
.forwardButton {
background-color: green;
color: white;
font-weight: bold;
padding: 3px;
}
.backwardButton {
background-color: red;
color: white;
font-weight: bold;
padding: 3px;
}
</style>
|);
my $i18n = WebGUI::International->new($self->session, "Asset_EventManagementSystem");
my $form = $self->getEditForm;
$form->hidden({name=>'proceed', value=>'viewAll'});
return $self->processStyle('<h1>'.$i18n->get('ems token').'</h1>'.$form->print);
}
#-------------------------------------------------------------------
=head2 www_viewAll ()
Displays the list of tokens in the parent.
=cut
sub www_viewAll {
my $self = shift;
return $self->getParent->www_buildBadge(undef,"tokens");
}
1;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff