@startuml
 'skinparam monochrome true
 skinparam packageStyle rectangle
 skinparam shadowing false
 skinparam linetype polyline
 'skinparam linetype orto

 skinparam classAttributeIconSize 0

 'left to right direction

 class ApplicationSession
 {
     + static getInstance()
     + getCurrentSession()
 }

 class UserSession
 {
     + getUserEmail()
 }

class Collaborator {
    - name: String
    - birthdate: String
    - admission date: String
    - address: String
    - mobile Contact: int
    - email contact: String
    - taxpayer number: int
    - ID doc type: String
    - ID number: int
    + addSkill(skill)
}

 class CollaboratorRepository {
   - List<Collaborator> collaborators
   + Optional<Collaborator> add(Collaborator collaborator)
   + Collaborator getCollaboratorByID(int IDnumber)
   + List<Collaborator> getCollaboratorList()
   + addCollaborator(Collaborator collaborator)
   + Optional<Collaborator> registerCollaborator( \nname: String, \nbirthdate: String, \nadmissiondate: String, \naddress: String, \nmobile: int, \nemail: String, \ntaxpayer: int, \nIDdoctype: String, \nIDnumber: int)
   + boolean validateCollaborator(Collaborator collaborator)
   + void updateCollaborator(Collaborator collaborator)
 }

 class Organization {
   - String name
   - String vatNumber
   - String address
   - String phone
   - String email
 }

class OrganizationRepository {
  + Optional<Organization> getOrganizationByHRM(HRM hrm)
  + Optional<Organization> getOrganizationByVFM(VFM vfm)
  + Optional<Organization> getOrganizationByHRMEmail(String email)
  + Optional<Organization> add(Organization organization)
  + boolean validateOrganization(Organization organization)
}

 class Repositories {
   + getInstance() : Repositories
   + getCollaboratorRepository() : CollaboratorRepository
   + getJobRepository() : JobRepository
   + getOrganizationRepository() : OrganizationRepository
 }

 class RegisterCollaboratorController {
   + CollaboratorRepository getCollaboratorRepository()
   + OrganizationRepository getOrganizationRepository()
   + AuthenticationRepository getAuthenticationRepository()
   + JobRepository getJobRepository()
   + HRM getHRMFromSession()
   + Optional<Collaborator> registerCollaborator(HRManager hrm, \nname: String, \nbirthdate: String, \nadmissiondate: String, \naddress: String, \nmobile: int, \nemail: String, \ntaxpayer number: int, \nIDdoctype: String, \nIDnumber: int)
   + void assignJobToCollaborator(collaboratorID, jobName)
 }

 class RegisterCollaboratorUI {
    + String requestCollaboratorName()
    + String requestCollaboratorBirthDate()
    + String requestCollaboratorAdmissionDate()
    + String requestCollaboratorAddress()
    + int requestCollaboratorMobile()
    + String requestCollaboratorEmail()
    + int requestCollaboratorTaxpayerNumber()
    + String requestCollaboratorDocType()
    + int requestCollaboratorIDNumber()
    + void assignJobToCollaborator(Collaborator collaborator)
    + Job selectJob()
 }

 class HRManager {
    - String name
    - int vatNumber
    - String email
    - int number
 }

 note right of RegisterCollaboratorController
   - Collaborator data is obtained from the HRM's input
   - Updates the Collaborator Repository
 end note

 note right of HRManager
   - HRM initiates collaborator registration
 end note

 note left of RegisterCollaboratorUI
   - UI for HRM to input and confirm collaborator name
   - Communicates with RegisterCollaboratorController
 end note

  note left of CollaboratorRepository
    - Manages collaborators
  end note

 note left of Organization
   - Handles organizational details
 end note

 Repositories -> Repositories : instance
 ApplicationSession -> ApplicationSession : instance

 RegisterCollaboratorUI .> RegisterCollaboratorController

 RegisterCollaboratorController -down-> Repositories : retrieves instances


 RegisterCollaboratorController ..> OrganizationRepository : organizationRepository
 RegisterCollaboratorController ..> JobRepository : jobRepository

 Repositories --> "1" OrganizationRepository
 Repositories --> "1" CollaboratorRepository
 Repositories --> "1" JobRepository

 OrganizationRepository --> "*" Organization : persists
 ApplicationSession --> "1" UserSession : userSession

 RegisterCollaboratorController ..> "1" Organization : organization
 RegisterCollaboratorController ..> ApplicationSession
 RegisterCollaboratorController ..> UserSession
 Organization "1" --> "*" Collaborator : owns
 Collaborator --> HRManager : createdBy

 Organization --> "*" HRManager : employs

 @enduml