Public/New-AeriesSchedulingSection.ps1

function New-AeriesSchedulingSection
{
    <#
        .SYNOPSIS
        Add a Scheduling Section to Aeries

        .DESCRIPTION
        The New-AeriesSchedulingSection cmdlet is used to create a Scheduling Section in Aeries for the given SchoolCode

        .EXAMPLE
        New-AeriesSchedulingSection -SchoolCode 884 -Semester "F"
        This will create a Schedule Section in Aeries for SchoolCode 884
    #>


    [Alias("Add-AeriesSchedulingSection")]

    [CmdletBinding()]
    param (
        [ValidateRange(1, [Int16]::MaxValue)]
        [Parameter(Mandatory=$true)]
        [Int16]
        $SchoolCode,

        [ValidateRange(1, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $SectionNumber,

        [ValidateRange(0, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $Period = -1,

        [ValidateRange(1, [Int]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [int]
        $FlexPeriodSequenceNumber,

        [ValidateRange(1, 10)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $PeriodBlock,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$true)]
        [string]
        $Semester,

        [ValidateScript({
            if ([string]::IsNullOrEmpty($_))
            {
                <# If the value is blank, accept it. Might be section staff #>
                return $true
            }
            elseif ($_ -iin "A-DAYS","B-DAYS","FIRST","SECOND","DAILY")
            {
                <# If is in valid set, accept it #>
                return $true
            }
            elseif ($_.Length -le 6)
            {
                <# If value is 6 or less characters, accept it #>
                return $true
            }
            else
            {
                return $false
            }
        })]
        [Parameter(Mandatory=$false)]
        [string]
        $SplitTerm,

        [ValidateRange(1, [Int]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [int]
        $ClassCalendarSequenceNumber,

        [ValidateLength(1, 6)]
        [Parameter(Mandatory=$true)]
        [string]
        $CourseID,

        [ValidateRange(0, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $TeacherNumber1,

        [ValidateRange(0, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $TeacherNumber2 = -1,

        [ValidateRange(0, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $TeacherNumber3 = -1,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $HighlyQualifiedStatusCode1,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $HighlyQualifiedStatusCode2,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $HighlyQualifiedStatusCode3,

        [ValidateLength(1, 6)]
        [Parameter(Mandatory=$false)]
        [string]
        $Room,

        [Parameter(Mandatory=$false)]
        [decimal]
        $Credit,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $GenderRestriction,

        [ValidateRange(-2, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $LowGrade = -99, <# -99 because technically -1 that I usually use is a valid grade #>

        [ValidateRange(-2, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $HighGrade = -99, <# -99 because technically -1 that I usually use is a valid grade #>

        [ValidateRange(1, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $MaxStudents,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $InactiveStatusCode,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $ProgramCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $HourlyAttendanceProgramCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $ExclusionCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $CountsForADA,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $MultiTeacherCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $SchedulingGroup,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $TeamCourseGroup,

        [ValidateLength(1, [int]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [int]
        $TeamNumber,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $SemesterGroup,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $Track,

        [ValidateLength(1, [int]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [int]
        $ClassID,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $EducationServiceCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $LanguageOfInstructionCode,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $InstructionalStrategyCode,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $FundingSourceCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $CareerTechnicalEducationProviderCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $IndependentStudyIndicator,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $DistanceLearningIndicator,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $ItinerantTeacherIndicator,

        [Parameter(Mandatory=$false)]
        [switch]
        $UseSupplementalAttendance,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $PopulationServedCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $ClassTypeCode,

        [ValidateRange(1, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $MonthlyMinutes,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode1,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode2,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode3,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode4,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode5,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode6,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode7,

        [ValidateLength(1, 3)]
        [Parameter(Mandatory=$false)]
        [string]
        $UserCode8,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $ArticulatedCourseIndicator,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $NonCampusBasedInstructionCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $PreKSchoolTypeCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $PreKCurriculaCode,

        [Parameter(Mandatory=$false)]
        [switch]
        $IsHighQualityPreKProgram,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $InstructionTypeCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $ProgramEvaluationTypeCode,

        [ValidateLength(1, 2)]
        [Parameter(Mandatory=$false)]
        [string]
        $EducationalEnvironmentCode,

        [ValidateRange(1, [Int16]::MaxValue)]
        [Parameter(Mandatory=$false)]
        [Int16]
        $CareerTechnicalEducationHours,

        [ValidateLength(1, 20)]
        [Parameter(Mandatory=$false)]
        [string]
        $ContentSubcategoryCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $CharterNonCoreIndicator,

        [ValidateLength(1, 4)]
        [Parameter(Mandatory=$false)]
        [string]
        $AdvancedCourseStateCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $OnlineInstructionTypeCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $MiddleSchoolCoreIndicator,

        [ValidateLength(1, 4)]
        [Parameter(Mandatory=$false)]
        [string]
        $NonCredentialedAuthorizationCode,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $HighQualityCareerTechnicalEducationIndicator,

        [ValidateLength(1, 1)]
        [Parameter(Mandatory=$false)]
        [string]
        $ArenaSchedulingIndicator,

        [Parameter(Mandatory=$false)]
        [switch]
        $ExcludeFromScheduler,

        [Parameter(Mandatory=$false)]
        [SectionStaffMember[]]
        $SectionStaffMembers
    )

    Begin {
        Write-Verbose -Message "Begin running $($MyInvocation.MyCommand)"

        $Method = "Post"
        $SuccessStatusCode = 201
        $ContentType = "application/json"
        $Body = @{}

        $School = (Get-AeriesSchool -SchoolCode $SchoolCode)
        $IsSectionStaff = $School.UsingSectionStaffInScheduling
        $IsFlexible = $false

        If ($School.ScheduleType -ieq "Flexible") {
            $IsFlexible = $true
        }

        If ($IsSectionStaff) {
            $Endpoint = "v5/schools/$SchoolCode/scheduling/sections"
        }
        else
        {
            $Endpoint = "v4/schools/$SchoolCode/scheduling/sections"
        }
    }

    Process {

        If (!$IsFlexible) {
            <# Quick little checks to make sure the required fields for NON Flex schools are there #>
            If ($PeriodBlock -eq 0) {
                Throw "PeriodBlock is required for Non-Flex Schools"
            }
            If ($Period -eq -1) {
                Throw "Period is required for Non-Flex Schools"
            }
        }

        $Body.SchoolCode = $SchoolCode
        $Body.CourseID = $CourseID
        $Body.Semester = $Semester

        If ($IsFlexible) {
            <# Process all the things that are needed for Flex #>
            If ($FlexPeriodSequenceNumber -gt 0) {
                <# Int Value #>
                $Body.FlexPeriodSequenceNumber = $FlexPeriodSequenceNumber
            }
        }
        else
        {
            <# Process all the things that are needed for NON Flex #>
            If ($Period -gt -1) {
                <# Int16 Value #>
                $Body.Period = $Period
            }

            If ($PeriodBlock -gt 0) {
                <# Int16 Value #>
                $Body.PeriodBlock = $PeriodBlock
            }
    
            If (![string]::IsNullOrWhiteSpace($SplitTerm)) {
                <# String Value #>
                $Body.SplitTerm = $SplitTerm
            }
        }

        If ($IsSectionStaff) {
            <# Process all the things needed for Section Staff #>
            If ($ClassCalendarSequenceNumber -gt 0) {
                <# Int Value #>
                $Body.ClassCalendarSequenceNumber = $ClassCalendarSequenceNumber
            }
            
            If ($SectionStaffMembers.Count -gt 0) {
                <# SectionStaffMember[] Value #>
                $Body.SectionStaffMembers = $SectionStaffMembers
            }
        }
        else
        {
            <# Process all the things needed for NON Section Staff #>
            If ($TeacherNumber1 -gt -1) {
                <# Int Value #>
                $Body.TeacherNumber1 = $TeacherNumber1
            }
    
            If ($TeacherNumber2 -gt -1) {
                <# Int Value #>
                $Body.TeacherNumber2 = $TeacherNumber2
            }
    
            If ($TeacherNumber3 -gt -1) {
                <# Int Value #>
                $Body.TeacherNumber3 = $TeacherNumber3
            }

            If (![string]::IsNullOrWhiteSpace($HighlyQualifiedStatusCode1)) {
                <# String Value #>
                $Body.HighlyQualifiedStatusCode1 = $HighlyQualifiedStatusCode1
            }
    
            If (![string]::IsNullOrWhiteSpace($HighlyQualifiedStatusCode2)) {
                <# String Value #>
                $Body.HighlyQualifiedStatusCode2 = $HighlyQualifiedStatusCode2
            }
    
            If (![string]::IsNullOrWhiteSpace($HighlyQualifiedStatusCode3)) {
                <# String Value #>
                $Body.HighlyQualifiedStatusCode3 = $HighlyQualifiedStatusCode3
            }
        }

        <# Everything else that doesn't rely on SectionStaff or Flex #>
        If ($SectionNumber -gt 0) {
            <# Int16 Value #>
            $Body.SectionNumber = $SectionNumber
        }

        If (![string]::IsNullOrWhiteSpace($Room)) {
            <# String Value #>
            $Body.Room = $Room
        }

        If ($Credit -gt 0) {
            <# Decimal Value #>
            $Body.Credit = $Credit
        }

        If (![string]::IsNullOrWhiteSpace($GenderRestriction)) {
            <# String Value #>
            $Body.GenderRestriction = $GenderRestriction
        }

        If ($LowGrade -gt -99) {
            <# Int16 Value #>
            $Body.LowGrade = $LowGrade
        }

        If ($HighGrade -gt -99) {
            <# Int16 Value #>
            $Body.HighGrade = $HighGrade
        }

        If ($MaxStudents -gt 0) {
            <# Int16 Value #>
            $Body.MaxStudents = $MaxStudents
        }

        If (![string]::IsNullOrWhiteSpace($InactiveStatusCode)) {
            <# String Value #>
            $Body.InactiveStatusCode = $InactiveStatusCode
        }

        If (![string]::IsNullOrWhiteSpace($ProgramCode)) {
            <# String Value #>
            $Body.ProgramCode = $ProgramCode
        }

        If (![string]::IsNullOrWhiteSpace($HourlyAttendanceProgramCode)) {
            <# String Value #>
            $Body.HourlyAttendanceProgramCode = $HourlyAttendanceProgramCode
        }

        If (![string]::IsNullOrWhiteSpace($ExclusionCode)) {
            <# String Value #>
            $Body.ExclusionCode = $ExclusionCode
        }

        If (![string]::IsNullOrWhiteSpace($CountsForADA)) {
            <# String Value #>
            $Body.CountsForADA = $CountsForADA
        }

        If (![string]::IsNullOrWhiteSpace($MultiTeacherCode)) {
            <# String Value #>
            $Body.MultiTeacherCode = $MultiTeacherCode
        }

        If (![string]::IsNullOrWhiteSpace($SchedulingGroup)) {
            <# String Value #>
            $Body.SchedulingGroup = $SchedulingGroup
        }

        If (![string]::IsNullOrWhiteSpace($TeamCourseGroup)) {
            <# String Value #>
            $Body.TeamCourseGroup = $TeamCourseGroup
        }

        If ($TeamNumber -gt 0) {
            <# Int Value #>
            $Body.TeamNumber = $TeamNumber
        }

        If (![string]::IsNullOrWhiteSpace($SemesterGroup)) {
            <# String Value #>
            $Body.SemesterGroup = $SemesterGroup
        }

        If (![string]::IsNullOrWhiteSpace($Track)) {
            <# String Value #>
            $Body.Track = $Track
        }

        If ($ClassID -gt 0) {
            <# Int Value #>
            $Body.ClassID = $ClassID
        }

        If (![string]::IsNullOrWhiteSpace($EducationServiceCode)) {
            <# String Value #>
            $Body.EducationServiceCode = $EducationServiceCode
        }

        If (![string]::IsNullOrWhiteSpace($LanguageOfInstructionCode)) {
            <# String Value #>
            $Body.LanguageOfInstructionCode = $LanguageOfInstructionCode
        }

        If (![string]::IsNullOrWhiteSpace($InstructionalStrategyCode)) {
            <# String Value #>
            $Body.InstructionalStrategyCode = $InstructionalStrategyCode
        }

        If (![string]::IsNullOrWhiteSpace($FundingSourceCode)) {
            <# String Value #>
            $Body.FundingSourceCode = $FundingSourceCode
        }

        If (![string]::IsNullOrWhiteSpace($CareerTechnicalEducationProviderCode)) {
            <# String Value #>
            $Body.CareerTechnicalEducationProviderCode = $CareerTechnicalEducationProviderCode
        }

        If (![string]::IsNullOrWhiteSpace($IndependentStudyIndicator)) {
            <# String Value #>
            $Body.IndependentStudyIndicator = $IndependentStudyIndicator
        }

        If (![string]::IsNullOrWhiteSpace($DistanceLearningIndicator)) {
            <# String Value #>
            $Body.DistanceLearningIndicator = $DistanceLearningIndicator
        }

        If (![string]::IsNullOrWhiteSpace($ItinerantTeacherIndicator)) {
            <# String Value #>
            $Body.ItinerantTeacherIndicator = $ItinerantTeacherIndicator
        }

        If ($UseSupplementalAttendance) {
            <# Switch Value #>
            $Body.UseSupplementalAttendance = $UseSupplementalAttendance
        }

        If (![string]::IsNullOrWhiteSpace($PopulationServedCode)) {
            <# String Value #>
            $Body.PopulationServedCode = $PopulationServedCode
        }

        If (![string]::IsNullOrWhiteSpace($ClassTypeCode)) {
            <# String Value #>
            $Body.ClassTypeCode = $ClassTypeCode
        }

        If ($MonthlyMinutes -gt 0) {
            <# Int16 Value #>
            $Body.MonthlyMinutes = $MonthlyMinutes
        }

        If (![string]::IsNullOrWhiteSpace($UserCode1)) {
            <# String Value #>
            $Body.UserCode1 = $UserCode1
        }

        If (![string]::IsNullOrWhiteSpace($UserCode2)) {
            <# String Value #>
            $Body.UserCode2 = $UserCode2
        }

        If (![string]::IsNullOrWhiteSpace($UserCode3)) {
            <# String Value #>
            $Body.UserCode3 = $UserCode3
        }

        If (![string]::IsNullOrWhiteSpace($UserCode4)) {
            <# String Value #>
            $Body.UserCode4 = $UserCode4
        }

        If (![string]::IsNullOrWhiteSpace($UserCode5)) {
            <# String Value #>
            $Body.UserCode5 = $UserCode5
        }

        If (![string]::IsNullOrWhiteSpace($UserCode6)) {
            <# String Value #>
            $Body.UserCode6 = $UserCode6
        }

        If (![string]::IsNullOrWhiteSpace($UserCode7)) {
            <# String Value #>
            $Body.UserCode7 = $UserCode7
        }

        If (![string]::IsNullOrWhiteSpace($UserCode8)) {
            <# String Value #>
            $Body.UserCode8 = $UserCode8
        }

        If (![string]::IsNullOrWhiteSpace($ArticulatedCourseIndicator)) {
            <# String Value #>
            $Body.ArticulatedCourseIndicator = $ArticulatedCourseIndicator
        }

        If (![string]::IsNullOrWhiteSpace($NonCampusBasedInstructionCode)) {
            <# String Value #>
            $Body.NonCampusBasedInstructionCode = $NonCampusBasedInstructionCode
        }

        If (![string]::IsNullOrWhiteSpace($PreKSchoolTypeCode)) {
            <# String Value #>
            $Body.PreKSchoolTypeCode = $PreKSchoolTypeCode
        }

        If (![string]::IsNullOrWhiteSpace($PreKCurriculaCode)) {
            <# String Value #>
            $Body.PreKCurriculaCode = $PreKCurriculaCode
        }

        If ($IsHighQualityPreKProgram) {
            <# Switch Value #>
            $Body.IsHighQualityPreKProgram = $IsHighQualityPreKProgram
        }

        If (![string]::IsNullOrWhiteSpace($InstructionTypeCode)) {
            <# String Value #>
            $Body.InstructionTypeCode = $InstructionTypeCode
        }

        If (![string]::IsNullOrWhiteSpace($ProgramEvaluationTypeCode)) {
            <# String Value #>
            $Body.ProgramEvaluationTypeCode = $ProgramEvaluationTypeCode
        }

        If (![string]::IsNullOrWhiteSpace($EducationalEnvironmentCode)) {
            <# String Value #>
            $Body.EducationalEnvironmentCode = $EducationalEnvironmentCode
        }

        If ($CareerTechnicalEducationHours -gt 0) {
            <# Int16 Value #>
            $Body.CareerTechnicalEducationHours = $CareerTechnicalEducationHours
        }

        If (![string]::IsNullOrWhiteSpace($ContentSubcategoryCode)) {
            <# String Value #>
            $Body.ContentSubcategoryCode = $ContentSubcategoryCode
        }

        If (![string]::IsNullOrWhiteSpace($CharterNonCoreIndicator)) {
            <# String Value #>
            $Body.CharterNonCoreIndicator = $CharterNonCoreIndicator
        }

        If (![string]::IsNullOrWhiteSpace($AdvancedCourseStateCode)) {
            <# String Value #>
            $Body.AdvancedCourseStateCode = $AdvancedCourseStateCode
        }

        If (![string]::IsNullOrWhiteSpace($OnlineInstructionTypeCode)) {
            <# String Value #>
            $Body.OnlineInstructionTypeCode = $OnlineInstructionTypeCode
        }

        If (![string]::IsNullOrWhiteSpace($MiddleSchoolCoreIndicator)) {
            <# String Value #>
            $Body.MiddleSchoolCoreIndicator = $MiddleSchoolCoreIndicator
        }

        If (![string]::IsNullOrWhiteSpace($NonCredentialedAuthorizationCode)) {
            <# String Value #>
            $Body.NonCredentialedAuthorizationCode = $NonCredentialedAuthorizationCode
        }

        If (![string]::IsNullOrWhiteSpace($HighQualityCareerTechnicalEducationIndicator)) {
            <# String Value #>
            $Body.HighQualityCareerTechnicalEducationIndicator = $HighQualityCareerTechnicalEducationIndicator
        }

        If (![string]::IsNullOrWhiteSpace($ArenaSchedulingIndicator)) {
            <# String Value #>
            $Body.ArenaSchedulingIndicator = $ArenaSchedulingIndicator
        }

        If ($ExcludeFromScheduler) {
            <# Switch Value #>
            $Body.ExcludeFromScheduler = $ExcludeFromScheduler
        }

        <# Turn the $Body variable into a JSON string for sending to the server #>
        $BodyJSON = ($Body | ConvertTo-Json -Compress)

        $Result = (Invoke-AeriesApiCall -Method $Method -Endpoint $Endpoint -SuccessStatusCode $SuccessStatusCode -Body $BodyJSON -ContentType $ContentType)
    }

    End {
        Write-Verbose -Message "Finish running $($MyInvocation.MyCommand)"
        return $Result
    }
}