diff --git a/lib/WebGUI/Shop/Tax.pm b/lib/WebGUI/Shop/Tax.pm index e59a8a2d6..07d877157 100644 --- a/lib/WebGUI/Shop/Tax.pm +++ b/lib/WebGUI/Shop/Tax.pm @@ -6,6 +6,7 @@ use Class::InsideOut qw{ :std }; use WebGUI::Text; use WebGUI::Storage; use WebGUI::Exception::Shop; +use WebGUI::Shop::Admin; use WebGUI::Shop::Cart; use WebGUI::Shop::CartItem; use List::Util qw{sum}; @@ -139,25 +140,6 @@ sub calculate { #------------------------------------------------------------------- -=head2 canEdit ( [ $user ] ) - -Determine whether or not a user can perform commerce functions - -=head3 $user - -An optional WebGUI::User object to check for permission to do commerce functions. If -this is not used, it uses the current session user object. - -=cut - -sub canEdit { - my $self = shift; - my $user = shift || $self->session->user; - return $user->isInGroup( $self->session->get('groupIdAdminCommerce')); -} - -#------------------------------------------------------------------- - =head2 delete ( [$params] ) Deletes data from the tax table by taxId. @@ -357,6 +339,56 @@ Accessor for the session object. Returns the session object. #------------------------------------------------------------------- +=head2 www_getTaxesAsJson ( ) + +Servers side pagination for tax data that is sent as JSON back to the browser to be +displayed in a YUI DataTable. + +=cut + +sub www_getTaxesAsJson { + my ($self) = @_; + my $session = $self->session; + my $admin = WebGUI::Shop::Admin->new($session); + return $session->privilege->insufficient + unless $admin->canManage; + my ($db, $form) = $session->quick(qw(db form)); + my $startIndex = $form->get('startIndex') || 0; + my $numberOfResults = $form->get('results') || 25; + my @placeholders = (); + my $sql = 'select SQL_CALC_FOUND_ROWS * from tax'; + my $keywords = $form->get("keywords"); + if ($keywords ne "") { + $sql .= ' where'; + foreach my $field (qw(country state city code)) { + $sql .= ' or' if (scalar @placeholders > 0); + $sql .= qq{ $field like ?}; + push(@placeholders, '%'.$keywords.'%'); + } + } + push(@placeholders, $startIndex, $numberOfResults); + $sql .= ' order by country desc limit ?,?'; + my $transactions = $db->read($sql, \@placeholders); + my $totalRecords = 0+$db->quickScalar('select found_rows()'); ##Must explicitly convert to numerics + my $tally = $transactions->rows(); + my @records = (); + while (my $row = $transactions->hashRef) { + push(@records, $row); + } + my %results = ( + totalRecords => $totalRecords + 0, + recordsReturned => $tally, + startIndex => $startIndex, + sort => undef, + dir => "desc", + records => \@records, + ); + $session->http->setMimeType('text/json'); + return JSON::to_json(\%results); +} + +#------------------------------------------------------------------- + =head2 www_view ( ) User interface to manage taxes. Provides a list of current taxes, and forms for adding @@ -366,22 +398,27 @@ new tax info, exporting and importing sets of taxes, and deleting individual tax sub www_view { my $self = shift; - return $self->session->privileges->insufficient - unless $self->canEdit; my $session = $self->session; + my $admin = WebGUI::Shop::Admin->new($session); + return $session->privileges->insufficient + unless $admin->canManage; ##YUI specific datatable CSS - $session->setLink($session->url->extras('yui/build/datatable/assets/skins/sam/datatable.css'), {type => 'text/CSS'}); + my ($style, $url) = $session->quick(qw(style url)); + $style->setLink($url->extras('/yui/build/fonts/fonts-min.css'), {rel=>'stylesheet', type=>'text/css'}); + $style->setLink($url->extras('yui/build/datatable/assets/skins/sam/datatable.css'), {rel=>'stylesheet', type => 'text/CSS'}); ##YUI basics - $session->style->setScript($session->url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js'), {type => 'text/javascript'}); - $session->style->setScript($session->url->extras('yui/build/element/element-beta-min.js'), {type => 'text/javascript'}); - $session->style->setScript($session->url->extras('yui/build/datasource/datasource-beta-min.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/yahoo-dom-event/yahoo-dom-event.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/element/element-beta-min.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/datasource/datasource-beta-min.js'), {type => 'text/javascript'}); ##YUI Datatable - $session->style->setScript($session->url->extras('yui/build/datatable/datatable-beta-min.js'), {type => 'text/javascript'}); + $style->setScript($url->extras('yui/build/datatable/datatable-beta-min.js'), {type => 'text/javascript'}); ##YUI JSON handler - $session->style->setScript($session->url->extras('yui/build/json/json-min.js'), {type => 'text/javascript'}); - ##Build column headers. TODO: I18N + $style->setScript($url->extras('yui/build/json/json-min.js'), {type => 'text/javascript'}); + $style->setRawHeadTags(''); my $i18n=WebGUI::International->new($session, 'Tax'); - $session->style->setRawHeadTags(sprintf <<'EOCHJS', $i18n->get('country'), $i18n->get('state'), $i18n->get('city'), $i18n->get('code')); + ##Build column headers. + my $output = sprintf <<'EOCHJS', $i18n->get('country'), $i18n->get('state'), $i18n->get('city'), $i18n->get('code'); +