webgui/lib/WebGUI/Shop/Address.pm
2011-12-28 11:30:38 -08:00

370 lines
8.6 KiB
Perl

package WebGUI::Shop::Address;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2012 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 Moose;
use WebGUI::Definition;
property label => (
noFormPost => 1,
default => '',
);
property firstName => (
noFormPost => 1,
default => '',
);
property lastName => (
noFormPost => 1,
default => '',
);
property address1 => (
noFormPost => 1,
default => '',
);
property address2 => (
noFormPost => 1,
default => '',
);
property address3 => (
noFormPost => 1,
default => '',
);
property city => (
noFormPost => 1,
default => '',
);
property state => (
noFormPost => 1,
default => '',
);
property code => (
noFormPost => 1,
default => '',
);
property country => (
noFormPost => 1,
default => '',
);
property phoneNumber => (
noFormPost => 1,
default => '',
);
property email => (
noFormPost => 1,
default => '',
);
property organization => (
noFormPost => 1,
default => '',
);
property "addressBookId" => (
noFormPost => 1,
required => 1,
);
property "isProfile" => (
noFormPost => 1,
required => 0,
default => 0,
);
has [ qw/addressId addressBook/] => (
is => 'ro',
required => 1,
);
use Scalar::Util qw/blessed/;
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
#-------------------------------------------------------------------
=head2 new ( $book, $addressId )
Constructor. Instanciates an address based upon an addressId.
=head2 new ( $book, $properties )
Constructor. Builds a new, default address.
=head2 new ( $properties )
Constructor. Builds a new, default address book object in Moose style with default properties set by $properties. This does not
persist them to the database automatically. This needs to be done via $self->write.
=head3 $addressBook
A reference to an addressBook object
=head3 $addressId
The unique id of an address to instanciate.
=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 isProfile
Whether or not this address is linked to the user profile. Defaults to 0
=cut
around BUILDARGS => sub {
my $orig = shift;
my $class = shift;
if (ref $_[0] eq 'HASH') {
my $properties = $_[0];
my $book = $properties->{addressBook};
if (! (blessed $book && $book->isa('WebGUI::Shop::AddressBook')) ) {
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Shop::AddressBook", got=>(ref $book), error=>"Need an address book.", param=>$book);
}
my ($addressId) = $class->_init($book);
$properties->{addressId} = $addressId;
$properties->{addressBookId} = $book->addressBookId;
$properties->{addressBook} = $book;
return $class->$orig($properties);
}
my $book = shift;
if (! (blessed $book && $book->isa('WebGUI::Shop::AddressBook')) ) {
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Shop::AddressBook", got=>(ref $book), error=>"Need an address book.", param=>$book);
}
my $argument2 = shift;
if (!defined $argument2) {
my ($addressId) = $class->_init($book);
my $properties = {};
$properties->{addressId} = $addressId;
$properties->{addressBookId} = $book->addressBookId;
$properties->{addressBook} = $book;
return $class->$orig($properties);
}
elsif (ref $argument2 eq 'HASH') {
my $properties = $argument2;
my ($addressId) = $class->_init($book);
$properties->{addressId} = $addressId;
$properties->{addressBookId} = $book->addressBookId;
$properties->{addressBook} = $book;
return $class->$orig($properties);
}
##Look up one in the db
my $address = $book->session->db->quickHashRef("select * from address where addressId=?", [$argument2]);
if ($address->{addressId} eq "") {
WebGUI::Error::ObjectNotFound->throw(error=>"Address not found.", id=>$argument2);
}
if ($address->{addressBookId} ne $book->getId) {
WebGUI::Error::ObjectNotFound->throw(error=>"Address not in this address book.", id=>$argument2);
}
$address->{addressBook} = $book;
return $class->$orig($address);
};
#-------------------------------------------------------------------
=head2 _init ( session )
Builds a stub of object information in the database, and returns the newly created
addressId, and the creationDate fields so the object can be initialized correctly.
=cut
sub _init {
my $class = shift;
my $book = shift;
my $session = $book->session;
my $addressId = $session->id->generate;
$session->db->write('insert into address (addressId, addressBookId) values (?,?)', [$addressId, $book->getId]);
return ($addressId);
}
#-------------------------------------------------------------------
=head2 addressBook ( )
Returns a reference to the Address Book.
=cut
#-------------------------------------------------------------------
=head2 create ( book )
Deprecated, left as a stub for existing code. Use L<new> instead.
=head3 book
A reference to an address book.
=cut
sub create {
my ($class, $book) = @_;
return $class->new($book);
}
#-------------------------------------------------------------------
=head2 delete ( )
Removes this address from the book.
=cut
sub delete {
my $self = shift;
$self->addressBook->session->db->deleteRow("address","addressId",$self->getId);
return undef;
}
#-------------------------------------------------------------------
=head2 getHtmlFormatted ()
Returns an HTML formatted address for display.
=cut
sub getHtmlFormatted {
my $self = shift;
my $address = $self->firstName. " " .$self->lastName . "<br />";
$address .= $self->organization . "<br />" if ($self->organization ne "");
$address .= $self->address1 . "<br />";
$address .= $self->address2 . "<br />" if ($self->address2 ne "");
$address .= $self->address3 . "<br />" if ($self->address3 ne "");
$address .= $self->city . ", ";
$address .= $self->state . " " if ($self->state ne "");
$address .= $self->code if ($self->code ne "");
$address .= '<br />' . $self->country;
$address .= '<br />'.$self->phoneNumber if ($self->phoneNumber ne "");
$address .= '<br /><a href="mailto:'.$self->email.'">'.$self->email.'</a>' if ($self->email ne "");
return $address;
}
#-------------------------------------------------------------------
=head2 getId ()
Returns the unique id of this item.
=cut
sub getId {
my $self = shift;
return $self->get("addressId");
}
#-------------------------------------------------------------------
=head2 write ( )
Store the object's properties to the db.
=cut
sub write {
my ($self) = @_;
my $properties = $self->get();
my $book = delete $properties->{addressBook};
$book->session->db->setRow("address","addressId",$properties);
}
1;