unit uViewDatosYSeleccionPacienteMedicacion;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uViewBase, StdCtrls, cxControls, cxContainer, cxEdit, cxLabel,
  cxDBLabel, ExtCtrls, DB, uDADataTable, uBizContactos,
  ComCtrls, ToolWin, ActnList, ImgList, PngImageList, cxTextEdit, cxDBEdit,
  pngimage, JvExControls, JvComponent, JvButton, JvTransparentButton, Mask,
  DBCtrls, dxLayoutControl, Buttons, uDAInterfaces,
  cxMaskEdit, cxButtonEdit, uBizMedicaciones, uPacientesController,
  uDireccionesContactoController, Menus, cxLookAndFeelPainters, cxButtons,
  cxMemo;

type
  IViewDatosYSeleccionPacienteMedicacion = interface(IViewBase)
    ['{EE6D3C7E-1F51-423F-8956-F848DC091D15}']
    function GetMedicacion: IBizMedicacion;
    procedure SetMedicacion(const Value: IBizMedicacion);
    property Medicacion: IBizMedicacion read GetMedicacion write SetMedicacion;

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

    function GetID_Paciente: integer;
    procedure SetID_Paciente(const Value: integer);
    property ID_Paciente: integer read GetID_Paciente write SetID_Paciente;

    function GetOnPacienteChanged : TNotifyEvent;
    procedure SetOnPacienteChanged (const Value : TNotifyEvent);
    property OnPacienteChanged : TNotifyEvent read GetOnPacienteChanged
      write SetOnPacienteChanged;

    procedure ElegirPaciente;
    procedure VerFichaPaciente;
    procedure AnadirNuevoPaciente;
  end;

  TfrViewDatosYSeleccionPacienteMedicacion = class(TfrViewBase, IViewDatosYSeleccionPacienteMedicacion)
    dsPaciente: TDADataSource;
    ActionList1: TActionList;
    actElegirContacto: TAction;
    actAnadirContacto: TAction;
    actVerContacto: TAction;
    PngImageList: TPngImageList;
    dxLayoutControl1Group_Root: TdxLayoutGroup;
    dxLayoutControl1: TdxLayoutControl;
    dxLayoutControl1Item1: TdxLayoutItem;
    edtlNombre: TcxDBTextEdit;
    dxLayoutControl1Item2: TdxLayoutItem;
    edtNUMERO_SS: TcxDBTextEdit;
    Button1: TBitBtn;
    dxLayoutControl1Item7: TdxLayoutItem;
    Button2: TBitBtn;
    dxLayoutControl1Item8: TdxLayoutItem;
    Button3: TBitBtn;
    dxLayoutControl1Item9: TdxLayoutItem;
    dxLayoutControl1Group1: TdxLayoutGroup;
    dxLayoutControl1Group2: TdxLayoutGroup;
    dsMedicacion: TDADataSource;
    dxLayoutControl1Item3: TdxLayoutItem;
    edtPabellon: TcxDBTextEdit;
    dxLayoutControl1Group4: TdxLayoutGroup;
    procedure actElegirContactoExecute(Sender: TObject);
    procedure actAnadirContactoExecute(Sender: TObject);
    procedure actVerContactoUpdate(Sender: TObject);
    procedure actVerContactoExecute(Sender: TObject);
    procedure actElegirDireccionUpdate(Sender: TObject);
    procedure actElegirPersonaContactoUpdate(Sender: TObject);

  private
    FOnPacienteChanged : TNotifyEvent;
    FMsgElegirPaciente: String;
  protected
    FPacientesController : IPacientesController;
    FMedicacion : IBizMedicacion;
    FPaciente : IBizPaciente;
    function GetPaciente: IBizPaciente; virtual;
    procedure SetPaciente(Value: IBizPaciente); virtual;
    function GetOnPacienteChanged : TNotifyEvent;
    procedure SetOnPacienteChanged (const Value : TNotifyEvent);
    procedure SetReadOnly(Value: Boolean); override;
    function GetID_Paciente: integer; virtual;
    procedure SetID_Paciente(const Value: integer); virtual;
    function GetMedicacion: IBizMedicacion;
    procedure SetMedicacion(const Value: IBizMedicacion);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ElegirPaciente;
    procedure VerFichaPaciente;
    procedure AnadirNuevoPaciente;
    property Medicacion: IBizMedicacion read GetMedicacion write SetMedicacion;
    property Paciente: IBizPaciente read GetPaciente write SetPaciente;
    property OnPacienteChanged : TNotifyEvent read GetOnPacienteChanged write SetOnPacienteChanged;
    property ID_Paciente: integer read GetID_Paciente write SetID_Paciente;
  end;

implementation

{$R *.dfm}

{ TfrViewDatosYSeleccionPacienteMedicacion }

uses
  uDataModulePacientes, Math, uCustomView, uBizContactosPersonal, uDialogUtils;


procedure TfrViewDatosYSeleccionPacienteMedicacion.actElegirContactoExecute(Sender: TObject);
begin
  ElegirPaciente;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.actElegirDireccionUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := Assigned(FPaciente.Direcciones) and
      (FPaciente.Direcciones.Active) and (FPaciente.Direcciones.RecordCount > 0);
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.actElegirPersonaContactoUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := Assigned(FPaciente.Personal) and
      (FPaciente.Personal.Active) and (FPaciente.Personal.RecordCount > 0);
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.actAnadirContactoExecute(
  Sender: TObject);
begin
  AnadirNuevoPaciente;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.actVerContactoExecute(
  Sender: TObject);
begin
  inherited;
  VerFichaPaciente;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.actVerContactoUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := (Length(edtlNombre.Text) > 0);
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.AnadirNuevoPaciente;
var
  APaciente : IBizPaciente;
begin
  inherited;
  APaciente := (FPacientesController.Nuevo as IBizPaciente);
  FPacientesController.Ver(APaciente);
  Self.Paciente := APaciente;
end;

constructor TfrViewDatosYSeleccionPacienteMedicacion.Create(AOwner: TComponent);
begin
  inherited;
  FMsgElegirPaciente := 'Elija el paciente para esta medicación.';
  FPacientesController := TPacientesController.Create;

  edtlNombre.Enabled := False;
  edtNUMERO_SS.Enabled := False;
  edtPabellon.Enabled := False;
end;

destructor TfrViewDatosYSeleccionPacienteMedicacion.Destroy;
begin
  FPacientesController := NIL;
  inherited;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.ElegirPaciente;
var
  APaciente : IBizPaciente;
begin
  inherited;

  APaciente := (FPacientesController.ElegirContacto(FPacientesController.BuscarTodos, FMsgElegirPaciente, False) as IBizPaciente);

  if Assigned(APaciente) then
    Self.Paciente := APaciente;
  APaciente := Nil;
end;

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

function TfrViewDatosYSeleccionPacienteMedicacion.GetID_Paciente: integer;
begin
  Result := -1;
  if Assigned(FPaciente) then
    Result := FPaciente.ID;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.SetPaciente(Value: IBizPaciente);
begin
  FPaciente := Value;
  if Assigned(FPaciente) then
  begin
    dsPaciente.DataTable := FPaciente.DataTable;

    if not FPaciente.DataTable.Active then
      FPaciente.DataTable.Active := True;
  end
  else begin
    dsPaciente.DataTable := NIL;
    FPaciente := NIL;
  end;

  if Assigned(FOnPacienteChanged) then
    FOnPacienteChanged(Self);
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.SetID_Paciente(const Value: integer);
begin
  Self.Paciente := IBizPaciente(FPacientesController.Buscar(Value));
end;

function TfrViewDatosYSeleccionPacienteMedicacion.GetOnPacienteChanged: TNotifyEvent;
begin
  Result := FOnPacienteChanged;
end;

function TfrViewDatosYSeleccionPacienteMedicacion.GetMedicacion: IBizMedicacion;
begin
  Result := FMedicacion;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.SetOnPacienteChanged(
  const Value: TNotifyEvent);
begin
  FOnPacienteChanged := Value;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.SetMedicacion(
  const Value: IBizMedicacion);
begin
  FMedicacion := Value;
  if Assigned(FMedicacion) then
  begin
    dsMedicacion.DataTable := FMedicacion.DataTable;

    FPaciente := FMedicacion.Paciente;
    dsPaciente.DataTable := FPaciente.DataTable;

    if not FPaciente.DataTable.Active then
      FPaciente.DataTable.Active := True;

  end
  else begin
    dsMedicacion.DataTable := NIL;
    FPaciente := NIL;
  end;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.SetReadOnly(Value: Boolean);
begin
  inherited;

  if (csLoading in Self.ComponentState) then
    Exit;

  actAnadirContacto.Enabled := not ReadOnly;
  actElegirContacto.Enabled := not ReadOnly;
end;

procedure TfrViewDatosYSeleccionPacienteMedicacion.VerFichaPaciente;
begin
  if not Assigned(Paciente) then
    ShowErrorMessage('No se ha indicado un paciente', 'No hay ningún paciente asociado a mostrar.')
  else begin
    FPacientesController.Ver(Paciente);
  end;
end;

end.
