unit uBizContactos;

interface

uses
  uDAInterfaces, uDADataTable, uROClasses,
  schContactosClient_Intf, uBizContactosDatosBancarios, uBizContactosPersonal,
  uDBSelectionListUtils, uBizDireccionesContacto;

const
  BIZ_CLIENT_CONTACTO = 'Client.Contacto';
  BIZ_CLIENT_PACIENTE = 'Client.Paciente';

  CATEGORIA_PACIENTE = 4;

  PROVEEDOR_REGIMEN_IVA = 'General';
  CLIENTE_REGIMEN_IVA = 'General';
  PROVEEDOR_DIAS_VENCIMIENTO = 20;
  CLIENTE_DIAS_VENCIMIENTO = 15;
  CLIENTE_RECARGO_EQUIVALENCIA = 0;

type
  IBizContacto = interface (IContactos)
    ['{CD585680-26B6-47A4-B684-89C468670F4A}']
    procedure SetDatosBancarios(AValue : IBizContactosDatosBancarios);
    function GetDatosBancarios : IBizContactosDatosBancarios;
    property DatosBancarios : IBizContactosDatosBancarios read GetDatosBancarios
      write SetDatosBancarios;

    procedure SetPersonal(AValue : IBizContactoPersonal);
    function GetPersonal : IBizContactoPersonal;
    property Personal : IBizContactoPersonal read GetPersonal
      write SetPersonal;

    function GetCategoria : String;
    property Categoria : String read GetCategoria;

    function GetDirecciones: IBizDireccionesContacto;
    procedure SetDirecciones(const Value: IBizDireccionesContacto);
    property Direcciones : IBizDireccionesContacto read GetDirecciones
      write SetDirecciones;

    function EsNuevo : Boolean;
  end;

  IBizPaciente = interface (IBizContacto)
    ['{E3F0E027-C8B2-40C8-8C1A-96FECF4A2A76}']

    function GetFECHA_NACIMIENTOValue: TDateTime;
    procedure SetFECHA_NACIMIENTOValue(const aValue: TDateTime);

    function GetNUMERO_SSValue: String;
    procedure SetNUMERO_SSValue(const aValue: String);

    function GetFECHA_BAJAValue: TDateTime;
    procedure SetFECHA_BAJAValue(const aValue: TDateTime);

    function GetFECHA_BAJAIsNull: Boolean;
    procedure SetFECHA_BAJAIsNull(const aValue: Boolean);

    function GetCAUSA_BAJAValue: String;
    procedure SetCAUSA_BAJAValue(const aValue: String);

    property FECHA_NACIMIENTO: TDateTime read GetFECHA_NACIMIENTOValue write SetFECHA_NACIMIENTOValue;
    property NUMERO_SS: String read GetNUMERO_SSValue write SetNUMERO_SSValue;
    property FECHA_BAJA: TDateTime read GetFECHA_BAJAValue write SetFECHA_BAJAValue;
    property FECHA_BAJAIsNull: Boolean read GetFECHA_BAJAIsNull write SetFECHA_BAJAIsNull;
    property CAUSA_BAJA: String read GetCAUSA_BAJAValue write SetCAUSA_BAJAValue;
  end;

  TBizContacto = class(TContactosDataTableRules, IBizContacto, ISeleccionable)
  protected
    FDatosBancarios : IBizContactosDatosBancarios;
    FDatosBancariosLink : TDADataSource;
    FDirecciones : IBizDireccionesContacto;
    FDireccionesLink : TDADataSource;
    FPersonal : IBizContactoPersonal;
    FPersonalLink : TDADataSource;

    FSeleccionableInterface : ISeleccionable;

    procedure SetDatosBancarios(AValue : IBizContactosDatosBancarios);
    function GetDatosBancarios : IBizContactosDatosBancarios;

    function GetDirecciones: IBizDireccionesContacto;
    procedure SetDirecciones(const Value: IBizDireccionesContacto);

    function GetCategoria : String;

    procedure SetPersonal(AValue : IBizContactoPersonal);
    function GetPersonal : IBizContactoPersonal;

    procedure OnNewRecord(Sender: TDADataTable); override;
  public
    function EsNuevo : Boolean;
    procedure IniciarValoresContactoNuevo; virtual;
    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;
    property Categoria : String read GetCategoria;

    property Personal : IBizContactoPersonal read GetPersonal
      write SetPersonal;

    property DatosBancarios : IBizContactosDatosBancarios read GetDatosBancarios
      write SetDatosBancarios;

    property Direcciones : IBizDireccionesContacto read GetDirecciones
      write SetDirecciones;

    property SeleccionableInterface : ISeleccionable read FSeleccionableInterface
        write FSeleccionableInterface implements ISeleccionable;
  end;


  TBizPaciente = class(TBizContacto, IBizPaciente)
  protected
    function GetFECHA_NACIMIENTOValue: TDateTime;
    procedure SetFECHA_NACIMIENTOValue(const aValue: TDateTime);

    function GetNUMERO_SSValue: String;
    procedure SetNUMERO_SSValue(const aValue: String);

    function GetFECHA_BAJAValue: TDateTime;
    procedure SetFECHA_BAJAValue(const aValue: TDateTime);

    function GetFECHA_BAJAIsNull: Boolean;
    procedure SetFECHA_BAJAIsNull(const aValue: Boolean);

    function GetCAUSA_BAJAValue: String;
    procedure SetCAUSA_BAJAValue(const aValue: String);
  public
    property FECHA_NACIMIENTO: TDateTime read GetFECHA_NACIMIENTOValue write SetFECHA_NACIMIENTOValue;
    property NUMERO_SS: String read GetNUMERO_SSValue write SetNUMERO_SSValue;
    property FECHA_BAJA: TDateTime read GetFECHA_BAJAValue write SetFECHA_BAJAValue;
    property FECHA_BAJAIsNull: Boolean read GetFECHA_BAJAIsNull write SetFECHA_BAJAIsNull;
    property CAUSA_BAJA: String read GetCAUSA_BAJAValue write SetCAUSA_BAJAValue;

    procedure IniciarValoresContactoNuevo; override;
  end;


implementation

uses
  uDataTableUtils, Classes, DateUtils, SysUtils, uFactuGES_App, Variants;

{ TBizContacto }

constructor TBizContacto.Create(aDataTable: TDADataTable);
begin
  inherited;
  FDatosBancariosLink := TDADataSource.Create(NIL);
  FDatosBancariosLink.DataTable := aDataTable;

  FDireccionesLink := TDADataSource.Create(NIL);
  FDireccionesLink.DataTable := aDataTable;

  FPersonalLink := TDADataSource.Create(NIL);
  FPersonalLink.DataTable := aDataTable;

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

destructor TBizContacto.Destroy;
begin
  FDatosBancarios := NIL;
  FDatosBancariosLink.Free;

  FDirecciones := NIL;
  FDireccionesLink.Free;

  FPersonal := NIL;
  FPersonalLink.Free;

  FSeleccionableInterface := NIL;  
  inherited;
end;

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

function TBizContacto.GetCategoria: String;
begin
  case ID_CATEGORIA of
    4   : Result := 'Paciente';
    else
      Result := 'Contacto';
  end;
end;

function TBizContacto.GetDatosBancarios: IBizContactosDatosBancarios;
begin
  Result := FDatosBancarios;
end;

function TBizContacto.GetDirecciones: IBizDireccionesContacto;
begin
  Result := FDirecciones;
end;

function TBizContacto.GetPersonal: IBizContactoPersonal;
begin
  Result := FPersonal;
end;

procedure TBizContacto.IniciarValoresContactoNuevo;
begin
  USUARIO := AppFactuGES.UsuarioActivo.UserName;
end;

procedure TBizContacto.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  IniciarValoresContactoNuevo;
end;

procedure TBizContacto.SetDatosBancarios(AValue: IBizContactosDatosBancarios);
begin
  FDatosBancarios := AValue;
  EnlazarMaestroDetalle(FDatosBancariosLink, FDatosBancarios);
end;

procedure TBizContacto.SetDirecciones(const Value: IBizDireccionesContacto);
begin
  FDirecciones := Value;
  EnlazarMaestroDetalle(FDireccionesLink, FDirecciones);
end;


procedure TBizContacto.SetPersonal(AValue: IBizContactoPersonal);
begin
  FPersonal := AValue;
  EnlazarMaestroDetalle(FPersonalLink, FPersonal);
end;

{ TBizPaciente }

function TBizPaciente.GetNUMERO_SSValue: String;
begin
  result := DataTable.Fields[idx_PacientesNUMERO_SS].AsString;
end;

function TBizPaciente.GetFECHA_NACIMIENTOValue: TDateTime;
begin
  result := DataTable.Fields[idx_PacientesFECHA_NACIMIENTO].AsDateTime;
end;

procedure TBizPaciente.IniciarValoresContactoNuevo;
begin
  inherited;
  ID_CATEGORIA := CATEGORIA_PACIENTE;
end;

procedure TBizPaciente.SetNUMERO_SSValue(const aValue: String);
begin
  DataTable.Fields[idx_PacientesNUMERO_SS].AsString := aValue;
end;

procedure TBizPaciente.SetFECHA_NACIMIENTOValue(const aValue: TDateTime);
begin
  DataTable.Fields[idx_PacientesFECHA_NACIMIENTO].AsDateTime := aValue;
end;

function TBizPaciente.GetCAUSA_BAJAValue: String;
begin
  result := DataTable.Fields[idx_PacientesCAUSA_BAJA].AsString;
end;

procedure TBizPaciente.SetCAUSA_BAJAValue(const aValue: String);
begin
  DataTable.Fields[idx_PacientesCAUSA_BAJA].AsString := aValue;
end;

function TBizPaciente.GetFECHA_BAJAIsNull: Boolean;
begin
  result := DataTable.Fields[idx_PacientesFECHA_BAJA].IsNull;
end;

function TBizPaciente.GetFECHA_BAJAValue: TDateTime;
begin
  result := DataTable.Fields[idx_PacientesFECHA_BAJA].AsDateTime;
end;

procedure TBizPaciente.SetFECHA_BAJAIsNull(const aValue: Boolean);
begin
  if aValue then
    DataTable.Fields[idx_PacientesFECHA_BAJA].AsVariant := Null;
end;

procedure TBizPaciente.SetFECHA_BAJAValue(const aValue: TDateTime);
begin
  DataTable.Fields[idx_PacientesFECHA_BAJA].AsDateTime := aValue;
end;



initialization
  RegisterDataTableRules(BIZ_CLIENT_CONTACTO, TBizContacto);
  RegisterDataTableRules(BIZ_CLIENT_PACIENTE, TBizPaciente);

finalization

end.
