Introducción
La importación masiva de pedidos te permitirá crear numerosos pedidos directamente desde la interfaz de WOOP, y esto, en pocos clics.
Esta funcionalidad es accesible desde la página de entrega, a través del botón "acción" situado en la parte superior derecha de las entregas.
Una vez seleccionada la funcionalidad, se deberán completar varios campos:
- Cadena comercial: Entidad para la cual deseas generar pedidos (el campo estará preseleccionado si tienes una cuenta configurada en un contexto de cadena comercial)
- La importación de un archivo de pedido: Archivo que servirá de base para la generación de los pedidos
- Modelos: Se trata de modelos de archivo para guiarte en la generación de los pedidos (Si no estás familiarizado con el formato JSON, te recomendamos obtener el formato CSV y abrirlo en Excel o Google GSheet).
Relleno del archivo de pedidos
Funcionamiento general
El archivo a importar se convierte en JSON (si el archivo recibido era de tipo CSV) y luego pasa por varias etapas de procesamiento. Estos procesos se realizan pedido por pedido:
- Transformación de los datos en JSON (si el archivo es un CSV)
- Recuperación de cada clave para registrar en la base de datos (campo entre paréntesis en el encabezado del CSV).
- Verificación para ver si los tipos de datos corresponden a lo esperado.
- Verificación para ver si todos los campos obligatorios de nuestra API tienen un valor.
- Si un punto de recogida/lugar de intercambio se indica como dirección de recogida o entrega, verificamos que realmente exista y recuperamos su información
Durante las diferentes etapas, verificamos los posibles errores del archivo y estos errores se almacenan para poder mostrarlos en el resultado de la importación del archivo, al final del procesamiento.
Una vez finalizadas estas verificaciones, los pedidos que no tienen ningún error se envían a nuestra API para ser registrados.
Cuando todos los pedidos están registrados, la interfaz pasa a la fase de resultado para informarte del número de pedidos validados y con error.
Relleno del archivo de pedidos
| Campos (* obligatorio) | Formato de datos | Comentarios | |
| Número de pedido (externalOrderId) |
36 caracteres máximo Cadena de caracteres |
Número único del pedido. Ej: ORDER12345678 Si no se completa, se genera un UUID |
|
| Número de referencia (referenceNumber) | Cadena de caracteres |
Referencia del pedido, puede ser idéntica al número de pedido Ej: REF12345678 |
|
| ID de la tienda (storeId)* | Cadena de caracteres |
ID de la tienda asociada al pedido Ej: 5412EE |
|
| Código de estado del pedido (state.code) |
Valores permitidos: ORDER_TO_BE_COMPLETED, ORDER_WITHOUT_SHIPMENT |
Ej: “ORDER_TO_BE_COMPLETED” | |
| ID de entrega (state.options.deliveryId) | Cadena de caracteres |
ID de entrega del pedido Ej: delivery1 |
|
| Números de paquete (state.options.parcelIds) | Lista de cadenas de caracteres |
Lista de ID de paquetes Ej: “parcel1,parcel14” |
|
| Tipo de lugar de recogida (picking.location.type)* |
Cadena de caracteres Valores permitidos: address, exchangePlace, pickupPoint |
Tipo de dirección del lugar de recogida Ej: pickupPoint Relleno automatizado si: - picking.location.id informado -> exchangePlance - picking.location.id + picking.location.carrierCode -> pickupPoint - Si no hay nada en picking.location.id & picking.location.carrierCode -> address |
|
| ID de lugar de recogida (picking.location.id) | Cadena de caracteres |
ID del lugar de recogida (si el tipo de dirección es exchangePlace o pickupPoint) Ej: FR00149 |
|
| Código transportista para punto de recogida (picking.location.carrierCode) | Cadena de caracteres |
Código del transportista (si el tipo de dirección es pickupPoint) Ej: mondial-relay |
|
| Dirección línea 1 de recogida (picking.location.addressLine1) | Cadena de caracteres |
Dirección completa del lugar de recogida Ej: 65 Rue de Luxembourg Si no se completa, recuperación de datos del punto de envió/tienda |
|
| Dirección línea 2 de recogida (picking.location.addressLine2) | Cadena de caracteres | Complemento de dirección | |
| ¿Ascensor? (picking.location.elevator) | Booleano |
Presencia de un ascensor Ej: true (si sí), false (si no) |
|
| Número de piso (picking.location.floor) | Número |
Piso del lugar de recogida Ej: 4 |
|
| Código de puerta (picking.location.doorCode) | Cadena de caracteres |
Código de la puerta del lugar de recogida Ej: 1234A |
|
| Código postal de recogida (picking.location.postalCode) | Cadena de caracteres |
Código postal del lugar de recogida Ej: 59800 Si no se completa, recuperación de datos del punto de envió/tienda |
|
| Ciudad de recogida (picking.location.city) | Cadena de caracteres |
Ciudad del lugar de recogida Ej: Lille Si no se completa, recuperación de datos del punto de envió/tienda |
|
| Barrio de recogida (picking.location.district) | Cadena de caracteres | Barrio del lugar de recogida | |
| País de recogida (picking.location.country) | Cadena de caracteres |
Código del país de recogida Ej: FR Si no se completa, recuperación de datos del punto de envió/tienda |
|
| Comentario (picking.location.comment) | Cadena de caracteres | ||
| Latitud (picking.location.coordinates.latitude) | Nombre | ||
| Longitud (picking.location.coordinates.longitude) | Nombre | ||
| Inicio intervalo de recogida (picking.interval.start)* | Datetime |
Ej: 2025-01-10T13:00:00 Es posible ingresar solo la fecha 2025-01-10, la hora de inicio de recogida será 00h por defecto |
|
| Fin intervalo de recogida (picking.interval.end)* | Datetime |
Ej: 2025-01-10T14:59:59 Es posible ingresar solo la fecha 2025-01-10, la hora de fin de recogida será 23h59 por defecto |
|
| Nombre contacto de recogida (picking.contact.firstName) | Cadena de caracteres |
Nombre del contacto del lugar de recogida Ej: Joe Si no se completa, se recuperan los datos del punto de envió/tienda |
|
| Apellido contacto de recogida (picking.contact.lastName) | Cadena de caracteres |
Apellido del contacto del lugar de recogida Ej: DOE Si no se completa, se recuperan los datos del punto de envió/tienda |
|
| Teléfono contacto de recogida (picking.contact.phone) | Cadena de caracteres |
Número de teléfono del contacto del lugar de recogida Ej: +33601020304 Si no se completa, se recuperan los datos del punto de envió/tienda |
|
| Email contacto de recogida (picking.contact.email) | Cadena de caracteres |
Dirección de email del contacto del lugar de recogida Ej: joedoe@gmail.com Si no se completa, se recuperan los datos del punto de envió/tienda |
|
| Idioma contacto de recogida (picking.contact.language) | Cadena de caracteres |
Código del idioma del contacto del lugar de recogida Ej: fr Si no se completa, se recuperan los datos del punto de envió/tienda |
|
| Zona horaria contacto de recogida (picking.contact.timezone) | Cadena de caracteres |
Zona horaria del contacto de recogida Ej: Europe/Paris Si no se completa, se recuperan los datos del punto de envió/tienda |
|
| ¿Contacto principal? (picking.contact.main) | Booleano | Ej: true (si sí), false (si no) | |
| Título contacto de recogida (picking.contact.title) | Cadena de caracteres | Ej: Manager | |
| ¿Contacto profesional? (picking.contact.isProfessional) | Booleano | Ej: true (si sí), false (si no) | |
| Nombre empresa contacto de recogida (picking.contact.companyName) | Cadena de caracteres | Ej: Woop | |
| Tipo de lugar de entrega (delivery.location.type) |
Cadena de caracteres Valores permitidos: address, exchangePlace, pickupPoint |
Tipo de dirección del lugar de entrega Ej: address Si se ingresa una dirección en delivery.location.addressLine1 -> llenado automático con el valor "address" |
|
| ID de lugar de entrega (delivery.location.id) | Cadena de caracteres | ID del lugar de entrega (si el tipo de dirección es exchangePlace o pickupPoint) | |
| Código transportista para punto de recogida - entrega (delivery.location.carrierCode) | Cadena de caracteres | Código del transportista (si el tipo de dirección es pickupPoint) | |
| Dirección línea 1 de entrega (delivery.location.addressLine1)* | Cadena de caracteres |
Dirección completa del lugar de entrega Ej: 65 Rue de Luxembourg |
|
| Dirección línea 2 de entrega (delivery.location.addressLine2) | Cadena de caracteres | Complemento de dirección | |
| ¿Ascensor? (delivery.location.elevator) | Booleano |
Presencia de un ascensor Ej: true (si sí), false (si no) |
|
| Número de piso (delivery.location.floor) | Número |
Piso del lugar de entrega Ej: 4 |
|
| Código de puerta (delivery.location.doorCode) | Cadena de caracteres |
Código de la puerta del lugar de entrega Ej: 1234A |
|
| Código postal de entrega (delivery.location.postalCode)* | Cadena de caracteres |
Código postal del lugar de entrega Ej: 59800 |
|
| Ciudad de entrega (delivery.location.city)* | Cadena de caracteres |
Ciudad del lugar de entrega Ej: Lille |
|
| Barrio de entrega (delivery.location.district) | Cadena de caracteres | Barrio del lugar de entrega | |
| País de entrega (delivery.location.country) | Cadena de caracteres |
Código del país de entrega Ej: FR Si no se completa, el país indicado en el punto de envió se completará automáticamente |
|
| Comentario (delivery.location.comment) | Cadena de caracteres | ||
| Latitud (delivery.location.coordinates.latitude) | Número | ||
| Longitud (delivery.location.coordinates.longitude) | Número | ||
| Inicio intervalo de entrega (delivery.interval.start)* | Datetime |
Ej: 2025-01-10T15:00:00 Es posible ingresar solo la fecha 2025-01-10, la hora de inicio de entrega será 00h por defecto |
|
| Fin intervalo de entrega (delivery.interval.end)* | Datetime |
Ej: 2025-01-10T16:59:59 Es posible ingresar solo la fecha 2025-01-10, la hora de fin de entrega será 23h59 por defecto |
|
| Nombre del contacto de entrega (delivery.contact.firstName)* | Cadena de caracteres |
Nombre del contacto del lugar de entrega Ej: Joe |
|
| Apellido del contacto de entrega (delivery.contact.lastName)* | Cadena de caracteres |
Apellido del contacto del lugar de entrega Ej: DOE |
|
| Teléfono del contacto de entrega (delivery.contact.phone)* | Cadena de caracteres |
Número de teléfono del contacto del lugar de recogida Ej: +33601020304 |
|
| Correo electrónico del contacto de entrega (delivery.contact.email)* | Cadena de caracteres |
Dirección de correo electrónico del contacto del lugar de recogida Ej: joedoe@gmail.com |
|
| Idioma del contacto de entrega (delivery.contact.language) | Cadena de caracteres |
Código del idioma del contacto del lugar de entrega Ej: fr Si no se completa, el idioma indicado en el punto de envió/tienda se completará automáticamente aquí |
|
| Zona horaria del contacto de entrega (delivery.contact.timezone) | Cadena de caracteres |
Zona horaria del contacto de entrega Ej: Europe/Paris Si no se completa, la zona horaria predeterminada será EUROPE/Paris |
|
| Método de contacto para satisfacción (delivery.contact.optIn.survey) |
Lista de cadenas de caracteres Valores permitidos: SMS,CORREO ELECTRÓNICO |
Método de contacto para los cuestionarios de satisfacción Ej: “SMS,CORREO ELECTRÓNICO” |
|
| Método de contacto para entrega (delivery.contact.optIn.delivery) |
Lista de cadenas de caracteres Valores permitidos: SMS,CORREO ELECTRÓNICO |
Método de contacto para el seguimiento de entrega Ej: “SMS” |
|
| ¿Contacto profesional? (delivery.contact.isProfessional) | Booleano | Ej: true (si es sí), false (si es no) | |
| Nombre de la empresa contacto de entrega (delivery.contact.companyName) | Cadena de caracteres | Ej: Woop | |
| ID paquete (packages.packageId) | Cadena de caracteres |
ID utilizado para diferenciar los paquetes (solo para archivos CSV, información no registrada con el pedido) Ej: PACKAGE1 |
|
| Referencia paquete (packages.references.reference) | Cadena de caracteres |
Referencia del paquete Ej: 12345B |
|
| Valor del código de barras paquete (packages.references.barcode.value) | Cadena de caracteres |
Valor del código de barras Ej: 54fd56g4f5gfd456sd |
|
| Formato del código de barras paquete (packages.references.barcode.format) | Cadena de caracteres |
Formato del código de barras Ej: 128 |
|
| Tipo del código de barras paquete (packages.references.barcode.type) | Cadena de caracteres |
Tipo de visualización del código de barras Ej: barcode |
|
| Estado de la referencia paquete (packages.references.state.value) | Cadena de caracteres |
Estado del paquete Ej: ON_DOCK |
|
| Fecha del estado de la referencia paquete (packages.references.state.date) | Datetime |
Fecha del estado del paquete Ej: 2025-01-10T15:00:00 Es posible ingresar solo la fecha 2025-01-10, la hora del estado del paquete será 23h59 por defecto |
|
| ID del remolque (packages.references.containerId.trailerId) | Cadena de caracteres | Ej: TRAILER1 | |
| ID de la paleta (packages.references.containerId.palletId) | Cadena de caracteres | Ej: PALLET1 | |
| Categoría paquete (packages.category) | Cadena de caracteres |
Categoría del paquete Ej: ALIMENTACIÓN |
|
| Longitud paquete (packages.length.value) | Número |
Longitud del paquete Ej: 20 Se completa automáticamente si se ingresa el valor packages.category |
|
| Unidad longitud paquete (packages.length.unit) |
Cadena de caracteres Valores permitidos: mm, cm, m, in, ft-us, ft |
Unidad de la longitud del paquete Ej: cm Se completa automáticamente si se ingresa el valor packages.category |
|
| Ancho paquete (packages.width.value) | Número |
Ancho del paquete Ej: 20 Se completa automáticamente si se ingresa el valor packages.category |
|
| Unidad ancho paquete (packages.width.unit) |
Cadena de caracteres Valores permitidos: mm, cm, m, in, ft-us, ft |
Unidad del ancho del paquete Ej: cm Se completa automáticamente si se ingresa el valor packages.category |
|
| Altura paquete (packages.height.value) | Número |
Altura del paquete Ej: 60 Se completa automáticamente si se ingresa el valor packages.category |
|
| Unidad altura paquete (packages.height.unit) |
Cadena de caracteres Valores permitidos: mm, cm, m, in, ft-us, ft |
Unidad de la altura del paquete Ej: cm Se completa automáticamente si se ingresa el valor packages.category |
|
| Peso paquete (packages.weight.value) | Número |
Peso del paquete Ej: 2.04 Se completa automáticamente si se ingresa el valor packages.category |
|
| Unidad peso paquete (packages.weight.unit) |
Cadena de caracteres Valores permitidos: mg, g, kg, oz, lb, mt, t |
Unidad del peso del paquete Ej: kg Se completa automáticamente si se ingresa el valor packages.category |
|
| Tipo de producto en el paquete (packages.products.type) |
Cadena de caracteres Valores permitidos: TYPOLOGY_GENERIC, TYPOLOGY_PALLET_GENERIC, TYPOLOGY_GROCERY, TYPOLOGY_FRESH, TYPOLOGY_FROZEN, TYPOLOGY_DANGEROUS, TYPOLOGY_HOUSEHOLD, TYPOLOGY_LARGE_HOUSEHOLD, TYPOLOGY_VOLUMINOUS, TYPOLOGY_FRAGILE, TYPOLOGY_VOLUMINOUS_FRAGILE, TYPOLOGY_NON_STANDARD, TYPOLOGY_SMALL_HOUSEHOLD, TYPOLOGY_DANGEROUS_LIMITED_QUANTITY, TYPOLOGY_HIGHT_VALUE, TYPOLOGY_FURNITURE, TYPOLOGY_LIVING_ANIMALS, TYPOLOGY_MEDICAL_PRODUCTS, TYPOLOGY_FRAGILE_FURNITURE, TYPOLOGY_SMALL_FURNITURE, TYPOLOGY_LARGE_FURNITURE, TYPOLOGY_ASSEMBLED_FURNITURE |
Tipo de producto en el paquete Ej: TYPOLOGY_FRESH Ver infos para completar el campo
Si no se especifica, el valor por defecto es TYPOLOGY_GENERIC |
|
| EAN del producto (packages.products.ean) | Cadena de caracteres |
Código EAN del producto Ej: 0123456789012 |
|
| CUG del producto (packages.products.cug) | Cadena de caracteres |
Código CUG del producto Ej: 012345678 |
|
| Etiqueta producto (packages.products.label) | Cadena de caracteres |
Etiqueta del producto Ej: Lote de paquetes de pasta |
|
| Cantidad de productos (packages.products.quantity) | Número |
Cantidad del producto en el paquete Ej: 1 Se completa automáticamente con 1 si no se ingresa |
|
| Cantidad paquete (packages.quantity) | Número |
Cantidad del paquete Ej: 1 Se completa automáticamente con 1 si no se ingresa |
|
| Precio del producto (packages.products.price.value) | Campo reservado para ingresar un precio de producto |
||
Divisa del precio producto (packages.products.price.currency) |
Campo reservado para ingresar la divisa del precio del producto |
||
Servicios del producto (packages.products.productServices) |
Valores permitidos SERVICE_INSTALL ,SERVICE_RECOVERY, SERVICE_UNPACKING, SERVICE_FRONT_HOME, SERVICE_REGULAR_FRONT_HOME, SERVICE_PICKUP_POINT, SERVICE_RETURN, SERVICE_SELECTED_ROOM, SERVICE_SIMPLE_INSTALL, SERVICE_COMPLEX_INSTALL, SERVICE_PAY_ON_DELIVERY, SERVICE_STANDARD_TAXI, SERVICE_XL_TAXI, SERVICE_WITH_SIGNATURE, SERVICE_GREEN, SERVICE_SHUTTLE, SERVICE_TWO_DRIVERS, SERVICE_EXHIBITION_MODEL, SERVICE_WHITE_GLOVE, SERVICE_EXCHANGE, SERVICE_DELIVERY_TO_MAILBOX, SERVICE_SCHEDULED, SERVICE_FREIGHT_ELEVATOR, SERVICE_BY_PRODUCT |
Campo reservado para ingresar los diferentes servicios para el producto.
|
|
| Familias del producto (packages.products.productFamilies) | Cadena de caracteres |
|
|
| Huella de carbono del paquete (packages.attributes.footprint.value) | Número |
Huella de carbono del paquete Ej: 13 |
|
| Unidad de la huella de carbono del paquete (packages.attributes.footprint.unit) |
Cadena de caracteres Valores permitidos: m2, cm2, pallet |
Unidad de la huella de carbono del paquete Ej: m2 |
|
| Tipo de paquete (packages.type) |
Cadena de caracteres Valores permitidos: PACKAGE, TRAY, PALLET |
Tipo de paquete Ej: PACKAGE |
|
| Volumen del paquete (packages.volume.value) | Cadena de caracteres |
Volumen del paquete Ej: 15 |
|
| Unidad volumen paquete (packages.volume.unit) |
Cadena de caracteres Valores permitidos: mm3, cm3, ml, l, kl, m3, km3, tsp, tbs, in3, fi-oz, cup, pnt, qt, gal, ft3, yd3 |
Unidad de volumen del paquete Ej: cm3 |
|
| Servicios (services) |
Lista de cadenas de caracteres Valores permitidos: SERVICE_ASSEMBLY, SERVICE_INSTALL, SERVICE_RECOVERY, SERVICE_UNPACKING, SERVICE_FRONT_HOME, SERVICE_REGULAR_FRONT_HOME, SERVICE_PICKUP_POINT, SERVICE_RETURN, SERVICE_SELECTED_ROOM, SERVICE_SIMPLE_INSTALL, SERVICE_COMPLEX_INSTALL, SERVICE_PAY_ON_DELIVERY, SERVICE_STANDARD_TAXI, SERVICE_XL_TAXI, SERVICE_WITH_SIGNATURE, SERVICE_GREEN, SERVICE_SHUTTLE, SERVICE_TWO_DRIVERS, SERVICE_EXHIBITION_MODEL, SERVICE_WHITE_GLOVE, SERVICE_EXCHANGE, SERVICE_DELIVERY_TO_MAILBOX, SERVICE_SCHEDULED, SERVICE_FREIGHT_ELEVATOR, SERVICE_BY_PRODUCT |
Lista de servicios asociados al pedido Ej: SERVICE_FRONT_HOME, SERVICE_WITH_SIGNATURE Ver infos para completar el campo
SERVICE_FRONT_HOME se completa por defecto si no se ingresa SERVICE_BY_PRODUCT se completa por defecto si el campo (packages.products.productServices) está completado |
|
| Resta a pagar (expectedPayment.value) | Número |
Precio restante a pagar Ej: 15.20 |
|
| Moneda (expectedPayment.currency) | Cadena de caracteres |
Moneda del restante a pagar Ej: EUR |
|
| Método de pago (expectedPayment.paymentMethod) |
Cadena de caracteres Valores permitidos: CASH, CREDIT_CARD, DEBIT_CARD, DIRECT_DEBIT, BANK_TRANSFER, CHECK |
Método de pago del resto a pagar Ej: CASH |
|
| Clave de la etiqueta (tags.key) | Cadena de caracteres |
Clave de la etiqueta Ej: origin |
|
| Valor de la etiqueta (tags.value) | Cadena de caracteres |
Valor asociado Ej: web |
|
| Aplicación de la etiqueta a la orquestación (tags.applyToOrchestration) | Booleano | Ej: true (si es sí), false (si es no) | |
| Modo de selección del transportista (carrierSelection.mode) |
Cadena de caracteres Valores permitidos: INCLUSION, EXCLUSION |
Campo reservado para ‘inclusión o exclusión de un transportista en el proceso de orquestación | |
| Códigos de los transportistas seleccionados (carrierSelection.carrierCodes) |
Campo reservado para el código del transportista. Contacte a un admin de WOOP para obtener la lista |
||
| Clave de los datos adicionales (additionalData.key) |
Cadena de caracteres campo libre |
Campo reservado para la adición de datos adicionales ej: Fecha_instalación |
|
| Valor de los datos adicionales (additionalData.value) |
Cadena de caracteres campo libre |
Campo reservado para la adición de datos adicionales ej: 18/02/2025 |
Avanzado
Campo state.options.parcelIds, carrierSelection.carrierCodes y delivery.contact.optIn
Estos campos son de tipo "arreglo" para poder ingresar varios datos. Si utilizas un archivo CSV, debes ingresar todos los datos en la misma línea y entre comillas “”
Ejemplos:
- state.options.parcelIds: "PARCEL1,PARCEL2”
- carrierSelection.carrierCodes: “chronopost,mondial-relay”
- delivery.contact.optIn.survey: “SMS”
- delivery.contact.optIn.survey: “SMS, MAIL”
Arreglos de objetos
Esta parte solo concierne a los archivos CSV.
A continuación, la lista de datos que son arreglos de objetos y que estarán involucrados en esta parte:
- packages
- packages.references
- packages.products
- tags
- additionalData
Estos datos requieren atención especial porque se debe crear una línea para cada objeto de la misma familia. Concretamente, si tu pedido tiene tres etiquetas, debes duplicar el pedido en tres líneas y cambiar en cada línea la etiqueta. Si tu pedido tiene tres etiquetas y cuatro additionalData, estará en cuatro líneas.
Cuando duplicas una línea para agregar datos a un arreglo de datos, no debes modificar los otros datos del pedido => ⚠️ El número de pedido debe permanecer idéntico.
Es importante notar que es posible agregar en una misma línea una nueva etiqueta, un additionalData, un package…
Caso particular para los packages:
Como se mencionó anteriormente, si hay dos packages que ingresar para el pedido, debemos crear dos líneas CSV para poder crearlos. En cada línea, se deberá cambiar el packageId. Este valor importa poco porque no se registra, pero sirve para diferenciar los packages durante el procesamiento del pedido.
Si cada package tiene dos productos y tres referencias, entonces el pedido se hará en seis líneas CSV:
- Primera línea: package 1 producto 1 referencia 1
- Segunda línea: package 1 producto 2 referencia 2
- Tercera línea: package 1 producto 2 referencia 3
- Cuarta línea: package 2 producto 1 referencia 1
- Quinta línea: package 2 producto 2 referencia 2
- Sexta línea: package 2 producto 2 referencia 3
El producto siempre debe ser ingresado porque es un campo obligatorio. Si el producto ingresado ya está presente en otra línea CSV del pedido, no se añadirá una segunda vez al pedido.
Algunos datos son obligatorios y será obligatorio mantener, por ejemplo, un package por línea. Ningún dato será duplicado si ya está presente en otra línea CSV del pedido.