unit uEditorMedicacion;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  uEditorDBItem, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TBX, TB2Item, TB2Dock,
  TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane,
  uCustomView, uViewBase, JvComponentBase,
  StdCtrls, pngimage, AppEvnts, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, cxDBEdit,
  uViewIncidencias, uMedicacionesController, uViewDetallesBase, uViewDetallesMedicacion,
  dxLayoutLookAndFeels, JvExComCtrls, JvStatusBar, uViewTotales,
  uIEditorMedicacion, uBizMedicaciones, uViewMedicacion,
  uViewDetallesDTO, uViewDetallesArticulos, uDAInterfaces, cxLabel;

type
  TfEditorMedicacion = class(TfEditorDBItem, IEditorMedicacion)
    dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList;
    dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel;
    frViewDetallesMedicacion1: TfrViewDetallesMedicacion;
    actEnviarEMail: TAction;
    TBXSubmenuItem2: TTBXSubmenuItem;
    TBXItem7: TTBXItem;
    TBXItem33: TTBXItem;
    TBXSeparatorItem6: TTBXSeparatorItem;
    frViewMedicacion1: TfrViewMedicacion;

    procedure FormShow(Sender: TObject); 
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
  protected
    FMedicacion: IBizMedicacion;
    FViewMedicacion: IViewMedicacion;
    FController : IMedicacionesController;

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

    function GetMedicacion: IBizMedicacion;
    procedure SetMedicacion(const Value: IBizMedicacion); virtual;

    function GetViewMedicacion: IViewMedicacion;
    procedure SetViewMedicacion(const Value: IViewMedicacion);

    procedure PrevisualizarInterno; override;
    procedure ImprimirInterno; override;
    procedure GuardarInterno; override;
    procedure EliminarInterno; override;

    property ViewMedicacion: IViewMedicacion read GetViewMedicacion write SetViewMedicacion;

    procedure OnPacienteChanged(Sender : TObject);

    //Si queremos crear otra vista para el editor heredado solo tendriamos que
    //sobreescribir este metodo
    procedure AsignarVista; virtual;
    function PuedoImprimir: Boolean; override;        

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

implementation

uses
  uDataModuleUsuarios, uPacientesController,
  uBizDireccionesContacto, schMedicacionClient_Intf, uDialogUtils,
  uEditorDBBase, uDataTableUtils, uFactuGES_App;

{$R *.dfm}

{ TfEditorMedicacion }

{
**************************** TfEditorMedicacion ****************************
}
procedure TfEditorMedicacion.AsignarVista;
var
  AViewMedicacion: TfrViewMedicacion;
begin
  AViewMedicacion := frViewMedicacion1;
  with AViewMedicacion do
  begin
    dxLayoutControl1.LookAndFeel := dxLayoutOfficeLookAndFeel1;
  end;
  ViewMedicacion := AViewMedicacion;
end;

constructor TfEditorMedicacion.Create(AOwner: TComponent);
begin
  inherited;
  pgPaginas.ActivePageIndex := 0;

  AsignarVista;
end;

procedure TfEditorMedicacion.CustomEditorClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  FViewMedicacion := NIL;
  FMedicacion := NIL;
end;

destructor TfEditorMedicacion.Destroy;
begin
  // Utilizar mejor OnClose;
  inherited;
end;

function TfEditorMedicacion.PuedoImprimir: Boolean;
begin
  Result := inherited PuedoImprimir and (not Medicacion.Paciente.IDIsNull);
end;

procedure TfEditorMedicacion.EliminarInterno;
begin
  if (ShowConfirmMessage('¿Desea borrar esta medicación de paciente?', '') = IDYES) then
  begin
    FController.Eliminar(FMedicacion);
    inherited
  end
end;

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

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

  if not Assigned(Medicacion) then
    raise Exception.Create('No hay ningún Medicacion asignado');

  Medicacion.DataTable.Active := True;
  pgPaginas.ActivePage := pagGeneral;
end;

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

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

function TfEditorMedicacion.GetViewMedicacion: IViewMedicacion;
begin
  Result := FViewMedicacion;
end;

procedure TfEditorMedicacion.GuardarInterno;
var
  bEsNuevo : Boolean;
begin
  inherited;

  ShowHourglassCursor;
//  frViewDetallesPedidoCliente1.SaveGridStatus;
  frViewDetallesMedicacion1.BeginUpdate;
  try
    bEsNuevo := FMedicacion.EsNuevo;
    FController.Guardar(FMedicacion);
  finally
    frViewDetallesMedicacion1.EndUpdate;
//    frViewDetallesPedidoCliente1.RestoreGridStatus;
    HideHourglassCursor;
  end;
  if bEsNuevo then
    ShowInfoMessage('Esta medicación se ha dado de alta con la referencia ' + FMedicacion.REFERENCIA);
  Modified := False;
end;

procedure TfEditorMedicacion.ImprimirInterno;
begin
  inherited;
  FController.Print(FMedicacion);
end;

procedure TfEditorMedicacion.OnPacienteChanged(Sender: TObject);
begin
  if Assigned(FMedicacion) then
    FMedicacion.Paciente := ViewMedicacion.ViewPacienteMedicacion.Paciente;
end;

procedure TfEditorMedicacion.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := ATitulo;
  if (FTitulo = '') and Assigned(FMedicacion) then
  begin
    if FMedicacion.EsNuevo then
      FTitulo := 'Nueva medicación de paciente'
    else
      FTitulo := 'Medicación de paciente'  + ' - ' + FMedicacion.Paciente.Nombre; 
  end;

  inherited PonerTitulos(FTitulo);

  FTitulo := FTitulo + ' (' + AppFactuGES.EmpresaActiva.NOMBRE + ')';
  Self.Caption := FTitulo;
end;

procedure TfEditorMedicacion.PrevisualizarInterno;
begin
  inherited;
  FController.Preview(FMedicacion);
end;

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

  if Assigned(FController) then
    frViewDetallesMedicacion1.Controller := Controller.DetallesController;
end;

procedure TfEditorMedicacion.SetMedicacion(const Value: IBizMedicacion);
begin
  FMedicacion := Value;

  if Assigned(FMedicacion) then
  begin
    dsDataTable.DataTable := FMedicacion.DataTable;
    if Assigned(FViewMedicacion) then
    begin
      ViewMedicacion.ViewPacienteMedicacion.OnPacienteChanged := NIL;
      try
        FViewMedicacion.Medicacion := FMedicacion;
        frViewDetallesMedicacion1.Detalles := FMedicacion.Detalles;
        frViewDetallesMedicacion1.Medicacion := FMedicacion; //Para poder sacar los descuento del articulos segun el cliente seleccionado
      finally
        ViewMedicacion.ViewPacienteMedicacion.OnPacienteChanged := OnPacienteChanged;
      end;
    end;
  end
  else begin
    dsDataTable.DataTable := NIL;

    if Assigned(FViewMedicacion) then
    begin
      FViewMedicacion.Medicacion := NIL;
      ViewMedicacion.ViewPacienteMedicacion.OnPacienteChanged := NIL;
      frViewDetallesMedicacion1.Detalles := NIL;
      frViewDetallesMedicacion1.Medicacion := NIL;
    end;
  end;
end;

procedure TfEditorMedicacion.SetViewMedicacion(const Value: IViewMedicacion);
begin
  FViewMedicacion := Value;

  if Assigned(FViewMedicacion) and Assigned(Medicacion) then
    FViewMedicacion.Medicacion := Medicacion;
end;

end.
