unit uDataModuleContabilidad;

interface

uses
  SysUtils, Classes, DB, uDADataTable, uDABINAdapter,
  uDAScriptingProvider, uDACDSDataTable, uROWinInetHttpChannel, uROTypes,
  uRORemoteService, uROClient, uROBinMessage, uDADesigntimeCall, uControllerBase,
  uBizBalances, uBizCuentasEspeciales, uBizEpigrafes,  uDARemoteDataAdapter,
  uDADataStreamer, uDAInterfaces, uRODynamicRequest, uBizCuentas, uBizSubCuentas,
  uBizAsientos, uDABin2DataStreamer, uDAMemDataTable, uIDataModuleContabilidad,
  uDataModuleBase, uBizApuntes, uBizDiario;

type
  TDataModuleContabilidad = class(TDataModuleBase, IDataModuleContabilidad)
    RORemoteService: TRORemoteService;
    Bin2DataStreamer: TDABin2DataStreamer;
    rda_Contabilidad: TDARemoteDataAdapter;
    tbl_Balances: TDAMemDataTable;
    ds_Balances: TDADataSource;
    tbl_CuentasEspeciales: TDAMemDataTable;
    ds_CuentasEspeciales: TDADataSource;
    tbl_Epigrafes: TDAMemDataTable;
    ds_Epigrafes: TDADataSource;
    tbl_Cuentas: TDAMemDataTable;
    ds_Cuentas: TDADataSource;
    tbl_SubCuentas: TDAMemDataTable;
    ds_SubCuentas: TDADataSource;
    tbl_Apuntes: TDAMemDataTable;
    ds_Apuntes: TDADataSource;
    tbl_Asientos: TDAMemDataTable;
    ds_Asientos: TDADataSource;
    tbl_Diario: TDAMemDataTable;
    ds_Diario: TDADataSource;
    procedure DAClientDataModuleCreate(Sender: TObject);

  private
    function _GetApuntes : IBizApunte;

  public
    function GetEpigrafeItems: IBizEpigrafe;
    function GetCuentaItems: IBizCuenta;
    function GetSubCuentaItems: IBizSubCuenta;
    function GetSubCuentaItem(const ID: Integer): IBizSubCuenta;
    function NewSubCuentaItem : IBizSubCuenta;
    function GetAsientosDiarioItems: IBizDiario;
    function GetExtractoMovimientosItems: IBizExtractoMovimiento;
    function GetAsientoItem(const ID : Integer): IBizAsiento;
    function GetCuentaEspecialItems: IBizCuentaEspecial;
    function GetBalanceItems: IBizBalance;
    procedure PuntearAsiento(IDAsiento: Integer);
    procedure PuntearSubCuenta(IDSubcuenta: Integer);
  end;

implementation

{$R *.DFM}

uses
  FactuGES_Intf, uDataModuleConexion, uDataTableUtils, cxControls,
  schContabilidadClient_Intf;

{ TdmAlmacens }

procedure TDataModuleContabilidad.DAClientDataModuleCreate(Sender: TObject);
begin
  RORemoteService.Channel := dmConexion.Channel;
  RORemoteService.Message := dmConexion.Message;
end;

function TDataModuleContabilidad.GetAsientoItem(const ID: Integer): IBizAsiento;
var
  AAsiento : TDAMemDataTable;
  Condicion: TDAWhereExpression;

begin
  ShowHourglassCursor;
  try
    AAsiento := CloneDataTable(tbl_Asientos);
    AAsiento.BusinessRulesID := BIZ_CLIENT_ASIENTO;

    with TBizAsiento(AAsiento.BusinessEventsObj) do
    begin
      Apuntes := _GetApuntes;
    end;

    //Filtramos por el ID del asiento
    with AAsiento.DynamicWhere do
    begin
      // (ID = :ID)
      Condicion := NewBinaryExpression(NewField('', fld_AsientosID), NewConstant(ID, datInteger), dboEqual);

      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;

    Result := (AAsiento as IBizAsiento);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModuleContabilidad.GetAsientosDiarioItems: IBizDiario;
var
  ADiario : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    ADiario := CloneDataTable(tbl_Diario);
    ADiario.BusinessRulesID := BIZ_CLIENT_DIARIO;
    Result := (ADiario as IBizDiario);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModuleContabilidad.GetBalanceItems: IBizBalance;
var
  AContabilidadBalance : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    AContabilidadBalance := CloneDataTable(tbl_Balances);
    AContabilidadBalance.BusinessRulesID := BIZ_CLIENT_Balance;
    Result := (AContabilidadBalance as IBizBalance);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModuleContabilidad.GetCuentaEspecialItems: IBizCuentaEspecial;
var
  AContabilidadCuentaEspecial : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    AContabilidadCuentaEspecial := CloneDataTable(tbl_CuentasEspeciales);
    AContabilidadCuentaEspecial.BusinessRulesID := BIZ_CLIENT_CuentaEspecial;
    Result := (AContabilidadCuentaEspecial as IBizCuentaEspecial);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModuleContabilidad.GetCuentaItems: IBizCuenta;
var
  AContabilidadCuenta : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    AContabilidadCuenta := CloneDataTable(tbl_Cuentas);
    AContabilidadCuenta.BusinessRulesID := BIZ_CLIENT_CUENTA;
    Result := (AContabilidadCuenta as IBizCuenta);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModuleContabilidad.GetEpigrafeItems: IBizEpigrafe;
var
  AContabilidadEpigrafe : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    AContabilidadEpigrafe := CloneDataTable(tbl_Epigrafes);
    AContabilidadEpigrafe.BusinessRulesID := BIZ_CLIENT_Epigrafe;
    Result := (AContabilidadEpigrafe as IBizEpigrafe);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModuleContabilidad.GetExtractoMovimientosItems: IBizExtractoMovimiento;
var
  AExtractoMovimiento : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    AExtractoMovimiento := CloneDataTable(tbl_Diario);
    AExtractoMovimiento.BusinessRulesID := BIZ_CLIENT_EXTRACTOMOVIMIENTO;
    Result := (AExtractoMovimiento as IBizExtractoMovimiento);
  finally
    HideHourglassCursor;
  end;
end;


function TDataModuleContabilidad.GetSubCuentaItem(const ID: Integer): IBizSubCuenta;
var
  ASubCuenta : TDAMemDataTable;
  Condicion: TDAWhereExpression;

begin
  ShowHourglassCursor;
  try
    ASubCuenta := CloneDataTable(tbl_SubCuentas);
    ASubCuenta.BusinessRulesID := BIZ_CLIENT_SUBCUENTA;

    //Filtramos por el ID del asiento
    with ASubCuenta.DynamicWhere do
    begin
      // (ID = :ID)
      Condicion := NewBinaryExpression(NewField('', fld_SubCuentasID), NewConstant(ID, datInteger), dboEqual);

      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;

    Result := (ASubCuenta as IBizSubCuenta);
  finally
    HideHourglassCursor;
  end;

end;

function TDataModuleContabilidad.GetSubCuentaItems: IBizSubCuenta;
var
  AContabilidadSubCuenta : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    AContabilidadSubCuenta := CloneDataTable(tbl_SubCuentas);
    AContabilidadSubCuenta.BusinessRulesID := BIZ_CLIENT_SUBCUENTA;
    Result := (AContabilidadSubCuenta as IBizSubCuenta);
  finally
    HideHourglassCursor;
  end;
end;

function TDataModuleContabilidad.NewSubCuentaItem: IBizSubCuenta;
begin
  Result := GetSubCuentaItem(ID_NULO)
end;

procedure TDataModuleContabilidad.PuntearAsiento(IDAsiento: Integer);
begin
  (RORemoteService as IsrvContabilidad).PuntearAsiento(IdAsiento);
end;

procedure TDataModuleContabilidad.PuntearSubCuenta(IDSubcuenta: Integer);
begin
  (RORemoteService as IsrvContabilidad).PuntearSubCuenta(IdSubCuenta);
end;

function TDataModuleContabilidad._GetApuntes: IBizApunte;
var
  AApuntes : TDAMemDataTable;
begin
  ShowHourglassCursor;
  try
    AApuntes := CloneDataTable(tbl_Apuntes);
    with AApuntes do
    begin
      BusinessRulesID := BIZ_CLIENT_APUNTE;
      DetailOptions := DetailOptions - [dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates];
    end;
    Result := (AApuntes as IBizApunte);
  finally
    HideHourglassCursor;
  end;
end;

end.
