Índice | ||||||
---|---|---|---|---|---|---|
|
Informações | ||
---|---|---|
| ||
Esta rutina se ajustó para cumplir con la Ley general de protección de datos (Ley n° 13.,70), siendo teniendo en cuenta que algunos campos que presentan información considerada como datos sensibles y/o personales se ocultarán, dejando y dejarán de ser legibles. |
Informações |
---|
...
|
...
| |
El proceso de selección de sucursales, así como el de baja en múltiples sucursales por medio de la rutina de bajas automáticas unificada estará a disposición solamente a partir de abril/2022 |
...
Esta rutina permite efectuar las bajas de los títulos por pagar automáticamente.
Informações | ||
---|---|---|
| ||
La rutina también requiere algunas configuraciones estandarizadas o específicas ejecutadas por parámetros. El Mapa mental pone en evidencia los que se utilizan en esta rutina, así como también facilita la visualización para identificar el momento de actuación de algunos de estos. |
Procedimiento para baja de títulos por pagar de cualquier modalidad del módulo Financiero.
Búsqueda del título dentro del archivo cuentas por pagar, teniendo como resultado el título marcado y resaltado en el browse.
Lista la opción de parámetros de la rutina.
Procedimiento para permitir que un proceso de baja automática se anule, dentro de determinadas condiciones.
Muestra la consulta con el asiento contable del título, si este se hubiera contabilizado.
Muestra el cuadro das leyendas y sus significados referidos de la situación del título del cuentas por pagar.
La leyenda puede visualizarse en la primera columna del browse.
...
En este diagrama conozca la información que considera la funcionalidad de la rutina:
En la página principal de la rutina están a disposición estas opciones:
...
effectDuration | 0.5 |
---|---|
history | false |
id | samples |
effectType | fade |
Card | ||||||
---|---|---|---|---|---|---|
| ||||||
Al activar esta opción, verifique la cumplimentación de los principales campos y confirme el procedimiento. Ejemplo:
Títulos: Muestra solamente títulos que no están en el borderó Borderós: Carga solamente títulos en el borderó
|
Card | ||||
---|---|---|---|---|
| ||||
Permite la búsqueda de información para el título seleccionado con la utilización de filtros que las ordenan de acuerdo con la característica deseada. Ejemplo:
|
...
id | 3 |
---|---|
label | Parámetros |
...
Campo
...
Descripción
...
¿Muestra Asien. Contab.?
...
Indica, por medio de la selección entre las opciones Sí y No, si el asiento contable debe mostrarse en la contabilidad on-line.
Ejemplo:
No.
...
Indica, por medio de la selección entre las opciones Sí y No, si los asientos deben agruparse en una única línea, si las cuentas, centro de costo, ítem y clase de valor sean iguales en los asientos efectuados.
Ejemplo:
No.
...
Indica, por medio de la selección entre las opciones Sí y No, si la contabilidad realizada en el momento de hacer efectiva la transacción (incluso de título, baja, generación de cheque, borrado, etc.) será uno a uno u off-line (todos los asientos contabilizados en un proceso en lote).
Ejemplo:
No.
...
Informe la opción Sí para que las bajas por pagar automáticas generen los cheques para el pago de los respectivos títulos.
Informações | ||
---|---|---|
| ||
Por medio de la rutina de Liberación de cheques el sistema permite que los cheques generados puedan liberarse on-line, de acuerdo con la cumplimentación del parámetro MV_LIBCHEQ. Si el contenido fuera S, los cheques son liberados automáticamente y si fuera N, obligatoriamente deben pasar por esta opción. El movimiento bancario referente a los cheques ocurre si hubiera aprobación on-line o después del procedimiento de aprobación de cheques. |
...
Seleccione entre las opciones:
Total borderós: Realiza la contabilidad del valor total de borderós procesados.
Borderó/Borderó: Realiza la contabilidad del valor de los borderós procesados individualmente (valor de cada borderó).
Card | ||||
---|---|---|---|---|
| ||||
En esta opción es posible ubicar y mostrar los asientos contables a partir del documento que los originó. |
Card | ||||
---|---|---|---|---|
| ||||
Esta opción indica, por medio de colores, los tipos de títulos disponibles. |
El proceso de contabilidad de los procesos aplicados a un título dado de baja por el módulo Financiero es cubierto por los asientos estándar siguientes:
...
Asiento Est
...
Hecho generador
...
ON
...
OFF
...
530
...
En la baja de títulos por pagar
...
X
...
X
...
532
...
En la baja de títulos por pagar en Borderó
...
X
...
X
...
513
...
En la inclusión de movimiento bancario de anticipo (MV_CTMOVPA)
...
X
...
X
...
title | Borderó |
---|
Borderós: Para títulos normales el asiento estándar será el 532, para títulos de anticipo, el asiento estándar es el 513
Los impuestos con hecho generador "Caja" (en la baja) generados por el borderó, deben ser contabilizados por el asiento estándar 530.
Observación: Si el parámetro "¿Contabiliza por?" estuviera configurado como "Borderó/borderó" el asiento estándar 513 no se contabilizará.
Historial.
Si fuera necesario rescatar el número del borderó e informar en el historial en el momento de la contabilidad, debe utilizarse el campo SEA→EA_NUMBOR.
Observación: Esta opción devolverá el valor del Borderó correcto solamente si el parámetro "¿Contabiliza por?" estuviera configurado como "Borderó/borderó".
Informações | ||
---|---|---|
| ||
Contabilidad por tipo de baja: Títulos: Para títulos normales el asiento estándar será el 530, para títulos de anticipo el asiento estándar es el 513. |
...
ejecutar la baja automática de títulos pendientes de una sola vez.
Lo títulos son seleccionados por el usuario, por medio de un filtro de portador, intervalo de vencimientos, motivo de baja y borderó (si los títulos estuvieran vinculados a un borderó), permitiendo la baja de varios borderós dentro de un intervalo especificado por el usuario (de/a). El sistema también permite que se efectúe la baja de uno o más títulos con cheque, automáticamente.
Procedimiento efectuado de forma manual vía rutina Bajas Pagar Automática (FINA090), con exhibición de las pantallas involucradas en el proceso, necesitando de acciones/comandos del usuario.
Procedimiento realizado de forma automática en la rutina Bajas Pagar Automática (FINA090), sin exhibición de pantallas o necesidad de interacción del usuario.
Se utiliza en personalizaciones donde el proceso no necesita de interacciones del usuario (MSEXECAUTO)
Informações | ||
---|---|---|
| ||
Si la contabilidad fuera online, la baja vía rutina automática solamente se procesará si la contabilidad no estuviera configurada para mostrar la pantalla en casos de error en el registro (falta de cuenta, débito/crédito no coinciden, etc.). Si utiliza la configuración para que se muestre la pantalla de contabilidad en caso de error en el registro, la rutina de baja automática vía execauto solamente se procesará si la contabilidad fuera Off-Line. |
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#INCLUDE "PROTHEUS.CH"
/*
Baja automática
Baja automática
----------------------
Estructura de aRetAuto - baja automática
---------------------------------------------------------
aRetAuto [1] := aRecnos (array conteniendo los Recnos de los registros por darse de baja)
aRetAuto [2] := cBanco (Banco de la baja)
aRetAuto [3] := cAgencia (Agencia de la baja)
aRetAuto [4] := cConta (Cuenta de la baja)
aRetAuto [5] := cCheque (Cheque de la baja - solamente Cuentas por pagar)
aRetAuto [6] := cLoteFin (Lote financiero de la baja)
aRetAuto [7] := cNatureza (Modalidad del movimiento bancario - solamente Cuentas por pagar)
aRetAuto [8] := dBaixa (Fecha de la baja)
aRetAuto [9] := nTipoBx (1 = Baja solamente títulos que no están en el borderó o nTipoBx -> 2 = Baja solamente títulos en borderó)
aRetAuto [10]:= cBcoDe (De Portador)
aRetAuto [11]:= cBcoAte (A Portador)
aRetAuto [12]:= dVencIni (Vencimiento inicial)
aRetAuto [13]:= dVencFim (Vencimiento final)
aRetAuto [14]:= cBord090I (Borderó inicial)
aRetAuto [15]:= cBord090F (Borderó final)
aRetAuto [16]:= cBenef090 (Beneficiario del cheque)
aRetAuto [17]:= cHistor (Historial del cheque)
aRetAuto [18]:= lMultNat (Prorrateo múltiples modalidades)
aRetAuto [19]:= aVendor (Array para la baja de vendor)
Ejemplo: MSExecAuto({|x, y| FINA090(x, y)}, 3, aRetAuto)
Para definir el Motivo de baja (si no se hubiera informado, el default es NORMAL):
Private _cAutoMotBx := "DEBITO CC"
Anulación de baja:
----------------------
Estructura de aRetAuto - Anulación automática de bajas
---------------------------------------------------------
nRadio := aRetAuto[1] //1 = Anula baja de títulos títulos 2 = anula baja solamente de títulos en borderó
cBord1 := aRetAuto[2] // De Borderó
cBord2 := aRetAuto[3] // A Borderó
cDatB1 := aRetAuto[4] // Fch. Baja inicial
cDatB2 := aRetAuto[5] // Fch. Baja final
cFor1 := aRetAuto[6] // De Proveedor
cFor2 := aRetAuto[7] // A Proveedor
aSelFil := aRetAuto[8] // Array con las sucursales que se considerarán en la selección de los títulos
*/
/*
------------------------------------------------------------------------------------
FAut090
Ejemplos de procesos del FINA090 Automático
------------------------------------------------------------------------------------
*/
User Function FAut090()
Local nOpca := 0
Local nRadio := 1
While .T.
DEFINE MSDIALOG oDlg FROM 094,1 TO 230,293 TITLE "Baja automática" PIXEL
@ 05,07 TO 40, 140 OF oDlg PIXEL
@ 10,10 RADIO oRadio VAR nRadio;
ITEMS "Baja automática","Baja automática - Vendor","Anulación automática de bajas";
3D SIZE 100,10 OF oDlg PIXEL
DEFINE SBUTTON FROM 45,085 TYPE 1 ENABLE OF oDlg ACTION (nOpca := 1, oDlg:End())
DEFINE SBUTTON FROM 45,115 TYPE 2 ENABLE OF oDlg ACTION (nOpca := 0, oDlg:End())
ACTIVATE MSDIALOG oDlg CENTERED
If nOpca == 1
If nRadio == 1 //Baja automática
FBx090Aut()
Loop
ElseIf nRadio == 2 //Baja automática - Vendor
FBx090VEN()
Loop
Else //Anulación automática de baja
FBx090Can()
Loop
Endif
Else
Exit
Endif
EndDo
Return
/*
------------------------------------------------------------------------------------
FBx090Aut
Función para realizar baja automática - Multisucursales
Ajustar pregunta Selecciona sucursales - SÍ
------------------------------------------------------------------------------------
*/
Static Function FBx090Aut()
Local aRecnos := {}
Local cPref := "091"
Local cFil1 := "D MG 01 "
Local cTitulo1 := "FIN000001"
Local cFil2 := "D MG 02 "
Local cTitulo2 := "FIN000002"
Local cParcel := " "
Local cTipo := "NF "
Local cForne := "FIN102"
Local cLoja := "01"
Local cBanco := "001"
Local cAgencia := "00001"
Local cConta := "0000000001"
Local cCheque := ""
Local dBaixa := dDataBase
Local nTipoBx := 1
Local cBcoDe := " "
Local cBcoAte := "ZZZ"
Local dVencIni := dDataBase
Local dVencFim := dDataBase
Local cBordIni := " "
Local cBordFim := "ZZZZZZ"
Local cBenef090 := ""
Local cHistor := ""
Local lMultNat := .F.
Local cLoteFin := ""
Local cNatureza := PadR("PEQ000",Len( SE2->E2_NATUREZ))
Local aFilBx := {cFil1,cFil2}
Private _cAutoMotBx := "DEBITO CC" //Si no se informa esta variable, el motivo de baja será NORMAL
//-- variables utilizadas para el control de error de la rutina automática
Private lMsErroAuto := .F.
Private lAutoErrNoFile := .T.
//-- Data base
dDataBase := CTOD("14/07/2016")
dBaixa := dDataBase
dVencIni := dDataBase
dVencFim := dDataBase
//-- Array con la información para seleccionar los títulos
aAdd(aRecnos,PesqSE2(cFil1,cPref, cTitulo1, cParcel, cTipo, cForne, cLoja))
aAdd(aRecnos,PesqSE2(cFil2,cPref, cTitulo2, cParcel, cTipo, cForne, cLoja))
aRetAuto := {}
aAdd(aRetAuto,aRecnos ) //(array conteniendo los Recnos de los registros por darse de baja)
aAdd(aRetAuto,cBanco ) //(Banco de la baja)
aAdd(aRetAuto,cAgencia ) //(Agencia de la baja)
aAdd(aRetAuto,cConta ) //(Cuenta de la baja)
aAdd(aRetAuto,cCheque ) //(Cheque de la baja - solamente Cuentas por pagar)
aAdd(aRetAuto,cLoteFin ) //(Lote financiero de la baja)
aAdd(aRetAuto,cNatureza ) //(Modalidad del movimiento bancario - solamente Cuentas por pagar)
aAdd(aRetAuto,dBaixa ) //(Fecha de la baja)
aAdd(aRetAuto,nTipoBx ) //(1 = Baja solamente títulos que no están en el borderó o nTipoBx -> 2 = Baja solamente títulos en el borderó)
aAdd(aRetAuto,cBcoDe ) //(De Portador)
aAdd(aRetAuto,cBcoAte ) //(A Portador)
aAdd(aRetAuto,dVencIni ) //(Vencimiento inicial)
aAdd(aRetAuto,dVencFim ) //(Vencimiento final)
aAdd(aRetAuto,cBordIni ) //(Borderó inicial)
aAdd(aRetAuto,cBordFim ) //(Borderó final)
aAdd(aRetAuto,cBenef090 ) //(Beneficiario del cheque)
aAdd(aRetAuto,cHistor ) //(Historial del cheque)
aAdd(aRetAuto,lMultNat ) //(Prorrateo Múltiples modalidades)
aAdd(aRetAuto,aFilBx ) //(Sucursales para selección de los títulos para la baja - Solamente se selecciona sucursales = Sí)
//-- Realiza baja
//3 = inclusión
MSExecAuto({|x, y| FINA090(x, y)}, 3, aRetAuto)
If lMsErroAuto
MOSTRAERRO()
Endif
Return
/*
------------------------------------------------------------------------------------
FBx090VEN
Función para realizar la baja automática por el motivo Vendor
------------------------------------------------------------------------------------
*/
Static Function FBx090VEN()
Local aRetAuto := {}
Local aRecnos := {}
Local cPref := "PEQ"
Local cTitulo := "CT090A090"
Local cTituloV := "CT090V090"
Local cParcel := PadR(" ",Len( SE2->E2_PARCELA ))
Local cTipo := "DP "
Local cNatureza := "PEQ000 "
Local cForne := "PEQ000"
Local cLoja := "00"
Local cCheque := ""
Local cLoteFin := ""
Local cBanco := "001"
Local cAgencia := "00001"
Local cConta := "0000000001"
Local dBaixa := dDatabase
Local cFil := "D MG 01 "
Local nTipoBx := 1
Local cBcoDe := " "
Local cBcoAte := "ZZZ"
Local dVencIni := dDatabase
Local dVencFim := dDatabase
Local cBordIni := " "
Local cBordFim := "ZZZZZZ"
Local cBenef090 := ""
Local cHistor := "BAJA POR VENDOR"
Local lMultNat := .F.
Local cContrato := "FINA090_CT090"
Local dDtVencV := CTOD("20/12/2021")
Local nTxAcresV := 5
Local nValorV := 1000
Local cNatV := "VENDOR "
Local aFilBx := {}
Local aVendor := {cContrato, cBanco, cAgencia, cPref, cTituloV, cParcel, cTipo, dDtVencV, nTxAcresV, cNatV, nValorV}
Private _cAutoMotBx := "VENDOR"
//-- variables utilizadas para el control de error de la rutina automática
Private lMsErroAuto := .F.
Private lAutoErrNoFile := .T.
//-- Data base
dDataBase := CTOD("14/12/2021")
dBaixa := dDataBase
dVencIni := dDataBase
dVencFim := dDataBase
aAdd(aRecnos,PesqSE2(cFil,cPref, cTitulo,cParcel, cTipo, cForne, cLoja))
aAdd(aRetAuto,aRecnos ) //(array conteniendo los Recnos de los registros por darse de baja)
aAdd(aRetAuto,cBanco ) //(Banco de la baja)
aAdd(aRetAuto,cAgencia ) //(Agencia de la baja)
aAdd(aRetAuto,cConta ) //(Cuenta de la baja)
aAdd(aRetAuto,cCheque ) //(Cheque de la baja - solamente Cuentas por pagar)
aAdd(aRetAuto,cLoteFin ) //(Lote financiero de la baja)
aAdd(aRetAuto,cNatureza ) //(Modalidad del movimiento bancario - solamente Cuentas por pagar)
aAdd(aRetAuto,dBaixa ) //(Fecha de la baja)
aAdd(aRetAuto,nTipoBx ) //(1 = Baja solamente títulos que no están en el borderó o nTipoBx -> 2 = Baja solamente títulos en el borderó)
aAdd(aRetAuto,cBcoDe ) //(De Portador)
aAdd(aRetAuto,cBcoAte ) //(A Portador)
aAdd(aRetAuto,dVencIni ) //(Vencimiento inicial)
aAdd(aRetAuto,dVencFim ) //(Vencimiento final)
aAdd(aRetAuto,cBordIni ) //(Borderó inicial)
aAdd(aRetAuto,cBordFim ) //(Borderó final)
aAdd(aRetAuto,cBenef090 ) //(Beneficiario del cheque)
aAdd(aRetAuto,cHistor ) //(Historial del cheque)
aAdd(aRetAuto,lMultNat ) //(Prorrateo Múltiples modalidades)
aAdd(aRetAuto,aFilBx ) //(Sucursales para selección de los títulos para la baja - Solamente se selecciona sucursales = Sí)
aAdd(aRetAuto,aVendor ) //(Array con datos del Vendor)
//-- Realiza baja
//3 = inclusión
MSExecAuto({|x, y| FINA090(x, y)}, 3, aRetAuto)
If lMsErroAuto
MOSTRAERRO()
Endif
Return
/*
------------------------------------------------------------------------------------
FBx090Can
Función para realizar anulación automática de bajas
------------------------------------------------------------------------------------
*/
Static Function FBx090Can()
Local cFil1 := "M PR 01 "
Local cFil2 := "M PR 02 "
Local cForne := "FICN13"
Local cForne2 := "FICN14"
Local aFiliais := {cFil1,cFil2}
//-- variables utilizadas para el control de error de la rutina automática
Private lMsErroAuto := .F.
Private lAutoErrNoFile := .T.
//Data base
dDataBase := CTOD("09/08/2019")
dBaixa := dDataBase
aRetAuto := {}
aAdd(aRetAuto,1 ) //1 = Baja solamente títulos que no están en el borderó o nTipoBx -> 2 = Baja solamente títulos en el borderó
aAdd(aRetAuto," " ) // De Borderó
aAdd(aRetAuto,"ZZZZZ" ) // A Borderó
aAdd(aRetAuto,dDataBase ) // Fch. Baja inicial
aAdd(aRetAuto,dDataBase ) // Fch. Baja final
aAdd(aRetAuto,cForne ) // De Proveedor
aAdd(aRetAuto,cForne2 ) // A Proveedor
aAdd(aRetAuto,aFiliais ) //Títulos dados de baja
//-- Realiza anulación de la baja
//4 = Anulación
MSExecAuto({|x, y| FINA090(x, y)}, 4, aRetAuto)
If lMsErroAuto
MOSTRAERRO()
Endif
Return
/*
------------------------------------------------------------------------------------
PesqSE2
Función para devolver el Recno del título por darse de baja
@param cFilOri , Character, Sucursal de origen del título (E2_FILORIG)
@param cPrefOri , Character, Prefijo del título (E2_PREFIXO)
@param cNumOri , Character, Número del título (E2_NUM)
@param cParcOri , Character, Cuota del título (E2_PARCELA)
@param cTipoOri , Character, Tipo del título (E2_TIPO)
@param cCfOri , Character, Proveedor del título (E2_FORNECE)
@param cLojaOri , Character, Tienda del título (E2_LOJA)
@retorno nRec, Numeric, Recno del registro por darse de baja
------------------------------------------------------------------------------------
*/
Static Function PesqSE2(cFilOri, cPref, cTitulo, cParcel, cTipo, cForne, cLoja )
Local aAreaSE2 := SE2->(GetArea())
Local nRec := 0
DEFAULT cFilOri := cFilAnt
SE2->(DbSetOrder(1))
If DbSeek (xFilial("SE2", cFilOri) + cPref + cTitulo + cParcel + cTipo + cForne + cLoja)
nRec := SE2-> (RECNO())
Endif
RestArea(aAreaSE2)
Return nRec
|
Deck of Cards | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Lista de parámetros aplicados al FINA090 y su procesamiento
Deck of Cards | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
La contabilidad de los procesos aplicados a la compensación cuentas por pagar vía módulo Financiero se realiza por los asientos estándar siguientes:
AE | Hecho generador | ON | OFF |
---|---|---|---|
530 | En la baja de títulos por pagar | X | X |
532 | En la baja de títulos por pagar en Borderó | X | X |
513 | En la inclusión de movimiento bancario de anticipo | X | X |
Informações | ||
---|---|---|
| ||
Borderós: Para títulos normales el asiento estándar será el 532, para títulos de anticipo, el asiento estándar es el 513 Los impuestos con hecho generador "Caja" (en la baja) generados por el borderó, deben ser contabilizados por el AE 530. Historial. Si fuera necesario rescatar el número del borderó e informar en el historial en el momento de la contabilidad, debe utilizarse el campo SEA→EA_NUMBOR. |
Informações | ||
---|---|---|
| ||
Contabilidad por tipo de baja: Títulos: Para títulos normales el asiento estándar será el 530, para títulos de anticipo el asiento estándar es el 513. |
Expandir | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
...