diff --git a/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg b/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg index 7e718f3ad..b27709a9e 100644 Binary files a/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg and b/docs/upgrades/packages-7.5.3/shopping-cart-collateral-items-1.wgpkg differ diff --git a/docs/upgrades/upgrade_7.5.2-7.5.3.pl b/docs/upgrades/upgrade_7.5.2-7.5.3.pl index 93cd046a5..ce391c423 100644 --- a/docs/upgrades/upgrade_7.5.2-7.5.3.pl +++ b/docs/upgrades/upgrade_7.5.2-7.5.3.pl @@ -65,6 +65,8 @@ sub addAddressBook { phoneNumber varchar(35), index addressBookId_addressId (addressBookId,addressId) )"); + $session->setting->add('shopAddressBookTemplateId','3womoo7Teyy2YKFa25-MZg'); + $session->setting->add('shopAddressTemplateId','XNd7a_g_cTvJVYrVHcx2Mw'); } #------------------------------------------------- @@ -106,8 +108,8 @@ sub createSkuAsset { description mediumtext, sku varchar(35) binary not null, salesAgentId varchar(22) binary, - displayTitle int not null default 1, - overrideTaxRate int not null default 0, + displayTitle bool not null default 1, + overrideTaxRate bool not null default 0, taxRateOverride float not null default 0.00, primary key (assetId, revisionDate), unique key sku (sku), @@ -137,7 +139,7 @@ sub migrateToNewCart { index cartId_assetId (cartId,assetId) )"); $session->db->write("drop table shoppingCart"); - $session->db->write("insert into settings values ('shopCartTemplateId','aIpCmr9Hi__vgdZnDTz1jw')"); + $session->setting->add('shopCartTemplateId','aIpCmr9Hi__vgdZnDTz1jw'); } #------------------------------------------------- diff --git a/lib/WebGUI/Form/YesNo.pm b/lib/WebGUI/Form/YesNo.pm index 989278790..577613bb4 100644 --- a/lib/WebGUI/Form/YesNo.pm +++ b/lib/WebGUI/Form/YesNo.pm @@ -73,7 +73,7 @@ sub definition { defaultValue=>1 }, dbDataType => { - defaultValue => "INT(1)", + defaultValue => "bool", }, }); return $class->SUPER::definition($session, $definition); diff --git a/lib/WebGUI/Shop/Address.pm b/lib/WebGUI/Shop/Address.pm index 25ef86387..f434fcc32 100644 --- a/lib/WebGUI/Shop/Address.pm +++ b/lib/WebGUI/Shop/Address.pm @@ -114,7 +114,7 @@ sub getHtmlFormatted { my $address = $self->get("name") . "
" . $self->get("address1") . "
"; $address .= $self->get("address2") . "
" if ($self->get("address2") ne ""); $address .= $self->get("address3") . "
" if ($self->get("address3") ne ""); - $address .= $self->get("city") . ","; + $address .= $self->get("city") . ", "; $address .= $self->get("state") . " " if ($self->get("state") ne ""); $address .= $self->get("code") if ($self->get("code") ne ""); $address .= '
' . $self->get("country"); diff --git a/lib/WebGUI/Shop/AddressBook.pm b/lib/WebGUI/Shop/AddressBook.pm index 2f9a27af2..61006464e 100644 --- a/lib/WebGUI/Shop/AddressBook.pm +++ b/lib/WebGUI/Shop/AddressBook.pm @@ -5,6 +5,7 @@ use strict; use Class::InsideOut qw{ :std }; use WebGUI::Asset::Template; use WebGUI::Exception::Shop; +use WebGUI::Form; use WebGUI::International; use WebGUI::Shop::Address; @@ -290,6 +291,177 @@ sub update { $self->session->db->setRow("addressBook","addressBookId",$properties{$id}); } +#------------------------------------------------------------------- + +=head2 www_deleteAddress ( ) + +Deletes an address from the book. + +=cut + +sub www_deleteAddress { + my $self = shift; + $self->getAddress($self->session->form->get("addressId"))->delete; + return $self->www_view; +} + +#------------------------------------------------------------------- + +=head2 www_editAddress () + +Allows a user to edit an address in their address book. + +=cut + +sub www_editAddress { + my ($self, $error) = @_; + my $session = $self->session; + my $form = $session->form; + my $address = eval{$self->getAddress($form->get("addressId"))}; + if (WebGUI::Error->caught) { + $address = undef; + } + my %base = (); + if (defined $address) { + %base = %{$address->get}; + } + my %var = ( + %base, + error => $error, + formHeader => WebGUI::Form::formHeader($session) + .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"}) + .WebGUI::Form::hidden($session, {name=>"method", value=>"editAddressSave"}) + .WebGUI::Form::hidden($session, {name=>"addressId", value=>$form->get("addressId")}) + .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")}), + saveButton => WebGUI::Form::submit($session), + formFooter => WebGUI::Form::formFooter($session), + address1Field => WebGUI::Form::text($session, {name=>"address1", maxlength=>35, defaultValue=>($form->get("address1") || ((defined $address) ? $address->get('address1') : undef))}), + address2Field => WebGUI::Form::text($session, {name=>"address2", maxlength=>35, defaultValue=>($form->get("address2") || ((defined $address) ? $address->get('address2') : undef))}), + address3Field => WebGUI::Form::text($session, {name=>"address3", maxlength=>35, defaultValue=>($form->get("address3") || ((defined $address) ? $address->get('address3') : undef))}), + labelField => WebGUI::Form::text($session, {name=>"label", maxlength=>35, defaultValue=>($form->get("label") || ((defined $address) ? $address->get('label') : undef))}), + nameField => WebGUI::Form::text($session, {name=>"name", maxlength=>35, defaultValue=>($form->get("name") || ((defined $address) ? $address->get('name') : undef))}), + cityField => WebGUI::Form::text($session, {name=>"city", maxlength=>35, defaultValue=>($form->get("city") || ((defined $address) ? $address->get('city') : undef))}), + stateField => WebGUI::Form::text($session, {name=>"state", maxlength=>35, defaultValue=>($form->get("state") || ((defined $address) ? $address->get('state') : undef))}), + countryField => WebGUI::Form::country($session, {name=>"country", defaultValue=>($form->get("country") || ((defined $address) ? $address->get('country') : undef))}), + codeField => WebGUI::Form::zipcode($session, {name=>"code", defaultValue=>($form->get("code") || ((defined $address) ? $address->get('code') : undef))}), + phoneNumberField => WebGUI::Form::phone($session, {name=>"phoneNumber", defaultValue=>($form->get("phoneNumber") || ((defined $address) ? $address->get('phoneNumber') : undef))}), + ); + my $template = WebGUI::Asset::Template->new($session, $session->setting->get("shopAddressTemplateId")); + $template->prepare; + return $session->style->userStyle($template->process(\%var)); +} + + + +#------------------------------------------------------------------- + +=head2 www_editAddressSave () + +Saves the address. If there is a problem generates www_editAddress() with an error message. Otherwise returns www_view(). + +=cut + +sub www_editAddressSave { + my $self = shift; + my $form = $self->session->form; + my $i18n = WebGUI::International->new($self->session,"Shop"); + if ($form->get("label") eq "") { + return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('label'))); + } + if ($form->get("name") eq "") { + return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('name'))); + } + if ($form->get("address1") eq "") { + return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('address'))); + } + if ($form->get("city") eq "") { + return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('city'))); + } + if ($form->get("code") eq "") { + return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('code'))); + } + if ($form->get("country") eq "") { + return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('country'))); + } + if ($form->get("phoneNumber") eq "") { + return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('phone number'))); + } + my %addressData = ( + label => $form->get("label"), + name => $form->get("name"), + address1 => $form->get("address1"), + address2 => $form->get("address2"), + address3 => $form->get("address3"), + city => $form->get("city"), + state => $form->get("state"), + code => $form->get("code","zipcode"), + country => $form->get("country","country"), + phoneNumber => $form->get("phoneNumber","phone"), + ); + if ($form->get('addressId') eq '') { + $self->addAddress(\%addressData); + } + else { + $self->getAddress($form->get('addressId'))->update(\%addressData); + } + return $self->www_view; +} + + +#------------------------------------------------------------------- + +=head2 www_view + +Displays the current user's address book. + +=cut + +sub www_view { + my $self = shift; + my $session = $self->session; + my $form = $session->form; + my $i18n = WebGUI::International->new($session, "Shop"); + my @addresses = (); + foreach my $address (@{$self->getAddresses}) { + push(@addresses, { + %{$address->get}, + address => $address->getHtmlFormatted, + deleteButton => WebGUI::Form::formHeader($session) + .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"}) + .WebGUI::Form::hidden($session, {name=>"method", value=>"deleteAddress"}) + .WebGUI::Form::hidden($session, {name=>"addressId", value=>$address->getId}) + .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")}) + .WebGUI::Form::submit($session, {value=>$i18n->get("delete")}) + .WebGUI::Form::formFooter($session), + editButton => WebGUI::Form::formHeader($session) + .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"}) + .WebGUI::Form::hidden($session, {name=>"method", value=>"editAddress"}) + .WebGUI::Form::hidden($session, {name=>"addressId", value=>$address->getId}) + .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")}) + .WebGUI::Form::submit($session, {value=>$i18n->get("edit")}) + .WebGUI::Form::formFooter($session), + useButton => WebGUI::Form::formHeader($session) + .WebGUI::Form::hidden($session, {name=>"shop", value=>"cart"}) + .WebGUI::Form::hidden($session, {name=>"method", value=>"setShippingAddress"}) + .WebGUI::Form::hidden($session, {name=>"shippingAddressId", value=>$address->getId}) + .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")}) + .WebGUI::Form::submit($session, {value=>$i18n->get("use this address")}) + .WebGUI::Form::formFooter($session), + }); + } + my %var = ( + addresses => \@addresses, + addButton => WebGUI::Form::formHeader($session) + .WebGUI::Form::hidden($session, {name=>"shop", value=>"address"}) + .WebGUI::Form::hidden($session, {name=>"method", value=>"editAddress"}) + .WebGUI::Form::hidden($session, {name=>"itemId", value=>$form->get("itemId")}) + .WebGUI::Form::submit($session, {value=>$i18n->get("add a new address")}) + .WebGUI::Form::formFooter($session), + ); + my $template = WebGUI::Asset::Template->new($session, $session->setting->get("shopAddressBookTemplateId")); + $template->prepare; + return $session->style->userStyle($template->process(\%var)); +} 1; diff --git a/lib/WebGUI/Shop/Cart.pm b/lib/WebGUI/Shop/Cart.pm index ecaf5600e..9d7a67a6e 100644 --- a/lib/WebGUI/Shop/Cart.pm +++ b/lib/WebGUI/Shop/Cart.pm @@ -5,6 +5,7 @@ use strict; use Class::InsideOut qw{ :std }; use WebGUI::Asset::Template; use WebGUI::Exception::Shop; +use WebGUI::Form; use WebGUI::International; use WebGUI::Shop::AddressBook; use WebGUI::Shop::CartItem; @@ -195,6 +196,23 @@ sub getId { #------------------------------------------------------------------- +=head2 getItem ( itemId ) + +Returns a reference to a WebGUI::Cart::Item object. + +=head3 itemId + +The id of the item to retrieve. + +=cut + +sub getItem { + my ($self, $itemId) = @_; + return WebGUI::Shop::CartItem->new($self, $itemId); +} + +#------------------------------------------------------------------- + =head2 getItems ( ) Returns an array reference of WebGUI::Asset::Sku objects that are in the cart. @@ -206,7 +224,7 @@ sub getItems { my @itemsObjects = (); my $items = $self->session->db->read("select itemId from cartItems where cartId=?",[$self->getId]); while (my ($itemId) = $items->array) { - push(@itemsObjects, WebGUI::Shop::CartItem->new($self, $itemId)); + push(@itemsObjects, $self->getItem($itemId)); } return \@itemsObjects; } @@ -310,11 +328,31 @@ Remove an item from the cart and then display the cart again. sub www_removeItem { my $self = shift; - my $item = WebGUI::Shop::CartItem->new($self, $self->session->form->get("itemId")); - $item->remove; + my $item = $self->getItem($self->session->form->get("itemId"))->remove; return $self->www_view; } +#------------------------------------------------------------------- + +=head2 www_setShippingAddress () + +Sets the shipping address for the cart or for a cart item if itemId is one of the form params. + +=cut + +sub www_setShippingAddress { + my $self = shift; + my $form = $self->session->form; + if ($form->get("itemId") ne "") { + $self->getItem($form->get("itemId"))->update({shippingAddressId=>$form->get('shippingAddressId')}); + } + else { + $self->update({shippingAddressId=>$form->get('shippingAddressId')}); + } + return $self->www_view; +} + + #------------------------------------------------------------------- =head2 www_update ( ) @@ -421,7 +459,7 @@ Displays the configured item. sub www_viewItem { my $self = shift; my $itemId = $self->session->form->get("itemId"); - my $item = eval { WebGUI::Shop::CartItem->new($self, $itemId) }; + my $item = eval { $self->getItem($itemId) }; if (WebGUI::Error->caught()) { return $self->www_view; } diff --git a/lib/WebGUI/i18n/English/Shop.pm b/lib/WebGUI/i18n/English/Shop.pm index e70dcc0a8..7ee64a7af 100644 --- a/lib/WebGUI/i18n/English/Shop.pm +++ b/lib/WebGUI/i18n/English/Shop.pm @@ -3,6 +3,90 @@ package WebGUI::i18n::English::Shop; use strict; our $I18N = { + 'is a required field' => { + message => q|%s is a required field.|, + lastUpdated => 0, + context => q|an error message| + }, + + 'label' => { + message => q|Label|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'label help' => { + message => q|eg: 'Home' or 'Work'|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'name' => { + message => q|Name|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'address' => { + message => q|Address|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'city' => { + message => q|City|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'state' => { + message => q|State / Province|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'code' => { + message => q|Postal / Zip Code|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'country' => { + message => q|Country|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'phone number' => { + message => q|Phone Number|, + lastUpdated => 0, + context => q|a label in the address editor| + }, + + 'add a new address' => { + message => q|Add A New Address|, + lastUpdated => 0, + context => q|a button in the address book| + }, + + 'delete' => { + message => q|Delete|, + lastUpdated => 0, + context => q|a button in the address book| + }, + + 'edit' => { + message => q|Edit|, + lastUpdated => 0, + context => q|a button in the address book| + }, + + 'use this address' => { + message => q|Use This Address|, + lastUpdated => 0, + context => q|a button in the address book| + }, + 'too many of this item' => { message => q|Can't add that many %s to your cart.|, lastUpdated => 0,