Diferencia entre revisiones de «TprxCmpCABECERA»
(No se muestran 24 ediciones intermedias del mismo usuario) | |||
Línea 255: | Línea 255: | ||
Este mismo componente sirve para las derivadas de '''cmpCABECERA_pragma_XTD''' o '''cmpCABECERA''', ambas clases implementan campos con nombres ligeramente distintos. | Este mismo componente sirve para las derivadas de '''cmpCABECERA_pragma_XTD''' o '''cmpCABECERA''', ambas clases implementan campos con nombres ligeramente distintos. | ||
<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 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'''. | |||
</blockquote> | |||
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: | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! Orden !! Variable en el dataset !! cmpCABECERA_pragma_XTD !! cmpCABECERA | ! Orden !! Variable en el dataset !! Campo en cmpCABECERA_pragma_XTD !! Campo en cmpCABECERA | ||
|- | |- | ||
|1||FcmpCodigo_Name: String||FCMPCODIGO||cmpCodigo | |1||FcmpCodigo_Name: String||FCMPCODIGO||cmpCodigo | ||
Línea 278: | Línea 271: | ||
|2||FcmpUsuario_Name: String||FCMPUSUARIO||cmpUsuario | |2||FcmpUsuario_Name: String||FCMPUSUARIO||cmpUsuario | ||
|- | |- | ||
|3||FcmpFamilia_Name: String||FCMPFAMILIA||cmpFamilia | |3||FcmpFamilia_Name: String||FCMPFAMILIA||cmpFamilia | ||
|- | |- | ||
|4||FcmpTipo_Name: String||FCMPTIPO||cmpTipo | |4||FcmpTipo_Name: String||FCMPTIPO||cmpTipo | ||
|- | |- | ||
|5||FcmpTipo_Descripcion_Name: String||No tiene | |5||FcmpTipo_Descripcion_Name: String||No tiene campo||No tiene campo | ||
|- | |- | ||
|6||FcmpPuntoEmision_Name: String||FCMPPUNTOVENTA||cmpPuntoEmision | |6||FcmpPuntoEmision_Name: String||FCMPPUNTOVENTA||cmpPuntoEmision | ||
|- | |- | ||
|7||FcmpPuntoEmision_Descripcion_Name: String||No tiene campo||No tiene campo | |7||FcmpPuntoEmision_Descripcion_Name: String||No tiene campo||No tiene campo | ||
Línea 309: | Línea 297: | ||
|15||FcmpFechaValuacion_Name: String||FCMPFECHAVALUACION||cmpFechaValuacion | |15||FcmpFechaValuacion_Name: String||FCMPFECHAVALUACION||cmpFechaValuacion | ||
|- | |- | ||
|16||FcmpCotizacion_Name: String||FCMPCOTIZACION||cmpCotizacion | |16||FcmpCotizacion_Name: String||FCMPCOTIZACION||cmpCotizacion | ||
|- | |- | ||
|17||FcmpTotal_Name: String||FCMPTOTAL||cmpTotal | |17||FcmpTotal_Name: String||FCMPTOTAL||cmpTotal | ||
Línea 323: | Línea 311: | ||
|} | |} | ||
Por ejemplo, la variable FcmpCodigo_Name se define como protected: | |||
<pre> | |||
protected | |||
FcmpCodigo_Name: String; | |||
</pre> | |||
Y luego en public: | |||
<pre> | |||
public | |||
property cmpCodigo_Name: String read FcmpCodigo_Name; | |||
</pre> | |||
En la clase '''TprxCmpCABECERA''' se inicializa como: | |||
<pre> | |||
FcmpCodigo_Name := 'cmpCodigo'; | |||
</pre> | |||
Y en '''TcmpCABECERA_pragma_XTD_implemented''' (que deriva de TprxCmpCABECERA) se inicializa como: | |||
<pre> | |||
FcmpCodigo_Name := 'FCMPCODIGO'; | |||
</pre> | |||
=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: | |||
<pre> | |||
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) | |||
</pre> | |||
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: | |||
*Verifica si el usuario tiene permiso para eliminar. | |||
*Verifica con el auxiliar [[TpAUX_CLASE_POST_CONDICION_unit]]. | |||
===function TprxCmpCABECERA.ReabrirComprobanteVerificar: Boolean=== | |||
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
- Ancestro: TprxADODataSetMaster
- Carpeta: C:\DevelopPrx\classes
- Archivo: prxCmpCABECERA.pas
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:
- Verifica si el usuario tiene permiso para eliminar.
- Verifica con el auxiliar TpAUX_CLASE_POST_CONDICION_unit.
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.