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 )