Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

ÍNDICE

Índice
excludeÍNDICE


01. VISIÓN GENERAL

El Nuevo Flujo de Compras ayuda en la gestión, control y toma de decisiones con relación al área de compras de su empresa.
La herramienta permite adoptar mejores estrategias para la gestión de solicitudes de compras recibidas, además de entregar una nueva experiencia en la jornada de cotizaciones. Durante los meses, otros procesos de compras se modernizarán y se pondrán a disposición con el objetivo de simplificar procesos, optimizar el tiempo de las operaciones y agilizar las tareas de su cotidiano. 

02. EJEMPLO DE UTILIZACIÓN

Aquí se pueden visualizar ejemplos prácticos de las principales funcionalidades del Nuevo Flujo de Compras.

...

Expandir
titleMigrar cotizaciones

Es posible migrar cotizaciones generadas por las rutinas "Genera cotización, actualiza cotización y analiza cotización" al Nuevo flujo de compras, por medio del migrador puesto a disposición en la opción del canto superior derecho.

Esta opción realiza la compatibilidad de las cotizaciones existentes en la base para que sean compatibles con el nuevo flujo de compras, para poder continuar con el proceso por medio de las nuevas rutinas del NFC o incluso tener el historial de cotizaciones finalizadas.

Todo el proceso se realiza en segundo plano y el usuario tiene la opción de recibir una notificación por e-mail cuando se finalice la migración. Si el servidor de e-mail necesitara de autenticación, será necesario activar el parámetro MV_RELAUTH.

Importante: La migración es irreversible, no hay cómo deshacer la compatibilidad y regresar las cotizaciones a la rutinas legadas.





03. REQUISITOS PREVIOS MÍNIMOS

Aviso
  1. El Nuevo Flujo de Compras necesita de la LIB del Framework Protheus® igual o superior a la fecha de 27/02/2023 que se puede descargar de la dirección: LIB-download.
  2. Para el correcto funcionamiento del Workflow en la Jornada de compras, debe aplicarse el paquete de Expedición continua del módulo del BI, porque tiene los fuentes responsables por el funcionamiento del workflow. Baje el paquete de expedición continua en el enlace: Paquetes de actualización - Workflow.


04. CONFIGURACIÓN

Vea a continuación los procesos que se deben configurar:

Totvs custom tabs box
tabs01- Acceso, 02 - Workflow, 03 - Puerto multiprotocolo
idsconfig1,config2,config3,config4
Totvs custom tabs box items
defaultyes
referenciaconfig1
Informações
titleAcceso embarcado - Protheus

*Embarcado: Acceso vía menú del Protheus.

Es necesario agregar al menú de Compras la rutina PGCA010 para acceder al NFC mediante el menú del Protheus. A partir del release 12.1.2410 la rutina estará en el menú por estándar.

Ejemplo:

Totvs custom tabs box items
defaultno
referenciaconfig2
Informações
titleWORKFLOW

El Workflow se podrá configurar para enviar la solicitud de cotización, directamente a los proveedores participantes.
Esto permitirá al proveedor, por medio de un formulario recibido en el e-mail, informar precio, plazo y condiciones de oferta de su producto, actualizando automáticamente la cotización en el Protheus.

Informações
titleCÓMO CONFIGURAR EL WORKFLOW
Informações
titleAtención

El Workflow se puede configurar de dos maneras: por Wizard (Configuración del Workflow), que es un asistente paso a paso para facilitar la configuración, disponible en la página del NFC, solamente para usuarios administradores, así como también se puede configurar manualmente, siguiendo las orientaciones del presente documento.

Tenemos también el wizard para crear la caja de e-mail para los compradores - directamente en el workflow - que queda disponible si el parámetro MV_PGCWF estuviera activo en la base o también, la configuración se puede hacer manualmente.

Si desea utilizar el Wizard para configurar el WorkFlow, lea las instrucciones y haga clic en la solapa Por Wizard. Si desea configurar manualmente, lea las instrucciones de la solapa Por Manual.

Aviso
titleSugerencia

Utilice el facilitador de prueba WFTEST estándar del Protheus para validar de manera fácil la configuración y funcionamiento del workflow. Acceda a la documentación: Haga clic aquí | WFTEST

Totvs custom tabs box
tabsVía Wizard, vía Manual
idswizard,manual
Totvs custom tabs box items
defaultyes
referenciawizard
Expandir
titleConfiguración WorkFlow
  • Para iniciar el proceso de configuración de Workflow por NFC, el usuario conectado debe ser del tipo administrador en el Protheus. Para configurar, siga los siguientes pasos:
    • Acceda al NFC con usuario administrador.
    • Haga clic en la opción de perfil (icono a la derecha, en la parte superior de la pantalla), para mostrar los submenús existentes. Haga clic en el menú con el nombre Configuración Workflow


    • Siga las etapas del wizard, informando los datos solicitados:
      • En el primer paso del configurador, el sistema explicará para qué sirve el Wizard del workflow y sus objetivos, para que el usuario puedan entender su funcionamiento.
      • En la segunda etapa del wizard - Parámetros y archivos - informe en el campo Directorio de trabajo del Workflow - el lugar (carpeta) donde los archivos físicos del wizard se grabarán en el servidor. Por ejemplo, si los archivos se grabarán en la estructura Protheus_Data\workflow, informe \workflow en el campo.
        OBS: El valor del campo se almacenará en los parámetros (SX6) MV_WFDIR y MV_WFDHTTP
        Además, constará en esta pantalla enlaces para el acceso a la documentación de referencia del NFC, así como a los dos archivos html que se utilizan para enviar el e-mail a los proveedores. Descargue (download) estos archivos y colóquelos en la misma carpeta de dicho campo.
        Haga clic en la opción Próxima etapa, para avanzar en el wizard.
      • En la tercera etapa - Datos del servidor - informe la Dirección (IP) pública del servidor del workflow. Informe el Puerto del servidor de workflow. Informe el Nombre del entorno donde el workflow se ejecuta y en el campo Nombre/IP y puerto del servidor, el sistema monta automáticamente la sugerencia, con la dirección IP, puerto y nombre del entorno.
        OBS: El valor del campo Nombre/IP y puerto del servidor de workflow se almacenará en el parámetro (SX6) MV_WFBRWSR.
        Haga clic en la opción Próxima etapa, para avanzar en el wizard.


      • En la cuarta etapa - Puerto multiprotocolo - el sistema avisará si existe la clave [MULTIPROTOCOL] en el entorno, y si está activa.
        Haga clic en la opción Próxima etapa, para avanzar en el wizard.


      • En la quinta etapa - Parámetros de e-mail de los compradores - informe los datos solicitados en la pantalla, como dirección y puerto del servidor SMTP y POP3/MAP, para que cuando el parámetro MV_PGCWF esté activo, los usuarios no necesiten informar estos campos en el wizard de configuración de e-mail.
      • OBS: Los valores de los campos de esta etapa se grabarán en los parámetros (SX6):
        MV_PGCPISV - Servidor de e-mail POP 3/ IMAP de los compradores.
        MV_PGCPIPO - Puerto de e-mail POP 3/ IMAP de los compradores.
        MV_PGCSMSR - Servidor de e-mail SMTP de los compradores.
        MV_PGCSMPO - Puerto de e-mail SMTP de los compradores.
        MV_PGCTAUT - Tipo de autenticación del servidor de e-mail: TLS, SSL o ninguno.
        Haga clic en la opción Próxima etapa, para avanzar en el wizard.


      • En la sexta etapa - Finalización - el sistema avisa que al avanzar, los datos se grabarán en la base y el sistema montará el modelo de appserver.ini, además mostrará una notificación de éxito.

Expandir
titleConfiguración - e-mail del comprador
  • Para iniciar el proceso de configuración de E-mail del comprador por NFC, el parámetro MV_PGCWF debe estar activo en el entorno. Para configurar, siga los siguientes pasos:
    • Acceda al NFC.
    • Haga clic en la opción de perfil (icono a la derecha, en la parte superior de la pantalla), para mostrar los submenús existentes. Haga clic en el menú con el nombre Wizard E-mail comprador
    • Siga las etapas del wizard, informando los datos solicitados:
      • En la primera etapa del configurador, el sistema explicará para qué sirve el Wizard de e-mail del comprador y sus objetivos, para que el usuario pueda comprender su funcionamiento.
      • En la segunda etapa del wizard - E-mail del comprador, el sistema permite que el usuario informe el nombre de la bandeja de e-mail (como estándar, será el e-mail del usuario, sin caracteres especiales), el nombre del comprador (que estará en el e-mail) y el e-mail del usuario (que consta en el registro de usuarios del sistema y no es posible modificar).
        Haga clic en la opción Próxima etapa, para avanzar en el wizard.
      • En la tercera etapa - Autenticación - el campo de e-mail se completará automáticamente, de acuerdo con el e-mail registrado en el usuario, y debe informarse la contraseña del e-mail, que se utilizará en la autenticación de los servidores de e-mail.
        Haga clic en la opción Próxima etapa, para avanzar en el wizard.
      • En la cuarta etapa - Servidores SMTP y POP 3/IMAP - si el usuario administrador utilizó el wizard de configuración de parámetros y webservice o completó los parámetros MV_PGCPISV, MV_PGCPIPO, MV_PGCSMSR, MV_PGCSMPO y MV_PGCTAUT, las informaciones de servidores SMTP y PO3/IMAP estarán cumplimentadas automáticamente, bastando seguir a la próxima etapa. Pero si es necesario, el usuario puede cambiar manualmente, según su necesidad.
        Haga clic en la opción Próxima etapa, para avanzar en el wizard.
      • En la quinta etapa - Finalización - el sistema alerta que al avanzar, se creará una nueva bandeja de e-mail y se activará un e-mail de prueba, para verificación de los datos imputados. Al final, aparecerá un aviso de éxito, indicando que la cuenta se creó con éxito.


  • Para editar la contraseña u otra característica del e-mail creado del comprador:
    • Al nombrar la bandeja de e-mail, solamente utilice letras, números y subrayado (_), para crear el nombre. Si incluye espacio en blanco, será automáticamente convertido a subrayado y otros caracteres especiales no se considerarán, además de que el sistema convertirá todo a mayúsculas. Por ejemplo, si incluye el nombre "Rt 78%#o", el sistema convertirá a "RT_78O".
    • Por estándar, el sistema sugerirá como nombre el e-mail del usuario, pero sin los caracteres especiales (solamente se acepta el subrayado). Es decir, si el e-mail del usuario fuera [email protected], se mostrará COMPRASFINANCEIROTESTECOMBRCOMPRASFINANCEIROTESTECOMBR;
    • En el campo Nombre de la bandeja de e-mail, se aceptarán únicamente letras, números y subrayado (_, conocido como underline). Cualquier otro carácter no se considerará, es decir, si se digita compr.$a_s1@teste, se convertirá a COMPRA_S1TESTE;
    • Espacio en blanco en el nombre se convertirá a subrayado, por ejemplo, minhA CAI2a, se convertirá a MINHA_CAI2A.
    • Basta rehacer los pasos anteriores, para que el sistema entienda que se trata de una modificación y grabe los nuevos valores en el sistema. Al final, el sistema emitirá un aviso de alerta, informando que el e-mail se modificó con éxito.
    • Importante: Si se modifica el nombre de la bandeja de e-mail, el sistema verificará si ya existe para aquella sucursal, un nombre igual. Si existiera, por medida de integridad de datos, el nuevo nombre no se considerará y se mantendrá el actual.
Totvs custom tabs box items
defaultno
referenciamanual
Expandir
titlePaso 1 - Configuración del WebService en el appserver.ini
  • Actualice el appserver.ini de su entorno con configuraciones esenciales, esto permitirá que el proveedor reciba y responda el formulario de solicitud de cotización.

    Copie e incluya en su entorno el siguiente ejemplo, modifique las informaciones en negrita a informaciones de su entorno, tales como:
    PATH: Camino de las carpetas en su servidor hasta el directorio Protheus_data\http-root (si la carpeta http-root no existe, puede crearla)
    PORT: Puerto de comunicación del WebService (Generalmente se inicia con 80)
    ENVIRONMENT: Nombre del entorno/RPO
    localhost:8091: IP público y puerto abierto para que el proveedor logre enviar la respuesta del formulario de cotización
    ONSTART: Si su appserver.ini ya tenía una clave ONSTART, agregue los job JOB_WS_T1,WF_INDEX a esta clave.

    Informações
    iconfalse
    titleEJEMPLO WEBSERVICE PGC

    ;-------------------------------- WEBSERVICE - NFC--------------------------------------------

    [HTTP]
    ENABLE=1
    PATH=C:\TOTVS\Protheus12_2310\Protheus_data\http-root
    PORT=8091
    ENVIRONMENT=P2310
    INSTANCES=1,10
    XFRAMEOPTIONS=ALLOW-FROM *
    UPLOADPATH=\web

    [localhost:8091/ws]
    ENABLE=1
    PATH=C:\TOTVS\Protheus12_2310\Protheus_data\web\ws
    ENVIRONMENT=P2310
    INSTANCENAME=WS
    RESPONSEJOB=JOB_WS_T1
    DEFAULTPAGE=wsindex.apw

    [JOB_WS_T1]
    TYPE=WEBEX
    ENVIRONMENT=P2310
    INSTANCES=1,10
    SIGAWEB=WS
    INSTANCENAME=WS
    ONSTART=__WSSTART
    ONCONNECT=__WSCONNECT
    PREPAREIN=ALL

    [localhost:8091/wf]
    enable=1
    port=8091
    PATH=C:\TOTVS\Protheus12_2310\Protheus_data
    environment=P2310
    responsejob=WF_INDEX
    DEFAULTPAGE=wsindex.apw

    [WF_INDEX] 
    TYPE=WEB
    environment=P2310
    INSTANCES=1,10
    SIGAWEB=WF
    INSTANCENAME=WF
    ONSTART=STARTWEBEX
    ONCONNECT=CONNECTWEBEX
    ONEXIT=FINISHWEBEX

    [MAIL]
    Protocol=SMTP
    ExtendSMTP=1
    SSLVersion=3
    AuthLOGIN=1
    AuthPLAIN=1
    TLSVersion=3

    [OnStart]
    jobs=JOB_WS_T1,WF_INDEX



Expandir
titlePaso 2 - Configuración del parámetro MV_WFBRWSR

Realice la configuración del parámetro que indicará la URL o nombre del servidor HTTP.

  • En el paso 1, definimos el IP y Puerta público que se utilizará para recibir la respuesta de la solicitud de cotización de nuestro proveedor, este mismo IP y Puerto se deben informar en el parámetro MV_WFBRWSR.

    Aviso
    titleImportante:

    El parámetro se debe informar iniciando con http:// o https://
    Ejemplo: http://localhost:8091/wf
     
    Donde el localhost:8091 será su IP y el puerto público es el definido en el paso 1.                                                                                                                                                       




Expandir
titlePaso 3 - Directorio de disponibilidad de los HTML

Verifique la existencia de la carpeta "workflow" dentro de la carpeta "Protheus_data" en el directorio de instalación del Protheus. Si no existe, se puede crearla.

  • Realice el download de acuerdo con las siguientes orientaciones, descomprima e inclúyalos dentro de la carpeta workflow mencionada anteriormentelizar o download conforme as orie-los dentro da pasta workflow citada acima.

Ejemplo:


  • Aviso
    titleImportante:

    Si decide poner a disposición los archivos en otro directorio, no deje de actualizar el parámetro MV_WFDIR del paso 4.                                                                                                                                                    

  • Versión:
    • Es esencial verificar la versión correcta de los archivos del formulario workflow. Si no se encuentran o estuvieran en una versión incorrecta, el sistema mostrará el siguiente mensaje: 'El archivo pgca030_mailXXX_AAAAMMDD.HTML utilizado por el workflow no se encontró o está desactualizado. Para bajar el archivo actual, consulte la documentación del NFC en la sección de Workflow'.
  • Observaciones:
    • Para paquetes de expedición continua anteriores al 28/03/2024, debe utilizarse el archivo formulario_workflow_sem_versao.zip
    • Para preservar la integridad de la funcionalidad del workflow, es importante no modificar el nombre de los archivos HTML.
  • Versiones:
Expandir
titlePaso 4 - Configuración del parámetro MV_WFDIR

Realice la configuración del parámetro que indicará el directorio donde los archivos HTML del paso 4 se pusieron a disposición.

  • En el paso 3, definimos el directorio donde se pondrán a disposición los archivos HTML, este mismo directorio se debe informar en el parámetro MV_WFDIR
    Ejemplo de contenido del parámetro MV_WFDIR: \workflow



    Aviso
    titleImportante:

    Si decide poner a disposición los archivos en otro directorio, no deje de mover los archivos HTML al directorio correcto, siguiendo el paso 3.                                                                                                                                           

    Aviso
    titleAtención - WFTEST

    El workflow del NFC se comporta igual a la rutina WFTEST - rutina que busca probar si las configuraciones de workflow están correctas, enviando e-mail de prueba.
    Luego, si al ejecutar la rutina WFTEST ocurre un error - el workflow del NFC tampoco se enviará, porque sigue el mismo comportamiento - verifique si las configuraciones de parámetros (SX6) y del appserver.ini del entorno están correctas - verificando las informaciones presentes en este manual - para que el workflow del NFC funcione adecuadamente.

    Informaciones sobre la rutina WFTEST están en el tópico Asuntos relacionados.

Expandir
titlePaso 5 - Configuración de e-mail en el Protheus

Realice la configuración del e-mail por el que enviará el formulario al proveedor, solicitando la cotización:

  • Acceda al módulo de configuración > Entorno > WorkFlow > Cuentas de e-mail > Incluir


    Ejemplo de configuración del e-mail do GMAIL:

    mceclip0.png

    Informações
    titleObservaciones:
    • Actualmente la mayoría de los proveedores SMTP utilizan un puerto diferente del estándar, generalmente utilizan la 465 o 587. 
    • El Gmail utiliza el puerto 465 cuando la seguridad utilizada es la SSL y el puerto 587 cuando la seguridad es la TLS.
    Aviso
    titleImportante:

    Dicho proceso no está relacionado a la configuración de e-mail para informes, descrito en la documentación: Configure el SMTP para envío de informes por e-mail.



Expandir
titlePaso 6 - (Opcional) - Envío de solicitud de cotización con el e-mail del comprador

Se puede enviar la solicitud de cotización al proveedor utilizando el e-mail del comprador, esto permite que el proveedor responda directamente al comprador alguna duda o pregunta.

¿Cómo habilitar este recurso?

  1. Habilite el parámetro MV_PGCWF
  2. Realice el paso 5 de la configuración, registrando el e-mail del comprador (Esta rutina de registro se pondrá a disposición en el menú del comprador para que este mismo realice el registro - WFC003).
  3. El e-mail registrado debe constar en el registro de usuario del mismo.


Aviso
titleImportante:

El valor estándar del parámetro MV_PGCWF se desactiva, donde se utilizará la cuenta de e-mail estándar del Protheus definida en el MV_WFMLBOX.

Totvs custom tabs box items
defaultno
referenciaconfig3
Informações
titlePuerto multiprotocolo
  • En la sección GENERAL, se debe incluir l clave “App_Environment”, cuyo valor debe ser el nombre del entorno donde los servicios se ejecutarán. 
  • En la sección DRIVERS, se debe habilitar el puerto multiprotocoloen la clave “MultiProtocolPort” con el valor = 
  • Como estándar, la conexión SSLestá activa en el puerto multiprotocolo, los detalles de las configuraciones están disponibles en la documentación Application Server - Puerto multiprotocolo. Para inhabilitar la conexión por SSL es necesario informar la clave “MultiProtocolPortSecure = 0” Application Server - Puerto multiprotocolo.

05. NOTAS DE VERSIÓN

A continuación se pueden visualizar todas las novedades en cada versión:

Expandir
titleExpandir
Expandir
titleOctubre/2024
  1. Implementación de la inclusión de la fecha de entrega por ítem, edición manual y workflow;
  2. Implementación de la generación de un contrato fijo;
  3. Implementación de la lista de precios en la edición de la cotización con cumplimentación automático de los valores;
Expandir
titleJulio/2024
  1. Actualización para una mejor visualización de las columnas y sus nombres en tablas/listados.
  2. Implementación de una funcionalidad para grabar la configuración del usuario en campos seleccionados para que se visualicen u oculten en tablas/listados.
  3. Implementación de una funcionalidad para seleccionar automáticamente al vencedor con el mejor precio en el análisis por ítem
  4. Implementación de "desistencia da compra" donde se permite eliminar el ítem de la cotización durante su ejecución.
  5. Implementación del migrador de cotizaciones
Expandir
titleJunio/2024
  1. Implementación de la funcionalidad de compra centralizada.
  2. Implementación de la funcionalidad de Contactos vs. Proveedores para envío del workflow.
Expandir
titleAbril/2024
  1. Implementación de la nueva interfaz MVC para edición de la cotización
  2. Implementación de la edición de impuestos por medio de la nueva interfaz de edición de la cotización
  3. Implementación de impuestos IPI e ICMS-ST en el formulario workflow que serán editados por el proveedor
  4. Implementación de la selección de condición de pago flexible en el envío del workflow
  5. Implementación de la rutina automática de edición de cotización
  6. Implementación de posibilidad de puntos de entrada durante la edición de la cotización por medio de la nueva interfaz.
  7. Correcciones generales de usabilidad y desempeño
Expandir
titleMarzo/2024
  1. Implementación de la opción "grabador borrador" en el formulario workflow.
  2. Correcciones generales de usabilidad y desempeño
Expandir
titleFebrero/2024
  1. Implementación del análisis de cotización por ítem parcial
  2. Correcciones generales de usabilidad y desempeño
Expandir
titleEnero/2024
  1. Implementación de la visualización de la observación de la solicitud de compras
  2. Implementación de filtro por comprador en la lista de cotizaciones
  3. Visualización de dados del proveedor en la pantalla de edición de la cotización
  4. Visualización clara de moneda utilizada en la edición de la cotización
  5. Correcciones generales de usabilidad
Expandir
titleDiciembre/2023
  1. Implementación de generación de cotización utilizando Producto vs Proveedor y MV_SELFOR = N
  2. Implementación de visualización de solicitudes de compras vinculadas a la cotización.
  3. Implementación del listado de pedidos y contratos generados por la cotización.
  4. Corrección de ordenación de propuesta por precio, considerando impuestos.
  5. Modificación de texto para una mejor atención de análisis por propuesta completa.
  6. Ajuste para permitir modificar el TES cuando la cotización se completó por Workflow.
  7. Implementación de la guía de configuración del e-mail del comprador.
  8. Implementación de la guía de configuración y sugerencia del WORKFLOW.
Expandir
titleNoviembre/2023
  1. Corrección en el funcionamiento del WorkFlow, permitiendo la utilización del "WFTEST" estándar para probar el funcionamiento.
  2. Corrección en la lista de solicitudes de compras cuando el campo C1_DATPRF esté marcado como browse.
  3. Correcciones generales de usabilidad y desempeño.
Expandir
titleOctubre/2023
  1. Correcciones diversas en los documentos adjuntos.
  2. Corrección en el filtro de la necesidad de compras.
  3. Corrección en el registro de nuevo participante.
  4. Corrección en el refresh del carrito de compras.
  5. Corrección en el formulario de workflow.
  6. Correcciones generales de desempeño y usabilidad.
Expandir
titleSeptiembre/2023
  1. Se implementó la funcionalidad para obtener informaciones del RCPJ del proveedor, por medio de la API de TOTVS Carol.
  2. Se implementó la generación de cotización para proveedor Participantes.
  3. Se incluyó nueva columna que muestra la cantidad de respuestas de los proveedores recibidas por la cotización.
  4. Se implementó la generación del contrato.
  5. Se implementó la funcionalidad para generación de nuevo proveedor para la cotización.
  6. Corrección para limpieza del localStorage en la inicialización de la aplicación.
  7. Corrección para encontrar los documentos adjuntos correctamente si el proveedor fuera participante.
  8. Se retiró cargamento de campos del tipo Memo a la pantalla de Necesidad de compras.
  9. Corrección para validar tipo de contrato y planilla fijos independientemente del parámetro MV_VLDTPFI.
  10. Corrección para que las columnas devuelvan la cantidad de propuestas respondidas y descartadas.
Expandir
titleJunio/2023
  1. Se implementaron Campos personalizados en el Browse de Necesidad de compras y cotizaciones.
  2. Se implementó la funcionalidad de grabar preferencias de campos del tipo suite en Necesidad de compras.
  3. Se efectuó la mejora de devolución de mensaje de la API de Workflow para facilitar la implantación.
  4. Corrección para que después de efectuar la búsqueda por código de producto y limpiar el campo.
  5. Corrección para retirar la obligatoriedad de los campos en la actualización de los contactos.
  6. Corrección para que al declinar una Propuesta del Workflow el proceso ocurra correctamente.
  7. Corrección para que al utilizar otras monedas en el formulario de Workflow la grabación ocurra correctamente.
  8. Corrección para el bloqueo de productos que ocurría de forma intermitente en la Generación de cotización.
  9. Corrección del ícono de documento adjunto al visualizar documentos adjuntos y finalizar la lista.
  10. Corrección para considerar los valores de gasto y seguro en el Análisis por ítem.
  11. Corrección para que después de efectuar el Análisis "Por ítem" de Cotización parcial, sea posible dar continuidad al proceso con la cantidad restante.
  12. Corrección para ejecutar la URL correcta de la API de Análisis de la cotización.
  13. Corrección para que al borrar todos los documentos adjuntos antes de enviar el Workflow, no ocurra la validación de Documento adjunto no encontrado.
  14. Corrección para que no se permita fecha de recepción de la cotización inferior a la fecha actual.
Expandir
titleMayo/2023
  1. Se implementó el Mapa de cotización.
  2. Se implementó el Filtro por grupo de producto.
  3. Se incluyó el Campo de TES en la Edición de la cotización.
  4. Se incluyó la funcionalidad de Borrado de propuesta.
  5. Corrección de documento adjunto no encontrado.
  6. Corrección de descripción del Título de la pantalla de edición de la cotización.
  7. Corrección del campo de descuento al utilizar Nueva propuesta.
  8. Corrección para no permitir descuento negativo en la Edición de la cotización.
  9. Corrección de error al desistir de bajar el documento ajunto.
  10. Corrección en el Endpoint para devolver propuestas parciales de Proveedores.
  11. Corrección de mensaje de producto bloqueado para productos liberados.
  12. Corrección de error mostrado al realizar un filtro en la solapa Atendidas.
  13. Corrección en el loading de búsqueda de producto.
  14. Corrección en la pantalla de Otros campos para no grabar datos al hacer clic en Finalizar.
  15. Corrección del campo cantidad disponible si MV_ZERPROP = 1.
  16. Corrección en la exhibición de los Impuestos complementarios en la pantalla de impuestos por ítem.
  17. Corrección en el campo Tipo de flete da edición de cotización para el mismo comportamiento del legado.
  18. Corrección de devolución de las cotizaciones por orden del total de la cotización.
Expandir
titleAbril/2023
  1. Implementación de los campos de Cantidad de proveedores participantes y cantidad de productos cotizados en la lista de cotizaciones.
  2. Implementación del de filtro por estatus "Todos, pendientes, en análisis y finalizado" en la lista de cotizaciones.
  3. Implementación de los campos personalizados de la tabla SC8 en la edición de cotización.
  4. Implementación de edición de la observación que se llevará al pedido de compra en el análisis de cotización.
  5. Implementación de opción para generar nuevas propuestas, manual y vía workflow.
  6. Corrección en el envío de e-mail por workflow.
  7. Corrección para mostrar mensaje de aviso al actualizar contacto de proveedor abierto por otro usuario.
  8. Correcciones generales de usabilidad y desempeño.

06. TABLAS, PARÁMETROS Y

...

CAMPOS RESERVADOS

A continuación se pueden visualizar los parámetros y tablas utilizados por el NFC:

Expandir
titleTablas
  • DHU (Cabeçalho da Cotação)
  • DHV (Produtos da Cotação)
  • SA2 (Fornecedores)
  • SB1 (Descrição Genérica do Produto)
  • SC1 (Solicitações de Compra)
  • SC8 (Cotações)
  • AC9 (Relação de Objetos x Entidades)
  • ACB (Bancos de Conhecimentos)
  • SCE (Encerramento de Cotações)
  • SC7 (Pedido de Compra)
  • DKI (Contatos x Fornecedores)
  • DKK (Cabecalho template WF)
  • DHU (Encabezado de la cotización)
  • DHV (Productos de la cotización)
  • SA2 (Proveedores)
  • SB1 (Descripción genérica del producto)
  • SC1 (Solicitudes de compra)
  • SC8 (Cotizaciones)
  • AC9 (Relación de Objetos vs. Entes)
  • ACB (Bancos de conocimientos)
  • SCE (Cierre de cotizaciones)
  • SC7 (Pedido de compra)
  • DKI (Contactos vs. Proveedores)
  • DKK (Encabezado template WF) 


    Expandir
    title
Parámetros
  • MV_PGCWF - Permite utilizar el e-mail del comprador para enviar el formulario de workflow al proveedor.
  • MV_SELFOR - Permite que el comprador seleccione a los proveedores libremente o solamente entre los vinculados en el Producto vs. Proveedor.
  • MV_PCEXCOT - Habilita la reapertura de la cotización al eliminar un pedido de compra o contrato.
  • MV_TPPLA - Tipo de la planilla que se utilizará al generar un contrato proveniente de la cotización.
  • MV_APIFOR - Habilita la cumplimentación automática de datos del proveedor con la API TOTVS Carol (Se utiliza informando el RCPJ al transformar al participante de la cotización en proveedor)
  • MV_PGCPISV - Servidor de e-mail POP 3/ IMAP de los compradores.
  • MV_PGCPIPO - Puerto de e-mail POP 3/ IMAP de los compradores.
  • MV_PGCSMSR - Servidor de e-mail SMTP de los compradores.
  • MV_PGCSMPO - Puerto de e-mail SMTP de los compradores.
  • MV_PGCTAUT - Tipo de autenticación del servidor de e-mail: TLS, SSL o ninguno.
  • MV_COTFIAP - En el caso de cotización con compra centralizada, los pedidos se generarán en la sucursal de entrega o en la sucursal de compra.
  • MV_GRIMPWF - Informa si se debe calcular el IPI e ICMS-ST (incluso en cero en el workflow), de acuerdo con los valores del sistema, o considerar únicamente los valores provenientes del Workflow. El parámetro es del tipo lógico. Situación: Respuesta del workflow del proveedor con valores de IPI e ICMS-ST que están en cero:.T. - El sistema calculará los valores y grabará en los respectivos campos SC8 / .F. - El sistema no calculará los valores y los respectivos campos continuarán en cero.

07. PUNTOS DE ENTRADA Y RUTINA AUTOMÁTICA

Expandir
titleRutina automática - Edición de la cotización

La rutina automática de edición de cotización se realiza por medio de la instancia del modelo NFCA020.
Esta rutina tiene como objetivo realizar únicamente la edición de la cotización, con los datos que se transfieren a la rutina.

A continuación, un ejemplo de utilización:

Aviso
titleAtención

Se trata de un ejemplo básico, que debe adaptarse a las necesidades de la organización. Además, solamente los campos que se muestran en la rutina Edición de cotización MVC pueden editarse por medio de la rutina automática, es decir, si intentar editar/incluir un valor en un campo que no se muestra en la rutina Edición de cotización MVC, no se grabará el campo.

Bloco de código
languagevb
#Include 'TOTVS.ch'
#Include 'FWMVCDef.ch'
#Include 'Protheus.ch'

/*/{Protheus.doc} EdicaoComp
	Ejemplo de rutina automática con la función NFCA020, para editar una cotización existente
@author equipe
@since 10/10/2024
@return nil, nil, nil.
/*/
User Function EdicaoComp()
Local cNumCotacao   := "000204"
Local cCodFornec    := "000001"
Local cLoja         := "00"
Local cNomeFornec   := "TESTE IT"
Local cNumProposta  := "01"
Local oModel        := nil
Local oGridSC8      := nil
Local oFormDHU      := nil
Local nFor          := 0
Local cMsg          := ""

//Inicializando el entorno RpcSetEnv( "T1", "D MG 01 ",,, "COM") 
     
DHU->( DbSetOrder(1) ) //DHU_FILIAL+DHU_NUM
if ( DHU->( DbSeek(xFilial("DHU") + cNumCotacao) ) )

    oModel   := FwLoadModel("NFCA020")
    oFormDHU := oModel:GetModel("DHUMASTER")
    oGridSC8 := oModel:GetModel("SC8DETAIL")
    
    /*Activar la siguiente función, informando el número de la cotización, código del proveedor, nombre del proveedor y número de la propuesta, para que
    ocurra la inicialización correcta de los objetos JSON de la rutina. Si no lo hicieran, ocurrirá un error, porque los objetos estarán vacíos y es ESENCIAL llamar a la rutina .*/
    NF020SetSup(cNumCotacao, cCodFornec, cLoja, cNomeFornec, cNumProposta)

    oModel:SetOperation(MODEL_OPERATION_UPDATE)    
    oModel:Activate()
 
    //Editar el valor del  Seguro, Gasto y Contacto en la cotización
    oFormDHU:SetValue('DHU_SEGURO' , 95.79)
    oFormDHU:SetValue('DHU_DESPESA', 248.41)
    oFormDHU:SetValue('DHU_CONTATO', 'Antonio Moreira')

    //Editando los ítems de la cotización
    for nFor := 1 to oGridSC8:Length()
        oGridSC8:GoLine(nFor)
        oGridSC8:setValue("C8_PRECO", 47.56)
        oGridSC8:setValue("C8_QTDISP", 1) 
        oGridSC8:LoadValue("C8_ALIIPI", 5.00)
    next nFor  

    //Válido si el formulario está con información correcta y consistente
    if ( oModel:VldData() )
        oModel:commitData()
        msgalert("¡Cotización editada!" )
    else 
        cMsg := oModel:getErrorMessage()[6] + " - " + oModel:getErrorMessage()[4] + CRLF
        cMsg += oModel:getErrorMessage()[8] //https://tdn.totvs.com/display/public/framework/FWFormModel - GetErrorMessage
        msgalert("ERRO: " + cMsg)
    endif
 
endif

FWFreeObj(oModel)
FWFreeObj(oGridSC8)
FWFreeObj(oFormDHU)
 
return nil
  • Campos - Tabla DKK

    DKK - Encabezado template WF


    SX2 - Informaciones de la tabla 

    Campo 

    Descripción

    X2_CHAVE

    DKK

    X2_NOME

    Encabezado template WF         

    X2_UNICO

    DKK_FILIAL + DKK_CODIGO

    X2_MODO

    C

    X2_MODOUN

    E

    X2_MODOEMP

    E



    SIX - Índices das tablas

    Campo

    Descripción

    ÍNDICE

    DKK

    ORDEN

    1

    CLAVE

    DKK_FILIAL+DKK_CODIGO

    DESCRIPCIÓN

    Código



    SX3 - Informaciones de los campos

    Campo

    Descripción

    Campo

    DKK_FILIAL

    Tipo

    Carácter

    Tamaño

    8

    Decimal

    0

    Título

    Sucursal

    Descripción

    Sucursal

    Utilizado

    No

    Obligatorio

    No

    Browse

    No

    Orden

    01

    Grupo SXG

    033


    Campo

    Descripción

    Campo

    DKK_CODIGO

    Tipo

    Carácter

    Tamaño

    6

    Decimal

    0

    Formato

    @!

    Título

    Código

    Descripción

    Código template

    Utilizado

    Obligatorio

    No

    Browse

    No

    Contexto

    Real

    Propiedad

    Modificar

    Inic. Estándar

    GETSXENUM("DKK","DKK_CODIGO")

    Orden

    02


    Campo

    Descripción

    Campo

    DKK_REVIS

    Tipo

    Carácter

    Tamaño

    6

    Decimal

    0

    Formato

    @!

    Título

    Revisión 

    Descripción

    Revisión template

    Utilizado

    Obligatorio

    No

    Browse

    No

    Contexto

    Real

    Propiedad

    Modificar

    Orden

    03


    Campo

    Descripción

    Campo

    DKK_LOGO

    Tipo

    Carácter

    Tamaño

    200

    Decimal

    0

    Formato

    @!

    Título

    Camino Logo

    Descripción

    Camino del logotipo

    Utilizado

    Obligatorio

    No

    Browse

    Contexto

    Real

    Propiedad

    Modificar

    Orden

    04



    Campo

    Descripción

    Campo

    DKK_COR

    Tipo

    Carácter

    Tamaño

    10

    Decimal

    0

    Formato

    @!

    Título

    Color

    Descripción

    Color del template

    Utilizado

    Obligatorio

    No

    Browse

    No

    Contexto

    Real

    Propiedad

    Modificar

    Orden

    05

  • DKL (Ítems template WF)

    • Expandir
      titleCampos - Tabla DKL

      DKL - Ítems template WF


      SX2 - Informaciones de la tabla 

      Campo 

      Descripción

      X2_CHAVE

      DKL

      X2_NOME

      Ítems template WF

      X2_UNICO

      DKK_FILIAL + DKK_CODIGO

      X2_MODO

      C

      X2_MODOUN

      E

      X2_MODOEMP

      E



      SIX - Índices das tablas

      Campo

      Descripción

      ÍNDICE

      DKL

      ORDEN

      1

      CLAVE

      DKL_FILIAL+DKL_CODIGO

      DESCRIPCIÓN

      Código


      Campo

      Descripción

      ÍNDICE

      DKL

      ORDEN

      2

      CLAVE

      DKL_FILIAL+DKL_CODDKK

      DESCRIPCIÓN

      Código DKK



      SX3 - Informaciones de los campos

      Campo

      Descripción

      Campo

      DKL_FILIAL

      Tipo

      Carácter

      Tamaño

      8

      Decimal

      0

      Título

      Sucursal

      Descripción

      Sucursal

      Utilizado

      No

      Obligatorio

      No

      Browse

      No

      Orden

      01

      Grupo SXG

      033


      Campo

      Descripción

      Campo

      DKL_CODIGO

      Tipo

      Carácter

      Tamaño

      6

      Decimal

      0

      Formato

      @!

      Título

      Código

      Descripción

      Código ítem template

      Utilizado

      Obligatorio

      No

      Browse

      No

      Contexto

      Real

      Propiedad

      Modificar

      Orden

      02


      Campo

      Descripción

      Campo

      DKL_CODDKK

      Tipo

      Carácter

      Tamaño

      6

      Decimal

      0

      Formato

      @!

      Título

      Código DKK

      Descripción

      Código template DKK

      Utilizado

      Obligatorio

      No

      Browse

      No

      Contexto

      Real

      Propiedad

      Modificar

      Orden

      03


      Campo

      Descripción

      Campo

      DKL_TABELA

      Tipo

      Carácter

      Tamaño

      3

      Decimal

      0

      Formato

      @!

      Título

      Tabla

      Descripción

      Código de la tabla

      Utilizado

      Obligatorio

      No

      Browse

      No

      Contexto

      Real

      Propiedad

      Modificar

      Orden

      04



      Campo

      Descripción

      Campo

      DKL_CAMPO

      Tipo

      Carácter

      Tamaño

      10

      Decimal

      0

      Formato

      @!

      Título

      Nombre campo

      Descripción

      Nombre del campo

      Utilizado

      Obligatorio

      No

      Browse

      No

      Contexto

      Real

      Propiedad

      Modificar

      Orden

      05


      Campo

      Descripción

      Campo

      DKL_VINC

      Tipo

      Carácter

      Tamaño

      1

      Decimal

      0

      Formato

      @!

      Título

      Vínculo WF

      Descripción

      Vínculo del campo con e-mail

      Utilizado

      Obligatorio

      No

      Browse

      No

      Contexto

      Real

      Propiedad

      Modificar

      CBOX

      1=Encabezado;2=Ítems;3=Pie de página

      Orden

      06


      Campo

      Descripción

      Campo

      DKL_EDIT

      Tipo

      Carácter

      Tamaño

      1

      Decimal

      0

      Formato

      @!

      Título

      Editable

      Descripción

      Editable

      Utilizado

      Obligatorio

      No

      Browse

      No

      Contexto

      Real

      Propiedad

      Modificar

      CBOX

      1=Editable;2=Visualización

      Inic. Estándar

      "1"

      Orden

      07


      Campo

      Descripción

      Campo

      DKL_OBRIGA

      Tipo

      Carácter

      Tamaño

      1

      Decimal

      0

      Formato

      @!

      Título

      Obligatorio

      Descripción

      Obligatorio

      Utilizado

      Obligatorio

      No

      Browse

      No

      Contexto

      Real

      Propiedad

      Modificar

      CBOX

      1=Sí;2=No            

      Inic. Estándar

      "2"

      Orden

      08

  • Búsqueda estándar DHU
    • Expandir
      titleConsulta estándar DHU

      Consulta estándar DHU


      Consulta SXB

      Alias

      DHU

      Tipo

      1 - Consulta

      Secuencia

      01

      Columna

      DB

      Descripción

      DHU

      Contiene

      DHU



      Alias

      DHU

      Tipo

      2 - Órdenes

      Secuencia

      01

      Columna

      01

      Descripción

      Núm.cotización



      Alias

      DHU

      Tipo

      4 - Columnas

      Secuencia

      01

      Columna

      01

      Descripción

      Núm.cotización

      Contiene

      DHU_NUM



      Alias

      DHU

      Tipo

      4 - Columnas

      Secuencia

      01

      Columna

      02

      Descripción

      Fch. Emisión

      Contiene

      DHU_DTEMIS



      Alias

      DHU

      Tipo

      4 - Columnas

      Secuencia

      01

      Columna

      03

      Descripción

      Alias Cot.

      Contiene

      DHU_AGPCOT



      Alias

      DHU

      Tipo

      5 - Devolución

      Secuencia

      01

      Contiene

      DHU->DHU_NUM



      Alias

      DHU

      Tipo

      6 - Filtro

      Secuencia

      01

      Contiene

      NF030SDFilt()

Expandir
titleParámetros
  • MV_PGCWF - Permite utilizar el e-mail del comprador para enviar el formulario de workflow al proveedor.
  • MV_SELFOR - Permite que el comprador seleccione a los proveedores libremente o solamente entre los vinculados en el Producto vs. Proveedor.
  • MV_PCEXCOT - Habilita la reapertura de la cotización al eliminar un pedido de compra o contrato.
  • MV_TPPLA - Tipo de la planilla que se utilizará al generar un contrato proveniente de la cotización.
  • MV_APIFOR - Habilita la cumplimentación automática de datos del proveedor con la API TOTVS Carol (Se utiliza informando el RCPJ al transformar al participante de la cotización en proveedor)
  • MV_PGCPISV - Servidor de e-mail POP 3/ IMAP de los compradores.
  • MV_PGCPIPO - Puerto de e-mail POP 3/ IMAP de los compradores.
  • MV_PGCSMSR - Servidor de e-mail SMTP de los compradores.
  • MV_PGCSMPO - Puerto de e-mail SMTP de los compradores.
  • MV_PGCTAUT - Tipo de autenticación del servidor de e-mail: TLS, SSL o ninguno.
  • MV_COTFIAP - En el caso de cotización con compra centralizada, los pedidos se generarán en la sucursal de entrega o en la sucursal de compra.
  • MV_GRIMPWF - Informa si se debe calcular el IPI e ICMS-ST (incluso en cero en el workflow), de acuerdo con los valores del sistema, o considerar únicamente los valores provenientes del Workflow. El parámetro es del tipo lógico. Situación: Respuesta del workflow del proveedor con valores de IPI e ICMS-ST que están en cero: .T. - El sistema calculará los valores y grabará en los respectivos campos SC8 / .F. - El sistema no calculará los valores y los respectivos campos continuarán en cero.
  • MV_PGCOBC1 - ¿La observación de SC1 debe cargarse en la Cotización y PC, en el NFC? .T. - Para Sí / .F. - No (estándar)
  • MV_NFCMOED - Parámetro que verifica si el registro de la moneda se utilizará de la tabla CTO o del parámetro MV_MOEDA, donde 1=CTO(Estándar) / 2=MV_MOEDA
  • MV_CALQIPI - Parámetro que deshabilita el recálculo automático del porcentaje y valor de IPI, donde al quedar con el valor .T. (True), el sistema no va a recalcular automáticamente los valores y alícuotas de IPI; y el valor .F. (False), indica que el sistema debe realizar el estándar, es decir, recalcular automáticamente si la alícuota o valor fueran modificados, de acuerdo con el sistema opera actualmente. El estándar del parámetro es .F., es decir, mantener el recálculo de los campos de alícuota y valor de IPI automáticos.
  • MV_NFCDTRE - Permite modificar el plazo de recepción de la cotización .T. = Activado; .F. = Desactivado (Si el parámetro estuviera activo, la opción para modificación aparecerá en la pantalla de edición de la cotización).
Expandir
titleNombres de campos reservados en la rutina NFCA020

Con la rutina de Cotización híbrida de la NFC, en la pantalla de edición de la cotización (en MVC), tenemos algunos campos exclusivos presentes en la pantalla, que tienen nombres reservados y que no deben utilizarse en la creación de campos personalizados en las tablas SC8 - Cotizaciones y DHU - Encabezado de la cotización, pues pueden generar conflictos con la rutina.

A continuación, listamos los nombres reservados de los campos en la rutina NFCA020, que no deben utilizarse en la creación/personalización de campos en las tablas SC8 y DHU:

Tabla

Nombre del campo

Descripción

DHU

DHU_TPFORN

¿Proveedor registrado?

DHU

DHU_CODFOR

Código del proveedor

DHU

DHU_LOJAFOR

Tienda

DHU

DHU_NOMFOR

Nombre del proveedor

DHU

DHU_EMAIL

E-mail

DHU

DHU_CONTATO

Contacto

DHU

DHU_NUMPRO

Propuesta

DHU

DHU_DESC

% Descuento

DHU

DHU_TOTIT

Total ítems

DHU

DHU_TOTCOT

Total cotización

DHU

DHU_VLDESC

Valor descuento

DHU

DHU_FRETE

Tipo flete

DHU

DHU_VALFRE

Flete

DHU

DHU_COND

Condición de pago

DHU

DHU_MOEDA

Moneda

DHU

DHU_TXMOEDA

Tasa de la moneda

DHU

DHU_DESPESA

Gastos

DHU

DHU_SEGURO

Seguro

DHU

DHU_TOTIPI

Valor IPI

DHU

DHU_TOTICM

Valor ICMS

DHU

DHU_TOTISS

Valor impuesto ISS

DHU

DHU_TOTICO

Total ICMS complementario

DHU

DHU_TOTDIF

Total DIFAL

DHU

DHU_TOTISO

Total ICMS solidario

SC8

C8_ZXDESCR

Descripción


07. PUNTOS DE ENTRADA Y RUTINA AUTOMÁTICA

Aviso
titleAtención - Puntos de entrada con interfaz

Los puntos de entrada del Nuevo flujo de compras no permiten la presentación de interfaz debido a la tecnología utilizada. Las personalizaciones posibles se activarán en momentos de procesamiento, semejante al comportamiento  de execauto.

Expandir
titleRutina automática - Inclusión de cotización (API REST)

Es posible incluir una cotización en el Nuevo flujo de compras por API REST.

A continuación, un ejemplo de utilización:

Aviso
titleAtención

Se trata de un ejemplo básico, que debe adaptarse a las necesidades de la organización.


URL EndPoint: POST localhost:9090/rest/api/com/v1/pgcgeneratequotation/execauto

  • Observación: La url "localhost:9090/rest" puede variar de acuerdo con la configuración REST de su organización.

Headers:

  • tenantId:EMPRESA,FILIAL
    • Observación: En el parámetro EMPRESA, incluya el código correspondiente a la empresa, y en el parámetro SUCURSAL, incluya el código de la sucursal. Asegúrese de no incluir espacios en los parámetros del header, pues esto es esencial para el correcto funcionamiento.
  • Accept-Charset:utf8
    • Observación: Este parámetro garantiza que los mensajes de error o éxito sean codificados en UTF-8, evitando la exhibición de caracteres extraños o ilegibles.

A continuación se muestra un ejemplo de body de inclusión de cotización con 1 Solicitud de compra que se cotizará con 2 Proveedores, uno que tiene registro y el otro no.

{
   "quoteGroupNickname":"PRUEBA EXECAUTO1",
   "receiptQuote":"20250215",
   "sendWorkflow":"true",
   "items":[

      {
         "c1_filial":"SUCURSAL",
         "c1_num":"NUMEROSC",
         "c1_produto":"CODIGODELPRODUCTO",
         "c1_item":"0001",
         "c1_itemgrd":"   ",
         "notesupplier":"observación para el proveedor",
         "proposals":[
             {
                "suppliercode":"CODIGOPROVEEDOR",
                "store":"TIENDA",
             },
             {
                "suppliercode":"",
                "store":"",
                "companyname":"PARTICIPANTE SIN REGISTRO",
                "email":"participante@participante.com.br"
             }
         ]
      }
   ]
}

Aviso
titleAtención - MV_SELFOR

El parámetro MV_SELFOR, determina si el comprador podrá seleccionar cualquier proveedor registrado(MV_SELFOR=S) o solamente los que hubieran sidos homologados y tuvieran registro de producto vs. proveedor(MV_SELFOR=N).

Para tratar este caso, existe un cambio en el envío de los datos:
MV_SELFOR = S →  Todos los proveedores cotizarán todos los productos, por lo tanto, la propriedad PROPOSALS y su contenido debe repetirse a cada solicitud de compra de la lista.

Expandir
titleEjemplo - MV_SELFOR = S

{
   "quoteGroupNickname":"PRUEBA EXECAUTO1",
   "receiptQuote":"20250215",
   "sendWorkflow":"true",
   "items":[

      {
         "c1_filial":"SUCURSAL",
         "c1_num":"SC1000",
         "c1_produto":"CODIGODELPRODUCTO",
         "c1_item":"0001",
         "c1_itemgrd":"   ",
         "notesupplier":"observación para el proveedor",
         "proposals":[
             {
                "suppliercode":"CODIGOPROVEEDOR",
                "store":"TIENDA",
             },
             {
                "suppliercode":"",
                "store":"",
                "companyname":"PARTICIPANTE SIN REGISTRO",
                "email":"participante@participante.com.br"
             }
         ]
      },

      {
         "c1_filial":"SUCURSAL",
         "c1_num":"SC2000",
         "c1_produto":"CODIGODELPRODUCTO",
         "c1_item":"0001",
         "c1_itemgrd":"   ",
         "notesupplier":"observación para el proveedor",
         "proposals":[
             {
                "suppliercode":"CODIGOPROVEEDOR",
                "store":"TIENDA",
             },
             {
                "suppliercode":"",
                "store":"",
                "companyname":"PARTICIPANTE SIN REGISTRO",
                "email":"participante@participante.com.br"
             }
         ]
      }
   ]
}




MV_SELFOR = N →  Los proveedores cotizarán solamente los productos para el cual están homologados(registrados en Producto vs. Proveedor) por lo tanto la propiedad PROPOSALS debe contener solamente los proveedores que están homologados para aquellos productos.

Expandir
titleEJemplo - MV_SELFOR = N

En el siguiente ejemplo, el PROVEEDOR1 está registrado tanto para el PRODUCTO1 como para el PRODUCTO2, entonces se enviará a ambas Solicitudes de compras.
El PROVEEDOR2 está registrado como el proveedor para el PRODUCTO1, sin embargo, no está para el PRODUCTO2, por lo tanto, no podrá enviarse.


{

   "quoteGroupNickname":"PRUEBA EXECAUTO1",
   "receiptQuote":"20250215",
   "sendWorkflow":"true",
   "items":[

      {
         "c1_filial":"SUCURSAL",
         "c1_num":"SC1000",
         "c1_produto":"PRODUCTO1",
         "c1_item":"0001",
         "c1_itemgrd":"   ",
         "notesupplier":"observación para el proveedor",
         "proposals":[
             {
                "suppliercode":"PROVEEDOR1",
                "store":"TIENDA",
             },
             {

                "suppliercode":"PROVEEDOR2",
                "store":"TIENDA",
             },
             {
                "suppliercode":"",
                "store":"",
                "companyname":"PARTICIPANTE SIN REGISTRO",
                "email":"participante@participante.com.br"
             }
         ]
      },

      {
         "c1_filial":"SUCURSAL",
         "c1_num":"SC2000",
         "c1_produto":"PRODUCTO2",
         "c1_item":"0001",
         "c1_itemgrd":"   ",
         "notesupplier":"observación para el proveedor",
         "proposals":[
             {
                "suppliercode":"PROVEEDOR1",
                "store":"TIENDA",
             },
             {
                "suppliercode":"",
                "store":"",
                "companyname":"PARTICIPANTE SIN REGISTRO",
                "email":"participante@participante.com.br"
             }
         ]
      }
   ]
}



Propiedad

Descripción

quoteGroupNickName

Alias de la cotización, complete el campo DHU_AGPCOT

receiptQuote

Fecha de recepción de la cotización, complete el campo DHU_DTRCOT

sendWorkflow

Determina si después de incluir la cotización se enviará al workflow automáticamente. Si fuera positivo, mirará el registro de condición de pago(E4_ATVWF) para determinar qué condiciones deben estar puestas a disposición y para el registro de contactos vinculado al proveedor para verificar a los e-mails que deben enviarse. Complete con true o false.

c1_filial

Código de la sucursal de las solicitudes y de la inclusión de la cotización

c1_num

Número de la solicitud de compra

c1_produto

Código del producto que consta en la solicitud

c1_item

Cuál es la posición que corresponde al producto en la Solicitud (Ítem 0001, 0002, 0003, etc.)

notesupplier

Observación que debe enviarse al proveedor vía workflow.

proposals

Contiene los proveedores participantes, debe repetirse para cada Solicitud de compra de la lista. 

suppliercode

Código del proveedor (Enviar en blanco si fuera participante sin registro)

store

Código de la tienda (Enviar en blanco si fuera participante sin registro)

companyname

Nombre del participante que no tiene registro en el sistema.

email

E-mail del participante que no tiene registro en el sistema.

Expandir
titleRutina automática - Inclusión de cotización (User Function)

Es posible incluir una cotización en el Nuevo flujo de compras por User Function.

A continuación, un ejemplo de utilización:

Aviso
titleAtención

Se trata de un ejemplo básico, que debe adaptarse a las necesidades de la organización.

Aviso
titleAtención - MV_SELFOR

El parámetro MV_SELFOR, determina si el comprador podrá seleccionar cualquier proveedor registrado(MV_SELFOR=S) o solamente los que hubieran sidos homologados y tuvieran registro de producto vs. proveedor(MV_SELFOR=N).

Para tratar este caso, existe un cambio en el envío de los datos:
MV_SELFOR = S →  Todos los proveedores cotizarán todos los productos, por lo tanto, la propriedad PROPOSALS y su contenido debe repetirse a cada solicitud de compra de la lista.

Expandir
titleEjemplo - MV_SELFOR = S
Bloco de código
languagec#
linenumberstrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "TOTVS.CH"
#INCLUDE "FWMVCDEF.CH"
#Include "RwMake.ch"
#Include "TbiConn.ch"

User Function GENERATEQUOT()
    Local oGenerateQuotation As Object
    Local jBody As Json
    Local jRet As Json
    Local lRet As Json
    Local nX As Numeric
    Local aForn1 := {} as array
    Local aItems := {} as array

    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01" USER "admin" PASSWORD "1234" MODULO "COM"
    
    oGenerateQuotation := pgc.generateQuotationRepository.pgcgenerateQuotationRepository():New('POST')
    jBody := JsonObject():New()

    // -- Inclusión de 3 proveedores que participarán.
    aAdd(aForn1, JsonObject():New())
    aForn1[1]['suppliercode']   := "000003"
    aForn1[1]['store']          := "01"
    aForn1[1]['companyname']    := "PROVEEDOR MIAMI"
    aForn1[1]['email']          := ""

    aAdd(aForn1, JsonObject():New())
    aForn1[2]['suppliercode']   := "03FORN"
    aForn1[2]['store']          := "01" 
    aForn1[2]['companyname']    := "PROVEEDOR 03"
    aForn1[2]['email']          := ""

    aAdd(aForn1, JsonObject():New())
    aForn1[3]['suppliercode']   := ""
    aForn1[3]['store']          := "" 
    aForn1[3]['companyname']    := "PARTICIPANTE"
    aForn1[3]['email']          := ""
    // -- Final inclusión de proveedores

    // -- Inclusión de las solicitudes
    aAdd(aItems, JsonObject():New())
    aItems[1]['c1_filial']  := "D MG 01 "
    aItems[1]['c1_num'] := "ZC0459"
    aItems[1]['c1_produto'] := "LF037                         "
    aItems[1]['c1_item'] := "0001"
    aItems[1]['c1_itemgrd'] := " "
    aItems[1]['notesupplier'] := "observación para el proveedor 1"
    aItems[1]['proposals'] := aForn1 // -- Incluye los proveedores (OBLIGATORIO INCLUIR)

    aAdd(aItems, JsonObject():New())
    aItems[2]['c1_filial']  := "D MG 01 "
    aItems[2]['c1_num'] := "ZC0460"
    aItems[2]['c1_produto'] := "LF037                         "
    aItems[2]['c1_item'] := "0001"
    aItems[2]['c1_itemgrd'] := " "
    aItems[2]['notesupplier'] := "observación para el proveedor 2"
    aItems[2]['proposals'] := aForn1 // -- Incluye los proveedores (OBLIGATORIO INCLUIR)

    jBody['quoteGroupNickname'] := "EXECAUTO1"
    jBody['receiptQuote']       := "20250215"

    jBody['items'] := aItems // -- Incluye las Solicitudes de compra con proveedores participantes.

    jRet := oGenerateQuotation:postExecAuto(jBody)
    lRet := oGenerateQuotation:lOk

    If lRet 
        Conout(jRet['message']) // Mensaje de grabado con éxito
        Conout(jRet['quotationCode']) // Código de la cotización
    Else 
        Conout(jRet['errorMessage']) // Mensaje de error

        If jRet:HasProperty('items') .And. Len(jRet['items']) > 0
            For nX := 1 To Len(jRet['items'])
                Conout('Item ' + AllTrim(Str(nX)) + ' tuvo el siguiente mensaje de error: ' +jRet['items'][nX]['errormessage'])
            Next nX
        EndIf
    EndIf

    RESET ENVIRONMENT

Return Nil




MV_SELFOR = N →  Los proveedores cotizarán solamente los productos para el cual están homologados(registrados en Producto vs. Proveedor) por lo tanto la propiedad PROPOSALS debe contener solamente los proveedores que están homologados para aquellos productos.

Expandir
titleEjemplo - MV_SELFOR = N

En el siguiente ejemplo, el PROVEEDOR1 está registrado tanto para el PRODUCTO1 como para el PRODUCTO2, entonces se enviará a ambas Solicitudes de compras.
El PROVEEDOR2 está registrado como el proveedor para el PRODUCTO1, sin embargo, no está para el PRODUCTO2, por lo tanto, no podrá enviarse.


Bloco de código
languagec#
linenumberstrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "TOTVS.CH"
#INCLUDE "FWMVCDEF.CH"
#Include "RwMake.ch"
#Include "TbiConn.ch"

User Function QUOTMVSELFOR()
    Local oGenerateQuotation As Object
    Local jBody As Json
    Local jRet As Json
    Local lRet As Json
    Local nX As Numeric
    Local aForn1 := {} as array
    Local aForn2 := {} as array
    Local aItems := {} as array

    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01" USER "admin" PASSWORD "1234" MODULO "COM"
    
    oGenerateQuotation := pgc.generateQuotationRepository.pgcgenerateQuotationRepository():New('POST')
    jBody := JsonObject():New()

    // -- Inclusión de proveedores que participarán.
    aAdd(aForn1, JsonObject():New())
    aForn1[1]['suppliercode']   := "PROVEEDOR1"
    aForn1[1]['store']          := "01"
    aForn1[1]['email']          := ""

    aAdd(aForn1, JsonObject():New())
    aForn1[2]['suppliercode']   := "PROVEEDOR2"
    aForn1[2]['store']          := "00"
    aForn1[2]['email']          := ""

    aAdd(aForn2, JsonObject():New())
    aForn2[1]['suppliercode']   := "PROVEEDOR1"
    aForn2[1]['store']          := "00"
    aForn2[1]['email']          := ""
    // -- Final inclusión de proveedores

    // -- Inclusión de las solicitudes
    aAdd(aItems, JsonObject():New())
    aItems[1]['c1_filial']  := "D MG 01 "
    aItems[1]['c1_num'] := "ZC0524"
    aItems[1]['c1_produto'] := "PRODUCTO1"
    aItems[1]['c1_item'] := "0001"
    aItems[1]['c1_itemgrd'] := " "
    aItems[1]['notesupplier'] := "observación para el proveedor 1"
    aItems[1]['proposals'] := aForn1 // -- Incluye los proveedores para este producto MV_SELFOR = N

    aAdd(aItems, JsonObject():New())
    aItems[2]['c1_filial']  := "D MG 01 "
    aItems[2]['c1_num'] := "ZC0525"
    aItems[2]['c1_produto'] := "PRODUCTO2"
    aItems[2]['c1_item'] := "0001"
    aItems[2]['c1_itemgrd'] := " "
    aItems[2]['notesupplier'] := "observación para el proveedor 2"
    aItems[2]['proposals'] := aForn2 // -- Incluye los proveedores para este producto MV_SELFOR = N

    jBody['quoteGroupNickname'] := "EXECAUTO-MVSELFOR=N"
    jBody['receiptQuote']       := "20250215"

    jBody['items'] := aItems // -- Incluye las Solicitudes de compra con proveedores participantes.

    jRet := oGenerateQuotation:postExecAuto(jBody)
    lRet := oGenerateQuotation:lOk

    If lRet 
        Conout(jRet['message']) // Mensaje de grabado con éxito
        Conout(jRet['quotationCode']) // Código de la cotización
    Else 
        Conout(jRet['errorMessage']) // Mensaje de error

        If jRet:HasProperty('items') .And. Len(jRet['items']) > 0
            For nX := 1 To Len(jRet['items'])
                Conout('Item ' + AllTrim(Str(nX)) + ' tuvo el siguiente mensaje de error: ' +jRet['items'][nX]['errormessage'])
            Next nX
        EndIf
    EndIf

    RESET ENVIRONMENT

Return Nil
  




Propiedad

Descripción

quoteGroupNickName

Alias de la cotización, complete el campo DHU_AGPCOT

receiptQuote

Fecha de recepción de la cotización, complete el campo DHU_DTRCOT

sendWorkflow

Determina si después de incluir la cotización se enviará al workflow automáticamente. Si fuera positivo, mirará el registro de condición de pago(E4_ATVWF) para determinar qué condiciones deben estar puestas a disposición y para el registro de contactos vinculado al proveedor para verificar a los e-mails que deben enviarse. Complete con true o false.

c1_filial

Código de la sucursal de las solicitudes y de la inclusión de la cotización

c1_num

Número de la solicitud de compra

c1_produto

Código del producto que consta en la solicitud

c1_item

Cuál es la posición que corresponde al producto en la Solicitud (Ítem 0001, 0002, 0003, etc.)

notesupplier

Observación que debe enviarse al proveedor vía workflow.

proposals

Contiene los proveedores participantes, debe repetirse para cada Solicitud de compra de la lista. 

suppliercode

Código del proveedor (Enviar en blanco si fuera participante sin registro)

store

Código de la tienda (Enviar en blanco si fuera participante sin registro)

companyname

Nombre del participante que no tiene registro en el sistema.

email

E-mail del participante que no tiene registro en el sistema.

Expandir
titleRutina automática - Edición de la cotización

La rutina automática de edición de cotización se realiza por medio de la instancia del modelo NFCA020.
Esta rutina tiene como objetivo realizar solamente la edición de la cotización, con los datos que se transfieren a la rutina.

A continuación, un ejemplo de utilización:

Aviso
titleAtención

Se trata de un ejemplo básico, que debe adaptarse a las necesidades de la organización. Además, solamente los campos que se muestran en la rutina Edición de cotización MVC pueden editarse por medio de la rutina automática, es decir, si intentar editar/incluir un valor en un campo que no se muestra en la rutina Edición de cotización MVC, no se grabará el campo.

Bloco de código
languagevb
#Include 'TOTVS.ch'
#Include 'FWMVCDef.ch'
#Include 'Protheus.ch'

/*/{Protheus.doc} EdicaoComp
	Ejemplo de rutina automática con la función NFCA020, para editar una cotización existente
@author equipe
@since 10/10/2024
@return nil, nil, nil.
/*/
User Function EdicaoComp()
Local cNumCotacao   := "000204"
Local cCodFornec    := "000001"
Local cLoja         := "00"
Local cNomeFornec   := "PRUEBA IT"
Local cNumProposta  := "01"
Local oModel        := nil
Local oGridSC8      := nil
Local oFormDHU      := nil
Local nFor          := 0
Local cMsg          := ""

//Inicializando el entorno
RpcSetEnv( "T1", "D MG 01 ",,, "COM") 
     
DHU->( DbSetOrder(1) ) //DHU_FILIAL+DHU_NUM
if ( DHU->( DbSeek(xFilial("DHU") + cNumCotacao) ) )

    oModel   := FwLoadModel("NFCA020")
    oFormDHU := oModel:GetModel("DHUMASTER")
    oGridSC8 := oModel:GetModel("SC8DETAIL")
    
    /*Activar la siguiente función, informando el número de la cotización, código del proveedor, nombre del proveedor y número de la propuesta, para que
    ocurra la inicialización correcta de los objetos JSON de la rutina. Si no lo hiciera, ocurrirá un error, porque los objetos estarán vacíos y es ESENCIAL activar la rutina.*/
    NF020SetSup(cNumCotacao, cCodFornec, cLoja, cNomeFornec, cNumProposta)

    oModel:SetOperation(MODEL_OPERATION_UPDATE)    
    oModel:Activate()
 
    //Editar el valor del  Seguro, Gasto y Contacto en la cotización
    oFormDHU:SetValue('DHU_SEGURO' , 95.79)
    oFormDHU:SetValue('DHU_DESPESA', 248.41)
    oFormDHU:SetValue('DHU_CONTATO', 'Antonio Moreira')

    //Editando los ítems de la cotización
    for nFor := 1 to oGridSC8:Length()
        oGridSC8:GoLine(nFor)
        oGridSC8:setValue("C8_PRECO", 47.56)
        oGridSC8:setValue("C8_QTDISP", 1) 
        oGridSC8:LoadValue("C8_ALIIPI", 5.00)
    next nFor  

    //Válido si el formulario está con información correcta y consistente
    if ( oModel:VldData() )
        oModel:commitData()
        msgalert("¡Cotización editada!" )
    else 
        cMsg := oModel:getErrorMessage()[6] + " - " + oModel:getErrorMessage()[4] + CRLF
        cMsg += oModel:getErrorMessage()[8] //https://tdn.totvs.com/display/public/framework/FWFormModel - GetErrorMessage
        msgalert("ERROR: " + cMsg)
    endif
 
endif

FWFreeObj(oModel)
FWFreeObj(oGridSC8)
FWFreeObj(oFormDHU)
 
return nil
Expandir
titleRotina automática - Incluir Nova Proposta

La rutina automática de nueva propuesta se realiza por medio de la instancia del modelo NFCA020.

El siguiente ejemplo tiene como finalidad la inclusión de una nueva propuesta con los datos que son transferidos a la rutina.

Informações
titleObservaciones
  • Asegúrese de que la variable lNewProp esté definida como .T. para que se incluya una nueva propuesta.
  • Si la variable lCleanProp , que indica si los datos de la nueva propuesta se limpiarán, esté definida como .T. , será necesario informar el campo de condición de pago.
  • La variable cNumProposta debe contener el número de la propuesta actual.
Bloco de código
languagevb
#Include 'TOTVS.ch'
#Include 'FWMVCDef.ch'
#Include 'Protheus.ch'
 
/*/{Protheus.doc} NovaPropos
    Ejemplo de rutina automática con la función NFCA020, para incluir una nueva propuesta
@author equipe
@since 12/06/2025
@return nil, nil, nil.
/*/

User Function NovaPropos()

    Local cNumCotacao	:= "A00001"
	Local cCodFornec	:= "000001"
	Local cLoja		    := "00"
	Local cNomeFornec	:= "PRUEBA IT"
	Local cNumProposta	:= "01" //Número de la propuesta actual
    Local lNewProp		:= .T.  //Indica si es nueva propuesta.
	Local lNewPart		:= .F.  //Indica si es nuevo participante
	Local lCleanProp	:= .F.  //Indica si limpia los datos de la nueva propuesta.
    Local cCondPag      := '001'
    Local cMsg          := ""

    //Inicializando el entorno
    RpcSetEnv( "T1", "D MG 01 ",,, "COM")

    DHU->( DbSetOrder(1) ) //DHU_FILIAL+DHU_NUM
    If ( DHU->( DbSeek(xFilial("DHU") + cNumCotacao) ) )

        oModel   := FwLoadModel("NFCA020")
        oFormDHU := oModel:GetModel("DHUMASTER")
        oGridSC8 := oModel:GetModel("SC8DETAIL")

        /*Activar la siguiente función, informando el número de la cotización, código del proveedor, nombre del proveedor y número de la propuesta, para que
        ocurra la inicialización correcta de los objetos JSON de la rutina. Si no lo hiciera, ocurrirá un error, porque los objetos estarán vacíos y es ESENCIAL activar la rutina.*/
        NF020SetSup(cNumCotacao, cCodFornec, cLoja, cNomeFornec, cNumProposta, lNewProp, lNewPart, lCleanProp, ,)
        
        oModel:SetOperation(MODEL_OPERATION_UPDATE)   
        oModel:Activate()

        //Incluye la información de la condición de pago
        oFormDHU:SetValue('DHU_COND' , cCondPag)

        //Válido si el formulario está con información correcta y consistente
        if ( oModel:VldData() )
            oModel:commitData()
            msgalert("¡Nueva propuesta incluida!" )
        else
            cMsg := oModel:getErrorMessage()[6] + " - " + oModel:getErrorMessage()[4] + CRLF
            cMsg += oModel:getErrorMessage()[8] //https://tdn.totvs.com/display/public/framework/FWFormModel - GetErrorMessage
            msgalert("ERROR: " + cMsg)
        endif
    EndIf
return nil
Expandir
titleRutina automática - Incluir nuevo participante

La rutina automática de nuevo participante se realiza por medio de la instancia del modelo NFCA020.

El siguiente ejemplo tiene como finalidad la inclusión de un nuevo participante con los datos que son transferidos a la rutina.

Informações
titleObservaciones

El campo DHU_TPFORN determina: 

  • '1' = Participante registrado
  • '2' = Participante no registrado
Bloco de código
languagevb
/*/{Protheus.doc} EdicaoComp
    Ejemplo de rutina automática con la función NFCA020, para incluir un nuevo participante
@author equipe
@since 12/06/2025
@return nil, nil, nil.
/*/

User Function NovoPart()

    Local cNumCotacao	:= "001009"
	Local cCodFornec	:= "000001"
	Local cLoja		    := "01"
    Local lNewProp		:= .F.  //Indica si es nueva propuesta.
	Local lNewPart		:= .T.  //Indica si es nuevo participante.
	Local lCleanProp	:= .F.  //Indica si limpia los datos de la nueva propuesta. 
    Local cCondPag      := '001'
    Local cMsg          := ""

    //Inicializando el entorno
    RpcSetEnv( "T1", "D MG 01 ",,, "COM")

    DHU->( DbSetOrder(1) ) //DHU_FILIAL+DHU_NUM
    If ( DHU->( DbSeek(xFilial("DHU") + cNumCotacao) ) )

        oModel   := FwLoadModel("NFCA020")
        oFormDHU := oModel:GetModel("DHUMASTER")
        oGridSC8 := oModel:GetModel("SC8DETAIL")

        /*Activar la siguiente función, informando el número de la cotización, código del proveedor, nombre del proveedor y número de la propuesta, para que
        ocurra la inicialización correcta de los objetos JSON de la rutina. Si no lo hiciera, ocurrirá un error, porque los objetos estarán vacíos y es ESENCIAL activar la rutina.*/
        NF020SetSup(cNumCotacao,,,,, lNewProp, lNewPart, lCleanProp, ,)
        
        oModel:SetOperation(MODEL_OPERATION_UPDATE)   
        oModel:Activate()

        //Campos del Nuevo participante
        oFormDHU:SetValue('DHU_TPFORN'  , '1') //-- 1=Registrado; 2=No registrado
		oFormDHU:SetValue('DHU_CODFOR'  , cCodFornec)
		oFormDHU:SetValue('DHU_LOJAFOR' , cLoja)
		oFormDHU:SetValue('DHU_EMAIL'   , '[email protected]')
		oFormDHU:SetValue('DHU_CONTATO' , 'contato')
		oFormDHU:SetValue('DHU_COND'    , cCondPag)

        //Válido si el formulario está con información correcta y consistente
        if ( oModel:VldData() )
            oModel:commitData()
            msgalert("¡Nuevo participante incluido!" )
        else
            cMsg := oModel:getErrorMessage()[6] + " - " + oModel:getErrorMessage()[4] + CRLF
            cMsg += oModel:getErrorMessage()[8] //https://tdn.totvs.com/display/public/framework/FWFormModel - GetErrorMessage
            msgalert("ERROR: " + cMsg)
        endif
    EndIf
return nil
Expandir
titleRutina automática - Calcular impuesto

La rutina automática de cálculo del impuesto se realiza por medio de la instancia del modelo NFCA020.

El siguiente ejemplo tiene como finalidad cálculo del impuesto con los datos que se transfieren a la rutina.

Bloco de código
languagevb
/*/{Protheus.doc} EdicaoComp
    Ejemplo de rutina automática con la función NFCA020, para calcular impuesto automático
@author equipe
@since 12/06/2025
@return nil, nil, nil.
/*/

User Function CalcImp()

    Local cNumCotacao	:= "001009"
	Local cCodFornec	:= "000001"
	Local cLoja		    := "00"
    Local cNomeFornec	:= "PRUEBA IT"
    Local cNumProposta	:= "01" //Número de la propuesta actual
    Local lNewProp		:= .F.  //Indica si es nueva propuesta.
	Local lNewPart		:= .T.  //Indica si es nuevo participante.
	Local lCleanProp	:= .F.  //Indica si limpia los datos de la nueva propuesta.  
    Local cCondPag      := '001'
    Local cMsg          := ""

    //Inicializando el entorno
    RpcSetEnv( "T1", "D MG 01 ",,, "COM")

    DHU->( DbSetOrder(1) ) //DHU_FILIAL+DHU_NUM
    If ( DHU->( DbSeek(xFilial("DHU") + cNumCotacao) ) )

        oModel   := FwLoadModel("NFCA020")
        oFormDHU := oModel:GetModel("DHUMASTER")
        oGridSC8 := oModel:GetModel("SC8DETAIL")

        /*Activar la siguiente función, informando el número de la cotización, código del proveedor, nombre del proveedor y número de la propuesta, para que
        ocurra la inicialización correcta de los objetos JSON de la rutina. Si no lo hiciera, ocurrirá un error, porque los objetos estarán vacíos y es ESENCIAL activar la rutina.*/
        NF020SetSup(cNumCotacao, cCodFornec, cLoja, cNomeFornec, cNumProposta, lNewProp, lNewPart, lCleanProp, ,)
        
        oModel:SetOperation(MODEL_OPERATION_UPDATE)   
        oModel:Activate()

        //Encabezado
        oFormDHU:SetValue('DHU_COND'  , cCondPag)
        oFormDHU:SetValue('DHU_MOEDA' , '01')
        oFormDHU:SetValue('DHU_FRETE' , 'C')

        //Ítem 1
        oGridSC8:SetValue('C8_PRECO'  , 100)
        oGridSC8:SetValue('C8_SITUAC' , '1')
        oGridSC8:SetValue('C8_TES'    , '018') //Tipo de Entrada

        //Calcular Imposto        
        NF020Calc()

        //Válido si el formulario está con información correcta y consistente
        if ( oModel:VldData() )
            oModel:commitData()
            msgalert("¡Impuesto calculado!" )
        else
            cMsg := oModel:getErrorMessage()[6] + " - " + oModel:getErrorMessage()[4] + CRLF
            cMsg += oModel:getErrorMessage()[8] //https://tdn.totvs.com/display/public/framework/FWFormModel - GetErrorMessage
            msgalert("ERROR: " + cMsg)
        endif
    EndIf
return nil
Expandir
titlePuntos de entrada MVC - Inclusión de la cotización

Pontos de Entrada MVC na rotina de Inclusão de Cotação híbrida PGCA020

Por ser una rutina en MVC, la Inclusión de cotización híbrida permite a los usuarios la utilización de diversos Puntos de entrada (sin presentación de interfaz), para que puedan realizar los desvíos y procesamientos personalizados, adecuados a la realidad de la organización. 

Breve explicación sobre puntos de entrada MVC: 

En los fuentes convencionales tenemos un "nombre" para cada punto de entrada creado, por ejemplo, en la rutina MATA010 – Registro de productos tenemos los puntos de entrada: MT010BRW, MTA010OK, MT010CAN, etc. En MVC, no es de esta manera, creamos un único punto de entrada y este se activa en varios momentos.

Este punto de entrada único debe tener una User Function y tener como nombre el ID del Modelo de datos (Model) del fuente.

Para el funcionamiento del punto de entrada MVC de la inclusión de la cotización, debe utilizarse el nombre de la función PGCA020:

Sugerencia del nombre del fuente: MYPGCA020.prw

Bloco de código
languagedelphi
User Function PGCA020()
Local aParam := PARAMIXB
Local xRet   := .T.
...

Return xRet


El punto de entrada creado recibe por medio del parámetro (PARAMIXB) un vector con informaciones referentes al fuente. Estos parámetros varían para cada situación, en común todos estos tienen los 3 primeros elementos que se listan a continuación, en el cuadro siguiente existe la lista de parámetros de cada ID:

Posiciones del array de parámetros comunes a todos los ID:

POS.

TIPO

DESCRIPCIÓN

1

O (Objeto)

Objeto del formulario o del modelo, según sea el caso

2

ID del local de ejecución del punto de entrada

3

C

ID del formulario


El punto de entrada se activa en varios momentos dentro del fuente, en la 2ª posición de la estructura del vector se pasa un ID que identifica cuál es este momento. Esta puede tener como contenido:

ID

MOMENTO DE EJECUCIÓN DEL PUNTO DE ENTRADA

MODELPRE

Antes de la modificación de cualquier campo del modelo.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

MODELPOS

En la validación total del modelo.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

FORMPRE

Antes de la modificación de cualquier campo del formulario.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

FORMPOS

En la validación total del formulario.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

FORMLINEPRE

Antes de la modificación de la línea del formulario FWFORMGRID.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 N Número de la línea de la FWFORMGRID

5 C Acción de la FWFORMGRID

6 C Id del campo


Devolución:

Requiere una devolución lógica

FORMLINEPOS

En la validación total de la línea del formulario FWFORMGRID.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 N Número de la línea de la FWFORMGRID



Devolución:

Requiere una devolución lógica

MODELVLDACTIVE

En la activación del modelo.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario


Devolución:

Requiere una devolución lógica.


Observaciones:

  • Cuando el modelo de datos tiene varios componentes (por ejemplo, varios FWFORMGRIDs), la 3ª posición del vector traerá el ID de este componente.
  • Cuando el tipo de devolución de un determinado momento de ejecución no se envíe o se envíe con el tipo equivocado, se mostrará un mensaje en la consola avisando sobre esto. Todos los ID que esperan devolución deben tratarse en el Punto de entrada.
  • Al escribir un fuente en MVC que será una User Function, cuidado al atribuir el ID del modelo de datos (Model), porque este no podrá tener el mismo nombre del fuente. Si el fuente tuviera el nombre FONT001, el ID del Modelo de datos (Model) no podrá ser también FONT001.


    Bloco de código
    languagevb
    linenumberstrue
    #INCLUDE 'PROTHEUS.CH'
    #INCLUDE 'FWMVCDEF.CH'
    #INCLUDE "FWEVENTVIEWCONSTS.CH"
    #INCLUDE 'FWLIBVERSION.CH' 
    #INCLUDE "MATA130.CH"
    #INCLUDE 'TOPCONN.ch'
    
    USER FUNCTION PGCA020()
    Local aParam     := PARAMIXB
    Local xRet       := .T.
    Local oObj       := ''
    Local cIdPonto   := ''
    Local cIdModel   := ''
    Local lIsGrid    := .F.
    Local nLinha     := 0
    Local nQtdLinhas := 0
    Local cMsg       := ''
    
    If ( aParam <> NIL )
    	oObj       := aParam[1]
        cIdPonto   := aParam[2]
    	cIdModel   := aParam[3]
    	lIsGrid    := iif(aParam[3] == "SC8DETAIL", .t., .f.)
    
    	If ( lIsGrid )
    		nQtdLinhas := oObj:GetQtdLine()
            nLinha     := oObj:nLine
    	EndIf
    
    	If ( cIdPonto == 'MODELPOS' )
    		cMsg := 'Activación en la validación total del modelo (MODELPOS).' + CRLF
    		cMsg += 'ID ' + cIdModel + CRLF
    		
    		Help( ,, 'Help',, 'El MODELPOS devolvió .F.', 1, 0 )
    		
    		ElseIf ( cIdPonto == 'FORMPOS' )
    			cMsg := 'Activación en la validación total del formulario (FORMPOS).' + CRLF
    			cMsg += 'ID ' + cIdModel + CRLF
    			
    			Help( ,, 'Help',, 'El FORMPOS devolvió .F.', 1, 0 )
    
    		ElseIf ( cIdPonto == 'FORMLINEPRE' )
    			
                Help( ,, 'Help',, 'El FORMLINEPRE devolvió .F.', 1, 0 )         
    
            ElseIf ( cIdPonto == 'FORMLINEPOS' )
    			cMsg := 'Activación en la validación de la línea del formulario (FORMLINEPOS).' + CRLF
    			cMsg += 'ID ' + cIdModel + CRLF
    			cMsg += 'Es un FORMGRID con ' + Alltrim( Str( nQtdLinhas ) ) + ' línea(s).' + CRLF
    			cMsg += 'Ubicado en la línea ' + Alltrim( Str( nLinha     ) ) + CRLF
    
    			Help( ,, 'Help',, 'El FORMLINEPOS devolvió .F.', 1, 0 )
    			
        EndIf
    EndIf
    
    Return xRet
      

Antes de la modificación de la línea del formulario FWFORMGRID.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 N Número de la línea de la FWFORMGRID

5 C Acción de la FWFORMGRID

6 C Id del campo

Devolución:

Requiere una devolución lógica

En la validación total de la línea del formulario FWFORMGRID.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 N Número de la línea de la FWFORMGRID

Devolución:

Requiere una devolución lógica

Después de la grabación total del modelo y dentro de la transacción.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

No espera devolución

Después de la grabación total del modelo y fuera de la transacción.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

No espera devolución

Antes de la grabación de la tabla del formulario.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 L Si .T. indica nuevo registro (Inclusión) si .F. registro ya existente (Modificación / Borrado)

Devolución:

No espera devolución

Después de la grabación de la tabla del formulario.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 L Si .T. indica nuevo registro (Inclusión) si .F. registro ya existente (Modificación / Borrado)

Devolución:

No espera devolución

En la anulación de la opción.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

Para la inclusión de opciones en la ControlBar.

Para crear las opciones debe devolverse un array bidimensional con la siguiente estructura de cada ítem:

1 C Título para la opción

2 C Nombre del bitmap para exhibición

3 B CodeBlock que se ejecutará

4 C ToolTip (Opcional)

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere un array de devolución con estructura definida previamente

En la activación del modelo.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica.

Observaciones:

  • Cuando el modelo de datos tiene varios componentes (por ejemplo, varios FWFORMGRIDs), la 3ª posición del vector traerá el ID de este componente.
  • Cuando el tipo de devolución de un determinado momento de ejecución no se envíe o se envíe con el tipo equivocado, se mostrará un mensaje en la consola avisando sobre esto. Todos los ID que esperan devolución deben tratarse en el Punto de entrada.
  • Al escribir un fuente en MVC que será una User Function, cuidado al atribuir el ID del modelo de datos (Model), porque este no podrá tener el mismo nombre del fuente. Si el fuente tuviera el nombre FONT001, el ID del Modelo de datos (Model) no podrá ser también FONT001.
Expandir
titlePuntos de entrada MVC - Edición de la cotización

Puntos de entrada MVC en la rutina de Edición de cotización híbrida NFCA020

Por ser una rutina en MVC, la Edición de cotización híbrida permite a los usuarios la utilización de diversos Puntos de entrada, para que puedan realizar los desvíos y procesamientos personalizados, adecuados a la realidad de la organización.

Breve explicación sobre puntos de entrada MVC:

En los fuentes convencionales tenemos un "nombre" para cada punto de entrada creado, por ejemplo, en la rutina MATA010 – Registro de productos tenemos los puntos de entrada: MT010BRW, MTA010OK, MT010CAN, etc. En MVC, no es de esta manera, creamos un único punto de entrada y este se activa en varios momentos.

Este punto de entrada único debe tener una User Function y tener como nombre el ID del Modelo de datos (Model) del fuente.

Para el funcionamiento del punto de entrada MVC de la edición de la cotización, debe utilizarse el nombre de la función NFCA020:

Sugerencia del nombre del fuente: MYNFCA020.prw

Bloco de código
languagedelphi
User Function NFCA020()
Local aParam := PARAMIXB
Local xRet   := .T.
...

Return xRet


El punto de entrada creado recibe por medio del parámetro (PARAMIXB) un vector con informaciones referentes al fuente. Estos parámetros varían para cada situación, en común todos estos tienen los 3 primeros elementos que se listan a continuación, en el cuadro siguiente existe la lista de parámetros de cada ID:

Posiciones del array de parámetros comunes a todos los ID:

POS.

TIPO

DESCRIPCIÓN

1

O (Objeto)

Objeto del formulario o del modelo, según sea el caso

2

ID del local de ejecución del punto de entrada

3

C

ID del formulario


El punto de entrada se activa en varios momentos dentro del fuente, en la 2ª posición de la estructura del vector se pasa un ID que identifica cuál es este momento. Esta puede tener como contenido:

ID

MOMENTO DE EJECUCIÓN DEL PUNTO DE ENTRADA

MODELPRE

Antes de la modificación de cualquier campo del modelo.


Parámetros recibidos:


1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario


Devolución:

Requiere una devolución lógica

MODELPOS

En la validación total del modelo.



Parámetros recibidos:



1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario



Devolución:

Requiere una devolución lógica

FORMPRE

Antes de la modificación de cualquier campo del formulario.


Parámetros recibidos:


1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario


Devolución:

Requiere una devolución lógica

FORMPOS

En la validación total del formulario.



Parámetros recibidos:



1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario



Devolución:

Requiere una devolución lógica

FORMLINEPRE

Antes de la modificación de la línea del formulario FWFORMGRID.


Parámetros recibidos:


1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 N Número de la línea de la FWFORMGRID

5 C Acción de la FWFORMGRID

6 C Id del campo



Devolución:

Requiere una devolución lógica

FORMLINEPOS

En la validación total de la línea del formulario FWFORMGRID.



Parámetros recibidos:



1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 N Número de la línea de la FWFORMGRID





Devolución:

Requiere una devolución lógica

MODELCOMMITTTS

Después de la grabación total del modelo y dentro de la transacción.


Parámetros recibidos:


1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario



Devolución:

No espera devolución

MODELCOMMITNTTS

Después de la grabación total del modelo y fuera de la transacción.



Parámetros recibidos:



1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario





Devolución:

No espera devolución

FORMCOMMITTTSPRE

Antes de la grabación de la tabla del formulario.


Parámetros recibidos:


1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 L Si .T. indica nuevo registro (Inclusión) si .F. registro ya existente (Modificación / Borrado)



Devolución:

No espera devolución

FORMCOMMITTTSPOS

Después de la grabación de la tabla del formulario.



Parámetros recibidos:



1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

4 L Si .T. indica nuevo registro (Inclusión) si .F. registro ya existente (Modificación / Borrado)





Devolución:

No espera devolución

MODELCANCEL

En la anulación de la opción.


Parámetros recibidos:


1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario



Devolución:

Requiere una devolución lógica

BUTTONBAR

Para la inclusión de opciones en la ControlBar.



Para crear las opciones debe devolverse un array bidimensional con la siguiente estructura de cada ítem:



1 C Título para la opción

2 C Nombre del bitmap para exhibición

3 B CodeBlock que se ejecutará

4 C ToolTip (Opcional)





Parámetros recibidos:



1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario





Devolución:

Requiere un array de devolución con estructura definida previamente

MODELVLDACTIVE

En la activación del modelo.


Parámetros recibidos:


1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario



Devolución:

Requiere una devolución lógica.


Observaciones:

  • Cuando el modelo de datos tiene varios componentes (por ejemplo, varios FWFORMGRIDs), la 3ª posición del vector traerá el ID de este componente.
  • Cuando el tipo de devolución de un determinado momento de ejecución no se envíe o se envíe con el tipo equivocado, se mostrará un mensaje en la consola avisando sobre esto. Todos los ID que esperan devolución deben tratarse en el Punto de entrada.
  • Al escribir un fuente en MVC que será una User Function, cuidado al atribuir el ID del modelo de datos (Model), porque este no podrá tener el mismo nombre del fuente. Si el fuente tuviera el nombre FONT001, el ID del Modelo de datos (Model) no podrá ser también FONT001.


Bloco de código
languagevb
linenumberstrue
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'FWMVCDEF.CH'
#INCLUDE "FWEVENTVIEWCONSTS.CH"
#INCLUDE 'FWLIBVERSION.CH' 
#INCLUDE "MATA130.CH"
#INCLUDE 'TOPCONN.ch'

USER FUNCTION NFCA020()
Local aParam     := PARAMIXB
Local xRet       := .T.
Local oObj       := ''
Local cIdPonto   := ''
Local cIdModel   := ''
Local lIsGrid    := .F.
Local nLinha     := 0
Local nQtdLinhas := 0
Local cMsg       := ''
Local cClasse    := ''

If ( aParam <> NIL )
	oObj       := aParam[1]
    cIdPonto   := aParam[2]
	cIdModel   := aParam[3]
	lIsGrid    := iif(aParam[3] == "SC8DETAIL", .t., .f.)
    cClasse    := oObj:ClassName()

	If ( lIsGrid )
		nQtdLinhas := oObj:GetQtdLine()
        nLinha     := oObj:nLine
	EndIf

	If ( cIdPonto == 'MODELPOS' )
		cMsg := 'Activación en la validación total del modelo (MODELPOS).' + CRLF
		cMsg += 'ID ' + cIdModel + CRLF
		
		If !( xRet := ApMsgYesNo( cMsg + '¿Continúa ?' ) )
			 Help( ,, 'Help',, 'El MODELPOS devolvió .F.', 1, 0 )
		EndIf

		ElseIf ( cIdPonto == 'FORMPOS' )
			cMsg := 'Activación en la validación total del formulario (FORMPOS).' + CRLF
			cMsg += 'ID ' + cIdModel + CRLF
			
			If ( cClasse == 'FWFORMGRID' )
				cMsg += 'Es un FORMGRID con ' + Alltrim( Str( nQtdLinhas ) ) + ' línea(s).' + CRLF
				cMsg += 'Ubicado en la línea ' + Alltrim( Str( nLinha     ) ) + CRLF
			
			ElseIf ( cClasse == 'FWFORMFIELD' )
		        cMsg += 'Es un FORMFIELD' + CRLF
			EndIf

			If !( xRet := ApMsgYesNo( cMsg + '¿Continúa ?' ) )
				Help( ,, 'Help',, 'El FORMPOS devolvió .F.', 1, 0 )
			EndIf

            
		ElseIf ( cIdPonto == 'FORMLINEPRE' )
			If ( aParam[5] == 'BORRE' )
				cMsg := 'Activación en la validación previa de la línea del formulario (FORMLINEPRE).' + CRLF
				cMsg += 'Donde se está intentando borrar una línea' + CRLF
				cMsg += 'Es un FORMGRID con ' + Alltrim( Str( nQtdLinhas ) ) + ' línea(s).' + CRLF
				cMsg += 'Ubicado en la línea ' + Alltrim( Str( nLinha     ) ) + CRLF
				cMsg += 'ID ' + cIdModel + CRLF
			
				If !( xRet := ApMsgYesNo( cMsg + '¿Continúa ?' ) )
					Help( ,, 'Help',, 'El FORMLINEPRE devolvió .F.', 1, 0 )
				EndIf

             EndIf

       ElseIf ( cIdPonto == 'FORMLINEPOS' )
			cMsg := 'Activación en la validación de la línea del formulario (FORMLINEPOS).' + CRLF
			cMsg += 'ID ' + cIdModel + CRLF
			cMsg += 'Es un FORMGRID con ' + Alltrim( Str( nQtdLinhas ) ) + ' línea(s).' + CRLF
			cMsg += 'Ubicado en la línea ' + Alltrim( Str( nLinha     ) ) + CRLF

			If !( xRet := ApMsgYesNo( cMsg + '¿Continúa ?' ) )
				Help( ,, 'Help',, 'El FORMLINEPOS devolvió .F.', 1, 0 )
			EndIf

		ElseIf ( cIdPonto == 'MODELCOMMITTTS' )
			ApMsgInfo('Activación después de la grabación total del modelo y dentro de la transacción (MODELCOMMITTTS).' + CRLF + 'ID ' + cIdModel )

		ElseIf ( cIdPonto == 'MODELCOMMITNTTS' )
			ApMsgInfo('Activación después de la grabación total del modelo y fuera de la transacción (MODELCOMMITNTTS).' + CRLF + 'ID ' + cIdModel)

Expandir
titlePuntos de entrada MVC - Edición de la cotización

Puntos de entrada MVC en la rutina de Edición de cotización híbrida NFCA020

Como es una rutina en MVC, la Edición de cotización híbrida permite a los usuarios la utilización de diversos Puntos de entrada, para que puedan realizar los desvíos y procesamientos personalizados, adecuados a la realidad de la organización.

Breve explicación sobre puntos de entrada MVC:

En los fuentes convencionales tenemos un "nombre" para cada punto de entrada creado, por ejemplo, en la rutina MATA010 – Registro de productos tenemos los puntos de entrada: MT010BRW, MTA010OK, MT010CAN, etc. En MVC, no es de esta manera, creamos un único punto de entrada y este se llama en varios momentos.

Este punto de entrada único debe tener una User Function y tener como nombre el ID del Modelo de datos (Model) del fuente.

Para el funcionamiento del punto de entrada MVC de la edición de la cotización, debe utilizarse el nombre de la función NFCA020:

Sugerencia del nombre del fuente: MYNFCA020.prw

Bloco de código
languagedelphi
User Function NFCA020()
Local aParam := PARAMIXB
Local xRet   := .T.
...

Return xRet

El punto de entrada creado recibe por medio del parámetro (PARAMIXB) un vector con informaciones referentes al fuente. Estos parámetros varían para cada situación, en común todos estos tienen los 3 primeros elementos que se listan a continuación, en el cuadro siguiente existe la lista de parámetros de cada ID:

Posiciones del array de parámetros comunes a todos los ID:

POS.

TIPO

DESCRIPCIÓN

1

O (Objeto)

Objeto del formulario o del modelo, según sea el caso

2

ID del local de ejecución del punto de entrada

3

C

ID del formulario

El punto de entrada se llama en varios momentos dentro del fuente, en la 2ª posición de la estructura del vector se pasa un ID que identifica cuál es este momento. Esta puede tener como contenido:

ID

MOMENTO DE EJECUCIÓN DEL PUNTO DE ENTRADA

MODELPRE

Antes de la modificación de cualquier campo del modelo.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

MODELPOS

En la validación total del modelo.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

FORMPRE

Antes de la modificación de cualquier campo del formulario.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

FORMPOS

En la validación total del formulario.

Parámetros recibidos:

1 El objeto del formulario o del modelo, según sea el caso

2 C ID del local de ejecución del punto de entrada

3 C ID del formulario

Devolución:

Requiere una devolución lógica

FORMLINEPRE

FORMLINEPOS

MODELCOMMITTTS

MODELCOMMITNTTS

FORMCOMMITTTSPRE

FORMCOMMITTTSPOS

MODELCANCEL

BUTTONBAR

MODELVLDACTIVE

Bloco de código
languagevb
linenumberstrue
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'FWMVCDEF.CH'
#INCLUDE "FWEVENTVIEWCONSTS.CH"
#INCLUDE 'FWLIBVERSION.CH' 
#INCLUDE "MATA130.CH"
#INCLUDE 'TOPCONN.ch'

USER FUNCTION NFCA020()
Local aParam     := PARAMIXB
Local xRet       := .T.
Local oObj       := ''
Local cIdPonto   := ''
Local cIdModel   := ''
Local lIsGrid    := .F.
Local nLinha     := 0
Local nQtdLinhas := 0
Local cMsg       := ''

If ( aParam <> NIL )
	oObj       := aParam[1]
    cIdPonto   := aParam[2]
	cIdModel   := aParam[3]
	lIsGrid    := iif(aParam[3] == "SC8DETAIL", .t., .f.)

	If ( lIsGrid )
		nQtdLinhas := oObj:GetQtdLine()
        nLinha     := oObj:nLine
	EndIf

	If ( cIdPonto == 'MODELPOS' )
		cMsg := 'Activación en la validación total del modelo (MODELPOS).' + CRLF
		cMsg += 'ID ' + cIdModel + CRLF
		
		If !( xRet := ApMsgYesNo( cMsg + 'Continua ?' ) )
			 Help( ,, 'Help',, 'O MODELPOS retornou .F.', 1, 0 )
		EndIf

		ElseIf ( cIdPonto == 'FORMPOSFORMCOMMITTTSPOS' )
			cMsg := ApMsgInfo('Activación endespués de la grabación validaciónde la totaltabla del formulárioformulario (FORMPOSFORMCOMMITTTSPOS).' + CRLF
			cMsg += 'ID ' + cIdModel + CRLF
			)

			IfElseIf ( cClassecIdPonto == 'FWFORMGRIDMODELCANCEL' )
				cMsg +:= 'ÉActivación en umla FORMGRIDopción comAnular (MODELCANCEL).' + Alltrim( Str( nQtdLinhas ) ) + ' linha(s).' + CRLFCRLF + '¿Realmente desea salir ?'

			If !( xRet := ApMsgYesNo( cMsg ) )
				cMsg +=Help( ,, 'Situado en la línea ' + Alltrim( Str( nLinha     ) ) + CRLFHelp',, 'El MODELCANCEL devolvió .F.', 1, 0 )
			EndIf

			ElseIf (cIdPonto cClasse == 'FWFORMFIELDBUTTONBAR' )
		        cMsg += 'É um FORMFIELD' + CRLF
			EndIf

			If !( xRet := ApMsgYesNo( cMsg	ApMsgInfo('Incluyendo la opción en la barra de opciones (BUTTONBAR).' + CRLF + 'ContinuaID ?' )+ cIdModel )
				Help( ,, 'Help',, 'El FORMPOS devolvió .F.', 1, 0 )
			EndIf

            
		ElseIf ( cIdPonto == 'FORMLINEPRE' )
			If ( aParam[5] == 'DELETE' )
				cMsg := 'Activación en la validación previa de la línea del formulario FORMLINEPRE).' + CRLF
				cMsg += 'Donde se esta intentando borrar una línea' + CRLF
				cMsg += 'Es un FORMGRID con ' + Alltrim( Str( nQtdLinhas ) ) + ' líneas(s).' + CRLF
				cMsg += 'Situado en la línea ' + Alltrim( Str( nLinha     ) ) + CRLF
				cMsg += 'ID ' + cIdModel + CRLF
			
				If !( xRet := ApMsgYesNo( cMsg + '¿Continua ?' ) )
					Help( ,, 'Help',, 'El FORMLINEPRE devolvió .F.', 1, 0 )
				EndIf

             EndIf

       ElseIf ( cIdPonto == 'FORMLINEPOS' )
			cMsg := 'Activación en la validación de la línea del formulario (FORMLINEPOS).' + CRLF
			cMsg += 'ID ' + cIdModel + CRLF
			cMsg += 'É um FORMGRID com ' + Alltrim( Str( nQtdLinhas ) ) + ' líneas(s).' + CRLF
			cMsg += 'Situado en la línea ' + Alltrim( Str( nLinha     ) ) + CRLF

			If !( xRet := ApMsgYesNo( cMsg + 'Continua ?' ) )
				Help( ,, 'Help',, 'El FORMLINEPOS devolvió .F.', 1, 0 )
			EndIf

		ElseIf ( cIdPonto == 'MODELCOMMITTTS' )
			ApMsgInfo('Activación después de la grabación total del modelo y dentro de la transacción (MODELCOMMITTTS).' + CRLF + 'ID ' + cIdModel )

		ElseIf ( cIdPonto == 'MODELCOMMITNTTS' )
			ApMsgInfo('Activación después de la grabación total del modelo y fuera de la transacción (MODELCOMMITNTTS).' + CRLF + 'ID ' + cIdModel)

		ElseIf ( cIdPonto == 'FORMCOMMITTTSPOS' )
			ApMsgInfo('Activación después de la grabación de la tabla del formulario (FORMCOMMITTTSPOS).' + CRLF + 'ID ' + cIdModel)

		ElseIf ( cIdPonto == 'MODELCANCEL' )
			cMsg := 'Activación en la Opción Anular (MODELCANCEL).' + CRLF + '¿Realmente desea salir?'

			If !( xRet := ApMsgYesNo( cMsg ) )
				Help( ,, 'Help',, 'El MODELCANCEL devolvió .F.', 1, 0 )
			EndIf

		ElseIf cIdPonto == 'BUTTONBAR'
			ApMsgInfo('Incluyendo Opción en la Barra de opciones (BUTTONBAR).' + CRLF + 'ID ' + cIdModel )
			xRet := { {'Grabar', 'GRABAR', { || Alert( 'Grabó' ) }, 'Esta opción Graba' } }
		EndIf

EndIf

Return xRet
Expandir
titlePunto de entrada - Edición de los pedidos generados en el análisis

Nombre del punto de entrada: AVALCOT

Objetivo: Permitir la edición de los pedidos de compra generados por medio del análisis de cotización (después de la grabación).

Documentación: Haga clic aquí - Documentación AVALCOT

Expandir
titlePunto de entrada - Edición de los ítems de los pedidos generados en el análisis

Nombre del punto de entrada: AVALCOPC

Objetivo: Permitir la edición de los ítems de los pedidos de compra generados por medio del análisis de cotización (después de la grabación).

Documentación: Haga clic aquí - Documentación AVALCOPC

08. ASUNTOS RELACIONADOS

xRet := { {'Grabar', 'GRABAR', { || Alert( 'Grabó' ) }, 'Esta opción Graba' } }
		EndIf

EndIf

Return xRet
Expandir
titlePunto de entrada - Edición de los pedidos generados en el análisis

Nombre del punto de entrada: AVALCOT

Objetivo: Permitir la edición de los pedidos de compra generados por medio del análisis de cotización (después de la grabación).

Documentación: Haga clic aquí - Documentación AVALCOT


Expandir
titlePunto de entrada - Edición de los ítems de los pedidos generados en el análisis

Nombre del punto de entrada: AVALCOPC

Objetivo: Permitir la edición de los ítems de los pedidos de compra generados por medio del análisis de cotización (después de la grabación).

Documentación: Haga clic aquí - Documentación AVALCOPC


Expandir
titlePunto de entrada - Filtrar mis proveedores

Nombre del punto de entrada: NFCFILFOR

Objetivo: Este punto de entrada se utiliza para seleccionar proveedores de acuerdo con los 
filtros previamente definidos. Los proveedores filtrados se mostrarán en la solapa “Mis proveedores”.

Documentación: Haga clic aquí - Documentación NFCFILFOR

Expandir
titlePunto de entrada - Filtrar SC de acuerdo con los filtros establecidos

Nombre del punto de entrada: NFCFILTSC

Objetivo: Este punto de entrada se utiliza en la necesidad de compra para filtrar SC de acuerdo con los filtros establecidos.

DocumentaciónClique Aqui - Documentação NFCFILTSC

Expandir
titlePunto de entrada - Aumentar información en la generación de la cotización

Nombre del punto de entrada: MTA131C8

Objetivo: El punto de entrada se utiliza para aumentar información en la generación la cotización.

Documentación: Haga clic aquí - Documentación MTA131C8

Expandir
titlePunto de entrada - Definir generación de documentos en el análisis de la cotización

Nombre del punto de entrada: NFCGERDOC

Objetivo: Este punto de entrada se utiliza para autorizar la generación de documentos en el análisis de la cotización.

Documentación: Haga clic aquí - Documentación  NFCGERDOC

Expandir
titlePunto de entrada - Permite sustituir el workflow de NFC

Nombre del punto de entrada: NFCWFCUSTOM

Objetivo: Este punto de entrada se utiliza para sustituir el envío del workflow del NFC, pudiendo realizarse cualquier implementación de workflow personalizado.

Documentación: Haga clic aquí - Documentación  NFCWFCUSTOM

Aviso
titleImportante

Al activar este punto de entrada, el workflow estándar será integralmente sustituido por el workflow personalizado. Las pantallas de envío de e-mail se simplificarán, mostrando solamente el campo para informar las direcciones de e-mail y la opción de envío del workflow.

Expandir
titlePunto de entrada - Criterio de división de los ítems de la solicitud de compra

Nombre del punto de entrada: MA131QSC

Objetivo: Este punto de entrada es para definir el criterio de división de los ítems de la SC en la generación de la cotización por meio de un bloque de código.

Documentación: Haga clic aquí - Documentación MA131QSC

08. ASUNTOS RELACIONADOS



HTML
<!-- esconder o menu --> 


<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
#main {
    padding-left: 10px;
    padding-right: 10px;
    overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}
</style>


09. OBSERVACIONES IMPORTANTES

A continuación, puede visualizar algunas observaciones relevantes sobre el funcionamiento del Nuevo flujo de compras (NFC).

Expandir
titleUso compartido de tablas

Para garantizar el correcto funcionamiento del Nuevo flujo de compras (NFC), es necesario estar atento al uso compartido adecuado de las tablas relacionadas a los procesos de análisis y generación de cotización/pedidos. Este control tiene como objetivo garantizar la integridad de los datos y la fluidez de las etapas del proceso.

El control de saldos, junto con otras características específicas del NFC (Nuevo flujo de compras), es fundamental para la utilización adecuada de tablas exclusivas. Estos aspectos garantizan la integridad y la consistencia de los datos, permitiendo que cada tabla atienda a las particularidades del entorno NFC

Informações
titleTablas

Campo

X2_MODO

X2_MODOUN

X2_MODOEMP

Encabezado de la cotización (DHU)

E

E

E

Productos de la cotización (DHV)

E

E

E

Pedido de compra (SC7)

E

E

E

Cotizaciones (SC8)

E

E

E

Aviso
titleAtención

Modificaciones en el uso compartido de las tablas listadas pueden impactar en el funcionamiento del Nuevo flujo de compras, comprometiendo su proceso.

HTML
<!-- esconder o menu --> <style> div.theme-default .ia-splitter #main { margin-left: 0px; } .ia-fixed-sidebar, .ia-splitter-left { display: none; } #main { padding-left: 10px; padding-right: 10px; overflow-x: hidden; } .aui-header-primary .aui-nav, .aui-page-panel { margin-left: 0px !important; } .aui-header-primary .aui-nav { margin-left: 0px !important; } </style>