--- title: 'Mak - Indicadores de Avance' --- Mak - Indicadores de Avance === Obj: Mostrar un resumen acciones con los siguientes elementos - Pendientes: Recupera la cantidad de acciones pendientes para un determinado rango de fechas `(start-end)` y algún otro filtro como usuario o valor extra del cliente - Hechas: Son las acciones que tiene respuesta y que están en un rango de fechas `(start-end)` - Vencidas: Son las acciones que no tienen respuesta y que su fecha de expiración está entre una fecha pasada y el start. e.g. - si start: `2020-06-01` y end: `2020-06-10` y past_date: `2020-05-25` entonces se filtrarían las acciones cuyo valor expire sea gte: `2020-05-25` y lte: `2020-06-01` - Sin actividad: Son todos objects (clientes) que no tienen acciones UI: ``` 320 / 43 | 150 / 32 | 62 / 13 | 183 actions objects | actions objects | actions objects | objects -------------------|-------------------|--------------------|------------------------ Pendientes | Hechas | Vencidas | Sin Actividad ``` > object: Representa a un cliente > action: Representa a una misión/foco rojo URL: http://api.staging.kimetrics.com/ #### Crear consultas sql para recuperar estadísticas de accionables, filtrados por cliente, usuario, fechas (start y end) - [X] total de acciones/objetos pendientes - [ ] total de acciones/objetos hechas - [ ] total de acciones/objetos vencidas - [ ] total de objetos sin acciones - [ ] validación de datos - [x] pruebas para consumir datos desde el cliente - [x] consumir los datos con el API de Hasura. - [ ] pruebas manuales en dashboard Total de acciones/objetos pendientes --- ### Intro En esta sección se describen las tareas para obtener las acciones/objetos pendientes. Definimos una acción pendiente como aquella acción que no tiene un registro de resultados en la tabla `actions` del schema `results` Los resultados están delimitados por el rando de fecha `start` y `end` que inicialmente corresponde a la semana actual Solo se contabilizan las acciones que SI tienen asignado un objeto unico por accion ### Tareas - Vistas en SQL - [X] uv_objects_with_users - [x] uv_pending_actions - Validación de datos - [ ] **Modelo de datos** `uv_pending_actions`, `uv_objects_with_users` #### `uv_pending_actions` - [X] Parametros Default; start: lunes, end: termina domingo, actor_uuid= NULL, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [X] los actions deben ser unicos - [X] los actions devueltos no existen en la tabla results.actions - [X] el campo expire de los data.actions devueltos estan dentro del rango de los parametros de start, end - [X] Parametros Default: start: lunes - 8 dias, end: lunes, actor_uuid= NULL, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [X] los actions deben ser unicos - [X] los actions devueltos no existen en la tabla results.actions - [X] el campo expire de los data.actions devueltos estan dentro del rango de los parametros de start, end - [X] Parametros: start < end, actor_uuid=some-actor-uuid, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [X] la lista de `objects` devueltos son un subconjunto propio de los `objetos` asignados al empleado filtrado - [X] los actions deben ser unicos - [X] los actions devueltos no existen en la tabla results.actions - [X] Parametros: start < end, actor_uuid=some-actor-uuid, el actor no tiene ningun object asignado, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [X] debe devolver una lista vacia. - [X] Parametros: start < end, actor_uuid=some-actor-uuid, Filtra los objetos unicos, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [X] la lista de `objects` devueltos son un subconjunto propio de los objetos asignados al empleado filtrado #### `uv_objects_with_users` - [X] Parametros Default; actor_uuid = NULL - ***output:*** - [X] Devuelve una lista de `objects_uuid` unicos, todos los `objects` con `object_status`=1 - [X] Parametros Default; actor_uuid = some_unexisting_actor_uuid - ***output:*** - [X] Devuelve una lista vacia - [X] Parametros Default; actor_uuid = some_existing_actor_uuid - ***output:*** - [X] Devuelve la lista de TODOS los `objects` asignados a dicho actor. - **GraphQL** - [ ] Validar veracidad de los records devueltos por el SQL propuesto por hasura - [ ] Validar las agregaciones, resultado del SQL propuesto por hasura - [ ] Comprobacion del filtro por campo `extra:JSON` - [ ] extra->cadena - [ ] extra->canal - [ ] extra->formato - [ ] usar schema de object_types - Implementación de consulta de graphql (Hasura) - Filtros: - [x] fecha de inicio - [ ] fecha de fin - [x] usuario - [ ] extra - paginación - [ ] total de acciones - [ ] página actual - [ ] total de páginas - [ ] obtener siguiente página - - Implementación en frontend - [ ] crear constante para gql - [ ] crear listado de objetos con filtro de status=pending - [ ] conectar con indicador de pendientes - [ ] mostrar datos con paginación Componentes --- #### uv_pending_actions Vista que nos entrega todos los `actions` pendientes, salida: ``` id(INT) | object(UUID) | expire(TIMESTAMP WITH TZ) | actor(UUID) | uv_owu.name(TEXT) | extra(JSONB) --------|--------------|---------------------------|-----------------|-------------------|------------- id de la| uuid del obj-| expiracion de la accion | uuid del | nombre del objeto | datos extra accion | eto asignado | | actor asign- | uv_owu.name(TEXT) | del objeto en | a la accion | | ado a la accion | | JSON ``` Total de acciones/objetos hechos --- ### Intro Acciones hechas: son aquellas acciones que sí cuentan con un registro en la tabla `results.actions` ### Tareas - Vistas en SQL - [ ] uv_objects_with_users - [ ] uv_done_actions - Validación de datos - [ ] **Modelo de datos** `uv_done_actions`, `uv_objects_with_users` #### `uv_done_actions` - [ ] Parametros Default; start: lunes, end: termina domingo, actor_uuid= NULL, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [ ] los actions deben ser unicos - [ ] los actions devueltos existen en la tabla results.actions - [ ] Parametros: start < end, actor_uuid=some-actor-uuid, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [ ] la lista de `objects` devueltos son un subconjunto propio de los `objetos` asignados al empleado filtrado - [ ] los actions deben ser unicos - [ ] Parametros: start < end, actor_uuid=some-actor-uuid, el actor no tiene ningun object asignado. , **intervalo**: `start <= data.actions.expire <= end` - **output**: - [ ] debe devolver una lista vacia. - [ ] Parametros: start < end, actor_uuid=some-actor-uuid, Filtra los objetos unicos, **intervalo**: `start <= data.actions.expire <= end` - **output**: - [ ] la lista de `objects` devueltos son un subconjunto propio de los objetos asignados al empleado filtrado - **GraphQL** - [ ] Validar veracidad de los records devueltos por el SQL propuesto por hasura - [ ] Validar las agregaciones, resultado del SQL propuesto por hasura - [ ] Comprobacion del filtro por campo `extra:JSON` - [ ] extra->cadena - [ ] extra->canal - [ ] extra->formato - [ ] usar schema de object_types - Implementación de consulta de graphql (Hasura) - Filtros: - [ ] fecha de inicio - [ ] fecha de fin - [ ] usuario - [ ] extra - paginación: - [ ] total de acciones - [ ] página actual - [ ] total de páginas - [ ] obtener siguiente página - - Implementación en frontend - [ ] crear constante para gql - [ ] crear listado de objetos con filtro de status=done - [ ] conectar con indicador de hechas - [ ] mostrar datos con paginación Componentes --- #### uv_done_actions Vista que nos entrega todos los `actions` hechas, salida: ``` id(INT) | object(UUID) | expire(TIMESTAMP WITH TZ) | actor(UUID) | uv_owu.name(TEXT) | extra(JSONB) --------|--------------|---------------------------|-----------------|-------------------|------------- id de la| uuid del obj-| expiracion de la accion | uuid del | nombre del objeto | datos extra accion | eto asignado | | actor asign- | uv_owu.name(TEXT) | del objeto en | a la accion | | ado a la accion | | JSON ``` Total de acciones/objetos vencidas --- ### Intro Acciones vencidas: son las acciones que no tiene respuesta y que su fecha de expiración estan una semana antes de la fecha de inicio, por ejemplo si nuestra fecha de inicio es '2020-06-01' entoncens debemos consultar todas las acciones que estan dentro del rango de 2020-05-25 al 2020-06-01 ### Tareas - Vistas en SQL - [X] uv_objects_with_users - [X] uv_pending_actions - Validación de datos - [ ] **Modelo de datos** `uv_due_actions`, `uv_objects_with_users` - **GraphQL** - [ ] Validar veracidad de los records devueltos por el SQL propuesto por hasura - [ ] Validar las agregaciones, resultado del SQL propuesto por hasura - [ ] Comprobacion del filtro por campo `extra:JSON` - [ ] extra->cadena - [ ] extra->canal - [ ] extra->formato - [ ] usar schema de object_types - Implementación de consulta de graphql (Hasura) - Filtros: - [ ] fecha de inicio = fecha de inicio - 8 días, - [ ] fecha de fin = fecha de inicio - [ ] usuario - [ ] extra - paginación - [ ] total de acciones - [ ] página actual - [ ] total de páginas - [ ] obtener siguiente página - - Implementación en frontend - [ ] crear cunsulta para gql - [ ] crear filtro por status=done - [ ] conectar con indicador de hechas - [ ] mostrar datos con paginación Componentes --- #### uv_done_actions Vista que nos entrega todos los `actions` hechas, salida: ``` id(INT) | object(UUID) | expire(TIMESTAMP WITH TZ) | actor(UUID) | uv_owu.name(TEXT) | extra(JSONB) --------|--------------|---------------------------|-----------------|-------------------|------------- id de la| uuid del obj-| expiracion de la accion | uuid del | nombre del objeto | datos extra accion | eto asignado | | actor asign- | uv_owu.name(TEXT) | del objeto en | a la accion | | ado a la accion | | JSON ``` Total de objetos sin actividad --- ### Intro Son los objetos (clientes) que no tienen acciones asignadas en un perido de tiempo establecido (semana actual) ### Tareas - Vistas en SQL - [X] uv_objects_with_users - [ ] uv_objects_with_no_actions - Validación de datos - [ ] **Modelo de datos** `uv_objects_with_no_actions`, `uv_objects_with_users` - #### `uv_objects_with_no_actions` - [ ] Parametros Default: start: lunes, end: termina domingo, actor_uuid= NULL, **intervalo:** `start <= data.actions.expire <= end` - **output**: - [ ] los objetos devueltos son unicos - [ ] los objetos devueltos son unicos no tienen data.action para ese rango de fecha. - [ ] Parametros: start < end, actor_uuid=some-actor-uuid, **intervalo:** `start <= data.actions.expire <= end` - **output**: - [ ] la lista de `objects` devueltos son un subconjunto propio de los `objetos` asignados al empleado filtrado - [ ] los objetos deben ser unicos - [ ] los objetos devueltos son unicos no tienen data.action para ese rango de fecha. - [ ] Parametros: start < end, actor_uuid=some-actor-uuid, el actor no tiene ningun object asignado. `start <= data.actions.expire <= end` - **output**: - [ ] debe devolver una lista vacia. - **GraphQL** - [ ] Validar veracidad de los records devueltos por el SQL propuesto por hasura - [ ] Validar las agregaciones, resultado del SQL propuesto por hasura - [ ] Comprobacion del filtro por campo `extra:JSON` - [ ] extra->cadena - [ ] extra->canal - [ ] extra->formato - [ ] usar schema de object_types - Implementación de consulta de graphql (Hasura) - filtrado: - [ ] fecha de inicio, - [ ] fecha de fin - [ ] usuario - [ ] extra - paginación - [ ] total de acciones - [ ] página actual - [ ] total de páginas - [ ] obtener siguiente página - - Implementación en frontend - [ ] crear consulta para gql - [ ] crear filtro por status=sin actividad - [ ] conectar con indicador sin actividad - [ ] mostrar datos con paginación Testing for `uv_objects_with_users` --- ``` -- the output shall be empty SELECT * FROM ( SELECT object, objs.id FROM data.uv_objects_with_users AS da_owu LEFT JOIN ( SELECT DISTINCT ON(id) id FROM data.objects WHERE status = 1 AND tenant=2 ) AS objs ON objs.id = da_owu.object WHERE tenant=2 AND actor IS NULL ) AS foo WHERE foo.object IS NULL OR foo.id IS NULL; -- SHALL BE EMPTY SELECT * FROM ( SELECT object, objs.id, CASE WHEN object = objs.id THEN TRUE ELSE FALSE END AS m_match FROM data.uv_objects_with_users AS da_owu LEFT JOIN ( SELECT DISTINCT ON(id) id FROM data.objects WHERE status = 1 AND tenant=2 ) AS objs ON objs.id = da_owu.object WHERE tenant=2 AND actor IS NULL ) AS foo WHERE foo.m_match IS FALSE; -- COUNT SHALL MATCH SELECT C1, C2, CASE WHEN C2=C1 THEN TRUE ELSE FALSE END FROM ( SELECT (SELECT COUNT(*) FROM data.uv_objects_with_users WHERE tenant=2 AND actor IS NULL ) as C1, (SELECT COUNT(*) FROM (SELECT DISTINCT ON(id) id FROM data.objects WHERE status = 1 AND tenant=2) AS tt) as C2 ) AS dd; ------ -- Parametros Default; actor_uuid = some_unexisting_actor_uuid -- output: -- Devuelve una lista vacia o conteo = 0 SELECT COUNT(*) FROM data.uv_objects_with_users AS da_owu WHERE tenant=2 AND actor = '00000000-0000-0000-0000-000000000000'; -- Parametros Default; actor_uuid = some_unexisting_actor_uuid and tenant does not exists -- output: -- Devuelve una lista vacia o conteo = 0 SELECT COUNT(*) FROM data.uv_objects_with_users AS da_owu WHERE tenant=0 AND actor = '00000000-0000-0000-0000-000000000000'; -- Parametros Default; actor_uuid = some_existing_actor_uuid -- output: -- Devuelve la lista de TODOS los objects asignados a dicho actor. -- the output of this validation query shall be empty WITH my_users AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users ), max_users AS ( SELECT max(row_num) FROM my_users ), random_user AS ( SELECT id FROM my_users WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)-1) + 1)::int ) ), actor_assignments AS ( SELECT object, actor FROM data.objects_assignment WHERE actor = (SELECT id FROM random_user) ) SELECT * FROM ( SELECT CASE WHEN tt.da_owu_object = tt.object THEN TRUE ELSE FALSE END AS m_match FROM ( SELECT ac_assi.object, ac_assi.actor, da_owu.actor AS da_owu_actor, da_owu.object AS da_owu_object FROM actor_assignments AS ac_assi LEFT JOIN data.uv_objects_with_users AS da_owu ON da_owu.actor = ac_assi.actor AND da_owu.object = ac_assi.object ) AS tt ) AS tt2 WHERE tt2.m_match = FALSE ; --- using A discrete value instead of random shall be the same as using GraphQL SELECT COUNT(*) FROM data.uv_objects_with_users WHERE actor = '291b6505-e988-47da-8f78-80bc3750aff4' AND tenant=2; query GET_OBJECTS_WITH_USERS($_eq: uuid = "", $tenant: Int = 2) { data_uv_objects_with_users_aggregate(where: {actor: {_eq: $_eq}, tenant: {_eq: $tenant}}) { aggregate { count } nodes { actor extra name object } } } { "_eq": "291b6505-e988-47da-8f78-80bc3750aff4", "tenant": 2 } ``` Testing uv_pending_actions --- ``` ----TESTING------uv_pending_actions---->>>>>>>> -- Parametros Default; start: lunes, end: termina domingo, actor_uuid= NULL, intervalo: start <= data.actions.expire <= end -- output: -- los actions deben ser unicos -- result shall be empty list -- Shall be empty SELECT * FROM ( SELECT id, expire, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS more_than_once FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor IS NULL ) AS tt WHERE tt.more_than_once > 1; -- With a random User WITH my_users AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users ), max_users AS ( SELECT max(row_num) FROM my_users ), random_user AS ( SELECT id FROM my_users WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)-1) + 1)::int ) )SELECT * FROM ( SELECT id, expire, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS more_than_once FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor = (SELECT id FROM random_user) ) AS tt WHERE tt.more_than_once > 1; ---->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. -- los actions devueltos no existen en la tabla results.actions -- list shall be EMPTY SELECT * FROM results.actions WHERE action IN ( SELECT id FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor IS NULL ); -- With a random User -- Shall be empty WITH my_users AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users ), max_users AS ( SELECT max(row_num) FROM my_users ), random_user AS ( SELECT id FROM my_users WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)-1) + 1)::int ) )SELECT * FROM results.actions WHERE action IN ( SELECT id FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor = (SELECT id FROM random_user) ); ---->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.........>>>>>>>>> -- el campo expire de los data.actions devueltos estan dentro del rango de los parametros de start, end WITH date_interval AS ( SELECT TRUNC(EXTRACT(EPOCH FROM to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')))::INTEGER AS start_datetime, TRUNC(EXTRACT(EPOCH FROM to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')))::INTEGER AS end_datetime ) SELECT * FROM ( SELECT id, CASE WHEN (TRUNC(EXTRACT(EPOCH FROM expire)) >= (SELECT start_datetime FROM date_interval) AND TRUNC(EXTRACT(EPOCH FROM expire)) <= (SELECT end_datetime FROM date_interval)) THEN TRUE ELSE FALSE END AS m_match FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor IS NULL ) AS tt WHERE tt.m_match = FALSE; -- with a random user -- Shall be empty WITH date_interval AS ( SELECT TRUNC(EXTRACT(EPOCH FROM to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')))::INTEGER AS start_datetime, TRUNC(EXTRACT(EPOCH FROM to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')))::INTEGER AS end_datetime ), my_users AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users ), max_users AS ( SELECT max(row_num) FROM my_users ), random_user AS ( SELECT id FROM my_users WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)-1) + 1)::int ) ) SELECT * FROM ( SELECT id, CASE WHEN (TRUNC(EXTRACT(EPOCH FROM expire)) >= (SELECT start_datetime FROM date_interval) AND TRUNC(EXTRACT(EPOCH FROM expire)) <= (SELECT end_datetime FROM date_interval)) THEN TRUE ELSE FALSE END AS m_match FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-06-01T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-10T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor = (SELECT id FROM random_user) ) AS tt WHERE tt.m_match = FALSE ; -- el campo expire de los data.actions devueltos estan dentro del rango de los parametros de start, end Parametros Default: start: lunes - 8 dias, end: lunes, actor_uuid= NULL, **intervalo**: `start <= data.actions.expire <= end` -- For these test cases apply the same as before just update dates ----TESTING------uv_pending_actions---->>>>>>>> -- Parametros: start < end, actor_uuid=some-actor-uuid, intervalo: start <= data.actions.expire <= end -- output: -- la lista de objects devueltos son un subconjunto propio de los objetos asignados al empleado filtrado -- Test output shall return an empty list WITH my_users AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users ), max_users AS ( SELECT max(row_num) FROM my_users ), random_user AS ( SELECT id FROM my_users WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)-1) + 1)::int ) ), actor_assignments AS ( SELECT object, actor FROM data.objects_assignment WHERE actor = (SELECT id FROM random_user) ) SELECT * FROM ( SELECT ac_assi.object, ac_assi.actor, da_upa.actor AS da_upa_actor, da_upa.object AS da_upa_object FROM actor_assignments AS ac_assi LEFT JOIN data.uv_pending_actions AS da_upa ON da_upa.actor = ac_assi.actor AND da_upa.object = ac_assi.object ) AS tt WHERE actor IS NULL OR object IS NULL; --->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. --- los action son unicos WITH my_users AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users ), max_users AS ( SELECT max(row_num) FROM my_users ), random_user AS ( SELECT id FROM my_users WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)-1) + 1)::int ) ), actor_assignments AS ( SELECT object, actor FROM data.objects_assignment WHERE actor = (SELECT id FROM random_user) ) SELECT * FROM ( SELECT id, expire, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS more_than_once FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-05-25T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-01T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor = (SELECT id FROM random_user) ) AS tt WHERE tt.more_than_once > 1; ---->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. -- los actions devueltos no existen en la tabla results.actions -- list shall be EMPTY WITH my_users AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users ), max_users AS ( SELECT max(row_num) FROM my_users ), random_user AS ( SELECT id FROM my_users WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)-1) + 1)::int ) ) SELECT * FROM results.actions WHERE action IN ( SELECT id FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-05-25T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-01T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor = (SELECT id FROM random_user) ); -- Parametros: start < end, actor_uuid=some-actor-uuid, el actor no tiene ningun object asignado, -- intervalo: start <= data.actions.expire <= end -- list shall be EMPTY WITH la_moderna_id AS ( SELECT id FROM public.tenants WHERE slug = 'lamoderna' LIMIT 1 ), actor_w_no_assignments AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users WHERE id NOT IN ( SELECT actor FROM data.objects_assignment WHERE tenant = (SELECT * FROM la_moderna_id) ) AND tenant_id = (SELECT * FROM la_moderna_id) ), max_users AS ( SELECT max(row_num) FROM actor_w_no_assignments ), random_user AS ( SELECT id FROM actor_w_no_assignments WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)) + 1)::int ) )SELECT * FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-05-25T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-01T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor = (SELECT id FROM random_user); ------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- Parametros: start < end, actor_uuid=some-actor-uuid, Filtra los objetos unicos, -- intervalo: start <= data.actions.expire <= end -- test-output: EMPTY list WITH la_moderna_id AS ( SELECT id FROM public.tenants WHERE slug = 'lamoderna' LIMIT 1 ), actor_w_assignments AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM public.users WHERE id IN ( SELECT actor FROM data.objects_assignment WHERE tenant = (SELECT * FROM la_moderna_id) ) AND tenant_id = (SELECT * FROM la_moderna_id) ), max_users AS ( SELECT max(row_num) FROM actor_w_assignments ), random_user AS ( SELECT id FROM actor_w_assignments WHERE row_num = ( SELECT floor(random() * ((SELECT * FROM max_users)) + 1)::int ) ), pending_objects AS ( SELECT * FROM data.uv_pending_actions WHERE expire >= to_timestamp('2020-05-25T00:00:00.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND expire <= to_timestamp('2020-06-01T23:59:59.000', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') AND actor = (SELECT id FROM random_user) )SELECT object, actor FROM pending_objects WHERE object NOT IN (SELECT object FROM data.objects_assignment WHERE actor=(SELECT id FROM random_user)) ; ``` ### Consultando todos las actions pendientes con gql ``` --Query query GET_PENDING_ACTIONS($where: data_uv_pending_actions_bool_exp) { objects: data_uv_pending_actions_aggregate(where: $where) { aggregate { count(distinct: true, columns: object) } } pendings: data_uv_pending_actions_aggregate(where: $where) { aggregate { count(distinct: true, columns: id) } nodes { id name object tenant actor expire extra } } } --Query Variables { "where": { "_and": { "expire": {"_gte": "2020-06-01", "_lte": "2020-06-30" }, "actor": {"_eq": "291b6505-e988-47da-8f78-80bc3750aff4"}, "tenant": {"_eq": 2} } } } ``` ### Ejemplos > Todas las acciones pendientes de Santiago Lopéz del 1 al 10 de junio de 2020 de la cadena:SORIANA y formato: SORIANA SUPER ```graphql=2 query GET_PENDING_ACTIONS($where: data_uv_pending_actions_bool_exp) { objects: data_uv_pending_actions_aggregate(where: $where) { aggregate { count(distinct: true, columns: object) } } pendings: data_uv_pending_actions_aggregate(where: $where) { aggregate { count(distinct: true, columns: id) } nodes { id name object tenant actor expire extra } } } ``` Variables ```jsonld=1 { "where": { "_and": { "expire": {"_gte": "2020-06-01", "_lte": "2020-06-10" }, "actor": {"_eq": "291b6505-e988-47da-8f78-80bc3750aff4"}, "tenant": {"_eq": 2} }, "extra": { "_contains": { "chain": "SORIANA", "format": "SORIANA SUPER" } } } } ``` ###### tags: `indicadores` `mak` `doc` `gql` `testing`