#!/usr/bin/perl
my $bFound = 0;
my $sDir;
foreach $sDir (@INC)
{
if ($sDir eq ".")
{
$bFound = 1;
last;
}
}
if (!$bFound)
{
push (@INC, ".");
}
push (@INC, "cgi-bin");
require al000002;
require as000002;
require ad000002;
require ae000002;
require ao000002;
require sm000002;
use Socket;
use strict;
$::prog_name = "ORDERSCR";
$::prog_name = $::prog_name;
$::prog_ver = '$Revision: 39917 $ ';
$::prog_ver = substr($::prog_ver, 11);
$::prog_ver =~ s/ \$//;
$::FORWARD = 0;
$::BACKWARD = 1;
$::eDelivery = 0;
$::eInvoice = 1;
$::ORDER_BLOB_VERSION = 25;
$::ORDER_DETAIL_BLOB_VERSION = 13;
$::g_sSmtpServer = "relay.gradwell.net";
$::g_sUserKey = "8a96d5b8d79e6e11c1fed37cabcf0dda";
$::g_nCurrentSequenceNumber = -1;
$::g_nNextSequenceNumber = -1;
$::g_bSpitSSLChange = $::FALSE;
my $nDebugLogLevel = 0;
if ($nDebugLogLevel)
{
$::DEBUG_CLASS_FILTER |= $::DC_ORDERSCRIPT;
$::DC_LOG_SHORT = 1;
}
my $bDivertPSPAuthorise = $::FALSE;
my $nSimulatePSPAuthoriseError = 0;
$::g_pFieldSizes =
{
'NAME' => 40,
'FIRSTNAME' => 40,
'LASTNAME' => 40,
'SALUTATION' => 15,
'JOBTITLE' => 50,
'COMPANY' => 100,
'PHONE' => 25,
'MOBILE' => 25,
'FAX' => 25,
'EMAIL' => 255,
'ADDRESS1' => 200,
'ADDRESS2' => 200,
'ADDRESS3' => 200,
'ADDRESS4' => 200,
'POSTALCODE' => 50,
'COUNTRY' => 75,
'USERDEFINED' => 255,
'HOWFOUND' => 255,
'WHYBUY' => 255,
'PONO' => 50,
};
$::g_sSavedMailSeparator = "------SDMultipart-----\r\n";
Init();
ProcessInput();
exit;
sub Init
{
$::g_bFirstError = $::TRUE;
my (@Response, $Status, $Message, $sAction, $sSendMailButton);
@Response = ReadAndParseInput();
($Status, $Message) = @Response;
if ($Status != $::SUCCESS)
{
ACTINIC::TerminalError($Message);
}
if ((not defined $::g_InputHash{'ACTION'}) &&
($::g_InputHash{'m_6'} eq 'VCSCALL'))
{
my $sAuthCallURL = ACTINIC::DecodeText($::g_InputHash{'m_3'}, $ACTINIC::FORM_URL_ENCODED);
$sAuthCallURL =~ /.*?SHOP=(.*?)\&/;
$::g_InputHash{'SHOP'} = $1;
($Status, $Message) = ACTINIC::ProcessPath($::g_InputHash{'SHOP'});
if ($Status != $::SUCCESS)
{
ACTINIC::TerminalError($Message);
}
$sAuthCallURL =~ /.*?SEQUENCE=(.*?)\&/;
$::g_InputHash{'SEQUENCE'} = $1;
$sAuthCallURL =~ /.*?ACTION=(.*?)\&/;
$::g_InputHash{'ACTION'} = $1;
$sAuthCallURL =~ /.*?CARTID=(.*?)\&/;
$::g_InputHash{'CARTID'} = $1;
$::g_InputHash{'ACT_POSTPROCESS'} = 1;
$::g_InputHash{ON} = $::g_InputHash{m_1};
$::g_InputHash{AM} = $::g_InputHash{p6} * $::g_InputHash{m_8};
}
if ($::g_InputHash{'ACTION'} =~ m/SSP_TRACK/i)
{
my $sPath = ACTINIC::GetPath();
@Response = ACTINIC::ReadPromptFile($sPath);
($Status, $Message) = @Response;
if ($Status != $::SUCCESS)
{
ACTINIC::ReportError($Message, ACTINIC::GetPath());
}
@Response = ACTINIC::ReadSSPSetupFile($sPath);
($Status, $Message) = @Response;
if ($Status != $::SUCCESS)
{
ACTINIC::ReportError($Message, ACTINIC::GetPath());
}
@Response = FormatTrackingPage();
($Status, $Message) = @Response;
if ($Status != $::SUCCESS)
{
ACTINIC::ReportError($Message, ACTINIC::GetPath());
}
my $sHTML = $Response[2];
ACTINIC::PrintPage($sHTML, undef);
exit;
}
if ($::g_InputHash{'SEQUENCE'} <= 3)
{
CreateAddressBook();
}
@Response = ReadAndParseBlobs();
($Status, $Message) = @Response;
if ($Status != $::SUCCESS)
{
ACTINIC::ReportError($Message, ACTINIC::GetPath());
}
$::g_sWebSiteUrl = $::Session->GetBaseUrl();
$::g_sContentUrl = $::g_sWebSiteUrl;
if ($::g_InputHash{"ACTION"} =~ /^OFFLINE_AUTHORIZE/i)
{
DoOfflineAuthorization();
exit;
}
if($::g_InputHash{"ACTION"} eq "OCC_VALIDATE" ||
($::g_InputHash{"ACTION"} eq "INCONTEXTPSP") ||
($::g_InputHash{ACTION} =~ /^AUTHORIZE/i))
{
$::Session->SetCallBack($::TRUE);
if(defined $::g_PaymentInfo{BUYERHASH})
{
$ACTINIC::B2B->Set('UserDigest', $::g_PaymentInfo{BUYERHASH});
$ACTINIC::B2B->Set('UserName', $::g_PaymentInfo{BUYERNAME});
$ACTINIC::B2B->Set('BaseFile', $::g_PaymentInfo{BASEFILE});
}
}
else
{
$ACTINIC::B2B->Set('UserDigest',ACTINIC::CAccFindUser());
}
ACTINIC::InitMonthMap();
if( $::g_InputHash{'BASE'} )
{
$::g_sContentUrl = $::g_InputHash{'BASE'};
}
}
sub ReadAndParseInput
{
my ($status, $message, $temp);
($status, $message, $::g_OriginalInputData, $temp, %::g_InputHash) = ACTINIC::ReadAndParseInput();
if ($status != $::SUCCESS)
{
return ($status, $message, 0, 0);
}
if( $::g_InputHash{INVOICEADDRESSSELECT} )
{
undef $::g_InputHash{'INVOICESALUTATION'};
undef $::g_InputHash{'INVOICENAME'};
undef $::g_InputHash{'INVOICEFIRSTNAME'};
undef $::g_InputHash{'INVOICELASTNAME'};
undef $::g_InputHash{'INVOICEJOBTITLE'};
undef $::g_InputHash{'INVOICECOMPANY'};
undef $::g_InputHash{'INVOICEADDRESS1'};
undef $::g_InputHash{'INVOICEADDRESS2'};
undef $::g_InputHash{'INVOICEADDRESS3'};
undef $::g_InputHash{'INVOICEADDRESS4'};
undef $::g_InputHash{'INVOICEPOSTALCODE'};
undef $::g_InputHash{'INVOICECOUNTRY'};
undef $::g_InputHash{'INVOICEPHONE'};
undef $::g_InputHash{'INVOICEMOBILE'};
undef $::g_InputHash{'INVOICEFAX'};
undef $::g_InputHash{'INVOICEEMAIL'};
};
if( $::g_InputHash{DELIVERADDRESSSELECT} )
{
undef $::g_InputHash{'DELIVERSALUTATION'};
undef $::g_InputHash{'DELIVERNAME'};
undef $::g_InputHash{'DELIVERFIRSTNAME'};
undef $::g_InputHash{'DELIVERLASTNAME'};
undef $::g_InputHash{'DELIVERJOBTITLE'};
undef $::g_InputHash{'DELIVERCOMPANY'};
undef $::g_InputHash{'DELIVERADDRESS1'};
undef $::g_InputHash{'DELIVERADDRESS2'};
undef $::g_InputHash{'DELIVERADDRESS3'};
undef $::g_InputHash{'DELIVERADDRESS4'};
undef $::g_InputHash{'DELIVERPOSTALCODE'};
undef $::g_InputHash{'DELIVERCOUNTRY'};
undef $::g_InputHash{'DELIVERPHONE'};
undef $::g_InputHash{'DELIVERMOBILE'};
undef $::g_InputHash{'DELIVERFAX'};
undef $::g_InputHash{'DELIVEREMAIL'};
undef $::g_InputHash{'DELIVERUSERDEFINED'};
}
return ($::SUCCESS, "", 0, 0);
}
sub ReadAndParseBlobs
{
my ($Status, $Message, @Response, $sPath);
$sPath = ACTINIC::GetPath();
my @arrFuncns =
(
\&ACTINIC::ReadCatalogFile,
\&ACTINIC::ReadSetupFile,
\&ACTINIC::ReadLocationsFile,
\&ACTINIC::ReadPaymentFile,
\&ACTINIC::ReadPhaseFile,
\&ACTINIC::ReadPromptFile,
\&ACTINIC::ReadTaxSetupFile,
\&ACTINIC::ReadSSPSetupFile,
\&ACTINIC::ReadDiscountBlob,
);
my $pfunRead;
foreach $pfunRead (@arrFuncns)
{
@Response = &$pfunRead($sPath);
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
}
my ($sContactDetails);
($::g_sCartId, $sContactDetails) = ACTINIC::GetCookies();
if ($::g_InputHash{CARTID} &&
$::g_InputHash{CARTID} =~ /^[a-zA-Z0-9]+$/)
{
$::g_sCartId = $::g_InputHash{CARTID};
}
if ($::g_InputHash{CART} &&
$::g_InputHash{CART} =~ /^[a-zA-Z0-9]+$/)
{
$::g_sCartId = $::g_InputHash{CART};
}
my $sCallbackFlag;
if(($::g_InputHash{"ACTION"} eq "OCC_VALIDATE") ||
($::g_InputHash{"ACTION"} eq "GCCB") ||
($::g_InputHash{"ACTION"} eq "GCRECALC") ||
($::g_InputHash{"ACTION"} eq "INCONTEXTPSP") ||
($::g_InputHash{"ACTION"} =~ /^AUTHORIZE/i) ||
($::g_InputHash{"ACTION"} =~ /^OFFLINE_AUTHORIZE/i))
{
$sCallbackFlag = $::TRUE;
}
else
{
$sCallbackFlag = $::FALSE;
}
if ($::g_InputHash{"ACTION"} eq "GCCB")
{
IncludeGoogleScript();
$::g_sCartId = GetSessionFromGoogle();
}
if ($::g_InputHash{'ACTION'} =~ m/^AUTHORIZE/i)
{
if (IsAuthoriseSessionPresent($::g_InputHash{ON}))
{
$::Session = new Session($::g_InputHash{ON}, $sContactDetails, ACTINIC::GetPath(), $::FALSE, $sCallbackFlag, $::TRUE);
}
}
if (!defined $::Session)
{
$::Session = new Session($::g_sCartId, $sContactDetails, ACTINIC::GetPath(), $::FALSE, $sCallbackFlag, $::FALSE);
}
if ($::g_bSpitSSLChange &&
$sContactDetails ne "")
{
$::Session->CookieStringToContactDetails();
}
my ($pBillContact, $pShipContact, $pShipInfo, $pTaxInfo, $pGeneralInfo, $pPaymentInfo, $pLocationInfo);
@Response = $::Session->RestoreCheckoutInfo();
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
no strict 'refs';
($Status, $Message, $pBillContact, $pShipContact, $pShipInfo, $pTaxInfo, $pGeneralInfo, $pPaymentInfo, $pLocationInfo) = @Response;
%::g_BillContact = %$pBillContact;
%::g_ShipContact = %$pShipContact;
%::g_ShipInfo = %$pShipInfo;
%::g_TaxInfo = %$pTaxInfo;
%::g_GeneralInfo = %$pGeneralInfo;
%::g_PaymentInfo = %$pPaymentInfo;
%::g_LocationInfo = %$pLocationInfo;
$::Authorise = undef;
$::g_sTaxDump = (join "|", keys %::g_TaxInfo) . (join "|", values %::g_TaxInfo);
$::g_sShippingDump = (join "|", keys %::g_ShipInfo) . (join "|", values %::g_ShipInfo);
return ($::SUCCESS, "", 0, 0);
}
sub ProcessInput
{
my (@Response, $sDetailCookie, $sError);
$::g_nCurrentSequenceNumber = $::g_InputHash{'SEQUENCE'};
if (!defined $::g_nCurrentSequenceNumber)
{
$::g_nCurrentSequenceNumber = $::STARTSEQUENCE;
}
my ($sConfirmButton, $sStartButton, $sDoneButton, $sNextButton, $sFinishButton, $sBackButton, $sCancelButton, $sChangeLocationButton);
$sConfirmButton = ACTINIC::GetPhrase(-1, 153);
$sStartButton = ACTINIC::GetPhrase(-1, 113);
$sDoneButton = ACTINIC::GetPhrase(-1, 114);
$sNextButton = ACTINIC::GetPhrase(-1, 502);
$sBackButton = ACTINIC::GetPhrase(-1, 503);
$sFinishButton = ACTINIC::GetPhrase(-1, 504);
$sCancelButton = ACTINIC::GetPhrase(-1, 505);
$sChangeLocationButton = ACTINIC::GetPhrase(0, 18);
my $sConfirmOrderButton = ACTINIC::GetPhrase(-1, 2602);
my ($sHTML, $sAction, $eDirection);
if (defined $::g_InputHash{'ACTION_CONFIRM'})
{
$::g_InputHash{'ACTION'} = $sConfirmOrderButton;
undef $::g_InputHash{'ACTION_CONFIRM'};
}
$sAction = $::g_InputHash{'ACTION'};
if ($sAction =~ m/$sStartButton/i)
{
$::Session->SetCheckoutStarted();
$::Session->SetInCheckout();
}
elsif (!$::Session->IsCheckoutStarted())
{
@Response = ACTINIC::BounceToPageEnhanced(undef, ACTINIC::GetPhrase(-1, 2300),
$$::g_pSetupBlob{CHECKOUT_DESCRIPTION},
$::g_sWebSiteUrl,
$::g_sContentUrl, $::g_pSetupBlob, $::Session->GetLastShopPage(), \%::g_InputHash,
$::FALSE);
$sHTML = $Response[2];
goto THEEND;
}
if ($::Session->IsPSPRequested())
{
if (($sAction =~ m/$sBackButton/i) &&
($::g_InputHash{'SEQUENCE'} = 3))
{
LogData("PSP backed out (back link):\n$::g_OriginalInputData");
$::Session->SetPSPRequested($::FALSE);
}
else
{
if (($::g_InputHash{"ACTION"} ne "OCC_VALIDATE") &&
($::g_InputHash{"ACTION"} ne "INCONTEXTPSP"))
{
$::Session->SetPSPSignature("");
LogData("PSP backed out (browser back button):\n$::g_OriginalInputData");
}
}
}
if ($sAction eq "PPSTARTCHECKOUT")
{
IncludePaypalScript();
@Response = StartPaypalProCheckout();
if ($Response[0] == $::BADDATA)
{
$sHTML = $Response[1];
$sDetailCookie = $Response[2];
goto THEEND;
}
elsif ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
$sHTML = $Response[1];
goto THEEND;
}
elsif ($sAction eq "PPCOMPLETECHECKOUT")
{
IncludePaypalScript();
@Response = CompletePaypalProCheckout();
if ($Response[0] != $::SUCCESS)
{
NotifyOfError($Response[1]);
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
exit;
}
elsif ($sAction eq "GCSTART")
{
@Response = ValidateStart($::TRUE);
if ($Response[0] != $::SUCCESS)
{
$sHTML = $Response[1];
$sDetailCookie = $Response[2];
goto THEEND;
}
IncludeGoogleScript();
@Response = GCStart();
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
$sHTML = $Response[2];
goto THEEND;
}
elsif ($sAction eq "GCRECALC")
{
IncludeGoogleScript();
@Response = MerchantCalc();
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
$sHTML = $Response[2];
goto THEEND;
}
elsif ($sAction eq "GCCB")
{
@Response = HandleCallback();
binmode STDOUT;
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
print "HTTP/1.0 400 OK\n";
return;
}
my $sNow = ACTINIC::GenerateCookieDate();
if($ENV{'PerlXS'} eq 'PerlIS')
{
print "HTTP/1.0 200 OK\n";
}
print "Content-type: text/xml\r\n";
print "Content-length: " . length($Response[2]) . "\r\n";
print "Date: $sNow\r\n";
print "\r\n";
print $Response[2];
return;
}
elsif ($sAction eq $sConfirmButton)
{
IncludePaypalScript();
my $sError = ValidateOrderConfirmPhase();
if ($sError ne "")
{
$sHTML = DisplayOrderConfirmPhase($sError);
goto THEEND;
}
else
{
my $oPaypal = new ActinicPaypalConnection();
my $nAmount = ActinicOrder::GetOrderTotal();
my @Response = $oPaypal->DoExpressCheckoutPayment($nAmount);
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
@Response = RecordPaypalOrder($oPaypal);
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
$::g_nCurrentSequenceNumber = 3;
$sAction = $sNextButton;
}
}
elsif ($sAction eq 'GETPSPFORM')
{
my $nStatus;
$sError = ValidatePayment($::TRUE, 'text');
if ($sError eq '')
{
my $sFileName = 'PSPForm.html';
$::g_pPaymentList->{ActinicOrder::PaymentStringToEnum($::g_PaymentInfo{'METHOD'})}{BOUNCE_HTML} = $sFileName;
($nStatus, $sError, $sHTML) = CallOCCPlugIn();
if ($sError eq '')
{
@Response = CompleteOrder();
if ($Response[0] != $::SUCCESS)
{
$sError = $Response[1];
}
else
{
if (PSPUsesInContext($::g_PaymentInfo{'METHOD'}))
{
UpdateCheckoutRecord();
$::Session->SaveSession();
ACTINIC::PrintText($sHTML);
return;
}
$::Session->SetPSPRequested($::TRUE);
LogData("PSP form prepared");
my ($bPaymentMade) = $::Session->IsPaymentMade();
$::Session->PaymentMade();
if (ActinicOrder::IsDDProductInCart())
{
EmailReceipt($::g_PaymentInfo{'ORDERNUMBER'}, $::FALSE);
$::Session->SetMailSaved();
}
if (!$bPaymentMade)
{
$::Session->ClearPaymentMade();
}
$::Session->CloneSession($::g_PaymentInfo{'ORDERNUMBER'});
}
}
}
$::Session->SaveSession();
if ($sError)
{
$sHTML = "Error: $sError";
$sError = "";
LogData($sHTML);
}
ACTINIC::PrintText($sHTML);
return;
}
elsif ($sAction eq "INCONTEXTPSP")
{
my ($nStatus);
$::g_nCurrentSequenceNumber = 3;
$::g_InputHash{ORDERNUMBER} = $::g_PaymentInfo{'ORDERNUMBER'};
$sAction = $sNextButton;
($nStatus, $sError, $sHTML) = CallOCCPlugIn();
if ($nStatus != $::SUCCESS)
{
ACTINIC::RecordErrors($sError, ACTINIC::GetPath());
$sError = $sHTML;
$sAction = $sBackButton;
}
elsif ($sHTML ne '')
{
goto THEEND;
}
}
my $sChangeRequest = GetChangeRequest();
if ($sAction eq "" &&
$::g_InputHash{ACTIONOVERRIDE})
{
$sAction = $::g_InputHash{ACTIONOVERRIDE};
}
elsif ($sAction =~ m/$sStartButton/i ||
$sAction =~ m/$sNextButton/i ||
$sAction =~ m/$sFinishButton/i ||
$sAction =~ m/$sConfirmOrderButton/i ||
$sAction =~ m/^AUTHORIZE/i ||
$sAction =~ m/RECORDORDER/i ||
exists $::g_InputHash{$sNextButton . ".x"} ||
exists $::g_InputHash{$sConfirmOrderButton . ".x"} ||
exists $::g_InputHash{$sFinishButton . ".x"})
{
$eDirection = $::FORWARD;
}
elsif ($sChangeRequest ne '' ||
$sAction =~ m/$sBackButton/i ||
$sAction =~ m/$sChangeLocationButton/i ||
exists $::g_InputHash{$sBackButton . ".x"} ||
$sAction eq 'RESUME_CHECKOUT')
{
$eDirection = $::BACKWARD;
}
elsif ($sAction =~ m/$sDoneButton/i ||
exists $::g_InputHash{$sDoneButton . ".x"})
{
my $sRefPage = $::Session->GetLastShopPage();
if (defined $$::g_pSetupBlob{'UNFRAMED_CHECKOUT_URL'} &&
$$::g_pSetupBlob{'UNFRAMED_CHECKOUT_URL'} ne "")
{
$sRefPage = $$::g_pSetupBlob{'UNFRAMED_CHECKOUT_URL'};
}
if( !$ACTINIC::B2B->Get('UserDigest') )
{
if (defined $::g_InputHash{'ALTERNATEMALLHOME'})
{
$sRefPage = $::g_InputHash{'ALTERNATEMALLHOME'};
}
}
@Response = ACTINIC::BounceToPagePlain(0, undef, undef, $::g_sWebSiteUrl,
$::g_sContentUrl, $::g_pSetupBlob, $sRefPage, \%::g_InputHash);
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
$sHTML = $Response[2];
if ($ACTINIC::B2B->Get('UserDigest'))
{
$sHTML =~ s/([\?|\&]ACTINIC_REFERRER[^\&|"|']*)//gi;
$sHTML =~ s/($::g_sAccountScriptName)(\&)/$1\?/gi;
}
goto THEEND;
}
elsif ($sAction =~ m/OCC_VALIDATE/i)
{
@Response = GetOCCValidationData();
if ($Response[0] != $::SUCCESS)
{
ACTINIC::RecordErrors($Response[1], ACTINIC::GetPath());
$sHTML = '0';
}
else
{
$sHTML = $Response[2];
}
ACTINIC::PrintPSPResponse('text/plain', $sHTML);
return;
}
else
{
ValidateInput($::BACKWARD);
$sHTML = GetCancelPage();
$::Session->ClearInCheckout();
goto THEEND;
}
@Response = ValidateInput($eDirection);
if ($Response[0] == $::BADDATA)
{
$sHTML = $Response[1];
$sDetailCookie = $Response[2];
goto THEEND;
}
elsif ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
if($sAction =~ m/$sChangeLocationButton/i)
{
$::g_nCurrentSequenceNumber = $::STARTSEQUENCE;
$eDirection = $::FORWARD;
}
if ($sChangeRequest ne '')
{
if ($sChangeRequest eq 'CHANGE_CART')
{
my $sCartURL = GetCGIScriptURL('ca') .
"?ACTION=SHOWCART&FROM=CHECKOUT_$::g_nCurrentSequenceNumber";
binmode STDOUT;
print "Location: $sCartURL\r\n\r\n";
exit;
}
my %hashNextSequence = (
'CHANGE_ADDRESS' => 0,
'CHANGE_SHIPPING' => 1,
'CHANGE_TAX_EXEMPTION' => 1,
'CHANGE_COUPON' => 1,
);
$::g_nNextSequenceNumber = $hashNextSequence{$sChangeRequest};
}
elsif ($sAction eq 'RESUME_CHECKOUT')
{
$::g_nNextSequenceNumber = $::g_nCurrentSequenceNumber;
}
elsif ($eDirection == $::FORWARD)
{
$::g_nNextSequenceNumber = $::g_nCurrentSequenceNumber + 1;
}
else
{
$::g_nNextSequenceNumber = $::g_nCurrentSequenceNumber - 1;
}
ActinicOrder::ParseAdvancedTax();
@Response = DisplayPage($sError, $::g_nNextSequenceNumber, $eDirection);
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($Response[1], ACTINIC::GetPath());
return;
}
$sHTML = $Response[2];
$sDetailCookie = $Response[3];
THEEND:
ACTINIC::UpdateDisplay($sHTML, $::g_OriginalInputData, undef, undef, $sDetailCookie, ActinicOrder::GenerateCartCookie());
}
sub GetChangeRequest
{
my @arrChangeRequests = qw(CART ADDRESS SHIPPING TAX_EXEMPTION COUPON);
my $sRequest;
foreach $sRequest (@arrChangeRequests)
{
my $sRequestKey = 'CHANGE_' . $sRequest;
if (exists $::g_InputHash{$sRequestKey} ||
exists $::g_InputHash{$sRequestKey . ".x"})
{
return $sRequestKey;
}
}
return '';
}
sub GetCGIScriptURL
{
my ($sScriptPrefix) = @_;
return sprintf('%s%s%6.6d%s',
$$::g_pSetupBlob{'CGI_URL'}, $sScriptPrefix,
$$::g_pSetupBlob{'CGI_ID'}, $$::g_pSetupBlob{'CGI_EXT'});
}
sub ValidateInput
{
my ($eDirection);
if ($#_ != 0)
{
$eDirection = $::FORWARD;
}
($eDirection) = @_;
my ($bActuallyValidate) = ($eDirection == $::FORWARD);
my (@Response);
if ($::g_nCurrentSequenceNumber == $::STARTSEQUENCE)
{
@Response = ValidateStart($bActuallyValidate); # validate the input/cart settings
return (@Response);
}
else
{
my $parrInputPhases = GetPhaseListFromInput();
my ($nPhase, $sError);
foreach $nPhase (@$parrInputPhases)
{
if ($nPhase == $::BILLCONTACTPHASE)
{
$sError .= ValidateBill($bActuallyValidate);
}
elsif ($nPhase == $::SHIPCONTACTPHASE)
{
$sError .= ValidateShipContact($bActuallyValidate);
}
elsif ($nPhase == $::SHIPCHARGEPHASE)
{
$sError .= ValidateShipCharge($bActuallyValidate);
}
elsif ($nPhase == $::TAXCHARGEPHASE)
{
$sError .= ActinicOrder::ValidateTax($bActuallyValidate);
}
elsif ($nPhase == $::GENERALPHASE)
{
$sError .= ValidateGeneral($bActuallyValidate);
}
elsif ($nPhase == $::PAYMENTPHASE || $nPhase == $::PAYSELECTPHASE)
{
$sError .= ValidatePayment($bActuallyValidate);
}
elsif ($nPhase == $::TANDCPHASE)
{
$sError .= ValidateTermsAndConditions($bActuallyValidate);
}
elsif ($nPhase == $::COUPONPHASE)
{
$sError .= ValidateCoupon($bActuallyValidate);
}
elsif ($nPhase == $::COMPLETEPHASE)
{
if($::g_InputHash{'ACTION'} =~ m/^AUTHORIZE_(\d+)$/i)
{
$::g_PaymentInfo{'METHOD'} = $1;
}
if (!defined $::g_PaymentInfo{'METHOD'})
{
$sError .= ACTINIC::GetPhrase(-1, 1282);
next;
}
if (length $::g_PaymentInfo{'METHOD'} == 0)
{
EnsurePaymentSelection();
}
my ($ePaymentMethod) = ActinicOrder::PaymentStringToEnum($::g_PaymentInfo{'METHOD'}); # the payment method is stored as "ENUMERATEDID:DESCRIPTION"
if ($ACTINIC::B2B->Get('UserDigest') &&
($ePaymentMethod == $::PAYMENT_ON_ACCOUNT ||
$ePaymentMethod == $::PAYMENT_INVOICE))
{
$sError .= ValidateSignature($bActuallyValidate);
}
}
elsif ($nPhase == $::RECEIPTPHASE)
{
}
elsif ($nPhase == $::PRELIMINARYINFOPHASE)
{
if ($sError eq '')
{
$sError .= ActinicOrder::ValidatePreliminaryInfo($bActuallyValidate, $::FALSE);
}
}
}
if ($sError ne '')
{
@Response = DisplayPage($sError, $::g_nCurrentSequenceNumber, $eDirection);
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
$Response[0] = $::BADDATA;
$Response[1] = $Response[2];
$Response[2] = $Response[3];
return (@Response);
}
}
return (UpdateCheckoutRecord());
}
sub ValidateStart
{
if ($#_ != 0)
{
return ($::FAILURE, ACTINIC::GetPhrase(-1, 12, 'ValidateStart'), 0, 0);
}
my ($bActuallyValidate) = @_;
if (!$bActuallyValidate)
{
return ($::SUCCESS, "", 0, 0);
}
my ($nLineCount, @Response, $Status, $Message);
my $pCartObject;
@Response = $::Session->GetCartObject();
if ($Response[0] != $::SUCCESS)
{
$nLineCount = 0;
}
else
{
$pCartObject = $Response[2];
$nLineCount = $pCartObject->CountItems();
}
my ($sLocalPage, $sBaseUrl, $sHTML);
if ($nLineCount <= 0)
{
$sLocalPage = $::Session->GetLastShopPage();
if (ACTINIC::IsCatalogFramed() ||
($$::g_pSetupBlob{CLEAR_ALL_FRAMES} &&
$$::g_pSetupBlob{UNFRAMED_CHECKOUT}))
{
$sLocalPage = ACTINIC::RestoreFrameURL($sLocalPage);
}
if ($sLocalPage !~ /#SID=\d*/ &&
exists $::g_InputHash{'SID'})
{
$::g_InputHash{'SID'} =~ /^(\d+)$/g;
my $sSID = $1;
$sLocalPage .= "#SID=$sSID";
}
@Response = ACTINIC::BounceToPageEnhanced(5, ACTINIC::GetPhrase(-1, 1962) . ACTINIC::GetPhrase(-1, 44, $::g_sCart, $::g_sCart) . ACTINIC::GetPhrase(-1, 1970) . ACTINIC::GetPhrase(-1, 2049),
$$::g_pSetupBlob{CHECKOUT_DESCRIPTION},
$::g_sWebSiteUrl,
$::g_sContentUrl, $::g_pSetupBlob, $sLocalPage, \%::g_InputHash,
$::FALSE);
($Status, $Message, $sHTML) = @Response;
if ($Status != $::SUCCESS)
{
return (@Response);
}
return ($::BADDATA, $sHTML, 0, 0);
}
my $pCartList = $pCartObject->GetCartList();
my $nIndex;
foreach ($nIndex = $#$pCartList; $nIndex >= 0; $nIndex--)
{
my $pFailure;
($Status, $Message, $pFailure) = ActinicOrder::ValidateOrderDetails($pCartList->[$nIndex], $nIndex);
if ($Status != $::SUCCESS)
{
my $sURL = $::g_sCartScript . "?ACTION=SHOWCART";
$sURL .= $::g_InputHash{SHOP} ? '&SHOP=' . ACTINIC::EncodeText2($::g_InputHash{SHOP}, $::FALSE) : '';
@Response = ACTINIC::BounceToPageEnhanced(5, ACTINIC::GetPhrase(-1, 1962) . ACTINIC::GetPhrase(-1, 2167) . ACTINIC::GetPhrase(-1, 1970) . ACTINIC::GetPhrase(-1, 2049),
$$::g_pSetupBlob{CHECKOUT_DESCRIPTION},
$::g_sWebSiteUrl,
$::g_sContentUrl, $::g_pSetupBlob, $sURL , \%::g_InputHash,
$::FALSE);
($Status, $Message, $sHTML) = @Response;
if ($Status != $::SUCCESS)
{
return (@Response);
}
return ($::BADDATA, $sHTML, 0, 0);
}
}
($Status, $sHTML) = ActinicOrder::CheckBuyerLimit($::g_sCartId,'',$::TRUE);
if ($Status != $::SUCCESS)
{
return ($::BADDATA,$sHTML);
}
return ($::SUCCESS, "", 0, 0);
}
sub ValidateBill
{
if ($#_ != 0)
{
ACTINIC::ReportError(ACTINIC::GetPhrase(-1, 12, 'ValidateBill'), ACTINIC::GetPath());
}
my ($bActuallyValidate) = @_;
if( $::g_InputHash{ADBACTION} )
{
return('');
}
undef $::g_BillContact{'ADDRESSSELECT'};
if ($::g_InputHash{INVOICEADDRESSSELECT} )
{
$::g_BillContact{'ADDRESSSELECT'} = $::g_InputHash{INVOICEADDRESSSELECT};
my $sUserDigest = $ACTINIC::B2B->Get('UserDigest');
my ($status, $sMessage, $pBuyer) = ACTINIC::GetBuyer($sUserDigest, ACTINIC::GetPath());
if ($status != $::SUCCESS)
{
return ($sMessage);
}
my $pAccount;
($status, $sMessage, $pAccount) = ACTINIC::GetCustomerAccount($$pBuyer{AccountID}, ACTINIC::GetPath());
if ($status != $::SUCCESS)
{
return ($sMessage);
}
my $pAddress;
($status, $sMessage, $pAddress) = ACTINIC::GetCustomerAddress($$pBuyer{AccountID}, $::g_InputHash{INVOICEADDRESSSELECT}, ACTINIC::GetPath());
ACTINIC::CloseCustomerAddressIndex();
if ($status != $::SUCCESS)
{
return ($sMessage);
}
if ($pAccount->{InvoiceAddressRule} != 1 &&
$pBuyer->{InvoiceAddressRule} != 0 )
{
$::g_BillContact{'NAME'} = $pBuyer->{'Name'};
$::g_BillContact{'FIRSTNAME'} = $pBuyer->{'FirstName'};
$::g_BillContact{'LASTNAME'} = $pBuyer->{'LastName'};
$::g_BillContact{'SALUTATION'} = $pBuyer->{'Salutation'};
$::g_BillContact{'JOBTITLE'} = $pBuyer->{'Title'};
}
else
{
$::g_BillContact{'NAME'} = $pAccount->{'Name'};
$::g_BillContact{'FIRSTNAME'} = $pAccount->{'FirstName'};
$::g_BillContact{'LASTNAME'} = $pAccount->{'LastName'};
$::g_BillContact{'SALUTATION'} = $pAccount->{'Salutation'};
$::g_BillContact{'JOBTITLE'} = $pAccount->{'Title'};
}
$::g_BillContact{'PHONE'} = $pAccount->{'TelephoneNumber'};
$::g_BillContact{'MOBILE'} = $pAccount->{'MobileNumber'};
$::g_BillContact{'FAX'} = $pAccount->{'FaxNumber'};
if (length $::g_BillContact{'PHONE'} > $::g_pFieldSizes->{'PHONE'})
{
$::g_BillContact{'PHONE'} =~ s/(.*?)(\/.*|$)/$1/;
}
$::g_BillContact{'PHONE'} =~ s/(.{0,$::g_pFieldSizes->{'PHONE'}}).*/$1/;
$::g_BillContact{'MOBILE'} =~ s/(.{0,$::g_pFieldSizes->{'MOBILE'}}).*/$1/;
$::g_BillContact{'FAX'} =~ s/(.{0,$::g_pFieldSizes->{'FAX'}}).*/$1/;
$::g_BillContact{'EMAIL'} = $pAccount->{'EmailAddress'};
$::g_BillContact{'EMAIL_CONFIRM'} = $pAccount->{'EmailAddress'};
$::g_BillContact{'ADDRESS1'} = $pAddress->{'Line1'};
$::g_BillContact{'ADDRESS2'} = $pAddress->{'Line2'};
$::g_BillContact{'ADDRESS3'} = $pAddress->{'Line3'};
$::g_BillContact{'ADDRESS4'} = $pAddress->{'Line4'};
$::g_BillContact{'POSTALCODE'} = $pAddress->{'PostCode'};
$::g_BillContact{'COUNTRY'} = ACTINIC::GetCountryName($pAddress->{'CountryCode'});
$::g_BillContact{'SEPARATE'} = $::TRUE;
$::g_LocationInfo{INVOICE_COUNTRY_CODE} = $pAddress->{'CountryCode'};
$::g_LocationInfo{INVOICE_REGION_CODE} = ($pAddress->{'StateCode'}) ?
$pAddress->{'StateCode'} :
$ActinicOrder::UNDEFINED_REGION;
ActinicOrder::ParseAdvancedTax();
if($$::g_pTaxSetupBlob{TAX_BY} == $::eTaxByInvoice)
{
if(defined $$::g_pTaxSetupBlob{TAX_1} &&
$$::g_pTaxSetupBlob{TAX_1}{ID} == $pAddress->{'Tax1ID'})
{
$::g_TaxInfo{'EXEMPT1'} = $pAddress->{'ExemptTax1'} ? 1 : 0;
$::g_TaxInfo{'EXEMPT1DATA'} = $pAddress->{'Tax1ExemptData'};
}
if(defined $$::g_pTaxSetupBlob{TAX_2} &&
$$::g_pTaxSetupBlob{TAX_2}{ID} == $pAddress->{'Tax2ID'})
{
$::g_TaxInfo{'EXEMPT2'} = $pAddress->{'ExemptTax2'} ? 1 : 0;
$::g_TaxInfo{'EXEMPT2DATA'} = $pAddress->{'Tax2ExemptData'};
}
}
$::g_BillContact{'MOVING'} = $::FALSE;
$::g_BillContact{'PRIVACY'} = $::TRUE;
$::g_BillContact{'REMEMBERME'} = $::FALSE;
$::g_BillContact{'CREATEANACCOUNT'} = $::FALSE;
$::g_BillContact{'NEWCUSTOMERPASSWORD'} = $::FALSE;
ACTINIC::CopyHash(\%::g_BillContact, \%::g_InputHash, '', 'INVOICE');
}
else
{
GetContactFromInput('INVOICE', \%::g_BillContact);
$::g_BillContact{'SEPARATE'} = ($::g_InputHash{'SEPARATESHIP'} ne "") ? $::TRUE : $::FALSE;
$::g_BillContact{'REMEMBERME'} = (defined $::g_InputHash{'REMEMBERME'} && $::g_InputHash{'REMEMBERME'} ne "") ?
$::TRUE : $::FALSE;
$::g_BillContact{'CREATEANACCOUNT'} = (defined $::g_InputHash{'CREATEANACCOUNT'} && $::g_InputHash{'CREATEANACCOUNT'} ne "") ?
$::TRUE : $::FALSE;
$::g_BillContact{'NEWCUSTOMERPASSWORD'} = (defined $::g_InputHash{'NEWCUSTOMERPASSWORD'} &&defined $::g_InputHash{'NEWCUSTOMERPASSWORD2'}) ?
$::g_InputHash{'NEWCUSTOMERPASSWORD'} : '';
$::g_LocationInfo{INVOICE_COUNTRY_CODE} = $::g_InputHash{'LocationInvoiceCountry'};
$::g_LocationInfo{INVOICE_REGION_CODE} = $::g_InputHash{'LocationInvoiceRegion'};
if (!$::g_BillContact{'SEPARATE'})
{
$::g_LocationInfo{DELIVERY_COUNTRY_CODE} = $::g_InputHash{'LocationInvoiceCountry'};
$::g_LocationInfo{DELIVERY_REGION_CODE} = $::g_InputHash{'LocationInvoiceRegion'};
}
ActinicOrder::NormaliseAddressLocation('Invoice', $bActuallyValidate);
}
if ($$::g_pSetupBlob{SHOPPER_NAME_HANDLING_MODE} eq 1)
{
$::g_BillContact{'NAME'} = $::g_BillContact{'FIRSTNAME'}.' '.$::g_BillContact{'LASTNAME'};
$::g_BillContact{'NAME'} =~ s/(.{0,$::g_pFieldSizes->{'NAME'}}).*/$1/;
}
ActinicOrder::SetAddressFieldsFromLocationCodes('Invoice');
if (!$::g_BillContact{'SEPARATE'})
{
ACTINIC::CopyHash(\%::g_BillContact, \%::g_ShipContact, '', '');
}
ACTINIC::TrimHashEntries(\%::g_BillContact);
my ($sError);
if (!$bActuallyValidate)
{
return ($sError);
}
$sError .= CheckInputField(0, GetAddressMapping(), \%::g_BillContact);
if (ACTINIC::IsPromptRequired(0, 14) &&
$::g_BillContact{'USERDEFINED'} eq "" &&
!$ACTINIC::B2B->Get('UserDigest'))
{
$sError .= ACTINIC::GetRequiredMessage(0, 14);
}
if (length $::g_BillContact{'USERDEFINED'} > $::g_pFieldSizes->{'USERDEFINED'})
{
$sError .= ACTINIC::GetLengthFailureMessage(0, 14, $::g_pFieldSizes->{'USERDEFINED'});
}
if ($::g_BillContact{'CREATEANACCOUNT'} == $::TRUE)
{
my ($status, $sMessage, $sPH) = ACTINIC::GetUser($::g_BillContact{EMAIL});
if ($status == $::SUCCESS)
{
$sError .= ACTINIC::GetRequiredMessage(0, 12, ACTINIC::GetPhrase(-1, 2770, $::g_BillContact{EMAIL}));
}
if ($::g_BillContact{'NEWCUSTOMERPASSWORD'} eq "")
{
$sError .= ACTINIC::GetRequiredMessage(-1, 2749);
}
if ($::g_InputHash{'NEWCUSTOMERPASSWORD2'} eq "")
{
$sError .= ACTINIC::GetRequiredMessage(-1, 2750);
}
}
if($sError eq '')
{
}
return ActinicOrder::FormatCheckoutInputError(ACTINIC::GetPhrase(-1, 147), $sError);
}
sub GetContactFromInput
{
my ($sKeyPrefix, $rhashContact) = @_;
$rhashContact->{'MOVING'} = $::FALSE;
$rhashContact->{'PRIVACY'} = $::FALSE;
my $sKey;
foreach $sKey (@ActinicOrder::arrAddressKeys)
{
$rhashContact->{$sKey} = '';
}
ACTINIC::CopyHash(\%::g_InputHash, $rhashContact, $sKeyPrefix, '', $::FALSE);
$rhashContact->{'MOVING'} = ($rhashContact->{'MOVING'}) ? $::TRUE : $::FALSE;
$rhashContact->{'PRIVACY'} = ($rhashContact->{'PRIVACY'}) ? $::TRUE : $::FALSE;
}
sub GetAddressMapping
{
my $rhashFields =
{
'SALUTATION' => 0,
'NAME' => 1,
'JOBTITLE' => 2,
'COMPANY' => 3,
'ADDRESS1' => 4,
'ADDRESS2' => 5,
'ADDRESS3' => 6,
'ADDRESS4' => 7,
'POSTALCODE' => 8,
'COUNTRY' => 9,
'PHONE' => 10,
'FAX' => 11,
'EMAIL' => 12,
'MOBILE' => 20,
'FIRSTNAME' => 21,
'LASTNAME' => 22,
'EMAIL_CONFIRM' => 23,
};
if ($$::g_pSetupBlob{SHOPPER_NAME_HANDLING_MODE} eq 1) # first name/ last name handling
{
delete $rhashFields->{'NAME'};
}
else
{
delete $rhashFields->{'FIRSTNAME'};
delete $rhashFields->{'LASTNAME'};
}
return $rhashFields;
}
sub ValidateCoupon
{
my ($bActuallyValidate) = @_;
if (exists $::g_InputHash{'COUPONCODE'})
{
$::g_PaymentInfo{'COUPONCODE'} = $::g_InputHash{'COUPONCODE'};
}
if ($::g_InputHash{'COUPONCODE'} ne "" &&
$$::g_pDiscountBlob{'COUPON_ON_CHECKOUT'})
{
if ($bActuallyValidate)
{
$::Session->GetCartObject();
my @Response = ActinicDiscounts::ValidateCoupon($::g_PaymentInfo{'COUPONCODE'});
if ($Response[0] == $::FAILURE)
{
$::g_PaymentInfo{'COUPONCODE'} = '';
return ActinicOrder::FormatCheckoutInputError(ACTINIC::GetPhrase(-1, 2353), $Response[1]);
}
}
}
return '';
}
sub ValidateTermsAndConditions
{
my ($bActuallyValidate) = @_;
$::g_BillContact{'AGREEDTANDC'} = (defined $::g_InputHash{'AGREETERMSCONDITIONS'} && $::g_InputHash{'AGREETERMSCONDITIONS'} ne "") ? $::TRUE : $::FALSE;
my $sError = '';
if ($bActuallyValidate)
{
if (defined $$::g_pSetupBlob{'CHECKOUT_NEEDS_TERMS_AGREED'} &&
!$::g_BillContact{'AGREEDTANDC'})
{
$sError = ACTINIC::GetPhrase(-1, 2385);
}
}
return ActinicOrder::FormatCheckoutInputError(ACTINIC::GetPhrase(-1, 2386), $sError);
}
sub ValidateShipContact
{
if ($#_ != 0)
{
ACTINIC::ReportError(ACTINIC::GetPhrase(-1, 12, 'ValidateShipContact'), ACTINIC::GetPath());
}
my ($bActuallyValidate) = @_;
if ($::ACT_ADB)
{
ConfigureAddressBook();
$::ACT_ADB->ToForm();
$::s_VariableTable{$::VARPREFIX.'ADDRESSBOOK'} = $::ACT_ADB->Show();
}
else
{
$::s_VariableTable{$::VARPREFIX.'ADDRESSBOOK'} = "";
}
my $bCheckReversed = (defined $$::g_pSetupBlob{'REVERSE_ADDRESS_CHECK'} &&
$$::g_pSetupBlob{'REVERSE_ADDRESS_CHECK'});
undef $::g_ShipContact{ADDRESSSELECT};
if( $::g_InputHash{DELIVERADDRESSSELECT} )
{
$::g_ShipContact{ADDRESSSELECT} = $::g_InputHash{DELIVERADDRESSSELECT};
my $sUserDigest = $ACTINIC::B2B->Get('UserDigest');
my ($status, $sMessage, $pBuyer) = ACTINIC::GetBuyer($sUserDigest, ACTINIC::GetPath());
if ($status != $::SUCCESS)
{
return ($sMessage);
}
my $pAccount;
($status, $sMessage, $pAccount) = ACTINIC::GetCustomerAccount($$pBuyer{AccountID}, ACTINIC::GetPath());
if ($status != $::SUCCESS)
{
return ($sMessage);
}
my $pAddress;
($status, $sMessage, $pAddress) = ACTINIC::GetCustomerAddress($$pBuyer{AccountID}, $::g_InputHash{DELIVERADDRESSSELECT}, ACTINIC::GetPath());
ACTINIC::CloseCustomerAddressIndex();
if ($status != $::SUCCESS)
{
return ($sMessage);
}
$::g_ShipContact{'COMPANY'} = $pAccount->{CompanyName};
$::g_ShipContact{'NAME'} = $pBuyer->{Name};
$::g_ShipContact{'FIRSTNAME'} = $pBuyer->{'FirstName'};
$::g_ShipContact{'LASTNAME'} = $pBuyer->{'LastName'};
$::g_ShipContact{'SALUTATION'} = $pBuyer->{Salutation};
$::g_ShipContact{'JOBTITLE'} = $pBuyer->{Title};
$::g_ShipContact{'PHONE'} = $pBuyer->{'TelephoneNumber'};
$::g_ShipContact{'MOBILE'} = $pBuyer->{'MobileNumber'};
$::g_ShipContact{'FAX'} = $pBuyer->{'FaxNumber'};
if (length $::g_ShipContact{'PHONE'} > $::g_pFieldSizes->{'PHONE'})
{
$::g_ShipContact{'PHONE'} =~ s/(.*?)(\/.*|$)/$1/;
}
$::g_ShipContact{'PHONE'} =~ s/(.{0,$::g_pFieldSizes->{'PHONE'}}).*/$1/;
$::g_ShipContact{'MOBILE'} =~ s/(.{0,$::g_pFieldSizes->{'MOBILE'}}).*/$1/;
$::g_ShipContact{'FAX'} =~ s/(.{0,$::g_pFieldSizes->{'FAX'}}).*/$1/;
$::g_ShipContact{'EMAIL'} = $pBuyer->{'EmailAddress'};
$::g_ShipContact{'EMAIL_CONFIRM'} = $pBuyer->{'EmailAddress'};
$::g_ShipContact{'ADDRESS1'} = $pAddress->{'Line1'};
$::g_ShipContact{'ADDRESS2'} = $pAddress->{'Line2'};
$::g_ShipContact{'ADDRESS3'} = $pAddress->{'Line3'};
$::g_ShipContact{'ADDRESS4'} = $pAddress->{'Line4'};
$::g_ShipContact{'POSTALCODE'} = $pAddress->{'PostCode'};
$::g_LocationInfo{DELIVERPOSTALCODE} = $pAddress->{'PostCode'};
$::g_ShipContact{'COUNTRY'} = ACTINIC::GetCountryName($pAddress->{'CountryCode'});
$::g_LocationInfo{DELIVERY_COUNTRY_CODE} = $pAddress->{'CountryCode'};
$::g_LocationInfo{DELIVERY_REGION_CODE} = ($pAddress->{'StateCode'}) ?
$pAddress->{'StateCode'} :
$ActinicOrder::UNDEFINED_REGION;
$::g_ShipContact{PRIVACY} = $::TRUE;
}
else
{
if (((!$bCheckReversed && !$::g_BillContact{'SEPARATE'}) ||
($bCheckReversed && $::g_BillContact{'SEPARATE'})) )
{
$::g_ShipContact{'SALUTATION'} = $::g_BillContact{'SALUTATION'};
$::g_ShipContact{'NAME'} = $::g_BillContact{'NAME'};
$::g_ShipContact{'FIRSTNAME'} = $::g_BillContact{'FIRSTNAME'};
$::g_ShipContact{'LASTNAME'} = $::g_BillContact{'LASTNAME'};
$::g_ShipContact{'JOBTITLE'} = $::g_BillContact{'JOBTITLE'};
$::g_ShipContact{'COMPANY'} = $::g_BillContact{'COMPANY'};
$::g_ShipContact{'ADDRESS1'} = $::g_BillContact{'ADDRESS1'};
$::g_ShipContact{'ADDRESS2'} = $::g_BillContact{'ADDRESS2'};
$::g_ShipContact{'ADDRESS3'} = $::g_BillContact{'ADDRESS3'};
$::g_ShipContact{'ADDRESS4'} = $::g_BillContact{'ADDRESS4'};
$::g_ShipContact{'POSTALCODE'} = $::g_BillContact{'POSTALCODE'};
$::g_ShipContact{'COUNTRY'} = $::g_BillContact{'COUNTRY'};
my $sUserDigest = $ACTINIC::B2B->Get('UserDigest');
if ($sUserDigest)
{
my ($status, $sMessage, $pBuyer) = ACTINIC::GetBuyer($sUserDigest, ACTINIC::GetPath());
if ($status != $::SUCCESS)
{
return ($sMessage);
}
$::g_ShipContact{'PHONE'} = $pBuyer->{'TelephoneNumber'};
$::g_ShipContact{'MOBILE'} = $pBuyer->{'MobileNumber'};
$::g_ShipContact{'FAX'} = $pBuyer->{'FaxNumber'};
if (length $::g_ShipContact{'PHONE'} > $::g_pFieldSizes->{'PHONE'})
{
$::g_ShipContact{'PHONE'} =~ s/(.*?)(\/.*|$)/$1/;
}
$::g_ShipContact{'PHONE'} =~ s/(.{0,$::g_pFieldSizes->{'PHONE'}}).*/$1/;
$::g_ShipContact{'MOBILE'} =~ s/(.{0,$::g_pFieldSizes->{'MOBILE'}}).*/$1/;
$::g_ShipContact{'EMAIL'} = $pBuyer->{'EmailAddress'};
}
else
{
$::g_ShipContact{'PHONE'} = $::g_BillContact{'PHONE'};
$::g_ShipContact{'MOBILE'} = $::g_BillContact{'MOBILE'};
$::g_ShipContact{'FAX'} = $::g_BillContact{'FAX'};
$::g_ShipContact{'EMAIL'} = $::g_BillContact{'EMAIL'};
$::g_ShipContact{'EMAIL_CONFIRM'} = $::g_BillContact{'EMAIL_CONFIRM'};
}
$::g_ShipContact{'USERDEFINED'} = "";
}
else
{
GetContactFromInput('DELIVER', \%::g_ShipContact);
if ($::g_BillContact{'SEPARATE'})
{
$::g_LocationInfo{DELIVERY_COUNTRY_CODE} = $::g_InputHash{'LocationDeliveryCountry'};
$::g_LocationInfo{DELIVERY_REGION_CODE} = $::g_InputHash{'LocationDeliveryRegion'};
}
}
$::g_ShipContact{'PRIVACY'} = $::g_BillContact{'PRIVACY'};
ActinicOrder::NormaliseAddressLocation('Delivery');
}
if ($$::g_pSetupBlob{SHOPPER_NAME_HANDLING_MODE} eq 1)
{
$::g_ShipContact{'NAME'} = $::g_ShipContact{'FIRSTNAME'} .' '. $::g_ShipContact{'LASTNAME'};
$::g_ShipContact{'NAME'} =~ s/(.{0,$::g_pFieldSizes->{'NAME'}}).*/$1/;
}
ActinicOrder::SetAddressFieldsFromLocationCodes('Delivery');
ACTINIC::TrimHashEntries(\%::g_ShipContact);
my ($sError);
if (!$bActuallyValidate ||
(!$bCheckReversed && !$::g_BillContact{'SEPARATE'}) ||
($bCheckReversed && $::g_BillContact{'SEPARATE'}))
{
return ($sError);
}
$sError .= CheckInputField(1, GetAddressMapping(), \%::g_ShipContact);
if (ACTINIC::IsPromptRequired(1, 13) &&
$::g_ShipContact{'USERDEFINED'} eq "" &&
!$ACTINIC::B2B->Get('UserDigest'))
{
$sError .= ACTINIC::GetRequiredMessage(1, 13);
}
if (length $::g_ShipContact{'USERDEFINED'} > $::g_pFieldSizes->{'USERDEFINED'})
{
$sError .= ACTINIC::GetLengthFailureMessage(1, 13, $::g_pFieldSizes->{'USERDEFINED'});
}
if($sError eq '')
{
}
return ActinicOrder::FormatCheckoutInputError(ACTINIC::GetPhrase(-1, 148), $sError);
}
sub CheckInputField
{
my ($nPhase, $pMapping, $pHash, $sFormat) = @_;
my ($sKey, $sError);
my ($parrInputKeys) = GetInputHashKeysInSourceOrder($nPhase);
my $sAddressPrefix = $nPhase == 0 ? 'INVOICE' : 'DELIVER';
my %hashInputKey;
my $bInternationalZone = $::FALSE;
if ($$::g_pSetupBlob{MAKE_SHIPPING_CHARGE} &&
(($nPhase == 1) ||
(!$::g_BillContact{'SEPARATE'} &&
$nPhase == 0)))
{
my @Response = ActinicOrder::GetShippingPluginResponse();
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
$bInternationalZone = defined $Response[14] ? $Response[14] : $::FALSE;
}
my $bPhoneRequired = (($$::g_pSetupBlob{'IS_GFS_ENABLED'} == $::TRUE) &&
($bInternationalZone));
if (!$::g_InputHash{$sAddressPrefix . 'ADDRESSSELECT'})
{
foreach $sKey (@$parrInputKeys)
{
$hashInputKey{$sKey} = 1;
}
foreach $sKey (keys %{$pMapping})
{
if ((ACTINIC::IsPromptRequired($nPhase, $pMapping->{$sKey}) ||
(($sKey eq 'PHONE') &&
$bPhoneRequired)) &&
!exists $hashInputKey{$sKey})
{
$sError .= ACTINIC::GetRequiredMessage($nPhase, $pMapping->{$sKey}, "This is a required field but there is no way to input it");
}
}
}
foreach $sKey (@$parrInputKeys)
{
if ((ACTINIC::IsPromptRequired($nPhase, $pMapping->{$sKey}) ||
(($sKey eq 'PHONE') &&
$bPhoneRequired)) &&
$$pHash{$sKey} eq "")
{
if ($sFormat ne 'text')
{
$sError .= ACTINIC::GetRequiredMessage($nPhase, $pMapping->{$sKey});
}
else
{
$sError .= ACTINIC::GetRequiredMessageAsText($nPhase, $pMapping->{$sKey});
}
}
if ($sKey eq 'EMAIL_CONFIRM')
{
if ($$pHash{$sKey} ne $$pHash{'EMAIL'})
{
$sError .= ACTINIC::GetRequiredMessage($nPhase, $pMapping->{'EMAIL'}, "Email doesn't match");
}
}
elsif ($sKey eq 'EMAIL' &&
$$pHash{$sKey} ne '' &&
$$pHash{$sKey} !~ /\@/)
{
$sError .= ACTINIC::GetRequiredMessage($nPhase, $pMapping->{$sKey}, ACTINIC::GetPhrase(-1, 2378));
}
if (exists $::g_pFieldSizes->{$sKey} &&
(length $$pHash{$sKey} > $::g_pFieldSizes->{$sKey}))
{
if ($sFormat ne 'text')
{
$sError .= ACTINIC::GetLengthFailureMessage($nPhase, $pMapping->{$sKey}, $::g_pFieldSizes->{$sKey});
}
else
{
$sError .= ACTINIC::GetLengthFailureMessageAsText($nPhase, $pMapping->{$sKey}, $::g_pFieldSizes->{$sKey});
}
}
}
return $sError;
}
sub GetInputHashKeysInSourceOrder
{
my ($nPhase) = @_;
my %hashPrefixes =
(
0 => 'INVOICE',
1 => 'DELIVER',
4 => 'GENERAL',
5 => 'PAYMENT',
);
my ($sPrefix);
if (defined $hashPrefixes{$nPhase})
{
$sPrefix = $hashPrefixes{$nPhase};
}
my $sLocationPrefix =
$nPhase == 0 ? 'LocationInvoice' :
$nPhase == 1 ? 'LocationDelivery' :
'';
my @arrKeyValues = split /[&=]/, $::g_OriginalInputData;
my @arrKeys;
my %hashKeysAdded = ();
my $i;
for ($i = 0; $i < scalar(@arrKeyValues); $i += 2)
{
my $sKey = $arrKeyValues[$i];
if ($sKey =~ /^$sPrefix(.*)$/)
{
AddValueToArrayIfUnique(\@arrKeys, \%hashKeysAdded, $1);
}
elsif ($sLocationPrefix ne '' &&
$sKey =~ /^$sLocationPrefix(.*)$/)
{
if ($1 eq 'Country')
{
AddValueToArrayIfUnique(\@arrKeys, \%hashKeysAdded, 'COUNTRY');
}
elsif ($1 eq 'Region')
{
AddValueToArrayIfUnique(\@arrKeys, \%hashKeysAdded, 'ADDRESS4');
}
}
}
return (\@arrKeys);
}
sub AddValueToArrayIfUnique
{
my ($parrTarget, $phashValues, $sValue) = @_;
if (!exists $phashValues->{$sValue})
{
push @$parrTarget, $sValue;
$phashValues->{$sValue} = 1;
}
}
sub GetPhaseListFromInput
{
my $rhashPhases = {
'INVOICE' => $::BILLCONTACTPHASE,
'DELIVER' => $::SHIPCONTACTPHASE,
'SHIPPING' => $::SHIPCHARGEPHASE,
'TAX' => $::TAXCHARGEPHASE,
'GENERAL' => $::GENERALPHASE,
'PAYMENT' => $::PAYMENTPHASE,
'COMPLETE' => $::COMPLETEPHASE,
'RECEIPT' => $::RECEIPTPHASE,
'PRELIM' => $::PRELIMINARYINFOPHASE,
'PAYMENTSELECT' => $::PAYSELECTPHASE,
'COUPON' => $::COUPONPHASE,
'TANDC' => $::TANDCPHASE,
};
my @arrKeyValues = split /[&=]/, $::g_OriginalInputData;
my @arrKeys;
my $i;
for ($i = 0; $i < scalar(@arrKeyValues); $i += 2)
{
my $sKey = $arrKeyValues[$i];
if ($arrKeyValues[$i] eq 'ActCheckoutPhase')
{
my $sPhaseLabel = $arrKeyValues[$i + 1];
push @arrKeys, $rhashPhases->{$sPhaseLabel};
}
}
if ($::g_nCurrentSequenceNumber == 3)
{
push @arrKeys, $::COMPLETEPHASE;
}
return (\@arrKeys);
}
sub ValidateShipCharge
{
if ($#_ != 0)
{
ACTINIC::ReportError(ACTINIC::GetPhrase(-1, 12, 'ValidateShipCharge'), ACTINIC::GetPath());
}
my ($bActuallyValidate) = @_;
my ($sError);
if ($$::g_pSetupBlob{MAKE_SHIPPING_CHARGE} &&
!ActinicOrder::IsPhaseHidden($::SHIPCHARGEPHASE))
{
my @Response = ActinicOrder::GetShippingPluginResponse();
if ($bActuallyValidate)
{
if ($Response[0] != $::SUCCESS)
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) .
ACTINIC::GetPhrase(-1, 102) . ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) . " - ". $Response[1] . "
\n";
}
elsif (${$Response[2]}{ValidateFinalInput} != $::SUCCESS)
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) .
ACTINIC::GetPhrase(-1, 102) . ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) . " - ". ${$Response[3]}{ValidateFinalInput} . "
\n";
}
}
}
$::g_ShipInfo{'USERDEFINED'} = $::g_InputHash{'SHIPUSERDEFINED'};
ACTINIC::TrimHashEntries(\%::g_ShipInfo);
if (defined $::g_InputHash{'SHIPUSERDEFINED'})
{
if ($bActuallyValidate &&
ACTINIC::IsPromptRequired(2, 1) &&
$::g_ShipInfo{'USERDEFINED'} eq "")
{
$sError .= ACTINIC::GetRequiredMessage(2, 1);
}
if (length $::g_ShipInfo{'USERDEFINED'} > $::g_pFieldSizes->{'USERDEFINED'})
{
$sError .= ACTINIC::GetLengthFailureMessage(2, 1, $::g_pFieldSizes->{'USERDEFINED'});
}
if ($sError ne "")
{
$sError = ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 149) . ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1961, $sError);
}
}
return ($sError);
}
sub ValidateGeneral
{
if ($#_ != 0)
{
ACTINIC::ReportError(ACTINIC::GetPhrase(-1, 12, 'ValidateGeneral'), ACTINIC::GetPath());
}
my ($bActuallyValidate) = @_;
$::g_GeneralInfo{'HOWFOUND'} = $::g_InputHash{'GENERALHOWFOUND'};
$::g_GeneralInfo{'WHYBUY'} = $::g_InputHash{'GENERALWHYBUY'};
$::g_GeneralInfo{'USERDEFINED'} = $::g_InputHash{'GENERALUSERDEFINED'};
ACTINIC::TrimHashEntries(\%::g_GeneralInfo);
my ($sError);
if (!$bActuallyValidate)
{
return ($sError);
}
my $pMapping =
{
'HOWFOUND' => 0,
'WHYBUY' => 1,
'USERDEFINED' => 2,
};
$sError .= CheckInputField(4, $pMapping, \%::g_GeneralInfo);
return ActinicOrder::FormatCheckoutInputError(ACTINIC::GetPhrase(-1, 151), $sError);
}
sub ValidatePayment
{
if ($#_ != 0 && $#_ != 1)
{
ACTINIC::ReportError(ACTINIC::GetPhrase(-1, 12, 'ValidatePayment'), ACTINIC::GetPath());
}
my ($bActuallyValidate, $sFormat) = @_;
$::g_PaymentInfo{'METHOD'} = $::g_InputHash{'PAYMENTMETHOD'};
$::g_PaymentInfo{'USERDEFINED'} = $::g_InputHash{'PAYMENTUSERDEFINED'};
$::g_PaymentInfo{'PONO'} = $::g_InputHash{'PAYMENTPONO'};
$::g_PaymentInfo{'CARDTYPE'} = $::g_InputHash{'PAYMENTCARDTYPE'};
$::g_PaymentInfo{'CARDNUMBER'} = $::g_InputHash{'PAYMENTCARDNUMBER'};
$::g_PaymentInfo{'CARDISSUE'} = $::g_InputHash{'PAYMENTCARDISSUE'};
$::g_PaymentInfo{'CARDVV2'} = $::g_InputHash{'PAYMENTCARDVV2'};
$::g_PaymentInfo{'EXPMONTH'} = $::g_InputHash{'PAYMENTEXPMONTH'};
$::g_PaymentInfo{'EXPYEAR'} = $::g_InputHash{'PAYMENTEXPYEAR'};
$::g_PaymentInfo{'STARTMONTH'} = $::g_InputHash{'PAYMENTSTARTMONTH'};
$::g_PaymentInfo{'STARTYEAR'} = $::g_InputHash{'PAYMENTSTARTYEAR'};
ACTINIC::TrimHashEntries(\%::g_PaymentInfo);
my ($sError);
if (!$bActuallyValidate)
{
return ($sError);
}
my @Response = $::Session->GetCartObject();
if ($Response[0] != $::SUCCESS)
{
return ($Response[1]);
}
my $pCartObject = $Response[2];
my $pCartList = $pCartObject->GetCartList();
my (@SummaryResponse) = $pCartObject->SummarizeOrder($::FALSE);
if (($SummaryResponse[6] == 0) ||
(!$$::g_pSetupBlob{'PRICES_DISPLAYED'}))
{
EnsurePaymentSelection();
}
else
{
if (0 == length $::g_PaymentInfo{'METHOD'})
{
return(ACTINIC::GetPhrase(-1, 55, ACTINIC::GetPhrase(-1, 152)));
}
my (@arrMethods, $nMethodID);
ActinicOrder::GenerateValidPayments(\@arrMethods);
my ($bFound) = $::FALSE;
foreach $nMethodID (@arrMethods)
{
if ($nMethodID == $::g_PaymentInfo{'METHOD'})
{
$bFound = $::TRUE;
last;
}
}
if (!$bFound)
{
return (ACTINIC::GetPhrase(-1, 2448, $::g_PaymentInfo{'METHOD'}));
}
}
my $pMapping =
{
'PONO' => 6,
'USERDEFINED' => 7,
};
$sError .= CheckInputField(5, $pMapping, \%::g_PaymentInfo, $sFormat);
my ($ePaymentMethod) = ActinicOrder::PaymentStringToEnum($::g_PaymentInfo{'METHOD'}); # the payment method is stored as "ENUMERATEDID:DESCRIPTION"
if (defined $::g_InputHash{'PAYMENTCARDTYPE'} &&
$ePaymentMethod == $::PAYMENT_CREDIT_CARD)
{
if ($::g_PaymentInfo{'CARDTYPE'} eq "")
{
$sError .= ACTINIC::GetRequiredMessage(5, 1);
}
my ($nIndex, $sCCID, $bFound);
$bFound = $::FALSE;
for ($nIndex = 0; $nIndex < 12; $nIndex++)
{
$sCCID = sprintf('CC%d', $nIndex);
if ($$::g_pSetupBlob{$sCCID} eq
$::g_PaymentInfo{'CARDTYPE'})
{
$bFound = $::TRUE;
last;
}
}
if (!$bFound)
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . ACTINIC::GetPhrase(5, 1) .
ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) .
ACTINIC::GetPhrase(-1, 107, $::g_PaymentInfo{'CARDTYPE'}) . "
\n"
}
my ($nNumber) = $::g_PaymentInfo{'CARDNUMBER'};
$nNumber =~ s/\s//g;
$nNumber =~ s/-//g;
if ($nNumber eq "")
{
$sError .= ACTINIC::GetRequiredMessage(5, 2);
}
if ($nNumber =~ /[^0-9]/)
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . ACTINIC::GetPhrase(5, 2) .
ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) .
ACTINIC::GetPhrase(-1, 108) . "
\n"
}
my ($nCheckSum, $nDigitCount) = (0, 0);
my ($nDigit, $nCheck);
for($nIndex = (length $nNumber) - 1; $nIndex >= 0; $nIndex--)
{
$nDigit = substr($nNumber, $nIndex, 1);
$nCheck = (1 + $nDigitCount++ % 2) *
$nDigit;
if ( $nCheck >= 10)
{
$nCheck++;
}
$nCheckSum += $nCheck;
}
if (($nCheckSum % 10) != 0)
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . ACTINIC::GetPhrase(5, 2) .
ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) .
ACTINIC::GetPhrase(-1, 109) . "
\n"
}
if ($$::g_pSetupBlob{$sCCID . '_ISSUENUMBERFLAG'})
{
if ($::g_PaymentInfo{'CARDISSUE'} eq "" ||
$::g_PaymentInfo{'CARDISSUE'} < 0 ||
$::g_PaymentInfo{'CARDISSUE'} > 255)
{
$sError .= ACTINIC::GetPhrase(-1, 110, ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) .
ACTINIC::GetPhrase(5, 5) . ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970), $::g_PaymentInfo{'CARDTYPE'}) . "
\n"
}
}
else
{
$::g_PaymentInfo{'CARDISSUE'} = "";
}
if ($$::g_pSetupBlob{$sCCID . '_CVV2FLAG'})
{
my $nLength = $$::g_pSetupBlob{$sCCID . '_CVV2DIGITS'};
if ($::g_PaymentInfo{'CARDVV2'} !~ /^[0-9]{$nLength,$nLength}$/)
{
$sError .= ACTINIC::GetPhrase(-1, 560) . "
\n"
}
}
else
{
$::g_PaymentInfo{'CARDVV2'} = "";
}
my @listCurrentTime = localtime(time);
my $nMonth = $listCurrentTime[$::TIME_MONTH];
my $nYear = $listCurrentTime[$::TIME_YEAR];
$nMonth++;
$nYear += 1900;
if ($$::g_pSetupBlob{$sCCID . '_STARTDATEFLAG'})
{
if (($::g_PaymentInfo{'STARTMONTH'} !~ /^\d{2}$/) ||
($::g_PaymentInfo{'STARTYEAR'} !~ /^\d{4}$/))
{
$sError .= ACTINIC::GetRequiredMessage(5, 3);
$::g_PaymentInfo{'STARTMONTH'} = "";
$::g_PaymentInfo{'STARTYEAR'} = "";
}
if ($::g_PaymentInfo{'STARTYEAR'} == $nYear &&
$::g_PaymentInfo{'STARTMONTH'} > $nMonth)
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . ACTINIC::GetPhrase(5, 3) .
ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) .
ACTINIC::GetPhrase(-1, 111) . "
\n"
}
}
else
{
$::g_PaymentInfo{'STARTMONTH'} = "";
$::g_PaymentInfo{'STARTYEAR'} = "";
}
if (($::g_PaymentInfo{'EXPMONTH'} !~ /^\d{2}$/) ||
($::g_PaymentInfo{'EXPYEAR'} !~ /^\d{4}$/))
{
$sError .= ACTINIC::GetRequiredMessage(5, 4);
$::g_PaymentInfo{'EXPMONTH'} = "";
$::g_PaymentInfo{'EXPYEAR'} = "";
}
if ($::g_PaymentInfo{'EXPYEAR'} == $nYear &&
$::g_PaymentInfo{'EXPMONTH'} < $nMonth)
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . ACTINIC::GetPhrase(5, 4) .
ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) .
ACTINIC::GetPhrase(-1, 112) . "
\n"
}
if ($$::g_pSetupBlob{$sCCID . '_STARTDATEFLAG'})
{
if ($::g_PaymentInfo{'EXPYEAR'} < $::g_PaymentInfo{'STARTYEAR'} ||
($::g_PaymentInfo{'EXPYEAR'} == $::g_PaymentInfo{'STARTYEAR'} &&
$::g_PaymentInfo{'EXPMONTH'} <= $::g_PaymentInfo{'STARTMONTH'}))
{
$sError .= ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . ACTINIC::GetPhrase(5, 4) .
ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970) .
ACTINIC::GetPhrase(-1, 561) . "
\n"
}
}
}
else
{
$::g_PaymentInfo{'CARDTYPE'} = "";
$::g_PaymentInfo{'CARDNUMBER'} = "";
$::g_PaymentInfo{'CARDISSUE'} = "";
$::g_PaymentInfo{'CARDVV2'} = "";
$::g_PaymentInfo{'EXPMONTH'} = "";
$::g_PaymentInfo{'EXPYEAR'} = "";
$::g_PaymentInfo{'STARTMONTH'} = "";
$::g_PaymentInfo{'STARTYEAR'} = "";
}
if ($sFormat ne 'text')
{
return ActinicOrder::FormatCheckoutInputError(ACTINIC::GetPhrase(-1, 152), $sError);
}
elsif ($sError ne '')
{
return sprintf("\n%s\n%s", ACTINIC::GetPhrase(-1, 152), $sError);
}
return '';
}
sub ValidateSignature
{
$::g_sSignature = $::g_InputHash{SIGNATURE};
if ($::g_sSignature ne '')
{
$::g_sSignature =~ /^([a-fA-F0-9]{32})$/;
$::g_sSignature = $1;
}
return (undef);
}
sub DisplayPage
{
if ($#_ != 2)
{
return ($::FAILURE, ACTINIC::GetPhrase(-1, 12, 'DisplayPage'), 0, 0);
}
my (%VariableTable, $sDetailCookie);
my ($sError, $nPageNumber, $eDirection) = @_;
my (@Response, $sPath);
$sPath = ACTINIC::GetPath();
my ($pCartList);
my $sMessage;
my $bReDisplayReceipt = $::FALSE;
if($::g_InputHash{'ACTION'} !~ m/^AUTHORIZE_(\d+)$/i)
{
@Response = $::Session->GetCartObject();
if ($Response[0] == $::EOF)
{
my ($sPhaseList) = $$::g_pPhaseList{$nPageNumber};
my (@Phases) = split (//, $sPhaseList);
if (($nPageNumber == 3 && $Phases[0] == $::COMPLETEPHASE) ||
($nPageNumber == 4 && $Phases[0] == $::RECEIPTPHASE))
{
@Response = $::Session->RestoreCheckoutInfo();
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
my ($Status, $Message, $pBillContact, $pShipContact, $pShipInfo, $pTaxInfo, $pGeneralInfo, $pPaymentInfo, $pLocationInfo) = @Response;
%::g_BillContact = %$pBillContact;
%::g_ShipContact = %$pShipContact;
%::g_ShipInfo = %$pShipInfo;
%::g_TaxInfo = %$pTaxInfo;
%::g_GeneralInfo = %$pGeneralInfo;
%::g_PaymentInfo = %$pPaymentInfo;
%::g_LocationInfo = %$pLocationInfo;
@Response = $::Session->GetCartObject($::TRUE);
if ($Response[0] == $::SUCCESS)
{
$bReDisplayReceipt = $::TRUE;
}
}
if (!$bReDisplayReceipt)
{
@Response = ACTINIC::BounceToPageEnhanced(7, ACTINIC::GetPhrase(-1, 1282),
$$::g_pSetupBlob{CHECKOUT_DESCRIPTION},
$::g_sWebSiteUrl,
$::g_sContentUrl, $::g_pSetupBlob,
$::Session->GetLastShopPage(),
\%::g_InputHash,
$::FALSE);
return (@Response);
}
}
my $pCartObject = $Response[2];
$pCartList = $pCartObject->GetCartList();
my $nLineCount = CountValidCartItems($pCartList);
if ($nLineCount != scalar @$pCartList &&
$::g_bFirstError)
{
$::g_bFirstError = $::FALSE;
$sMessage = "
" . ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . ACTINIC::GetPhrase(-1, 175) . ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970);
return(DisplayPage($sMessage, $::g_nCurrentSequenceNumber, $eDirection));
}
}
my (@DeleteDelimiters, @KeepDelimiters, $nInc, $status);
my ($pVarTable, $pDeleteDelimiters, $pKeepDelimiters, $nKeyCount, $pSelectTable);
if ($bReDisplayReceipt)
{
($status, $sMessage, $pVarTable, $pDeleteDelimiters, $pKeepDelimiters) = DisplayReceiptPhase($::g_PaymentInfo{'ORDERNUMBER'}, $::g_PaymentInfo{METHOD}, $bReDisplayReceipt);
$nPageNumber = 4;
}
else
{
$nInc = ($eDirection == $::FORWARD) ? 1 : -1;
$nKeyCount = 0;
while ($nKeyCount == 0 &&
$nPageNumber >= 0)
{
my $sTempCookie;
($status, $sMessage, $pVarTable, $pDeleteDelimiters, $pKeepDelimiters, $pSelectTable, $sTempCookie) =
ProcessPage($nPageNumber, $eDirection);
$sDetailCookie .= $sTempCookie;
if ($status != $::SUCCESS)
{
if ($::g_bFirstError)
{
$::g_bFirstError = $::FALSE;
$sMessage = "
" . ACTINIC::GetPhrase(-1, 1974) . ACTINIC::GetPhrase(-1, 1971, $::g_sRequiredColor) . $sMessage . ACTINIC::GetPhrase(-1, 1975) . ACTINIC::GetPhrase(-1, 1970);
return(DisplayPage($sMessage, $::g_nCurrentSequenceNumber, $eDirection));
}
else
{
return($status, $sMessage, 0, undef);
}
}
if ($nPageNumber != 2)
{
$nKeyCount = (keys %$pVarTable) + (keys %$pSelectTable);
}
else
{
$nKeyCount = 1;
$pVarTable = {};
}
$nPageNumber += $nInc;
}
$nPageNumber -= $nInc;
if ($nKeyCount == 0)
{
if (length $sError > 0)
{
my ($sRefPage) = $::Session->GetLastShopPage();
if ($$::g_pSetupBlob{UNFRAMED_CHECKOUT} &&
$$::g_pSetupBlob{UNFRAMED_CHECKOUT_URL})
{
$sRefPage = $$::g_pSetupBlob{UNFRAMED_CHECKOUT_URL};
}
my @Response = ACTINIC::BounceToPageEnhanced(-1, $sError, ACTINIC::GetPhrase(-1, 25),
$::g_sWebSiteUrl, $::g_sContentUrl, $::g_pSetupBlob, $sRefPage, \%::g_InputHash);
if ($Response[0] != $::SUCCESS)
{
ACTINIC::ReportError($sError, ACTINIC::GetPath());
}
return ($::SUCCESS, '', $Response[2], undef);
}
else
{
return ($::SUCCESS, "", GetCancelPage(), undef);
}
}
}
my (@a1, @a2);
@a1 = %VariableTable;
@a2 = %$pVarTable;
push (@a1, @a2);
%VariableTable = @a1;
@DeleteDelimiters = @$pDeleteDelimiters;
@KeepDelimiters = @$pKeepDelimiters;
if (length $VariableTable{$::VARPREFIX.'ERROR'})
{
$sError .= ' ' . $VariableTable{$::VARPREFIX.'ERROR'};
}
$sError = ACTINIC::GroomError($sError);
$VariableTable{$::VARPREFIX.'ERROR'} = $sError;
$VariableTable{$::VARPREFIX.'SEQUENCE'} = $nPageNumber;
my ($sFileName);
$sFileName = sprintf('order%2.2d.html', $nPageNumber);
if ($::g_sOverrideCheckoutFileName)
{
$sFileName = $::g_sOverrideCheckoutFileName;
}
@Response = ActinicOrder::GenerateShoppingCartLines($pCartList, $::FALSE, [], $sFileName);
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
@Response = ACTINIC::TemplateFile($sPath.$sFileName, \%VariableTable);
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
my ($sDigest,$sBaseFile) = ACTINIC::CaccGetCookies();
$sPath = ($sBaseFile) ? $sBaseFile : $::g_sContentUrl;
my $sWebSiteURL = $::g_sWebSiteUrl;
if ($sDigest)
{
my $sCgiUrl = $::g_sAccountScript;
$sCgiUrl .= ($::g_InputHash{SHOP} ?
'?SHOP=' . ACTINIC::EncodeText2($::g_InputHash{SHOP}, $::FALSE) . '&' :
'?');
$sCgiUrl .= "ACTINIC_REFERRER=" . ACTINIC::EncodeText2($::g_sAccountScript) . '&';
$sCgiUrl .= "PRODUCTPAGE=";
$sWebSiteURL = $sCgiUrl;
}
@Response = ACTINIC::MakeLinksAbsolute($Response[2], $sWebSiteURL, $sPath);
if ($Response[0] != $::SUCCESS)
{
return (@Response);
}
my ($sHTML) = $Response[2];
my ($sDelimiter);
foreach $sDelimiter (@DeleteDelimiters)
{
$sHTML =~ s/$::DELPREFIX$sDelimiter(.*?)$::DELPREFIX$sDelimiter//gs;
}
foreach $sDelimiter (@KeepDelimiters)
{
$sHTML =~ s/$::DELPREFIX$sDelimiter//gs;
}
my ($sSelectName, $sDefaultOption);
while ( ($sSelectName, $sDefaultOption) = each %$pSelectTable)
{
$sHTML =~ s/(<\s*SELECT[^>]+?NAME\s*=\s*("|')?$sSelectName.+?)