Public/New-SnipeitAsset.ps1

<#
.SYNOPSIS
Add a new Asset to Snipe-it asset system

.DESCRIPTION
Long description


.PARAMETER status_id
Required Status ID of the asset, this can be got using Get-Status

.PARAMETER model_id
Required Model ID of the asset, this can be got using Get-Model

.PARAMETER name
Optional Name of the Asset

.PARAMETER asset_tag
Asset Tag for the Asset, not required when snipe asset_tag autogeneration is on.

.PARAMETER serial
Optional Serial number of the Asset

.PARAMETER company_id
Optional Company id

.PARAMETER order_number
Optional Order number

.PARAMETER notes
Optional Notes

.PARAMETER warranty_monhts
Optional Warranty lenght of the Asset in months

.PARAMETER purchase_cost
Optional Purchase cost of the Asset

.PARAMETER purchase_date
Optional Purchase cost of the Asset

.PARAMETER supplier_id
Optional Supplier id of the Asset


.PARAMETER rtd_location_id
Optional Default location id for the asset

.PARAMETER image
Asset image filename and path

.PARAMETER assigned_id
Id of target user , location or asset

 .PARAMETER checkout_to_type
Checkout asset when creating to one of following types user, location or asset.

.PARAMETER url
Deprecated parameter, please use Connect-SnipeitPS instead. URL of Snipeit system.

.PARAMETER apiKey
Deprecated parameter, please use Connect-SnipeitPS instead. Users API Key for Snipeit.

.PARAMETER customfields
Hastable of custom fields and extra fields that need passing through to Snipeit.
Use internal field names from snipeit .You can use Get-CustomField to get internal field names.

.EXAMPLE
New-SnipeitAsset -status_id 1 -model_id 1 -name "Machine1"
Create asset with automatic tag if tag genaration is enabled on snipe-it, other wise without tag

.EXAMPLE
New-SnipeitAsset -status_id 1 -model_id 1 -name "Machine1" -asset_tag "DEV123"
Specifying asset tag when creating asset

.EXAMPLE
New-SnipeitAsset -status_id 1 -model_id 1 -name "Machine1" -customfields = @{ "_snipeit_os_5" = "Windows 10 Pro" }
Using customfields when creating asset.
#>


function New-SnipeitAsset() {
    [CmdletBinding(
        SupportsShouldProcess = $true,
        ConfirmImpact = "Low",
        DefaultParameterSetName = 'Create asset'
    )]

    Param(

        [parameter(ParameterSetName='Create asset',mandatory = $true)]
        [parameter(ParameterSetName='Checkout asset when creating',mandatory = $true)]
        [int]$status_id,

        [parameter(mandatory = $true)]
        [int]$model_id,

        [parameter(mandatory = $false)]
        [string]$name,

        [parameter(mandatory = $false)]
        [Alias('tag')]
        [string]$asset_tag,

        [parameter(mandatory = $false)]
        [string]$serial,

        [parameter(mandatory = $false)]
        [int]$company_id,

        [parameter(mandatory = $false)]
        [string]$order_number,

        [parameter(mandatory = $false)]
        [string]$notes,

        [parameter(mandatory = $false)]
        [int]$warranty_months,

        [parameter(mandatory = $false)]
        [string]$purchase_cost,

        [parameter(mandatory = $false)]
        [datetime]$purchase_date,

        [parameter(mandatory = $false)]
        [int]$supplier_id,

        [parameter(mandatory = $false)]
        [int]$rtd_location_id,

        [ValidateScript({Test-Path $_})]
        [string]$image,

        [parameter(ParameterSetName='Checkout asset when creating',mandatory = $true)]
        [int]$assigned_id,

        [parameter(ParameterSetName='Checkout asset when creating',mandatory = $true)]
        [ValidateSet("location","asset","user")]
        [string] $checkout_to_type = "user",

        [parameter(mandatory = $false)]
        [string]$url,

        [parameter(mandatory = $false)]
        [string]$apiKey,

        [Alias('CustomValues')]
        [hashtable] $customfields
    )

    begin {
        Test-SnipeitAlias -invocationName $MyInvocation.InvocationName -commandName $MyInvocation.MyCommand.Name

        $Values = . Get-ParameterValue -Parameters $MyInvocation.MyCommand.Parameters -BoundParameters $PSBoundParameters

        if ($values['purchase_date']) {
            $values['purchase_date'] = $values['purchase_date'].ToString("yyyy-MM-dd")
        }

        if ($customfields) {
            $Values += $customfields
        }

        #Checkout asset when creating it
        if ($PsCmdlet.ParameterSetName -eq 'Checkout asset when creating') {
            switch ($checkout_to_type) {
                    'location' { $Values += @{ "assigned_location" = $assigned_id } }
                    'user' { $Values += @{ "assigned_user" = $assigned_id } }
                    'asset' { $Values += @{ "assigned_asset" = $assigned_id } }
            }

            #This are not needed for API
            if ($Values.ContainsKey('assigned_id')) {$Values.Remove('assigned_id')}
            if ($Values.ContainsKey('checkout_to_type')) {$Values.Remove('checkout_to_type')}
        }

        $Parameters = @{
            Api    = "/api/v1/hardware"
            Method = 'Post'
            Body   = $Values
        }

        if ($PSBoundParameters.ContainsKey('apiKey') -and '' -ne [string]$apiKey) {
            Write-Warning "-apiKey parameter is deprecated, please use Connect-SnipeitPS instead."
            Set-SnipeitPSLegacyApiKey -apiKey $apikey
        }

        if ($PSBoundParameters.ContainsKey('url') -and '' -ne [string]$url) {
            Write-Warning "-url parameter is deprecated, please use Connect-SnipeitPS instead."
            Set-SnipeitPSLegacyUrl -url $url
        }
    }

    process {
        if ($PSCmdlet.ShouldProcess("ShouldProcess?")) {
            $result = Invoke-SnipeitMethod @Parameters
        }

        $result
    }

    end {
        # reset legacy sessions
        if ($PSBoundParameters.ContainsKey('url') -and '' -ne [string]$url -or $PSBoundParameters.ContainsKey('apiKey') -and '' -ne [string]$apiKey) {
            Reset-SnipeitPSLegacyApi
        }
    }
}