From 9838d20458a3e86c1d68ff9d66e0d6085230faaa Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Mon, 26 Apr 2010 09:30:40 -0700 Subject: [PATCH] Add a billing address to the cart. Add form processing for an address form to the AddressBook. Support for choosing shipping methods without an address. --- .../default-shopping-cart-template.wgpkg | Bin 3856 -> 3861 bytes docs/upgrades/upgrade_7.9.3-7.9.4.pl | 10 ++ lib/WebGUI/Shop/AddressBook.pm | 89 ++++++++++-------- lib/WebGUI/Shop/Cart.pm | 44 ++++++--- lib/WebGUI/Shop/Ship.pm | 32 +++++-- lib/WebGUI/i18n/English/Shop.pm | 18 ++++ 6 files changed, 134 insertions(+), 59 deletions(-) diff --git a/docs/upgrades/packages-7.9.4/default-shopping-cart-template.wgpkg b/docs/upgrades/packages-7.9.4/default-shopping-cart-template.wgpkg index dcd1953ae16fd345d033e4eeec64ba5269e49612..045ead438c0fca913977d5f8aee697940b21b021 100644 GIT binary patch literal 3861 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 ST>>kWz<&U4l1=phQUCyYTxwDP diff --git a/docs/upgrades/upgrade_7.9.3-7.9.4.pl b/docs/upgrades/upgrade_7.9.3-7.9.4.pl index 709b9133f..efa458b6b 100644 --- a/docs/upgrades/upgrade_7.9.3-7.9.4.pl +++ b/docs/upgrades/upgrade_7.9.3-7.9.4.pl @@ -36,6 +36,7 @@ my $session = start(); # this line required addWikiSubKeywords($session); addSynopsistoEachWikiPage($session); dropVisitorAddressBooks($session); +alterCartTable($session); alterAddressBookTable($session); addWizardHandler( $session ); @@ -125,6 +126,15 @@ sub alterAddressBookTable { print "DONE!\n" unless $quiet; } +#---------------------------------------------------------------------------- +sub alterCartTable { + my $session = shift; + print "\tAdd billing address column to the Cart table... " unless $quiet; + # and here's our code + $session->db->write("ALTER TABLE cart ADD COLUMN billingAddressId CHAR(22)"); + print "DONE!\n" unless $quiet; +} + # -------------- DO NOT EDIT BELOW THIS LINE -------------------------------- #---------------------------------------------------------------------------- diff --git a/lib/WebGUI/Shop/AddressBook.pm b/lib/WebGUI/Shop/AddressBook.pm index f6ee1b550..012f97a10 100644 --- a/lib/WebGUI/Shop/AddressBook.pm +++ b/lib/WebGUI/Shop/AddressBook.pm @@ -367,6 +367,51 @@ sub newByUserId { } +#------------------------------------------------------------------- + +=head2 processAddressForm ( $prefix ) + +Process the current set of form variables for any belonging to the address book. Returns +a hash ref of address information. + +=head3 $prefix + +An optional prefix to be added to each form variable. + +=cut + +sub processAddressForm { + my ($self, $prefix) = @_; + $prefix ||= ''; + my $form = $self->session->form; + my %addressData = ( + label => $form->get($prefix . "label"), + firstName => $form->get($prefix . "firstName"), + lastName => $form->get($prefix . "lastName"), + address1 => $form->get($prefix . "address1"), + address2 => $form->get($prefix . "address2"), + address3 => $form->get($prefix . "address3"), + city => $form->get($prefix . "city"), + state => $form->get($prefix . "state"), + code => $form->get($prefix . "code", "zipcode"), + country => $form->get($prefix . "country", "country"), + phoneNumber => $form->get($prefix . "phoneNumber", "phone"), + email => $form->get($prefix . "email", "email"), + organization => $form->get($prefix . "organization"), + ); + my $i18n = WebGUI::International->new($self->session, "Shop"); + foreach my $field (qw/label firstName lastName address1 city code country phoneNumber/) { + my $label = $field eq 'address1' ? 'address' + : $field eq 'phoneNumber' ? 'phone number' + : $field + ; + if ($addressData{$field} eq "") { + $addressData{error} = sprintf($i18n->get('is a required field'), $i18n->get($label)); + } + } + return %addressData; +} + #------------------------------------------------------------------- =head2 update ( properties ) @@ -540,46 +585,10 @@ Saves the address. If there is a problem generates www_editAddress() with an err 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("firstName") eq "") { - return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('firstName'))); - } - if ($form->get("lastName") eq "") { - return $self->www_editAddress(sprintf($i18n->get('is a required field'), $i18n->get('lastName'))); - } - 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"), - firstName => $form->get("firstName"), - lastName => $form->get("lastName"), - 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"), - email => $form->get("email","email"), - organization => $form->get("organization"), - ); + my %addressData = $self->processAddressForm(); + if (exists $addressData{error}) { + return $self->www_editAddress($addressData{error}); + } if ($form->get('addressId') eq '') { $self->addAddress(\%addressData); } diff --git a/lib/WebGUI/Shop/Cart.pm b/lib/WebGUI/Shop/Cart.pm index 41230b8ba..6e6421b89 100644 --- a/lib/WebGUI/Shop/Cart.pm +++ b/lib/WebGUI/Shop/Cart.pm @@ -565,6 +565,10 @@ A hash reference that contains one of the following: The unique id for a shipping address attached to this cart. +=head4 billingAddressId + +The unique id for a billing address attached to this cart. + =head4 shipperId The unique id of the configured shipping driver that will be used to ship these goods. @@ -585,7 +589,7 @@ sub update { WebGUI::Error::InvalidParam->throw(error=>"Need a properties hash ref."); } my $id = id $self; - foreach my $field (qw(shippingAddressId posUserId shipperId creationDate)) { + foreach my $field (qw(billingAddressId shippingAddressId posUserId shipperId creationDate)) { $properties{$id}{$field} = (exists $newProperties->{$field}) ? $newProperties->{$field} : $properties{$id}{$field}; } $self->session->db->setRow("cart","cartId",$properties{$id}); @@ -595,7 +599,7 @@ sub update { =head2 updateFromForm ( ) -Updates the cart totals. +Updates the cart totals from form data. =cut @@ -618,8 +622,10 @@ sub updateFromForm { my $i18n = WebGUI::International->new($self->session, "Shop"); $error{id $self} = $i18n->get('mixed items warning'); } + my $book = $self->getAddressBook; + #$book->processAddressForm() my $cartProperties = {}; - $cartProperties->{ shipperId } = $form->process( 'shipperId' ) if $form->process( 'shipperId' ); + $cartProperties->{ shipperId } = $form->process( 'shipperId' ) if $form->process( 'shipperId' ); $self->update( $cartProperties ); } @@ -698,6 +704,22 @@ sub www_removeItem { return $self->www_view; } +#------------------------------------------------------------------- + +=head2 www_setBillingAddress () + +Sets the billing address for the cart. + +=cut + +sub www_setBillingAddress { + my $self = shift; + my $form = $self->session->form; + $self->update({billingAddressId=>$form->get('billingAddressId')}); + return $self->www_view; +} + + #------------------------------------------------------------------- =head2 www_setShippingAddress () @@ -710,10 +732,10 @@ 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('addressId')}); + $self->getItem($form->get("itemId"))->update({shippingAddressId=>$form->get('shippingAddressId')}); } else { - $self->update({shippingAddressId=>$form->get('addressId')}); + $self->update({shippingAddressId=>$form->get('shippingAddressId')}); } return $self->www_view; } @@ -742,11 +764,12 @@ Displays the shopping cart. =cut sub www_view { - my $self = shift; + my $self = shift; my $session = $self->session; - my $url = $session->url; - my $i18n = WebGUI::International->new($session, "Shop"); - my @items = (); + my $url = $session->url; + my $form = $session->form; + my $i18n = WebGUI::International->new($session, "Shop"); + my @items = (); my $taxDriver = WebGUI::Shop::Tax->getDriver( $session ); if($url->forceSecureConnection()){ @@ -888,8 +911,6 @@ sub www_view { #Address form variables $var{userIsVisitor} = $session->user->isVisitor; if ($var{userIsVisitor}) { - ##Make login form - #Form variable returnUrl $var{loginFormHeader} = WebGUI::Form::formHeader($session, {action => $session->url->page}) . WebGUI::Form::hidden($session,{ name => 'op', value => 'auth'}) . WebGUI::Form::hidden($session,{ name => 'method', value => 'login'}) @@ -906,6 +927,7 @@ sub www_view { my $addressBook = $self->getAddressBook; $addressBook->appendAddressFormVars(\%var, 'shipping_', {}); $addressBook->appendAddressFormVars(\%var, 'billing_', {}); + $var{sameShippingAsBilling} = WebGUI::Form::yesNo($session, {name => 'sameShippingAsBilling', value => $form->get('sameShippingAsBilling','yesNo')}); } # POS variables diff --git a/lib/WebGUI/Shop/Ship.pm b/lib/WebGUI/Shop/Ship.pm index 5dc2f1aaf..ca7217a24 100644 --- a/lib/WebGUI/Shop/Ship.pm +++ b/lib/WebGUI/Shop/Ship.pm @@ -84,7 +84,14 @@ sub getDrivers { =head2 getOptions ( $cart ) Returns a list of options for the user to ship, along with the cost of using each one. It is a hash of hashrefs, -with the key of the primary hash being the shipperId of the driver, and sub keys of label and price. +with the key of the primary hash being the shipperId of the driver, and sub keys of label, price, and whether the +price actually exists, to tell the difference between 0 and unknown. + + { + label => 'ShipDriver label', + price => \d+, + hasPrice => 1 || 0, + } =head3 $cart @@ -99,15 +106,24 @@ sub getOptions { my %options = (); SHIPPER: foreach my $shipper (@{$self->getShippers()}) { next SHIPPER unless $shipper->get('enabled'); - my $price = eval { $shipper->calculate($cart) }; - if (my $e = WebGUI::Error->caught()) { - $self->session->log->warn($e->error); - next SHIPPER; - } next SHIPPER unless $shipper->canUse; + my ($price, $hasPrice); + if ($cart->get('shippingAddressId')) { + my $price = eval { $shipper->calculate($cart) }; + if (my $e = WebGUI::Error->caught()) { + $self->session->log->warn($e->error); + next SHIPPER; + } + $hasPrice = 1; + } + else { + $price = 0; + $hasPrice = 0; + } $options{$shipper->getId} = { - label => $shipper->get("label"), - price => $price, + label => $shipper->get("label"), + price => $price, + hasPrice => 0, }; } return \%options; diff --git a/lib/WebGUI/i18n/English/Shop.pm b/lib/WebGUI/i18n/English/Shop.pm index e1b8e075d..1b790a9ca 100644 --- a/lib/WebGUI/i18n/English/Shop.pm +++ b/lib/WebGUI/i18n/English/Shop.pm @@ -1731,6 +1731,24 @@ our $I18N = { context => q|commerce setting help| }, + 'Billing Address' => { + message => q|Billing Address|, + lastUpdated => 0, + context => q|template label for the cart| + }, + + 'Shipping Address' => { + message => q|Shipping Address|, + lastUpdated => 0, + context => q|template label for the cart| + }, + + 'use same shipping as billing' => { + message => q|Use the same shipping address as billing address.|, + lastUpdated => 0, + context => q|template label for the cart| + }, + }; 1;