unit uPacientesController;

interface

uses
  uCustomEditor, Classes,
  uContactosController, uBizContactos,
  uIEditorPacientes, uIEditorPaciente, uIDataModuleContactos, uIDataModulePacientes;

type
  IPacientesController = interface(IContactosController)
  ['{A3841871-7EF6-4847-9758-EA2B1C521D4A}']
    function EsEliminable(APaciente: IBizContacto): Boolean;
    function Eliminar(APaciente: IBizContacto; AllItems: Boolean = false): Boolean; overload;
    procedure Preview(APaciente : IBizPaciente; AllItems: Boolean = false);
    procedure Print(APaciente : IBizPaciente; AllItems: Boolean = false);
  end;

  TPacientesController = class(TContactosController, IPacientesController)
  protected
    function ValidarContacto(AContacto : IBizContacto): Boolean; override;

  public
    constructor Create; override;

    function Duplicar(AContacto: IBizContacto): IBizContacto; override;

    function Buscar(const ID: Integer): IBizContacto; override;
    function BuscarTodos: IBizContacto; override;
    function Nuevo : IBizContacto; override;
    procedure Ver(AContacto : IBizContacto); override;
    procedure VerTodos(AContactos: IBizContacto); override;

    function Eliminar(APaciente: IBizContacto; AllItems: Boolean = false): Boolean; overload;
    function EsEliminable(APaciente: IBizContacto): Boolean;

    procedure Preview(APaciente : IBizPaciente; AllItems: Boolean = false);
    procedure Print(APaciente : IBizPaciente; AllItems: Boolean = false);

    function ElegirContacto(AContactos : IBizContacto;
      AMensaje: String; AMultiSelect: Boolean): IBizContacto; override;
  end;

implementation

uses
  Windows, SysUtils, cxControls, Dialogs, uDataModulePacientes, uEditorRegistryUtils,
  uDataTableUtils, uDADataTable, DB, schContactosClient_Intf, uFichasPacienteReportController,
  uEditorGridBase, uIntegerListUtils, uIEditorElegirPacientes, Controls,
  Forms, uDialogUtils, uModuleController, uFactuGES_App,
  uPlugins_Intf;

{ TPacienteController }

function TPacientesController.Buscar(const ID: Integer): IBizContacto;
begin
  Result := (FDataModule as IDataModulePacientes).GetItem(ID);
  FiltrarEmpresa(Result);
end;

function TPacientesController.BuscarTodos: IBizContacto;
begin
  Result := (FDataModule as IDataModulePacientes).GetItems;
  FiltrarEmpresa(Result);
end;

constructor TPacientesController.Create;
begin
  inherited;
  FDataModule := TDataModulePacientes.Create(Nil);
end;

function TPacientesController.Duplicar(AContacto: IBizContacto): IBizContacto;
begin
  Result := inherited Duplicar(AContacto);
end;

function TPacientesController.ElegirContacto(AContactos: IBizContacto;
  AMensaje: String; AMultiSelect: Boolean): IBizContacto;
var
  AEditor : IEditorElegirPacientes;
begin
  Result := NIL;

  CreateEditor('EditorElegirPacientes', IEditorElegirPacientes, AEditor);
  if Assigned(AEditor) then
  begin
    try
      AEditor.Contactos := AContactos;
      AEditor.Controller := Self;
      AEditor.MultiSelect := AMultiSelect;
      AEditor.Mensaje := AMensaje;
      if IsPositiveResult(AEditor.ShowModal) then
        Result := AEditor.ContactosSeleccionados;
    finally
      AEditor.Release;
      AEditor := NIL;
      Application.ProcessMessages;
    end;
  end;
end;

function TPacientesController.Eliminar(APaciente: IBizContacto; AllItems: Boolean = false): Boolean;
//En el caso de eliminar almenos un elemento del conjunto se devuelve true
var
  bEliminado: Boolean;
begin
  bEliminado := False;
  
  if not Assigned(APaciente) then
    raise Exception.Create ('Contacto no asignado');

  ShowHourglassCursor;
  try
    if not APaciente.DataTable.Active then
      APaciente.DataTable.Active := True;

    if (APaciente.State in dsEditModes) then
      APaciente.Cancel;

    //Siempre eliminaremos el seleccionado
    if EsEliminable(APaciente) then
    begin
      APaciente.Delete;
      bEliminado := True;
    end;

    //En el caso de querer eliminar todos los items del objeto APaciente
    if AllItems then
    begin
       with APaciente.DataTable do
       begin
         First;
         while not EOF do
         begin
           if EsEliminable(APaciente) then
           begin
              APaciente.Delete;
              bEliminado := True
           end
           else Next;
         end;
       end;
    end;

    if bEliminado then
    begin
       APaciente.DataTable.ApplyUpdates;
       Result := True;
    end
    else
       Result := False;

  finally
    HideHourglassCursor;
  end;
end;

function TPacientesController.EsEliminable(APaciente: IBizContacto): Boolean;
begin
  if not Assigned(APaciente) then
     raise Exception.Create ('Contacto no asignado: EsEliminable');

  Result := True;
end;

function TPacientesController.Nuevo: IBizContacto;
var
  AContacto : IBizPaciente;
begin
  AContacto := (FDataModule as IDataModulePacientes).NewItem;
  FiltrarEmpresa(AContacto);  
  AContacto.DataTable.Active := True;
  AContacto.Insert;
  Result := AContacto;
end;

procedure TPacientesController.Preview(APaciente: IBizPaciente; AllItems: Boolean);
var
  AReportController : IFichasPacienteReportController;
  ID_Fichas: TIntegerList;
begin
  AReportController := TFichasPacienteReportController.Create;
  ID_Fichas := TIntegerList.Create;
  try
   //Si deseamos previsualizar todos los items del objeto
   if AllItems then
   begin
     with APaciente.DataTable do
     begin
       First;
       while not EOF do
       begin
         ID_Fichas.Add(APaciente.ID);
         Next;
       end;
     end;
   end
   //Solo previsualizamos el item seleccionado
   else
     ID_Fichas.Add(APaciente.ID);

   AReportController.Preview(ID_Fichas);
  finally
    AReportController := NIL;
    FreeANDNil(ID_Fichas);
  end;
end;

procedure TPacientesController.Print(APaciente: IBizPaciente; AllItems: Boolean);
var
  AReportController : IFichasPacienteReportController;
  ID_Fichas: TIntegerList;

begin
  AReportController := TFichasPacienteReportController.Create;
  ID_Fichas := TIntegerList.Create;

  try
   //Si deseamos previsualizar todos los items del objeto
   if AllItems then
   begin
     with APaciente.DataTable do
     begin
       First;
       while not EOF do
       begin
         ID_Fichas.Add(APaciente.ID);
         Next;
       end;
     end;
   end
   //Solo previsualizamos el item seleccionado
   else
     ID_Fichas.Add(APaciente.ID);

    AReportController.Print(ID_Fichas);
  finally
    AReportController := NIL;
    FreeANDNIL(ID_Fichas);
  end;
end;

function TPacientesController.ValidarContacto(AContacto: IBizContacto): Boolean;
begin
  Result := inherited ValidarContacto(AContacto);

  if Result then
  begin
    if not (AContacto as IBizPaciente).FECHA_BAJAIsNull and
           (Length((AContacto as IBizPaciente).CAUSA_BAJA) = 0) then
      raise Exception.Create('Debe indicar la causa de la baja del paciente.');
  end;
end;

procedure TPacientesController.Ver(AContacto: IBizContacto);
var
  AEditor : IEditorPaciente;
begin
  AEditor := NIL;

  CreateEditor('EditorPaciente', IEditorPaciente, AEditor);
  if Assigned(AEditor) then
    try
      AEditor.Contacto := AContacto;
      AEditor.Controller := Self;
      AEditor.ShowModal;
    finally
      AEditor.Release;
      AEditor := NIL;
    end;
end;

procedure TPacientesController.VerTodos(AContactos: IBizContacto);
var
  AEditor : IEditorPacientes;
begin
  AEditor := NIL;

  CreateEditor('EditorPacientes', IEditorPacientes, AEditor);
  if Assigned(AEditor) then
     with AEditor do
     begin
        Contactos := AContactos;
        Controller := Self;
        MultiSelect := True;
        ShowEmbedded;
     end;
end;

end.
