Diferencia entre revisiones de «TprxCmpCABECERA»

De Pragma Wiki
Ir a la navegación Ir a la búsqueda
 
(No se muestran 7 ediciones intermedias del mismo usuario)
Línea 256: Línea 256:


<blockquote>
<blockquote>
La clase TcmpCABECERA_pragma_XTD_implemented inicializa las propiedades según los campos defindos en [[cmpCABECERA_pragma_XTD]] y usa nombres de campo en mayúsculas y cono prefijo la letra '''F'''..
La clase TcmpCABECERA_pragma_XTD_implemented inicializa las propiedades según los campos defindos en [[cmpCABECERA_pragma_XTD]] y usa nombres de campo en mayúsculas y la letra '''F''' como prefijo.


La clase TprxCmpCABECERA inicializa las propiedades según los campos definidos en la clase [[cmpCABECERA]] usa campos en minúsculas sin la '''F'''.
La clase TprxCmpCABECERA inicializa las propiedades según los campos definidos en la clase [[cmpCABECERA]] y usa campos en minúsculas sin la '''F'''.
</blockquote>
</blockquote>


Línea 363: Línea 363:


===function ModoAnulacion: String===
===function ModoAnulacion: String===
Trae el modo de anulación de la tabla desde [[COMPROBANTES/TIPOS]].
Trae el modo de anulación de la tabla desde [[COMPROBANTES/TIPOS]].
 
El modo de anulación puede ser:
*Lógico: el campo ESTADO del comprobante se setea a ANULADO.
*Físico: se elimina el comprobante directamente.
 
En ambos casos el comprobante deja de grabar tablas relacionadas con sus triggers.


===function ModoImpresion_Automatica: Boolean===
===function ModoImpresion_Automatica: Boolean===
Línea 380: Línea 386:


===function TprxCmpCABECERA.ReabrirComprobanteVerificar: Boolean===
===function TprxCmpCABECERA.ReabrirComprobanteVerificar: Boolean===
Verifica si el comprobante puede ser reabierto (ver [[:Category:COMPROBANTES#Estados de un comprobante]]).
Verifica si el comprobante puede ser reabierto (ver [[:Category:COMPROBANTES#Estados de un comprobante|Estados de un comprobante]]).
*Verificamos las condiciones del auxiliar [[TpAUX_CLASE_POST_CONDICION_unit]].
*Verificamos si el usuario tiene permiso para reabrir ese tipo de comprobante (usa la vista cmpPUNTOSEMISION_USUARIOS_VISTA).
 
En caso de que la función valide correctamente eventualmente llamará a la función '''function TprxCmpCABECERA.ReabrirComprobante: Boolean''' para hacerlo.
 
===procedure TprxCmpCABECERA.OnEnterFieldXtd(Sender: TObject; aFieldName: String; aFieldValue: Variant)===
Función llamada durante la edición de un comprobante cuando el foco ingresa al control de edición de un campo. Esta función en particular no implemente código, pero si llama a su inherited.
 
===function TprxCmpCABECERA.OnExitFieldXtd(Sender: TObject; aFieldName: String; aFieldValue: Variant; aErrMsg: String): Boolean===
Función llamada durante la edición de un comprobante cuando el foco deja el control de edición de un campo.
 
Implementa funcionalidad:
*En el campo '''Tipo''' carga algunas propiedades respecto de ese [[COMPROBANTES/TIPOS|Tipo de comprobante]] en particular.
*Cuando completa la '''moneda''' y la '''fecha de valuación''' busca la cotización en la tabla [[MONEDAS/COTIZACIONES]] y la asigna al campo correspondiente.
*En el campo '''referencia''' (normalmente referencia al comprobante del proveedor) hace las validaciones que correspondan al comprobante, por ejemplo: validar que esa referencia no se haya registrado antes.
 
===procedure DefaultValuesAssign===
Asigna los valores por defecto cuando estamos insertando un comprobante.
 
=Implementación, funcionalidad relacionada con el grabado / eliminado del comprobante=
===function UpdateBatchXtd(AffectRecords: TAffectRecords = arAll): Boolean===
Esta función vuelca los cambios hechos a la cabecera del comprobante (y sus posibles detalles) a la base de datos.
*Antes que nada llama a su inherited para grabar la cabecera del comprobante y sus detalles
*Si el código del comprobante todavía tiene los signos de interrogación propios de un comprobante en inserción, llama a la función '''AsignarNumero'''para asignarle el código correcto.
*Si el estado del comprobante sigue siendo '''Nuevo''' le indica al resto de la función que debe procesarse como un comprobante nuevo.
 
===function TomarUltimoNumeroEnUso(aPermiteFechaAnterior: Boolean; var aFechaAnterior: TDateTime): Integer===
Esta función asiste a la función '''AsignarNumero''' obteniendo el número más alto asignado a un comprobante que usa el mismo talonario que el comprobante que estamos procesando.
 
Primero ejecuta un SQL para saber qué comprobantes usan el mismo [[COMPROBANTES/TALONARIOS|TALONARIO]]:
<pre>
SELECT DISTINCT
COMPROBANTETIPO.FFAMILIA
, FTIPO = COMPROBANTETIPO.FCODIGO
, COMPROBANTEFAMILIA_TABLA.FTABLA
, COMPROBANTEFAMILIA_TABLA.FCAMPO_TOTAL
, COMPROBANTEFAMILIA_TABLA.FCAMPO_FECHA
, COMPROBANTEFAMILIA.FGUIONSEPARADOR
, NUMERAACUMULADOR.FUSALETRA
FROM
COMPROBANTETIPO
, COMPROBANTEFAMILIA
, COMPROBANTEFAMILIA_TABLA
, NUMERAACUMULADOR
WHERE
COMPROBANTETIPO.FACUMULADOR =
(
SELECT NUMERADOR.FACUMULADOR FROM COMPROBANTETIPO NUMERADOR WHERE
NUMERADOR.FFAMILIA = @FAMILIA
AND NUMERADOR.FCODIGO = @TIPO
)
AND COMPROBANTEFAMILIA.FCODIGO = COMPROBANTETIPO.FFAMILIA
AND COMPROBANTEFAMILIA_TABLA.FFAMILIA = COMPROBANTETIPO.FFAMILIA
AND EXISTS
(
SELECT T.* FROM information_schema.TABLES T WHERE
T.TABLE_TYPE LIKE @NOMBRE TABLA
AND T.TABLE_NAME = COMPROBANTEFAMILIA_TABLA.FTABLA
)
AND NUMERAACUMULADOR.FCODIGO = COMPROBANTETIPO.FACUMULADOR
ORDER BY
COMPROBANTETIPO.FFAMILIA
, COMPROBANTEFAMILIA_TABLA.FTABLA
, COMPROBANTETIPO.FCODIGO
</pre>
 
Con este resultado busca el número mayor asignado a cada uno de estos comprobantes obteniendo con esto el número más alto asignado a un comprobante de este talonario.
 
===function AsignarNumero: Boolean===
Asigna el número que corresponde al nuevo comprobante y hace los updates necesarios.
 
Usa la función '''TomarUltimoNumeroEnUso''' (justo anterior a ésta):
*Si el talonario no es manual entonces ya tiene el número de comprobante a asignar.
*Si el talonario es manual abre una ventana para que el usuario ingrese el código de comprobante a emitir, esa pantalla sugerirá el número y el usuario debe confirmarlo o ingresar el correcto.
 
Hace un UPDATE sobre la tabla del comprobante para cambiar el código original con el nuevo. Por ejemplo, '???202505191148001' por '''FCF-0001-012345678'''.
 
===function AsignarEstado(aComprobante: String; aEstado: String): Boolean===
Además de asignar el nuevo código, hay que asignar el estado al comprobante según lo que el usuario eligió al grabar el comprobante, eso se hace en esta función.
 
También hace el UPDATE sobre la tabla para modificar ese estado.
 
===function EliminarComprobanteXtd(Sender: TObject): Boolean===
Elimina un comprobante, si es las comprobaciones previas dieron bien.
 
===function TprxCmpCABECERA.ImprimirComprobanteXtd: Boolean===
Imprime un comprobante según los reportes instalados.
 
===function AsignarComprobante_Registrado: Boolean===
Función asociada al [[:Category:WORKFLOW|WORKFLOW]] que permite reasignar un comprobante a otro usuario. Quien reasigna normalmente debe ser quien lo tiene asignado, y solo podrá reasignar a otro usuario que tenga los mismos permisos.
 
===function EstadoAprobacion: String===
Función genérica que retorna el estado de un comprobante en el [[:Category:WORKFLOW|WORKFLOW]].
 
=Implementación, funciones relacionadas con la referencia=
Normalmente la referencia se refiere al ingreso al comprobante del número de comprobante de un proveedor, hay funciones específicas.
 
===function Referencia_Habilita: Boolean===
Según el tipo de comprobante habilita o no los campos relacionados con la referencia.
 
===function TprxCmpCABECERA.Referencia_ValidarFormato(aFieldName: String; aValue: String; var aErrMsg: String): Boolean===
Valida el formato de la referencia.
 
===function Referencia_ValidarExistencia(var aErrMsg: String; aAutImp: Boolean): Boolean===
Valida que la referencia no exista más de una vez para el mismo proveedor.
 
===function RemitoCombustible_ValidarExistencia(var aErrMsg: String; aAutImp: Boolean): Boolean===
Función especial de validación solo para remitos de combustible.
 
=Implementación, funciones relacionadas con la totalización del comprobante=
===function Subtotal: Double===
Calcula el subtotal del comprobante.
 
===procedure Totalizar(aMode: String)===
Totaliza el comprobante.

Revisión actual - 17:11 19 may 2025

Introducción

El objeto TprxCmpCABECERA (Funcionalidad genérica para cabeceras de comprobantes) implementa funcionalidad genérica para cabeceras de comprobantes.

Los ancestros que representan cabeceras de comprobantes son:

  • La clase cmpCABECERA_pragma_XTD.
  • La clase cmpCABECERA.

Identidad

Declaración

type
  TprxCmpCABECERA = class(TprxADODataSetMaster)
  private
    FListaFamilias: TStringList;
    FListaTipos: TStringList;
    FTags_Familia: TStringList;
    FEstadoNuevo: String;
    FCodigoNuevo: String;
    FQueryNumeracion: TprxADOQuery;
    FTipoCambio: String;
  protected
    FFamilia_Codigo: String;
    FFamilia_Descripcion: String;
    FFamilia_Circuito: String;
    FFamilia_SignoOpuesto: Boolean;
    FFamilia_PeriodoAbierto: String;
    FFamilia_UsaValuacion: Boolean;
    FFamilia_EditaFechaValuacion: Boolean;
    FFamilia_MuestraTotal: Boolean;
    FFamilia_MuestraPanelTotal: Boolean;
    FFamilia_Edita_cmpTotal: Boolean;
    FFamilia_cmpTotal_tab_first: Boolean;
    FFamilia_MuestraMoneda: Boolean;
    FFamilia_TablaCabecera: String;
    FFamilia_CampoTotal: String;
    FFamilia_CampoTotalLocal: String;
    FFamilia_CampoFecha: String;
    FFamilia_GuionSeparador: Boolean;
    FFamilia_CalculaImpuestos: String;

    FcmpCodigo_Name: String;
    FcmpUsuario_Name: String;
    FcmpFamilia_Name: String;
    FcmpTipo_Name: String;
    FcmpTipo_Descripcion_Name: String;
    FcmpPuntoEmision_Name: String;
    FcmpPuntoEmision_Descripcion_Name: String;
    FcmpLetra_Name: String;
    FcmpNumero_Name: String;
    FcmpFecha_Name: String;
    FcmpEstado_Name: String;
    FcmpTS_Name: String;
    FcmpMoneda_Name: String;
    FcmpTipoCambio_Name: String;
    FcmpFechaValuacion_Name: String;
    FcmpCotizacion_Name: String;
    FcmpTotal_Name: String;
    FcmpTotal_Local_Name: String;
    FcmpComentarios_Name: String;
    FcmpReferencia_Name: String;
    FcmpReferenciaFecha_Name: String;

    FcmpValidacionReferencia: String;
    FcmpValidacionReferenciaLetras: String;

    procedure   Set_cmpCodigo_Value(aValue: String); virtual;
    function    Get_cmpCodigo_Value: String; virtual;

    procedure   Set_cmpUsuario_Value(aValue: String); virtual;
    function    Get_cmpUsuario_Value: String; virtual;

    procedure   Set_cmpFamilia_Value(aValue: String); virtual;
    function    Get_cmpFamilia_Value: String; virtual;

    procedure   Set_cmpTipo_Value(aValue: String); virtual;
    function    Get_cmpTipo_Value: String; virtual;

    procedure   Set_cmpPuntoEmision_Value(aValue: String); virtual;
    function    Get_cmpPuntoEmision_Value: String; virtual;

    procedure   Set_cmpLetra_Value(aValue: String); virtual;
    function    Get_cmpLetra_Value: String; virtual;

    procedure   Set_cmpNumero_Value(aValue: Integer); virtual;
    function    Get_cmpNumero_Value: Integer; virtual;

    procedure   Set_cmpFecha_Value(aValue: TDatetime); virtual;
    function    Get_cmpFecha_Value: TDatetime; virtual;

    procedure   Set_cmpEstado_Value(aValue: String); virtual;
    function    Get_cmpEstado_Value: String; virtual;

    procedure   Set_cmpTS_Value(aValue: String);
    function    Get_cmpTS_Value: String;

    procedure   Set_cmpMoneda_Value(aValue: String);
    function    Get_cmpMoneda_Value: String;

    procedure   Set_cmpTipoCambio_Value(aValue: String);
    function    Get_cmpTipoCambio_Value: String;

    procedure   Set_cmpFechaValuacion_Value(aValue: TDatetime);
    function    Get_cmpFechaValuacion_Value: TDatetime;

    procedure   Set_cmpCotizacion_Value(aValue: Double);
    function    Get_cmpCotizacion_Value: Double;

    procedure   Set_cmpTotal_Value(aValue: Double);
    function    Get_cmpTotal_Value: Double;

    procedure   Set_cmpComentarios_Value(aValue: String);
    function    Get_cmpComentarios_Value: String;

    procedure   Set_cmpReferencia_Value(aValue: String);
    function    Get_cmpReferencia_Value: String;

    procedure   DefaultValuesAssign; override;
    procedure   SetTableName(aValue: String); override;

    function    CodigoComprobante(aFamilia: String; aTipo: String; aPuntoEmision: String; aLetra: String; aNumero: Integer): String;
    function    TomarUltimoNumeroEnUso(aPermiteFechaAnterior: Boolean; var aFechaAnterior: TDateTime): Integer;
    function    AsignarNumero: Boolean;
    function    AsignarEstado(aComprobante: String; aEstado: String): Boolean;

    function    Referencia_Habilita: Boolean;
    function    Referencia_Valida: Boolean;
    function    Referencia_ValidarFormato(aFieldName: String; aValue: String; var aErrMsg: String): Boolean;
    function    Referencia_ValidarExistencia(var aErrMsg: String; aAutImp: Boolean): Boolean;
    function    RemitoCombustible_ValidarExistencia(var aErrMsg: String; aAutImp: Boolean): Boolean;

    property    ListaFamilias: TStringList read FListaFamilias write FListaFamilias;
    property    ListaTipos: TStringList read FListaTipos write FListaTipos;

    property    QueryNumeracion: TprxADOQuery read FQueryNumeracion write FQueryNumeracion;

    property    TipoCambio: String read FTipoCambio;
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy;  override;
    procedure   Loaded; override;

    function    ModoAnulacion: String;
    function    ModoImpresion_Automatica: Boolean;

    property    Tags_Familia: TStringList read FTags_Familia write FTags_Familia;

    property    cmpCodigo_Value: String read Get_cmpCodigo_Value write Set_cmpCodigo_Value;
    property    cmpUsuario_Value: String read Get_cmpUsuario_Value write Set_cmpUsuario_Value;
    property    cmpFamilia_Value: String read Get_cmpFamilia_Value write Set_cmpFamilia_Value;
    property    cmpTipo_Value: String read Get_cmpTipo_Value write Set_cmpTipo_Value;
    property    cmpPuntoEmision_Value: String read Get_cmpPuntoEmision_Value write Set_cmpPuntoEmision_Value;
    property    cmpLetra_Value: String read Get_cmpLetra_Value write Set_cmpLetra_Value;
    property    cmpNumero_Value: Integer read Get_cmpNumero_Value write Set_cmpNumero_Value;
    property    cmpFecha_Value: TDatetime read Get_cmpFecha_Value write Set_cmpFecha_Value;
    property    cmpEstado_Value: String read Get_cmpEstado_Value write Set_cmpEstado_Value;
    property    cmpTS_Value: String read Get_cmpTS_Value write Set_cmpTS_Value;
    property    cmpMoneda_Value: String read Get_cmpMoneda_Value write Set_cmpMoneda_Value;
    property    cmpTipoCambio_Value: String read Get_cmpTipoCambio_Value write Set_cmpTipoCambio_Value;
    property    cmpFechaValuacion_Value: TDatetime read Get_cmpFechaValuacion_Value write Set_cmpFechaValuacion_Value;
    property    cmpCotizacion_Value: Double read Get_cmpCotizacion_Value write Set_cmpCotizacion_Value;
    property    cmpTotal_Value: Double read Get_cmpTotal_Value write Set_cmpTotal_Value;
    property    cmpComentarios_Value: String read Get_cmpComentarios_Value write Set_cmpComentarios_Value;
    property    cmpReferencia_Value: String read Get_cmpReferencia_Value write Set_cmpReferencia_Value;

    function    ImprimirComprobanteXtd: Boolean;
    function    ImprimirComprobanteXtd_Registrado: Boolean;

    function    AsignarComprobante_Registrado: Boolean;
    function    EstadoAprobacion: String;

    function    CanInsertXtd: Boolean; override;

    function    PuedeRegistrar(var aMsg: String; aOP: String): Boolean; virtual;
    function    PuedeEliminar(var aMsg: String): Boolean; virtual;
    function    ReabrirComprobanteVerificar: Boolean;
    function    ReabrirComprobante: Boolean; virtual;
    procedure   GetPopupOptions(Sender: TprxPopupMenu); override;

    procedure   OnEnterFieldXtd(Sender: TObject; aFieldName: String; aFieldValue: Variant); override;
    function    OnExitFieldXtd(Sender: TObject; aFieldName: String; aFieldValue: Variant; aErrMsg: String): Boolean; override;

    procedure   InsertXtd(Sender: TObject); override;
    procedure   EditXtd(Sender: TObject); override;
    procedure   CancelXtd(Sender: TObject); override;

    function    RequeryXtd: Boolean; override;

    function    UpdateBatchXtd(AffectRecords: TAffectRecords = arAll): Boolean; override;
    procedure   DeleteAndPostXtd(Sender: TObject);

    function    EliminarComprobante(Sender: TObject): Boolean;
    function    EliminarComprobanteXtd(Sender: TObject): Boolean;

    procedure   Totalizar(aMode: String); virtual;
    function    Subtotal: Double;

    property    Familia_Codigo: String read FFamilia_Codigo;
    property    Familia_Descripcion: String read FFamilia_Descripcion;
    property    Familia_Circuito: String read FFamilia_Circuito;
    property    Familia_SignoOpuesto: Boolean read FFamilia_SignoOpuesto;
    property    Familia_PeriodoAbierto: String read FFamilia_PeriodoAbierto;
    property    Familia_UsaValuacion: Boolean read FFamilia_UsaValuacion;
    property    Familia_EditaFechaValuacion: Boolean read FFamilia_EditaFechaValuacion;
    property    Familia_MuestraTotal: Boolean read FFamilia_MuestraTotal;
    property    Familia_MuestraPanelTotal: Boolean read FFamilia_MuestraPanelTotal;

    property    Familia_Edita_cmpTotal: Boolean read FFamilia_Edita_cmpTotal;
    property    Familia_cmpTotal_tab_first: Boolean read FFamilia_cmpTotal_tab_first write FFamilia_cmpTotal_tab_first;
    property    Familia_MuestraMoneda: Boolean read FFamilia_MuestraMoneda;
    property    Familia_TablaCabecera: String read FFamilia_TablaCabecera;
    property    Familia_CampoTotal: String read FFamilia_CampoTotal;
    property    Familia_CampoTotalLocal: String read FFamilia_CampoTotalLocal;
    property    Familia_CampoFecha: String read FFamilia_CampoFecha;
    property    Familia_GuionSeparador: Boolean read FFamilia_GuionSeparador;
    property    Familia_CalculaImpuestos: String read FFamilia_CalculaImpuestos;

    property    cmpCodigo_Name: String read FcmpCodigo_Name;
    property    cmpUsuario_Name: String read FcmpUsuario_Name;
    property    cmpFamilia_Name: String read FcmpFamilia_Name;
    property    cmpTipo_Name: String read FcmpTipo_Name;
    property    cmpTipo_Descripcion_Name: String read FcmpTipo_Descripcion_Name;
    property    cmpPuntoEmision_Name: String read FcmpPuntoEmision_Name;
    property    cmpPuntoEmision_Descripcion_Name: String read FcmpPuntoEmision_Descripcion_Name;
    property    cmpLetra_Name: String read FcmpLetra_Name;
    property    cmpNumero_Name: String read FcmpNumero_Name;
    property    cmpFecha_Name: String read FcmpFecha_Name;
    property    cmpEstado_Name: String read FcmpEstado_Name;
    property    cmpTS_Name: String read FcmpTS_Name;

    property    cmpMoneda_Name: String read FcmpMoneda_Name;
    property    cmpTipoCambio_Name: String read FcmpTipoCambio_Name;
    property    cmpFechaValuacion_Name: String read FcmpFechaValuacion_Name;
    property    cmpCotizacion_Name: String read FcmpCotizacion_Name;
    property    cmpTotal_Name: String read FcmpTotal_Name;
    property    cmpTotal_Local_Name: String read FcmpTotal_Local_Name;
    property    cmpComentarios_Name: String read FcmpComentarios_Name;
    property    cmpReferencia_Name: String read FcmpReferencia_Name;
    property    cmpReferenciaFecha_Name: String read FcmpReferenciaFecha_Name;
    property    cmpValidacionReferencia: String read FcmpValidacionReferencia write FcmpValidacionReferencia;
    property    cmpValidacionReferenciaLetras: String read FcmpValidacionReferenciaLetras write FcmpValidacionReferenciaLetras;

    property    xxEstadoNuevo: String read FEstadoNuevo write FEstadoNuevo;
    property    CodigoNuevo: String read FCodigoNuevo;
  published
  end;

Propiedades de nombres de campos

Este mismo componente sirve para las derivadas de cmpCABECERA_pragma_XTD o cmpCABECERA, ambas clases implementan campos con nombres ligeramente distintos.

La clase TcmpCABECERA_pragma_XTD_implemented inicializa las propiedades según los campos defindos en cmpCABECERA_pragma_XTD y usa nombres de campo en mayúsculas y la letra F como prefijo.

La clase TprxCmpCABECERA inicializa las propiedades según los campos definidos en la clase cmpCABECERA y usa campos en minúsculas sin la F.

Para no tener que escribir dos componentes con nombres de campos distintos, estos nombres se asignan a las siguientes variables del componente y se usan en el código:

Orden Variable en el dataset Campo en cmpCABECERA_pragma_XTD Campo en cmpCABECERA
1 FcmpCodigo_Name: String FCMPCODIGO cmpCodigo
2 FcmpUsuario_Name: String FCMPUSUARIO cmpUsuario
3 FcmpFamilia_Name: String FCMPFAMILIA cmpFamilia
4 FcmpTipo_Name: String FCMPTIPO cmpTipo
5 FcmpTipo_Descripcion_Name: String No tiene campo No tiene campo
6 FcmpPuntoEmision_Name: String FCMPPUNTOVENTA cmpPuntoEmision
7 FcmpPuntoEmision_Descripcion_Name: String No tiene campo No tiene campo
8 FcmpLetra_Name: String FCMPLETRA cmpLetra
9 FcmpNumero_Name: String FCMPNUMERO cmpNumero
10 FcmpFecha_Name: String FCMPFECHA cmpFecha
11 FcmpEstado_Name: String FCMPESTADO cmpEstado
12 FcmpTS_Name: String No existe el campo cmpTS
13 FcmpMoneda_Name: String FCMPMONEDA cmpMoneda
14 FcmpTipoCambio_Name: String NA cmpTipoCambio
15 FcmpFechaValuacion_Name: String FCMPFECHAVALUACION cmpFechaValuacion
16 FcmpCotizacion_Name: String FCMPCOTIZACION cmpCotizacion
17 FcmpTotal_Name: String FCMPTOTAL cmpTotal
18 FcmpTotal_Local_Name: String FCMPTOTAL_LOCAL cmpTotal_Local
19 FcmpComentarios_Name: String FCMPCOMENTARIOS cmpComentarios
20 FcmpReferencia_Name: String FREFERENCIA Referencia
21 FcmpReferenciaFecha_Name: String FREFERENCIAFECHA ReferenciaFecha

Por ejemplo, la variable FcmpCodigo_Name se define como protected:

protected
  FcmpCodigo_Name: String;

Y luego en public:

public
  property    cmpCodigo_Name: String read FcmpCodigo_Name;

En la clase TprxCmpCABECERA se inicializa como:

FcmpCodigo_Name := 'cmpCodigo';

Y en TcmpCABECERA_pragma_XTD_implemented (que deriva de TprxCmpCABECERA) se inicializa como:

FcmpCodigo_Name := 'FCMPCODIGO';

Implementación

procedure SetTableName(aValue: String)

Al setearse el nombre de la tabla a la que corresponde el comprobante, este procedimiento ejecuta un SQL para traer las definiciones de COMPROBANTES/FAMILIAS del comprobante:

SELECT
FFAMILIA = COMPROBANTEFAMILIA.FCODIGO
, COMPROBANTEFAMILIA.FDESCRIPCION
, COMPROBANTEFAMILIA.FPERIODOABIERTO
, COMPROBANTEFAMILIA.FUSAVALUACION
, COMPROBANTEFAMILIA.FEDITAFECHAVALUACION
, COMPROBANTEFAMILIA.FMUESTRATOTAL
, COMPROBANTEFAMILIA.FMUESTRAMONEDA
, COMPROBANTEFAMILIA.FGUIONSEPARADOR
, COMPROBANTEFAMILIA_TABLA.FTABLA
, COMPROBANTEFAMILIA_TABLA.FCAMPO_TOTAL
, COMPROBANTEFAMILIA_TABLA.FCAMPO_TOTAL_LOCAL
, COMPROBANTEFAMILIA_TABLA.FCAMPO_FECHA
, COMPROBANTEFAMILIA.FEDITATOTAL
, FEDITATOTAL_TAG = CASE WHEN COMPROBANTEFAMILIA.FEDITATOTAL_TAG = 'tab_first' THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END
FROM
COMPROBANTEFAMILIA_TABLA
INNER JOIN COMPROBANTEFAMILIA ON
COMPROBANTEFAMILIA.FCODIGO = COMPROBANTEFAMILIA_TABLA.FFAMILIA
WHERE
COMPROBANTEFAMILIA_TABLA.FTABLA = (argumento)

Ese resultado se asigna a las propiedades que comienzan con FFamilia_.

function ModoAnulacion: String

Trae el modo de anulación de la tabla desde COMPROBANTES/TIPOS.

El modo de anulación puede ser:

  • Lógico: el campo ESTADO del comprobante se setea a ANULADO.
  • Físico: se elimina el comprobante directamente.

En ambos casos el comprobante deja de grabar tablas relacionadas con sus triggers.

function ModoImpresion_Automatica: Boolean

Trae el modo de impresión de la tabla desde COMPROBANTES/TIPOS.

function CanInsertXtd: Boolean

Esta función primero ejecuta el código de su ancestro, y luego verifica si el usuario tiene permiso para agregar este tipo de comprobante.

function PuedeRegistrar(var aMsg: String; aOP: String): Boolean

Si la fecha del comprobante está habilitada dentro de las fechas del COMPROBANTES/PERIODOS que le corresponde retorna True, sino retorna False.

function PuedeEliminar(var aMsg: String): Boolean

Verifica si el comprobante activo puede ser eliminado:

function TprxCmpCABECERA.ReabrirComprobanteVerificar: Boolean

Verifica si el comprobante puede ser reabierto (ver Estados de un comprobante).

  • Verificamos las condiciones del auxiliar TpAUX_CLASE_POST_CONDICION_unit.
  • Verificamos si el usuario tiene permiso para reabrir ese tipo de comprobante (usa la vista cmpPUNTOSEMISION_USUARIOS_VISTA).

En caso de que la función valide correctamente eventualmente llamará a la función function TprxCmpCABECERA.ReabrirComprobante: Boolean para hacerlo.

procedure TprxCmpCABECERA.OnEnterFieldXtd(Sender: TObject; aFieldName: String; aFieldValue: Variant)

Función llamada durante la edición de un comprobante cuando el foco ingresa al control de edición de un campo. Esta función en particular no implemente código, pero si llama a su inherited.

function TprxCmpCABECERA.OnExitFieldXtd(Sender: TObject; aFieldName: String; aFieldValue: Variant; aErrMsg: String): Boolean

Función llamada durante la edición de un comprobante cuando el foco deja el control de edición de un campo.

Implementa funcionalidad:

  • En el campo Tipo carga algunas propiedades respecto de ese Tipo de comprobante en particular.
  • Cuando completa la moneda y la fecha de valuación busca la cotización en la tabla MONEDAS/COTIZACIONES y la asigna al campo correspondiente.
  • En el campo referencia (normalmente referencia al comprobante del proveedor) hace las validaciones que correspondan al comprobante, por ejemplo: validar que esa referencia no se haya registrado antes.

procedure DefaultValuesAssign

Asigna los valores por defecto cuando estamos insertando un comprobante.

Implementación, funcionalidad relacionada con el grabado / eliminado del comprobante

function UpdateBatchXtd(AffectRecords: TAffectRecords = arAll): Boolean

Esta función vuelca los cambios hechos a la cabecera del comprobante (y sus posibles detalles) a la base de datos.

  • Antes que nada llama a su inherited para grabar la cabecera del comprobante y sus detalles
  • Si el código del comprobante todavía tiene los signos de interrogación propios de un comprobante en inserción, llama a la función AsignarNumeropara asignarle el código correcto.
  • Si el estado del comprobante sigue siendo Nuevo le indica al resto de la función que debe procesarse como un comprobante nuevo.

function TomarUltimoNumeroEnUso(aPermiteFechaAnterior: Boolean; var aFechaAnterior: TDateTime): Integer

Esta función asiste a la función AsignarNumero obteniendo el número más alto asignado a un comprobante que usa el mismo talonario que el comprobante que estamos procesando.

Primero ejecuta un SQL para saber qué comprobantes usan el mismo TALONARIO:

SELECT DISTINCT
COMPROBANTETIPO.FFAMILIA
, FTIPO = COMPROBANTETIPO.FCODIGO
, COMPROBANTEFAMILIA_TABLA.FTABLA
, COMPROBANTEFAMILIA_TABLA.FCAMPO_TOTAL
, COMPROBANTEFAMILIA_TABLA.FCAMPO_FECHA
, COMPROBANTEFAMILIA.FGUIONSEPARADOR
, NUMERAACUMULADOR.FUSALETRA
FROM
COMPROBANTETIPO
, COMPROBANTEFAMILIA
, COMPROBANTEFAMILIA_TABLA
, NUMERAACUMULADOR
WHERE
COMPROBANTETIPO.FACUMULADOR =
(
SELECT NUMERADOR.FACUMULADOR FROM COMPROBANTETIPO NUMERADOR WHERE
NUMERADOR.FFAMILIA = @FAMILIA
AND NUMERADOR.FCODIGO = @TIPO
)
AND COMPROBANTEFAMILIA.FCODIGO = COMPROBANTETIPO.FFAMILIA
AND COMPROBANTEFAMILIA_TABLA.FFAMILIA = COMPROBANTETIPO.FFAMILIA
AND EXISTS
(
SELECT T.* FROM information_schema.TABLES T WHERE
T.TABLE_TYPE LIKE @NOMBRE TABLA
AND T.TABLE_NAME = COMPROBANTEFAMILIA_TABLA.FTABLA
)
AND NUMERAACUMULADOR.FCODIGO = COMPROBANTETIPO.FACUMULADOR
ORDER BY
COMPROBANTETIPO.FFAMILIA
, COMPROBANTEFAMILIA_TABLA.FTABLA
, COMPROBANTETIPO.FCODIGO

Con este resultado busca el número mayor asignado a cada uno de estos comprobantes obteniendo con esto el número más alto asignado a un comprobante de este talonario.

function AsignarNumero: Boolean

Asigna el número que corresponde al nuevo comprobante y hace los updates necesarios.

Usa la función TomarUltimoNumeroEnUso (justo anterior a ésta):

  • Si el talonario no es manual entonces ya tiene el número de comprobante a asignar.
  • Si el talonario es manual abre una ventana para que el usuario ingrese el código de comprobante a emitir, esa pantalla sugerirá el número y el usuario debe confirmarlo o ingresar el correcto.

Hace un UPDATE sobre la tabla del comprobante para cambiar el código original con el nuevo. Por ejemplo, '???202505191148001' por FCF-0001-012345678.

function AsignarEstado(aComprobante: String; aEstado: String): Boolean

Además de asignar el nuevo código, hay que asignar el estado al comprobante según lo que el usuario eligió al grabar el comprobante, eso se hace en esta función.

También hace el UPDATE sobre la tabla para modificar ese estado.

function EliminarComprobanteXtd(Sender: TObject): Boolean

Elimina un comprobante, si es las comprobaciones previas dieron bien.

function TprxCmpCABECERA.ImprimirComprobanteXtd: Boolean

Imprime un comprobante según los reportes instalados.

function AsignarComprobante_Registrado: Boolean

Función asociada al WORKFLOW que permite reasignar un comprobante a otro usuario. Quien reasigna normalmente debe ser quien lo tiene asignado, y solo podrá reasignar a otro usuario que tenga los mismos permisos.

function EstadoAprobacion: String

Función genérica que retorna el estado de un comprobante en el WORKFLOW.

Implementación, funciones relacionadas con la referencia

Normalmente la referencia se refiere al ingreso al comprobante del número de comprobante de un proveedor, hay funciones específicas.

function Referencia_Habilita: Boolean

Según el tipo de comprobante habilita o no los campos relacionados con la referencia.

function TprxCmpCABECERA.Referencia_ValidarFormato(aFieldName: String; aValue: String; var aErrMsg: String): Boolean

Valida el formato de la referencia.

function Referencia_ValidarExistencia(var aErrMsg: String; aAutImp: Boolean): Boolean

Valida que la referencia no exista más de una vez para el mismo proveedor.

function RemitoCombustible_ValidarExistencia(var aErrMsg: String; aAutImp: Boolean): Boolean

Función especial de validación solo para remitos de combustible.

Implementación, funciones relacionadas con la totalización del comprobante

function Subtotal: Double

Calcula el subtotal del comprobante.

procedure Totalizar(aMode: String)

Totaliza el comprobante.