unit uEditorRemesasCliente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorBase, ToolWin, ComCtrls, JvExControls, JvComponent,
  JvNavigationPane, uViewRemesasCliente, uBizRemesasCliente, ActnList, DBActns, uViewGrid,
  Menus, uDataModuleBase, ImgList, PngImageList, TB2Dock, TB2Toolbar, 
  TB2Item, StdActns, TB2ExtItems, TB2MRU, DB, uDADataTable,
  JvFormAutoSize, uDAScriptingProvider, uDACDSDataTable, JvAppStorage,
  JvAppRegistryStorage, JvFormPlacement, ExtCtrls, uCustomView, uViewBase,
  uViewBarraSeleccion, pngimage, uIEditorRemesasCliente, uEditorGridBase,
  JvComponentBase, uViewGridBase, uRemesasClienteController, JvExComCtrls,
  JvStatusBar, JSDialog, uDAInterfaces, SpTBXItem, StdCtrls, TntStdCtrls,
  SpTBXEditors;

type
  TfEditorRemesasCliente = class(TfEditorGridBase, IEditorRemesasCliente)
    actVolcarDisco: TAction;
    TBXSeparatorItem17: TSpTBXSeparatorItem;
    N4: TMenuItem;
    Volcaradisco1: TMenuItem;
    TBXSubmenuItem2: TSpTBXSubmenuItem;
    TBXItem38: TSpTBXItem;
    JsListaRemesasNoEliminadas: TJSDialog;
    JsPrevisualizarDialog: TJSDialog;
    JsImprimirDialog: TJSDialog;
    procedure FormShow(Sender: TObject);
    procedure actVolcarDiscoExecute(Sender: TObject);
    procedure actVolcarDiscoUpdate(Sender: TObject);
    procedure OnListaAnosChange(Sender: TObject);

  private
    FRemesasCliente: IBizRemesaCliente;
    FController : IRemesasClienteController;

  protected
    function GetRemesasCliente: IBizRemesaCliente;
    procedure SetRemesasCliente(const Value: IBizRemesaCliente);

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

    procedure NuevoInterno; override;
    procedure EliminarInterno; override;
    procedure ModificarInterno; 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 RemesasCliente: IBizRemesaCliente read GetRemesasCliente write SetRemesasCliente;
    property Controller : IRemesasClienteController read GetController write SetController;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  uCustomEditor, uDataModuleRemesasCliente, uDataModuleUsuarios,
  uGridStatusUtils, uDBSelectionListUtils, uFactuGES_App,
  uEditorDBBase,  //uBizFamilias, uFamiliasController,
  uBancaElectronicaController,
  cxGrid, cxGridCustomTableView; //, uListaRemesasCliente;

{$R *.dfm}

{
****************************** TfEditorRemesasCliente *******************************
}
procedure TfEditorRemesasCliente.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(RemesasCliente) then
    raise Exception.Create('No hay ningún RemesaCliente asignado');

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

function TfEditorRemesasCliente.GetRemesasCliente: IBizRemesaCliente;
begin
  Result := FRemesasCliente;
end;

procedure TfEditorRemesasCliente.ImprimirInterno;
var
  Respuesta : Integer;
  ARemesasCliente: IBizRemesaCliente;
  AllItems: Boolean;
begin
  ARemesasCliente := Nil;
  AllItems := False;

  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, (RemesasCliente as ISeleccionable).SelectedRecords);
                    ARemesasCliente := (Controller as IRemesasClienteController).ExtraerSeleccionados(RemesasCliente) as IBizRemesaCliente;
                  end
                  else
                    ARemesasCliente := RemesasCliente;

                  if Assigned(ARemesasCliente) then
                     FController.Print(ARemesasCliente, AllItems);
                end;
      end;
    end;
  end;
end;

function TfEditorRemesasCliente.GetController: IRemesasClienteController;
begin
  Result := FController;
end;

procedure TfEditorRemesasCliente.ModificarInterno;
begin
  inherited;
  FController.Ver(RemesasCliente);
end;

procedure TfEditorRemesasCliente.NuevoInterno;
begin
  inherited;
  FController.Anadir(RemesasCliente);
  FController.Ver(RemesasCliente);
end;

procedure TfEditorRemesasCliente.OnListaAnosChange(Sender: TObject);
begin
  Controller.FiltrarAno(RemesasCliente, DynWhereDataTable, cbxListaAnos.Text);
  if RemesasCliente.DataTable.Active then
     RefrescarInterno;
end;

procedure TfEditorRemesasCliente.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := 'Lista de remesas de cobro - ' + AppFactuGES.EmpresaActiva.NOMBRE;
  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorRemesasCliente.PrevisualizarInterno;
var
  Respuesta : Integer;
  ARemesasCliente: IBizRemesaCliente;
  AllItems: Boolean;
begin
  ARemesasCliente := Nil;
  AllItems := False;

  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, (RemesasCliente as ISeleccionable).SelectedRecords);
                    ARemesasCliente := (Controller as IRemesasClienteController).ExtraerSeleccionados(RemesasCliente) as IBizRemesaCliente;
                  end
                  else
                    ARemesasCliente := RemesasCliente;

                  if Assigned(ARemesasCliente) then
                     FController.Preview(ARemesasCliente, AllItems);
                end;
      end;
    end;
  end;
end;

procedure TfEditorRemesasCliente.RefrescarInterno;
begin
  //Volvemos a cargar los años de las remesas
  if Assigned(FController) then
     ListaAnos := FController.DarListaAnosRemesas;

  inherited;
end;

procedure TfEditorRemesasCliente.SetRemesasCliente(const Value: IBizRemesaCliente);
begin
  FRemesasCliente := Value;

  if Assigned(FRemesasCliente) 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 := FRemesasCliente.DataTable.DynamicWhere.Xml;

    dsDataTable.DataTable := FRemesasCliente.DataTable;
    if Assigned(ViewGrid) then
      (ViewGrid as IViewRemesasCliente).RemesasCliente := RemesasCliente;
  end;
end;

procedure TfEditorRemesasCliente.SetController(const Value: IRemesasClienteController);
begin
  FController := Value;

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

destructor TfEditorRemesasCliente.Destroy;
begin
  FRemesasCliente := NIL;
  FController := NIl;
  inherited;
end;

procedure TfEditorRemesasCliente.EliminarInterno;
var
  ARemesas: IBizRemesaCliente;
  AllItems: Boolean;
begin
  ARemesas := Nil;
  AllItems := False;

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

  if AllItems then
  begin
    if (Application.MessageBox('¿Desea borrar las remesas de cobro seleccionadas?', 'Atención', MB_YESNO) = IDYES) then
    begin
      SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (RemesasCliente as ISeleccionable).SelectedRecords);
      ARemesas := (Controller as IRemesasClienteController).ExtraerSeleccionados(RemesasCliente) as IBizRemesaCliente;
    end
  end
  else begin
     if (Application.MessageBox('¿Desea borrar esta remesa de cobro?', 'Atención', MB_YESNO) = IDYES) then
        ARemesas := RemesasCliente;
  end;

  if Assigned(ARemesas) then
  begin
    FController.Eliminar(ARemesas, AllItems);
    if AllItems then
    begin
      if (ARemesas.DataTable.RecordCount > 0) then
      begin
        with  ARemesas.DataTable do
        begin
          First;
          while not EOF do
          begin
            JsListaRemesasNoEliminadas.Content.Add('Ref. remesa: ' + ARemesas.REFERENCIA + '  ' + ARemesas.NOMBRE);
            Next;
          end;
        end;
        JsListaRemesasNoEliminadas.Execute;
      end;
    end;
  end;

  actRefrescar.Execute;
  ViewGrid.GotoFirst;
end;

procedure TfEditorRemesasCliente.actVolcarDiscoExecute(Sender: TObject);
//var
//  ABancaController : IBancaElectronicaController;
begin
{  inherited;
  ABancaController := TBancaElectronicaController.Create;
  try
    ABancaController.GenerarFicheroNorma19(FRemesasCliente.ID);
  finally
    ABancaController := NIL;
  end;
}  
end;

procedure TfEditorRemesasCliente.actVolcarDiscoUpdate(Sender: TObject);
begin
  inherited;
  if HayDatos and Assigned(ViewGrid) then
    (Sender as TAction).Enabled := not (dsDataTable.DataTable.State in dsEditModes)
      and not ViewGrid.IsEmpty
  else
    (Sender as TAction).Enabled := False;
end;

procedure TfEditorRemesasCliente.AsignarVista;
begin
  ViewGrid := CreateView(TfrViewRemesasCliente) as IViewRemesasCliente;
end;

constructor TfEditorRemesasCliente.Create(AOwner: TComponent);
begin
  inherited;
  AsignarVista;
end;

end.

