Saltar al contenido principal

Rotations

Ver en Git


Rotaciones

El flujo de rotaciones esta dividio en dos partes. Un ABM de rotaciones y la parte de actividades.

DATOS DE UNA ROTACION:​

{
"crop_variety_id": 37582,
"crop_order": 1,
"end_date": null,
"yeargroup": 2022,
"crop_variety_name": "Colorado Chino",
"field_id": 258482,
"crop_id": 966,
"crop_name": "Ajo",
"cicle_id": 65847,
"rotation_uuid": "898430ea-fc6f-4a46-a7c6-9890ea702a41",
"ha": null,
"start_date": null
}
  • "crop_variety_id" → id de la variedad del cultivo
  • "crop_order" → orden de esta rotacion en este ciclo
  • "end_date" → fecha de finalizacion de rotacion (es la que puede modificar el user)
  • "yeargroup" → este es el que usamos siempre en la plataforma, es la referencia para el ciclo
  • "crop_variety_name" → nombre de la variedad
  • "field_id" → id del lote al cual esta rotacion esta relacionada
  • "crop_id" → id del cultivo de la rotacion
  • "crop_name" → nombre del cultivo
  • "cicle_id" → id del ciclo (relacion yeargroup-field_id)
  • "rotation_uuid" → uuid de rotacion para identificarlas mas facil
  • "ha" → ha plantadas (es la que puede modificar el user)
  • "start_date" → fecha de inicio de esta rotacion (es la que puede modificar el user)

Api bonus​

api/rotations/listCrops​

Esta api solo tiene expuesto el metodo GET
No se si realmente la necesitan pero es una api que hice que te trae todos los cultivos del maesto (id_usuario = null). Acepta paginacion y buscador.

Acepta los siguientes parametros

  • search → String que sea contenido en el nombre del cultivo
  • page → Numero de pagina que desea, la primera es 0
  • page_size → cantidad de registros que desea en la respuesta

Ejemplo de respuesta:

Tener en cuenta que son mas de dos cultivos y todavia no esta el nuevo maestro en la db, son datos de ejemplo pero les va a devolver esto siempre​

{
"pagination": {
"cant_items": 62,
"last_page": false,
"total_pages": 4,
"page_size": 20,
"current_page": 0
},
"data": [
{
"crop_id": 957,
"crop_name": "Aguacate"
},
{
"crop_id": 966,
"crop_name": "Ajo"
},
]
}

Si no evian page, le hago una paginacion por default de un PAGE_SIZE = 50, en caso de querer TODOS los registros enviar page = -1

El pagination te devuelve buena data por si la necesitan.

API ROTATIONS

api/rotations​

GET​

La ruta puede variar, si se envia asi pelada, te trae todas las rotaciontes. Esta api esta preparada para paginar, buscar y filtrar. Por ahora solo estan implementado 2 filtros, si se necesitan se liberan los demas. Esto es mas para web ya que mobile si o si necesita toda la data de una.
query arguments:

  • yeargroup → recibe el yeargroup que usamos comunmente (2022, 2023, etc)
  • farms_id → recibe una lista de campos y lo VALIDA CON PERMISOS DEL USUARIO!!!

En caso de no enviar nada, esta api te devuelve TODAS las rotaciones DE TODOS LOS CAMPOS QUE TENGA PERMISOS EL USUARIO sin importar campania, lote ni nada, tener en cuenta esto.

RESPONSE​

[
{
"field_id": 258289,
"farm_id": 72560,
"field_name": "Test",
"cicle_id": 65816,
"yeargroup": 2022,
"rotation_uuid": "9bd9fbac-4e54-11ed-8ef4-531072a071d7",
"crop_order": 1,
"crop_id": 966,
"crop_name": "Ajo"
},
{
"field_id": 258289,
"farm_id": 72560,
"field_name": "Test",
"cicle_id": 65837,
"yeargroup": 2023,
"rotation_uuid": "b1c68881-1e34-45d2-9685-45c4be54a0c8",
"crop_order": 1,
"crop_id": 6,
"crop_name": "Cebada"
},
{
"field_id": 258289,
"farm_id": 72560,
"field_name": "Test",
"cicle_id": 65837,
"yeargroup": 2023,
"rotation_uuid": "5d127342-ab88-4642-bcda-3f046fc8cdfb",
"crop_order": 2,
"crop_id": 966,
"crop_name": "Ajo"
},
]

Toda esta info les puede ser util para consumir otras partes del feature tanto para la lista, ordenarlos, agruparlo y la vista calendario.

api/rotations/<uuid:rotation_uuid>​

GET​

Esta ruta es para listar una rotacion especifica.

Pegada de ejemplo:​

/api/rotations/9bd9fbac-4e54-11ed-8ef4-531072a071d7​

RESPONSE​

Status: 200 OK
{
"end_date": null,
"yeargroup": 2022,
"field_id": 258289,
"crop_id": 966,
"crop_name": "Ajo",
"cicle_id": 65816,
"start_date": null,
"ha": null,
"crop_order": 1,
"rotation_uuid": "9bd9fbac-4e54-11ed-8ef4-531072a071d7"
}

Se puede ver que tiene otra data, como ha, end_date,start_date. estos son los valores que se usan en la configuracion avanzada de cada rotacion.
En caso de enviar una rotacion que no exista la api responde 400

Status: 400 BAD REQUEST
{
"info": "Can not load rotation from DB",
"res": "error",
"code": "INVALID_ROT"
}

api/rotations​

POST​

Este endpoint se debe mandar data por el body para crear una o mas rotaciones.
A continuacion paso el schema que es valido, esta en jsonschema pero se los explico

{
"rotations": {
"type": "array",
"items": {
"type": "object",
"patternProperties": {
"rotation_uuid": {"anyOf": [{"type": "string", "pattern": "uuid"}, {"type": "null"}]},
"cicle_id": {"anyOf": [{"type": "integer"}, {"type": "null"}]},
"field_id": {"type": "integer"},
"crop_id": {"type": "integer"},
"yeargroup": {"type": "integer"},
"ha": {"anyOf": [{"type": "integer"}, {"type": "null"}]},
"start_date": {"anyOf":["^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$",null]},
"end_date": {"anyOf":["^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$",null]}
}, "required": ["field_id", "crop_id", "yeargroup"]
}

}
}

La api quedo preparada para futuro poder cargar rotaciones con la data extra. Hoy la idea es que como minimo manden el field_id, el crop_id y el yeargroup.

PARA MOBILE​

PUEDEN ENVIAR EL UUID por si lo quieren crear para offline, esta preparado, tengamos la buena practica de crearlo uds el uuid y usar ese para crear el de la db, asi ya dejamos preparado a futuro.
PARAMETROS

  • rotation_uuid → uuid v4
  • cicle_id → integer o null (no es obligatorio pero se puede)
  • field_id → integer (OBLIGATORIO)
  • crop_id → integer (OBLIGATORIO)
  • yeargroup → integer (OBLIGATORIO)
  • ha → integer o null (no es obligatorio pero se puede)
  • start_date → datetime o nul (no es obligatorio) el patron de arriba es el que usamos comunmente
  • end_date → datetime o nul (no es obligatorio)

Ahora les muestro un ejemplo para tambien mostrar las responses y sus posibles errores.

Pegada de ejemplo

{
"rotations":[
{
"field_id":258388,
"yeargroup":2023,
"cicle_id":null,
"rotation_uuid":null,
"crop_id":966
},
{
"field_id":258388,
"yeargroup":2022,
"cicle_id":658606,
"rotation_uuid":null,
"crop_id":6
},
{
"field_id":258388,
"yeargroup":2022,
"cicle_id":null,
"rotation_uuid":null,
"crop_id":6
},
{
"field_id":258388,
"yeargroup":2022,
"cicle_id":null,
"rotation_uuid":null,
"crop_id":1342
}
]
}

Fijese que de los 4 cambio un poco lo que mando. La respuesta de la api es la siguiente

Status: 200 OK
{
"created_ones": [
{
"end_date": null,
"yeargroup": 2022,
"field_id": 258388,
"crop_id": 6,
"crop_name": null,
"cicle_id": 65805,
"start_date": null,
"ha": null,
"crop_order": 4,
"rotation_uuid": "b11f12b1-3265-4756-b18b-45de101da547"
}
],
"unabled_to_be_created": [
{
"end_date": null,
"yeargroup": 2023,
"field_id": 258388,
"crop_id": 966,
"crop_name": null,
"cicle_id": 65836,
"start_date": null,
"motivo": {
"error_code": "MAX_AMOUNT_ROTATIONS",
"error_msg": "Can not create more rotations limit reached"
},
"ha": null,
"crop_order": null,
"rotation_uuid": null
},
{
"end_date": null,
"yeargroup": 2022,
"field_id": 258388,
"crop_id": 6,
"crop_name": null,
"cicle_id": 658606,
"start_date": null,
"motivo": {
"error_code": "INVALID_CICLE",
"error_msg": "The cicle id is invalid"
},
"ha": null,
"crop_order": null,
"rotation_uuid": null
},
{
"end_date": null,
"yeargroup": 2022,
"field_id": 258388,
"crop_id": 1342,
"crop_name": null,
"cicle_id": 65805,
"start_date": null,
"motivo": {
"error_code": "INVALID_CROP",
"error_msg": "The crop is not in DB "
},
"ha": null,
"crop_order": null,
"rotation_uuid": null
}
]
}

La api les devuelve 2 listas. 1 con las rotaciones que se pudieron crear y otra con las rotaciones que no se pudieron crear. Les muestro todas las posibilidades de error en esta respuesta y una de success.

Intentaron crear 4 rotaciones. Fiijense que el unico que se creo es el segundo registro que le envie en la api, los demas fallaron por diferentes motivos. Fijense que se les envia el motivo siendo el mismo que algunas apis responden. Des esta manera pueden infromar al usuario los errores por que no se crearon.

La api siempre devuelve 200 y la misma respuesta. si no pudo crear ninguna la lista creted_one queda vacia.​

Los errores por lso cuales no se pueden crear rotaciones son los siguientes.

  • Inserto un cultivo que no esta en nuestro maestro
  • Me enviaste un cicle_id invalido (cicle_id tiene prioridad sobre yeargroup para campanias)
  • Alcanzaste el maximo de rotaciones en este lote y esta campania (4 por producto)

api/rotations/uuid:rotation_uuid​

DELETE​

Este recibe una rotacion por path, el uuid para eliminarla

ACTUALIZAR DATA​

Este es mas complicado, tiene 2 endpoints.​

Endpoint 1​

api/rotations/uuid:rotation_uuid​

PATCH​

Este es para que modifiques las cosas de una rotacion.
Propiedades que se pueden modificar:

  • ha → integer
  • crop_id → integer (valida contra db)
  • start_date → timestamp (yyy-mm-dd Thh:mm:ssZ) el que usamos siempre
  • end_date → timestamp (yyy-mm-dd Thh:mm:ssZ) el que usamos siempre
  • variedad??

El patch acepta minimo 1 de estos o todos. La respuesta de la api es devolverte la rotacion con los nuevos valores.

Ejemplo:​

ROTACION PRE CAMBIO​

{
"crop_variety_id": 37582,
"crop_order": 1,
"end_date": null,
"yeargroup": 2022,
"crop_variety_name": "Colorado Chino",
"field_id": 258482,
"crop_id": 966,
"crop_name": "Ajo",
"cicle_id": 65847,
"rotation_uuid": "898430ea-fc6f-4a46-a7c6-9890ea702a41",
"ha": null,
"start_date": null
}

BODY:​

{
"ha": 140,
"start_date":"2022-08-09 21:00:00.000",
"end_date": "2023-01-09 21:00:00.000",
"crop_id": 6
}

RESPONSE​

Status: 200 OK
{
"crop_variety_id": 37582,
"crop_order": 1,
"end_date": "2023-01-09 21:00:00.000",
"yeargroup": 2022,
"crop_variety_name": "Colorado Chino",
"field_id": 258482,
"crop_id": 6,
"crop_name": "Cebada",
"cicle_id": 65847,
"rotation_uuid": "898430ea-fc6f-4a46-a7c6-9890ea702a41",
"ha": 140,
"start_date": "2022-08-09 21:00:00.000"
}

Endpoint 2​

api/rotations**​

PATCH​

Este endpint es para que puedan modificar el orden de las rotaciones (vista calendario).
Este recibe un body con todas las rotaciones ordenadas:

  • Envian menos de la cantidad de rotaciones que hay en la db (esto puede ser que envian menos de las que hay, envian rotaciones que no son del ciclo o envian repetidas y no llega a ser la cantidad exacta de rotaciones)
Status: 400 BAD REQUEST
{
"info": "The quantity of crops is not the same on DB ",
"res": "error",
"code": "INVALID_QTY_CROPS"
}

SOLO MOBILE​

Este erro a uds no les aparece, en caso se enviar mal les salta:

Status: 200 OK
{
"status": "Could not do action"
}

Esto esta hecho por si hay problemas con la sync y lo offline, para no trabar la cola de request, es preferible que no se le updetee el orden pero pueda seguir el sync. (esto es mas que nada por si crean una rotacion nueva mientras el usuario esta offline y se romperia todo, nada eso.)

Seguimos​

El body de la request debe ser el siguiente (template):

{   "cicle_id": "ID del ciclo que quieren cambiar el orde",
"new_order":"Lista ordenada de uuid de rotaciones"
}

Si o si tienen que enviar los dos parametros, son obligatorios​

Ejemplo de uso:​

PRE CAMBIO DE ORDEN (ROTACIONES ORDENADAS)​

  "8cb53739-5374-4aaa-8b9d-cfed20f51af8",
"1fb1a924-4bcc-11ed-8ef4-0fb27c028e6b",
"effc9e93-880b-4c42-8c2b-80e06e626920",
"b11f12b1-3265-4756-b18b-45de101da547"

BODY​

{   "cicle_id": 65805,
"new_order":[
"1fb1a924-4bcc-11ed-8ef4-0fb27c028e6b",
"8cb53739-5374-4aaa-8b9d-cfed20f51af8",
"b11f12b1-3265-4756-b18b-45de101da547",
"effc9e93-880b-4c42-8c2b-80e06e626920"
]
}

Fijense que cambiaron los ordenes:

  • 1 → 2
  • 2 → 1
  • 3 → 4
  • 4 → 3

RESPONSE​

[
"8cb53739-5374-4aaa-8b9d-cfed20f51af8",
"1fb1a924-4bcc-11ed-8ef4-0fb27c028e6b",
"effc9e93-880b-4c42-8c2b-80e06e626920",
"b11f12b1-3265-4756-b18b-45de101da547"
]

API ROTATIONS VARIETIES

Estas apis son para listar, agregar o eliminar una variedad de una rotacion

ENDPOINT​

api/rotations/variety/uuid:rotation_uuid​

GET​

Este metodo recibe un uuid para poder usar su id_cultivo y listar las variedades de ese cultivo

EJEMPLO RESPONSE DE CULTIVO AVENA​

{
"varieties": [
{
"variety_id": 37634,
"variety_name": "Ocumo"
},
{
"variety_id": 40138,
"variety_name": "Avenaza"
},
{
"variety_id": 40142,
"variety_name": "test"
},
{
"variety_id": 40150,
"variety_name": "Test maestro"
},
{
"variety_id": 33305,
"variety_name": "Guilty"
}
]
}

POST​

Este metodo es usado para agregar una o mas variedades a esta rotacion

BODY REQUEST​

{
"varieties":[]
}

Dentro la lista esta se debene enviar los id de las variedades

EJEMPLO DE BODY​

{
"varieties":[37634,33305]
}

RESPONSE​

Tomenlo con pinzas, toy viendo bien que devolver mejor pero anda y responde status, se puede ver en base a que necesiten uds para esta funcion, capaz no necesitan nada

DELETE​

Este metodo es para borrar una variedad de la rotacion. el endpoint queda:

api/rotations/variety?variety_id=​

Donde el id es el id de variedad que quieren borrar.

RESPONSES​

PUDO BORRAR
Solo devuelve un 200
NO PUDO BORRAR
Devuelve un 400

{
"info": "Could not delete the variety",
"res": "error",
"code": "COULD_NOT_DELETE"
}

Esto se puede ver si devolvemos error o no, capaz devolvemos y uds no lo atrapan pero si lo informan, asi no bloqueamos el flujo (mas que nada mobile)