unit uEditorEntradaSalidaArticulos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorDBItem, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TBX, TB2Item, TB2Dock,
  TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane, uCustomView,
  uViewBase, uEditorItem, pngimage, uViewGridBase,
  uViewGrid, JvComponentBase, uBizInventario, uViewEntradaSalidaArticulos,
  uIEditorEntradaSalidaArticulos, uInventarioController, JvExComCtrls,
  JvStatusBar, Grids, DBGrids, cxLabel, cxControls, cxContainer, cxEdit,
  cxTextEdit, cxMaskEdit, cxDropDownEdit, cxCalendar, cxMemo, ToolWin,
  dxLayoutControl, cxStyles, StdCtrls, Buttons, TBXDkPanels, uBizPedidosProveedor;

type
  TfEditorEntradaSalidaArticulos = class(TfEditorDBItem, IEditorEntradaSalidaArticulos)
    frViewListaArticulos: TfrViewEntradaSalidaArticulos;
    actAnadirInventario: TAction;
    actEliminarInventario: TAction;
    actAnchoAuto: TAction;
    TBXItem7: TTBXItem;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton6: TToolButton;
    ToolButton7: TToolButton;
    TBXItem33: TTBXItem;
    pnlMovimiento: TTBXDockablePanel;
    Label1: TLabel;
    eFechaMovimiento: TcxDateEdit;
    eCausa: TcxTextEdit;
    Label2: TLabel;
    pnlEntradaPedido: TTBXDockablePanel;
    Label3: TLabel;
    Label4: TLabel;
    TBXDockPaneles: TTBXDock;
    edtFechaPedido: TLabel;
    edtReferenciaPedido: TLabel;
    Label6: TLabel;
    edtSituacion: TLabel;
    Label7: TLabel;
    edtProveedor: TLabel;
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
    procedure actAnadirInventarioExecute(Sender: TObject);
    procedure actEliminarInventarioExecute(Sender: TObject);
    procedure actAnchoAutoExecute(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure actEliminarInventarioUpdate(Sender: TObject);
  private
    FTitulo: String;
    FHayCambios: Boolean;
    FResultadoModalOK: Boolean;
    FController : IInventarioController;
    FArticulos: IBizInventario;              //Los artículos de entrada o salida
    FInventario: IBizInventario;             //Para sacar el stock
    FPedidoProveedor: IBizPedidoProveedor;
    function GetArticulos: IBizInventario;
    procedure SetArticulos(const Value: IBizInventario);
    function GetInventario: IBizInventario;
    procedure SetInventario(const Value: IBizInventario);
    function GetPedidoProveedor: IBizPedidoProveedor;
    procedure SetPedidoProveedor(const Value: IBizPedidoProveedor);
    function GetController : IInventarioController;
    procedure SetController (const Value : IInventarioController);
    function getResultadoModalOK: Boolean;

  protected
    procedure GuardarInterno; override;
//    procedure CancelarCambiosInterno; override;
    function GetModified: Boolean; override;
  public
    property Controller : IInventarioController read GetController write SetController;
    property Articulos: IBizInventario read GetArticulos write SetArticulos;
    property Inventario: IBizInventario read GetInventario write SetInventario;
    property PedidoProveedor: IBizPedidoProveedor read GetPedidoProveedor write SetPedidoProveedor;
    property ResultadoModalOK: Boolean read getResultadoModalOK;
    constructor Create(AOwner: TComponent); override;
    procedure PonerTitulos(const ATitulo: string = ''); override;
  end;

implementation

uses uEditorBase, uBizAlmacenes, schAlmacenesClient_Intf;
{$R *.dfm}

//uses uEditorUtils;

{ TfEditorRecibirPedido }

function TfEditorEntradaSalidaArticulos.GetArticulos: IBizInventario;
begin
  Result := FArticulos;
end;

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

function TfEditorEntradaSalidaArticulos.GetInventario: IBizInventario;
begin
  Result := FInventario;
end;

function TfEditorEntradaSalidaArticulos.GetModified: Boolean;
begin
  Result := FHayCambios;
end;

function TfEditorEntradaSalidaArticulos.GetPedidoProveedor: IBizPedidoProveedor;
begin
  Result := FPedidoProveedor;
end;

function TfEditorEntradaSalidaArticulos.getResultadoModalOK: Boolean;
begin
  Result := FResultadoModalOK;
end;

procedure TfEditorEntradaSalidaArticulos.GuardarInterno;
begin
  inherited;

  //En este punto se realizará el applyupdates
  if FController.Guardar(FArticulos, eFechaMovimiento.Date, eCausa.Text) then
     FResultadoModalOK := True
  else
     FResultadoModalOK := False;

  FHayCambios:= False;
end;

procedure TfEditorEntradaSalidaArticulos.PonerTitulos(const ATitulo: string);
begin
  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorEntradaSalidaArticulos.SetArticulos(const Value: IBizInventario);
begin
  FArticulos := Value;

  if Assigned(FArticulos) then
    dsDataTable.DataTable := FArticulos.DataTable
  else
    dsDataTable.DataTable := NIL;

  frViewListaArticulos.dsDataSource.DataTable := dsDataTable.DataTable;

//  PonerEtiquetasEnEditor
end;

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

procedure TfEditorEntradaSalidaArticulos.SetInventario(const Value: IBizInventario);
begin
  FInventario := Value;
end;

procedure TfEditorEntradaSalidaArticulos.SetPedidoProveedor(const Value: IBizPedidoProveedor);
begin
  FPedidoProveedor := Value;
  if Assigned(FPedidoProveedor) then
  begin
     edtFechaPedido.Caption := DateToStr(FPedidoProveedor.FECHA_PEDIDO);
     edtReferenciaPedido.Caption := FPedidoProveedor.REFERENCIA;
     edtSituacion.Caption := FPedidoProveedor.SITUACION;
     edtProveedor.Caption := FPedidoProveedor.NOMBRE;
     pnlEntradaPedido.Visible := True
  end
  else
     pnlEntradaPedido.Visible := False;
end;

procedure TfEditorEntradaSalidaArticulos.actAnadirInventarioExecute(Sender: TObject);
begin
  //Todos los cambios serán en caché hasta que el usuario decida guardar
  FController.Anadir(Articulos, Inventario);
  actAnchoAuto.Execute;
  FHayCambios:= True;
end;

procedure TfEditorEntradaSalidaArticulos.CustomEditorClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  FController := Nil;
  FArticulos:= Nil;
  FInventario:= Nil;
  FPedidoProveedor:= Nil;
end;

procedure TfEditorEntradaSalidaArticulos.FormShow(Sender: TObject);
var
  AAlmacenOrigen: IBizAlmacen;
  AAlmacenDestino: IBizAlmacen;
begin
  inherited;

  FTitulo := '';
  if Assigned(FArticulos) then
  begin
    //Titulos
    try
      AAlmacenOrigen := Controller.AlmacenesController.Buscar(FArticulos.IDAlmacenOrigen);
      AAlmacenDestino:= Controller.AlmacenesController.Buscar(FArticulos.IDAlmacenDestino);
      AAlmacenOrigen.DataTable.Active := True;
      AAlmacenDestino.DataTable.Active := True;

      case FArticulos.TipoMovimiento of
         tEntradaLibre :
         begin
            FTitulo := 'Entrada de artículos en el almacén "' + AAlmacenDestino.NOMBRE + '"';
            actGuardarCerrar.Caption := 'Realizar la entrada de los artículos';
         end;
         tEntradaPedidoProveedor :
         begin
            FTitulo := 'Entrada por pedido de artículos, en el almacén "' + AAlmacenDestino.NOMBRE + '"';
            actGuardarCerrar.Caption := 'Realizar la entrada de los artículos';
         end;
         tSalidaLibre, tSalidaAlbaranCliente :
         begin
            FTitulo := 'Salida de artículos en el almacén "' + AAlmacenOrigen.NOMBRE + '"';
            actGuardarCerrar.Caption := 'Realizar la salida de los artículos';
         end;
         tTraslado:
         begin
            FTitulo := 'Traslado de artículos desde el almacén "' + AAlmacenOrigen.NOMBRE + '" hasta el almacén "' + AAlmacenDestino.NOMBRE + '"';
            actGuardarCerrar.Caption := 'Realizar el traslado de los artículos';
         end;
      end;
    finally
      AAlmacenOrigen := Nil;
      AAlmacenDestino:= Nil;
    end;

    //Botones de añadir y eliminar
    case FArticulos.TipoMovimiento of
       tEntradaLibre, tSalidaLibre, tTraslado :
       begin
          pnlMovimiento.Visible := True;
          eFechaMovimiento.Date := Date;
          actAnadirInventario.Enabled := True;
          actAnadirInventario.Visible := True;
          actEliminarInventario.Enabled := True;
          actEliminarInventario.Visible := True;
          frViewListaArticulos.cxGridViewCANTIDAD.Properties.ReadOnly := False;
       end;
       tEntradaPedidoProveedor, tSalidaAlbaranCliente :
       begin
          if (FArticulos.TipoMovimiento = tEntradaPedidoProveedor) then
             ToolBar1.Visible := False;

          actAnadirInventario.Enabled := False;
          actAnadirInventario.Visible := False;
          actEliminarInventario.Enabled := False;
          actEliminarInventario.Visible := False;
          if (FArticulos.TipoMovimiento = tSalidaAlbaranCliente) then
            frViewListaArticulos.cxGridViewCANTIDAD.Properties.ReadOnly := True
          else
            frViewListaArticulos.cxGridViewCANTIDAD.Properties.ReadOnly := False;
       end;
    end;

  end;
end;

procedure TfEditorEntradaSalidaArticulos.actAnchoAutoExecute(Sender: TObject);
begin
  frViewListaArticulos.cxGridView.ApplyBestFit;
end;

procedure TfEditorEntradaSalidaArticulos.actEliminarInventarioExecute(Sender: TObject);
begin
  //Todos los cambios serán en caché hasta que el usuario decida guardar
  Controller.Eliminar(Articulos, false, false);
  FHayCambios:= True;
end;

procedure TfEditorEntradaSalidaArticulos.actEliminarInventarioUpdate(
  Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayDatos;
end;

constructor TfEditorEntradaSalidaArticulos.Create(AOwner: TComponent);
begin
  inherited;
  FTitulo := '';
  FHayCambios:= False;
  FResultadoModalOK := False;
end;

end.
