NAME
    Business::AuthorizeNet::CIM - Authorize.Net Customer Information Manager
    (CIM) Web Services API

VERSION
    version 0.05

SYNOPSIS
        use Business::AuthorizeNet::CIM;
        use Data::Dumper;
    
        my $cim = Business::AuthorizeNet::CIM->new( login => $cfg{login}, transactionKey => $cfg{password} );

        my @ProfileIds = $cim->getCustomerProfileIds();
        foreach my $id (@ProfileIds) {
            my $d = $cim->getCustomerProfile($id);
            print Dumper(\$d);
        }

DESCRIPTION
    Authorize.Net Customer Information Manager (CIM) Web Services API for
    <http://developer.authorize.net/api/cim/>, read
    <http://www.authorize.net/support/CIM_XML_guide.pdf> for more details.

  METHODS
   CONSTRUCTION
        my $cim = Business::AuthorizeNet::CIM->new(
            login => $cfg{login},
            transactionKey => $cfg{password}
        );

    *   login

        The valid API Login ID for the developer test or merchant account

    *   transactionKey

        The valid Transaction Key for the developer test or merchant account

    *   debug

    *   test_mode

        validationMode as testMode or liveMode

    *   ua_args

        passed to LWP::UserAgent

    *   ua

        LWP::UserAgent or WWW::Mechanize instance

   createCustomerProfile
    Create a new customer profile along with any customer payment profiles
    and customer shipping addresses for the customer profile.

        $cim->createCustomerProfile(
            refId => $refId, # Optional
        
            # one of 'merchantCustomerId', 'description', 'email' is required
            merchantCustomerId => $merchantCustomerId,
            description => $description,
            email => $email,
        
            customerType => $customerType, # Optional
            billTo => { # Optional, all sub items are Optional
                firstName => $firstName,
                lastName  => $lastName,
                company   => $company,
                address   => $address,
                city      => $city,
                state     => $state,
                zip       => $zip,
                country   => $country,
                phoneNumber => $phoneNumber,
                faxNumber => $faxNumber
            },
            # or it uses shipToList address as billTo
            use_shipToList_as_billTo => 1,
        
            creditCard => { # required when the payment profile is credit card
                cardNumber => $cardNumber,
                expirationDate => $expirationDate, # YYYY-MM
                cardCode => $cardCode,  # Optional
            },
            bankAccount => { # required when the payment profile is bank account
                accountType => $accountType, # Optional, one of checking, savings, businessChecking
                routingNumber => $routingNumber,
                accountNumber => $accountNumber,
                nameOnAccount => $nameOnAccount,
                echeckType => $echeckType, # Optionaal, one of CCD, PPD, TEL, WEB
                bankName   => $bankName, # Optional
            },
        
            shipToList => {
                firstName => $firstName,
                lastName  => $lastName,
                company   => $company,
                address   => $address,
                city      => $city,
                state     => $state,
                zip       => $zip,
                country   => $country,
                phoneNumber => $phoneNumber,
                faxNumber => $faxNumber
            },
        
            # or it uses billTo address as shipToList
            use_billTo_as_shipToList => 1,
        );

   createCustomerPaymentProfileRequest
    Create a new customer payment profile for an existing customer profile.
    You can create up to 10 payment profiles for each customer profile.

        $cim->createCustomerPaymentProfileRequest(
            customerProfileId => $customerProfileId, # required
    
            refId => $refId, # Optional

            customerType => $customerType, # Optional
            billTo => { # Optional, all sub items are Optional
                firstName => $firstName,
                lastName  => $lastName,
                company   => $company,
                address   => $address,
                city      => $city,
                state     => $state,
                zip       => $zip,
                country   => $country,
                phoneNumber => $phoneNumber,
                faxNumber => $faxNumber
            },
        
            creditCard => { # required when the payment profile is credit card
                cardNumber => $cardNumber,
                expirationDate => $expirationDate, # YYYY-MM
                cardCode => $cardCode,  # Optional
            },
            bankAccount => { # required when the payment profile is bank account
                accountType => $accountType, # Optional, one of checking, savings, businessChecking
                routingNumber => $routingNumber,
                accountNumber => $accountNumber,
                nameOnAccount => $nameOnAccount,
                echeckType => $echeckType, # Optionaal, one of CCD, PPD, TEL, WEB
                bankName   => $bankName, # Optional
            },
        );

   createCustomerShippingAddressRequest
    Create a new customer shipping address for an existing customer profile.
    You can create up to 100 customer shipping addresses for each customer
    profile.

        $cim->createCustomerShippingAddressRequest(
            customerProfileId => $customerProfileId, # required
    
            refId => $refId, # Optional
        
            firstName => $firstName,
            lastName  => $lastName,
            company   => $company,
            address   => $address,
            city      => $city,
            state     => $state,
            zip       => $zip,
            country   => $country,
            phoneNumber => $phoneNumber,
            faxNumber => $faxNumber
        );

   createCustomerProfileTransaction
    Create a new payment transaction from an existing customer profile.

        $cim->createCustomerProfileTransaction(
            'profileTransAuthCapture', # or others like profileTransAuthOnly

            refId => $refId, # Optional, reference id
        
            amount => $amount,
            tax => { # Optional
                amount => $tax_amount,
                name   => $tax_name,
                description => $tax_description
            },
            shipping => { # Optional
                amount => $tax_amount,
                name   => $tax_name,
                description => $tax_description
            },
            duty => { # Optional
                amount => $tax_amount,
                name   => $tax_name,
                description => $tax_description
            },
        
            lineItems => [ { # Optional
                itemId => $itemId,
                name => $name,
                description => $description,
                quantity => $quantity,
                unitPrice => $unitPrice,
                taxable => $taxable,
            } ],
    
            customerProfileId => $customerProfileId,
            customerPaymentProfileId => $customerPaymentProfileId,
            customerShippingAddressId => $customerShippingAddressId,
        
            extraOptions => $extraOptions, # Optional
        
            ### Only required for profileTransPriorAuthCapture: For Prior Authorization and CaptureTransactions
            ### and profileTransRefund: For Refund Transactions
            ### and profileTransVoid: For Void Transactions
            transId => $transId,
        
            ### Only partly required for profileTransRefund: For Refund Transactions
            creditCardNumberMasked => $creditCardNumberMasked,
            bankRoutingNumberMasked => $bankRoutingNumberMasked,
            bankAccountNumberMasked => $bankAccountNumberMasked,
        
            ### rest are not for profileTransPriorAuthCapture
            order => { # Optional
                invoiceNumber => $invoiceNumber,
                description => $description,
                purchaseOrderNumber => $purchaseOrderNumber,
            },
            taxExempt => 'true', # optional
            recurringBilling => 'false', # optional
            cardCode => $cardCode, # Required only when the merchant would like to use the Card Code Verification (CCV) filter
            splitTenderId => $splitTenderId, # Required for second and subsequent transactions related to a partial authorizaqtion transaction.
        
            #### ONLY required for profileTransCaptureOnly: the Capture Only transaction type.
            approvalCode => $approvalCode,
        );

    The first argument can be one of

    *   profileTransAuthOnly

        For Authorization Only Transactions

    *   profileTransAuthCapture

        For Authorization and Capture Transactions

    *   profileTransCaptureOnly

        For Capture Only Transactions

    *   profileTransPriorAuthCapture

        For Prior Authorization and CaptureTransactions

    *   profileTransRefund

        For Refund Transactions

    *   profileTransVoid

        For Void Transactions

            $cim->createCustomerProfileTransaction(
                'profileTransVoid', # or others like profileTransAuthOnly

                refId => $refId, # Optional, reference id
        
                customerProfileId => $customerProfileId,
                customerPaymentProfileId => $customerPaymentProfileId,
                customerShippingAddressId => $customerShippingAddressId,
        
                extraOptions => $extraOptions, # Optional

                transId => $transId,
            );

   deleteCustomerProfile
    Delete an existing customer profile along with all associated customer
    payment profiles and customer shipping addresses.

        $cim->deleteCustomerProfile($customerProfileId);

   deleteCustomerPaymentProfileRequest
    Delete a customer payment profile from an existing customer profile.

        $cim->deleteCustomerPaymentProfileRequest($customerProfileId, $customerPaymentProfileId);

   deleteCustomerShippingAddressRequest
    Delete a customer shipping address from an existing customer profile.

        $cim->deleteCustomerShippingAddressRequest($customerProfileId, $customerAddressId);

   getCustomerProfileIds
    Retrieve all customer profile IDs you have previously created.

        my @ProfileIds = $cim->getCustomerProfileIds;

   getCustomerProfile
    Retrieve an existing customer profile along with all the associated
    customer payment profiles and customer shipping addresses.

        $cim->getCustomerProfile($customerProfileId);

   getCustomerPaymentProfileRequest
    Retrieve a customer payment profile for an existing customer profile.

        $cim->getCustomerPaymentProfileRequest($customerProfileId, $customerPaymentProfileId);

   getCustomerShippingAddressRequest
    Retrieve a customer shipping address for an existing customer profile.

        $cim->getCustomerShippingAddressRequest($customerProfileId, $customerAddressId);

   updateCustomerProfile
    Update an existing customer profile

        $cim->updateCustomerProfile(
            customerProfileId => $customerProfileId,
        
            refId => $refId, # Optional
        
            merchantCustomerId => $merchantCustomerId,
            description => $description,
            email => $email
        );

   updateCustomerPaymentProfile
    Update a customer payment profile for an existing customer profile.

        $cim->updateCustomerPaymentProfile(
            customerProfileId => $customerProfileId,
            customerPaymentProfileId => $customerPaymentProfileId,
        
            refId => $refId, # Optional
        
            customerType => $customerType, # Optional
            billTo => { # Optional, all sub items are Optional
                firstName => $firstName,
                lastName  => $lastName,
                company   => $company,
                address   => $address,
                city      => $city,
                state     => $state,
                zip       => $zip,
                country   => $country,
                phoneNumber => $phoneNumber,
                faxNumber => $faxNumber
            },
        
            creditCard => { # required when the payment profile is credit card
                cardNumber => $cardNumber,
                expirationDate => $expirationDate, # YYYY-MM
                cardCode => $cardCode,  # Optional
            },
            bankAccount => { # required when the payment profile is bank account
                accountType => $accountType, # Optional, one of checking, savings, businessChecking
                routingNumber => $routingNumber,
                accountNumber => $accountNumber,
                nameOnAccount => $nameOnAccount,
                echeckType => $echeckType, # Optionaal, one of CCD, PPD, TEL, WEB
                bankName   => $bankName, # Optional
            },
        );

   updateCustomerShippingAddress
    Update a shipping address for an existing customer profile.

        $cim->updateCustomerShippingAddress(
            customerProfileId => $customerProfileId,
            customerAddressId => $customerAddressId,
        
            refId => $refId, # Optional
        
            firstName => $firstName,
            lastName  => $lastName,
            company   => $company,
            address   => $address,
            city      => $city,
            state     => $state,
            zip       => $zip,
            country   => $country,
            phoneNumber => $phoneNumber,
            faxNumber => $faxNumber
        );

   updateSplitTenderGroupRequest
    Update the status of a split tender group (a group of transactions, each
    of which pays for part of one order).

        $cim->updateSplitTenderGroupRequest($splitTenderId, $splitTenderStatus);
        # splitTenderStatus can be voided or completed.

   validateCustomerPaymentProfile
    Verify an existing customer payment profile by generating a test
    transaction.

        $cim->validateCustomerPaymentProfile(
            customerProfileId => $customerProfileId,
            customerPaymentProfileId => $customerPaymentProfileId,
            customerShippingAddressId => $customerShippingAddressId,
        
            cardCode => $cardCode, # Optional
        );

AUTHOR
    Fayland Lam <fayland@gmail.com>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2011 by Fayland Lam.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

