packages feed

casa-reoc-0.1.0.0: examples/src/ReOC/Example/WattleCreek.hs

{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wall #-}

{- | A RePL training organisation near Geelong, which also conducts survey
operations. Its CEO is also its maintenance controller; its chief remote
pilot and chief RePL instructor are two other people. It applies for three
courses: an initial multirotor course, an upgrade to multirotor RPA over
7 kg, and an upgrade to aeroplanes, for which its chief RePL instructor does
not yet hold a RePL.

The application starts as 'mkUnfilledReOC', and each field is set with its
optic; 'fillReOC' then checks it. The company, its people, numbers and
addresses are made up.
-}
module ReOC.Example.WattleCreek (
  wattleCreekInput,
  wattleCreek,
) where

import Control.Lens ((&), (.~), (?~))
import Data.List.NonEmpty (NonEmpty)
import qualified Data.Time.Calendar.Month as Month
import ReOC.Example.Aircraft (agEagleEBeeX, aircraft, djiMatrice30T, djiMatrice350RTK, djiMavic3Classic, equipment, operatedType)
import ReOC.Example.Policies (examplePolicies)
import ReOC.Example.Risk
import ReOC.Fill (fillReOC)
import ReOC.Model

-- | The application of Wattle Creek Drone Academy Pty Ltd, as it is filled in.
wattleCreekInput :: UnfilledReOC
wattleCreekInput =
  mkUnfilledReOC
    -- the company
    & operator . company . companyName ?~ "Wattle Creek Drone Academy"
    & operator . company . abn ?~ "53 555 590 371"
    & operator . company . arn ?~ "9990301"
    & operator . company . registeredOffice . streetAddress .~ ["18 Saltmarsh Drive"]
    & operator . company . registeredOffice . suburb ?~ "Moolap"
    & operator . company . registeredOffice . stateOrTerritory ?~ Victoria
    & operator . company . registeredOffice . postcode ?~ "3224"
    & operator . company . operationalHeadquarters ?~ AtRegisteredOffice
    & operator . company . phoneNumber ?~ "03 5550 7720"
    & operator . company . emailAddress ?~ "enquiries@wattlecreekdrones.example"
    & operator . company . businessName ?~ "Wattle Creek Drones"
    -- the CEO, also the maintenance controller
    & operator . keyPersonnel . chiefExecutive . nominee . person . fullName ?~ "Gemma Castellano"
    & operator . keyPersonnel . chiefExecutive . nominee . person . arn ?~ "9990302"
    & operator . keyPersonnel . chiefExecutive . nominee . person . phoneNumber ?~ "0491 572 549"
    & operator . keyPersonnel . chiefExecutive . nominee . person . emailAddress ?~ "gemma@wattlecreekdrones.example"
    & operator . keyPersonnel . chiefExecutive . nominee . otherQualifications
      .~ ["a RePL, multirotor, up to 25 kg", "a Diploma of Leadership and Management"]
    & operator . keyPersonnel . chiefExecutive . nominee . aviationExperience
      ?~ "seven years of RPA operations in survey and agriculture, and three years maintaining the RPA of a survey company"
    & operator . keyPersonnel . chiefExecutive . directorStatus ?~ Director
    & operator . keyPersonnel . chiefExecutive . managementExperience
      ?~ "Director of Wattle Creek Drone Academy Pty Ltd. Seven years in RPA survey operations, three as operations manager of a survey company with 12 staff. Also nominated as Maintenance Controller."
    & operator . keyPersonnel . mcNominee ?~ MCIsCEO
    -- the chief remote pilot
    & operator . keyPersonnel . chiefPilot . crpNominee
      ?~ CRPNominated
        ( mkUnfilledNominee
            & person . fullName ?~ "Hamish McAllister"
            & person . arn ?~ "9990303"
            & person . phoneNumber ?~ "0491 572 665"
            & person . emailAddress ?~ "hamish@wattlecreekdrones.example"
            & otherQualifications .~ ["a CASA aeronautical radio operator certificate"]
            & aviationExperience ?~ "over 900 hours of RPA operations in survey and mapping, multirotor and aeroplane"
        )
    & operator . keyPersonnel . chiefPilot . rePLOrigin ?~ RePLTraining (Just "Bellarine Aviation Academy")
    & operator . keyPersonnel . chiefPilot . rpaHistory
      ?~ "Holds RePL, multirotor up to 25 kg and aeroplane up to 7 kg. Over 900 hours on DJI Matrice 350 RTK, Matrice 30T, Phantom 4 RTK and AgEagle eBee X, in survey, mapping and inspection in Victoria."
    & operator . keyPersonnel . chiefPilot . otherReOCRoles ?~ NoOtherReOCRoles
    & operator . keyPersonnel . chiefPilot . radio ?~ RadioOperatorCertificate
    -- the RPA for survey operations; the training RPA are given with the courses
    & operator . fleet
      .~ [operatedType djiMatrice30T [aircraft "1ZNBJ7B00E0148" [equipment "DJI RC Plus remote controller" "6TBCK7F0G20077"]]]
    -- the rest of the form, with the question bank as another document
    & applicationForm . primaryContact ?~ ApplicantIsPrimaryContact
    & applicationForm . personnelHistory . actionTaken ?~ NoHistory
    & applicationForm . personnelHistory . transportLicenceRefused ?~ NoHistory
    & applicationForm . personnelHistory . criminalConviction ?~ NoHistory
    & applicationForm . personnelHistory . suspensionPending ?~ NoHistory
    & applicationForm . regulatoryHistory ?~ NoRegulatoryAction
    & applicationForm . proceduresLibrary ?~ True
    & applicationForm . otherDocuments .~ ["RePL theory exam question bank and answer key"]
    & applicationForm . declaration ?~ DeclaredByCEO
    -- the operations manual
    & operationsManual . firstIssue . version . majorVersion ?~ 1
    & operationsManual . firstIssue . version . minorVersion ?~ 0
    & operationsManual . firstIssue . issueDate ?~ m
    & operationsManual . firstIssue . effective ?~ "On issue of the ReOC"
    & operationsManual . firstIssue . parts ?~ "All"
    & operationsManual . firstIssue . details ?~ "Initial issue for the ReOC application, with RePL training."
    & operationsManual . services
      .~ [ "RePL training"
         , "topographic and volumetric survey"
         , "visual and thermal inspection of buildings and infrastructure"
         ]
    & operationsManual . policies .~ examplePolicies
    & operationsManual . riskRegister
      .~ [peopleRisk m]
        <> airspaceRisks m
        <> [ commandLinkRisk m
           , batteryRisk m
           , weatherRisk m
           , riskEntry
              m
              "Student error in flight training"
              "Loss of control; collision with the instructor, other students or property"
              "Instructor beside the student at all times; RePL training manual procedures"
              (Occasional, Moderate)
              "Instructor takes control before the RPA leaves the training area; students not flying stand behind the control point; training area clear of the public"
              (Remote, Minor)
              ChiefRemotePilot
           , riskEntry
              m
              "Several RPA in the training area at once"
              "Collision between training RPA"
              "Training area divided into sectors; one RPA in each sector"
              (Remote, Minor)
              "Instructor briefs each sector's boundary and height band; at most two students flying for each instructor"
              (Improbable, Minor)
              ChiefRemotePilot
           , riskEntry
              m
              "Hand launch and belly landing of the eBee X"
              "Injury to the launcher from the propeller; damage on landing"
              "Manufacturer launch procedure; landing area selection (App C)"
              (Remote, Minor)
              "Students launch only after a briefing and a dry run; landing area walked before each session"
              (Improbable, Minor)
              ChiefRemotePilot
           , fitnessRisk ChiefExecutiveOfficer m
           , recencyRisk m
           , firmwareRisk m
           ]
    & operationsManual . crew ?~ SoloAndMultiCrewOperations
    & operationsManual . pilots ?~ OtherRemotePilots
    -- RePL training
    & maybeTrainingMaterial ?~ training
 where
  m = Month.YearMonth 2026 8

-- RePL training: a chief RePL instructor who is not otherwise key personnel, and three courses.
training :: UnfilledTrainingMaterial
training =
  mkUnfilledTrainingMaterial
    & criNominee
      ?~ CRINominated
        ( mkUnfilledNominee
            & person . fullName ?~ "Aroha Tipene"
            & person . arn ?~ "9990304"
            & person . phoneNumber ?~ "0491 572 983"
            & person . emailAddress ?~ "aroha@wattlecreekdrones.example"
            & otherQualifications .~ ["a Certificate IV in Training and Assessment", "a RePL, multirotor, up to 25 kg"]
            & aviationExperience ?~ "four years as a RePL instructor and over 600 hours of RPA operations in survey and inspection"
        )
    & rePLHolding
      ?~ RePLHoldingIntent
        (Just "I hold a RePL for multirotor up to 25 kg. I will hold a RePL for aeroplanes up to 7 kg before the first aeroplane upgrade course.")
    & teachingQualification ?~ TeachingQualificationHeld (Just "Certificate IV in Training and Assessment (TAE40122), 2023.")
    & operationalExperience
      ?~ OperationalExperienceIntent
        (Just "I have 20 hours of operational experience on multirotor. I will complete 20 hours of survey operations on the eBee X before the first aeroplane course.")
    & criOtherReOCRoles ?~ NoOtherReOCRoles
    & trainingCourses
      .~ [ mkUnfilledTrainingCourse
            & courseKind ?~ InitialCourse
            & trainingRPA
              .~ operatedType
                djiMavic3Classic
                [ aircraft "1581F4QWD23D0211" [equipment "DJI RC-N1 remote controller" "3NZCK5H0A10322"]
                , aircraft "1581F4QWD23D0230" [equipment "DJI RC-N1 remote controller" "3NZCK5H0A10359"]
                , aircraft "1581F4QWD23D0264" [equipment "DJI RC-N1 remote controller" "3NZCK5H0A10380"]
                ]
            & complexities .~ [AutomatedAndManual]
         , mkUnfilledTrainingCourse
            & courseKind ?~ UpgradeSameCategory
            & trainingRPA .~ operatedType djiMatrice350RTK [aircraft "1ZNDH3P00D1302" [equipment "DJI RC Plus remote controller" "6TBCK7F0G20101"]]
            & complexities .~ [AutomatedAndManual]
         , mkUnfilledTrainingCourse
            & courseKind ?~ UpgradeDifferentCategory
            & trainingRPA .~ operatedType agEagleEBeeX [aircraft "EBX-2-1045" [equipment "eBee ground modem" "GM2-30871"]]
            & complexities .~ [AutomatedOnly]
         ]
    & trainingArrangements . theoryVenues .~ ["the training room at 18 Saltmarsh Drive, Moolap VIC 3224"]
    & trainingArrangements . practicalAreas
      .~ ["a private training field on Wattle Creek Road, Leopold VIC 3224, used with the written permission of the landowner, clear of no-fly zones and populous areas"]
    & trainingArrangements . maxStudentsPerCourse ?~ 6
    & trainingArrangements . maxStudentsPerInstructor ?~ 2
    & trainingArrangements . takeover ?~ SharedController
    & trainingArrangements . theory ?~ BlendedTheory
    & trainingArrangements . exam ?~ ComputerExamination
    & trainingArrangements . examPassMark ?~ 80
    & trainingArrangements . examiner ?~ IndependentExaminerWhereAvailable
    & trainingArrangements . simulator ?~ "DJI Flight Simulator"

-- | The application of Wattle Creek Drone Academy Pty Ltd: valid, or every reason it is not.
wattleCreek :: Either (NonEmpty ReOCError) ReOC
wattleCreek =
  fillReOC wattleCreekInput