01. DATOS GENERALES

Línea de producto:Microsiga Protheus®
Segmento:Servicios
Módulo:Financiero


02. SITUACIÓN/REQUISITO

Se implementó la utilización automática de la rutina de compensación entre  carteras. 


Observaciones

FINA450(nPosArotina,aAutoCab,nOpcAuto)

  •  aAutoCab - Array utilizado para enviar datos referentes al proceso.   Estos datos son el equivalente a los datos informados en la pantalla de filtro manual, como:
    • Fecha inicial: Fecha de vencimiento real inicial para filtrar los títulos.
    • Fecha final: Fecha de vencimiento real final para filtrar los títulos.
    • Valor límite: Valor límite para la compensación.   Esta información se utiliza para filtrar, o no, los títulos hasta el valor informado.
    • Código de ciente y tienda: Código del cliente/tienda para filtrar los títulos para la compensación. 
    • Código del proveedor y tienda: Código del proveedor/tienda para filtrar los títulos para la compensación.
    • Moneda: Código de la moneda de los títulos para utilizar en la compensación.
    • Débito o Crédito: Filtra los tipos de débito (Fact, FactCred, BOL, etc.) o crédito (RA, PA, NCC y NDF).
      • Contenido "1" filtra títulos normales y "2" títulos de credito (Ej: RA, PA)
    • Títulos futuros: Filtra títulos emitidos posterior a la fecha base.
    • Clave de títulos por cobrar (Array con clave de los títulos por cobrar que se compensarán):
      • SE1->E1_FILIAL+SE1->E1_PREFIXO+SE1->E1_NUM+SE1->E1_PARCELA+SE1→E1_TIPO
    • Clave de Títulos por pagar (Array con clave de los títulos por pagar que se compensarán):
      • SE2->E2_FILIAL+SE2->E2_PREFIXO+SE2->E2_NUM+SE2->E2_PARCELA+SE2->E2_TIPO+SE2→E2_FORNECE+SE2→E2_LOJA
    • nOpcAuto - Opción del menú que se ejecutará automáticamente.
      • 3 = Compensación

Observación:

  • La compensación automática entre carteras solamente realiza la baja del valor total del título.
  • Si las tiendas del cliente y proveedor se informan sin contenido (vacías), el sistema considerará todas las tiendas del mismo código de cliente y proveedor.  (Disponible a partir del 01/06/2023)


03. EJEMPLO DE UTILIZACIÓN



Exemplo de rotina automatica
#include "rwmake.ch"
#include 'tbiconn.ch'

User Function AUTO450()
    Local aAutoCab := {}
    Local aArea    := GetArea()
    Local cTabSe1  := "TMPSE1A"
    Local cTabSe2  := "TMPSE2A"
    Local aSE1450  := {}
    Local aSE2450  := {}
    Local cFilSe2  := xFilial("SE2")
    Local cFilSe1  := xFilial("SE1")

    Private lMsHelpAuto := .T.
    Private lMsErroAuto := .F.

    BeginSql Alias cTabSe1
		SELECT R_E_C_N_O_ as RECNO
			FROM %Table:SE1% SE1
			WHERE SE1.E1_FILIAL = %Exp:cFilSe1%
				AND SE1.E1_PREFIXO = 'CPT'
				AND SE1.E1_NUM = 'VT001'
				AND SE1.E1_TIPO = 'NF'
				AND SE1.E1_CLIENTE = 'FIN001'
				AND SE1.E1_LOJA    = '01'
				AND SE1.%NotDel%
	EndSql

    While (cTabSe1)->(!EOF())
        SE1->(DbGoto((cTabSe1)->RECNO))
        AAdd(aSE1450, {SE1->E1_FILIAL+SE1->E1_PREFIXO+SE1->E1_NUM+SE1->E1_PARCELA+SE1->E1_TIPO})
        (cTabSe1)->(DbSkip())  
    Enddo

    (cTabSe1)->(DbCloseArea())

    BeginSql Alias cTabSe2
		SELECT R_E_C_N_O_ as RECNO
			FROM %Table:SE2% SE2
			WHERE SE2.E2_FILIAL = %Exp:cFilSe2%
				AND SE2.E2_PREFIXO = 'CPT'
				AND SE2.E2_NUM = 'VT001'
				AND SE2.E2_TIPO = 'NF'
				AND SE2.E2_FORNECE = 'FIN001'
				AND SE2.E2_LOJA    = '01'
				AND SE2.%NotDel%
	EndSql

    While (cTabSe2)->(!EOF())
        SE2->(DbGoto((cTabSe2)->RECNO))
        AAdd(aSE2450, {SE2->E2_FILIAL+SE2->E2_PREFIXO+SE2->E2_NUM+SE2->E2_PARCELA+SE2->E2_TIPO+SE2->E2_FORNECE+SE2->E2_LOJA})   
        (cTabSe2)->(DbSkip())  
    Enddo
    
    (cTabSe2)->(DbCloseArea())

    aAutoCab := { {"AUTDVENINI450", cTod('27/08/19') , nil},;
    {"AUTDVENFIM450", cTod('27/08/19') , nil},;
    {"AUTNLIM450" , 10000 , nil},;
    {"AUTCCLI450" , "FIN001" , nil},;
    {"AUTCLJCLI" , "01" , nil},;
    {"AUTCFOR450" , "FIN001" , nil},;
    {"AUTCLJFOR" , "01" , nil},;
    {"AUTCMOEDA450" , "01" , nil},; 
    {"AUTNDEBCRED" , 1 , nil},;
    {"AUTLTITFUTURO", .F. , nil},;
    {"AUTARECCHAVE" , aSE1450 , nil},;
    {"AUTAPAGCHAVE" , aSE2450 , nil}}

    MSExecAuto({|x,y,z| Fina450(x,y,z)}, nil , aAutoCab , 3 )

    If !lMsErroAuto
        alert("¡Incluido con éxito! ")
        confirmsx8()
    Else
        alert("¡Error en la inclusión!")
        rollbacksx8()
        MostraErro()
    EndIf
    
    RestArea(aArea)
Return



Ejemplo de rutina automática entre sucursales.
#include "rwmake.ch"
#include 'tbiconn.ch'
  
User Function Auto450()
    Local aAutoCab := {}
	Local aArea    := GetArea()
    Local cTabSe1  := "TMPSE1A"
    Local cTabSe2  := "TMPSE2A"
    Local aSE1450  := {}
    Local aSE2450  := {}
    Local aFilCmp  := {}

    Private lMsHelpAuto := .F.
    Private lMsErroAuto := .F.

    BeginSql Alias cTabSe1
		SELECT R_E_C_N_O_ as RECNO
			FROM %Table:SE1% SE1
			WHERE SE1.E1_FILIAL = 'D MG 01 '
				AND SE1.E1_PREFIXO = 'CPT'
				AND SE1.E1_NUM = 'VT001'
				AND SE1.E1_TIPO = 'NF'
				AND SE1.E1_CLIENTE = 'FIN001'
				AND SE1.E1_LOJA    = '01'
				AND SE1.%NotDel%
	EndSql

    While (cTabSe1)->(!EOF())
        SE1->(DbGoto((cTabSe1)->RECNO))
        AAdd(aSE1450, {SE1->E1_FILIAL+SE1->E1_PREFIXO+SE1->E1_NUM+SE1->E1_PARCELA+SE1->E1_TIPO})
        If ascan(aFilCmp,SE1->E1_FILIAL) == 0
            Aadd(aFilCmp, SE1->E1_FILIAL)
        EndIf    
        (cTabSe1)->(DbSkip())  
    Enddo

    (cTabSe1)->(DbCloseArea())

    BeginSql Alias cTabSe2
		SELECT R_E_C_N_O_ as RECNO
			FROM %Table:SE2% SE2
			WHERE SE2.E2_FILIAL = 'D MG 02 '
				AND SE2.E2_PREFIXO = 'CPT'
				AND SE2.E2_NUM = 'VT001'
				AND SE2.E2_TIPO = 'NF'
				AND SE2.E2_FORNECE = 'FIN001'
				AND SE2.E2_LOJA    = '01'
				AND SE2.%NotDel%
	EndSql

    While (cTabSe2)->(!EOF())
        SE2->(DbGoto((cTabSe2)->RECNO))
        AAdd(aSE2450, {SE2->E2_FILIAL+SE2->E2_PREFIXO+SE2->E2_NUM+SE2->E2_PARCELA+SE2->E2_TIPO+SE2->E2_FORNECE+SE2->E2_LOJA})
        If ascan(aFilCmp,SE2->E2_FILIAL) == 0
            Aadd(aFilCmp, SE2->E2_FILIAL)
        EndIf    
        (cTabSe2)->(DbSkip())  
    Enddo
    
    (cTabSe2)->(DbCloseArea())

    aAutoCab :={  {"AUTDVENINI450", cTod('27/08/19') , nil},;
                {"AUTDVENFIM450", cTod('27/08/19') , nil},;
                {"AUTNLIM450" ,8000, nil},;
                {"AUTCCLI450" , "FIN001" , nil},;
                {"AUTCLJCLI" , "01" , nil},;
                {"AUTCFOR450" , "FIN001" , nil},;
                {"AUTCLJFOR" , "01" , nil},;
                {"AUTCMOEDA450" , "01" , nil},; 
                {"AUTNDEBCRED" , 1 , nil},;
                {"AUTLTITFUTURO", .F. , nil},;
                {"AUTARECCHAVE" ,aSE1450, nil},;
                {"AUTAPAGCHAVE" , aSE2450 , nil},;
                {"AUTAFILCOMP" , aFilCmp , nil}}

    MSExecAuto({|x,y,z| Fina450(x,y,z)}, nil , aAutoCab , 3 )

    If !lMsErroAuto
        ConOut("¡Incluido con éxito! ")
        confirmsx8()
    Else
        ConOut("¡Error en la inclusión!")
        rollbacksx8()
        MostraErro()
    EndIf

	RestArea(aArea)
Return
Reversión
#INCLUDE "TOTVS.ch"
#Include "PROTHEUS.ch"    
#Include "PRTOPDEF.CH"
#INCLUDE "TBICONN.CH" 


User Function F450Est()


Local cCliForn	:= "000001"
Local cLoja		:= "00"
Local cPref		:= "TST"
Local cNumPag	:= "PAG300000"
Local cParc		:= " "
Local cTipo		:= "NF "
Local cFilTit   := "D MG 01 "
Local aAutoCab := {}


PRIVATE lMsErroAuto := .F.

PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "FIN" 

dbSelectArea("SE2")
dbSetOrder(1)		//E2_FILIAL+E2_PREFIXO+E2_NUM+E2_PARCELA+E2_TIPO+E2_FORNECE+E2_LOJA

//Es necesario marcar en un registro de la SE2 de un título que esté involucrado en la compensación
//No es necesario marcar en todos los títulos involucrados

SE2->(Dbseek(cFilTit+cPref + cNumPag + cParc + cTipo + cCliForn + cLoja))

MSExecAuto({|x,y,z| Fina450(x,y,z)}, nil , aAutoCab , 5 )
   If !lMsErroAuto
        ConOut("¡Reversión realizada con éxito! ")
    Else
        ConOut("Error en la reversión!")
        MostraErro()
    EndIf
RETURN

¡IMPORTANTE!

Para que la compensación funcione entre sucursales es necesario utilizar el parámetro AUTAFILCOMP, en caso contrario no es necesario informarlo.


04. OTRAS INFORMACIONES

No existe.



05. ASUNTOS RELACIONADOS

No existe.