unit uViewDetallesMedicacion;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter,
  cxData, cxDataStorage, cxEdit, DB, cxDBData, ImgList, PngImageList,
  uDADataTable, ActnList, ComCtrls, ToolWin, cxGridLevel, cxClasses, cxControls,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGrid, cxImageComboBox, cxTextEdit, cxMaskEdit, cxCheckBox, cxCurrencyEdit,
  Grids, DBGrids, StdCtrls, ExtCtrls, cxRichEdit, ExtActns, StdActns,
  JvExStdCtrls, JvCombobox, JvColorCombo, TB2Item, TBX, TB2Dock, TB2Toolbar,
  uArticulosController, uBizMedicaciones, cxDropDownEdit,
  cxCalendar, cxDBEdit, dxLayoutControl, cxContainer, cxLookupEdit,
  cxDBLookupEdit, cxDBLookupComboBox, uDAInterfaces, cxButtonEdit,
  uViewDetallesArticulos, Menus, cxGridCustomPopupMenu, cxGridPopupMenu, 
  cxEditRepositoryItems;

type
  IViewDetallesMedicacion = interface(IViewDetallesArticulos)
  ['{E880166F-89E8-4D0D-96FA-FF3770F6DCDB}']
    function GetMedicacion: IBizMedicacion;
    procedure SetMedicacion(const Value: IBizMedicacion);
    property Medicacion: IBizMedicacion read GetMedicacion write SetMedicacion;
  end;

  TfrViewDetallesMedicacion = class(TfrViewDetallesArticulos, IViewDetallesMedicacion)
    N2: TMenuItem;
    Aadirartculos1: TMenuItem;
    TBXItem18: TTBXItem;
    cxGridViewPOSOLOGIA: TcxGridDBColumn;
    cxGridViewFORMA_COLOR: TcxGridDBColumn;
    cxGridViewLOTE: TcxGridDBColumn;

    procedure CustomViewCreate(Sender: TObject);
    procedure CustomViewDestroy(Sender: TObject);
    procedure OnValidateReferencia(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure actAnadirExecute(Sender: TObject);
  protected
    FMedicacion: IBizMedicacion;
    function GetMedicacion: IBizMedicacion;
    procedure SetMedicacion(const Value: IBizMedicacion);

    procedure AnadirArticulosInterno; override;
    procedure RellenarArticulosInterno; override;
    function AnadirArticulo(pReferencia: String): Boolean;

  public
    property Medicacion: IBizMedicacion read GetMedicacion write SetMedicacion;
  end;

implementation
{$R *.dfm}

uses
  uDetallesMedicacionController, uViewDetallesBase;

{ TfrViewDetallesMedicacion }

procedure TfrViewDetallesMedicacion.actAnadirExecute(Sender: TObject);
var
  bEsMultiSelect : Boolean;
begin
  // inherited; <-- No llamar a la herencia

  // Debo quitar el multiselect porque provoca que se quede seleccionado
  // el registro actual y no el nuevo registro que voy a añadir
  bEsMultiSelect := cxGridView.OptionsSelection.MultiSelect;
  if bEsMultiSelect then
    _FocusedView.OptionsSelection.MultiSelect := False;

  ShowHourglassCursor;
  _FocusedView.BeginUpdate;
  try
    if _FocusedView.Controller.EditingController.IsEditing then
       _FocusedView.Controller.EditingController.Edit.PostEditValue;

    if Assigned(Controller) and Assigned(Detalles) then
      Controller.Add(Detalles, TIPO_DETALLE_ENBLISTER);
  finally
    _FocusedView.EndUpdate;
    HideHourglassCursor;

    // Dejo la propiedad MultiSelect como estaba
    if bEsMultiSelect then
       _FocusedView.OptionsSelection.MultiSelect := bEsMultiSelect;
  end;
end;

function TfrViewDetallesMedicacion.AnadirArticulo(pReferencia: String): Boolean;
begin
  Result := (Controller as IDetallesMedicacionController).AnadirArticulo(Detalles, pReferencia);
end;

procedure TfrViewDetallesMedicacion.AnadirArticulosInterno;
begin
  (Controller as IDetallesMedicacionController).AnadirArticulos(Detalles);
end;

procedure TfrViewDetallesMedicacion.CustomViewCreate(Sender: TObject);
begin
  inherited;
  cxGridViewREFERENCIA.Properties.OnValidate := OnValidateReferencia;
  cxGridViewIMPORTEUNIDAD.DataBinding.FieldName := '';
  cxGridViewIMPORTETOTAL.DataBinding.FieldName := '';
end;

procedure TfrViewDetallesMedicacion.CustomViewDestroy(Sender: TObject);
begin
  inherited;
  cxGridViewREFERENCIA.Properties.OnValidate := Nil;
end;

procedure TfrViewDetallesMedicacion.OnValidateReferencia(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
var
  lsReferencia : String;
begin
  //En el caso de cadena vacia no validamos
  if (VarIsNull(DisplayValue)) then
     Exit;

  lsReferencia := VarToStr(DisplayValue);
  if (length(trim(lsReferencia)) = 0) then
     Exit;

  if not AnadirArticulo(lsReferencia) then
  begin
    ErrorText := 'La referencia introducida no exite en el catálogo de Farmatik';
    Error := True;
  end;
end;

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

procedure TfrViewDetallesMedicacion.RellenarArticulosInterno;
begin
  (Controller as IDetallesMedicacionController).AnadirArticulos(Detalles, False);
end;

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

end.
