> For the complete documentation index, see [llms.txt](https://documentacion.prutopia.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://documentacion.prutopia.io/arquitectura/protocolo/experience-smart-contract.md).

# Experience Smart Contract

Este contrato almacena todas las Experiencias Laborales y Educativas del usuario.

#### Estructura

```solidity
struct Experience {
    uint256 experienceId;
    address user;
    uint8 experienceType;
    string role;
    string description;
    string company;
    address companyAddress;
    uint256 startDate;
    uint256 endDate;
    bool companyValidation;
    Skill[] skills;
    string moreInfoLinks;
}
struct Skill {
    string skill;
    uint8 level;
}
```

Ejemplo

```json
{
  "experienceId": 1,
  "user": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
  "experienceType": 0,
  "role": "Developer",
  "description": "Fullstack Blockchain Developer",
  "company": "",
  "companyAddress": "0xea83c649dd49a6ec44c9e2943eb673a8fbb7bab6",
  "startDate": 1704078000,
  "endDate": 1717124400,
  "companyValidation": true,
  "skills": [
    {
      "skill": "Javascript",
      "level": 8
    },
    {
      "skill": "English",
      "level": 0
    }
  ],
  "moreInfoLink": "ipfs://ipfs.io/XXXXXXX" 
}
```

#### Semántica de los campos

* experienceId: Identificador de la Experiencia. Este valor es asignado correlativamente por el Smart Contract.
* user: Dirección del usuario. Propietario del registro.
* experienceType: Tipo de la Experiencia (0 = Profesional, 1 = Educativa).
* role: Nombre del rol.
* description: Describe el rol con más detalles.
* company: Nombre de la empresa/institución. Es solo descriptivo; esta experiencia no puede ser verificada si se utiliza este campo. Debe estar vacío si se proporciona una dirección de la empresa o si la experiencia es freelance.
* companyAddress: Dirección de la empresa/institución. Debe ser proporcionada por la empresa/institución misma. Debe ser diferente de la dirección del usuario. El propietario de esta dirección puede verificar la Experiencia. Puede estar vacío si la empresa/institución no tiene dirección o si la experiencia es freelance.
* startDate: Fecha en que comenzó la Experiencia. Almacenar como Timestamp Unix (segundos desde el 01-01-1970). Campo obligatorio.
* endDate: Fecha en que terminó la Experiencia. Almacenar como Timestamp Unix (segundos desde el 01-01-1970). Puede ser 0 si la Experiencia aún no ha terminado. Debe ser 0 si la Experiencia es freelance. Debe ser mayor que startDate.
* companyValidation: Si se proporciona una companyAddress, el propietario de esta puede validar la Experiencia.
* skills: Habilidades usadas en esta experiencia.
* moreInfoLink: Enlace a una metadata opcional. Tipicamente este enlace apuntará a un JSON con diferentes campos para cualquier tipo de metadata (fotos, videos, campos informativos, etc)

### Funciones

**addExperience:** Agrega una nueva experiencia.

**updateExperience:** Actualiza una experiencia existente.&#x20;

**endExperience:** Finaliza una experiencia existente.

**deleteExperience:** Elimina una experiencia existente.

**updateExperienceValidation:** Valida una experiencia existente.

### Reglas de validación

A continuación se presentan varias reglas que una Experiencia debe seguir para garantizar un estado consistente. Esto se aplica a las operaciones addExperience, updateExperience y endExperience:

1. La dirección del usuario (*user*) debe ser diferente de la dirección cero.
2. El tipo de Experiencia (*experienceType*) debe ser 0 (Profesional) o 1 (Educativa).
3. El rol (*role*) no debe estar vacío.
4. Debe especificarse un nombre de empresa (*company*) o una dirección de empresa (*companyAddress*) para experiencias no freelance (uno u otro, no ambos).
5. La dirección del usuario debe ser diferente de la dirección de la empresa (*companyAddress*).
6. La experiencia freelance (sin nombre de empresa ni dirección de empresa) no debe tener endDate.
7. StartDate no debe estar vacío.
8. EndDate debe ser mayor que startDate.
