unit uEditorDetalleReservas;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  uCustomEditor, ImgList, PngImageList, StdActns, ActnList, TB2ExtItems, TBXExtItems, TBX, TB2Item,
  TB2Dock, TB2Toolbar, JvExControls, JvComponent, JvNavigationPane,
  uViewDetalleReservas, Menus, DB, uDADataTable, ComCtrls, uViewGrid,
  uDAScriptingProvider, uDACDSDataTable, JvAppStorage,
  JvAppRegistryStorage, JvFormPlacement, pngimage, ExtCtrls, uCustomView,
  uViewBase, uViewBarraSeleccion, JvComponentBase, uEditorGridBase,
  uIEditorDetalleReservas, uBizInventario, uViewGridBase,
  JvExComCtrls, JvStatusBar, uViewGrid2Niveles, JSDialog, uDAInterfaces,
  uInventarioController, uEditorInventario;

type

  TfEditorDetalleReservas = class(TfEditorGridBase, IEditorDetalleReservas)
    TBXSeparatorItem17: TTBXSeparatorItem;
    frViewDetalleReservas1: TfrViewDetalleReservas;
    actCancelarReserva: TAction;
    actTrasladarReservados: TAction;
    TBXItem38: TTBXItem;
    TBXItem39: TTBXItem;

    procedure FormShow(Sender: TObject);
    procedure actCancelarReservaExecute(Sender: TObject);
    procedure actTrasladarReservadosExecute(Sender: TObject);

  private
    function Seleccionar(Descripcion: String; TipoSeleccion: TEnumSeleccion): Variant;
    function DarIDAlmacenSeleccionado(Descripcion: String): Integer;
    function DarIDObraSeleccionada(Descripcion: String): Integer;
    function GetIdAlmacenObra: Integer;
    procedure SetIdAlmacenObra(const Value: Integer);

  protected
    FTipoReservas: String;
    FIdAlmacenObra: Integer;
    FArticulo: IBizInventario;
    FDetalleReservas: IBizDetalleReservas;
    FController : IInventarioController;

    function GetArticulo: IBizInventario;
    procedure SetArticulo(const Value: IBizInventario);
    function GetDetalleReservas: IBizDetalleReservas;
    procedure SetDetalleReservas(const Value: IBizDetalleReservas);
    function GetTipoReservas: String;
    procedure SetTipoReservas(const Value: String);
    function GetController : IInventarioController; virtual;
    procedure SetController (const Value : IInventarioController); virtual;

{    procedure SetMultiSelect (AValue : Boolean);
    function GetMultiSelect : Boolean;
    function GetArticulosSeleccionados: IBizDetalleReservas;
}
    procedure ImprimirInterno; override;
    procedure PrevisualizarInterno; override;

  public
    property Articulo: IBizInventario read GetArticulo write SetArticulo;
    property DetalleReservas: IBizDetalleReservas read GetDetalleReservas write SetDetalleReservas;
    property Controller : IInventarioController read GetController write SetController;
    property TipoReservas: String read GetTipoReservas write SetTipoReservas;
    property IdAlmacenObra: Integer read GetIdAlmacenObra write SetIdAlmacenObra;
//    property ArticulosSeleccionados: IBizDetalleReservas read GetArticulosSeleccionados;
//    property MultiSelect : Boolean read GetMultiSelect write SetMultiSelect;

    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure PonerTitulos(const ATitulo: string = ''); override;
  end;

implementation
{$R *.DFM}

uses
  cxControls, Variants, uGridStatusUtils, uDataModuleInventario, uDataModuleUsuarios,
  uEditorBase, uDBSelectionListUtils, cxGridDBTableView, cxGridCustomTableView,
  uAlmacenesController, uBizAlmacenes, uFactuGES_App, uDialogUtils,
  uEditorElegirAlmacenObraOperacion,
  schInventarioClient_Intf;

{, uDBSelectionList, uDataModulePedidosProveedor,
uBizPedidosProveedor, uBizMontajes, uDataModuleMontajes;
}


{ TfEditorDetalleReservas }

{
***************************** TfEditorDetalleReservas *****************************
}
procedure TfEditorDetalleReservas.actCancelarReservaExecute(Sender: TObject);
var
  ReservasSeleccionadas: IBizDetalleReservas;

begin
  inherited;
  try
    SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (DetalleReservas as ISeleccionable).SelectedRecords);
    // En SelectedRecords tengo los ID de las filas seleccionadas del grid
    ReservasSeleccionadas := (Controller as IInventarioController).ExtraerSeleccionados(DetalleReservas) as IBizDetalleReservas;

    if (ReservasSeleccionadas.DataTable.RecordCount > 0) then
    begin
      FController.CancelarReservas(ReservasSeleccionadas);
      RefrescarInterno;
    end
    else
      ShowWarningMessage('Debe seleccionar las reservas que desea cancelar');

  finally
    ReservasSeleccionadas:= Nil;
  end;
end;

procedure TfEditorDetalleReservas.actTrasladarReservadosExecute(Sender: TObject);
var
  ReservasSeleccionadas: IBizDetalleReservas;

begin
  inherited;
  try
    SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (DetalleReservas as ISeleccionable).SelectedRecords);
    // En SelectedRecords tengo los ID de las filas seleccionadas del grid
    ReservasSeleccionadas := (Controller as IInventarioController).ExtraerSeleccionados(DetalleReservas) as IBizDetalleReservas;

    if (ReservasSeleccionadas.DataTable.RecordCount > 0) then
    begin
      FController.TrasladarReservas(ReservasSeleccionadas);
      RefrescarInterno;
    end
    else
      ShowWarningMessage('Debe seleccionar las reservas que desea trasladar');

  finally
    ReservasSeleccionadas:= Nil;
  end;
end;

constructor TfEditorDetalleReservas.Create(AOwner: TComponent);
begin
  inherited;
  ViewGrid := frViewDetalleReservas1;
end;

function TfEditorDetalleReservas.DarIDAlmacenSeleccionado(Descripcion: String): Integer;
var
  IDAlmacen: Variant;
begin
  IDAlmacen := (ViewGrid as IViewDetalleReservas).DarIDAlmacenObraSeleccionada;
  if not VarIsNull(IDAlmacen) then
    Result := IDAlmacen
  else
    Result := Seleccionar(Descripcion, tAlmacen)
end;

function TfEditorDetalleReservas.DarIDObraSeleccionada(Descripcion: String): Integer;
var
  IDObra: Variant;
begin
  IDObra := (ViewGrid as IViewDetalleReservas).DarIDAlmacenObraSeleccionada;
  if not VarIsNull(IDObra) then
    Result := IDObra
  else
    Result := Seleccionar(Descripcion, TObra)
end;

destructor TfEditorDetalleReservas.Destroy;
begin
  FDetalleReservas := NIL;
  inherited;
end;

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

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

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

  DetalleReservas.DataTable.Active := True;
  ViewGrid.GotoFirst;
end;
{
function TfEditorDetalleReservas.GetArticulosSeleccionados: IBizDetalleReservas;
begin
  SeleccionarFilasDesdeGrid((ViewGrid as IViewDetalleReservas)._FocusedView, (DetalleReservas as ISeleccionable).SelectedRecords);
  // En Presupuestos.SelectedRecords tengo los ID de las filas seleccionadas del grid
  Result := Controller.ExtraerSeleccionados(DetalleReservas);
end;

function TfEditorDetalleReservas.GetController: IDetalleReservasController;
begin
  Result := FController;
end;
}
function TfEditorDetalleReservas.GetArticulo: IBizInventario;
begin
  Result := FArticulo;
end;

function TfEditorDetalleReservas.GetController: IInventarioController;
begin
  Result := FController;
end;

function TfEditorDetalleReservas.GetDetalleReservas: IBizDetalleReservas;
begin
  Result := FDetalleReservas;
end;
function TfEditorDetalleReservas.GetIdAlmacenObra: Integer;
begin
  Result := FIdAlmacenObra;
end;

function TfEditorDetalleReservas.GetTipoReservas: String;
begin
  Result := FTipoReservas;
end;

{
function TfEditorDetalleReservas.GetMultiSelect: Boolean;
begin
  Result := ViewGrid.MultiSelect;
end;
}
procedure TfEditorDetalleReservas.ImprimirInterno;
begin
  inherited;
end;

procedure TfEditorDetalleReservas.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := 'Detalle de reservas en almacen/obra - ' + frViewDetalleReservas1.cxListaAlmacenesObras.Text;  //AppFactuGES.EmpresaActiva.NOMBRE;
  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorDetalleReservas.PrevisualizarInterno;
begin
  inherited;
end;

{function TfEditorDetalleReservas.SeleccionarAlmacen(Descripcion: String): Integer;
var
  AAlmacenes : IBizAlmacen;
  Respuesta : integer;
begin
  Result := -1;
{
  JsElegirAlmacenDialog.Instruction.Text := Descripcion;
  with JsElegirAlmacenDialog.RadioButtons do
  begin
    Clear;
    AAlmacenes := (ViewGrid as IViewDetalleReservas).Almacenes;
    AAlmacenes.First;
    while not AAlmacenes.EOF do
    begin
      with Add do
      begin
        Caption := AAlmacenes.NOMBRE;
        Value := 1000 + AAlmacenes.ID;
      end;
        //Asi sabemos que solo va a intentar chequear el primero si hemos añadido al menos un item
      Items[0].Checked := True;
      AAlmacenes.Next;
    end;
  end;

  //Sacar la pantalla de selección y devolver el almacén seleccionado.
  Respuesta := JsElegirAlmacenDialog.Execute;
  if Respuesta <> IDCANCEL then
     Result := JsElegirAlmacenDialog.RadioResult - 1000;
end;
{
procedure TfEditorDetalleReservas.SetController(const Value: IDetalleReservasController);
begin
  FController := Value;

  if Assigned(FController) then
  begin
    if Assigned(ViewGrid) then
      (ViewGrid as IViewDetalleReservas).Almacenes := FController.AlmacenesController.BuscarTodos;
  end;
end;
}
function TfEditorDetalleReservas.Seleccionar(Descripcion: String; TipoSeleccion: TEnumSeleccion): Variant;
var
  ALista : TStringList;
  AListaAux : TStringList;
  Respuesta : Variant;
  i: Integer;

begin
  Result := Null;

  with TfEditorElegirAlmacenObraOperacion.Create(NIL) do
  try
    case TipoSeleccion of
      tAlmacen:     begin
                      Caption := Descripcion;
                      eDescripcion.Caption := 'Elija sobre qué almacén desea realizar la operación.';
                      eEtiqueta.Caption := 'Almacén:';
                      ALista := Controller.AlmacenesController.DarListaAlmacenes;
                    end;
      tObra:        begin
                      Caption := Descripcion;
                      eDescripcion.Caption := 'Elija sobre qué obra desea realizar la operación.';
                      eEtiqueta.Caption := 'Obra:';
                      ALista := Controller.ObrasController.DarListaObras;
                    end;
      tAlmacenObra: begin
                      Caption := Descripcion;      
                      eDescripcion.Caption := 'Elija sobre qué almacén u obra desea realizar la operación.';
                      eEtiqueta.Caption := 'Almacén/Obra:';
                      ALista := Controller.AlmacenesController.DarListaAlmacenes;
                      AListaAux := Controller.ObrasController.DarListaObras;

                      for i := 0 to AListaAux.Count - 1 do
                          ALista.Add(Format('%s=%s', [AListaAux.Names[i], AListaAux.Values[AListaAux.Names[i]]]));
                    end;
    end;

    with cxListaAlmacenesObras.Properties.Items do
    begin
      BeginUpdate;
      try
        Clear;
        for i := 0 to ALista.Count - 1 do
          Add(ALista.Names[i]);
      finally
        EndUpdate;
      end;
    end;

    if (ShowModal = mrOk) then
       Result := ALista.Values[cxListaAlmacenesObras.EditValue];

  finally
    Free;
  end;
end;

procedure TfEditorDetalleReservas.SetArticulo(const Value: IBizInventario);
begin
  FArticulo := Value;
  if Assigned(FArticulo)
  and (FArticulo.RESERVA > 0) then
  begin
    tbxEditFiltro.Text := FArticulo.REFERENCIA;
  end;
end;

procedure TfEditorDetalleReservas.SetController(const Value: IInventarioController);
begin
  FController := Value;
end;

procedure TfEditorDetalleReservas.SetDetalleReservas(const Value: IBizDetalleReservas);
begin
  FDetalleReservas := Value;
  dsDataTable.DataTable := FDetalleReservas.DataTable;

  if Assigned(ViewGrid) then
    (ViewGrid as IViewDetalleReservas).DetalleReservas := FDetalleReservas;
end;
procedure TfEditorDetalleReservas.SetIdAlmacenObra(const Value: Integer);
begin
  FIdAlmacenObra := Value;
  if assigned (ViewGrid) then
    (ViewGrid as IViewDetalleReservas).IdAlmacenObra := IdAlmacenObra;  
end;

procedure TfEditorDetalleReservas.SetTipoReservas(const Value: String);
begin
  FTipoReservas := Value;

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

  if (FTipoReservas = CTE_INV_ALMACEN) then
  begin
    if Assigned(ViewGrid) then
       (ViewGrid as IViewDetalleReservas).Almacenes := FController.AlmacenesController.DarListaAlmacenes;
  end
  else if (FTipoReservas = CTE_INV_OBRA) then
  begin
    if Assigned(ViewGrid) then
       (ViewGrid as IViewDetalleReservas).Obras := FController.ObrasController.DarListaObras;
  end;
end;

{
procedure TfEditorDetalleReservas.SetMultiSelect(AValue: Boolean);
begin
  ViewGrid.MultiSelect := AValue;
end;
}
end.

