added in-store credit
added refund mechanism modified ems to use refund mechanism
This commit is contained in:
parent
9d99c7e71d
commit
8d03655bdb
14 changed files with 441 additions and 43 deletions
|
|
@ -384,7 +384,7 @@ tasks to be performed. It should be overriden by subclasses that need to do spec
|
|||
|
||||
=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.
|
||||
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
|
||||
|
||||
|
|
@ -395,6 +395,23 @@ sub onCompletePurchase {
|
|||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=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.
|
||||
|
|
|
|||
|
|
@ -193,12 +193,67 @@ sub onCompletePurchase {
|
|||
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.
|
||||
|
|
@ -209,8 +264,9 @@ sub onRemoveFromCart {
|
|||
my ($self, $item) = @_;
|
||||
my $badgeId = $self->getOptions->{badgeId};
|
||||
foreach my $cartitem (@{$item->cart->getItems()}) {
|
||||
if (isIn((ref $cartitem), qw(WebGUI::Asset::Sku::EMSTicket WebGUI::Asset::Sku::EMSRibbon WebGUI::Asset::Sku::EMSToken))) {
|
||||
if ($cartitem->getSku->getOptions->{badgeId} eq $badgeId) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -255,7 +311,7 @@ sub view {
|
|||
my $book = WebGUI::HTMLForm->new($self->session, action=>$self->getUrl);
|
||||
$book->hidden(name=>"shop", value=>"address");
|
||||
$book->hidden(name=>"method", value=>"view");
|
||||
$book->hidden(name=>"callback", value=>JSON::to_json({
|
||||
$book->hidden(name=>"callback", value=>JSON->new->utf8->encode({
|
||||
url => $self->getUrl,
|
||||
}));
|
||||
$book->submit(value=>$i18n->get("populate from address book"));
|
||||
|
|
|
|||
|
|
@ -132,8 +132,22 @@ Does bookkeeping on EMSRegistrationRibbon table.
|
|||
|
||||
sub onCompletePurchase {
|
||||
my ($self, $item) = @_;
|
||||
$self->session->db->write("insert into EMSRegistrantRibbon (ribbonAssetId, badgeId) values (?,?)",
|
||||
[$self->getId, $self->getOptions->{badgeId}]);
|
||||
$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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ Extended to support event metadata.
|
|||
sub getEditForm {
|
||||
my $self = shift;
|
||||
my $form = $self->SUPER::getEditForm(@_);
|
||||
my $metadata = JSON->new->decode($self->get("eventMetaData") || '{}');
|
||||
my $metadata = JSON->new->utf8->decode($self->get("eventMetaData") || '{}');
|
||||
foreach my $field (@{$self->getParent->getEventMetaFields}) {
|
||||
$form->getTab("meta")->DynamicField(
|
||||
name => "eventmeta ".$field->{label},
|
||||
|
|
@ -293,7 +293,7 @@ sub getPrice {
|
|||
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::Ribbon');
|
||||
my $ribbon = WebGUI::Asset->new($self->session,$ribbonId,'WebGUI::Asset::Sku::EMSRibbon');
|
||||
$discount = $ribbon->get('percentageDiscount');
|
||||
}
|
||||
else {
|
||||
|
|
@ -350,8 +350,22 @@ Marks the ticket as purchased.
|
|||
|
||||
sub onCompletePurchase {
|
||||
my ($self, $item) = @_;
|
||||
$self->session->db->write("update EMSRegistrantTicket set purchaseComplete=1 where ticketAssetId=? and badgeId=?",
|
||||
[$self->getId, $self->getOptions->{badgeId}]);
|
||||
$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;
|
||||
}
|
||||
|
||||
|
|
@ -386,7 +400,7 @@ sub processPropertiesFromFormPost {
|
|||
$metadata{$field->{label}} = $form->process('eventmeta '.$field->{label}, $field->{dataType},
|
||||
{ defaultValue => $field->{defaultValues}, options => $field->{possibleValues}});
|
||||
}
|
||||
$self->update({eventMetaData => JSON->new->encode(\%metadata)});
|
||||
$self->update({eventMetaData => JSON->new->utf8->encode(\%metadata)});
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -115,13 +115,43 @@ sub onCompletePurchase {
|
|||
my ($self, $item) = @_;
|
||||
my $db = $self->session->db;
|
||||
my @params = ($self->getId, $self->getOptions->{badgeId});
|
||||
my $currentQuantity = $db->quickScalar("select quantity from EMSRegistrantToken where tokenAssetId=? and badgeId=?",\@params);
|
||||
my ($currentQuantity, $currentItemIds) = $db->quickArray("select quantity, transactionItemids from EMSRegistrantToken where tokenAssetId=? and badgeId=?",\@params);
|
||||
unshift @params, $item->get("quantity");
|
||||
if (defined $currentQuantity) {
|
||||
$db->write("update EMSRegistrantToken set quantity=quantity+? where tokenAssetId=? and badgeId=?",\@params);
|
||||
unshift @params, join(",", $currentItemIds, $item->getId);
|
||||
$db->write("update EMSRegistrantToken set transactionItemIds=?, quantity=quantity+? where tokenAssetId=? and badgeId=?",\@params);
|
||||
}
|
||||
else {
|
||||
$db->write("insert into EMSRegistrantToken (quantity, tokenAssetId, badgeId) values (?,?,?)",\@params);
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -642,6 +642,7 @@ sub www_editRegistrantSave {
|
|||
foreach my $field (qw(name address1 address2 address3 city state organization notes)) {
|
||||
$badgeInfo{$field} = $form->get($field, "text");
|
||||
}
|
||||
$badgeInfo{'userId'} = $form->get('userId', 'user');
|
||||
$badgeInfo{'phoneNumber'} = $form->get('phoneNumber', 'phone');
|
||||
$badgeInfo{'email'} = $form->get('email', 'email');
|
||||
$badgeInfo{'country'} = $form->get('country', 'country');
|
||||
|
|
@ -681,7 +682,7 @@ sub www_getBadgesAsJson {
|
|||
$results{'sort'} = undef;
|
||||
$results{'dir'} = "asc";
|
||||
$session->http->setMimeType('text/json');
|
||||
return JSON->new->encode(\%results);
|
||||
return JSON->new->utf8->encode(\%results);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -811,7 +812,7 @@ sub www_getRegistrantAsJson {
|
|||
$badgeInfo->{ribbons} = \@ribbons;
|
||||
|
||||
# build json datasource
|
||||
return JSON->new->encode($badgeInfo);
|
||||
return JSON->new->utf8->encode($badgeInfo);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -871,7 +872,7 @@ sub www_getRegistrantsAsJson {
|
|||
|
||||
# build json datasource
|
||||
$session->http->setMimeType('text/json');
|
||||
return JSON->new->encode(\%results);
|
||||
return JSON->new->utf8->encode(\%results);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -905,7 +906,7 @@ sub www_getRibbonsAsJson {
|
|||
$results{'sort'} = undef;
|
||||
$results{'dir'} = "asc";
|
||||
$session->http->setMimeType('text/json');
|
||||
return JSON->new->encode(\%results);
|
||||
return JSON->new->utf8->encode(\%results);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1046,7 +1047,7 @@ sub www_getTicketsAsJson {
|
|||
$results{'sort'} = undef;
|
||||
$results{'dir'} = "asc";
|
||||
$session->http->setMimeType('text/json');
|
||||
return JSON->new->encode(\%results);
|
||||
return JSON->new->utf8->encode(\%results);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1080,7 +1081,7 @@ sub www_getTokensAsJson {
|
|||
$results{'sort'} = undef;
|
||||
$results{'dir'} = "asc";
|
||||
$session->http->setMimeType('text/json');
|
||||
return JSON->new->encode(\%results);
|
||||
return JSON->new->utf8->encode(\%results);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -1194,13 +1195,27 @@ sub www_manageRegistrant {
|
|||
my $badgeId = $self->session->form->get('badgeId');
|
||||
my $db = $session->db;
|
||||
my $i18n = WebGUI::International->new($session, "Asset_EventManagementSystem");
|
||||
my $registrant = $self->getRegistrant($badgeId);
|
||||
|
||||
# show lookup registrant if registrant requested doesn't exist
|
||||
unless ($registrant->{badgeId} ne "") {
|
||||
return $self->www_lookupRegistrant;
|
||||
}
|
||||
|
||||
# build form
|
||||
my $registrant = $self->getRegistrant($badgeId);
|
||||
my $f = WebGUI::HTMLForm->new($session, action=>$self->getUrl);
|
||||
my $f = WebGUI::HTMLForm->new($session, action=>$self->getUrl, tableExtras=>'class="manageRegistrant"');
|
||||
$f->submit;
|
||||
$f->hidden(name=>"func", value=>"editRegistrantSave");
|
||||
$f->hidden(name=>'badgeId', value=>$badgeId);
|
||||
$f->readOnly(
|
||||
label => $i18n->get('badge number'),
|
||||
value => $registrant->{badgeNumber},
|
||||
);
|
||||
$f->user(
|
||||
name => 'userId',
|
||||
label => $i18n->get('user'),
|
||||
defaultValue => $registrant->{userId},
|
||||
);
|
||||
$f->text(
|
||||
name => 'name',
|
||||
label => $i18n->get('name','Shop'),
|
||||
|
|
@ -1270,7 +1285,7 @@ sub www_manageRegistrant {
|
|||
• <a href="|.$self->getUrl.q|">|.$i18n->get('buy badge').q|</a>
|
||||
</div>
|
||||
<div id="bd">
|
||||
<div class="yui-g">
|
||||
<div class="yui-gc">
|
||||
<div class="yui-u first">
|
||||
|.$f->print.q|
|
||||
</div>
|
||||
|
|
@ -1288,7 +1303,7 @@ sub www_manageRegistrant {
|
|||
my $badge = WebGUI::Asset::Sku::EMSBadge->new($session, $registrant->{badgeAssetId});
|
||||
$output .= q|<p><b style="font-size: 150%; line-height: 150%;">|.$badge->getTitle.q|</b><br />
|
||||
<a href="|.$self->getUrl('func=printBadge;badgeId='.$badgeId).q|" target="_blank">|.$i18n->get('print').q|</a>
|
||||
• <a href="">|.$i18n->get('refund').q|</a>
|
||||
• <a href="|.$self->getUrl('func=refundItem;badgeId='.$badgeId.';transactionItemId='.$registrant->{transactionItemId}).q|">|.$i18n->get('refund').q|</a>
|
||||
• |;
|
||||
if ($registrant->{hasCheckedIn}) {
|
||||
$output .= q|<a href="|.$self->getUrl('func=toggleRegistrantCheckedIn;badgeId='.$badgeId).q|">|.$i18n->get('mark as not checked in').q|</a>|;
|
||||
|
|
@ -1301,30 +1316,31 @@ sub www_manageRegistrant {
|
|||
</p><br />|;
|
||||
|
||||
# ticket management
|
||||
my $existingTickets = $db->read("select ticketAssetId from EMSRegistrantTicket where badgeId=? and purchaseComplete=1",[$badgeId]);
|
||||
while (my ($id) = $existingTickets->array) {
|
||||
my $existingTickets = $db->read("select ticketAssetId, transactionItemId from EMSRegistrantTicket where badgeId=? and purchaseComplete=1",[$badgeId]);
|
||||
while (my ($id, $itemId) = $existingTickets->array) {
|
||||
my $ticket = WebGUI::Asset::Sku::EMSTicket->new($session, $id);
|
||||
$output .= q|<p><b>|.$ticket->getTitle.q|</b><br />
|
||||
<a href="|.$self->getUrl('func=printTicket;badgeId='.$badgeId.';ticketAssetId='.$id).q|" target="_blank">|.$i18n->get('print').q|</a>
|
||||
• <a href="">|.$i18n->get('refund').q|</a>
|
||||
• <a href="|.$self->getUrl('func=refundItem;badgeId='.$badgeId.';transactionItemId='.$itemId).q|">|.$i18n->get('refund').q|</a>
|
||||
</p><br />|;
|
||||
}
|
||||
|
||||
# ribbon management
|
||||
my $existingRibbons = $db->read("select ribbonAssetId from EMSRegistrantRibbon where badgeId=?",[$badgeId]);
|
||||
while (my ($id) = $existingRibbons->array) {
|
||||
my $existingRibbons = $db->read("select ribbonAssetId, transactionItemId from EMSRegistrantRibbon where badgeId=?",[$badgeId]);
|
||||
while (my ($id, $itemId) = $existingRibbons->array) {
|
||||
my $ribbon = WebGUI::Asset::Sku::EMSRibbon->new($session, $id);
|
||||
$output .= q|<p><b>|.$ribbon->getTitle.q|</b><br />
|
||||
<a href="">|.$i18n->get('refund').q|</a>
|
||||
<a href="|.$self->getUrl('func=refundItem;badgeId='.$badgeId.';transactionItemId='.$itemId).q|">|.$i18n->get('refund').q|</a>
|
||||
</p><br />|;
|
||||
}
|
||||
|
||||
# token management
|
||||
my $existingTokens = $db->read("select tokenAssetId,quantity from EMSRegistrantToken where badgeId=?",[$badgeId]);
|
||||
while (my ($id, $quantity) = $existingTokens->array) {
|
||||
my $existingTokens = $db->read("select tokenAssetId,quantity,transactionItemIds from EMSRegistrantToken where badgeId=?",[$badgeId]);
|
||||
while (my ($id, $quantity, $itemIds) = $existingTokens->array) {
|
||||
my $token = WebGUI::Asset::Sku::EMSToken->new($session, $id);
|
||||
my @itemIds = split(',', $itemIds);
|
||||
$output .= q|<p><b>|.$token->getTitle.q|</b> (|.$quantity.q|)<br />
|
||||
<a href="">|.$i18n->get('refund').q|</a>
|
||||
<a href="|.$self->getUrl('func=refundItem;badgeId='.$badgeId.';transactionItemId='.join(';transactionItemId=', @itemIds)).q|">|.$i18n->get('refund').q|</a>
|
||||
</p><br />|;
|
||||
}
|
||||
|
||||
|
|
@ -1338,6 +1354,11 @@ sub www_manageRegistrant {
|
|||
|
||||
# render
|
||||
$session->style->setLink($session->url->extras('/yui/build/reset-fonts-grids/reset-fonts-grids.css'), {rel=>"stylesheet", type=>"text/css"});
|
||||
$session->style->setRawHeadTags(q|
|
||||
<style type="text/css">
|
||||
.manageRegistrant tbody tr td { padding: 2px;}
|
||||
</style>
|
||||
|);
|
||||
return $self->processStyle($output);
|
||||
}
|
||||
|
||||
|
|
@ -1414,6 +1435,29 @@ sub www_printTicket {
|
|||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 www_refundItem ()
|
||||
|
||||
Removes a ribbon, token, or ticket or badge that is attached to a registrant.
|
||||
|
||||
=cut
|
||||
|
||||
sub www_refundItem {
|
||||
my $self = shift;
|
||||
my $session = $self->session;
|
||||
return $session->privilege->insufficient() unless $self->canView;
|
||||
my @itemIds = $session->form->param("transactionItemId");
|
||||
foreach my $id (@itemIds) {
|
||||
my $item = WebGUI::Shop::TransactionItem->newByDynamicTransaction($session, $id);
|
||||
if (defined $item) {
|
||||
$item->issueCredit;
|
||||
}
|
||||
}
|
||||
return $self->www_manageRegistrant();
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 www_removeItemFromBadge ()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue