@startuml

Title Diagramme de classe user et services de la v6

class Legende{
 - = suppression
 + = ajout
 * = garder existant
 ~ = à modifier
}

class User{
    status : SmallIntegerField / choices
    last_name : CharField
    first_name : CharField
    last_visit : DateTimeField
    last_manif : PositiveIntegerField
    last_change_password : DateTimeField
    tableau_role : CharField
    recap : BooleanField
    openrunner_option : JSONField
    organisation : ForeignKey
    ==Méthodes==
    * save()
    ~ get_instance() (raccourci vers l'instance dite principale de son service)
    * get_departement() (raccourci sur le service)
    - get_organisation()
    - get_role()
    * has_role() (organisateur, instructeur, agent, agent_federal)
    - is_agent_avis()(supprimé)
    - is_agent_preavis()(supprimé)
    * has_group()
    * is_new()
    - get_friendly_role_names()
    * get_full_name()
    * get_full_name_and_username()
    * get_link_to_admin()
    - set_instance()(supprimé)
    ~ remplir_tableau_role() (on va le garder pour accelerer les traitements en cache)

}

note right of User
    Voir si "status" est encore utile ?
    L'utilisateur n'a plus d'instance, ni de géographie.
    On prendra désormais le service pour base des droits d'acces et géographie de l'utilisateur
end note

class Organisation{
    Classe générique du service d'un utilisateurs
    --
    precision_nom : CharField
    adresse : CharField
    telephone : CharField
    email : CharField
    site_web : CharField
    instance : ForeignKey
    notification_mail : JSONField
    ==Géographie==
    national : BooleanField
    region : M2M
    departement : M2M
    arrondissement : M2M
    commune : M2M
   ==Méthodes==
   + set_instance() : sera calculé en fonction de la géographie default sera master (appelé dans le save)
   + get_users() : avoir la liste des utilisateurs
   + get_type_orga() : avoir le type de l'organisation
   + get_manifs_ecriture() : recuperer la liste des manifs que le service peut écrire ou instruire
   + get_manifs_lecture() : recuperer la liste des manifs que le service peut consulter
   + get_niveau_geographique() : avoir le niveau du service (nationale, regionale ect)
}
note bottom of Organisation
    La géographie permettra de calculer la porté du service.
    On prendra toujours l'objet le plus haut en ocultant les plus bas.
    En gros si national est coché on ne prendra pas en compte le reste.
    Une limitation étant qu'on ne peut pas avoir un service limité par commune d'un coté et par departement en même temps.
    Attention une des géographie doit être selectionné obligatoirement.
    Le service par default pourra être la commune pour les organisateurs
    On supprime l'accès par arrondissement en lecture seul dans les instance.acces_arrondissement pour tout simplifier car cette subitlité n'a plus d'intérêt
    Cette classe ne peut pas être abstraite car des liaisons sont requises (user) >> polymorphisme
end note
User "m " == "m" Organisation

class ServiceConsulte{
    Service qui sont consulté dans le cadre de l'instruction de la manifestation
    --
    service_parent : selfFK
    type_service : ForeignKey
    admin_services_famille : BooleanField
    admin_utilisateurs_subalternes : BooleanField
    porte_entree_avis : BooleanField
    autorise_rendre_avis : BooleanField (autorisé à rendre l'avis au service instructeur)
    autorise_rendre_preavis : BooleanField (autorisé à rendre le préavis au service interne initiateur)
    autorise_acces_consult_organisateur : BooleanField
    autorise_delegue_avis_famille : BooleanField
    autorise_interroge_preavis_famille : BooleanField
    ==Méthodes==
    + verifier_intergrite_circuit()
}
ServiceConsulte "1" == "m" ServiceConsulte
Organisation -> ServiceConsulte

note bottom of ServiceConsulte
Une interrogation crée un objet avis different (remplaçant du préavis).
Cet avis dit preavis ne peut être delegué.
La fonctionnalité de "notifier" disparait au profit de "octroyer un accès en lecture" ou bien l'adressage du préavis

end note

class ServiceConsulteInteraction{
    Les interactions disponibles entre deux services consulté dans le cadre de la demande d'avis et de préavis
    --
    service_entrant : ForeignKey
    service_sortant : ForeignKey
    type_lien : CharField
}
ServiceConsulte "m" == "1" ServiceConsulteInteraction

note bottom of ServiceConsulteInteraction
=Liste des interactions disponibles entre services consultés d'une même famille
- être interroger (préavis) par (= recevoir une demande de préavis de la part de)
- être mandater (avis) par (= gérer la demande d'avis instructeur à la place de)
- adresser l'avis/preavis à (= chaine de validation)
NB : la modification de l'organisation de la famille ne pourra être fait que si aucun avis en cours
end note

class Federation{
    Service consulté étant une fédération
    --
    discipline : ForeignKey
}
ServiceConsulte -> Federation

class ServiceInstructeur{
    Service consulté qui instruit une manifestation
    --
}

ServiceConsulte -> ServiceInstructeur

class CategorieService{
    Categorie du type de service
    --
    nom : CharField
}

class TypeService{
    Type de service
    --
    nom : CharField
    abreviation : CharField
    categorie: fk
    precision_nom_obligatoire: BooleanField
}

note right of TypeService
La liste des types de service proposé lors de l'édition d'un service sera limité aux types de la même catégorie que le service lui-même
end note

TypeService "1" -- "m" CategorieService
ServiceConsulte "1" -- "m" TypeService

class StructureOrganisatrice{
    Organisation qui va crée des manifestations
    --
    type_organisation : CharField
}
Organisation -> StructureOrganisatrice

class Commune{
    ==Aucun Changement==
}
class Arrondissement{
    ==Aucun Changement==
}
class Departement{
    region : ForeignKey
}
class Region{
    nom : CharField
}
note top of Region
    Les regions seront créé en base ce qui n'est pas le cas à l'heure actuelle
end note

class Avis{
    service_consulte = ForeignKey
    service_consulte_history = M2M
    avis_parent = SelfFK
    avis_origine = SelfFK
    ==Méthodes==
    + mandaterAvis()
    ~ rendreAvis()
    + adresserAvis()
    - formaterAvis()
    - get_service()
    ~ get_tous_preavis()
}
Avis "1" -- "m" ServiceConsulte
note top of Avis
    Changement de la generic foreign key en ForeignKey sur ServiceConsulte.
    "avis_parent" sera renseigné dans le cas où c'est un "preavis".
    "avis_origine" est l'avis d'origine d'une re-demande.
end note

Arrondissement "m" -- "m" Organisation
Commune "m" -- "m" Organisation
Departement "m" -- "m" Organisation
Region "m" -- "m" Organisation
Arrondissement "m" -- "1" Commune
Departement "m" -- "1" Arrondissement
Region "m" -- "1" Departement

@enduml
