unit uEditorMedicaciones;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TB2ExtItems, TBXExtItems,
  TBX, TB2Item, TB2Dock, TB2Toolbar, ExtCtrls, JvExControls,
  JvNavigationPane, uViewGrid, pngimage, JvComponentBase,
  uEditorGridBase,
  uBizMedicaciones, uIEditorMedicaciones, uMedicacionesController,
  uCustomView, uViewBase, uViewBarraSeleccion, uViewGridBase,
  uViewMedicaciones, JvExComCtrls, JvStatusBar, JSDialog, uDAInterfaces;

type
  TfEditorMedicaciones = class(TfEditorGridBase, IEditorMedicaciones)
    N4: TMenuItem;
    TBXSeparatorItem17: TTBXSeparatorItem;
    JsImprimirDialog: TJSDialog;
    JsPrevisualizarDialog: TJSDialog;
    actGenerarEtiquetas: TAction;
    JsListaMedicacionesNoEliminados: TJSDialog;
    TBXSubmenuItem2: TTBXSubmenuItem;
    procedure FormShow(Sender: TObject);
    procedure actEliminarUpdate(Sender: TObject);
    procedure actGenerarEtiquetasExecute(Sender: TObject);
    procedure actGenerarEtiquetasUpdate(Sender: TObject);

  protected
    FMedicaciones: IBizMedicacion;
    FController : IMedicacionesController;

    function GetMedicaciones: IBizMedicacion;
    procedure SetMedicaciones(const Value: IBizMedicacion);

    function GetController : IMedicacionesController; virtual;
    procedure SetController (const Value : IMedicacionesController); virtual;

    procedure ModificarInterno; override;
    procedure EliminarInterno; override;
    procedure DuplicarInterno; override;
    procedure ImprimirInterno; override;
    procedure PrevisualizarInterno; override;
    procedure RefrescarInterno; override;
    procedure NuevoInterno; override;

    //Si queremos crear otra vista para el editor heredado solo tendriamos que
    //sobreescribir este método
    procedure AsignarVista; virtual;

  public
    procedure PonerTitulos(const ATitulo: string = ''); override;
    property Medicaciones: IBizMedicacion read GetMedicaciones write SetMedicaciones;
    property Controller : IMedicacionesController read GetController write SetController;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  uDataModuleMedicaciones, uDataModuleUsuarios, uFactuGES_App,
  uDialogUtils, schMedicacionClient_Intf,
  uEditorBase,
  cxCustomData, uGridStatusUtils, uDBSelectionListUtils;

{$R *.dfm}

{
*************************** TfEditorMedicaciones ***************************
}
procedure TfEditorMedicaciones.actEliminarUpdate(Sender: TObject);
begin
  inherited;
  //
end;

procedure TfEditorMedicaciones.actGenerarEtiquetasExecute(Sender: TObject);
begin
{
  inherited;
  //Miramos si viene de un pedido previo, si no es asi le preguntamos si desea imprimir la referencia del cliente
  if (FMedicaciones.ID_PEDIDO > 0) then
     FController.EtiquetasPreview(FMedicaciones, True)
  else
  begin
     if (Application.MessageBox('¿El albarán seleccionado no está asociado a un pedido por internet, ¿desea imprimir la referencia del cliente para las etiquetas de este albarán?', 'Atención', MB_YESNO) = IDYES) then
        FController.EtiquetasPreview(FMedicaciones, True)
     else
        FController.EtiquetasPreview(FMedicaciones, False);
  end;
}
end;

procedure TfEditorMedicaciones.actGenerarEtiquetasUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayDatos
                                 and not (ViewGrid.NumSeleccionados > 1)
                                 and ViewGrid.esSeleccionCeldaDatos;
end;

procedure TfEditorMedicaciones.AsignarVista;
begin
  ViewGrid := CreateView(TfrViewMedicaciones) as IViewMedicaciones;
end;

constructor TfEditorMedicaciones.Create(AOwner: TComponent);
begin
  inherited;
  
  FHeaderText := 'Lista de medicaciones de pacientes';
  FWindowCaption := FHeaderText;
  
  AsignarVista;
end;

destructor TfEditorMedicaciones.Destroy;
begin
  FMedicaciones := NIL;
  FController := NIL;  
  inherited;
end;

procedure TfEditorMedicaciones.DuplicarInterno;
var
  APedido : IBizMedicacion;
begin
  inherited;
  APedido := FController.Duplicar(Medicaciones);
  try
    FController.Ver(APedido);
  finally
    actRefrescar.Execute;
  end;
end;

procedure TfEditorMedicaciones.EliminarInterno;
var
  AMedicaciones: IBizMedicacion;
  AllItems: Boolean;
begin
  AMedicaciones := Nil;
  AllItems := False;

  if MultiSelect and Assigned(ViewGrid) then
     AllItems :=  (ViewGrid.NumSeleccionados > 1);

  if AllItems then
  begin
    if (Application.MessageBox('¿Desea borrar las medicaciones seleccionadas?', 'Atención', MB_YESNO) = IDYES) then
    begin
      SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Medicaciones as ISeleccionable).SelectedRecords);
      AMedicaciones := (Controller as IMedicacionesController).ExtraerSeleccionados(Medicaciones) as IBizMedicacion;
    end
  end
  else begin
    if (Application.MessageBox('¿Desea borrar la medicación seleccionada?', 'Atención', MB_YESNO) = IDYES) then
        AMedicaciones := Medicaciones;
  end;

  if Assigned(AMedicaciones) then
  begin
    FController.Eliminar(AMedicaciones, AllItems);
    if AllItems then
    begin
      if (AMedicaciones.DataTable.RecordCount > 0) then
      begin
        with  AMedicaciones.DataTable do
        begin
          First;
          while not EOF do
          begin
            JsListaMedicacionesNoEliminados.Content.Add('Ref. medicación: ' + AMedicaciones.REFERENCIA + '  ' + AMedicaciones.NOMBRE);
            Next;
          end;
        end;
        JsListaMedicacionesNoEliminados.Execute;
      end;
      actRefrescar.Execute;
    end;
  end;

  ViewGrid.GotoFirst;
end;

procedure TfEditorMedicaciones.FormShow(Sender: TObject);
begin
  inherited;

  if not Assigned(ViewGrid) then
    raise Exception.Create('No hay ninguna vista asignada');

  if not Assigned(Medicaciones) then
    raise Exception.Create('No hay ninguna medicacion asignada');

  Medicaciones.DataTable.Active := True;
  ViewGrid.GotoFirst;
end;

function TfEditorMedicaciones.GetController: IMedicacionesController;
begin
  Result := FController;
end;

function TfEditorMedicaciones.GetMedicaciones: IBizMedicacion;
begin
  Result := FMedicaciones;
end;

procedure TfEditorMedicaciones.ImprimirInterno;
var
  Respuesta : Integer;
  AMedicaciones: IBizMedicacion;
  AllItems: Boolean;

begin

  AMedicaciones := Nil;
  AllItems := False;

  if MultiSelect and Assigned(ViewGrid) then
     AllItems :=  (ViewGrid.NumSeleccionados > 1);

  //Si esta agrupado solo podré imprimir la lista de elementos visibles
  if not ViewGrid.esSeleccionCeldaDatos then
     inherited
  else
  begin
    Respuesta := JsImprimirDialog.Execute;
    if Respuesta <> IDCANCEL then
    begin
      case JsImprimirDialog.CustomButtonResult of
        200   : begin   // Lista de elementos visibles
                  inherited;
                end;
        100   : begin   // Elemento Seleccionado
                  if AllItems then
                  begin
                    SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Medicaciones as ISeleccionable).SelectedRecords);
                    AMedicaciones := (Controller as IMedicacionesController).ExtraerSeleccionados(Medicaciones) as IBizMedicacion;
                  end
                  else
                    AMedicaciones := Medicaciones;

                  if Assigned(AMedicaciones) then
                     FController.Print(AMedicaciones, AllItems);
                end;
      end;
    end;
  end; 
end;

procedure TfEditorMedicaciones.ModificarInterno;
begin
  inherited;
  FController.Ver(Medicaciones);
end;

procedure TfEditorMedicaciones.NuevoInterno;
begin
  inherited;
  FController.Anadir(Medicaciones);
  FController.Ver(Medicaciones);
end;

procedure TfEditorMedicaciones.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := FWindowCaption + ' - ' + AppFactuGES.EmpresaActiva.NOMBRE;
  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorMedicaciones.PrevisualizarInterno;
var
  Respuesta : Integer;
  AMedicaciones: IBizMedicacion;
  AllItems: Boolean;
begin
  AMedicaciones := Nil;
  AllItems := False;

  if MultiSelect and Assigned(ViewGrid) then
     AllItems :=  (ViewGrid.NumSeleccionados > 1);

  //Si esta agrupado solo podré imprimir la lista de elementos visibles
  if not ViewGrid.esSeleccionCeldaDatos then
     inherited
  else
  begin
    Respuesta := JsPrevisualizarDialog.Execute;
    if Respuesta <> IDCANCEL then
    begin
      case JsPrevisualizarDialog.CustomButtonResult of
        200   : begin   // Lista de elementos visibles
                  inherited;
                end;
        100   : begin   // Elemento Seleccionado
                  if AllItems then
                  begin
                    SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Medicaciones as ISeleccionable).SelectedRecords);
                    AMedicaciones := (Controller as IMedicacionesController).ExtraerSeleccionados(Medicaciones) as IBizMedicacion;
                  end
                  else
                    AMedicaciones := Medicaciones;

                  if Assigned(AMedicaciones) then
                     FController.Preview(AMedicaciones, AllItems);
                end;
      end;
    end;
  end;
end;

procedure TfEditorMedicaciones.RefrescarInterno;
begin
  inherited;
end;

procedure TfEditorMedicaciones.SetController(const Value: IMedicacionesController);
begin
  FController := Value;
end;

procedure TfEditorMedicaciones.SetMedicaciones(const Value: IBizMedicacion);
begin
  FMedicaciones := Value;

  if Assigned(FMedicaciones) then
  begin
    //Se guarda el where de la sentencia origen, por si el editor tiene filtros que
    //afecten a este where y en un futuro se desea volver al where origen (filtro de año))
    DynWhereDataTable := FMedicaciones.DataTable.DynamicWhere.Xml;

    dsDataTable.DataTable := FMedicaciones.DataTable;
    if Assigned(ViewGrid) then
      (ViewGrid as IViewMedicaciones).Medicaciones := Medicaciones;
  end;
end;

end.
