Skip to main content

Overview

Alcoholic beverage permits are required for businesses that want to sell alcoholic beverages within the municipality. These permits track the authorization period, schedule, and location where beverages can be sold.

Required Fields

When creating or editing an alcoholic beverage permit, the following information is required:
habilitacion
date
required
Start date when the permit becomes valid (issue date)
vencimiento
date
required
Expiration date of the permit
horario
string
required
Authorized schedule for alcoholic beverage sales (e.g., “8:00 AM - 10:00 PM”)
nombre
string
required
Applicant’s first name
apellido
string
required
Applicant’s last name
idDocument
string
required
Applicant’s identification document number
tlf
string
required
Applicant’s phone number
habitacion
string
required
Applicant’s address or location
sector
string
required
Sector or area where the permit is authorized (sector_permisado)
comprobante
file
Payment receipt file upload (optional)
today
string
required
Current date in YYYY-MM-DD format for validation

Creating a Permit

To create a new alcoholic beverage permit, send a POST request with multipart form data:
POST /venta_de_bebidas/add
Content-Type: multipart/form-data

Request Body

const formData = new FormData();
formData.append('habilitacion', '2026-03-01');
formData.append('vencimiento', '2027-03-01');
formData.append('horario', '8:00 AM - 10:00 PM');
formData.append('nombre', 'Juan');
formData.append('apellido', 'Pérez');
formData.append('idDocument', 'V-12345678');
formData.append('tlf', '0414-1234567');
formData.append('habitacion', 'Calle Principal #123');
formData.append('sector', 'Centro Comercial Plaza');
formData.append('comprobante', fileInput.files[0]); // Optional
formData.append('today', '2026-03-04');

Response

{
  "success": "¡Se ha registrado correctamente el permiso!",
  "permiso": "2026-001"
}
The system automatically generates a unique permit code in the format YYYY-NNN (year + sequential number).

Error Responses

// Date validation error
{
  "errno": "¡Fecha incorrecta!",
  "message": "¡Fecha Incorrecta!",
  "code": "ERRDATE",
  "date": "04/03/2026"
}

Editing a Permit

Update an existing permit by sending a POST request:
POST /venta_de_bebidas/edit
Content-Type: multipart/form-data

Request Body

All fields from creation plus:
permiso
integer
required
ID of the permit to edit
needPermiso
string
Set to “true” if updating the payment receipt, “false” otherwise

Example

const formData = new FormData();
formData.append('permiso', '5');
formData.append('habilitacion', '2026-03-01');
formData.append('vencimiento', '2027-03-01');
formData.append('horario', '9:00 AM - 11:00 PM');
formData.append('nombre', 'Juan');
formData.append('apellido', 'Pérez');
formData.append('idDocument', 'V-12345678');
formData.append('tlf', '0414-1234567');
formData.append('habitacion', 'Calle Principal #123');
formData.append('sector', 'Centro Comercial Plaza');
formData.append('needPermiso', 'false');
formData.append('today', '2026-03-04');

Response

{
  "success": "¡Se ha editado correctamente el permiso!",
  "permiso": 5
}

Approving a Permit

Approve a permit by uploading the authorized permit document:
POST /venta_de_bebidas/aprobate
Content-Type: multipart/form-data

Request Body

permiso
integer
required
ID of the permit to approve
permiso_aprobado
file
required
Authorized permit document file

Example

const formData = new FormData();
formData.append('permiso', '5');
formData.append('permiso_aprobado', authorizedDocument.files[0]);

Response

{
  "success": "¡Se ha aprobado correctamente el permiso!",
  "permiso": 5
}
The permit’s emitido field is set to 1 (approved status).

Canceling a Permit

Cancel a permit with an observation note:
POST /venta_de_bebidas/cancel
Content-Type: multipart/form-data

Request Body

permiso
integer
required
ID of the permit to cancel
observacion
string
required
Reason for cancellation

Example

const formData = new FormData();
formData.append('permiso', '5');
formData.append('observacion', 'Documentación incompleta');

Response

{
  "success": "¡Se ha cancelado la emisión del permiso correctamente!",
  "permiso": 5
}

Searching and Filtering

Search for permits with various filters:
POST /venta_de_bebidas/search
Content-Type: multipart/form-data

Request Body

busqueda
string
Search term to filter results (searches across permit code, dates, applicant name, document, phone, sector)
estado
string
required
Filter by status: “Todos” (all), “Emitido” (approved), or “No Emitido” (not approved)

Example

const formData = new FormData();
formData.append('busqueda', 'Juan');
formData.append('estado', 'Emitido');

Response

Returns HTML template with search results:
{
  "plantilla": "<button class='item aproved' id='itemResult1'>...</button>..."
}
Results are color-coded:
  • Red (disaproved): Not approved (emitido=0)
  • Green (aproved): Approved (emitido=1, cancelado=0)
  • Gray (canceled): Canceled (cancelado=1)

Getting Permit Details

Retrieve details for a specific permit:
POST /venta_de_bebidas/get
Content-Type: multipart/form-data

Request Body

id
integer
required
Permit ID

Response

{
  "result": {
    "id": 5,
    "codigo_permiso": "2026-001",
    "habilitacion": "2026-03-01",
    "vencimiento": "2027-03-01",
    "horario": "8:00 AM - 10:00 PM",
    "dat_confirmacion": 1,
    "requisitor_nombre": "Juan",
    "requisitor_apellido": "Pérez",
    "requisitor_doc": "V-12345678",
    "requisitor_tlf": "0414-1234567",
    "requisitor_habitacion": "Calle Principal #123",
    "sector_permisado": "Centro Comercial Plaza",
    "comprobante_de_pago": "comprobante_de_pago_1234567890.pdf",
    "permiso_autorizado": "permiso_autorizado1234567890.pdf",
    "creador": "Admin User",
    "editor": "Admin User",
    "emitido": 1,
    "cancelado": 0,
    "observacion": ""
  },
  "usuario": { /* current session user */ }
}

Listing All Permits

Get all alcoholic beverage permits:
GET /venta_de_bebidas/
Returns a rendered page with all permits from the permisos_bebidas table.

PDF Generation

Generate a PDF document for a specific permit:
GET /venta_de_bebidas/permiso/bebidas-alcoholicas_2026-001
The URL pattern is: bebidas-alcoholicas_{codigo_permiso}

Response

Returns a PDF document with:
  • Content-Type: application/pdf
  • Permit details formatted using the template at views/templates/permisos/bebidas.html
  • Information includes: permit code, dates, schedule, applicant details, authorized area

Deleting a Permit

Only users with “Administrador” or “Desarrollador” roles can delete permits.
Delete a permit (only if not approved):
DELETE /venta_de_bebidas/
Content-Type: multipart/form-data

Request Body

id
integer
required
ID of the permit to delete

Response

{
  "message": "¡El permiso ha sido eliminado!"
}

Restrictions

  • Cannot delete permits that have been approved (emitido=1)
  • Cannot delete if newer permits from the same year have already been approved
  • When deleted, subsequent permit codes are automatically renumbered

Error Responses

// Permit not found
{
  "message": "¡Permiso no encontrado!"
}

// Permit already approved
{
  "message": "El permiso no puede ser eliminado una vez ha sido aprobado!"
}

// Newer permits exist
{
  "message": "¡El permiso no puede ser eliminado debido a que existen permisos que han sido aprobados después de haberse creado éste permiso!"
}

Report Generation

Generate a comprehensive PDF report of all alcoholic beverage permits:
GET /venta_de_bebidas/reporte
The report includes:
  • Total registered permits
  • Approved permits (emitido)
  • Not approved permits (no emitido)
  • Canceled permits
  • Payment confirmation status
  • Detailed tables for each category

Database Schema

The permisos_bebidas table structure:
FieldTypeDescription
idintPrimary key
codigo_permisovarcharUnique permit code (YYYY-NNN)
habilitaciondateStart/issue date
vencimientodateExpiration date
horariovarcharAuthorized schedule
dat_confirmaciontinyintPayment confirmed (0 or 1)
requisitor_nombrevarcharApplicant first name
requisitor_apellidovarcharApplicant last name
requisitor_docvarcharID document
requisitor_tlfvarcharPhone number
requisitor_habitacionvarcharAddress
sector_permisadovarcharAuthorized sector
comprobante_de_pagovarcharPayment receipt filename
permiso_autorizadovarcharAuthorized permit filename
creadorvarcharCreator name
editorvarcharLast editor name
fecha_creaciontimestampCreation date
emitidotinyintApproval status (0 or 1)
canceladotinyintCanceled status (0 or 1)
observaciontextCancellation notes

File Storage

Files are stored in:
../public/server-files/asuntos_publicos/permisos_municipales/bebidas/
File naming conventions:
  • Payment receipts: comprobante_de_pago_{timestamp}{extension}
  • Authorized permits: permiso_autorizado{timestamp}{extension}

Build docs developers (and LLMs) love