merging commerce branch back into head
This commit is contained in:
commit
5fb4807edc
1326 changed files with 55293 additions and 41167 deletions
471
lib/WebGUI/Asset/Sku.pm
Normal file
471
lib/WebGUI/Asset/Sku.pm
Normal 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;
|
||||
179
lib/WebGUI/Asset/Sku/Donation.pm
Normal file
179
lib/WebGUI/Asset/Sku/Donation.pm
Normal 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;
|
||||
468
lib/WebGUI/Asset/Sku/EMSBadge.pm
Normal file
468
lib/WebGUI/Asset/Sku/EMSBadge.pm
Normal 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;
|
||||
279
lib/WebGUI/Asset/Sku/EMSRibbon.pm
Normal file
279
lib/WebGUI/Asset/Sku/EMSRibbon.pm
Normal 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;
|
||||
533
lib/WebGUI/Asset/Sku/EMSTicket.pm
Normal file
533
lib/WebGUI/Asset/Sku/EMSTicket.pm
Normal 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;
|
||||
285
lib/WebGUI/Asset/Sku/EMSToken.pm
Normal file
285
lib/WebGUI/Asset/Sku/EMSToken.pm
Normal 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;
|
||||
1344
lib/WebGUI/Asset/Sku/Product.pm
Normal file
1344
lib/WebGUI/Asset/Sku/Product.pm
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue