unit uEditorAlbaranesProveedor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TB2ExtItems, TBXExtItems,
  TBX, TB2Item, TB2Dock, TB2Toolbar, ExtCtrls, JvExControls,
  JvNavigationPane, uViewGrid, pngimage, JvComponentBase,
  uEditorGridBase,
  uBizAlbaranesProveedor, uIEditorAlbaranesProveedor, uAlbaranesProveedorController,
  uCustomView, uViewBase, uViewBarraSeleccion, uViewGridBase,
  uViewAlbaranesProveedor, JvExComCtrls, JvStatusBar, JSDialog, uDAInterfaces;

type
  TfEditorAlbaranesProveedor = class(TfEditorGridBase, IEditorAlbaranesProveedor)
    actGenerarFactura: TAction;
    JsNuevoAlbaranDialog: TJSDialog;
    JsPrevisualizarDialog: TJSDialog;
    JsImprimirDialog: TJSDialog;
    TBXItem39: TTBXItem;
    JsListaAlbaranesNoEliminados: TJSDialog;
    actGenerarDevolucion: TAction;
    N5: TMenuItem;
    Generardevolucin1: TMenuItem;
    Generarfactura1: TMenuItem;
    TBXSubmenuItem2: TTBXSubmenuItem;
    TBXItem38: TTBXItem;
    TBXItem40: TTBXItem;
    TBXItem41: TTBXItem;
    procedure FormShow(Sender: TObject);
    procedure actGenerarFacturaExecute(Sender: TObject);
    procedure actGenerarFacturaUpdate(Sender: TObject);
    procedure actEliminarUpdate(Sender: TObject);
    procedure OnListaAnosChange(Sender: TObject; const Text: string);
    procedure actGenerarDevolucionUpdate(Sender: TObject);
    procedure actGenerarDevolucionExecute(Sender: TObject);

  protected
    FAlbaranes: IBizAlbaranProveedor;
    FController : IAlbaranesProveedorController;

    function GetAlbaranes: IBizAlbaranProveedor;
    procedure SetAlbaranes(const Value: IBizAlbaranProveedor);

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

    procedure NuevoInterno; override;
    procedure ModificarInterno; override;
    procedure EliminarInterno; override;
    procedure DuplicarInterno; override;
    procedure PrevisualizarInterno; override;
    procedure ImprimirInterno; override;
    procedure RefrescarInterno; override;

    //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 Albaranes: IBizAlbaranProveedor read GetAlbaranes write SetAlbaranes;
    property Controller : IAlbaranesProveedorController read GetController write SetController;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  uDataModuleAlbaranesProveedor, uDataModuleUsuarios, uFactuGES_App,
  uGenerarFacturasProvAlbProvUtils,
  uGenerarAlbaranesProvUtils, uDialogOpcionesImpresionAlbaranesProveedor,
  uEditorBase, schAlbaranesProveedorClient_Intf,
  uGridStatusUtils, uDBSelectionListUtils;

{$R *.dfm}

{
*************************** TfEditorAlbaranesProveedor ***************************
}
procedure TfEditorAlbaranesProveedor.actEliminarUpdate(Sender: TObject);
begin
  inherited;
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := not (FAlbaranes.ID_FACTURA > 0)
end;

procedure TfEditorAlbaranesProveedor.actGenerarDevolucionExecute(
  Sender: TObject);
var
  ADevolucion : IBizAlbaranProveedor;
begin
  inherited;
  ADevolucion := FController.GenerarDevolucion(FAlbaranes);
  if Assigned(ADevolucion) then
    FController.Ver(ADevolucion);
end;

procedure TfEditorAlbaranesProveedor.actGenerarDevolucionUpdate(
  Sender: TObject);
begin
  (Sender as TAction).Enabled := HayDatos
                                 and not (ViewGrid.NumSeleccionados > 1)
                                 and (Albaranes.REF_FACTURA = '')
                                 and ViewGrid.esSeleccionCeldaDatos;
end;

procedure TfEditorAlbaranesProveedor.actGenerarFacturaExecute(Sender: TObject);
begin
  inherited;
  GenerarFacturaProvAlbProv(Albaranes.ID);
  actRefrescar.Execute;
end;

procedure TfEditorAlbaranesProveedor.actGenerarFacturaUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayDatos
                                 and not (ViewGrid.NumSeleccionados > 1)
                                 and (Albaranes.REF_FACTURA = '')
                                 and ViewGrid.esSeleccionCeldaDatos;
end;

procedure TfEditorAlbaranesProveedor.AsignarVista;
begin
  ViewGrid := CreateView(TfrViewAlbaranesProveedor) as IViewAlbaranesProveedor;
end;

constructor TfEditorAlbaranesProveedor.Create(AOwner: TComponent);
begin
  inherited;

  FHeaderText := 'Lista de albaranes de proveedor';
  FWindowCaption := FHeaderText;

  AsignarVista;
end;

destructor TfEditorAlbaranesProveedor.Destroy;
begin
  FAlbaranes := NIL;
  FController := NIL;  
  inherited;
end;

procedure TfEditorAlbaranesProveedor.DuplicarInterno;
var
  AAlbaran : IBizAlbaranProveedor;
begin
  inherited;
  AAlbaran := FController.Duplicar(Albaranes);
  try
    FController.Ver(AAlbaran);
  finally
    actRefrescar.Execute;
  end;
end;

procedure TfEditorAlbaranesProveedor.EliminarInterno;
var
  AAlbaranes: IBizAlbaranProveedor;
  AllItems: Boolean;
begin
  AAlbaranes := Nil;
  AllItems := False;

  if MultiSelect and Assigned(ViewGrid) then
     AllItems :=  (ViewGrid.NumSeleccionados > 1);

  if AllItems then
  begin
    if (Application.MessageBox('¿Desea borrar los albaranes de proveedor seleccionados?', 'Atención', MB_YESNO) = IDYES) then
    begin
      SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords);
      AAlbaranes := (Controller as IAlbaranesProveedorController).ExtraerSeleccionados(Albaranes) as IBizAlbaranProveedor;
    end
  end
  else begin
    if (Application.MessageBox('¿Desea borrar el albarán de proveedor seleccionado?', 'Atención', MB_YESNO) = IDYES) then
        AAlbaranes := Albaranes;
  end;

  if Assigned(AAlbaranes) then
  begin
    FController.Eliminar(AAlbaranes, AllItems);
    if AllItems then
    begin
      if (AAlbaranes.DataTable.RecordCount > 0) then
      begin
        with  AAlbaranes.DataTable do
        begin
          First;
          while not EOF do
          begin
            JsListaAlbaranesNoEliminados.Content.Add('Ref. albarán: ' + AAlbaranes.REFERENCIA + '  ' + AAlbaranes.NOMBRE);
            Next;
          end;
        end;
        JsListaAlbaranesNoEliminados.Execute;
      end;
      actRefrescar.Execute;
    end;
  end;

  ViewGrid.GotoFirst;
end;

procedure TfEditorAlbaranesProveedor.FormShow(Sender: TObject);
begin
  cbxListaAnos.OnChange := OnListaAnosChange; //OJO SIEMPRE ANTES DEL INHERITED

  inherited;

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

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

  Albaranes.DataTable.Active := True;
  ViewGrid.GotoFirst;
end;

function TfEditorAlbaranesProveedor.GetController: IAlbaranesProveedorController;
begin
  Result := FController;
end;

procedure TfEditorAlbaranesProveedor.ImprimirInterno;
var
  Respuesta : Integer;
  AAlbaranes: IBizAlbaranProveedor;
  AllItems: Boolean;
  FImprimirPrecios : Boolean;
  FImprimirRefProveedor : Boolean;
  
begin
  AAlbaranes := Nil;
  AllItems := False;
  FImprimirPrecios := False;
  FImprimirRefProveedor := True;

  if MultiSelect and Assigned(ViewGrid) then
     AllItems :=  (ViewGrid.NumSeleccionados > 1);

  //Si esta agrupado solo podré imprimir la lista de elementos visibles
  if not ViewGrid.EsSeleccionCeldaDatos then
     inherited
  else
  begin
    Respuesta := JsImprimirDialog.Execute;
    if Respuesta <> IDCANCEL then
    begin
      case JsImprimirDialog.CustomButtonResult of
        200   : begin   // Lista de elementos visibles
                  inherited;
                end;
        100   : begin   // Elemento Seleccionado
                  if AllItems then
                  begin
                    SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords);
                    AAlbaranes := (Controller as IAlbaranesProveedorController).ExtraerSeleccionados(Albaranes) as IBizAlbaranProveedor;
                  end
                  else
                    AAlbaranes := Albaranes;

                  if Assigned(AAlbaranes) then
                  begin
                    if ElegirOpcionesImpresionAlbaranProveedor(FImprimirPrecios, FImprimirRefProveedor) then
                       if FController.Print(AAlbaranes, AllItems, FImprimirPrecios, FImprimirRefProveedor) then
                          RefrescarInterno;
                  end;
                end;
      end;
    end;
  end;
end;

function TfEditorAlbaranesProveedor.GetAlbaranes: IBizAlbaranProveedor;
begin
  Result := FAlbaranes;
end;

procedure TfEditorAlbaranesProveedor.ModificarInterno;
begin
  inherited;
  FController.Ver(Albaranes);
end;

procedure TfEditorAlbaranesProveedor.NuevoInterno;
var
  Respuesta : Integer;

begin
  inherited;

  Respuesta := JsNuevoAlbaranDialog.Execute;

  if Respuesta <> IDCANCEL then
  begin
    case JsNuevoAlbaranDialog.CustomButtonResult of
      200   : begin   // Utilizar un pedido
                GenerarAlbaranProv;
                actRefrescar.Execute;
              end;
      100    : begin   // Albaran nuevo vacio
                  if FController.Anadir(Albaranes) then
                    FController.Ver(Albaranes);
                end;
    end;
  end;
end;

procedure TfEditorAlbaranesProveedor.OnListaAnosChange(Sender: TObject; const Text: string);
begin
  Controller.FiltrarAno(Albaranes, DynWhereDataTable, Text);
  if Albaranes.DataTable.Active then
     RefrescarInterno;
end;

procedure TfEditorAlbaranesProveedor.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := FWindowCaption + ' - ' + AppFactuGES.EmpresaActiva.NOMBRE;
  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorAlbaranesProveedor.PrevisualizarInterno;
var
  Respuesta : Integer;
  AAlbaranes: IBizAlbaranProveedor;
  AllItems: Boolean;
  FImprimirPrecios : Boolean;
  FImprimirRefProveedor : Boolean;

begin
  AAlbaranes := Nil;
  AllItems := False;
  FImprimirPrecios := False;
  FImprimirRefProveedor := True;


  if MultiSelect and Assigned(ViewGrid) then
     AllItems :=  (ViewGrid.NumSeleccionados > 1);

  //Si esta agrupado solo podré imprimir la lista de elementos visibles
  if not ViewGrid.EsSeleccionCeldaDatos then
     inherited
  else
  begin
    Respuesta := JsPrevisualizarDialog.Execute;
    if Respuesta <> IDCANCEL then
    begin
      case JsPrevisualizarDialog.CustomButtonResult of
        200   : begin   // Lista de elementos visibles
                  inherited;
                end;
        100   : begin   // Elemento Seleccionado
                  if AllItems then
                  begin
                    SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Albaranes as ISeleccionable).SelectedRecords);
                    AAlbaranes := (Controller as IAlbaranesProveedorController).ExtraerSeleccionados(Albaranes) as IBizAlbaranProveedor;
                  end
                  else
                    AAlbaranes := Albaranes;


                  if Assigned(AAlbaranes) then
                  begin
                    if ElegirOpcionesImpresionAlbaranProveedor(FImprimirPrecios, FImprimirRefProveedor) then
                      FController.Preview(AAlbaranes, AllItems, FImprimirPrecios, FImprimirRefProveedor);
                  end;
                end;
      end;
    end;
  end;
end;

procedure TfEditorAlbaranesProveedor.RefrescarInterno;
begin
  //Volvemos a cargar los años de los albaranes
  if Assigned(FController) then
     ListaAnos := FController.DarListaAnosAlbaranes;

  inherited;
end;

procedure TfEditorAlbaranesProveedor.SetController(const Value: IAlbaranesProveedorController);
begin
  FController := Value;

  if Assigned(FController) then
     ListaAnos := FController.DarListaAnosAlbaranes;
end;

procedure TfEditorAlbaranesProveedor.SetAlbaranes(const Value: IBizAlbaranProveedor);
begin
  FAlbaranes := Value;

  if Assigned(FAlbaranes) then
  begin
    //Se guarda el where de la sentencia origen, por si el editor tiene filtros que
    //afecten a este where y en un futuro se desea volver al where origen (filtro de año))
    DynWhereDataTable := FAlbaranes.DataTable.DynamicWhere.Xml;

    dsDataTable.DataTable := FAlbaranes.DataTable;
    if Assigned(ViewGrid) then
      (ViewGrid as IViewAlbaranesProveedor).Albaranes := Albaranes;
  end;
end;

end.
