unit uEditorFacturasProveedor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TB2ExtItems, 
  SpTBXItem, TB2Item, TB2Dock, TB2Toolbar, ExtCtrls, JvExControls,
  JvNavigationPane, uViewGrid, pngimage, JvComponentBase,
  uEditorGridBase, uBizFacturasProveedor, uIEditorFacturasProveedor,
  uFacturasProveedorController, uCustomView, uViewBase, uViewBarraSeleccion,
  uViewGridBase, JvExComCtrls, JvStatusBar, JSDialog,
  uViewFacturasProveedor, uDAInterfaces;

type

  TfEditorFacturasProveedor = class(TfEditorGridBase, IEditorFacturasProveedor)
    Cambiarlasituacin1: TMenuItem;
    N4: TMenuItem;
    JsNuevaFacturaDialog: TJSDialog;
    JsListaFacturasGeneradas: TJSDialog;
    frViewFacturasProveedor1: TfrViewFacturasProveedor;
    actNuevaFactura: TAction;
    actNuevoAbono: TAction;
    JsNuevoAbonoDialog: TJSDialog;
    TBXSubmenuItem2: TSpTBXSubmenuItem;
    TBXItem38: TSpTBXItem;
    TBXItem39: TSpTBXItem;
    JsPrevisualizarDialog: TJSDialog;
    JsImprimirDialog: TJSDialog;
    JsListaFacturasNoEliminadas: TJSDialog;
    JSInformesDialog: TJSDialog;
    actInformes: TAction;
    TBXItem40: TSpTBXItem;
    actDomiciliacion: TAction;
    TBXItem41: TSpTBXItem;
    TBXSeparatorItem17: TSpTBXSeparatorItem;
    JsListaFacturasNoModificables: TJSDialog;
    procedure FormShow(Sender: TObject);
    procedure actEliminarUpdate(Sender: TObject);
    procedure actNuevaFacturaExecute(Sender: TObject);
    procedure actNuevoAbonoExecute(Sender: TObject);
    procedure actInformesExecute(Sender: TObject);
    procedure OnListaAnosChange(Sender: TObject);
    procedure actDomiciliacionExecute(Sender: TObject);
    procedure actDomiciliacionUpdate(Sender: TObject);

  private
    FFacturas: IBizFacturaProveedor;
    FController : IFacturasProveedorController;
  protected
    function GetFacturas: IBizFacturaProveedor;
    procedure SetFacturas(const Value: IBizFacturaProveedor);

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

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

  public
    procedure PonerTitulos(const ATitulo: string = ''); override;
    property Facturas: IBizFacturaProveedor read GetFacturas write SetFacturas;
    property Controller : IFacturasProveedorController read GetController write SetController;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;


implementation

uses
  uDataModuleFacturasProveedor, uDataModuleUsuarios, cxControls,
  uGridStatusUtils, uDBSelectionListUtils, uFactuGES_App,
  uAlbaranesProveedorController, uBizAlbaranesProveedor,
  uEditorBase, uGenerarFacturasProvAlbProvUtils, uGenerarFacturasProvPedUtils,
  uGestorInformesController;

{$R *.dfm}

{
*************************** TfEditorFacturasProveedor ***************************
}
procedure TfEditorFacturasProveedor.actDomiciliacionExecute(Sender: TObject);
var
  AFacturas: IBizFacturaProveedor;
  AListaFacturasNoModificadas: TStringList;
  i: integer;

begin
  inherited;

  ViewGrid.SaveGridStatus;
  try
    SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Facturas as ISeleccionable).SelectedRecords);
    AFacturas := (Controller as IFacturasProveedorController).ExtraerSeleccionados(Facturas) as IBizFacturaProveedor;
  finally
    ViewGrid.RestoreGridStatus;
  end;

  AListaFacturasNoModificadas := Controller.AsignarCuentaBancaria(AFacturas);

  JsListaFacturasNoModificables.Content.Clear;
  for i := 0 to AListaFacturasNoModificadas.Count - 1 do
      JsListaFacturasNoModificables.Content.Add('Ref. factura: ' + AListaFacturasNoModificadas.Names[i] + '  ' + AListaFacturasNoModificadas.Values[AListaFacturasNoModificadas.Names[i]]);
  if AListaFacturasNoModificadas.Count > 0 then
     JsListaFacturasNoModificables.Execute;

  FreeAndNil(AListaFacturasNoModificadas);
  RefrescarInterno;
end;

procedure TfEditorFacturasProveedor.actDomiciliacionUpdate(Sender: TObject);
begin
  inherited;

  if HayDatos and Assigned(ViewGrid) then
    (Sender as TAction).Enabled := not (dsDataTable.DataTable.State in dsEditModes)
      and ViewGrid.esSeleccionCeldaDatos
      and (ViewGrid.NumSeleccionados > 0)
  else
    (Sender as TAction).Enabled := False;

  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := (FFacturas.SITUACION = CTE_PENDIENTE);
end;

procedure TfEditorFacturasProveedor.actEliminarUpdate(Sender: TObject);
begin
  inherited;
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := (FFacturas.SITUACION = CTE_PENDIENTE);
end;

procedure TfEditorFacturasProveedor.actInformesExecute(Sender: TObject);
var
  Respuesta : Integer;
  AGestorInformesController : IGestorInformesController;

begin
  AGestorInformesController := TGestorInformesController.Create;
  try

    Respuesta := JsInformesDialog.Execute;

    if Respuesta <> IDCANCEL then
    begin
      case JsInformesDialog.CustomButtonResult of
        100 : begin   // Listado de facturas pendientes
                AGestorInformesController.VerInformeListadoFacturasProvPendientes;
              end;
        200 : begin   // Listado de IVA
                AGestorInformesController.VerInformeIVAProveedores;
              end;
        300 : begin   // Listado de facturas de cliente
                AGestorInformesController.VerInformeListadoFacturasProv;
              end;
      end;
    end;

  finally
    AGestorInformesController := NIL;
  end;
end;

procedure TfEditorFacturasProveedor.actNuevaFacturaExecute(Sender: TObject);
begin
  actNuevo.Execute;
end;

procedure TfEditorFacturasProveedor.actNuevoAbonoExecute(Sender: TObject);
var
  Respuesta : Integer;
  Opcion : Integer;
begin
  inherited;
  //ABONOS
  if (Facturas.TIPO = CTE_TIPO_FACTURA) then
  begin
      Respuesta := JsNuevoAbonoDialog.Execute;
      //Nos salimos sin hace nada
      if Respuesta = IDCANCEL then
         Exit;
      Opcion := JsNuevoAbonoDialog.CustomButtonResult;
  end
  else
      Opcion := 100;

    case Opcion of
      200   : begin   // Utilizar factura seleccionada
                  FController.Ver(FController.GenerarAbono(Facturas));
                  actRefrescar.Execute;
                  ViewGrid._FocusedView.DataController.GotoFirst;
      end;
      100    : begin   // Abono nuevo vacio
                  if FController.AnadirAbono(Facturas) then
                     FController.Ver(Facturas);
                end;
    end;
end;

constructor TfEditorFacturasProveedor.Create(AOwner: TComponent);
begin
  inherited;
  
  FHeaderText := 'Lista de facturas de proveedor';
  FWindowCaption := FHeaderText;
  
  ViewGrid := frViewFacturasProveedor1; //  CreateView(TfrViewFacturasProveedor) as IViewFacturasProveedor;
end;

destructor TfEditorFacturasProveedor.Destroy;
begin
  FFacturas := NIL;
  inherited;
end;

procedure TfEditorFacturasProveedor.DuplicarInterno;
var
  AFactura : IBizFacturaProveedor;
begin
  inherited;
  AFactura := FController.Duplicar(FFacturas);
  try
    FController.Ver(AFactura);
  finally
    actRefrescar.Execute;
  end;
end;

procedure TfEditorFacturasProveedor.EliminarInterno;
var
  ACadena : String;
  AFacturas: IBizFacturaProveedor;
  AllItems: Boolean;
begin
  AFacturas := Nil;
  AllItems := False;

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

  if AllItems then
  begin
    if (Application.MessageBox('¿Desea borrar las facturas/abonos de proveedor seleccionados?', 'Atención', MB_YESNO) = IDYES) then
    begin
      SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Facturas as ISeleccionable).SelectedRecords);
      AFacturas := (Controller as IFacturasProveedorController).ExtraerSeleccionados(Facturas) as IBizFacturaProveedor;
    end
  end
  else begin
     if Facturas.TIPO = CTE_TIPO_FACTURA then
        ACadena := '¿Desea borrar esta factura de proveedor?'
     else
        ACadena := '¿Desea borrar este abono a proveedor?';

     if (Application.MessageBox(PChar(ACadena), 'Atención', MB_YESNO) = IDYES) then
        AFacturas := Facturas;
  end;

  if Assigned(AFacturas) then
  begin
    if (not FController.Eliminar(AFacturas, AllItems))
    and (not AllItems) then //Es el caso de querer borrar una factura pendiente cuyos recibos tienen devoluciones
    begin
      JsListaFacturasNoEliminadas.Content.Clear;
      JsListaFacturasNoEliminadas.Content.Add('Ref. factura: ' + AFacturas.REFERENCIA + '  ' + AFacturas.NOMBRE);
      JsListaFacturasNoEliminadas.Execute;      
    end;

    if AllItems then
    begin
      if (AFacturas.DataTable.RecordCount > 0) then
      begin
        with  AFacturas.DataTable do
        begin
          JsListaFacturasNoEliminadas.Content.Clear;        
          First;
          while not EOF do
          begin
            JsListaFacturasNoEliminadas.Content.Add('Ref. factura: ' + AFacturas.REFERENCIA + '  ' + AFacturas.NOMBRE);
            Next;
          end;
        end;
        JsListaFacturasNoEliminadas.Execute;
      end;
      actRefrescar.Execute;
    end;
  end;

  ViewGrid.GotoFirst;
end;

procedure TfEditorFacturasProveedor.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(Facturas) then
    raise Exception.Create('No hay ninguna facturas asignada');

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

function TfEditorFacturasProveedor.GetController: IFacturasProveedorController;
begin
  Result := FController;
end;

function TfEditorFacturasProveedor.GetFacturas: IBizFacturaProveedor;
begin
  Result := FFacturas;
end;

procedure TfEditorFacturasProveedor.ModificarInterno;
begin
  inherited;
  FController.Ver(Facturas);
end;

procedure TfEditorFacturasProveedor.NuevoInterno;
var
  Respuesta : Integer;
begin
  inherited;

  Respuesta := JsNuevaFacturaDialog.Execute;

  if Respuesta <> IDCANCEL then
  begin
    case JsNuevaFacturaDialog.CustomButtonResult of
      100   : begin   // Factura nuevo vacio
                if FController.Anadir(Facturas) then
                   FController.Ver(Facturas);
              end;
      200   : begin   // Utilizar pedidos
                GenerarFacturaProvPed;
                actRefrescar.Execute;
                end;
      300   : begin   // Utilizar albaranes
                GenerarFacturaProvAlbProv;
                actRefrescar.Execute;
      end;
    end;
  end;
end;

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

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

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

  inherited;
end;

procedure TfEditorFacturasProveedor.SetController(const Value: IFacturasProveedorController);
begin
  FController := Value;

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

procedure TfEditorFacturasProveedor.SetFacturas(const Value: IBizFacturaProveedor);
begin
  FFacturas := Value;

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

    dsDataTable.DataTable := FFacturas.DataTable;
    if Assigned(ViewGrid) then
      (ViewGrid as IViewFacturasProveedor).Facturas := Facturas;
  end;
end;

end.
  