Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

情報処理安全確保支援士の共通講習・実践講習の受講要否を取得する

情報処理安全確保支援士は、1年に1度の共通講習(オンライン講習)と、3年に1度の実践講習(実践講習または特定講習)を受講する義務があります*1。この講習を受講するには3年間で14万円かかります*2。企業や組織に所属する情報処理安全確保支援士の場合、この費用を会社が負担することもあるようです*3。この場合、受講費用を各年度の予算に組込む必要があるわけですが、それにあたって以下のような不明点が挙がることもあるでしょう。

  • 前回の実践講習受講から3年経ったら再度受講しないといけないが、前回の受講はいつだろう?
  • 登録から3年以内に実践講習を受講しないといけないが、受講の期限はいつだろう?
  • 共通講習の案内が来るのは、4月と10月のどちらだろう?

そこで、情報処理安全確保支援士の登録番号と、対象の期(10月1日か4月1日)を与えると受講対象かそうでないか返すPowerShellスクリプトを作ってみました。

余談ですが、3月決算の会社の場合、10月に登録すると受講可能時期が期をまたぐので、10月~翌年3月に受講するか、4~9月に受講するかで費用が計上される年度が変わってしまうのが不便ですね……

# 認証付きプロキシサーバーを超えたい場合は以下を参照。
# https://qiita.com/earthdiver1/items/640cbb0d15d750968429

function Get-RISSRegistration {
  <#
    .SYNOPSIS
    情報処理安全確保支援士の登録情報を取得する

    .DESCRIPTION
    情報処理安全確保支援士検索サービスを利用して、
    情報処理安全確保支援士の登録番号から登録情報を取得する。

    .PARAMETER RegistrationNo
    情報処理安全確保支援士の登録番号

    .OUTPUTS
    PSObject. 情報処理安全確保支援士検索サービスのJSONをパースしたものを返す。
    
    .EXAMPLE
    PS> Get-RISSRegistration "000006"
    reg_no                         : 000006
    reg_date                       : 2017-04-01
    last_name                      : 
    first_name                     : 
    ...
    update_deadline                : 2023-09-30
    update_cnt                     : 1回
    online_attendance_date         : 2021-01-10
    real_attendance_date           : 2019-09-06
    ...

    .LINK
    情報処理安全確保支援士検索サービス: https://riss.ipa.go.jp
  #>
  Param(
    [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
    [string] $RegistrationNo
  )
  Begin {
    $Response = Invoke-WebRequest https://riss.ipa.go.jp/ajax/findRissRequest -Method Post -Body @{reg_no="${RegistrationNo}"}
    (ConvertFrom-Json $Response.Content).result
  }
}

function Get-AttendF2FCourse {
  <#
    .SYNOPSIS
    情報処理安全確保支援士の実践講習受講要否を判定する

    .DESCRIPTION
    情報処理安全確保支援士検索サービスで取得した前回の実践講習受講日をもとに
    指定した時期の実践講習受講要否を判定する。

    .PARAMETER RISSRegistration
    情報処理安全確保支援士の登録情報

    .PARAMETER Term
    判定対象の時期。"YYYY-10-01"または"YYYY-04-01"。

    .OUTPUTS
    Boolean. 実践講習受講時期の場合Trueを返す。
    
    .EXAMPLE
    PS> Get-AttendF2FCourse (Get-RISSRegistration "000006") "2022-04-01"
    True

    .EXAMPLE
    PS> Get-AttendF2FCourse (Get-RISSRegistration "000006") "2022-10-01"
    False

    .LINK
    情報処理安全確保支援士検索サービス: https://riss.ipa.go.jp
  #>
  Param(
    [PSObject] $RISSRegistration,
    [string] $Term
  )
  Begin {
    $CurrentTerm = [DateTime]$Term

    # 登録より前の日付の場合は対象外
    if ($CurrentTerm -lt (Get-HalfFirstDate $RISSRegistration.reg_date)) {
      return $false
    }
    if ($RISSRegistration.real_attendance_date) {
      # 受講済みの場合はそこから3年後の半年間に受講し、以降3年ごとに受講
      $PreviousAttendanceTerm = Get-HalfFirstDate $RISSRegistration.real_attendance_date
      if ($CurrentTerm.Month -eq $PreviousAttendanceTerm.Month) {
        return ($CurrentTerm.Year - $PreviousAttendanceTerm.Year) % 3 -eq 0
      }
    } else {
      # 未受講の場合は登録から半年後の半年間に受講し、以降3年ごとに受講
      $FirstTerm = (Get-HalfFirstDate $RISSRegistration.reg_date).AddMonths(6)
      if ($CurrentTerm.Month -eq $FirstTerm.Month) {
        return ($CurrentTerm.Year - $FirstTerm.Year) % 3 -eq 0
      }
    }
    return $false;
  }
}


function Get-AttendOnlineCourse {
  <#
    .SYNOPSIS
    情報処理安全確保支援士の共通講習(オンライン講習)受講要否を判定する

    .DESCRIPTION
    情報処理安全確保支援士検索サービスで取得した前回の共通講習(オンライン講習)受講日をもとに
    指定した時期の共通講習受講要否を判定する。

    .PARAMETER RISSRegistration
    情報処理安全確保支援士の登録情報

    .PARAMETER Term
    判定対象の時期。"YYYY-10-01"または"YYYY-04-01"。

    .OUTPUTS
    Boolean. 共通講習受講時期の場合Trueを返す。

    .EXAMPLE
    PS> Get-AttendOnlineCourse (Get-RISSRegistration "000006") "2021-10-01"
    True

    .EXAMPLE
    PS> Get-AttendOnlineCourse (Get-RISSRegistration "022906") "2022-04-01"
    False

    .LINK
    情報処理安全確保支援士検索サービス: https://riss.ipa.go.jp
  #>
  Param(
    [PSObject] $RISSRegistration,
    [string] $Term
  )
  Begin {
    $CurrentTerm = [DateTime]$Term
    # 登録より前の日付の場合は対象外
    if ($CurrentTerm -lt (Get-HalfFirstDate $RISSRegistration.reg_date)) {
      return $false
    }
    if ($RISSRegistration.online_attendance_date) {
      # 受講済みの場合はそこから以降1年ごとに受講
      $PreviousAttendanceTerm = Get-HalfFirstDate $RISSRegistration.online_attendance_date
      return $CurrentTerm.Month -eq $PreviousAttendanceTerm.Month
    } else {
      # 未受講の場合は登録からの半年間に受講し、以降1年ごとに受講
      $FirstTerm = Get-HalfFirstDate $RISSRegistration.reg_date
      return $CurrentTerm.Month -eq $FirstTerm.Month
    }
    return $false;
  }
}

function Get-HalfFirstDate {
  <#
    .SYNOPSIS
    与えられた日付の期の初日を取得する(4月始まり)

    .DESCRIPTION
    日付を与えると、該当する期の初日を返す。

    .PARAMETER Date
    任意の日付

    .OUTPUTS
    DateTime. 該当する期の初日(4月1日、または10月1日)を返す。

    .EXAMPLE
    PS> > Get-HalfFirstDate "2021-08-30"
    2021年4月1日 0:00:00

    .EXAMPLE
    PS> Get-HalfFirstDate "2022-01-31"
    2021年10月1日 0:00:00
  #>
  [OutputType([DateTime])]
  Param(
    [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
    [string] $Date
  )
  Begin {
    $DateTime = [DateTime]$Date
    $Month = $DateTime.Month
    if (4 -le $Month -and $Month -le 9) {
        return [DateTime]::new($DateTime.Year, 4, 1, 0, 0, 0)
    } elseif (10 -le $Month -and $Month -le 12) {
        return [DateTime]::new($DateTime.Year, 10, 1, 0, 0, 0)
    } elseif (1 -le $Month -and $Month -le 3) {
        return [DateTime]::new($DateTime.Year-1, 10, 1, 0, 0, 0)
    }
  }
}