unit uEditorPresupuestosCliente;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  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,
  uBizPresupuestosCliente, uIEditorPresupuestosCliente, uPresupuestosClienteController,
  uCustomView, uViewBase, uViewBarraSeleccion, uViewGridBase,
  uViewPresupuestosCliente, JvExComCtrls, JvStatusBar, JSDialog, StdCtrls,
  uDAInterfaces;

type
  TfEditorPresupuestosCliente = class(TfEditorGridBase, IEditorPresupuestosCliente)
    actGenerarAlbaranCli: TAction;
    actGenerarFactura: TAction;
    TBXSubmenuItem2: TTBXSubmenuItem;
    TBXSeparatorItem17: TTBXSeparatorItem;
    TBXItem38: TTBXItem;
    TBXItem39: TTBXItem;
    N4: TMenuItem;
    actGenerar: TAction;
    Generar2: TMenuItem;
    JsGenerarDialog: TJSDialog;
    JsPrevisualizarDialog: TJSDialog;
    JsImprimirDialog: TJSDialog;
    TBXItem40: TTBXItem;
    JsListaPresupuestosNoEliminados: TJSDialog;
    actEnviarEMail: TAction;
    Enviarporemail1: TMenuItem;
    TBXItem4441: TTBXItem;
    TBXItem41: TTBXItem;
    ActInformes: TAction;
    JSInformesDialog: TJSDialog;
    TBXItem42: TTBXItem;
    TBXSeparatorItem18: TTBXSeparatorItem;        
    procedure FormShow(Sender: TObject);
    procedure actGenerarAlbaranCliExecute(Sender: TObject);
    procedure actEliminarUpdate(Sender: TObject);
    procedure actGenerarFacturaUpdate(Sender: TObject);
    procedure actGenerarFacturaExecute(Sender: TObject);
    procedure actGenerarPresupuestoProvExecute(Sender: TObject);
    procedure actGenerarExecute(Sender: TObject);
    procedure actGenerarUpdate(Sender: TObject);
    procedure actEnviarEMailExecute(Sender: TObject);
    procedure actEnviarEMailUpdate(Sender: TObject);
    procedure ActInformesExecute(Sender: TObject);

  protected
    FPresupuestos: IBizPresupuestoCliente;
    FController : IPresupuestosClienteController;

    function GetPresupuestos: IBizPresupuestoCliente;
    procedure SetPresupuestos(const Value: IBizPresupuestoCliente);

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

    procedure NuevoInterno; override;
    procedure ModificarInterno; override;
    procedure EliminarInterno; override;
    procedure DuplicarInterno; override;
    procedure ImprimirInterno; override;
    procedure PrevisualizarInterno; 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 Presupuestos: IBizPresupuestoCliente read GetPresupuestos write SetPresupuestos;
    property Controller : IPresupuestosClienteController read GetController write SetController;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  uDataModulePresupuestosCliente, uDataModuleUsuarios, uFactuGES_App,
//  uBizAlbaranesCliente, uAlbaranesClienteController,
  uEditorBase, uEditorDBBase, uDialogUtils,
//  uFacturasClienteController, uBizFacturasCliente,
  uGridUtils, uDBSelectionListUtils, uGestorInformesController;
//  uGenerarPresupuestosProvUtils, uGenerarAlbaranesCliUtils;


{$R *.dfm}

{
*************************** TfEditorPresupuestosCliente ***************************
}
procedure TfEditorPresupuestosCliente.actEliminarUpdate(Sender: TObject);
begin
  inherited;
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := (FPresupuestos.SITUACION = SITUACION_PRESUPUESTO_PENDIENTE);
end;

procedure TfEditorPresupuestosCliente.actEnviarEMailExecute(Sender: TObject);
begin
  inherited;
  FController.EnviarPresupuestoPorEMail(FPresupuestos); 
end;

procedure TfEditorPresupuestosCliente.actEnviarEMailUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayDatos
                and not (ViewGrid.NumSeleccionados > 1)
                and ViewGrid.esSeleccionCeldaDatos;
end;

procedure TfEditorPresupuestosCliente.actGenerarAlbaranCliExecute(Sender: TObject);
var
  IDAlbaranAux : Integer;
begin
  inherited;
//  GenerarAlbaranCli(FPresupuestos.ID, IDAlbaranAux);
end;

procedure TfEditorPresupuestosCliente.actGenerarExecute(Sender: TObject);
var
  Respuesta : Integer;
begin
AppFactuGES.ShowCapado;
{
  inherited;

  Respuesta := JsGenerarDialog.Execute;

  if Respuesta <> IDCANCEL then
  begin
    case JsGenerarDialog.CustomButtonResult of
      200   : begin   // Generar uno o más Presupuestos a proveedor
//                actGenerarPresupuestoProv.Execute;
              end;
      100   : begin   // Albaran nuevo
                actGenerarAlbaranCli.Execute;
              end;
    end;
    actRefrescar.Execute;
  end;
}  
end;

procedure TfEditorPresupuestosCliente.actGenerarFacturaExecute(Sender: TObject);
{
var
  AFacturasController : IFacturasClienteController;
  AFactura : IBizFacturaCliente;
}
begin
{
  inherited;
  AFacturasController := TFacturasClienteController.Create;
  try
    AFactura := AFacturasController.Nuevo;
    if AFacturasController.Anadir(AFactura, FPresupuestos.ID) then
      AFacturasController.Ver(AFactura);
    actRefrescar.Execute;
  finally
    AFacturasController := NIL;
    AFactura := NIL;
  end;
}
end;

procedure TfEditorPresupuestosCliente.actGenerarFacturaUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayDatos
                                 and ViewGrid.esSeleccionCeldaDatos
                                 and (FPresupuestos.SITUACION = SITUACION_PRESUPUESTO_PENDIENTE);
end;

procedure TfEditorPresupuestosCliente.actGenerarPresupuestoProvExecute(Sender: TObject);
begin
  inherited;
//  GenerarPresupuestosProv(FPresupuestos);
end;

procedure TfEditorPresupuestosCliente.actGenerarUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayDatos and
                                 not (ViewGrid.NumSeleccionados > 1) and
                                 ViewGrid.esSeleccionCeldaDatos and
                                (FPresupuestos.SITUACION <> SITUACION_PRESUPUESTO_ANULADO);
end;

procedure TfEditorPresupuestosCliente.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.VerInformeListadoPresupuestos;
              end;
      end;
    end;

  finally
    AGestorInformesController := NIL;
  end;
end;

procedure TfEditorPresupuestosCliente.AsignarVista;
begin
  ViewGrid := CreateView(TfrViewPresupuestosCliente) as IViewPresupuestosCliente;
end;

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

destructor TfEditorPresupuestosCliente.Destroy;
begin
  FPresupuestos := NIL;
  FController := NIL;  
  inherited;
end;

procedure TfEditorPresupuestosCliente.DuplicarInterno;
var
  APresupuesto : IBizPresupuestoCliente;
begin
AppFactuGES.ShowCapado;
{
  inherited;
  APresupuesto := FController.Duplicar(Presupuestos);
  try
    FController.Ver(APresupuesto);
  finally
    actRefrescar.Execute;
  end;
}  
end;

procedure TfEditorPresupuestosCliente.EliminarInterno;
var
  APresupuestos: IBizPresupuestoCliente;
  AllItems: Boolean;
begin
  APresupuestos := Nil;
  AllItems := False;

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

  if AllItems then
  begin
    if (Application.MessageBox('¿Desea borrar los Presupuestos de proveedor seleccionados?', 'Atención', MB_YESNO) = IDYES) then
    begin
      SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Presupuestos as ISeleccionable).SelectedRecords);
      APresupuestos := (Controller as IPresupuestosClienteController).ExtraerSeleccionados(Presupuestos) as IBizPresupuestoCliente;
    end
  end
  else begin
    if (Application.MessageBox('¿Desea borrar el Presupuesto de proveedor seleccionado?', 'Atención', MB_YESNO) = IDYES) then
        APresupuestos := Presupuestos;
  end;

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

  ViewGrid.GotoFirst;
end;

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

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

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

  Presupuestos.DataTable.Active := True;
  ViewGrid.GotoFirst;
  //Para que coja el ancho automático
  actAnchoAuto.Execute;    
end;

function TfEditorPresupuestosCliente.GetController: IPresupuestosClienteController;
begin
  Result := FController;
end;

function TfEditorPresupuestosCliente.GetPresupuestos: IBizPresupuestoCliente;
begin
  Result := FPresupuestos;
end;

procedure TfEditorPresupuestosCliente.ImprimirInterno;
var
  Respuesta : Integer;
  APresupuestos: IBizPresupuestoCliente;
  AllItems: Boolean;
begin
AppFactuGES.ShowCapado;
{
  APresupuestos := 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, (Presupuestos as ISeleccionable).SelectedRecords);
                    APresupuestos := (Controller as IPresupuestosClienteController).ExtraerSeleccionados(Presupuestos) as IBizPresupuestoCliente;
                  end
                  else
                    APresupuestos := Presupuestos;

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

procedure TfEditorPresupuestosCliente.ModificarInterno;
begin
  inherited;
  FController.Ver(Presupuestos);
end;

procedure TfEditorPresupuestosCliente.NuevoInterno;
begin
  inherited;
  if FController.Anadir(Presupuestos) then
     FController.Ver(Presupuestos);
end;

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

procedure TfEditorPresupuestosCliente.PrevisualizarInterno;
var
  Respuesta : Integer;
  APresupuestos: IBizPresupuestoCliente;
  AllItems: Boolean;
begin
AppFactuGES.ShowCapado;
{
  APresupuestos := 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, (Presupuestos as ISeleccionable).SelectedRecords);
                    APresupuestos := (Controller as IPresupuestosClienteController).ExtraerSeleccionados(Presupuestos) as IBizPresupuestoCliente;
                  end
                  else
                    APresupuestos := Presupuestos;

                  if Assigned(APresupuestos) then
                     FController.Preview(APresupuestos, AllItems);
                end;
      end;
    end;
  end;
  APresupuestos := Nil;
}
end;

procedure TfEditorPresupuestosCliente.SetController(const Value: IPresupuestosClienteController);
begin
  FController := Value;
end;

procedure TfEditorPresupuestosCliente.SetPresupuestos(const Value: IBizPresupuestoCliente);
begin
  FPresupuestos := Value;
  dsDataTable.DataTable := FPresupuestos.DataTable;
  if Assigned(ViewGrid) then
    (ViewGrid as IViewPresupuestosCliente).Presupuestos := Presupuestos;
end;

end.
