#+title: Diagrama De Clases
#+LATEX_HEADER: \usepackage{svg}

* Diagrama de clases con Repositorios
#+begin_src plantuml :file DiagramaConRepos.jpg
@startuml
skinparam groupInheritance 2

class RepositorioLotes {
+ Añadir(detalle): bool
+ Modificar(detalle): bool
+ Eliminar(detalle): bool
}

RepositorioLotes "1" *-- "0..*" Lote

class RepositorioDetalles {
+ Añadir(detalle): bool
+ Modificar(detalle): bool
+ Eliminar(detalle): bool
}

RepositorioDetalles "1" *-- "0..*" Detalle

class RepositorioFacturas {
+ Añadir(Factura): bool
+ Modificar(Factura): bool
+ Eliminar(Factura): bool
}

RepositorioFacturas "1" *-- "0..*" Factura

class RepositorioVentas {
+ Añadir(Venta): bool
+ Modificar(Venta): bool
+ Eliminar(Venta): bool
}

RepositorioVentas "1" *-- "0..*" Venta

class RepositorioClientes {
+ Añadir(Cliente): bool
+ Modificar(Cliente): bool
+ Eliminar(Cliente): bool
}

RepositorioClientes "1" *-- "0..*" Cliente

class RepositorioProveedores {
+ Añadir(Proveedor): bool
+ Modificar(Proveedor): bool
+ Eliminar(Proveedor): bool
}

class RepositorioPresupuestos {
+ Añadir(Presupuesto): bool
+ Modificar(Presupuesto): bool
+ Eliminar(Presupuesto): bool
}

class RepositorioProductos <where T: Producto> {
+ Añadir(T): bool
+ Modificar(T): bool
+ Eliminar(T): bool
}

RepositorioProductos ..|> Repositorio: Implementa
RepositorioLotes ..|> Repositorio: Implementa
RepositorioPresupuestos ..|> Repositorio: Implementa
RepositorioFacturas ..|> Repositorio: Implementa
RepositorioClientes ..|> Repositorio: Implementa
RepositorioVentas ..|> Repositorio: Implementa
RepositorioDetalles ..|> Repositorio: Implementa
RepositorioProveedores ..|> Repositorio: Implementa

interface Repositorio<T> {
+ Añadir(T): bool
+ Modificar(T): bool
+ Eliminar(T): bool
}

RepositorioProductos "1" *--> "0..*" Producto


enum EnvaseTipo {
Plastico,
Enlatado,
Cartón,
}

ProductoNoPercedero --> EnvaseTipo

class ProductoNoPercedero {
+ TipoDeEnvase: EnvaseTipo
}

class ProductoPercedero {
+ MesesHastaConsumoPreferente: int
+ MesesHastaVencimiento: int
}

Producto <|-- ProductoNoPercedero
Producto <|-- ProductoPercedero

class Producto {
+ Id: int
+ Nombre: string
+ Precio: double
- PresupuestosStock: List<Presupuestos>?
- Lotes: List<Lote>?
+ Habilitado: bool

+ MostrarPresupuestos(): ReadOnlyCollection<Presupuesto>
+ AñadirPresupuesto(Presupuesto): bool
+ EliminarPresupuesto(Presupuesto): bool

+ MostrarLotesDeProductos(): ReadOnlyCollection<Lote>
+ AñadirLotesStock(): bool
+ EliminarLotesStock(): bool
+ MostrarStockRemanente(): long
}

class Presupuesto {
+ Id: int
+ Proveedor: Proveedor
+ Monto: int
+ CantIdad: int
}

RepositorioPresupuestos "1" *-- "0..*" Presupuesto
RepositorioProveedores "1" *-- "0..*" Proveedor

Presupuesto "0..*" <--* "1" Producto
Proveedor <--  Presupuesto

class Proveedor {
+ Id: int
+ Nombre: string
+ RazónSocial: string
}

class Venta {
+ Id: int
- Detalles: List<Detalle>

+ MostrarDetalles(): ReadOnlyCollection<Detalle>
+ AñadirDetalle(Detalle): voId
+ ModificarDetalle(Detalle): voId
+ EliminarDetalle(Detalle): voId
}

Lote -- Producto

class Lote {
+ Id: int
+ Producto: Producto
+ CantIdadDeProductos: long
+ FechaVencimiento: DateTime
}

class Detalle <where T: Producto>{
+ Id: int
+ CantIdad: int
+ PrecioUnitario: double
+ Subtotal: double
+ Producto: T
}

class Cliente {
+ Cuit: string
+ Nombre: string
+ ApellIdo: string
+ Direccion: string
+ Correo: string
}

class Factura {
+ Total: double
+ Fecha: DateTime
+ Cliente: Cliente
+ Venta: Venta
}

Cliente <-- Factura
Factura --> Venta
Venta "1" *-- "1..*" Detalle

Detalle --> Producto

@enduml
#+end_src

#+RESULTS:
[[file:DiagramaConRepos.jpg]]










* Diagrama de clases sin Repositorios
#+begin_src plantuml :file DiagramaSinRepos.jpg
@startuml
skinparam groupInheritance 2

class ProductoNoPercedero {
+ TipoDeEnvase: EnvaseTipo
}

class ProductoPercedero {
+ MesesHastaConsumoPreferente: int
+ MesesHastaVencimiento: int
}

Producto <|-- ProductoNoPercedero
Producto <|-- ProductoPercedero

class Producto {
+ Id: int
+ Nombre: string
+ Precio: double
- Categorias: List<Categoria>?
+ Habilitado: bool

+ MostrarCategoriasDeProductos(): ReadOnlyCollection<Categoria>
+ AñadirCategoriasStock(): bool
+ EliminarCategoriasStock(): bool
}

class Categoria {
+ Id: int
+ Descripcion: String
}

class Presupuesto {
+ Id: int
+ Fecha: DateTime
+ Proveedor: Proveedor
+ Habilitado: bool
- Detalles: List<DetallePresupuesto>
+ Aceptado: bool

+ MostrarDetalles(): ReadOnlyCollection<DetallePresupuesto>
+ AñadirDetalle(DetallePresupuesto): bool
}

class Proveedor {
+ Id: int
+ Nombre: string
+ RazónSocial: string
+ Habilitado: bool
}

class DetalleFactura {
+ IdFactura: int
+ PrecioUnitario: double
+ Subtotal: double
}

class Cliente {
+ Cuit: string
+ Nombre: string
+ ApellIdo: string
+ Direccion: string
+ Correo: string
}

class Detalle <where T: Producto>{
+ Id: int
+ Producto: T
+ Cantidad: int
}

class Factura {
+ Total: double
+ Fecha: DateTime
+ Cliente: Cliente
- detalles: List<DetalleFactura>

+ MostrarDetalles(): ReadOnlyCollection<DetalleFactura>
+ AñadirDetalle(DetalleFactura): void
+ ModificarDetalle(DetalleFactura): void
+ EliminarDetalle(DetalleFactura): void
}

class DetallePedido {
+ IdPedido: int
}

class PedidoDePresupuesto {
+ Id: int
+ Fecha: DateTime
- detallesPedidos: List<DetallePedido>
+ Proveedor: Proveedor

+ MostrarDetalles(): ReadOnlyCollection<DetallePedido>
+ AñadirDetalle(DetallePedido): void
+ EliminarDetalle(DetallePedido): void
}

class Lote {
+ Id: int
+ Fecha: DateTime
+ Producto: Producto
+ CantidadDeProductos: long
+ Habilitado: bool
}

enum EnvaseTipo {
Plastico,
Enlatado,
Cartón,
}

class DetallePresupuesto {
+ IdPresupuesto: int
+ CostoUnitario: double
}

class OrdenDeCompra {
+ Id: int
- Productos: List<DetalleOrdenDeCompra>
+ Proveedor: Proveedor

+ MostrarDetalles(): ReadOnlyCollection<DetalleOrdenDeCompra>
+ AñadirDetalle(DetalleOrdenDeCompra): bool
+ ModificarDetalle(DetalleOrdenDeCompra): bool
+ EliminarDetalle(DetalleOrdenDeCompra): bool
}

class DetalleOrdenDeCompra {
+ IdOrdenDeCompra: int
}

class Remito {
+ Id: int 
- LotesDeProductosEntregados: List<Lote>
+ Proveedor: Proveedor

+ MostrarLotes(): ReadOnlyCollection<Lote>
+ AñadirLote(Lote): bool
}

Detalle <|-- DetalleOrdenDeCompra
Detalle <|-- DetallePedido
Detalle <|-- DetalleFactura
Detalle <|-- DetallePresupuesto

Presupuesto "1" *--> "1..*" DetallePresupuesto

PedidoDePresupuesto "1" --> "1" Proveedor
PedidoDePresupuesto "1" *--> "1..*" DetallePedido
PedidoDePresupuesto "1" --> "1" Presupuesto

OrdenDeCompra "1" --> "1" Proveedor
OrdenDeCompra "1" *--> "1..*" DetalleOrdenDeCompra
Remito "1" --> "1" Proveedor
Remito "1" *--> "1..*" Lote

Producto "1" <-- "1..*" Lote

OrdenDeCompra "1" --> "1" Presupuesto

ProductoNoPercedero "1" --> "1" EnvaseTipo

Cliente "1" <-- "1" Factura
Factura "1 ." *--> "1..*" DetalleFactura

DetalleFactura "1   ." --> "1" Producto

Proveedor "1" <-- "1 ." Presupuesto

Categoria "0..*" <--o "1  ." Producto
@enduml

#+end_src

#+RESULTS:
[[file:DiagramaSinRepos.jpg]]

#+begin_comment

Presupuesto "1" --> "1..*" Lote

#+end_comment
