# Actualizar Imagen de Perfil del Usuario (1) - [update-img-user]

## 🧾 Descripción

*Actualiza la imagen de perfil de un usuario en ERPNext.*  
*El proceso incluye:*

1. Recepción de un archivo enviado desde la app.
2. Subida del archivo al endpoint de ERPNext: <span style="color: rgb(224, 62, 45);">**`method/upload_file`**</span>.
3. Obtención de la URL generada del archivo.
4. Actualización del campo <span style="color: rgb(224, 62, 45);">**`user_image`** </span>del **User**.
5. Actualización del campo <span style="color: rgb(224, 62, 45);">**`image`** </span>en el **Employee** asociado (si existe).

---

# 🚀 Endpoint

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-post-%2Fupdate-img-use"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr"><span style="color: rgb(224, 62, 45);">**`POST <span class="hljs-operator">/</span><span class="hljs-keyword">update</span><span class="hljs-operator">-</span>img<span class="hljs-operator">-</span><span class="hljs-keyword">user</span>`**</span></div></div>> La ruta exacta dependerá del archivo de rutas Laravel (<span style="color: rgb(224, 62, 45);">**`api.php`**</span>).

---

# 🔐 Seguridad

- La función no valida sesión o token, pero el endpoint llamado en ERPNext usa **cookies de sesión Guest**, lo que indica que debe usarse desde un backend confiable.
- Se recomienda protegerla en la API propia.

---

# 📥 Request (Multipart / Form-Data)

### Campos requeridos

<div class="_tableContainer_1rjym_1" id="bkmrk-campo-tipo-requerido"><div class="group _tableWrapper_1rjym_13 flex w-fit flex-col-reverse" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="1230" data-start="987"><thead data-end="1030" data-start="987"><tr data-end="1030" data-start="987"><th data-col-size="sm" data-end="996" data-start="987">Campo</th><th data-col-size="sm" data-end="1003" data-start="996">Tipo</th><th data-col-size="sm" data-end="1015" data-start="1003">Requerido</th><th data-col-size="md" data-end="1030" data-start="1015">Descripción</th></tr></thead><tbody data-end="1230" data-start="1075"><tr data-end="1138" data-start="1075"><td data-col-size="sm" data-end="1084" data-start="1075">file</td><td data-col-size="sm" data-end="1091" data-start="1084">file</td><td data-col-size="sm" data-end="1103" data-start="1091">Sí</td><td data-col-size="md" data-end="1138" data-start="1103">Imagen a subir (jpg, png, etc.)</td></tr><tr data-end="1230" data-start="1139"><td data-col-size="sm" data-end="1148" data-start="1139">user</td><td data-col-size="sm" data-end="1157" data-start="1148">string</td><td data-col-size="sm" data-end="1166" data-start="1157">Sí</td><td data-col-size="md" data-end="1230" data-start="1166">Nombre del usuario en ERPNext para actualizar (`User.name`).</td></tr></tbody></table>

</div></div>### Ejemplo (form-data)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--3"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">``</div></div><table border="1" id="bkmrk-file%3A-avatar.png-use" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`file: avatar.png<span class="hljs-keyword">user</span>: <span class="hljs-keyword">user</span><span class="hljs-variable">@example</span>.com`</td></tr></tbody></table>

---

# 📤 Responses

## ✔️ 200 – Imagen actualizada correctamente

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--5"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div><table border="1" id="bkmrk-%7B-%22valor%22%3A-true%2C-%22ms" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"valor"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Imagen de usuario actualizado correctamente"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> ... <span class="hljs-punctuation">}</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

---

## ❌ 400 – Faltan datos o error al subir archivo

Ejemplo de error al no recibir archivo:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--7"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div><table border="1" id="bkmrk-%7B-%22msn%22%3A-%22file-could" style="border-collapse: collapse; width: 100%; height: 29.6px;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr style="height: 29.6px;"><td style="height: 29.6px;">`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"File could not be processed"</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

---

## ❌ 500 – Error de carga o actualización

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--9"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div><table border="1" id="bkmrk-%7B-%22valor%22%3A-false%2C-%22m" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"valor"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Error al actualizar la imagen de usuario"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> ... <span class="hljs-punctuation">}</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

---

# 🧩 Lógica Interna

### 1. **Lectura del archivo**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-%24cfile-%3D-new-%5Ccurlfi"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"></div></div><div class="overflow-y-auto p-4" dir="ltr"></div><div class="overflow-y-auto p-4" dir="ltr"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-variable">$cfile</span> = <span class="hljs-keyword">new</span> <span class="hljs-title class_">\CURLFile</span>(<span class="hljs-variable">$_FILES</span>[<span class="hljs-string">"file"</span>][<span class="hljs-string">'tmp_name'</span>], <span class="hljs-variable">$_FILES</span>[<span class="hljs-string">"file"</span>][<span class="hljs-string">'type'</span>], <span class="hljs-variable">$_FILES</span>[<span class="hljs-string">"file"</span>][<span class="hljs-string">'name'</span>]);`</td></tr></tbody></table>

</div></div>### 2. **Subida a ERPNext**

- Endpoint usado: `POST /method/upload_file`

- Cabecera usada: `<span class="hljs-section">Cookie: full_name=Guest; sid=Guest; system_user=no; user_id=Guest; user_image=</span>`

> ⚠️ Se sube el archivo como usuario Guest.

### 3. **Validación de respuesta**

Debe existir: `message.file_url`

Si no existe → error.

### 4. **Actualizar información del User**

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--11"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div><table border="1" id="bkmrk-put-resource%2Fuser%2F%7Bu" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`PUT resource/<span class="hljs-keyword">User</span>/{<span class="hljs-keyword">user</span>}{  "user_image": "<file_url>"}`</td></tr></tbody></table>

### 5. **Actualizar Employee si corresponde**

- Busca Employee cuyo <span style="color: rgb(224, 62, 45);">**`user_id`** </span>coincida:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-select-user_id%2C-name"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">SELECT</span> user_id, name <span class="hljs-keyword">FROM</span> tabEmployee <span class="hljs-keyword">WHERE</span> user_id <span class="hljs-operator">=</span> {<span class="hljs-keyword">user</span>}`</div></div>Si existe:

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-put-resource%2Femploye"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-type">PUT</span> resource<span class="hljs-regexp">/Employee/</span>{employee_id}{  <span class="hljs-string">"image"</span>: <span class="hljs-string">"<file_url>"</span>}`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>---

# 📚 Request/Response Schemas

### Request (multipart/form-data)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--13"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div><table border="1" id="bkmrk-file%3A-file-user%3A-str" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-symbol">file:</span> File<span class="hljs-symbol">user:</span> <span class="hljs-type">string</span>`</td></tr></tbody></table>

### Response (success)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk--14"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div><table border="1" id="bkmrk-%7B-%22valor%22%3A-true%2C-%22ms-1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`<span class="hljs-punctuation">{</span>  <span class="hljs-attr">"valor"</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"msn"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Imagen de usuario actualizado correctamente"</span><span class="hljs-punctuation">,</span>  <span class="hljs-attr">"data"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-attr">"user_image"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"url_file"</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">}</span>`</td></tr></tbody></table>

---

# 🧪 Ejemplo de uso (curl)

<div class="contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary" id="bkmrk-curl--x-post-https%3A%2F"><div class="sticky top-9"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs"><table border="1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>`curl -X POST https://midominio.com/api/update-img-user \  -F <span class="hljs-string">"file=@/home/user/avatar.png"</span> \  -F <span class="hljs-string">"user=user@example.com"</span>`</td></tr></tbody></table>

</div></div></div><div class="overflow-y-auto p-4" dir="ltr"></div></div>