{
===============================================================================
  Copyright (©) 2007. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 
  Versión actual: 1.0.0
  Fecha versión actual: 
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit uBizRecibosCliente;

interface

uses
  uDAInterfaces, uDADataTable, uDBSelectionListUtils, schRecibosClienteClient_Intf,
  uBizContactos, uBizPagosCliente, uBizRecibosCliCompensados;

const
  BIZ_CLIENT_IBIZRECIBOSCLIENTE = 'Client.IBizRecibosCliente';

  CTE_PENDIENTE = 'PENDIENTE';
  CTE_COBRADO = 'COBRADO';
  CTE_DEVUELTO = 'DEVUELTO';

type

  IBizRecibosCliente = interface(IRecibosCliente)
  ['{93758493-260C-450D-9018-E5339C2E09B2}']
    function EsNuevo : Boolean;
    function SinFactura : Boolean;

    // En Acana se puede cambiar el cliente por que un recibo puede corresponder o no a una factura
    procedure SetCliente(AValue : IBizCliente);
    function GetCliente : IBizCliente;
    property Cliente : IBizCliente read GetCliente write SetCliente;

    // Esta propidad es para que el controlador pueda acceder directamente
    // a la propiedad Cliente
    procedure _SetCliente(AValue : IBizCliente);
    function _GetCliente : IBizCliente;
    property _Cliente : IBizCliente read _GetCliente write _SetCliente;

    procedure SetPagos(AValue : IBizPagosCliente);
    function GetPagos : IBizPagosCliente;
    property Pagos : IBizPagosCliente read GetPagos write SetPagos;

    function GetRecibosCompensados: IBizRecibosCompensadosCli;
    procedure SetRecibosCompensados(const Value: IBizRecibosCompensadosCli);
    property RecibosCompensados: IBizRecibosCompensadosCli read GetRecibosCompensados write SetRecibosCompensados;
  end;

  TBizRecibosCliente = class(TRecibosClienteDataTableRules, IBizRecibosCliente, ISeleccionable)
  protected
    FPagos : IBizPagosCliente;
    FPagosLink : TDADataSource;
    FRecibosCompensados: IBizRecibosCompensadosCli;
    FRecibosCompensadosLink : TDADataSource;
    FCliente : IBizCliente;
    FSeleccionableInterface : ISeleccionable;

    // En Acana se puede cambiar el cliente por que un recibo puede corresponder o no a una factura
    procedure SetCliente(AValue : IBizCliente);
    function GetCliente : IBizCliente;

    // Esta propidad es para que el controlador pueda acceder directamente
    // a la propiedad Cliente
    procedure _SetCliente(AValue : IBizCliente);
    function _GetCliente : IBizCliente;

    procedure SetPagos(AValue : IBizPagosCliente);
    function GetPagos : IBizPagosCliente;

    function GetRecibosCompensados: IBizRecibosCompensadosCli;
    procedure SetRecibosCompensados(const Value: IBizRecibosCompensadosCli);

    procedure OnNewRecord(Sender: TDADataTable); override;
    function GetSITUACIONValue: String; override;
    procedure SetID_REMESAValue(const aValue: Integer); override;

  public
    property Cliente : IBizCliente read GetCliente write SetCliente;
    property _Cliente : IBizCliente read _GetCliente write _SetCliente;

    property RecibosCompensados: IBizRecibosCompensadosCli read GetRecibosCompensados write SetRecibosCompensados;
    property Pagos : IBizPagosCliente read GetPagos write SetPagos;
    property SeleccionableInterface : ISeleccionable	read FSeleccionableInterface
    					write FSeleccionableInterface
    					implements ISeleccionable;

    procedure IniciarValoresIBizRecibosClienteNuevo;
    function EsNuevo : Boolean;
    function SinFactura : Boolean;

    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;
  end;

implementation

{ TBizRecibosCliente }

uses
  SysUtils, DB, uDataTableUtils, schContactosClient_Intf, uFactuGES_App, uBizEmpresasTiendas;

 function TBizRecibosCliente.GetCliente: IBizCliente;
begin
  Result := FCliente;
end;

function TBizRecibosCliente.GetPagos: IBizPagosCliente;
begin
   Result := FPagos;
end;

function TBizRecibosCliente.GetRecibosCompensados: IBizRecibosCompensadosCli;
begin
  Result := FRecibosCompensados;
end;

function TBizRecibosCliente.GetSITUACIONValue: String;
begin
  result := Trim(DataTable.Fields[idx_RecibosClienteSITUACION].AsString);
end;

procedure TBizRecibosCliente.SetCliente(AValue: IBizCliente);
var
  bEnEdicion : Boolean;
begin
  FCliente := AValue;

  bEnEdicion := (DataTable.State in dsEditModes);
  if not bEnEdicion then
    Edit;

  if Assigned(FCliente) then
  begin
    if not FCliente.DataTable.Active then
      FCliente.DataTable.Active := True;

    ID_CLIENTE := FCliente.ID;
    NOMBRE_CLIENTE := FCliente.NOMBRE;
    //En el caso de cliente en nombre_comercial solo será para localizar y en el
    //caso de elegir la dirección principal del cliente se cogerá el nombre para los datos fiscales
    NOMBRE := FCliente.NOMBRE;
    NIF_CIF := FCliente.NIF_CIF;
    CALLE := FCliente.CALLE;
    CODIGO_POSTAL := FCliente.CODIGO_POSTAL;
    PROVINCIA := FCliente.PROVINCIA;
    POBLACION := FCliente.POBLACION;
    Post;

    if bEnEdicion then
      Edit;
  end
end;

procedure TBizRecibosCliente.SetID_REMESAValue(const aValue: Integer);
begin
  if (aValue = 0) then
    SetFieldNull(DataTable, fld_RecibosClienteID_REMESA)
  else
    inherited;
end;

procedure TBizRecibosCliente.SetPagos(AValue: IBizPagosCliente);
 begin
   FPagos := AValue;
   EnlazarMaestroDetalle(FPagosLink, FPagos);
 end;

procedure TBizRecibosCliente.SetRecibosCompensados(const Value: IBizRecibosCompensadosCli);
begin
  FRecibosCompensados := Value;
  EnlazarMaestroDetalle(FRecibosCompensadosLink, FRecibosCompensados);
end;

function TBizRecibosCliente._GetCliente: IBizCliente;
begin
  Result := FCliente;
end;

procedure TBizRecibosCliente._SetCliente(AValue: IBizCliente);
begin
  FCliente := AValue;
end;

function TBizRecibosCliente.SinFactura: Boolean;
begin
  Result := ID_FACTURAIsNull;
end;

constructor TBizRecibosCliente.Create(aDataTable: TDADataTable);
begin
  inherited;
  FCliente := Nil;
  FPagos := Nil;
  FRecibosCompensados := Nil;

  FPagosLink := TDADataSource.Create(NIL);
  FPagosLink.DataTable := aDataTable;
  FRecibosCompensadosLink := TDADataSource.Create(NIL);
  FRecibosCompensadosLink.DataTable := aDataTable;

	FSeleccionableInterface := TSeleccionable.Create(aDataTable);
end;

destructor TBizRecibosCliente.Destroy;
begin
  FPagos := NIL;
  FRecibosCompensados := Nil;
  FreeAndNIL(FPagosLink);
//  FreeAndNIL(FRecibosCompensadosLink);  
  FSeleccionableInterface := NIL;
  inherited;
end;

function TBizRecibosCliente.EsNuevo: Boolean;
begin
  Result := (ID < 0);
end;

procedure TBizRecibosCliente.IniciarValoresIBizRecibosClienteNuevo;
begin
  FECHA_EMISION := Date;
  IMPORTE := 0;
  OTROS_GASTOS := 0;
  ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
  USUARIO := AppFactuGES.UsuarioActivo.UserName;
  SITUACION := CTE_PENDIENTE;
  ID_TIENDA := AppFactuGES.TiendaActiva.ID;
  TIENDA := AppFactuGES.TiendaActiva.NOMBRE;
end;

procedure TBizRecibosCliente.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  IniciarValoresIBizRecibosClienteNuevo;
end;

initialization
  RegisterDataTableRules(BIZ_CLIENT_IBIZRECIBOSCLIENTE, TBizRecibosCliente);

finalization

end.

