Difference between revisions of "Programação com Objectos/Projecto de Programação com Objectos/Enunciado do Projecto de 2020-2021 (rascunho de trabalho)"

From Wiki**3

< Programação com Objectos‎ | Projecto de Programação com Objectos
(Menu de Consultas)
(Replaced content with "(enunciado publicado)")
 
(222 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{PRJPOAvisosEN20202021}}
+
(enunciado publicado)
{{PRJPOMandatory20202021}}
 
{{TOCright}}
 
'''<font color="red">ÉPOCA NORMAL</font>'''
 
 
 
O objectivo do projecto é desenvolver um gestor para o balcão de uma transportadora de mercadorias. O programa deve permitir gerir vários serviços: venda de caixas e contentores; produtos de fornecedores associados; e pagamento de facturas. O balcão concede prémios de fidelização, tanto aos bons clientes (volume de compras) como aos bons fornecedores (volume de vendas).
 
 
 
O balcão contém à disposição dos clientes, vários serviços como a venda de caixas e contentores e o pagamento de facturas. O sistema deverá permitir, entre outros: (i) registar dados de produtos para venda; (ii) registar dados de clientes; (iii) registar dados de fornecedores de produtos para venda; e (iv) fazer pesquisas dos produtos disponı́veis.
 
 
 
Neste texto, o tipo '''negrito''' indica um literal (i.e., é exactamente como apresentado); o símbolo ␣ indica um espaço; e o tipo ''itálico'' indica uma parte variável (i.e., uma descrição).
 
 
 
=  Produtos, Clientes, Fornecedores e Facturas =
 
 
 
O balcão vende caixas e contentores de vários tipos, consoante o nı́vel de serviço de transporte a realizar. Outros tipos de produtos disponı́veis incluem seguros e protecções especiais, disponibilizados à transportadora por fornecedores. Os clientes fazem compras que podem ser pagas mais tarde e os fornecedores respondem a encomendas por parte da transportadora.
 
 
 
==  Propriedades ==
 
 
 
Os produtos, clientes e fornecedores possuem uma chave única (cadeia de caracteres). As facturas/transacções possuem uma chave inteira.
 
 
 
Cada cliente é identificado pelo nome (cadeia de caracteres) e possui ainda informação acerca da morada (cadeia de caracteres). Associado a cada cliente existe ainda a informação relativa a compras efectuadas e facturas pagas, assim como o seu estatuto (e.g., cliente preferencial).
 
 
 
Cada fornecedor/credor é identificado pelo nome (cadeia de caracteres) e possui ainda informação acerca da morada (cadeia de caracteres). Associado a cada fornecedor/credor existe ainda a informação relativa a fornecimentos efectuados e dos pagamentos recebidos.
 
 
 
Todos os produtos são caracterizados pelo seu fornecedor. Todos os produtos são ainda caracterizados pelo preço (um número inteiro). Os produtos têm associada informação sobre um valor crı́tico (utilizado na gestão de existências).
 
 
 
As facturas e outros serviços a pagamento são caracterizados pelo respectivo número (inteiro) e pela data limite de pagamento.
 
 
 
Os selos são de vários tipos, consoante o nı́vel de serviço associado: normal, aéreo, expresso e em mão.
 
 
 
Os envelopes, tal como os selos, são caracterizados pelo nı́vel de serviço (idêntico ao dos selos) e pelo formato (quatro formatos disponı́veis: B4, C4, C5, DL).
 
 
 
Os livros e discos são caracterizados pelos respectivos tı́tulos. Os livros são caracterizados ainda pelo ISBN (cadeia de caracteres) e os CDs/DVDs pelo código do editor (cadeia de caracteres). Os DVDs são ainda caracterizados pelo limite de idade para o conteúdo associado (número inteiro).
 
 
 
As compras a fornecedores podem ser de produtos individuais ou através de encomendas de vários produtos (idem para múltiplos exemplares de um item). Cada encomenda possui um número de identificação e informação acerca do total a pagar.
 
 
 
O balcão, além de manter informação relativa a todos aos conceitos acima, mantém ainda informação relativa ao estado dos clientes e fornecedores (activo/inactivo) e relativa ao volume de negócios realizado (i.e., contabilização do total de vendas e pagamentos a fornecedores: número em vı́rgula flutuante de dupla precisão – double). Inicialmente, o balcão tem saldo zero.
 
 
 
A aplicação desenvolvida deve ser suficientemente flexı́vel, por forma a permitir acrescentar novos tipos de produtos, novos tipos de cobrança e novas polı́ticas de recompensa de clientes e fornecedores, com um impacto mı́nimo no código já feito.
 
 
 
==  Gestão de Clientes ==
 
 
 
O operador do balcão deve poder realizar as seguintes operações sobre clientes: (i) visualizar um cliente; (ii) registar um novo cliente; (iii) inibir o envio de notificações a um cliente; (iv) activar/desactivar um cliente; (v) consultar o histórico de transacções realizadas por um cliente.
 
 
 
Um cliente não pode ser removido, sendo sempre possı́vel aceder a todo o historial de transacções. Um cliente que iniba as notificações não pode ser considerado preferencial (ver abaixo). Um cliente inactivo não pode realizar transacções (este aspecto é independente da recepção de notificações). A inactivação/reactivação do cliente não afecta o seu estatuto (ver abaixo).
 
 
 
==  Operações sobre Fornecedores ==
 
 
 
O operador do balcão deve poder realizar as seguintes operações sobre fornecedores: (i) visualizar um fornecedor; (ii) registar um novo fornecedor; (iii) inibir/activar um fornecedor; (iv) consultar o histórico de transacções realizados.
 
 
 
Um fornecedor não pode ser removido, sendo sempre possı́vel aceder a todo o historial de transacções. Um fornecedor inactivo não pode realizar transacções.
 
 
 
==  Operações sobre Produtos ==
 
 
 
O operador do balcão deve poder realizar as seguintes operações sobre produtos: (i) visualizar um produto; (ii) registar um novo produto; (iii) alterar o preço de um produto; (iv) reforçar as existências de um produto; (v) inibir a venda de um produto.
 
 
 
Um produto não pode ser vendido se estiver inibido. Quando se registar um novo produto ou se reactivar um previamente inibido, os clientes que não tiverem inibido as notificações devem ser avisados, o mesmo se passando com alterações ao preço do produto. As notificações são compostas pela cadeia de caracteres constituı́da pela identificação do cliente e pela identificação do produto, sendo registadas tanto no balcão dos correios, como nos clientes que as recebem.
 
 
 
Quando as existências de um produto atingem o correspondente valor crı́tico (abaixo do qual há perigo de o produto ficar esgotado), o fornecedor do produto deve ser notificado. Estas notificações não podem ser inibidas no menu de §1.3, mas não devem produzir efeitos se o fornecedor estiver inactivo. As notificações são compostas pela cadeia de caracteres constituı́da pela identificação do fornecedor e pela identificação do produto, sendo registadas tanto no balcão dos correios, como nos fornecedores que as recebem.
 
 
 
==  Operações sobre Transacções ==
 
 
 
O operador deve poder realizar as seguintes operações sobre facturas (pagamentos): (i) visualizar uma factura; (ii) registar uma nova factura; (iii) pagar uma factura; (iv) cancelar uma factura.
 
 
 
São considerados os seguintes perı́odos:
 
* Até 5 dias antes do limite de pagamento ('''data_limite_de_pagamento − data_actual ≥ 5'''): sem penalização (facturas não pagas); desconto de 10%;
 
* Até à data limite ('''0 ≤ data_limite_de_pagamento − data_actual < 5'''): sem penalização (facturas não pagas); sem desconto;
 
* Até 5 dias depois da data limite ('''1 < data_actual − data_limite_de_pagamento ≤ 5'''): multa de 5% por cada dia de atraso; sem desconto.
 
* Após 5 dias depois da data limite ('''data_actual − data_limite_de_pagamento > 5'''): multa de 10% por cada dia de atraso; sem desconto.
 
 
 
==  Contabilização de Pontos (Clientes) ==
 
 
 
Nesta secção, as penalizações e os descontos aplicam-se apenas no pagamento de facturas por clientes.
 
 
 
A contabilização de pontos é realizada quando se paga a factura, correspondendo a 10 vezes o valor pago. Não há contabilização de pontos em pagamentos atrasados.
 
 
 
Além dos clientes normais, existem clientes “Selection” (com mais de 2000 pontos), que podem pagar facturas sem penalização até 1 dia depois da data limite (depois dessa data, são penalizados em 2% diários), e obter descontos até 2 dias antes da data limite (5%, depois do limite normal dos 5 dias). Clientes “Elite” (com mais de 25000 pontos) nunca são penalizados e têm descontos de 10%, mesmo após a data limite (depois de 5 dias, os descontos baixam para 5%, até ao limite de 10 dias, em que deixa de haver descontos).
 
 
 
==  Pesquisas ==
 
 
 
Deve ser possı́vel efectuar pesquisas sob vários critérios e sobre as diferentes entidades geridas pelo balcão: (i) produtos comprados por um determinado cliente; (ii) clientes que compram determinado produto; (iii) facturas pagas por um determinado cliente; (iv) facturas pagas com um atraso determinado; (v) produtos com um preço inferior a um dado valor. Deve ser possı́vel introduzir novos métodos de pesquisa com um impacto mı́nimo na implementação desenvolvida.
 
 
 
== Data ==
 
 
 
A data é representada por um número inteiro e tem inicialmente o valor 0 (zero). A data pode começar com outro valor se se recuperar o estado do balcão a partir de um suporte persistente.
 
 
 
= Requisitos de Desenho =
 
 
Devem ser possíveis extensões ou alterações de funcionalidade com impacto mínimo no código já produzido para a aplicação. O objectivo é aumentar a flexibilidade da aplicação relativamente ao suporte de novas funções. Assim, deve ser possível:
 
* Adicionar novos tipos de produtos ao catálogo;
 
* Adicionar novas políticas de processamento de transacções (pagamentos e pontos);
 
* Adicionar novas formas de consulta.
 
 
 
Embora na especificação actual não seja possível a remoção de produtos ou de clientes, a inclusão destas funcionalidades deve ser prevista, por forma a minimizar o impacto da sua futura inclusão.
 
 
 
= Funcionalidade da aplicação =
 
 
 
A aplicação permite manter informação sobre as entidades do modelo, permitindo, em particular, gerir clientes, obras e empréstimos. Possui ainda a capacidade de preservar o seu estado (não é possível manter várias versões do estado da aplicação em simultâneo).
 
 
 
A base de dados com os conceitos pré-definidos é [[#Leitura de Dados a Partir de Ficheiros Textuais|carregada no início da aplicação]]. Não é possível remover clientes ou obras durante a execução da aplicação.
 
 
 
{{Suggestion|Note-se que não é necessário implementar de raiz a aplicação: já existem classes que representam e definem a interface geral da  funcionalidade do ''core'' da aplicação, tal como é visível pelos comandos da aplicação.}}
 
{{CVSCode|A interface geral do ''core''  já está parcialmente implementada na classe '''woo.StoreManager''' e outras fornecidas (cujos nomes devem ser mantidos), devendo ser adaptadas onde necessário. É ainda necessário criar e implementar as restantes classes que suportam a operação da aplicação.}}
 
 
 
== Serialização ==
 
 
 
É possível guardar e recuperar o estado actual da aplicação, preservando toda a informação relevante, descrita [[#Conceitos e Relações do Modelo|acima]].
 
 
 
= Interacção com o utilizador =
 
 
 
Descreve-se nesta secção a '''funcionalidade máxima''' da interface com o utilizador. Em geral, os comandos pedem toda a informação antes de proceder à sua validação (excepto onde indicado). Todos os menus têm automaticamente a opção '''Sair''' (fecha o menu).
 
 
 
As operações de pedido e apresentação de informação ao utilizador '''devem''' realizar-se através dos objectos ''form'' e ''display'', respectivamente, presentes em cada comando. As mensagens são produzidas pelos métodos das [[Programação com Objectos/Projecto de Programação com Objectos/Material de Apoio ao Desenvolvimento|bibliotecas de suporte]] ('''po-uuilib''' e '''woo-app'''). As mensagens não podem ser usadas no núcleo da aplicação ('''woo-core'''). Além disso, não podem ser definidas novas. Potenciais omissões devem ser esclarecidas antes de qualquer implementação.
 
 
 
As excepções usadas na interacção, excepto se indicado, são subclasses de '''pt.tecnico.po.ui.DialogException''', são lançadas pelos comandos e tratadas por '''pt.tecnico.po.ui.Menu'''. Outras excepções não devem substituir as fornecidas nos casos descritos.
 
 
 
A apresentacção de listas (e.g., Fornecedores/Credores, Transacções, etc.) faz-se por ordem crescente da respectiva chave. a ordem pode ser numérica ou lexicográfica (UTF-8), não havendo distinção entre maiúsculas e minúsculas.
 
 
 
{{CVSCode|Note-se que o programa principal e os comandos e menus, a seguir descritos, já estão parcialmente implementados nas ''packages'' '''woo.app''', '''woo.app.main''', '''woo.app.requests''' e '''woo.app.users'''. Estas classes são de uso obrigatório e estão disponíveis no [[Programação com Objectos/Projecto de Programação com Objectos/Repositório CVS|CVS]] (módulo '''woo-app''').}}
 
 
 
== Menu Principal ==
 
 
 
As acções deste menu permitem gerir a salvaguarda do estado da aplicação e abrir submenus. A lista completa é a seguinte: [[#Salvaguarda do estado actual da aplicação|Abrir]], [[#Salvaguarda do estado actual da aplicação|Guardar]], [[#Mostrar data actual|Mostrar data actual]], [[#Avançar data actual|Avançar data actual]], [[#Gestão e consulta de dados da aplicação|Gestão de Produtos]], [[#Gestão e consulta de dados da aplicação|Gestão de Clientes]], [[#Gestão e consulta de dados da aplicação|Gestão de Fornecedores e Credores]], [[#Gestão e consulta de dados da aplicação|Gestão de Transacções]], [[#Gestão e consulta de dados da aplicação|Consultas]], [[#Menu Principal|Mostrar Saldo do Balcão]].
 
 
 
As etiquetas das opções deste menu estão definidas na classe '''woo.app.main.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''woo.app.main.Message'''.
 
 
 
{{CVSCode|Estes comandos já estão implementados  nas classes da ''package'' '''woo.app.main''' (disponível no CVS), respectivamente: '''DoOpen''', '''DoSave''', '''DoDisplayDate''', '''DoAdvanceDate''', '''DoOpenProductsMenu''', '''DoOpenClientsMenu''', '''DoOpenSuppliersMenu''', '''DoOpenTransactionsMenu''', '''DoOpenSearchMenu''', '''DoShowGlobalBalance'''.}}
 
 
 
=== Salvaguarda do estado actual da aplicação ===
 
 
 
Inicialmente, a aplicação apenas tem informação sobre as entidades que foram carregados no arranque.
 
 
 
O conteúdo da aplicação (toda a informação detida pela mediateca actualmente em memória) pode ser guardado para posterior recuperação (via serialização Java: '''java.io.Serializable'''). Na leitura e escrita do estado da aplicação, devem ser tratadas as excepções associadas. A funcionalidade é a seguinte:
 
 
 
* '''Abrir''' -- Carrega os dados de uma sessão anterior a partir de um ficheiro previamente guardado (ficando este ficheiro associado à aplicação, para futuras operações de salvaguarda). Pede-se o nome do ficheiro a abrir ('''openFile()'''). Caso ocorra um problema na abertura ou processamento do ficheiro, deve ser lançada a excepção '''FileOpenFailedException'''. A execução bem sucedida desta opção substitui toda a informação da aplicação.
 
* '''Guardar''' -- Guarda o estado actual da aplicação no ficheiro associado. Se não existir associação, pede-se o nome do ficheiro a utilizar, ficando a ele associado. Esta interacção realiza-se através do método '''newSaveAs()'''. Não é executada nenhuma acção se não existirem alterações desde a última salvaguarda.
 
 
 
Note-se que a opção '''Abrir''' não permite a leitura de ficheiros de texto (estes apenas são utilizados na inicialização da aplicação).
 
 
 
A opção '''Sair''' nunca guarda o estado da aplicação, mesmo que existam alterações.
 
 
 
=== Mostrar data actual ===
 
 
 
A data actual do sistema é apresentada através da mensagem '''currentDate()'''.
 
 
 
=== Avançar data actual ===
 
 
 
O número de dias a avançar é pedido através de '''requestDaysToAdvance()'''. O valor indicado deve ser positivo. Caso contrário, a operação não tem efeito.
 
 
 
Além da data, o sistema deve actualizar, caso seja necessário, outros aspectos que dela dependam, designadamente, a situação dos clientes e fornecedores relativa a prazos e notificações.
 
 
 
=== Gestão e consulta de dados da aplicação ===
 
 
 
* '''Menu de Gestão de Produtos''' -- Abre o menu de gestão de produtos e operações associadas.
 
* '''Menu de Gestão de Clientes''' -- Abre o menu de gestão de clientes e operações associadas.
 
* '''Menu de Gestão de Fornecedores e Credores''' -- Abre o menu de gestão de fornecedores e credores e operações associadas.
 
* '''Menu de Gestão de Transacções''' -- Abre o menu de gestão de transacções e operações associadas.
 
* '''Menu de Consultas''' -- Abre o menu de consultas (pesquisas)..
 
 
 
=== Mostrar saldo global ===
 
 
 
Esta opção apresenta o valor inteiro correspondente ao saldo do balcão. Embora internamento o valor do saldo esteja representado em vírgula flutuante, a apresentação é arredondada ao inteiro mais próximo.
 
 
 
== Menu de Gestão de Clientes ==
 
 
 
Este menu permite efectuar operações sobre a base de dados de clientes da transportadora. A lista completa é a seguinte: [[#Registar cliente|Registar cliente]], [[#Mostrar cliente|Mostrar cliente]], [[#Mostrar clientes|Mostrar clientes]], [[#Mostrar notificações do cliente|Mostrar notificações do cliente]].
 
 
 
As etiquetas das opções deste menu estão definidas na classe '''woo.app.clientes.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''woo.app.clientes.Message'''.
 
 
 
Sempre que for pedido o identificador de um cliente ('''requestClientId()''') e o cliente não existir, é lançada a excepção '''NoSuchClientException'''.
 
 
 
{{CVSCode|Estes comandos já estão implementados  nas classes da ''package'' '''woo.app.clients''' (disponível no CVS), respectivamente: '''DoRegisterClient''', '''DoShowClient''', ''''DoShowClientNotifications''', '''DoShowClients'''.}}
 
 
 
=== Registar cliente ===
 
 
 
Pede o nome ('''requestClientName()''') e o endereço de correio electrónico ('''requestClientEMail()'''). O registo bem sucedido é assinalado através da mensagem '''clientRegistrationSuccessful()'''; caso contrário, é lançada a excepção '''ClientRegistrationFailedException'''.
 
 
 
Quando o cliente é registado, fica no estado activo e aceita notificações.
 
 
 
Note-se que a atribuição do identificador do cliente é automática e que clientes diferentes são registados em cada operação de registo.
 
 
 
=== Mostrar cliente ===
 
 
 
É pedido o identificador do cliente, sendo apresentadas as informações sobre esse cliente, de acordo com o seguinte formato. Os campos ''activo'' e ''notificações'' têm os valores '''SIM''' ou '''NÃO'''. Os valores das compras são inteiros.
 
{{CollapsedCode|Formato de apresentação de um cliente|
 
''id'' - ''nome'' - ''email'' - ''activo'' - ''notificações'' - ''compras_efectuadas'' - ''compras_pagas''
 
}}
 
{{CollapsedCode|Exemplos de apresentação de clientes|
 
2 - Alberto Meireles - ameireles@mymail.com - SIM - SIM - 10 -10
 
1 - Fernando Meireles - fmeireles@mymail.com - SIM - NÃO - 10 - 0
 
3 - Fernando Meireles - ffm@mymail.com - NÃO - NÃO - 0 - 0
 
}}
 
 
 
=== Mostrar notificações do cliente ===
 
 
 
É pedido o identificador do cliente, sendo apresentadas as notificações para esse cliente, de acordo com o seguinte formato (correspondente aos casos descritos acima):
 
{{CollapsedCode|Formatos de apresentação das notificações de um cliente|
 
ENTREGA: ''descrição de obra entregue''
 
REQUISIÇÃO: ''descrição de obra requisitada''
 
}}
 
{{CollapsedCode|Exemplos de notificações|
 
ENTREGA: 4 - 2 de 4 - DVD - Casamento Real - 8 - Ficção - António Fonseca - 200400500
 
REQUISIÇÃO: 5 - 4 de 22 - Livro - Dicionário - 45 - Referência - Pedro Casanova - 1234567893
 
}}
 
 
 
Note-se que a descrição é idêntica à que é realizada para mostrar cada obra. No entanto, a solução deve ser suficientemente flexível para permitir outros formatos de apresentação das notificações (sem impacto no código do domínio da aplicação).
 
 
 
=== Mostrar clientes ===
 
 
 
Apresenta informações sobre todos os clientes, ordenando-os lexicograficamente pelo nome. Caso existam clientes com o mesmo nome, devem ser ordenados por ordem crescente dos seus identificadores. O formato é o descrito em [[#Mostrar cliente|Mostrar cliente]].
 
<!--Apresenta informações sobre todas os clientes, ordenando-os por ordem crescente dos seus identificadores. O formato é o descrito em [[#Mostrar cliente|Mostrar cliente]].-->
 
 
 
=== Pagar multa ===
 
 
 
Pede o identificador do cliente cuja multa deve ser paga. Se o cliente estiver suspenso, a multa é saldada e o cliente passa a poder requisitar obras, de acordo com as regras gerais. Se o cliente não estiver suspenso, i.e., não tem multas por saldar, deve lançar-se uma excepção '''UserIsActiveException'''.
 
 
 
== Menu de Gestão de Obras ==
 
 
 
Este menu apresenta as operações disponíveis sobre obras. A lista completa é a seguinte: [[#Mostrar obra|Mostrar obra]], [[#Mostrar obras|Mostrar obras]] e [[#Efectuar pesquisa|Efectuar pesquisa]].
 
 
 
As etiquetas das opções deste menu estão definidas na classe '''woo.app.works.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''woo.app.works.Message'''.
 
 
 
Sempre que é pedido o identificador da obra ('''requestWorkId()'''), é lançada a excepção '''NoSuchWorkException''', se a obra indicada não existir.
 
 
 
{{CVSCode|Estes comandos já estão implementados  nas classes da ''package'' '''woo.app.works''' (disponível no CVS), respectivamente: '''DoShowWork''', '''DoShowWorks''', '''DoPerformSearch'''.}}
 
 
 
=== Mostrar obra ===
 
 
 
É pedido o identificador da obra ('''requestWorkId()'''). Se a obra existir, é apresentada de acordo com os seguintes formatos (para livros e DVDs).
 
 
 
O formato genérico de apresentação da obras é como se segue:
 
{{CollapsedCode|Formato de apresentação de obras|
 
''id'' - ''número de exemplares disponíveis'' de ''número de exemplares'' - ''tipo'' - ''título'' - ''preço'' - ''categoria'' - ''informação adicional''
 
}}
 
 
 
Para livros, a informação adicional corresponde ao autor e ao ISBN; para DVDs, a informação adicional corresponde ao realizador e ao número de registo no IGAC.
 
 
 
{{CollapsedCode|Exemplos de apresentação de obras|
 
3 - 20 de 23 - Livro - Casa Azul - 15 - Ficção - João Fonseca - 1234567891
 
4 - 2 de 2 - DVD - Casamento Real - 8 - Ficção - António Fonseca - 200400500
 
5 - 0 de 4 - Livro - Dicionário - 45 - Referência - Pedro Casanova - 1234567893
 
6 - 1 de 21 - Livro - Enciclopédia - 100 - Técnica e Científica - Zé Fonseca - 1234567894
 
}}
 
 
 
=== Mostrar obras ===
 
 
 
Apresenta informações sobre todas as obras, ordenando-as pelos seus identificadores. O formato de apresentação é como descrito em [[#Mostrar obra|Mostrar obra]].
 
 
 
=== Efectuar pesquisa ===
 
 
 
Esta opção realiza uma procura por termo (cadeia de caracteres), pedido através de '''requestSearchTerm()'''. Como resultado, deve ser apresentada uma
 
lista das obras encontradas pela pesquisa, ordenadas por ordem crescente do seu identificador, utilizando o formato descrito para [[#Mostrar obra|Mostrar obra]].
 
 
 
O termo de pesquisa deve ser comparado (sem distinção entre letras maiúsculas e minúsculas) com os campos relevantes de cada obra: para DVDs, o realizador e o título; para livros, o autor e o título. Só devem ser apresentadas obras que contenham o termo de pesquisa num dos campos relevantes.
 
 
 
Assim, considerando as quatro obras no exemplo acima, uma pesquisa pelo termo '''casa''' retornaria as obras com os identificadores 3, 4 e 5.
 
 
 
{{CollapsedCode|Resultados de pesquisa pelo termo "casa"|
 
<source lang="text">
 
3 - 20 de 23 - Livro - Casa Azul - 15 - Ficção - João Fonseca - 1234567891
 
4 - 2 de 2 - DVD - Casamento Real - 8 - Ficção - António Fonseca - 200400500
 
5 - 0 de 4 - Livro - Dicionário - 45 - Referência - Pedro Casanova - 1234567893
 
</source>
 
}}
 
Caso não sejam encontradas obras, não deve ser produzido qualquer resultado.
 
 
 
== Menu de Gestão de Transacções ==
 
 
 
== Menu de Consultas ==
 
 
 
Este menu apresenta as operações relacionadas com consultas. A lista completa é a seguinte: [[#Procurar produtos com preço abaixo de limite|Procurar produtos com preço abaixo de limite]], [[#Procurar produtos comprados por cliente|Procurar produtos comprados por cliente]], [[#Procurar clientes que compram produto|Procurar clientes que compram produto]], [[#Procurar facturas pagas por cliente|Procurar facturas pagas por cliente]], [[#Procurar facturas pagas com atraso|Procurar facturas pagas com atraso]].
 
 
 
As etiquetas das opções deste menu estão definidas na classe '''woo.app.lookups.Label'''. Todos os métodos correspondentes às mensagens de diálogo para este menu estão definidos na classe '''woo.app.lookups.Message'''.
 
 
 
Sempre que é pedido o identificador do cliente ('''requestClientId()'''), é lançada a excepção '''NoSuchClientException''', se o cliente indicado não existir. Sempre que é pedido o identificador de produto ('''requestProductId()'''), é lançada a excepção '''NoSuchProductException''', se o produto indicado não existir.
 
 
 
A apresentação de resultados é como indicado nos casos já descritos de apresentação dos vários casos.
 
 
 
{{CVSCode|Estes comandos já estão parcialmente implementados  nas classes da ''package'' '''woo.app.lookups''' (disponível no CVS), respectivamente: '''DoLookupProductsBoughtByClient''', '''DoLookupClientsBuyingProduct''', '''DoLookupPaymentsByClient''', '''DoLookupLatePayments'''.}}
 
 
 
=== Procurar produtos com preço abaixo de limite ===
 
 
 
O sistema pede o valor pretendido ('''requestPriceLimit()'''), apresentando os produtos relevantes.
 
 
 
=== Procurar produtos comprados por cliente ===
 
 
 
O sistema pede o código do cliente, apresentando os produtos relevantes.
 
 
 
=== Procurar clientes que compram produto ===
 
 
 
O sistema pede o código do produto, apresentando os clientes relevantes.
 
 
 
=== Procurar facturas pagas por cliente ===
 
 
 
O sistema pede o código do cliente, apresentando as facturas pagas por ele.
 
 
 
=== Procurar facturas pagas com atraso ===
 
 
 
O sistema pede o atraso pretendido ('''requestDelay()'''), apresentando as facturas que foram pagas com, pelo menos, o atraso especificado.
 
 
 
= Leitura de Dados a Partir de Ficheiros Textuais =
 
 
Além das opções de manipulação de ficheiros descritas no [[#Salvaguarda do Documento Actual|menu principal]], é possível iniciar a aplicação com um ficheiro de texto especificado pela propriedade Java '''[[#Execução dos Programas e Testes Automáticos|import]]'''.
 
 
 
As obras da mediateca têm o formato descrito abaixo, respectivamente, para DVDs e livros. Assume-se que os títulos das obras não podem conter o carácter ''':''' e que o preço é um número inteiro (sugere-se a utilização do método '''String.split''' para o processamento preliminar destas linhas). Não existem entradas mal-formadas.
 
 
 
Cada linha tem  tem uma descrição distinta mas que segue os seguintes formatos.
 
 
 
BOX|''id''|''tipo''|''nome-fornecedor''|''preço''|''valor-crítico''|''exemplares''
 
CONTAINER|''id''|''tipo''|''formato''|''nome-fornecedor''|''preço''|''valor-crítico''|''exemplares''
 
 
 
BOOK|''id''|''título''|''autor''|''isbn''|''nome-fornecedor''|''preço''|''valor-crítico''|''exemplares''
 
 
 
É ainda possível definir fornecedores e clientes, de acordo com os seguintes formatos:
 
 
 
SUPPLIER|''id''|''nome''|''endereço''
 
CLIENT|''id''|''nome''|''endereço''
 
 
 
Um exemplo de conteúdo do ficheiro inicial é como se segue:
 
 
 
{{CollapsedCode|Exemplo de ficheiro de entrada textual|
 
<source lang="text">
 
SUPPLIER|S1|Toshiba|Tokyo, Japan
 
SUPPLIER|W2|Papelaria Fernandes|Oeiras, Portugal
 
SUPPLIER|P1|Publicac¸˜oes Europa-Am´erica|Lisboa, Portugal
 
SUPPLIER|P3|O’Reilly|K¨oln, Germany
 
CLIENT|R2|Jorge Figueiredo|Lisboa, Portugal
 
CLIENT|E4|Filomena Figueiredo|Lisboa, Portugal
 
CLIENT|ER|Abdul Figueiredo|Casablanca, Morocco
 
CLIENT|O9|Hellen Figueiredo|San Francisco, CA, USA
 
CLIENT|H2SO4|John Figueiredo|Wellington, New Zealand
 
CLIENT|H2O|Rohit Figueiredo|New Delhi, India
 
BOX|C6H5OH|NORMAL|Papelaria Fernandes|2|20|100
 
BOX|H2|AIR|Papelaria Fernandes|4|20|100
 
BOX|O3|EXPRESS|Papelaria Fernandes|8|20|100
 
BOX|CO2|PERSONAL|Papelaria Fernandes|16|20|0
 
CONTAINER|M4|NORMAL|B4|Papelaria Fernandes|2|20|100
 
CONTAINER|M2|AIR|C4|Papelaria Fernandes|4|20|100
 
CONTAINER|M5|EXPRESS|B4|Papelaria Fernandes|8|20|100
 
CONTAINER|M3|PERSONAL|DL|Papelaria Fernandes|16|20|0
 
BOOK|B1256|Os Lusíadas|Luís de Camões|1234567890|Publicações Europa-América|58|2|5
 
BOOK|B9854|Head First Java|Sierra & Bates|9876543210|O’Reilly|75|2|5
 
BOOK|B1937|How to fix almost everything|Satoshi Yamada|1928374650|Toshiba|5|2|5
 
</source>
 
}}
 
A codificação dos ficheiros a ler é garantidamente [[wp:UTF-8|UTF-8]].
 
 
 
{{Suggestion|Note-se que o programa nunca produz ficheiros com este formato.}}
 
 
 
= Execução dos Programas e Testes Automáticos =
 
 
 
Usando os ficheiros '''test.import''', '''test.in''' e '''test.out''', é possível verificar automaticamente o resultado correcto do programa. Note-se que é necessária a definição apropriada da variável '''CLASSPATH''' (ou da opção equivalente '''-cp''' do comando '''java'''), para localizar as classes do programa, incluindo a que contém o método correspondente ao ponto de entrada da aplicação ('''woo.app.App.main'''). As propriedades são tratadas automaticamente pelo código de apoio.
 
 
 
        java -Dimport=test.import -Din=test.in -Dout=test.outhyp woo.app.App
 
 
 
Assumindo que aqueles ficheiros estão no directório onde é dado o comando de execução, o programa produz o ficheiro de saída '''test.outhyp'''. Em caso de sucesso, os ficheiros das saídas esperada ('''test.out''') e obtida ('''test.outhyp''') devem ser iguais. A comparação pode ser feita com o comando:
 
 
 
        diff -b test.out test.outhyp
 
 
 
Este comando não deve produzir qualquer resultado quando os ficheiros são iguais. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido, apenas verificando alguns aspectos da sua funcionalidade.
 
 
 
= Notas de Implementação =
 
 
 
Tal como indicado acima, algumas classes fornecidas como [[Programação com Objectos/Projecto de Programação com Objectos/Material de Apoio ao Desenvolvimento|material de apoio]], são de uso obrigatório e não podem ser alteradas. Outras dessas classes são de uso obrigatório e têm de ser alteradas.
 
 
 
A serialização Java usa as classes da ''package'' '''[https://docs.oracle.com/javase/8/docs/api/java/io/package-summary.html java.io]''', em particular, a interface '''[https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html java.io.Serializable]''' e as classes de leitura '''[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectInputStream.html java.io.ObjectInputStream]''' e escrita '''[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html java.io.ObjectOutputStream]''' (entre outras).
 
<!--
 
A representação e manipulação de datas e tempos deve ser realizada através das classes da ''package'' '''[https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html java.time]''', em particular, através das classes '''[https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html java.time.LocalDate]''' e '''[https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html java.time.LocalTime]'''. Diferenças entre tempos são representadas pela classe '''[https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html java.time.Duration]'''.
 
-->
 
<!--
 
[[category:Ensino]]
 
[[category:PO]]
 
[[category:Projecto de PO]]
 
[[en:Object-Oriented Programming]]
 
-->
 

Latest revision as of 16:42, 3 October 2020

(enunciado publicado)