Faça um diagrama de caso de uso e de classes para cada um dos casos abaixo:
Para produção de um filme devemos ter o registro de todas as cenas filmadas, quais os atores que participaram na cena, todos os funcionários que participaram (câmeras, iluminadores, contra-regras, dublês) e o local das filmagens. Cada cena pode ter sido filmada muitas vezes e futuramente será escolhida uma. O filme é composto das cenas escolhidas numa sequência determinada. Cada cena tem uma duração em minutos. Depois do filme montado, o percentual de participação de cada funcionário, incluindo os atores será calculado. O sistema também deve produzir um relatório de cenas, atores e funcionários em cada locação.

Passo 1

O que o enunciado pede (objetivos claros):
  • Criar um diagrama de caso de uso para o sistema que suporta a produção de um filme.
  • Criar um diagrama de classes para esse mesmo sistema.
Informações dadas pelo enunciado (pontos relevantes que vamos usar):
  • Deve haver registro de todas as cenas filmadas.
  • Para cada cena é preciso registrar:
    • quais atores participaram,
    • todos os funcionários que participaram (ex.: câmeras, iluminadores, contra-regras, dublês),
    • o local das filmagens.
  • Cada cena pode ter sido filmada muitas vezes (várias tomadas) e, futuramente, será escolhida uma tomada (take) para ser usada.
  • O filme é composto das cenas escolhidas em uma sequência determinada.
  • Cada cena tem uma duração em minutos.
  • Depois do filme montado, calcular o percentual de participação de cada funcionário, incluindo os atores.
  • O sistema deve produzir um relatório de cenas, atores e funcionários por locação.
O que será entregue ao final:
  • Um diagrama de caso de uso (lista de atores, casos e relacionamentos).
  • Um diagrama de classes (classes, atributos, métodos principais, associações e multiplicidades).
  • Código PlantUML para cada diagrama (para você gerar a imagem rápido, se desejar).

Passo 2

Identificação dos atores (quem interage com o sistema)
  • Produtor/Diretor: decide seleção final das tomadas e ordem do filme, solicita relatórios.
  • Editor/Montador: monta o filme (seleciona tomadas, monta sequência).
  • Assistente de Produção / Registrador: insere dados sobre cenas, tomadas, participantes e locações (entrada de dados).
  • Gerente de Locação: consulta relatórios por locação e atualiza dados de locações.
  • Administrador do Sistema: gerencia cadastros (atores, funcionários, locações).
    Observação: “Atores” no enunciado são objetos do sistema (pessoas que participam), não atores UML. Aqui tratamos “Atores” como pessoas registradas.

Passo 3

Lista de casos de uso (o que o sistema precisa suportar)
  • Registrar Cena
  • Registrar Tomada (Take) para uma Cena
  • Registrar Pessoa (Ator ou Funcionário)
  • Registrar Participação (associar Pessoa a uma Tomada com função)
  • Registrar Locação
  • Selecionar Tomada para Cena (decisão de qual tomada será usada no filme)
  • Montar Filme (criar sequenciamento de cenas escolhidas)
  • Calcular Percentual de Participação por Pessoa (após montagem)
  • Gerar Relatório por Locação (cenas, atores e funcionários em cada locação)
  • Consultar Cenas / Tomadas / Pessoas / Locações
  • Gerenciar Cadastros (CRUD de pessoas, funções, locações) — para o Administrador
Relações importantes entre casos de uso:
  • Registrar Cena inclui Registrar Locação (ao criar cena, informa-se onde foi filmada).
  • Registrar Cena inclui Registrar Tomada (pelo menos opcionalmente; podem vir várias tomadas).
  • Registrar Tomada inclui Registrar Participação (cada tomada precisa listar participantes).
  • Selecionar Tomada faz parte do fluxo de Montar Filme (o editor escolhe tomadas e monta sequência).
  • Calcular Percentual depende do Filme montado (usa cenas selecionadas e suas durações).

Passo 4

Descrição didática do Diagrama de Caso de Uso — como montar e interpretar
  • Cada ator (Produtor, Editor, Assistente, Gerente, Administrador) é ligado por uma linha aos casos de uso que ele executa.
  • “Inclusão” (<<include>>) é usada quando um caso sempre chama outro (ex.: Registrar Cena <<include>> Registrar Locação).
  • “Extensão” (<<extend>>) é usada para comportamento opcional/alternativo (ex.: Registrar Tomada <<extend>> Registrar Take de Emergência).
  • Use casos centrais ao sistema: entrada de dados (registro), montagem (seleção e ordenação), relatórios e cálculo de participação.
  • O diagrama deve ser legível: agrupe casos por responsabilidade (cadastros, montagem, relatórios).

Passo 5

Modelagem conceitual para o Diagrama de Classes — escolha de classes e justificativa
Classes principais identificadas:
  • Filme (Movie)
    • Atributos essenciais: id, titulo, dataVersao, totalDuracao (minutos)
    • Relação: compõe-se de SequenciaDeCenas (ordered association para CenaSelecionada)
  • Cena (Scene)
    • Atributos: id, nome, descricao
    • Relação: tem muitas Tomadas (Take). Pode ter uma duração “esperada” mas a duração real vem da tomada selecionada.
  • Tomada (Take)
    • Atributos: id, numeroTake, duracaoMinutos, dataHora, observacoes
    • Relação: pertence a uma Cena; tem participações (Participation).
  • Pessoa (Person) — classe geral
    • Atributos: id, nome, tipoPessoa (enum: ATOR, FUNCIONARIO), contato
    • Subclasses possíveis: Ator (Actor) e Funcionario (Employee) — se precisar de campos específicos.
  • Funcao (Role) ou Cargo (JobRole)
    • Atributos: id, nome (ex.: câmera, iluminador, contra-regra, dublê)
  • Participacao (Participation) — associação/association-class entre Tomada e Pessoa
    • Atributos: papel (ex.: personagem ou função), minutosParticipadosNaTomada (opcional), observacao
    • Justificativa: uma mesma pessoa pode participar de muitas tomadas e com papéis diferentes; precisamos registrar o papel em cada tomada.
  • Locacao (Location)
    • Atributos: id, nome, endereco, descricao
    • Relação: Cena tem uma Locacao (onde foi filmada).
  • CenaSelecionada (SceneInMovie) — associação entre Filme e Cena, com sequencia
    • Atributos: ordemNoFilme (integer), duracaoUtilizada (minutos) — geralmente igual à duracao da tomada selecionada.
Decisões de projeto e explicações práticas:
  • Modelar Tomada separadamente de Cena porque “cada cena pode ter sido filmada muitas vezes”.
  • Incluir uma entidade Participacao para poder calcular facilmente os minutos totais que cada pessoa aparece/influencia no filme (somando durações das tomadas selecionadas onde participou).
  • Guardar qual Tomada foi selecionada para cada Cena (atributo selectedTake em Cena ou fazer uma associação Cena -> Tomada com isSelected=true). No diagrama proponho: Cena tem many Tomadas; Cena possui selectedTake (0…1).
  • Para representar a sequência do filme, usar uma classe associação CenaSelecionada com um atributo ordemNoFilme. Assim o Filme mantém a ordem.

Passo 6

Como calcular o percentual de participação (explicação passo a passo — você vai conseguir fazer isso na prova)
  • Ideia: percentual de participação de uma pessoa = (tempo total em que essa pessoa participou do filme / duração total do filme) × 100.
  • Como obter o tempo total em que a pessoa participou:
    1. Para cada Cena incluída no Filme, identificar a Tomada selecionada e usar sua duração.
    2. Se a pessoa participou dessa tomada (há um registro de Participacao), some a duração da tomada.
    3. Some todas essas durações para obter T_{\text{pessoa}}.
  • Duração total do filme: somatório das durações das tomadas selecionadas para todas as cenas incluídas no filme, denotar T_{\text{filme}}.
  • Fórmula final:
\text{Percentual} = 100 \times \dfrac{T_{\text{pessoa}}}{T_{\text{filme}}}
  • Observação prática: se existir participação parcial (por exemplo, a pessoa aparece apenas em parte da tomada), então na Participacao pode haver um campo \text{minutosParticipados} específico que se soma em vez de usar a duração inteira da tomada.

Passo 7

Apresentação final dos diagramas em PlantUML (pronto para gerar imagens)
  • Abaixo eu disponibilizo dois blocos PlantUML:
    • um para o Diagrama de Casos de Uso,
    • outro para o Diagrama de Classes.
  • Você pode colar cada bloco em um gerador PlantUML (ex.: https://www.plantuml.com/plantuml) para obter as figuras.

Resposta

Diagrama de Casos de Uso (PlantUML):
@startuml
left to right direction
actor "Assistente de Produção" as Assistente
actor "Editor / Montador" as Editor
actor "Produtor / Diretor" as Produtor
actor "Gerente de Locação" as GerenteLoc
actor "Administrador" as Admin

rectangle "Sistema de Produção de Filme" {
  usecase "Registrar Cena" as UC_RegCena
  usecase "Registrar Tomada (Take)" as UC_RegTake
  usecase "Registrar Pessoa (Ator/Fun.)" as UC_RegPessoa
  usecase "Registrar Participação" as UC_RegParticip
  usecase "Registrar Locação" as UC_RegLoc
  usecase "Selecionar Tomada para Cena" as UC_SelTake
  usecase "Montar Filme (ordenar cenas)" as UC_Montar
  usecase "Calcular % de Participação" as UC_CalcPerc
  usecase "Gerar Relatório por Locação" as UC_RelLoc
  usecase "Gerenciar Cadastros" as UC_GestCad
  usecase "Consultar Cenas/Tomadas/Pessoas" as UC_Consultar
}

Assistente --> UC_RegCena
Assistente --> UC_RegTake
Assistente --> UC_RegPessoa
Assistente --> UC_RegParticip
Assistente --> UC_RegLoc
Editor --> UC_SelTake
Editor --> UC_Montar
Produtor --> UC_Montar
Produtor --> UC_CalcPerc
GerenteLoc --> UC_RelLoc
Admin --> UC_GestCad
Admin --> UC_RegPessoa
Admin --> UC_RegLoc
Assistente --> UC_Consultar
Editor --> UC_Consultar
Produtor --> UC_Consultar
GerenteLoc --> UC_Consultar

UC_RegCena .down.> UC_RegLoc : <<include>>
UC_RegTake .down.> UC_RegParticip : <<include>>
UC_Montar .down.> UC_SelTake : <<include>>
UC_CalcPerc .left.> UC_Montar : <<extend>>

@enduml
Diagrama de Classes (PlantUML):
@startuml
' Classes principais
class Movie {
  +movieId : Long
  +title : String
  +versionDate : Date
  +totalDurationMin : Integer
  +calculateTotalDuration() : Integer
  +addSceneInOrder(sceneInMovie : SceneInMovie)
}

class Scene {
  +sceneId : Long
  +name : String
  +description : String
  +selectedTakeId : Long
  +getSelectedTake() : Take
}

class Take {
  +takeId : Long
  +takeNumber : Integer
  +durationMin : Integer
  +recordDate : Date
  +notes : String
}

class Person {
  +personId : Long
  +name : String
  +personType : String  ' ATOR or FUNCIONARIO
  +contact : String
}

class Role {
  +roleId : Long
  +name : String  ' ex: Camera, Iluminador, ContraRegra, Duble
}

class Participation {
  +participationId : Long
  +roleName : String
  +minutesParticipated : Integer  ' opcional: se só participou parte da tomada
  +notes : String
}

class Location {
  +locationId : Long
  +name : String
  +address : String
  +description : String
}

class SceneInMovie {
  +id : Long
  +orderInMovie : Integer
  +durationUsedMin : Integer
}

' Relações e multiplicidades
Movie "1" o-- "0..*" SceneInMovie : contains
SceneInMovie "*" --> "1" Scene : refers_to
Scene "1" o-- "0..*" Take : has
Scene "1" --> "1" Location : filmed_at
Take "1" --> "0..*" Participation : has
Participation "*" --> "1" Person : person
Participation "*" --> "1" Role : role

' Para selecionar a tomada escolhida para a cena:
Scene "1" --> "0..1" Take : selectedTake

' Observações de composição: cena possui tomadas (dependência forte)
Scene *-- Take

@enduml

Exercícios relacionados