unit uBizMedicaciones;

interface

uses
  Classes, uDADataTable, schMedicacionClient_Intf, uDBSelectionListUtils,
  uBizContactos, uBizDetallesMedicacion, uROClasses, uDAInterfaces;

const
  BIZ_CLIENT_MEDICACION = 'Client.Medicacion';

type
  IBizMedicacion = interface(IMedicacion)
  ['{82A23629-60CC-4787-B9BC-2DB2A23A0653}']

    procedure SetPaciente(AValue : IBizPaciente);
    function GetPaciente : IBizPaciente;
    property Paciente : IBizPaciente read GetPaciente write SetPaciente;

    // Esta propidad es para que el controlador pueda acceder directamente
    // a la propiedad Paciente
    procedure _SetPaciente(AValue : IBizPaciente);
    function _GetPaciente : IBizPaciente;
    property _Paciente : IBizPaciente read _GetPaciente write _SetPaciente;

    function GetDetalles: IBizDetallesMedicacion;
    procedure SetDetalles(Value: IBizDetallesMedicacion);
    property Detalles: IBizDetallesMedicacion read GetDetalles write SetDetalles;

    function EsNuevo : Boolean;
  end;

  TBizMedicacion = class(TMedicacionDataTableRules, IBizMedicacion, ISeleccionable)
  protected
    FSeleccionableInterface : ISeleccionable;
    FPaciente : IBizPaciente;
    FDetalles : IBizDetallesMedicacion;
    FDetallesLink : TDADataSource;

    procedure SetPaciente(AValue : IBizPaciente);
    function GetPaciente : IBizPaciente;

    procedure _SetPaciente(AValue : IBizPaciente);
    function _GetPaciente : IBizPaciente;

    function GetDetalles: IBizDetallesMedicacion;
    procedure SetDetalles(Value: IBizDetallesMedicacion);

    procedure SetFECHA_DESDEValue(const aValue: TDateTime); override;
    procedure SetFECHA_HASTAValue(const aValue: TDateTime); override;

    procedure OnNewRecord(Sender: TDADataTable); override;
    procedure IniciarValoresMedicacionNueva;

  public
    function EsNuevo : Boolean;
    property Paciente : IBizPaciente read GetPaciente write SetPaciente;
    property _Paciente : IBizPaciente read _GetPaciente write _SetPaciente;
    property Detalles: IBizDetallesMedicacion read GetDetalles write SetDetalles;

    property SeleccionableInterface : ISeleccionable read FSeleccionableInterface
    write FSeleccionableInterface implements ISeleccionable;

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

implementation

uses
  SysUtils, Variants, uDataModuleConfiguracion, uDataModuleUsuarios,
  uDataTableUtils, DateUtils, uDateUtils, DB, uFactuGES_App;

{ TBizMedicacion }

constructor TBizMedicacion.Create(aDataTable: TDADataTable);
begin
  inherited;
  FPaciente := Nil;
  FDetallesLink := TDADataSource.Create(NIL);
  FDetallesLink.DataTable := aDataTable;
  FSeleccionableInterface := TSeleccionable.Create(aDataTable);
end;

destructor TBizMedicacion.Destroy;
begin
  FPaciente := NIL;
  FDetalles := NIL;
  FDetallesLink.Free;

  FSeleccionableInterface := NIL;
  inherited;
end;

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

function TBizMedicacion.GetPaciente: IBizPaciente;
begin
  Result := FPaciente;
end;

procedure TBizMedicacion.IniciarValoresMedicacionNueva;
begin
  FECHA_DESDE := DateOf(Date);
  FECHA_HASTA := DateOf(Date) + 6;
  REFERENCIA := '';
end;

function TBizMedicacion.GetDetalles: IBizDetallesMedicacion;
begin
  Result := FDetalles;
end;

procedure TBizMedicacion.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  IniciarValoresMedicacionNueva;
end;

procedure TBizMedicacion.SetPaciente(AValue: IBizPaciente);
var
  bEnEdicion : Boolean;

begin
  FPaciente := AValue;

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

    if ID_Paciente <> FPaciente.ID then
    begin
      bEnEdicion := (DataTable.State in dsEditModes);
      if not bEnEdicion then
         DataTable.Edit;

      ID_PACIENTE := FPaciente.ID;

      DataTable.Post;  //Muy importante ya que es necesario hacer un post de la cabecera antes de aņadir detalles
                       //si se quita el id de la cabecera y los detalles se desincroniza
      if bEnEdicion then
         DataTable.Edit;
    end;
  end;
end;

procedure TBizMedicacion.SetDetalles(Value: IBizDetallesMedicacion);
begin
  FDetalles := Value;
  EnlazarMaestroDetalle(FDetallesLink, FDetalles);
end;

procedure TBizMedicacion.SetFECHA_DESDEValue(const aValue: TDateTime);
begin
  if EsFechaVacia(aValue) then
    SetFieldNull(DataTable, fld_MedicacionFECHA_DESDE)
  else
    inherited;
end;

procedure TBizMedicacion.SetFECHA_HASTAValue(const aValue: TDateTime);
begin
  if EsFechaVacia(aValue) then
    SetFieldNull(DataTable, fld_MedicacionFECHA_HASTA)
  else
    inherited;
end;

function TBizMedicacion._GetPaciente: IBizPaciente;
begin
  Result := FPaciente;
end;

procedure TBizMedicacion._SetPaciente(AValue: IBizPaciente);
begin
  FPaciente := AValue;
end;

initialization
  RegisterDataTableRules(BIZ_CLIENT_MEDICACION, TBizMedicacion);

finalization

end.

