A Propuesta (Proposal) is the core entity of CulturarteWeb. It represents a cultural event created by a Proponente (proposer) that needs community funding to take place. Each proposal defines what the event is, where and when it will happen, how much money is needed to make it viable, and what collaborators will receive in return for their financial backing.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/17Franco/CulturarteWeb/llms.txt
Use this file to discover all available pages before exploring further.
Proposal Fields
The following fields are collected when a Proponente creates a new proposal. They are stored in thePropuesta table in the database.
| Field | Type | Description |
|---|---|---|
titulo | string | Unique title of the proposal (primary key) |
descripcion | string | Full description of the cultural event (up to 2 000 characters) |
imagen | file | Image file uploaded by the Proponente (stored as binary) |
lugar | string | Physical location or venue where the event will take place |
fecha | date | Date on which the event will be held (yyyy-MM-dd) |
precio | integer | Price per ticket in local currency |
montoTotal | integer | Total funding target required for the event to proceed |
categoria | string | Category selected from the hierarchical category tree |
tipoRetorno | enum[] | One or both return types offered to collaborators |
proponente | string | Nickname of the Proponente who created the proposal |
fechaPublicacion | date | Date the proposal was submitted (set automatically to today) |
estadoAct | enum | Current lifecycle state of the proposal |
Return Types
When creating a proposal, the Proponente must select at least one TipoRetorno (return type). This tells collaborators what they will receive if the proposal is funded.EntradaGratis
Free Ticket — A collaborator who chooses this return type receives a complimentary entry to the event if it is successfully funded.
PorcentajeGanancia
Profit Share — A collaborator who chooses this return type receives a percentage of the event’s profits proportional to their contribution.
Proposal States
Every proposal moves through a defined lifecycle. State transitions are recorded individually in theRegistro_Estado table, providing a full audit history.
| State | Internal Name | Meaning |
|---|---|---|
| Ingresada | INGRESADA | Newly created; not visible in the public proposal listing |
| Publicada | PUBLICADA | Approved and visible to all users |
| En Financiación | EN_FINANCIACION | Actively receiving collaborations |
| Financiada | FINANCIADA | Funding target reached |
| No Financiada | NO_FINANCIADA | Funding period ended without reaching the target |
| Cancelada | CANCELADA | Cancelled by the Proponente; permisos are revoked for all users |
Proposals in the
INGRESADA state are intentionally hidden from the main browsing view. The BuscadorPropuestas servlet returns all proposals sorted by date, but index.jsp filters out INGRESADA proposals so visitors only see active or completed proposals.Creating a Proposal (Proponentes Only)
Only authenticated Proponentes can create proposals. The creation form is available at/AltaPropuesta.
Navigate to the creation form
Visit
GET /AltaPropuesta. The servlet loads the hierarchical category list from the web service and sets it as a request attribute. You are redirected to AltaPropuesta.jsp.Fill in the proposal details
Complete all required fields in the form. Every field is validated server-side before the proposal is persisted.
| Form Field | HTML name | Required | Notes |
|---|---|---|---|
| Title | titulo | ✅ | Used as the unique identifier |
| Description | descripcion | ✅ | Up to 2 000 characters |
| Venue / Place | lugar | ✅ | Free-text location string |
| Event Date | fecha | ✅ | Date picker, format yyyy-MM-dd |
| Ticket Price | precio | ✅ | Integer ≥ 0 |
| Funding Target | montoTotal | ✅ | Integer ≥ 1 |
| Category | categoria | ✅ | Radio button from category tree |
| Return Type(s) | tipoRetorno | ✅ | Checkboxes; at least one required |
| Proposal Image | imagen | ✅ | File upload; the proposal is rejected if omitted |
Upload an image
Use the file input (
name="imagen") to select an image for the proposal. The form uses enctype="multipart/form-data" and the servlet is annotated with @MultipartConfig. The image is read as a byte array and forwarded to the web service. The form will be rejected if no image is provided.Select a category
Categories are displayed as a two-level radio-button tree (parent category with expandable subcategories). Select either a top-level category or one of its subcategories. Only one category can be selected per proposal.
Select return type(s)
Check at least one of Entrada Gratis (
EntradaGratis) or Porcentaje de Ganancia (PorcentajeGanancia). Both checkboxes may be ticked at the same time.Only Proponentes can create proposals. If an authenticated Colaborador somehow reaches this endpoint, the servlet checks
portU.isProponente(nick) and redirects them to index.jsp with an error. Proponentes are blocked from logging in on mobile browsers (User-Agent detection for Mobi, Android, iPhone, iPad, and Touch), so the creation form is effectively desktop-only.Browsing Proposals
Any visitor (authenticated or not) can browse proposals via the Buscador (search) servlet. Endpoint:GET /Buscador
Query parameters:
| Parameter | Description |
|---|---|
filtro | Free-text search string matched against proposal titles/content. Passing an empty string returns all proposals. |
categoria | Filter by category name. When provided, filtro is ignored and results come from obtenerPropuestaPorSubCategoria. |
orden | Currently unused; results are always sorted by fechaString descending (newest first). |
propuestasMap keyed by state (e.g. "PUBLICADA", "EN_FINANCIACION", "Todas") and forwards them to index.jsp.
Category Tree
Categories are hierarchical with a single level of subcategories. Available categories (from the database seed):| Parent Category | Subcategories |
|---|---|
| Carnaval | Humoristas, Lubolos, Murga, Parodistas, Revista |
| Cine | Cine a Pedal, Cine al Aire Libre |
| Danza | Ballet, Flamenco |
| Literatura | (none) |
| Música | Concierto, Festival |
| Teatro | Comedia, Stand-up, Teatro Dramático, Teatro Musical |
Proposal Lifecycle Actions
Cancel a Proposal
Endpoint:GET /CancelarPropuestas?nick=<nick>&tipo=<tipo>
The servlet retrieves all proposals created by the given Proponente and filters them to those currently in state FINANCIADA. These are presented in CancelarPropuesta.jsp for the Proponente to cancel.
Extend a Proposal
Endpoint:GET /ExtenderPropuestas?nick=<nick>&tipo=<tipo>
The servlet retrieves proposals in states PUBLICADA or EN_FINANCIACION created by the given Proponente. These are presented in ExtenderPropuesta.jsp so the Proponente can extend their financing period.
Proposal Details Page
Endpoint:GET /DetallesDePropuesta?id=<titulo>
The details page loads the full DtoPropuesta object for the proposal identified by titulo. The permission level (permisos) for the current user is computed server-side:
permisos value | Meaning |
|---|---|
0 | Visitor or no action available |
1 | Authenticated user can post a comment |
2 | Proponente can cancel the proposal |
3 | Colaborador can submit a new collaboration |
4 | Colaborador is already collaborating |
permisos = 0 (they cannot fund proposals they do not own). Any user visiting a CANCELADA proposal is also set to permisos = 0.
Favorites
Authenticated users can mark any proposal as a favorite. Endpoint:POST /FavoritoServlet
| Parameter | Values | Description |
|---|---|---|
tituloPropuesta | string | Title of the proposal to act on |
accion | agregar / quitar | Add or remove from favorites |
GET /DetallesDePropuesta?id=<titulo>.
View favorites: GET /PropuestasFavoritaUsuario?nick=<nick>&tipo=<tipo> — returns the full list of proposals favorited by the given user, forwarded to PropuestasFavoritas.jsp.
Favorites are stored in the propuesta_favorita table with a composite primary key of (usuario, propuesta).