package WebGUI::Shop::Address;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2009 Plain Black Corporation.
-------------------------------------------------------------------
Please read the legal notices (docs/legal.txt) and the license
(docs/license.txt) that came with this distribution before using
this software.
-------------------------------------------------------------------
http://www.plainblack.com info@plainblack.com
-------------------------------------------------------------------
=cut
use strict;
use Class::InsideOut qw{ :std };
use WebGUI::Exception::Shop;
=head1 NAME
Package WebGUI::Shop::Address
=head1 DESCRIPTION
An address is used to track shipping or payment addresses in the commerce system. Because of
object caching in the AddressBook, addresses should never, ever be accessed directly.
=head1 SYNOPSIS
use WebGUI::Shop::Address;
my $address = WebGUI::Shop::Address->new($addressBook, $addressId);
=head1 METHODS
These subroutines are available from this package:
=cut
readonly addressBook => my %addressBook;
private properties => my %properties;
#-------------------------------------------------------------------
=head2 addressBook ( )
Returns a reference to the Address Book.
=cut
#-------------------------------------------------------------------
=head2 create ( addressBook, address)
Constructor. Adds an address to an address book. Returns a reference to the address.
=head3 addressBook
A reference to a WebGUI::Shop::AddressBook object.
=head3 address
A hash reference containing the properties to set in the address.
=cut
sub create {
my ($class, $book, $addressData) = @_;
unless (defined $book && $book->isa("WebGUI::Shop::AddressBook")) {
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Shop::AddressBook", got=>(ref $book), error=>"Need an address book.", param=>$book);
}
unless (defined $addressData && ref $addressData eq "HASH") {
WebGUI::Error::InvalidParam->throw(param=>$addressData, error=>"Need a hash reference.");
}
my $id = $book->session->db->setRow("address","addressId", {addressId=>"new", addressBookId=>$book->getId});
my $address = $class->new($book, $id);
$address->update($addressData);
return $address;
}
#-------------------------------------------------------------------
=head2 delete ( )
Removes this address from the book.
=cut
sub delete {
my $self = shift;
$self->addressBook->session->db->deleteRow("address","addressId",$self->getId);
undef $self;
return undef;
}
#-------------------------------------------------------------------
=head2 get ( [ property ] )
Returns a duplicated hash reference of this object’s data.
=head3 property
Any field − returns the value of a field rather than the hash reference.
=cut
sub get {
my ($self, $name) = @_;
if (defined $name) {
return $properties{id $self}{$name};
}
my %copyOfHashRef = %{$properties{id $self}};
return \%copyOfHashRef;
}
#-------------------------------------------------------------------
=head2 getHtmlFormatted ()
Returns an HTML formatted address for display.
=cut
sub getHtmlFormatted {
my $self = shift;
my $address = $self->get("firstName"). " " .$self->get("lastName") . "
";
$address .= $self->get("organization") . "
" if ($self->get("organization") ne "");
$address .= $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("state") . " " if ($self->get("state") ne "");
$address .= $self->get("code") if ($self->get("code") ne "");
$address .= '
' . $self->get("country");
$address .= '
'.$self->get("phoneNumber") if ($self->get("phoneNumber") ne "");
$address .= '
'.$self->get("email").'' if ($self->get("email") ne "");
return $address;
}
#-------------------------------------------------------------------
=head2 getId ()
Returns the unique id of this item.
=cut
sub getId {
my $self = shift;
return $self->get("addressId");
}
#-------------------------------------------------------------------
=head2 isProfile ()
Returns 1 if the address is linked to the user's profile.
=cut
sub isProfile {
my $self = shift;
return ($self->get("isProfile") eq 1);
}
#-------------------------------------------------------------------
=head2 new ( addressBook, addressId )
Constructor. Instanciates an existing address from the database based upon addressId.
=head3 addressBook
A reference to a WebGUI::Shop::AdressBook object.
=head3 addressId
The unique id of the address to instanciate.
=cut
sub new {
my ($class, $book, $addressId) = @_;
unless (defined $book && $book->isa("WebGUI::Shop::AddressBook")) {
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Shop::AddressBook", got=>(ref $book), error=>"Need an address book.");
}
unless (defined $addressId) {
WebGUI::Error::InvalidParam->throw(error=>"Need an addressId.", param=>$addressId);
}
my $address = $book->session->db->quickHashRef('select * from address where addressId=?', [$addressId]);
if ($address->{addressId} eq "") {
WebGUI::Error::ObjectNotFound->throw(error=>"Address not found.", id=>$addressId);
}
if ($address->{addressBookId} ne $book->getId) {
WebGUI::Error::ObjectNotFound->throw(error=>"Address not in this address book.", id=>$addressId);
}
my $self = register $class;
my $id = id $self;
$addressBook{ $id } = $book;
$properties{ $id } = $address;
return $self;
}
#-------------------------------------------------------------------
=head2 update ( properties )
Sets properties of the address.
=head3 properties
A hash reference that contains one or more of the following:
=head4 label
A human readable label like "home" or "work".
=head4 firstName
The first name of the company or person to address this to.
=head4 lastName
The last name of the company or person to address this to.
=head4 address1
The street name and number.
=head4 address2
Suite number or other addressing information.
=head4 address3
Care of info or other addressing information.
=head4 city
The city that this address is in.
=head4 state
The state or province that this address is in.
=head4 code
The postal code or zip code that this address is in.
=head4 country
The country that this address is in.
=head4 phoneNumber
A telephone number for this address. It is required by some shippers.
=head4 email
An email address for this user.
=head4 organization
The organization or company that this user is a part of.
=head4 addressBookId
The address book that this address belongs to.
=head4 isProfile
Whether or not this address is linked to the user profile. Defaults to 0
=cut
sub update {
my ($self, $newProperties) = @_;
my $id = id $self;
foreach my $field (qw(addressBookId email organization address1 address2 address3 state code city label firstName lastName country phoneNumber isProfile)) {
$properties{$id}{$field} = (exists $newProperties->{$field}) ? $newProperties->{$field} : $properties{$id}{$field};
}
$self->addressBook->session->db->setRow("address","addressId",$properties{$id});
}
1;