GlobalLink ya lee dbo.Tareas y no ofrece un horario ocupado.
Lo que falta es el inverso: cuando un prospecto reserva, esa fila tiene que existir
en su sistema. Este pedido es sólo el calendario. El write-back de prospectos
(Clientes, Contactos, Servicios, Propuestas) sigue en el A1 y no se toca aquí.
Correr el GRANT de abajo en TrulyGestion y responder las cuatro líneas del cierre. El usuario user_globallink_writer ya existe: no hay que crear login ni abrir firewall. La IP no cambia: 178.156.243.235/32.
El mismo candado que ya tienen: SELECT e INSERT sobre dbo.Tareas. UPDATE y DELETE denegados. Primero en la base de pruebas.
Qué IdTipoTarea es una cita agendada por GlobalLink. No lo inventamos. El catálogo tiene once tipos y ninguno encaja solo.
Automatica = true es cola del sistema (no ocupa hueco). Las horas son las de la oficina, con la fecha centinela 1900-01-01.
Fila nueva + ustedes cierran la anterior. No podemos mover ni borrar: el DENY es a propósito.
El usuario ya inserta en las cuatro tablas del A1. dbo.Tareas no está en esa lista, y la cláusula 2.5(b) del A1 prohíbe insertar en cualquier otra «salvo addendum adicional firmado». Este GRANT es la mitad técnica; el papel (A1.2) lo redactamos cuando contesten el punto 2.
/* Primero en TrulyGestion. Las productivas, cuando abran. */ USE [TrulyGestion]; GRANT SELECT, INSERT ON dbo.Tareas TO [user_globallink_writer]; DENY UPDATE, DELETE ON dbo.Tareas TO [user_globallink_writer]; -- Cuando abran producción, lo mismo en Truly, TrulyNew y TrulyRuso.
Verificación, conectados como ese usuario. Tienen que salir dos filas concedidas y dos denegadas:
SELECT o.name AS tabla, p.permission_name, p.state_desc FROM sys.database_permissions p JOIN sys.objects o ON o.object_id = p.major_id WHERE p.grantee_principal_id = DATABASE_PRINCIPAL_ID('user_globallink_writer') AND o.name = 'Tareas' ORDER BY p.permission_name; -- prueba negativa: esto TIENE que fallar con error 229 UPDATE dbo.Tareas SET Observaciones = Observaciones WHERE 1 = 0;
Hasta el 12 de septiembre el espejo guardaba 14 columnas: el día, el vendedor, el tipo, el texto y si estaba hecha. Faltaban las cinco que hacen de eso una agenda: HoraInicio, HoraFin, Automatica, Superpuesta e IdNivel. Esas cinco ya están. No copiamos las 27 —Nuevo, Marca, Sel y las de corrección no sirven para agendar—.
Si el vendedor tiene un tramo escrito a mano, GlobalLink no ofrece esa hora. Lo que genera su sistema (cola de control de calidad y de renovación) se ve y no bloquea un hueco. Lo que falta es el INSERT cuando el prospecto reserva.
El catálogo AuxTiposTareas tiene once tipos. Medido sobre las 2,7 millones de tareas del espejo:
| Id | Qué es | Duración moda | Automáticas | Filas |
|---|---|---|---|---|
| 1 | Llamar por teléfono | 60 min | 91 % | 1.705.731 |
| 5 | Otro | 60 min | 0 % | 357.095 |
| 26 | Realizar supervisión | 120 min | 90 % | 254.137 |
| 8 | Entrevista | 120 min | 55 % | 120.015 |
| 22 | Seguimiento de cliente potencial | 60 min | 89 % | 112.573 |
| 15 | Entregar propuesta | 30 min | 0 % | 6.010 |
El 8 («Entrevista») suena al natural, pero más de la mitad de sus filas las genera el sistema: meter ahí las citas de GlobalLink las mezcla con trabajo automático. Los únicos dos enteramente humanos son el 5 y el 15, y ninguno describe una cita con un prospecto.
Hay un IdTipoTarea = 24 con una fila en sus datos, que el catálogo no nombra. Puede ser exactamente el que falta. Esto lo deciden ustedes: un tipo que ya exista, o uno nuevo en AuxTiposTareas.
Una cita de GlobalLink es una fila nueva en dbo.Tareas, y nada más. No escribimos una tarea por cada avance del prospecto: las etapas siguen en dbo.Contactos, como el A1 ya autoriza. La cita no es Automatica: la acordó una persona con el prospecto. Si a esa hora el vendedor ya tiene algo ocupado, no escribimos en ningún lado.
| Columna | Qué escribimos |
|---|---|
| IdEmpleado | El vendedor. El mismo que ya viaja en el token de acceso. |
| IdCliente | El cliente o prospecto, si ya existe. Si todavía no, NULL. |
| IdTipoTarea | El que ustedes indiquen en el punto 2. Hasta que no esté, no hay INSERT. |
| Tarea | El texto de la cita (quién, con quién, de qué). |
| FechaTarea | El día acordado. |
| HoraInicio · HoraFin | Hora local de la oficina, con la convención 1900-01-01 + la hora. |
| Automatica | false — la cita no la generó un proceso. |
| Superpuesta | false — no ofrecemos un horario ocupado. |
| Realizada | false — sólo ustedes marcan una tarea como hecha. |
| Observaciones | La marca GLOBALLINK:{id_cita}, para no insertar dos veces la misma. |
| IdUsuarioCreacion · IdUsuarioActual | El IdEmpleado del vendedor. El mismo criterio que el A1.1. |
| Columna | Por qué no |
|---|---|
| IdTarea | La genera su identity. Nosotros no la inventamos. |
| IdTarea_Original | Vacía en el origen casi siempre. No la usamos. |
| Nuevo · Marca · Sel | Marcas internas suyas. Irrelevantes para una cita. |
| IdServicio · IdReclamo | Una cita con un prospecto todavía no tiene servicio ni reclamo. Van en NULL. |
| IdNivel · IdSubTipoTarea | No las inventamos. Si el tipo que nombren las exige, díganos el valor. |
| TareaCorregida · FechaTareaCorregida | Correcciones suyas. Quedan vacías. |
| FechaActual | La pone su sistema al tocar la fila. No la escribimos. |
| FechaCreacion | En el origen suele ir vacía. No la rellenamos. |
| upsize_ts | La mueve el motor de SQL Server. No se escribe a mano. |
Si alguna de estas, en su operación, no puede ir vacía, díganos cuál y qué valor poner. Hasta entonces, NULL.
TrulyGestion? (sí / no). Las productivas, cuando abran.IdTipoTarea = ___ para una cita de GlobalLink. Si hay que crear la fila en AuxTiposTareas, el nombre en español, inglés y portugués.Automatica y el huso local de la oficina son como los describimos? (sí / la regla es otra: ___).El addendum que la cláusula 2.5(b) pide para esta tabla lo redactamos con esas cuatro respuestas y se los mandamos a firma. Mandarlo antes obligaría a escribir en el papel un tipo que nos inventamos. Hasta que existan el GRANT, el tipo y el A1.2 firmado, el programa no emite el INSERT.