Commit a4849797 authored by Elmer Mendoza's avatar Elmer Mendoza

commit inicial

parents
Pipeline #477 failed with stages
{
"presets":["latest"]
}
{
"globals": {
"myModule": true
},
"env": {
"es6": true
},
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true,
"generators": false,
"objectLiteralDuplicateProperties": false
}
},
"rules": {
// enforces no braces where they can be omitted
// http://eslint.org/docs/rules/arrow-body-style
"arrow-body-style": [2, "as-needed"],
// require parens in arrow function arguments
"arrow-parens": 0,
// require space before/after arrow function"s arrow
// https://github.com/eslint/eslint/blob/master/docs/rules/arrow-spacing.md
"arrow-spacing": [2, { "before": true, "after": true }],
// require trailing commas in multiline object literals
"comma-dangle": [2, "always-multiline"],
// verify super() callings in constructors
"constructor-super": 0,
// enforce the spacing around the * in generator functions
"generator-star-spacing": 0,
// disallow modifying variables of class declarations
"no-class-assign": 0,
// disallow arrow functions where they could be confused with comparisons
// http://eslint.org/docs/rules/no-confusing-arrow
"no-confusing-arrow": [2, {
"allowParens": true,
}],
// disallow modifying variables that are declared using const
"no-const-assign": 2,
// disallow duplicate class members
// http://eslint.org/docs/rules/no-dupe-class-members
"no-dupe-class-members": 2,
// disallow importing from the same path more than once
// http://eslint.org/docs/rules/no-duplicate-imports
"no-duplicate-imports": 2,
// disallow symbol constructor
// http://eslint.org/docs/rules/no-new-symbol
"no-new-symbol": 2,
// disallow specific globals
"no-restricted-globals": 0,
// disallow specific imports
// http://eslint.org/docs/rules/no-restricted-imports
"no-restricted-imports": 0,
// disallow to use this/super before super() calling in constructors.
"no-this-before-super": 0,
// require let or const instead of var
"no-var": 2,
// disallow unnecessary constructor
// http://eslint.org/docs/rules/no-useless-constructor
"no-useless-constructor": 2,
// require method and property shorthand syntax for object literals
// https://github.com/eslint/eslint/blob/master/docs/rules/object-shorthand.md
"object-shorthand": [2, "always"],
// suggest using arrow functions as callbacks
"prefer-arrow-callback": 2,
// suggest using of const declaration for variables that are never modified after declared
"prefer-const": 2,
// suggest using the spread operator instead of .apply()
"prefer-spread": 0,
// suggest using Reflect methods where applicable
"prefer-reflect": 0,
// use rest parameters instead of arguments
// http://eslint.org/docs/rules/prefer-rest-params
"prefer-rest-params": 2,
// suggest using template literals instead of string concatenation
// http://eslint.org/docs/rules/prefer-template
"prefer-template": 2,
// disallow generator functions that do not have yield
"require-yield": 0,
// import sorting
// http://eslint.org/docs/rules/sort-imports
"sort-imports": 0,
// enforce usage of spacing in template strings
// http://eslint.org/docs/rules/template-curly-spacing
"template-curly-spacing": 2,
// enforce spacing around the * in yield* expressions
// http://eslint.org/docs/rules/yield-star-spacing
"yield-star-spacing": [2, "after"]
}
}
\ No newline at end of file
logs/*
node_modules/
public/informes/*.pdf
public/plantillas/*.pdf
public/documentos/*.pdf
public/externos/*.pdf
public/apidoc/*.*
public/apidoc/*
public/documentos/*
src/config/config.json
src/config/config.js
npm-debug.log
*.env
.jshintrc
.vscode
package-lock.json
\ No newline at end of file
# Registro de cambios
PLANTILLAS - Sistema de documentos administrativos
.:: Plantillas Formly Backend ::.
================================================
A continuación se detalla la instalación de la aplicación desde cero.
El presente manual fue probado en un servidor con Debian 9.
# INSTALACIÓN DESDE CERO
## 1. Instalación de paquetes mínimos
```sh
sudo apt-get update
sudo apt-get install build-essential libssl-dev
sudo apt-get install curl
sudo apt-get install ca-certificates
sudo apt-get install libfontconfig1-dev libfreetype6-dev fontconfig
sudo apt-get install unzip
sudo apt-get install git
```
Si no se cuenta con un servidor LDAP externo, para instalar realizar lo siguiente:
```sh
sudo apt -y install slapd ldap-utils
```
Se puede verificar y validar la instalación con el siguiente comando, que desplega la estructura de la configuración.
```sh
sudo slapcat
dn: dc=agetic,dc=gob,dc=bo
objectClass: top
objectClass: dcObject
objectClass: organization
o: agetic.gob.bo
dc: agetic
structuralObjectClass: organization
entryUUID: 71da7e0e-d7ac-1039-9bfa-61fe9051f214
creatorsName: cn=admin,dc=agetic,dc=gob,dc=bo
createTimestamp: 20200130130159Z
entryCSN: 20200130130159.199740Z#000000#000#000000
modifiersName: cn=admin,dc=agetic,dc=gob,dc=bo
modifyTimestamp: 20200130130159Z
....
```
Configurar la estructura del sistema de acuerdo a su Entidad, revisar la documentación [OpenLdap](https://www.openldap.org).
Se recomienta utilizar un cliente para la administración del ldap
- [Apache Directory](https://directory.apache.org/).
- [phpLdapAdmin](http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page).
**Nota Importante: Se recomienda utilizar la versión última del LDAP, que específicamente incorpore el protocolo TLS versión 1.2, debido a que la versión de node 12.x no soporta versiones anteriores.**
## 2. Instalación de PostgreSql
```sh
sudo apt-get install postgresql-9.6
```
Crear la base de datos
```sh
# Cambio al usuario root
sudo su
# Acceso al usuario postgres
su postgres
# Acceso a línea de comandos de postgres
psql
```
Cambio de contraseña desde línea de comandos de postgres
```sql
ALTER ROLE miUsuario PASSWORD 'miSuperPassword';
```
Reiniciar el servicio desde el usuario de la máquina virtual ([miUsuarioSistema])
```sh
sudo /etc/init.d/postgresql restart
```
Creando la base de datos
```sh
sudo su
su postgres
su psql
```
```sql
CREATE DATABASE miBaseDeDatos OWNER miUsuario;
```
Lista las bases de datos existentes, verificar si __miBaseDeDatos__ está en la lista.
```sql
\l
\q
```
## 3. Instalación de Node, Node Version Manager NVM
```sh
# Instalar nvm, via curl
curl https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
# Una vez finalizada REINICIAR la terminal para verificar la instalación
nvm --version
```
Instalación de Node v12.4.1 LTS
```sh
nvm install 12.14.1
nvm use 12.14.1
# Verificar la instalación
node --version
```
Instalación de dependencias globales para base de datos vía npm
```sh
npm i -g sequelize sequelize-cli
npm i -g pg pg-hstore
npm i -g apidoc
```
## 4. Descargar el proyecto
```sh
git clone <url-repositorio_proyecto_plantillas_backend>
cd <directorio_proyecto_plantillas_backend>
```
## 5. Instalación de la Fuente
```sh
# Crear una nueva carpeta
sudo mkdir /usr/share/fonts/truetype/opensans
```
Copiar la fuente desde __recursos/open-sans.zip__ a __/usr/share/fonts/truetype/opensans__
```sh
sudo cp recursos/open-sans.zip /usr/share/fonts/truetype/opensans
cd /usr/share/fonts/truetype/opensans
sudo unzip open-sans.zip
cd -
```
## 6. Archivos de configuración
```sh
# Archivo de configuración para la base de datos
cp src/config/config.json.sample src/config/config.json
# Archivo de configuración para el sistema, conexion ldap, variables de sistema
cp src/config/config.js.sample src/config/config.js
```
## 7. Instalar dependencias e inicializar la db
```sh
# Instalar las dependencias del proyecto
npm i
# Modificar los sequelize handlers del proyecto
npm run parchar
# Inicializar la base de datos y poblar la base de datos
npm run setup
```
## 8 Ejecución de la aplicación
- Modo desarrollo
```sh
npm start
```
o si prefiere usar nodemon:
***Usando nodemon***
```sh
# Para este caso es necesario tener instalado nodemon de manera global
# npm i nodemon -g
npm run startdev
```
Para más información sobre [__NODEMON__](https://nodemon.io/)
- Modo producción
** Para este modo revise la configuración en src/config/config.json en la sección __production__
```sh
# Instalar pm2
npm i -g pm2
# Iniciar el proyecto
pm2 start prod.json
# Listar todas las aplicaciones en ejecución, ahi estará la aplicación plantillas-backend
pm2 list
```
Configurar el autoinicio, solo la primera vez
```sh
# Configurar el autoinicio
pm2 startup
# Generara un comando Similar al siguiente
# [PM2] To setup the Startup Script, copy/paste the following command:
# sudo env PATH=$PATH:/home/miUsuario/.nvm/versions/node/v12.14.1/bin /home/miUsuario/.nvm/versions/node/v12.14.1/lib/node_modules/pm2/bin/pm2 startup systemd -u d3x --hp /home/miUsuario
# Ejecutamos el comando que nos genero sudo env PATH=$PATH:/ho......
# Luego ejecutamos, que guarda la lista de procesos
pm2 save
```
Para más información sobre [__PM2__](https://pm2.keymetrics.io/)
## Modalidad de autenticación.
La autenticación se puede configurar de tres formas diferentes:
a. Haciendo uso sólamente de la autenticación del sistema.
b. Haciendo uso del servicio de autenticación LDAP.
c. Haciendo uso del servicio de autenticación de Ciudadanía Digital.
Las tres opciones son excluyentes.
### a. Haciendo uso sólamente de la autenticación del sistema.
Para esto se puede dejar el código tal cual está. Sin embargo, se recomienda eliminar en el archivo ***/src/routes/seguridad/jwtokenRT.js*** las líneas 228 a la 233, que si bien son líneas comentadas, una vez en producción no serán de utilidad.
### b. Haciendo uso del servicio de autenticación LDAP.
Para poder usar esta configuración, se debe realizar lo siguiente:
> Editar el archivo ***/src/routes/seguridad/jwtokenRT.js***, en el segmento de cógido (líneas 228-237) que contiene lo siguiente :
```sh
228 // La siguiente línea trabaja con LDAP, realiza una autenticación con el servidor LDAP y si el usuario no existe en el sistema, lo adiciona a partir de la información
229 // del servidor LDAP. Descomentar la línea y comentar app.post("/autenticar", (req,res) => {
230 // app.post("/autenticar", interceptar, (req,res) => {
231
232 // La siguiente línea trabaja directamente con el sistema, es una autenticación directa con la base de datos del sistema. Funcionará si la línea app.post("/autenticar", interceptar, (req,res) => {
233 // está comentada.
234 app.post("/autenticar", (req,res) => {
235 xautenticacion(req, res, 1);
236 });
237
```
> Tal como lo explican los comentarios, se debe descomentar la línea 230 y en su lugar comentar la línea 234. Para la puesta en producción, se deben eliminar las líneas 228, 229, 231, 232, 233 y 234. Quedando así, el siguiente segmento de código:
``` sh
app.post("/autenticar", interceptar, (req,res) => {
xautenticacion(req, res, 1);
});
```
Se requiere de la configuración de LDAP, que ya fue explicada en este archivo.
### c. Haciendo uso del servicio de autenticación de Ciudadanía Digital.
Para esta opción, en el archivo ***/src/routes/seguridad/jwtokenRT.js***, eliminar las líneas 40 a la 251. Es decir, todo lo referente a la ruta de "/autenticar". Es importante eliminar estas líneas, para la seguridad y el correcto funcionamiento del sistema.
Requiere de la configuración de LDAP, que ya fue explicada en este archivo.
## Usuarios de prueba
Con el propósito de realizar pruebas, con la ejecución los seeders, se está habilitando el usuario ***sys_default***, con el rol de ADMIN para que dicho usuario pueda realizar la configuración general del sistema, como por ejemplo el alta a otros usuarios con rol admin y demás.
Para el modo LDAP o Ciudadanía Digital es necesario que se cuente con un usuario LDAP habilitado para el usuario por defecto, donde se pide que el nombre de usuario sea: sys_default y la contraseña por defecto: Developer.
A continuación el ejemplo de la configuración del usuario sería de la siguiente manera:
```sh
dn: uid=sys_default,ou=usuarios,dc=nodomain
objectClass: top
objectClass: inetOrgPerson
uid: sys_default
structuralObjectClass: inetOrgPerson
entryUUID: 1afa454c-d7e3-1039-9933-b525709c0f84
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20200130193315Z
userPassword:: e01ENX1aeXl2Si9VMlBjZ3p2YVVKbDNYb2tRPT0=
cn: Sys
sn: Default
description: Usuario por defecto del sistema
employeeNumber: 1
employeeType: ninguno
givenName: Sys
mail: sys@local.com
o: ENTIDAD
ou: UNIDAD
registeredAddress: sys@local.com
telephoneNumber: 000000
title: CARGO
entryCSN: 20200130194031.077493Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20200130194031Z
```
**NOTA IMPORTANTE:** Luego de realizar las pruebas necesarias se recomienda dar de baja al usuario respectivo.
#### * Extra
- Si se presenta algun error relacionado con el uso de "libfontconfig0" por parte de phantom.js, instalar el mismo con:
```sh
sudo apt-get install libfontconfig1-dev
```
- Si se presenta el error "Can't find Python executable python", instalar python con:
```sh
sudo apt-get install python
```
- En la carpeta /public/images reemplazar las imágenes logo.svg, membrete.png a usar de manera predeterminada.
- membrete.png ancho: 574 píxeles, alto: 801 píxeles
- logo.svg ancho: 200 píxeles, alto: 80 píxeles
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
## Sistema de documentos administrativos (Plantillas)
1. Objetivos del sistema
a. Objetivo Principal
El objetivo del sistema de documentos administrativos es tener una mejor administración de los documentos generados en la entidad, mediante el uso de tecnologías “open source” para la generación dinámica de documentos en base a plantillas configurables.
b. Objetivos Secundarios
- Desarrollar un motor de plantillas que permita la configuración de documentos.
- Desarrollar un módulo de asignación y control de CITE’s, basados por unidad y tipo de documento
- Desarrollar módulo de historicos que permite obtener informacion sobre el flujo de un documento
- Desarrollar los medios que permitan a un documento seguir los flujos establecidos.
- Desarrollar módulo de presupuesto, para el control de las partidas presupuestarias
2. Tecnologías Utilizadas
Las Tecnologías utilizadas en el desarrollo de sistema son :
- NodeJS como entorno base de desarrollo para ambos casos.
BACKEND:
- ExpressJS como servidor de aplicaciones web.
- PostgreSQL como gestor de bases de datos.
- Sequelize como ORM(Object-Relational mapping).
- Passport JWT como mecanismos de autenticación.
- Babel compilador de ECMA6 a ECMA5
- MomentJS manejador de la generacion de datos tipo fecha,hora,segundos,etc.
- Uuid(v4) generador aleatorio de caracteres.
- helmet como herramienta de configuración de seguridad.
FRONTEND:
- Gulp como medio de automatización de tareas.
- Angular(v1.5) como entorno base
- Angular-Material como medio de desarrollo de la interfaz de usuario(maquetación)
- Angular-Formly como generador de componentes(Plantilla)
- html como herramienta de maquetación web
- css como herramienta de estilos
3. Autenticación
La autenticación se puede configurar:
- Haciendo uso del servicio de autenticación de Ciudadanía Digital.
- Haciendo uso del servicio de autenticación LDAP.
- Haciendo uso de la autenticación del sistema.
Las tres opciones son excluyentes.
4. Firma digital
Para darle validez a toda la documentación generada en el sistema, la misma deberá ser firmada por los actores de cada documento. Para este efecto se usará FIRMATIC (Ver documentación en el repositorio)
5. Frontend
Este proyecto depende directamente de un frontend cuyo código se halla en este mismo repositorio (revise el proyecto_plantillas_frontend)
6. Instalación del backend
Para la instalación del proyecto backend revise el archivo [INSTALL.md](INSTALL.md).
Es importante mencionar que el proyecto backend debe ser instalado antes que el frontend.
7. Manual de usuario
El manual de usuario se encuentra en la carpeta ***docs*** del presente proyecto.
\ No newline at end of file
## DESARROLLO
Para realizar un control integral del presupuesto se desarrollo el "__Módulo de Presupuesto__" en el sistema de Plantillas el cual, esta disponible en los roles de “_Configurador de Plantillas_” y “_Usuario_” a continuación se describe las opciones disponibles:
1. ### ROL DE CONFIGURADOR DE PLANTILLAS
En el Menú de creación de Plantillas se habilitara un componente web llamado "__Caja chica__", que debe ser insertado en la plantilla el cual contiene las siguientes modalidades de funcionamiento:
- GESTIÓN DE PARTIDAS: Habilita al componente para registrar el presupuesto inicial de determinadas partidas presupuestarias y/o las modificaciones presupuestarias a las mismas.
- COMPROMETIDO: Habilita al componente para registrar presupuesto comprometido.
- PAGADO: Habilita al componente para pagar partidas comprometidas.
2. ### ROL DE USUARIO
Para los usuarios del sistema de plantillas, una vez ingresando al sistema se le mostraran las 3 nuevas plantillas con una modalidad específica realizada por el configurador de Plantillas, a continuación se describen las modalidades:
#### GESTIÓN DE PARTIDAS PRESUPUESTARIAS
Seleccionando las opción de:
- INICIAR PARTIDAS: Debe llenar los datos de Partida (Número de la Partida Prespuestaria), Descripción (Nombre Referencial de la Partida) y Monto Inicial, en el cual tiene una validación para que no se pueda agregar la misma partida ya iniciada.
- MODIFICAR PARTIDAS: Debe agregar una Partida mediante el buscador de Partidas Presupuestarias, posteriormente llenar la Descripción y Monto. El Monto introducido es la afectación de adición (Valores Positivos) o resta (Valores Negativos) a la Partida Seleccionada, donde la validación condiciona a que la partida inicial o actual no tenga valor negativo después de una resta.
#### COMPROMETIENDO PRESUPUESTO
Con el buscador de partidas el usuario debe seleccionar las partidas a ser comprometidas en el documento, posteriormente puede agregar un _detalle_ y un _monto positivo_. El sistema automáticamente validará que no se pueda comprometer más allá del presupuesto actual de una partida.
Se puede crear comprometidos de dos tipos:
- SIMPLE: Opción por defecto, el valor comprometido se cerrará con un solo pago si queda saldo este será transferido al presupuesto de la partida actual.
- MÚLTIPLE: Con esta opción el valor comprometido se cerrará tras múltiples pagos, para ello seleccionar la opción _Pagado múltiple_,
#### PAGANDO PRESUPUESTO
El usuario con el buscador de Documentos por CITE, debe seleccionar un documentos donde comprometió presupuesto y el sistema agregará de manera inmediata las partidas comprometidas que no fueron pagadas o finalizadas de dicho documento, posteriormente en la columna _Pagado_ se introducirá
los montos a pagar.
En el caso de Pago Múltiple, un pago múltiple sera finalizado cuando se establezca un pago de valor 0.
#### REVERSIÓN DE PRESUPUESTO
Para realizar una reversión de un valor comprometido de pago simple o múltiple, se debe realizar un pago del valor comprometido con monto de valor 0.
\ No newline at end of file
# .:: Plantillas Formly Backend ::.
A continuación se detalla la actualización de la aplicación.
## A. ACTUALIZACIÓN DE LA APLICACIÓN
Ejecutar el siguiente comando en el directorio <directorio_proyecto_plantillas_backend>:
```
git pull origin master
```
## B. INSTALACION DE DEPENDENCIAS
Ejecutar el siguiente comando en el directorio <directorio_proyecto_plantillas_backend>:
```
npm install
```
## C. APLICAR LAS MIGRACIONES
Ejecutar si fuera necesario,
```
npm run migrar
```
## D. REINICIAR EL SERVICIO
```
pm2 restart plantillas-backend
```
/**
Archivo con los metodos necesarios para la asignacion de un administrador
introducido por parametro e inactivacion del administrador por defecto.
*/
const Promise = require('bluebird');
const {Client} = require('pg');
const config = require(`${__dirname}/src/config/config`)().database;
console.log('Revisnado el config obtenido', config);
const configDB = `${config.params.dialect}://${config.username}:${config.password}@${config.params.host}:${config.params.port}/${config.name}`;
const pgCliente = new Client(configDB);
pgCliente.connect();
const usuario = JSON.parse(process.env.npm_config_argv).remain[0];
const fecha = new Date();
const fechaEnviar = `${fecha.getFullYear()}-${fecha.getMonth()+1}-${fecha.getDate()}`;
// Inactiva al usuario admin por defecto.
ejecutarConsulta("UPDATE usuario SET estado = 'INACTIVO' WHERE usuario = 'admin';")
.then(() =>
// Busca el identificador del usuario.
ejecutarConsulta(`SELECT id_usuario from usuario where usuario ='${usuario}'`)
.then(pRespuestaUsuario => {
if(pRespuestaUsuario.length>0){
// Valida si el usuario ya posee el rol.
return ejecutarConsulta(`SELECT fid_usuario FROM usuario_rol WHERE fid_usuario=${pRespuestaUsuario[0].id_usuario} AND fid_rol=1;`)
.then(pRespuestaRol => {
// Si el usuario ya posee el rol administrador.
if(pRespuestaRol.length>0){
console.log(`El usuario ${usuario} ya cuenta con los privilegios de administrador.`);
pgCliente.end();
}
// Si no posee el rol administrador.
else{
// Crea la relacion usuario-rol para otorgar rol administrador.
return ejecutarConsulta(`INSERT INTO usuario_rol(fid_usuario, fid_rol, estado, _usuario_creacion, _fecha_creacion,_fecha_modificacion)
VALUES (${pRespuestaUsuario[0].id_usuario}, 1, 'ACTIVO', 1,'${fechaEnviar}','${fechaEnviar}');`)
.then(pRespuestaCrear => {
console.log(`El usuario ${usuario}, ahora posee los privilegios de administrador.`);
pgCliente.end();
})
}
})
}
else {
console.log(`El usuario ${usuario} no existe, verifique la informacion introducida.`);
pgCliente.end();
}
})
)
.catch(pError => {
console.log("Error al ejecutar la consulta", pError);
pgCliente.end();
})
/**
Funcion que ejecuta una promesa.
@param {pConsulta} Texto Cadena que contiene la consulta a ejecutar.
@return retorna una promesa.
*/
function ejecutarConsulta(pConsulta){
return new Promise((resolve,reject) => {
pgCliente.query(pConsulta)
.then(resp => {
if(resp.command == 'UPDATE') (resp.rowCount ==1)? resolve(true):resolve(false);
else if(resp.command == 'INSERT') (resp.rowCount ==1)?resolve(true):resolve(false);
else resolve(resp.rows);
})
.catch(errorQuery => {
console.log('Error en el query', errorQuery);
resolve(false);
});
});
}
# Estados HTTP
## 1xx Respuestas Informativas:
| Código | Estado | Descripción |
| :-------------: |:-------------:| :-----|
|100| Continuar | El navegador puede continuar realizando su petición (se utiliza para indicar que la primera parte de la petición del navegador se ha recibido correctamente). |
|101|Conmutación de protocolos | El servidor acepta el cambio de protocolo propuesto por el navegador (puede ser por ejemplo un cambio de HTTP 1.0 a HTTP 1.1). |
|102| Procesando (WebDav) | EL servidor está procesando la petición del navegador pero todavía no ha terminado (esto evita que el navegador piense que la petición se ha perdido cuando no recibe ninguna respuesta).|
|103| Punto de control| Se va a reanudar una petición POST o PUT que fue abortada previamente.|
## 2xx Peticiones Correctas:
| Código | Estado | Descripción |
| :-------------: |:-------------:| :-----|
|200 | OK | Respuesta estándar para peticiones correctas.|
|201|Creado|La petición ha sido completada y ha resultado en la creación de un nuevo recurso.|
|202|Aceptado| La petición ha sido aceptada para procesamiento, pero este no ha sido completado. La petición eventualmente pudiere o ser satisfecha, ya que podría ser no permitida o prohibida cuando el procesamiento tenga lugar.|
|203|Información no autorizada|La petición se ha completado con éxito, pero su contenido no se ha obtenido de la fuente originalmente solicitada sino de otro servidor.|
|204|Sin contenido|La petición se ha completado con éxito pero su respuesta no tiene ningún contenido( la respuesta sí que puede incluir información en sus cabeceras HTTP).|
|205|Reiniciar contenido|La petición se ha completado con éxito, pero su respuesta no tiene contenidos y además , el navegador tiene que inicializar la pagina desde la que se realizó la petición(uso en paginas con formularios cuyo contenido debe borrarse después de que el usuario lo envié).|
|206|Contenido parcial|La petición servirá parcialmente el contenido solicitado. Esta característica es utilizada por herramientas de descarga como wget para continuar la transferencia de descargas anteriormente interrumpidas o para dividir una descarga y procesar las partes simultáneamente.|
|207|Multi-estado WebDav|El cuerpo del mensaje que sigue es un mensaje xml y puede contener algún número e códigos de respuesta separados, dependiendo de cuántas sub-peticiones sean hechas.|
|208|Ya registrado WebDav|El listado de elementos dav ya se notifico previamente, por lo que no se van a volver a listar.|
## 3xx Redirecciones:
| Código | Estado | Descripción |
| :-------------: |:-------------:| :-----------|
|300|Múltiples opciones|Indica opciones múltiples para el URI que el cliente podría seguir. Ejemplo, representar distintas opciones de formato para vídeo, listar archivos con distintas extensiones o word sense disambiguation.|
|301|Movido permanentemente|Esta y todas las peticiones futuras deberían ser dirigidas a la URI dada.|
|302|Encontrado|Indica el estado sobre el re-direcionamiento de una pagina o documento web.|
|303|Ver otros|La respuesta a la petición puede ser encontrada bajo otra URI utilizando el método GET.(desde HTTP 1.1).|
|304|Sin modificación|Indica que la petición a la URL no ha sido modificada desde que fue requerida por última vez. Típicamente el cliente HTTP provee un encabezado como if-Modified-Since para indicar una fecha y hora actual contra el cual el servidor pueda comparar.|
|305|Use proxy|El documento solicitado debería recuperarse mediante el proxy listado en la cabecera “Location”. Muchos clientes HTTP no se apegan a este estándar por motivos de seguridad; Estas respuestas solo deben generarse por servidores de origen.|
|307|Redirección temporal|Se trata de una redirección que debería haber sido hecha con otra URI, sin embargo aún puede ser procesada con la URI proporcionada. En contraste con la 303 el método no debería ser cambiado cuando el cliente repita la solicitud.|
|308|Redirección permanente|El recurso solicitado por el navegador se encuentra en otro lugar y este cambio es permanente. A diferencia del 301, no se permite cambiar el método HTTP para la nueva petición.|
## 4xxx Errores del Cliente:
| Código | Estado | Descripción |
| :-------------: |:-------------:| :-----------|
|400|Mala solicitud|La solicitud contiene sintaxis errónea y no debería repetirse.|
|401|No autorizado|Similar al 403, pero específicamente para su uso cuando la autentificación es posible pero ha fallado o aun no ha sido provista.|
|402|Pago obligatorio|La intención original era que este código pudiese ser usado como parte de alguna forma o esquema de dinero electrónico - - nunca se lo uso.|
|403|Prohibido|La solicitud fue legal, pero el servidor rehúsa responderla dado que el cliente no tiene los privilegios para hacerla.|
|404|No se encontró|Recurso no encontrado. Se utiliza cuando el servidor web no encuentra la pagina.|
|405|Método no permitido|Una petición fue hecha a una URI utilizando un método de solicitud no soportado por dicha URI.|
|406|No aceptable|El servidor no es capaz de devolver los datos en ninguno de los formatos aceptados por el cliente, indicados por éste en la cabecera “Accept” de la petición.|
|407|Requiere autenticación de proxy|Parecido al 401, pero el cliente deberá primero autenticarse con el proxy.|
|408|Tiempo de solicitud agotado|El cliente falló al continuar la petición. Excepto durante la ejecución de vídeos adobe flash cuando solo significa que el usuario cerro la ventana de vídeo o se movió a otro.|
|409|Conflicto|Indica que la solicitud no pudo ser procesada debido a un conflicto con el estado actual del recurso que esta identifica.|
|410|Sin disponibilidad|Indica que el recurso solicitado ya no esta disponible y no lo estará de nuevo. Deberia ser utilizado cuando un recurso ha sido quitado de forma permanente.|
|411|Requiere longitud de contenido|El servidor rechaza la petición del navegador porque no incluye la cabecera “Content-Length” adecuada.|
|412|Error de Pre-condicion|El servidor no es capaz de cumplir con algunas de las condiciones impuestas por el navegador.|
|413|Entidad de solicitud demasiado grande|La petición es demasiado grande y por ese motivo el servidor no la procesa.|
|414|URI de solicitud demasiado larga|La URI de la petición del navegador es demasiado grande y por ese motivo el servidor no la procesa.|
|415|Tipo de medio no soportado|La petición del navegador tiene un formato que no entiende el servidor.|
|416|Pedido fuera de rango|El cliente a preguntado por una parte de un archivo, pero el servidor no puede proporcionar esa parte.|