Set up enhanced logging of transactions.

Note that now, all transactions are logged, whether they
fail or not.  Failed transactions are logged with status
canceled.  ITransact transactions have additional data
logged.
This commit is contained in:
Colin Kuskie 2008-01-30 15:59:09 +00:00
parent 215914590a
commit d2e55307ed
6 changed files with 140 additions and 3 deletions

View file

@ -51,6 +51,8 @@
- Added migration utility for Gallery
- Removed old .tmpl files from upgrades. ALL templates in upgrades must now
be in Packages!
- Changed transaction logging in the Commerce system, so that all connection and transaction errors
are now logged automatically, but listed as Canceled with the error message as to why.
- add: widgetize asset macro. called like so: ^Widget(assetId, width,
height, templateId); where assetId is the asset of the widget to
widgetize and templateId is the template for the widget itself. If

View file

@ -23,6 +23,7 @@ my $quiet; # this line required
my $session = start(); # this line required
removeOldPhotoGallery($session);
speedUp($session);
enhanceITransactLogging($session);
finish($session); # this line required
@ -33,6 +34,17 @@ sub speedUp {
$session->db->write("alter table assetData add index assetId_status (assetId,status)");
}
#----------------------------------------------------------------------------
# Add more data to the transaction table
sub enhanceITransactLogging {
my $session = shift;
print "\tAdd additional ITransact data to the transaction table..." unless $quiet;
$session->db->write('alter table transaction add column XID varchar(100) default null');
$session->db->write('alter table transaction add column authcode varchar(100) default null');
$session->db->write('alter table transaction add column message text default null');
print "DONE!\n" unless $quiet;
}
#-------------------------------------------------
sub removeOldPhotoGallery {
my $session = shift;

View file

@ -618,5 +618,20 @@ sub validateFormData {
return $self->session->errorHandler->fatal("You must override the validateFormData method in the payment plugin.");
}
=head2 logExtraTransactionData ( $transaction )
This method puts extra, Payment plugin specific data into the transaction log. This
needs to be be overridden to actually do the logging.
=head3 $transaction
A WebGUI::Commerce::Transaction object to do the logging.
=cut
sub logExtraTransactionData {
return 1;
}
1;

View file

@ -668,5 +668,35 @@ sub validateFormData {
return \@error;
}
sub logExtraTransactionData {
my ($self, $transaction) = @_;
$self->session->errorHandler->warn('transaction: '.$transaction->{_transactionId});
if ( exists($self->{_connectionError}) && $self->{_connectionError}) { ##Bad connection
$self->session->errorHandler->warn('Connection error');
$transaction->message($self->connectionError);
return;
}
elsif (exists($self->{_transactionError}) && $self->{_transactionError}) { ##Bad transaction
$self->session->errorHandler->warn('Transaction error');
$transaction->message($self->resultMessage);
$transaction->xid($self->{_response}->{XID});
return;
}
else { ##Everything went well
$self->session->errorHandler->warn('OK transaction');
if ($self->{_response}->{Status} eq 'OK') {
$transaction->message($self->{_response}->{Status});
}
else {
$transaction->message($self->resultMessage);
}
$transaction->xid($self->{_response}->{XID});
if (! ref $self->{_response}->{AuthCode} ) {
$transaction->authcode($self->{_response}->{AuthCode});
}
return;
}
}
1;

View file

@ -70,6 +70,30 @@ sub addItem {
#-------------------------------------------------------------------
=head2 authcode ( authcode )
Returns the authcode connected to the transaction. If authcode is given the authcode property is set to that.
Presently, this is only used by the ITransact module.
=head3 authcode
The authcode of the current transaction.
=cut
sub authcode {
my ($self, $authcode) = @_;
if ($authcode) {
$self->{_properties}{authcode} = $authcode;
$self->session->db->write("update transaction set authcode=? where transactionId=?",[$authcode, $self->{_transactionId}]);
}
return $self->{_properties}{authcode};
}
#-------------------------------------------------------------------
=head2 cancelTransaction ( )
Cancels a recurring transaction. This is done by trying to cancel the subscription at the gateway
@ -419,6 +443,30 @@ sub lastPayedTerm {
#-------------------------------------------------------------------
=head2 message ( message )
Returns the message connected to the transaction. If message is given the message property is set to that.
Presently, this is only used by the ITransact module.
=head3 message
The message of the current transaction.
=cut
sub message {
my ($self, $message) = @_;
if ($message) {
$self->{_properties}{message} = $message;
$self->session->db->write("update transaction set message=? where transactionId=?",[$message, $self->{_transactionId}]);
}
return $self->{_properties}{message};
}
#-------------------------------------------------------------------
=head2 new ( transactionId, [ gateway, [ userId ] ] )
Constructor. Returns a transaction object. If transactionId is set to 'new' a new transaction is created.
@ -687,6 +735,30 @@ sub transactionsByUser {
return \@transactions;
}
#-------------------------------------------------------------------
=head2 xid ( xid )
Returns the xid connected to the transaction. If xid is given the xid property is set to that.
Presently, this is only used by the ITransact module.
=head3 xid
The xid of the current transaction.
=cut
sub xid {
my ($self, $xid) = @_;
if ($xid) {
$self->{_properties}{xid} = $xid;
$self->session->db->write("update transaction set xid=? where transactionId=?",[$xid, $self->{_transactionId}]);
}
return $self->{_properties}{xid};
}
1;

View file

@ -503,6 +503,10 @@ sub www_checkoutSubmit {
$transaction->gatewayId($plugin->gatewayId);
$transaction->gateway($plugin->namespace);
##New transaction logging code for ITransact module
##goes here.
$plugin->logExtraTransactionData($transaction);
# check transaction result
unless ($plugin->connectionError) {
@ -519,14 +523,16 @@ sub www_checkoutSubmit {
$var->{status} = $i18n->get('transaction error');
$var->{error} = $plugin->transactionError;
$var->{errorCode} = $plugin->errorCode;
$transaction->delete;
$transaction->status('Canceled');
#$transaction->delete;
}
} else {
$checkoutError = 1;
$var->{status} = $i18n->get('connection error');
$var->{error} = $plugin->connectionError;
$var->{errorCode} = $plugin->errorCode;
$transaction->delete;
$transaction->status('Canceled');
#$transaction->delete;
}
push(@resultLoop, $var);