unit uEditorPedidoProveedor;

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,
  uViewPedidoProveedor, uCustomView, uViewBase, JvComponentBase,
  StdCtrls, pngimage, AppEvnts, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, cxDBEdit,
  uViewTotalPedido, uViewIncidencias,
  uBizPedidosProveedor, uIEditorPedidoProveedor, uPedidosProveedorController,
  uViewDetallesBase, uViewDetallesPedidoProveedor,
  uViewDocumentosAsociados, uBizDocumentosAsociados, dxLayoutLookAndFeels,
  JvExComCtrls, JvStatusBar;

type
  TfEditorPedidoProveedor = class(TfEditorDBItem, IEditorPedidoProveedor)
    pagContenido: TTabSheet;
    frViewTotalPedido: TfrViewTotalPedido;
    pagInicidencias: TTabSheet;
    frViewIncidencias: TfrViewIncidencias;
    frViewDetallesPedidoProveedor1: TfrViewDetallesPedidoProveedor;
    pagDocumentos: TTabSheet;
    frViewDocumentosAsociados1: TfrViewDocumentosAsociados;
    dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList;
    dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel;

    procedure FormShow(Sender: TObject); override;
    procedure actGuardarExecute(Sender: TObject);
    procedure actEliminarExecute(Sender: TObject);
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
    procedure actPrevisualizarExecute(Sender: TObject);
    procedure actImprimirExecute(Sender: TObject);

//    procedure frViewDatosYSeleccionContactoedtlNombrePropertiesChange(Sender: TObject);

  private
    FViewDocumentos : IViewDocumentosAsociados;

  protected
    FPedido: IBizPedidoProveedor;
    FViewPedido: IViewPedidoProveedor;
    FController : IPedidosProveedorController;

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

    function GetPedido: IBizPedidoProveedor;
    procedure SetPedido(const Value: IBizPedidoProveedor); virtual;

    function GetViewPedido: IViewPedidoProveedor;
    procedure SetViewPedido(const Value: IViewPedidoProveedor);
    property ViewPedido: IViewPedidoProveedor read GetViewPedido write SetViewPedido;

    //DOCUMENTOS ASOCIADOS
    function GetViewDocumentos: IViewDocumentosAsociados;
    procedure SetViewDocumentos(const Value: IViewDocumentosAsociados);
    property ViewDocumentos: IViewDocumentosAsociados read GetViewDocumentos write
            SetViewDocumentos;

    procedure OnProveedorChanged(Sender : TObject);

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

  public
    procedure PonerTitulos(const ATitulo: string = ''); override;
    property Controller : IPedidosProveedorController read GetController write SetController;
    property Pedido: IBizPedidoProveedor read GetPedido write SetPedido;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  uViewDatosYSeleccionProveedor, uDataModuleUsuarios;

{$R *.dfm}

{ TfEditorPedidoProveedor }

{
**************************** TfEditorPedidoProveedor ****************************
}
procedure TfEditorPedidoProveedor.actGuardarExecute(Sender: TObject);
begin
  inherited;
  FController.Guardar(FPedido);
  Modified := False;
end;

procedure TfEditorPedidoProveedor.actImprimirExecute(Sender: TObject);
begin
  inherited;
  FController.Print(FPedido);
end;

procedure TfEditorPedidoProveedor.actPrevisualizarExecute(Sender: TObject);
begin
  inherited;
  FController.Preview(FPedido);
end;

procedure TfEditorPedidoProveedor.AsignarVista;
var
  AViewPedidoProveedor: TfrViewPedidoProveedor;

begin
  AViewPedidoProveedor := TfrViewPedidoProveedor.create(Self);
  AViewPedidoProveedor.Parent := pagGeneral;
  AViewPedidoProveedor.Align := alClient;
  ViewPedido := AViewPedidoProveedor;
end;

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

  AsignarVista;

  //DOCUMENTOS ASOCIADOS
//  FViewDocumentos := Nil;
  FViewDocumentos := frViewDocumentosAsociados1;
end;

procedure TfEditorPedidoProveedor.CustomEditorClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  FViewPedido := NIL;
  FPedido := NIL;

  //DOCUMENTOS ASOCIADOS
  FViewDocumentos.DeshabilitarDocumentos;
  FViewDocumentos := NIL;
end;

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

procedure TfEditorPedidoProveedor.actEliminarExecute(Sender: TObject);
begin
  if (Application.MessageBox('¿Desea borrar este pedido a proveedor?', 'Atención', MB_YESNO) = IDYES) then
  begin
    FController.Eliminar(FPedido);
    inherited
  end
end;

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

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

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

  //DOCUMENTOS ASOCIADOS
  if Assigned(Pedido.GestorDocumentos) then
  begin
    ViewDocumentos := CreateView(TfrViewDocumentosAsociados) as IViewDocumentosAsociados;
    ViewDocumentos.ShowEmbedded(pagDocumentos);
  end;

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

function TfEditorPedidoProveedor.GetController: IPedidosProveedorController;
begin
  Result := FController;
end;

function TfEditorPedidoProveedor.GetPedido: IBizPedidoProveedor;
begin
  Result := FPedido;
end;

function TfEditorPedidoProveedor.GetViewDocumentos: IViewDocumentosAsociados;
begin
  Result := FViewDocumentos;
end;

function TfEditorPedidoProveedor.GetViewPedido: IViewPedidoProveedor;
begin
  Result := FViewPedido;
end;

procedure TfEditorPedidoProveedor.OnProveedorChanged(Sender: TObject);
begin
  FPedido.Proveedor := ViewPedido.ViewProveedorPedido.Proveedor;
end;

procedure TfEditorPedidoProveedor.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := ATitulo;
  if (FTitulo = '') and Assigned(FPedido) then
  begin
    if FPedido.EsNuevo then
      FTitulo := 'Nuevo pedido'
    else
      FTitulo := 'Pedido'  + ' - ' + FPedido.Proveedor.Nombre
  end;

  inherited PonerTitulos(FTitulo);

  Self.Caption := FTitulo + ' (' + dmUsuarios.EmpresaActual.NOMBRE + ')';
end;

procedure TfEditorPedidoProveedor.SetController(const Value: IPedidosProveedorController);
begin
  FController := Value;

  if Assigned(FController) then
  begin
    ViewPedido.ViewProveedorPedido.Controller := Controller.ProveedorController;
    frViewDetallesPedidoProveedor1.Controller := Controller.DetallesController;
  end;
end;

procedure TfEditorPedidoProveedor.SetPedido(const Value: IBizPedidoProveedor);
begin
  FPedido := Value;

  if Assigned(FPedido) then
  begin
    dsDataTable.DataTable := FPedido.DataTable;
    frViewTotalPedido.DADataSource.DataTable := dsDataTable.DataTable;
    frViewIncidencias.DADataSource.DataTable := dsDataTable.DataTable;

    if Assigned(FViewPedido) then
    begin
      FViewPedido.Pedido := FPedido;
      ViewPedido.ViewProveedorPedido.Proveedor := FPedido.Proveedor;
      ViewPedido.ViewProveedorPedido.OnProveedorChanged := OnProveedorChanged;
      frViewDetallesPedidoProveedor1.Detalles := FPedido.Detalles;
    end;

    //DOCUMENTOS ASOCIADOS
    if Assigned(FViewDocumentos) then
    begin
       if Assigned((Pedido as IBizDocumentosAsociados).GestorDocumentos) then
       begin
         FViewDocumentos.GestorDocumentos := (Pedido as IBizDocumentosAsociados).GestorDocumentos;
         FViewDocumentos.GestorDocumentos.ModoInsert := (Pedido.DataTable.State = dsInsert);
         pagDocumentos.TabVisible := True;
       end
       else
       begin
         Showmessage('La ruta de documentos asociados no es accesible, se procederá a desactivar la funcionalidad');
         pagDocumentos.TabVisible := False;
       end;
    end;
  end;
end;

procedure TfEditorPedidoProveedor.SetViewDocumentos(const Value: IViewDocumentosAsociados);
begin
  FViewDocumentos := Value;

  if Assigned(FViewDocumentos) and Assigned(Pedido) then
     if Assigned((Pedido as IBizDocumentosASociados).GestorDocumentos) then
        FViewDocumentos.GestorDocumentos := (Pedido as IBizDocumentosASociados).GestorDocumentos;
end;

procedure TfEditorPedidoProveedor.SetViewPedido(const Value: IViewPedidoProveedor);
begin
  FViewPedido := Value;

  if Assigned(FViewPedido) and Assigned(Pedido) then
    FViewPedido.Pedido := Pedido;
end;

end.
