AlonsoYSal_FactuGES2/Source/Modulos/Contabilidad/Model/uBizDiario.pas
2019-11-18 10:36:42 +00:00

157 lines
4.1 KiB
ObjectPascal

unit uBizDiario;
interface
uses
uDAInterfaces, uDADataTable, schContabilidadClient_Intf, uBizApuntes;
const
BIZ_CLIENT_Diario = 'Client.Diario';
BIZ_CLIENT_EXTRACTOMOVIMIENTO = 'Client.ExtractoMovimiento';
type
IBizDiario = interface(IDiario)
['{E2924908-0B5A-43DD-B03E-672F592FA19B}']
end;
IBizExtractoMovimiento = interface(IBizDiario)
['{3875CC17-B845-430F-B537-4733C26956D0}']
end;
TBizDiario = class(TDiarioDataTableRules, IBizDiario)
end;
TBizExtractoMovimiento = class(TBizDiario, IBizExtractoMovimiento)
private
FSumaAcumulada: Currency;
procedure recalcular(const DesdeFinal: Boolean);
procedure CalcularSaldo;
protected
procedure AfterDelete(Sender: TDADataTable); override;
procedure AfterPost(Sender: TDADataTable); override;
procedure AfterOpen(Sender: TDADataTable); override;
public
constructor Create(aDataTable: TDADataTable); override;
end;
implementation
{ TBizDiario }
{ TBizExtractoMovimiento }
procedure TBizExtractoMovimiento.AfterDelete(Sender: TDADataTable);
begin
recalcular(False);
end;
procedure TBizExtractoMovimiento.AfterOpen(Sender: TDADataTable);
begin
recalcular(True);
end;
procedure TBizExtractoMovimiento.AfterPost(Sender: TDADataTable);
{var
i, x: Integer;
}
begin
//Comprobamos los cambios para solo recalcular en el caso de modificar el importe
//y añadir un asiento nuevo
{ for i:=0 to DataTable.Delta.count-1 do
if (DataTable.Delta.Changes[i].ChangeType = ctInsert) then
begin
//Este evento salta dos veces, cuando se hace el post en el cliente
//y cuando se hace el applyupdates. En el primer caso todavía no se
//ha asignado el codigo, de esta forma omitiremos el recalculo y
//optimizamos el número de llamadas al mismo
if CODIGO > 0 then recalcular(False);
end
else if (DataTable.Delta.Changes[i].ChangeType = ctUpdate) then
if (DataTable.Delta.Changes[i].OldValueByName[fld_AsientosIMPORTE] <> DataTable.Delta.Changes[i].NewValueByName[fld_AsientosIMPORTE]) then
recalcular(False);
}
end;
procedure TBizExtractoMovimiento.CalcularSaldo;
var
varImportePos: double;
ABookmark: Pointer;
begin
ABookmark := NIL;
DataTable.DisableControls;
DataTable.DisableEventHandlers;
try
ABookmark := DataTable.GetBookMark;
DataTable.Next;
//Comprobamos si calculamos desde el principio o desde un asiento intermedio
if DataTable.EOF
then
varImportePos:= FSumaAcumulada
else
begin
varImportePos:= SALDO;
DataTable.Prior;
end;
while not Self.DataTable.BOF do
begin
DataTable.edit;
SALDO := varImportePos + DEBE - HABER;
varImportePos := SALDO;
DataTable.Post;
DataTable.Prior;
end;
finally
DataTable.GotoBookmark(Abookmark);
DataTable.FreeBookmark(ABookmark);
DataTable.EnableControls;
DataTable.EnableEventHandlers;
end;
end;
constructor TBizExtractoMovimiento.Create(aDataTable: TDADataTable);
begin
inherited;
FSumaAcumulada := 0;
end;
procedure TBizExtractoMovimiento.recalcular(const DesdeFinal: Boolean);
begin
if DesdeFinal then
begin
FSumaAcumulada := 0; //Inicializamos la suma acumulada
DataTable.Last;
end
else
begin
{
DataTable.Sort([fld_DiarioFECHA_ASIENTO, fld_DiarioORDEN_ASIENTO],[sdDescending, sdDescending]);
//En el caso de ser un CIERRE NUEVO el asiento introducido punteamos "localmente"
//todos los asientos anteriores al cierre y luego mandamos al servidor puntear en BD
if TIPOASIENTO = CTE_CIERRE then
begin
puntearAsientos(CTE_PUNTEADO);
dmAsientos.AsignarPunteado(Cuenta.CODIGO, FECHAASIENTO, Cuenta.PENULTIMOCIERRE, CTE_PUNTEADO);
end;
}
end;
CalcularSaldo;
end;
initialization
RegisterDataTableRules(BIZ_CLIENT_Diario, TBizDiario);
RegisterDataTableRules(BIZ_CLIENT_EXTRACTOMOVIMIENTO, TBizExtractoMovimiento);
finalization
end.