WebService-NetSuite
view release on metacpan or search on metacpan
lib/WebService/NetSuite.pm view on Meta::CPAN
push @searchValues, SOAP::Data->new( %{$searchValue} );
}
else {
$searchValue->{prefix} = namespace('core')
if !defined $searchValue->{prefix};
$searchValue->{name} = 'searchValue'
if !defined $searchValue->{name};
if ( $searchValue->{name} eq 'customField' ) {
my $customFieldValue = {
name => 'searchValue',
value => $searchValue->{value},
prefix => namespace('core')
};
$searchValue->{value} =
\SOAP::Data->new( %{$customFieldValue} );
}
else {
if ( $searchValue->{attr}->{internalId} ) {
$searchValue->{attr}->{'xsi:type'} =
namespace('core') . ':RecordRef';
}
}
push @searchValues, SOAP::Data->new( %{$searchValue} );
}
}
$searchElement->{value} = \SOAP::Data->value(@searchValues);
push @searchTypes, SOAP::Data->new( %{$searchElement} );
}
else {
$searchValue->{name} = 'searchValue'
if !defined $searchValue->{name};
$searchValue->{value} = $searchElement->{value}
if !defined $searchValue->{value};
$searchValue->{prefix} = namespace('core')
if !defined $searchValue->{prefix};
$searchValue->{attr}->{'xsi:type'} = namespace('core') . ':RecordRef'
if $searchElement->{attr}->{internalId};
$searchElement->{value} =
\SOAP::Data->new( %{$searchValue} );
push @searchTypes, SOAP::Data->new( %{$searchElement} );
}
}
push @searchRecord,
SOAP::Data->name( $searchType => \SOAP::Data->value(@searchTypes) )
->attr(
{
'xsi:type' => namespace('common') . ':' . $searchTypeNamespace
}
);
}
$self->soap->on_action( sub { return 'search'; } );
my $som = $self->soap->search(
$self->_passport,
SOAP::Header->name(
'searchPreferences' => \SOAP::Header->value(
SOAP::Header->name('bodyFieldsOnly')
->value( $header->{bodyFieldsOnly} )->prefix(namespace('messages')),
SOAP::Header->name('pageSize')->value( $header->{pageSize} )
->prefix(namespace('messages')),
)
)->prefix(namespace('messages')),
SOAP::Data->name(
'searchRecord' => \SOAP::Data->value(@searchRecord)
)->attr(
{
'xsi:type' => $search_namespaces->{$type} . ':' . $type
}
)
);
# $DB::single = 1;
if ( $som->fault ) {
$self->error;
}
else {
if ( $som->match("//searchResponse/searchResult/status") ) {
if ( $som->dataof("//searchResponse/searchResult/status")
->attr->{'isSuccess'} eq 'true' )
{
my $response = $self->_parseResponse;
if ( $response->{statusIsSuccess} eq 'true' ) {
$self->{SEARCH_RESULTS} = $response;
return 1;
}
else {
$self->error;
}
}
else {
$self->error;
}
}
else {
$self->error;
}
}
}
sub searchResults {
my $self = shift;
if ( defined $self->{SEARCH_RESULTS} ) {
return $self->{SEARCH_RESULTS};
}
else { return; }
}
sub searchMore {
my ( $self, $pageIndex ) = @_;
my $searchId = $self->{SEARCH_RESULTS}->{'searchId'};
$self->soap->on_action( sub { return 'searchMoreWithId'; } );
my $som =
$self->soap->searchMoreWithId( $self->_passport,
SOAP::Data->name('searchId')->value($searchId),
SOAP::Data->name('pageIndex')->value($pageIndex)
);
if ( $som->fault ) { $self->error; }
else {
if ( $som->match("//searchMoreWithIdResponse/searchResult/status") ) {
if ( $som->dataof("//searchMoreWithIdResponse/searchResult/status")
->attr->{'isSuccess'} eq 'true' )
{
my $response = $self->_parseResponse;
$self->{SEARCH_RESULTS} = $response;
if ( $response->{statusIsSuccess} eq 'true' ) {
return 1;
}
else { $self->error; }
}
else { $self->error; }
}
else { $self->error; }
}
}
sub searchNext {
my $self = shift;
my $page = $self->{SEARCH_RESULTS}->{'pageIndex'};
return $self->searchMore(++$page);
}
sub delete {
my ( $self, $recordType, $hashOrInternalId ) = @_;
undef my %req;
$req{'type'} = $recordType;
$req{'xsi:type'} = namespace('core') . ':RecordRef';
if (ref($hashOrInternalId) eq'HASH') {
foreach my $k (keys %{$hashOrInternalId}) {
$req{$k} = $hashOrInternalId->{$k};
}
} else {
$req{'internalId'} = $hashOrInternalId;
}
$self->soap->on_action( sub { return 'delete'; } );
my $som = $self->soap->delete(
$self->_passport,
SOAP::Data->name('baseRef')->attr(\%req)
->prefix(namespace('messages'))
);
if ( $som->fault ) { $self->error; }
else {
if ( $som->dataof("//deleteResponse/writeResponse/status")
->attr->{'isSuccess'} eq 'true' )
{
return $som->dataof("//deleteResponse/writeResponse/baseRef")
->attr->{'internalId'};
}
else { $self->error; }
}
}
sub _passport {
my $self = shift;
return SOAP::Header->name(
'passport' => \SOAP::Data->value(
SOAP::Data->name( 'email' => $self->nsemail ),
SOAP::Data->name( 'password' => $self->nspassword ),
SOAP::Data->name( 'account' => $self->nsaccount ),
SOAP::Data->name('role')->attr( { 'internalId' => $self->nsrole } )
),
);
}
sub map_sso {
my ( $self, $args ) = @_;
#$DB::single = 1;
my $email = $args->{email} || die 'no email passed';
my $password = $args->{password} || die 'no password passed';
my $user_id = $args->{user_id} || die 'no user_id passed';
my $role_id = $args->{role_id} || die 'no role_id passed';
$self->soap->on_action( sub { return 'mapSso'; } );
my $som = $self->soap->mapSso(
SOAP::Data->name(
'ssoCredentials' => \SOAP::Data->value(
SOAP::Data->name( 'email' => $email ),
SOAP::Data->name( 'password' => $password ),
SOAP::Data->name( 'account' => $self->nsaccount ),
SOAP::Data->name(
authenticationToken =>
$self->_generate_auth_token($user_id),
),
SOAP::Data->name( 'partnerId' => $self->nsaccount ),
SOAP::Data->name('role')->attr( { 'internalId' => $role_id } )
),
),
);
if ( $som->fault ) {
die "could not map_sso for user $user_id - " . $som->fault;
} else {
if ( $som->dataof("//mapSsoResponse/sessionResponse/status")
->attr->{'isSuccess'} eq 'true' ) {
return 1;
} else {
die "could not map_sso for user $user_id, role $role_id";
}
}
}
sub sso_url {
my ( $self, $args ) = @_;
my $user_id = $args->{user_id} || die 'no user_id';
my $return_url = $args->{return_url};
my $landing_url = $args->{landing_url};
my $hide_login_page = $args->{hide_login_page};
die "custom domain unsupported, Netsuite sandbox does not work with it"
if $args->{d};
my %args = (
a => $self->_generate_auth_token($user_id),
pid => $self->nsaccount,
c => $self->nsaccount,
( run in 2.655 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )