From 7ef8de2a1ff027d5e1aa018bc47102b1405a575d Mon Sep 17 00:00:00 2001 From: Colin Kuskie Date: Tue, 27 Apr 2010 12:02:32 -0700 Subject: [PATCH] Checkout preparations. Change payment options to a dropdown in the cart. Pay->getOptions now returns just a hash. --- .../default-shopping-cart-template.wgpkg | Bin 3998 -> 4072 bytes docs/upgrades/upgrade_7.9.3-7.9.4.pl | 1 + lib/WebGUI/Shop/Cart.pm | 29 ++++++++++++++---- lib/WebGUI/Shop/Pay.pm | 12 +++----- lib/WebGUI/i18n/English/PayDriver.pm | 2 +- lib/WebGUI/i18n/English/Shop.pm | 6 ++++ 6 files changed, 35 insertions(+), 15 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 a76453951ae0e73cb39ed6a4c59fac404ec36196..4c412e09d149c1a26327b203983a104da3c4a748 100644 GIT binary patch literal 4072 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"ALTER TABLE cart ADD COLUMN billingAddressId CHAR(22)"); + $session->db->write("ALTER TABLE cart ADD COLUMN gatewayId CHAR(22)"); print "DONE!\n" unless $quiet; } diff --git a/lib/WebGUI/Shop/Cart.pm b/lib/WebGUI/Shop/Cart.pm index 95b7a0836..571b56fb8 100644 --- a/lib/WebGUI/Shop/Cart.pm +++ b/lib/WebGUI/Shop/Cart.pm @@ -12,6 +12,7 @@ use WebGUI::Shop::AddressBook; use WebGUI::Shop::CartItem; use WebGUI::Shop::Credit; use WebGUI::Shop::Ship; +use WebGUI::Shop::Pay; use WebGUI::Shop::Tax; use WebGUI::User; use Tie::IxHash; @@ -645,12 +646,13 @@ sub updateFromForm { my $book = $self->getAddressBook; + my $cartProperties = {}; my %billingData = $book->processAddressForm('billing_'); my $billingAddressId = $form->process('billingAddressId'); if ($billingAddressId eq 'new_address' && ! exists $billingData{'error'}) { ##Add a new address my $newAddress = $book->addAddress(\%billingData); - $self->update({billingAddressId => $newAddress->get('addressId'), }); + $cartProperties{billingAddressId} = $newAddress->get('addressId'); } elsif ($billingAddressId eq 'update_address' && $self->get('billingAddressId')) { ##User changed the address selector @@ -658,7 +660,7 @@ sub updateFromForm { $address->update(\%billingData); } elsif ($billingAddressId ne 'new_address' && $billingAddressId) { - $self->update({billingAddressId => $billingAddressId}); + $cartProperties{billingAddressId} = $billingAddressId; } else { $self->session->log->warn('billing address: something else: '. $billingData{error}); @@ -667,12 +669,12 @@ sub updateFromForm { my %shippingData = $book->processAddressForm('shipping_'); my $shippingAddressId = $form->process('shippingAddressId'); if ($form->process('sameShippingAsBilling', 'yesNo')) { - $self->update({shippingAddressId => $self->get('billingAddressId'), }); + $cartProperties{shippingAddressId} = $self->get('billingAddressId'); } elsif ($shippingAddressId eq 'new_address' && ! exists $shippingData{'error'}) { ##Add a new address my $newAddress = $book->addAddress(\%shippingData); - $self->update({shippingAddressId => $newAddress->get('addressId'), }); + $cartProperties{shippingAddressId} = $newAddress->get('addressId'); } elsif ($shippingAddressId eq 'update_address' && $self->get('shippingAddressId')) { ##User changed the address selector @@ -680,14 +682,14 @@ sub updateFromForm { $address->update(\%shippingData); } elsif ($shippingAddressId ne 'new_address' && $shippingAddressId) { - $self->update({shippingAddressId => $shippingAddressId}); + $cartProperties{shippingAddressId} = $shippingAddressId}; } else { $self->session->log->warn('shipping address: something else: '. $shippingData{error}); } - my $cartProperties = {}; $cartProperties->{ shipperId } = $form->process( 'shipperId' ) if $form->process( 'shipperId' ); + $cartProperties->{ gatewayId } = $form->process( 'gatewayId' ) if $form->process( 'gatewayId' ); $self->update( $cartProperties ); } @@ -897,6 +899,7 @@ sub www_view { , formFooter => WebGUI::Form::formFooter($session), updateButton => WebGUI::Form::submit($session, {value=>$i18n->get("update cart button"), extras=>q|id="updateCartButton"|}), + checkoutButton => WebGUI::Form::submit($session, {name => 'checkout', value=>$i18n->get("checkout button"), extras=>q|id="checkoutButton"|}), continueShoppingButton => WebGUI::Form::submit($session, {value=>$i18n->get("continue shopping button"), extras=>q|onclick="this.form.method.value='continueShopping';this.form.submit;" id="continueShoppingButton"|}), subtotalPrice => $self->formatCurrency($self->calculateSubtotal()), @@ -1011,6 +1014,20 @@ sub www_view { }); } + # Payment methods + my $pay = WebGUI::Shop::Pay->new($session); + tie my %paymentOptions, 'Tie::IxHash'; + $paymentOptions{''} = $i18n->get('Choose a payment method'); + my $gateways = $pay->getOptions($self); + while (my ($gatewayId, $label) = each %{ $gateways }) { + $paymentOptions{$gatewayId} = $label; + } + $var{paymentOptions} = WebGUI::Form::selectBox($session, { + name => 'gatewayId', + options => \%paymentOptions, + value => $self->get('gatewayId') || $form->get('gatewayId') || '', + }); + # POS variables $var{isCashier} = WebGUI::Shop::Admin->new($session)->isCashier; $var{posLookupForm} = WebGUI::Form::email($session, {name=>"posEmail"}) diff --git a/lib/WebGUI/Shop/Pay.pm b/lib/WebGUI/Shop/Pay.pm index 45a3438eb..7f0d83f6a 100644 --- a/lib/WebGUI/Shop/Pay.pm +++ b/lib/WebGUI/Shop/Pay.pm @@ -104,9 +104,9 @@ sub getDrivers { =head2 getOptions ( $cart ) Returns a set of options for the user to pay to. It is a hash of -hashrefs, with the key of the primary hash being the paymentGatewayId -of the driver, and sub keys of label and button. The hash will only -contain payment gateways that this user is allowed to use. +gatewayIds and labels. + +The hash will only contain payment gateways that this user is allowed to use. =head3 $cart @@ -120,17 +120,13 @@ sub getOptions { WebGUI::Error::InvalidParam->throw(error => q{Need a cart.}) unless defined $cart and $cart->isa("WebGUI::Shop::Cart"); - my $session = $cart->session; my $recurringRequired = $cart->requiresRecurringPayment; my %options = (); foreach my $gateway (@{ $self->getPaymentGateways() }) { next unless $gateway->canUse; if (!$recurringRequired || $gateway->handlesRecurring) { - $options{$gateway->getId} = { - label => $gateway->get("label"), - button => $gateway->getButton( $cart ), - }; + $options{$gateway->getId} = $gateway->get("label"); } } return \%options; diff --git a/lib/WebGUI/i18n/English/PayDriver.pm b/lib/WebGUI/i18n/English/PayDriver.pm index 3da096822..c91fb0341 100644 --- a/lib/WebGUI/i18n/English/PayDriver.pm +++ b/lib/WebGUI/i18n/English/PayDriver.pm @@ -77,7 +77,7 @@ our $I18N = { }, 'payment methods' => { - message => q|Payment Methods.|, + message => q|Payment Methods|, lastUpdated => 1213313375, context => q|Help body for the email receipt template|, }, diff --git a/lib/WebGUI/i18n/English/Shop.pm b/lib/WebGUI/i18n/English/Shop.pm index 48e086ab5..616630df4 100644 --- a/lib/WebGUI/i18n/English/Shop.pm +++ b/lib/WebGUI/i18n/English/Shop.pm @@ -1761,6 +1761,12 @@ our $I18N = { context => q|form label for the cart. Allows user to build a new address.| }, + 'Choose a payment method' => { + message => q|Choose a payment method|, + lastUpdated => 0, + context => q|form label for the cart. Allows user to choose a payment method. Bart Jol for Minister in 2012!| + }, + }; 1;