{
===============================================================================
  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 uBizRecibosProveedor;

interface

uses
  uDAInterfaces, uDADataTable, uDBSelectionListUtils, schRecibosProveedorClient_Intf,
  uBizPagosProveedor, uBizRecibosProvCompensados, uBizContactos;

const
  BIZ_CLIENT_IBIZRECIBOSPROVEEDOR = 'Client.IBizRecibosProveedor';

  CTE_PENDIENTE = 'PENDIENTE';
  CTE_PAGADO = 'PAGADO';
  CTE_DEVUELTO = 'DEVUELTO';

type

  IBizRecibosProveedor = interface(IRecibosProveedor)
  ['{FEE753DF-0471-4754-A86C-58BF615929CF}']
    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 SetProveedor(AValue : IBizProveedor);
    function GetProveedor : IBizProveedor;
    property Proveedor : IBizProveedor read GetProveedor write SetProveedor;


    // Esta propidad es para que el controlador pueda acceder directamente
    // a la propiedad Proveedor
    procedure _SetProveedor(AValue : IBizProveedor);
    function _GetProveedor : IBizProveedor;
    property _Proveedor : IBizProveedor read _GetProveedor write _SetProveedor;

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

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


  TBizRecibosProveedor = class(TRecibosProveedorDataTableRules, IBizRecibosProveedor, ISeleccionable)
  protected
    FPagos : IBizPagosProveedor;
    FPagosLink : TDADataSource;
    FRecibosCompensados: IBizRecibosCompensadosProv;
    FRecibosCompensadosLink : TDADataSource;
    FProveedor : IBizProveedor;
    FSeleccionableInterface : ISeleccionable;

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

    // Esta propidad es para que el controlador pueda acceder directamente
    // a la propiedad Proveedor
    procedure _SetProveedor(AValue : IBizProveedor);
    function _GetProveedor : IBizProveedor;

    procedure SetPagos(AValue : IBizPagosProveedor);
    function GetPagos : IBizPagosProveedor;
    procedure OnNewRecord(Sender: TDADataTable); override;

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

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

  public
    property Proveedor : IBizProveedor read GetProveedor write SetProveedor;
    property _Proveedor : IBizProveedor read _GetProveedor write _SetProveedor;

    property RecibosCompensados: IBizRecibosCompensadosProv read GetRecibosCompensados write SetRecibosCompensados;
    property Pagos : IBizPagosProveedor read GetPagos write SetPagos;
    property SeleccionableInterface : ISeleccionable	read FSeleccionableInterface
    					write FSeleccionableInterface
    					implements ISeleccionable;

    procedure IniciarValoresIBizRecibosProveedorNuevo;
    function EsNuevo : Boolean;
    function SinFactura : Boolean;

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

implementation

{ TBizRecibosProveedor }

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

 function TBizRecibosProveedor.GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

function TBizRecibosProveedor.GetRecibosCompensados: IBizRecibosCompensadosProv;
begin
  Result := FRecibosCompensados;
end;

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

function TBizRecibosProveedor.GetPagos: IBizPagosProveedor;
begin
   Result := FPagos;
end;

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

procedure TBizRecibosProveedor.SetPagos(AValue: IBizPagosProveedor);
 begin
   FPagos := AValue;
   EnlazarMaestroDetalle(FPagosLink, FPagos);
 end;

procedure TBizRecibosProveedor.SetProveedor(AValue: IBizProveedor);
var
  bEnEdicion : Boolean;
begin
  FProveedor := AValue;

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

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

    ID_PROVEEDOR := FProveedor.ID;
    NOMBRE_PROVEEDOR := FProveedor.NOMBRE;    
    //El proveedor puede tener un nombre por el ce se le conoce y luego un nombre_comercial
    //caso de elegir la dirección principal del proveedor para el recibo, se cogerá el nombre_comercial para los datos fiscales
    NOMBRE := FProveedor.NOMBRE;
    NIF_CIF := FProveedor.NIF_CIF;
    CALLE := FProveedor.CALLE;
    CODIGO_POSTAL := FProveedor.CODIGO_POSTAL;
    PROVINCIA := FProveedor.PROVINCIA;
    POBLACION := FProveedor.POBLACION;
    Post;

    if bEnEdicion then
      Edit;
  end
end;

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

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

function TBizRecibosProveedor._GetProveedor: IBizProveedor;
begin
  Result := FProveedor;
end;

procedure TBizRecibosProveedor._SetProveedor(AValue: IBizProveedor);
begin
  FProveedor := AValue;
end;

constructor TBizRecibosProveedor.Create(aDataTable: TDADataTable);
begin
  inherited;
  FProveedor := 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 TBizRecibosProveedor.Destroy;
begin
  FPagos := NIL;
  FRecibosCompensados := Nil;
  FreeAndNIL(FPagosLink);
//  FreeAndNIL(FRecibosCompensadosLink);
  FSeleccionableInterface := NIL;
  inherited;
end;

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

procedure TBizRecibosProveedor.IniciarValoresIBizRecibosProveedorNuevo;
begin
  FECHA_EMISION := Date;
  IMPORTE := 0;
  OTROS_GASTOS := 0;
  ID_EMPRESA := AppFactuGES.EmpresaActiva.ID;
  USUARIO := AppFactuGES.UsuarioActivo.UserName;
  ID_TIENDA := AppFactuGES.TiendaActiva.ID;
  TIENDA := AppFactuGES.TiendaActiva.NOMBRE;
end;

procedure TBizRecibosProveedor.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  IniciarValoresIBizRecibosProveedorNuevo;
end;

initialization
  RegisterDataTableRules(BIZ_CLIENT_IBIZRECIBOSPROVEEDOR, TBizRecibosProveedor);

finalization

end.

