1. Diagramme de classes

Diagram

1.1. les Attributs du livre (book)

chaque mention à livre ne correspond pas a livre dans l’énoncé. le livre reservé est different de celui emprunté. le livre emprunté est une copie du livre reservé.

Book à pour attributs:

 ```
Identifiant unique
    -ISBN : ISBN
Titre du livre
    -title : String
Date de publication
    -publicationDate : Date
Nombre d'exemplaire
    -itemsNumber : integer
 ```

2. Le Diagramme de classes permet-il de reconnaitre

2.1. Tous les livres emprunté par un abonné:

Oui, le diagramme de classes permet de connaître tous les livres empruntés par un abonné. Cela repose sur l’association entre les classes User, Borrowed, et BookExemplary. Chaque utilisateur est associé à des enregistrements de prêts à travers la classe Borrowed. la classe Borrowed fait le lien entre l’utilisateur (User) et les exemplaires physiques des livres (instances de BookExemplary) qu’il a empruntés. Elle enregistre les détails spécifiques de chaque prêt, y compris la date de retour prévue et la date de retour réelle. Pour obtenir la liste de tous les livres empruntés par un abonné spécifique, vous pouvez suivre la relation de l’abonné aux enregistrements de prêts (Borrowed), puis de ces enregistrements aux exemplaires spécifiques des livres (BookExemplary).

2.2. Tous les abonnés qui ont emprunté un livre

Oui, le diagramme de classes fourni offre également la possibilité de déterminer tous les abonnés qui ont emprunté un livre spécifique, en utilisant les associations entre les classes User, Borrowed, et BookExemplary. Pour identifier tous les abonnés qui ont emprunté un exemplaire spécifique d’un livre, vous pouvez commencer par cet exemplaire dans BookExemplary, remonter aux enregistrements de prêts associés Borrowed, et de là aux utilisateurs concernés.

Diagram

2.3. Toutes les adresses d’un abonné

Oui, chaque User est associé à une LibraryCard, qui à son tour peut être associée à plusieurs adresses en utilisant la classe Adress. Cela permet de gérer différentes adresses pour un même abonné, par exemple, des adresses précédentes et actuelle. Pour accéder à toutes les adresses d’un abonné spécifique, il faut suivre le lien de l’utilisateur à sa carte de bibliothèque, puis accéder à toutes les adresses associées à cette carte.

Diagram

3. Machine d’états

3.1. Book State

Diagram

3.2. BookExamplary State

Diagram

3.3. User State

Diagram

3.4. Borrowed State

Diagram

4. Identification des invariants

4.1. Book

context Book
inv validBookDetails:
    self.title.isDefined() and
    self.publicationDate.isDefined() and
    self.author->notEmpty() and
    self.editor->notEmpty() and
    self.kind->notEmpty() and
    self.keyword->notEmpty() and
    (self.publicationDate > '1960-01-01' implies self.ISBN.isDefined())

4.2. BookExemplary

context BookExemplary
inv validBookExemplaryDetails:
    self.barcode.isDefined() and
    self.dateOfPurchase.isDefined()

4.3. Library

context Library
inv validLibraryDetails:
    self.libraryId.isDefined() and
    self.section.isDefined() and
    (self.section = Section::Adulte or self.section = Section::Adolescent or self.section = Section::Enfant)

4.4. User

context User
inv validUserDetails:
    self.id.isDefined() and
    (self.nbBookBorrowed >= 0) and
    ((self.library.oclIsTypeOf(Subscriber) implies self.nbBookBorrowed <= 2) or
    (self.library.oclIsTypeOf(SubscriberComitee) implies self.nbBookBorrowed <= 4))

4.5. LibraryCard

context LibraryCard
inv validLibraryCardDetails:
    self.idNum.numero.size() = 10 and
    self.idNum.validationNum.size() = 2 and
    self.name.size() > 0 and
    self.Prenom.size() > 0 and
    self.adress.adress.size() > 0

4.6. Borrowed

Chaque emprunt doit être associé à un exemplaire de livre et à un abonné.

context Borrowed
inv validBorrowDetails:
    self.borrowId.isDefined() and
    self.dateRetourPrevu.isDefined() and
    self.dateRetourReel.isDefined()

inv validReturnDates:
    self.dateRetourPrevu >= self.bookExemplary.dateOfPurchase and
    (self.dateRetourReel->notEmpty() implies self.dateRetourReel >= self.dateRetourPrevu)

4.7. Author

context Author inv: self.book <> null

4.8. Editor

context Editor inv: self.book <> null

4.9. kind

context Kind inv: self.book <> null

4.10. KeyWord

context KeyWord inv: self.book <> null

5. Cas d’utilisations

5.1. Acteurs

  • Librarian(User)

  • Subscriber(User)

  • SubcriberComite(User)

5.2. Pré et post-conditions pour spécifier les cas d’utilisation "emprunter" et "rendre un livre"

5.2.1. Pré et post-conditions emprunter un livre

Pré conditions:
context Borrowed::borrowBook(user : User, bookExemplary : BookExemplary , startDate : Date) : Boolean
    pre bookIsAvailableAndUserCanBorrowMore:
       bookExemplary.oclInState(Available) and
       ((user.oclIsTypeOf(subscriber) implies user.nbBookBorrowed < 2) or
       (user.oclIsTypeOf(subscriberComite) implies user.nbBookBorrowed < 4))
    pre DateValidationBasedOnUserType:
    if user.oclIsTypeOf(subscriber) then
        self.dateRetourPrevu = startDate.addDays(30)
    elseif user.oclIsTypeOf(subscriberComite) then
        self.dateRetourPrevu = startDate.addDays(60)
    endif
Post condition
context Borrowed::borrowBook(user : User, bookExemplary : BookExemplary, startDate : Date) : Boolean
    post statusUpdatedAndBorrowerLinked:
        bookExemplary.oclInState(Borrowed) and
        bookExemplary.borrower = user and
        user.nbBookBorrowed = user.nbBookBorrowed@pre + 1
    post RecordDatesProperlySet:
    self.startDate = startDate and
    (user.oclIsTypeOf(RegularUser) implies self.dateRetourPrevu = startDate.addDays(30)) and
    (user.oclIsTypeOf(CommitteeMember) implies self.dateRetourPrevu = startDate.addDays(60))

5.2.2. Pré et post-conditions rendre un livre

Pré conditions:
context Borrowed::returnBook(user : User, bookExemplary : BookExemplary) : Boolean
   pre isValidReturn:
    bookExemplary.oclInState(Borrowed) and
    bookExemplary.borrower = user
    Date::today() <= self.dateRetourPrevu
Post condition
context Borrowed::returnBook(user : User, bookExemplary : BookExemplary) : Boolean
    post returnBookStateChanges:
    bookExemplary.oclInState(Available) and
    user.nbBookBorrowed = user.nbBookBorrowed@pre - 1 and
    not bookExemplary.oclIsInState(Borrowed)->exists(b => b.borrower = user) and
    not Borrowed.allInstances()->exists(b |
        b.bookExemplary = bookExemplary and b.user = user and b.oclInState(Borrowed))
    self.dateRetourReel = Date::today()
    self.dateRetourReel <= self.dateRetourPrevu

6. Diagrammes d’objet pour les cas d’utilisation Emprunter et Rendre un livre

6.1. Cas d’utilisation : Emprunter un livre

6.1.1. Avant l’emprunt :

Diagram

6.1.2. Après l’emprunt :

Diagram

6.2. Cas d’utilisation : Rendre un livre

6.2.1. Avant le retour :

Diagram

6.2.2. Après le retour :

Diagram