Move Shop/Transaction to Moose. Change core modules to suit.
This commit is contained in:
parent
0fe388761f
commit
04a16ed87c
5 changed files with 516 additions and 308 deletions
|
|
@ -199,3 +199,8 @@ WebGUI::Shop::Address
|
||||||
Object properties are no longer written to the database when an object is created from scratch. The write method needs
|
Object properties are no longer written to the database when an object is created from scratch. The write method needs
|
||||||
to be called.
|
to be called.
|
||||||
|
|
||||||
|
WebGUI::Shop::Transaction
|
||||||
|
=========================
|
||||||
|
Object properties are no longer written to the database when an object is created from scratch. The write method needs
|
||||||
|
to be called.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -985,7 +985,8 @@ sub www_checkout {
|
||||||
##Handle rounding errors, and checkout immediately if the amount is 0 since
|
##Handle rounding errors, and checkout immediately if the amount is 0 since
|
||||||
##at least the ITransact driver won't accept $0 checkout.
|
##at least the ITransact driver won't accept $0 checkout.
|
||||||
if (sprintf('%.2f', $total + $self->calculateShopCreditDeduction($total)) eq '0.00') {
|
if (sprintf('%.2f', $total + $self->calculateShopCreditDeduction($total)) eq '0.00') {
|
||||||
my $transaction = WebGUI::Shop::Transaction->create($session, {cart => $self});
|
my $transaction = WebGUI::Shop::Transaction->new({session => $session, cart => $self});
|
||||||
|
$transaction->write;
|
||||||
$transaction->completePurchase('zero', 'success', 'success');
|
$transaction->completePurchase('zero', 'success', 'success');
|
||||||
$self->onCompletePurchase;
|
$self->onCompletePurchase;
|
||||||
$transaction->sendNotifications();
|
$transaction->sendNotifications();
|
||||||
|
|
|
||||||
|
|
@ -645,12 +645,14 @@ sub processTransaction {
|
||||||
# Setup dynamic transaction
|
# Setup dynamic transaction
|
||||||
unless (defined $transaction) {
|
unless (defined $transaction) {
|
||||||
my $transactionProperties;
|
my $transactionProperties;
|
||||||
$transactionProperties->{ paymentMethod } = $self;
|
$transactionProperties->{ paymentMethod } = $self;
|
||||||
$transactionProperties->{ cart } = $cart;
|
$transactionProperties->{ cart } = $cart;
|
||||||
$transactionProperties->{ isRecurring } = $cart->requiresRecurringPayment;
|
$transactionProperties->{ isRecurring } = $cart->requiresRecurringPayment;
|
||||||
|
$transactionProperties->{ session } = $self->session;
|
||||||
|
|
||||||
# Create a transaction...
|
# Create a transaction...
|
||||||
$transaction = WebGUI::Shop::Transaction->create( $self->session, $transactionProperties );
|
$transaction = WebGUI::Shop::Transaction->new( $transactionProperties );
|
||||||
|
$transaction->write;
|
||||||
}
|
}
|
||||||
|
|
||||||
# And handle the payment for it
|
# And handle the payment for it
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,295 @@ package WebGUI::Shop::Transaction;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
use Class::InsideOut qw{ :std };
|
|
||||||
use JSON qw{ from_json };
|
use JSON qw{ from_json };
|
||||||
|
use Scalar::Util qw/blessed/;
|
||||||
|
use Moose;
|
||||||
|
use WebGUI::Definition;
|
||||||
|
|
||||||
|
property isSuccessful => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property transactionCode => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property statusCode => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property statusMessage => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property amount => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => 0
|
||||||
|
);
|
||||||
|
property shippingAddressId => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingAddressName => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingAddress1 => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingAddress2 => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingAddress3 => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingCity => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingState => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingCountry => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingCode => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingPhoneNumber => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingDriverId => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingDriverLabel => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property notes => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property shippingPrice => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => 0
|
||||||
|
);
|
||||||
|
property paymentAddressId => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentAddressName => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property originatingTransactionId => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property isRecurring => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentAddress1 => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentAddress2 => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentAddress3 => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentCity => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentState => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentCountry => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentCode => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentPhoneNumber => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentDriverId => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property paymentDriverLabel => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => '',
|
||||||
|
);
|
||||||
|
property taxes => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => 0
|
||||||
|
);
|
||||||
|
property shopCreditDeduction => (
|
||||||
|
is => 'rw',
|
||||||
|
noFormPost => 1,
|
||||||
|
default => 0
|
||||||
|
);
|
||||||
|
property userId => (
|
||||||
|
is => 'ro',
|
||||||
|
noFormPost => 1,
|
||||||
|
lazy => 1,
|
||||||
|
builder => '_userId_builder',
|
||||||
|
);
|
||||||
|
sub _userId_builder {
|
||||||
|
my $self = shift;
|
||||||
|
return $self->session->user->userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
property username => (
|
||||||
|
is => 'ro',
|
||||||
|
noFormPost => 1,
|
||||||
|
lazy => 1,
|
||||||
|
builder => '_username_builder',
|
||||||
|
);
|
||||||
|
sub _username_builder {
|
||||||
|
my $self = shift;
|
||||||
|
return $self->session->user->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
property cashierUserId => (
|
||||||
|
is => 'ro',
|
||||||
|
noFormPost => 1,
|
||||||
|
lazy => 1,
|
||||||
|
builder => '_cashierUserId_builder',
|
||||||
|
);
|
||||||
|
sub _cashierUserId_builder {
|
||||||
|
my $self = shift;
|
||||||
|
return $self->session->user->userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
has [ qw/session transactionId dateOfPurchase orderNumber/ ] => (
|
||||||
|
is => 'ro',
|
||||||
|
required => 1,
|
||||||
|
);
|
||||||
|
|
||||||
|
##These are really placeholders for objects that are mined for data to build a transaction
|
||||||
|
|
||||||
|
has paymentMethod => (
|
||||||
|
is => 'rw',
|
||||||
|
trigger => \&_mine_paymentMethod,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub _mine_paymentMethod {
|
||||||
|
my ($self, $pay) = @_;
|
||||||
|
$self->paymentDriverId($pay->getId);
|
||||||
|
$self->paymentDriverLabel($pay->get('label'));
|
||||||
|
}
|
||||||
|
|
||||||
|
has cart => (
|
||||||
|
is => 'rw',
|
||||||
|
trigger => \&_mine_cart,
|
||||||
|
);
|
||||||
|
|
||||||
|
sub _mine_cart {
|
||||||
|
my ($self, $cart) = @_;
|
||||||
|
$self->taxes($cart->calculateTaxes);
|
||||||
|
|
||||||
|
my $billingAddress = $cart->getBillingAddress;
|
||||||
|
$self->paymentAddressId($billingAddress->getId);
|
||||||
|
$self->paymentAddressName($billingAddress->firstName . " " . $billingAddress->lastName);
|
||||||
|
$self->paymentAddress1($billingAddress->address1);
|
||||||
|
$self->paymentAddress2($billingAddress->address2);
|
||||||
|
$self->paymentAddress3($billingAddress->address3);
|
||||||
|
$self->paymentCity($billingAddress->city);
|
||||||
|
$self->paymentState($billingAddress->state);
|
||||||
|
$self->paymentCountry($billingAddress->country);
|
||||||
|
$self->paymentCode($billingAddress->code);
|
||||||
|
$self->paymentPhoneNumber($billingAddress->phoneNumber);
|
||||||
|
|
||||||
|
my $shippingAddress = $cart->getShippingAddress;
|
||||||
|
$self->shippingAddressId($shippingAddress->getId);
|
||||||
|
$self->shippingAddressName($shippingAddress->firstName . " " . $shippingAddress->lastName);
|
||||||
|
$self->shippingAddress1($shippingAddress->address1);
|
||||||
|
$self->shippingAddress2($shippingAddress->address2);
|
||||||
|
$self->shippingAddress3($shippingAddress->address3);
|
||||||
|
$self->shippingCity($shippingAddress->city);
|
||||||
|
$self->shippingState($shippingAddress->state);
|
||||||
|
$self->shippingCountry($shippingAddress->country);
|
||||||
|
$self->shippingCode($shippingAddress->code);
|
||||||
|
$self->shippingPhoneNumber($shippingAddress->phoneNumber);
|
||||||
|
if ($cart->requiresShipping) {
|
||||||
|
my $shipper = $cart->getShipper;
|
||||||
|
$self->shippingDriverId($shipper->getId);
|
||||||
|
$self->shippingDriverLabel($shipper->get('label'));
|
||||||
|
$self->shippingPrice($shipper->calculate($cart));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$self->shippingDriverLabel("NO SHIPPING");
|
||||||
|
$self->shippingPrice(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->shopCreditDeduction($cart->calculateShopCreditDeduction($self->amount));
|
||||||
|
$self->amount($self->amount + $self->shopCreditDeduction);
|
||||||
|
|
||||||
|
my $pay = $cart->getPaymentGateway;
|
||||||
|
$self->paymentDriverId($pay->getId);
|
||||||
|
$self->paymentDriverLabel($pay->get('label'));
|
||||||
|
|
||||||
|
foreach my $item (@{$cart->getItems}) {
|
||||||
|
$self->addItem({item=>$item});
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->chashierUserId($cart->getPosUser->userId);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
use WebGUI::Asset::Template;
|
use WebGUI::Asset::Template;
|
||||||
use WebGUI::Exception::Shop;
|
use WebGUI::Exception::Shop;
|
||||||
use WebGUI::Form;
|
use WebGUI::Form;
|
||||||
|
|
@ -33,6 +320,7 @@ This package keeps records of every puchase made.
|
||||||
|
|
||||||
# typical transaction goes like this:
|
# typical transaction goes like this:
|
||||||
my $transaction = WebGUI::Shop::Transaction->create({ cart=>$cart });
|
my $transaction = WebGUI::Shop::Transaction->create({ cart=>$cart });
|
||||||
|
$transaction->write;
|
||||||
my ($transactionNumber, $status, $message) = $paymentMethod->tryTransaction;
|
my ($transactionNumber, $status, $message) = $paymentMethod->tryTransaction;
|
||||||
if ($status eq "somekindofsuccess") {
|
if ($status eq "somekindofsuccess") {
|
||||||
$transaction->completePurchase($cart, $transactionNumber, $status, $message);
|
$transaction->completePurchase($cart, $transactionNumber, $status, $message);
|
||||||
|
|
@ -48,8 +336,155 @@ These subroutines are available from this package:
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
readonly session => my %session;
|
#-------------------------------------------------------------------
|
||||||
private properties => my %properties;
|
|
||||||
|
=head2 new ( session, transactionId )
|
||||||
|
|
||||||
|
Constructor. Instanciates a transaction from the database based upon a transactionId.
|
||||||
|
|
||||||
|
=head2 new ( properties )
|
||||||
|
|
||||||
|
Constructor. Builds a new transaction object.
|
||||||
|
|
||||||
|
=head2 new ( session, properties )
|
||||||
|
|
||||||
|
Constructor. Builds a new transaction object. This form of new is deprecated, and only exists for
|
||||||
|
backwards compatibility with the old "create" method.
|
||||||
|
|
||||||
|
=head3 session
|
||||||
|
|
||||||
|
A reference to the current session.
|
||||||
|
|
||||||
|
=head3 transactionId
|
||||||
|
|
||||||
|
The unique id of a transaction to instanciate.
|
||||||
|
|
||||||
|
=head3 properties
|
||||||
|
|
||||||
|
A hash reference that contains one of the following:
|
||||||
|
|
||||||
|
=head4 cart
|
||||||
|
|
||||||
|
A reference to a cart object. Will pull shipping method, shipping address, tax, items, and total from
|
||||||
|
it. Alternatively you can set manually any of the following properties that are set by cart automatically:
|
||||||
|
amount shippingAddressId shippingAddressName shippingAddress1 shippingAddress2 shippingAddress3 shippingCity
|
||||||
|
shippingState shippingCountry shippingCode shippingPhoneNumber shippingDriverId shippingDriverLabel shippingPrice
|
||||||
|
taxes shopCreditDeduction cashierUserId
|
||||||
|
|
||||||
|
You can also use the addItem() method to manually add items to the transaction rather than passing a cart full of items.
|
||||||
|
|
||||||
|
=head4 paymentAddress
|
||||||
|
|
||||||
|
A reference to a WebGUI::Shop::Address that contains the payment address. Alternatively you can set manually
|
||||||
|
any of the properties that are set by payment address automatically: paymentAddressId paymentAddressName
|
||||||
|
paymentAddress1 paymentAddress2 paymentAddress3 paymentCity paymentState paymentCountry paymentCode
|
||||||
|
paymentPhoneNumber
|
||||||
|
|
||||||
|
=head4 paymentMethod
|
||||||
|
|
||||||
|
A reference to a WebGUI::Shop::PayDriver subclass that is used to make payment. Alternatively you can set
|
||||||
|
manually any of the properties that are set by payment method automatically: paymentDriverId paymentDriverLabel
|
||||||
|
|
||||||
|
=head4 isSuccessful
|
||||||
|
|
||||||
|
A boolean indicating whether the transaction was completed successfully.
|
||||||
|
|
||||||
|
=head4 transactionCode
|
||||||
|
|
||||||
|
The transaction id or code given by the payment gateway.
|
||||||
|
|
||||||
|
=head4 statusCode
|
||||||
|
|
||||||
|
The status code that came back from the payment gateway when trying to process the payment.
|
||||||
|
|
||||||
|
=head4 statusMessage
|
||||||
|
|
||||||
|
The extended status message that came back from the payment gateway when trying to process the payment.
|
||||||
|
|
||||||
|
=head4 isRecurring
|
||||||
|
|
||||||
|
A boolean indicating whether this is a recurring transaction or not. Defaults to 0.
|
||||||
|
|
||||||
|
=head4 originatingTransactionId
|
||||||
|
|
||||||
|
Most of the time this will be empty. But if this is a recurring transaction, then this will hold the id of the original transaction that started the recurrence.
|
||||||
|
|
||||||
|
=head4 notes
|
||||||
|
|
||||||
|
A text field containing notes about this transaction.
|
||||||
|
|
||||||
|
=head4 userId
|
||||||
|
|
||||||
|
The userId of the user who created the transaction. If omitted, will use the current session->user.
|
||||||
|
|
||||||
|
=head4 username
|
||||||
|
|
||||||
|
The username of the user who created the transaction. If omitted, will use the current session->user.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
around BUILDARGS => sub {
|
||||||
|
my $orig = shift;
|
||||||
|
my $class = shift;
|
||||||
|
if (ref $_[0] eq 'HASH') {
|
||||||
|
my $properties = $_[0];
|
||||||
|
my $session = $properties->{session};
|
||||||
|
if (! (blessed $session && $session->isa('WebGUI::Session')) ) {
|
||||||
|
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Session", got=>(ref $session), error=>"Need a session.");
|
||||||
|
}
|
||||||
|
my ($transactionId, $dateOfPurchase, $orderNumber) = $class->_init($session);
|
||||||
|
$properties->{transactionId} = $transactionId;
|
||||||
|
$properties->{dateOfPurchase} = $dateOfPurchase;
|
||||||
|
$properties->{orderNumber} = $orderNumber;
|
||||||
|
return $class->$orig($properties);
|
||||||
|
}
|
||||||
|
my $session = shift;
|
||||||
|
if (! (blessed $session && $session->isa('WebGUI::Session'))) {
|
||||||
|
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Session", got=>(ref $session), error=>"Need a session.");
|
||||||
|
}
|
||||||
|
my $argument2 = shift;
|
||||||
|
if (!defined $argument2) {
|
||||||
|
WebGUI::Error::InvalidParam->throw( param=>$argument2, error=>"Need a vendorId.");
|
||||||
|
}
|
||||||
|
if (ref $argument2 eq 'HASH') {
|
||||||
|
##Build a new one
|
||||||
|
my ($transactionId, $dateOfPurchase, $orderNumber) = $class->_init($session);
|
||||||
|
my $properties = $argument2;
|
||||||
|
$properties->{session} = $session;
|
||||||
|
$properties->{transactionId} = $transactionId;
|
||||||
|
$properties->{dateOfPurchase} = $dateOfPurchase;
|
||||||
|
$properties->{orderNumber} = $orderNumber;
|
||||||
|
return $class->$orig($properties);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
##Look up one in the db
|
||||||
|
my $transaction = $session->db->quickHashRef("select * from transaction where transactionId=?", [$argument2]);
|
||||||
|
if ($transaction->{transactionId} eq "") {
|
||||||
|
WebGUI::Error::ObjectNotFound->throw(error=>"No such transaction.", id=>$argument2);
|
||||||
|
}
|
||||||
|
$transaction->{session} = $session;
|
||||||
|
return $class->$orig($transaction);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 _init ( session )
|
||||||
|
|
||||||
|
Builds a stub of object information in the database, and returns the newly created
|
||||||
|
transactionId, and the dateOfPurchase fields so the object can be initialized correctly.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub _init {
|
||||||
|
my $class = shift;
|
||||||
|
my $session = shift;
|
||||||
|
my $transactionId = $session->id->generate;
|
||||||
|
my $dateOfPurchase = WebGUI::DateTime->new($session)->toDatabase;
|
||||||
|
$session->db->write("insert into transaction (transactionId, dateOfPurchase) values (?, ?)",[$transactionId, $dateOfPurchase]);
|
||||||
|
my $orderNumber = $session->db->quickScalar('select orderNumber from transaction where transactionId=?', [$transactionId]);
|
||||||
|
return ($transactionId, $dateOfPurchase, $orderNumber);
|
||||||
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -135,41 +570,6 @@ sub completePurchase {
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 create ( session, properties )
|
|
||||||
|
|
||||||
Constructor. Creates a new transaction object. Returns a reference to the object.
|
|
||||||
|
|
||||||
=head3 session
|
|
||||||
|
|
||||||
A reference to the current session.
|
|
||||||
|
|
||||||
=head3 properties
|
|
||||||
|
|
||||||
See update().
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub create {
|
|
||||||
my ($class, $session, $properties) = @_;
|
|
||||||
unless (defined $session && $session->isa("WebGUI::Session")) {
|
|
||||||
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Session", got=>(ref $session), error=>"Need a session.");
|
|
||||||
}
|
|
||||||
my $transactionId = $session->id->generate;
|
|
||||||
my $cashier = $session->user;
|
|
||||||
my $posUser = $cashier;
|
|
||||||
my $cart = $properties->{cart};
|
|
||||||
if (defined $cart) {
|
|
||||||
$posUser = $cart->getPosUser;
|
|
||||||
}
|
|
||||||
$session->db->write('insert into transaction (transactionId, userId, username, cashierUserId, dateOfPurchase) values (?,?,?,?,now())',
|
|
||||||
[$transactionId, $posUser->userId, $posUser->username, $cashier->userId]);
|
|
||||||
my $self = $class->new($session, $transactionId);
|
|
||||||
$self->update($properties);
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 delete ()
|
=head2 delete ()
|
||||||
|
|
||||||
Deletes this transaction and all transactionItems contained in it.
|
Deletes this transaction and all transactionItems contained in it.
|
||||||
|
|
@ -243,6 +643,7 @@ sub duplicate {
|
||||||
$newTransaction->addItem( $item->get );
|
$newTransaction->addItem( $item->get );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$newTransaction->write;
|
||||||
return $newTransaction;
|
return $newTransaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -290,27 +691,6 @@ sub formatCurrency {
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=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 getId ()
|
=head2 getId ()
|
||||||
|
|
||||||
Returns the unique id for this transaction.
|
Returns the unique id for this transaction.
|
||||||
|
|
@ -409,31 +789,31 @@ sub getTransactionVars {
|
||||||
%{ $self->get },
|
%{ $self->get },
|
||||||
viewDetailUrl => $url->page( 'shop=transaction;method=viewMy;transactionId='.$self->getId, 1 ),
|
viewDetailUrl => $url->page( 'shop=transaction;method=viewMy;transactionId='.$self->getId, 1 ),
|
||||||
cancelRecurringUrl => $url->page('shop=transaction;method=cancelRecurring;transactionId='.$self->getId),
|
cancelRecurringUrl => $url->page('shop=transaction;method=cancelRecurring;transactionId='.$self->getId),
|
||||||
amount => sprintf( "%.2f", $self->get('amount') ),
|
amount => sprintf( "%.2f", $self->amount ),
|
||||||
inShopCreditDeduction => sprintf( "%.2f", $self->get('shopCreditDeduction') ),
|
inShopCreditDeduction => sprintf( "%.2f", $self->shopCreditDeduction ),
|
||||||
taxes => sprintf( "%.2f", $self->get('taxes') ),
|
taxes => sprintf( "%.2f", $self->taxes ),
|
||||||
shippingPrice => sprintf( "%.2f", $self->get('shippingPrice') ),
|
shippingPrice => sprintf( "%.2f", $self->shippingPrice ),
|
||||||
shippingAddress => $self->formatAddress( {
|
shippingAddress => $self->formatAddress( {
|
||||||
name => $self->get('shippingAddressName'),
|
name => $self->shippingAddressName,
|
||||||
address1 => $self->get('shippingAddress1'),
|
address1 => $self->shippingAddress1,
|
||||||
address2 => $self->get('shippingAddress2'),
|
address2 => $self->shippingAddress2,
|
||||||
address3 => $self->get('shippingAddress3'),
|
address3 => $self->shippingAddress3,
|
||||||
city => $self->get('shippingCity'),
|
city => $self->shippingCity,
|
||||||
state => $self->get('shippingState'),
|
state => $self->shippingState,
|
||||||
code => $self->get('shippingCode'),
|
code => $self->shippingCode,
|
||||||
country => $self->get('shippingCountry'),
|
country => $self->shippingCountry,
|
||||||
phoneNumber => $self->get('shippingPhoneNumber'),
|
phoneNumber => $self->shippingPhoneNumber,
|
||||||
} ),
|
} ),
|
||||||
paymentAddress => $self->formatAddress({
|
paymentAddress => $self->formatAddress({
|
||||||
name => $self->get('paymentAddressName'),
|
name => $self->paymentAddressName,
|
||||||
address1 => $self->get('paymentAddress1'),
|
address1 => $self->paymentAddress1,
|
||||||
address2 => $self->get('paymentAddress2'),
|
address2 => $self->paymentAddress2,
|
||||||
address3 => $self->get('paymentAddress3'),
|
address3 => $self->paymentAddress3,
|
||||||
city => $self->get('paymentCity'),
|
city => $self->paymentCity,
|
||||||
state => $self->get('paymentState'),
|
state => $self->paymentState,
|
||||||
code => $self->get('paymentCode'),
|
code => $self->paymentCode,
|
||||||
country => $self->get('paymentCountry'),
|
country => $self->paymentCountry,
|
||||||
phoneNumber => $self->get('paymentPhoneNumber'),
|
phoneNumber => $self->paymentPhoneNumber,
|
||||||
} ),
|
} ),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -441,7 +821,7 @@ sub getTransactionVars {
|
||||||
my @items = ();
|
my @items = ();
|
||||||
foreach my $item (@{$self->getItems}) {
|
foreach my $item (@{$self->getItems}) {
|
||||||
my $address = '';
|
my $address = '';
|
||||||
if ($self->get('shippingAddressId') ne $item->get('shippingAddressId')) {
|
if ($self->shippingAddressId ne $item->get('shippingAddressId')) {
|
||||||
$address = $self->formatAddress({
|
$address = $self->formatAddress({
|
||||||
name => $item->get('shippingAddressName'),
|
name => $item->get('shippingAddressName'),
|
||||||
address1 => $item->get('shippingAddress1'),
|
address1 => $item->get('shippingAddress1'),
|
||||||
|
|
@ -509,67 +889,6 @@ sub isFirst {
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 isRecurring ( )
|
|
||||||
|
|
||||||
Returns 1 if this is a recurring transaction.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub isRecurring {
|
|
||||||
my $self = shift;
|
|
||||||
return $self->get('isRecurring');
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 isSuccessful ( )
|
|
||||||
|
|
||||||
Returns 1 if this transaction had a successful payment applied to it.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub isSuccessful {
|
|
||||||
my $self = shift;
|
|
||||||
return $self->get('isSuccessful');
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 new ( session, transactionId )
|
|
||||||
|
|
||||||
Constructor. Instanciates a transaction based upon a transactionId.
|
|
||||||
|
|
||||||
=head3 session
|
|
||||||
|
|
||||||
A reference to the current session.
|
|
||||||
|
|
||||||
=head3 transactionId
|
|
||||||
|
|
||||||
The unique id of a transaction to instanciate.
|
|
||||||
|
|
||||||
=cut
|
|
||||||
|
|
||||||
sub new {
|
|
||||||
my ($class, $session, $transactionId) = @_;
|
|
||||||
unless (defined $session && $session->isa("WebGUI::Session")) {
|
|
||||||
WebGUI::Error::InvalidObject->throw(expected=>"WebGUI::Session", got=>(ref $session), error=>"Need a session.");
|
|
||||||
}
|
|
||||||
unless (defined $transactionId) {
|
|
||||||
WebGUI::Error::InvalidParam->throw(error=>"Need a transactionId.");
|
|
||||||
}
|
|
||||||
my $transaction = $session->db->quickHashRef('select * from transaction where transactionId=?', [$transactionId]);
|
|
||||||
if ($transaction->{transactionId} eq "") {
|
|
||||||
WebGUI::Error::ObjectNotFound->throw(error=>"No such transaction.", id=>$transactionId);
|
|
||||||
}
|
|
||||||
my $self = register $class;
|
|
||||||
my $id = id $self;
|
|
||||||
$session{ $id } = $session;
|
|
||||||
$properties{ $id } = $transaction;
|
|
||||||
return $self;
|
|
||||||
}
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
|
||||||
|
|
||||||
=head2 newByGatewayId ( session, gatewayId, payDriverId )
|
=head2 newByGatewayId ( session, gatewayId, payDriverId )
|
||||||
|
|
||||||
Constructor. Instanciates a transaction based upon a paymentDriverId and a payment gateway issued id.
|
Constructor. Instanciates a transaction based upon a paymentDriverId and a payment gateway issued id.
|
||||||
|
|
@ -640,8 +959,8 @@ sub sendNotifications {
|
||||||
# purchase receipt
|
# purchase receipt
|
||||||
$inbox->addMessage( {
|
$inbox->addMessage( {
|
||||||
message => $receipt,
|
message => $receipt,
|
||||||
subject => $i18n->get('receipt subject') . ' ' . $self->get('orderNumber'),
|
subject => $i18n->get('receipt subject') . ' ' . $self->orderNumber,
|
||||||
userId => $self->get('userId'),
|
userId => $self->userId,
|
||||||
status => 'completed',
|
status => 'completed',
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
|
@ -652,7 +971,7 @@ sub sendNotifications {
|
||||||
WebGUI::Macro::process($session, \$notification);
|
WebGUI::Macro::process($session, \$notification);
|
||||||
$inbox->addMessage( {
|
$inbox->addMessage( {
|
||||||
message => $notification,
|
message => $notification,
|
||||||
subject => $i18n->get('a sale has been made') . ' ' . $self->get('orderNumber'),
|
subject => $i18n->get('a sale has been made') . ' ' . $self->orderNumber,
|
||||||
groupId => $session->setting->get('shopSaleNotificationGroupId'),
|
groupId => $session->setting->get('shopSaleNotificationGroupId'),
|
||||||
status => 'unread',
|
status => 'unread',
|
||||||
} );
|
} );
|
||||||
|
|
@ -678,135 +997,17 @@ sub thankYou {
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 update ( properties )
|
=head2 write ( properties )
|
||||||
|
|
||||||
Sets properties in the transaction.
|
Sets properties in the transaction.
|
||||||
|
|
||||||
=head3 properties
|
|
||||||
|
|
||||||
A hash reference that contains one of the following:
|
|
||||||
|
|
||||||
=head4 cart
|
|
||||||
|
|
||||||
A reference to a cart object. Will pull shipping method, shipping address, tax, items, and total from
|
|
||||||
it. Alternatively you can set manually any of the following properties that are set by cart automatically:
|
|
||||||
amount shippingAddressId shippingAddressName shippingAddress1 shippingAddress2 shippingAddress3 shippingCity
|
|
||||||
shippingState shippingCountry shippingCode shippingPhoneNumber shippingDriverId shippingDriverLabel shippingPrice
|
|
||||||
taxes shopCreditDeduction
|
|
||||||
|
|
||||||
You can also use the addItem() method to manually add items to the transaction rather than passing a cart full of items.
|
|
||||||
|
|
||||||
=head4 paymentAddress
|
|
||||||
|
|
||||||
A reference to a WebGUI::Shop::Address that contains the payment address. Alternatively you can set manually
|
|
||||||
any of the properties that are set by payment address automatically: paymentAddressId paymentAddressName
|
|
||||||
paymentAddress1 paymentAddress2 paymentAddress3 paymentCity paymentState paymentCountry paymentCode
|
|
||||||
paymentPhoneNumber
|
|
||||||
|
|
||||||
=head4 paymentMethod
|
|
||||||
|
|
||||||
A reference to a WebGUI::Shop::PayDriver subclass that is used to make payment. Alternatively you can set
|
|
||||||
manually any of the properties that are set by payment method automatically: paymentDriverId paymentDriverLabel
|
|
||||||
|
|
||||||
=head4 isSuccessful
|
|
||||||
|
|
||||||
A boolean indicating whether the transaction was completed successfully.
|
|
||||||
|
|
||||||
=head4 transactionCode
|
|
||||||
|
|
||||||
The transaction id or code given by the payment gateway.
|
|
||||||
|
|
||||||
=head4 statusCode
|
|
||||||
|
|
||||||
The status code that came back from the payment gateway when trying to process the payment.
|
|
||||||
|
|
||||||
=head4 statusMessage
|
|
||||||
|
|
||||||
The extended status message that came back from the payment gateway when trying to process the payment.
|
|
||||||
|
|
||||||
=head4 isRecurring
|
|
||||||
|
|
||||||
A boolean indicating whether this is a recurring transaction or not. Defaults to 0.
|
|
||||||
|
|
||||||
=head4 originatingTransactionId
|
|
||||||
|
|
||||||
Most of the time this will be empty. But if this is a recurring transaction, then this will hold the id of the original transaction that started the recurrence.
|
|
||||||
|
|
||||||
=head4 notes
|
|
||||||
|
|
||||||
A text field containing notes about this transaction.
|
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub update {
|
sub write {
|
||||||
my ($self, $newProperties) = @_;
|
my $self = shift;
|
||||||
my $id = id $self;
|
my %properties = %{ $self->get() };
|
||||||
if (exists $newProperties->{cart}) {
|
delete @properties{qw/session cart paymentMethod/};
|
||||||
my $cart = $newProperties->{cart};
|
$self->session->db->setRow("transaction", "transactionId", \%properties);
|
||||||
$newProperties->{taxes} = $cart->calculateTaxes;
|
|
||||||
|
|
||||||
my $billingAddress = $cart->getBillingAddress;
|
|
||||||
$newProperties->{paymentAddressId} = $billingAddress->getId;
|
|
||||||
$newProperties->{paymentAddressName} = $billingAddress->get('firstName') . " " . $billingAddress->get('lastName');
|
|
||||||
$newProperties->{paymentAddress1} = $billingAddress->get('address1');
|
|
||||||
$newProperties->{paymentAddress2} = $billingAddress->get('address2');
|
|
||||||
$newProperties->{paymentAddress3} = $billingAddress->get('address3');
|
|
||||||
$newProperties->{paymentCity} = $billingAddress->get('city');
|
|
||||||
$newProperties->{paymentState} = $billingAddress->get('state');
|
|
||||||
$newProperties->{paymentCountry} = $billingAddress->get('country');
|
|
||||||
$newProperties->{paymentCode} = $billingAddress->get('code');
|
|
||||||
$newProperties->{paymentPhoneNumber} = $billingAddress->get('phoneNumber');
|
|
||||||
|
|
||||||
my $shippingAddress = $cart->getShippingAddress;
|
|
||||||
$newProperties->{shippingAddressId} = $shippingAddress->getId;
|
|
||||||
$newProperties->{shippingAddressName} = $shippingAddress->get('firstName') . " " . $shippingAddress->get('lastName');
|
|
||||||
$newProperties->{shippingAddress1} = $shippingAddress->get('address1');
|
|
||||||
$newProperties->{shippingAddress2} = $shippingAddress->get('address2');
|
|
||||||
$newProperties->{shippingAddress3} = $shippingAddress->get('address3');
|
|
||||||
$newProperties->{shippingCity} = $shippingAddress->get('city');
|
|
||||||
$newProperties->{shippingState} = $shippingAddress->get('state');
|
|
||||||
$newProperties->{shippingCountry} = $shippingAddress->get('country');
|
|
||||||
$newProperties->{shippingCode} = $shippingAddress->get('code');
|
|
||||||
$newProperties->{shippingPhoneNumber} = $shippingAddress->get('phoneNumber');
|
|
||||||
|
|
||||||
if ($cart->requiresShipping) {
|
|
||||||
my $shipper = $cart->getShipper;
|
|
||||||
$newProperties->{shippingDriverId} = $shipper->getId;
|
|
||||||
$newProperties->{shippingDriverLabel} = $shipper->get('label');
|
|
||||||
$newProperties->{shippingPrice} = $shipper->calculate($cart);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$newProperties->{shippingDriverLabel} = "NO SHIPPING";
|
|
||||||
$newProperties->{shippingPrice} = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
$newProperties->{amount} = $cart->calculateTotal + $newProperties->{shopCreditDeduction};
|
|
||||||
$newProperties->{shopCreditDeduction} = $cart->calculateShopCreditDeduction($newProperties->{amount});
|
|
||||||
$newProperties->{amount} += $newProperties->{shopCreditDeduction};
|
|
||||||
|
|
||||||
my $pay = $cart->getPaymentGateway;
|
|
||||||
$newProperties->{paymentDriverId} = $pay->getId;
|
|
||||||
$newProperties->{paymentDriverLabel} = $pay->get('label');
|
|
||||||
|
|
||||||
foreach my $item (@{$cart->getItems}) {
|
|
||||||
$self->addItem({item=>$item});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (exists $newProperties->{paymentMethod}) {
|
|
||||||
my $pay = $newProperties->{paymentMethod};
|
|
||||||
$newProperties->{paymentDriverId} = $pay->getId;
|
|
||||||
$newProperties->{paymentDriverLabel} = $pay->get('label');
|
|
||||||
}
|
|
||||||
my @fields = (qw( isSuccessful transactionCode statusCode statusMessage amount shippingAddressId
|
|
||||||
shippingAddressName shippingAddress1 shippingAddress2 shippingAddress3 shippingCity shippingState
|
|
||||||
shippingCountry shippingCode shippingPhoneNumber shippingDriverId shippingDriverLabel notes
|
|
||||||
shippingPrice paymentAddressId paymentAddressName originatingTransactionId isRecurring
|
|
||||||
paymentAddress1 paymentAddress2 paymentAddress3 paymentCity paymentState paymentCountry paymentCode
|
|
||||||
paymentPhoneNumber paymentDriverId paymentDriverLabel taxes shopCreditDeduction));
|
|
||||||
foreach my $field (@fields) {
|
|
||||||
$properties{$id}{$field} = (exists $newProperties->{$field}) ? $newProperties->{$field} : $properties{$id}{$field};
|
|
||||||
}
|
|
||||||
$self->session->db->setRow("transaction","transactionId",$properties{$id});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
@ -820,7 +1021,7 @@ Cancels a recurring transaction.
|
||||||
sub www_cancelRecurring {
|
sub www_cancelRecurring {
|
||||||
my ($class, $session) = @_;
|
my ($class, $session) = @_;
|
||||||
my $self = $class->new($session, $session->form->get("transactionId"));
|
my $self = $class->new($session, $session->form->get("transactionId"));
|
||||||
return $session->privilege->insufficient unless (WebGUI::Shop::Admin->new($session)->canManage || $session->user->userId eq $self->get('userId'));
|
return $session->privilege->insufficient unless (WebGUI::Shop::Admin->new($session)->canManage || $session->user->userId eq $self->userId);
|
||||||
my $error = $self->cancelRecurring;
|
my $error = $self->cancelRecurring;
|
||||||
|
|
||||||
# TODO: Needs to be templated or included in www_view.
|
# TODO: Needs to be templated or included in www_view.
|
||||||
|
|
@ -1293,9 +1494,8 @@ sub www_update {
|
||||||
return $session->privilege->insufficient unless (WebGUI::Shop::Admin->new($session)->canManage);
|
return $session->privilege->insufficient unless (WebGUI::Shop::Admin->new($session)->canManage);
|
||||||
my $self = $class->new($session, $session->form->get("transactionId"));
|
my $self = $class->new($session, $session->form->get("transactionId"));
|
||||||
my $form = $session->form;
|
my $form = $session->form;
|
||||||
$self->update({
|
$self->notes($form->get('notes'));
|
||||||
notes => $form->get('notes'),
|
$self->write;
|
||||||
});
|
|
||||||
return $class->www_view($session);
|
return $class->www_view($session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ plan tests => 77; # Increment this number for each test you create
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# put your tests here
|
# put your tests here
|
||||||
|
|
||||||
my $transaction = WebGUI::Shop::Transaction->create($session,{
|
my $transaction = WebGUI::Shop::Transaction->new($session,{
|
||||||
amount => 40,
|
amount => 40,
|
||||||
shippingAddressId => 'xxx1',
|
shippingAddressId => 'xxx1',
|
||||||
shippingAddressName => 'abc',
|
shippingAddressName => 'abc',
|
||||||
|
|
@ -75,33 +75,33 @@ isa_ok($transaction->session, "WebGUI::Session");
|
||||||
|
|
||||||
|
|
||||||
# basic transaction properties
|
# basic transaction properties
|
||||||
is($transaction->get("amount"), 40, "set and get amount");
|
is($transaction->amount, 40, "set and get amount");
|
||||||
is($transaction->get("shippingAddressId"), 'xxx1', "set and get shipping address id");
|
is($transaction->shippingAddressId, 'xxx1', "set and get shipping address id");
|
||||||
is($transaction->get("shippingAddressName"), 'abc', "set and get shipping address name");
|
is($transaction->shippingAddressName, 'abc', "set and get shipping address name");
|
||||||
is($transaction->get("shippingAddress1"), 'def', "set and get shipping address 1");
|
is($transaction->shippingAddress1, 'def', "set and get shipping address 1");
|
||||||
is($transaction->get("shippingAddress2"), 'hij', "set and get shipping address 2");
|
is($transaction->shippingAddress2, 'hij', "set and get shipping address 2");
|
||||||
is($transaction->get("shippingAddress3"), 'lmn', "set and get shipping address 3");
|
is($transaction->shippingAddress3, 'lmn', "set and get shipping address 3");
|
||||||
is($transaction->get("shippingCity"), 'opq', "set and get shipping city");
|
is($transaction->shippingCity, 'opq', "set and get shipping city");
|
||||||
is($transaction->get("shippingState"), 'wxy', "set and get shipping state");
|
is($transaction->shippingState, 'wxy', "set and get shipping state");
|
||||||
is($transaction->get("shippingCountry"), 'z', "set and get shipping country");
|
is($transaction->shippingCountry, 'z', "set and get shipping country");
|
||||||
is($transaction->get("shippingCode"), '53333', "set and get shipping code");
|
is($transaction->shippingCode, '53333', "set and get shipping code");
|
||||||
is($transaction->get("shippingPhoneNumber"), '123456', "set and get shipping phone number");
|
is($transaction->shippingPhoneNumber, '123456', "set and get shipping phone number");
|
||||||
is($transaction->get("shippingDriverId"), 'xxx2', "set and get shipping driver id");
|
is($transaction->shippingDriverId, 'xxx2', "set and get shipping driver id");
|
||||||
is($transaction->get("shippingDriverLabel"), 'foo', "set and get shipping driver label");
|
is($transaction->shippingDriverLabel, 'foo', "set and get shipping driver label");
|
||||||
is($transaction->get("shippingPrice"), 5, "set and get shipping price");
|
is($transaction->shippingPrice, 5, "set and get shipping price");
|
||||||
is($transaction->get("paymentAddressId"), 'xxx3', "set and get payment address id");
|
is($transaction->paymentAddressId, 'xxx3', "set and get payment address id");
|
||||||
is($transaction->get("paymentAddressName"), 'abc1', "set and get payment address name");
|
is($transaction->paymentAddressName, 'abc1', "set and get payment address name");
|
||||||
is($transaction->get("paymentAddress1"), 'def1', "set and get payment address 1");
|
is($transaction->paymentAddress1, 'def1', "set and get payment address 1");
|
||||||
is($transaction->get("paymentAddress2"), 'hij1', "set and get payment address 2");
|
is($transaction->paymentAddress2, 'hij1', "set and get payment address 2");
|
||||||
is($transaction->get("paymentAddress3"), 'lmn1', "set and get payment address 3");
|
is($transaction->paymentAddress3, 'lmn1', "set and get payment address 3");
|
||||||
is($transaction->get("paymentCity"), 'opq1', "set and get payment city");
|
is($transaction->paymentCity, 'opq1', "set and get payment city");
|
||||||
is($transaction->get("paymentState"), 'wxy1', "set and get payment state");
|
is($transaction->paymentState, 'wxy1', "set and get payment state");
|
||||||
is($transaction->get("paymentCountry"), 'z1', "set and get payment country");
|
is($transaction->paymentCountry, 'z1', "set and get payment country");
|
||||||
is($transaction->get("paymentCode"), '66666', "set and get payment code");
|
is($transaction->paymentCode, '66666', "set and get payment code");
|
||||||
is($transaction->get("paymentPhoneNumber"), '908765', "set and get payment phone number");
|
is($transaction->paymentPhoneNumber, '908765', "set and get payment phone number");
|
||||||
is($transaction->get("paymentDriverId"), 'xxx4', "set and get payment driver id");
|
is($transaction->paymentDriverId, 'xxx4', "set and get payment driver id");
|
||||||
is($transaction->get("paymentDriverLabel"), 'kkk', "set and get payment driver label");
|
is($transaction->paymentDriverLabel, 'kkk', "set and get payment driver label");
|
||||||
is($transaction->get("taxes"), 7, "set and get taxes");
|
is($transaction->taxes, 7, "set and get taxes");
|
||||||
|
|
||||||
|
|
||||||
$transaction->update({
|
$transaction->update({
|
||||||
|
|
@ -243,7 +243,7 @@ addToCleanup($shopUser, $shopAdmin, $shopGroup);
|
||||||
$session->setting->set('shopSaleNotificationGroupId', $shopGroup->getId);
|
$session->setting->set('shopSaleNotificationGroupId', $shopGroup->getId);
|
||||||
$session->user({userId => $shopUser->getId});
|
$session->user({userId => $shopUser->getId});
|
||||||
|
|
||||||
my $trans = WebGUI::Shop::Transaction->create($session, {});
|
my $trans = WebGUI::Shop::Transaction->new($session, {});
|
||||||
ok($trans->can('sendNotifications'), 'sendNotifications: valid method for transactions');
|
ok($trans->can('sendNotifications'), 'sendNotifications: valid method for transactions');
|
||||||
addToCleanup($trans);
|
addToCleanup($trans);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue