unit uEditorPedidosProveedor;

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,
  uBizPedidosProveedor, uIEditorPedidosProveedor, uPedidosProveedorController,
  uCustomView, uViewBase, uViewBarraSeleccion, uViewGridBase,
  uViewPedidosProveedor, JvExComCtrls, JvStatusBar, JSDialog, uDAInterfaces;

type
  TfEditorPedidosProveedor = class(TfEditorGridBase, IEditorPedidosProveedor)
    frViewPedidosProveedor1: TfrViewPedidosProveedor;
    N4: TMenuItem;
    Cambiarsituacin1: TMenuItem;
    actRecibirPedido: TAction;
    JsNuevoPedidoProveedorDialog: TJSDialog;
    JsPrevisualizarDialog: TJSDialog;
    JsImprimirDialog: TJSDialog;
    TBXItem39: TTBXItem;
    JsListaPedidosNoEliminados: TJSDialog;
    actEnviarEMail: TAction;
    TBXItem38: TTBXItem;
    procedure FormShow(Sender: TObject);
    procedure actCambiarSituacionExecute(Sender: TObject);
    procedure actRecibirPedidoUpdate(Sender: TObject);
    procedure actRecibirPedidoExecute(Sender: TObject);
    procedure actEliminarUpdate(Sender: TObject);
    procedure actEnviarEMailExecute(Sender: TObject);
    procedure actEnviarEMailUpdate(Sender: TObject);

  protected
    FPedidos: IBizPedidoProveedor;
    FController : IPedidosProveedorController;

    function GetPedidos: IBizPedidoProveedor;
    procedure SetPedidos(const Value: IBizPedidoProveedor);

    function GetController : IPedidosProveedorController; virtual;
    procedure SetController (const Value : IPedidosProveedorController); virtual;
    procedure NuevoInterno; override;
    procedure ModificarInterno; override;
    procedure EliminarInterno; override;
    procedure DuplicarInterno; override;
    procedure ImprimirInterno; override;
    procedure PrevisualizarInterno; override;

    procedure AsignarVista; virtual;
  public
    procedure PonerTitulos(const ATitulo: string = ''); override;

    property Pedidos: IBizPedidoProveedor read GetPedidos write SetPedidos;
    property Controller : IPedidosProveedorController read GetController write SetController;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  uDataModulePedidosProveedor, uDataModuleUsuarios, uFactuGES_App, uEditorDBBase,
//  uInventarioController, uBizInventario,
  uDialogUtils, uGridUtils, uDBSelectionListUtils;
//  uAlbaranesProveedorController, uBizAlbaranesProveedor,
//  uGenerarPedidosProvUtils, uGenerarAlbaranesProvUtils;

{$R *.dfm}

{
*************************** TfEditorPedidosProveedor ***************************
}
procedure TfEditorPedidosProveedor.actCambiarSituacionExecute(Sender: TObject);
begin
{
  inherited;
  FController.CambiarSituacion(FPedidos)
}
end;

procedure TfEditorPedidosProveedor.actEliminarUpdate(Sender: TObject);
begin
  inherited;
  if (Sender as TAction).Enabled then
     (Sender as TAction).Enabled := (FPedidos.SITUACION = SITUACION_PEDIDO_PENDIENTE);
end;

procedure TfEditorPedidosProveedor.actEnviarEMailExecute(Sender: TObject);
begin
  inherited;
  FController.EnviarPedidoPorEMail(FPedidos);
end;

procedure TfEditorPedidosProveedor.actEnviarEMailUpdate(Sender: TObject);
begin
  inherited;
  if HayDatos and Assigned(ViewGrid) then
    (Sender as TAction).Enabled := ViewGrid.EsSeleccionCeldaDatos
      and (ViewGrid.NumSeleccionados > 0)
  else
    (Sender as TAction).Enabled := False;
end;

procedure TfEditorPedidosProveedor.actRecibirPedidoExecute(Sender: TObject);
begin

  inherited;
//  RecibirPedidoProv(FPedidos);

  try
      FController.CambiarSituacion(FPedidos, SITUACION_PEDIDO_RECIBIDO, Now);
  except
    on E : Exception do
      ShowErrorMessage('Error al cambiar la situación del pedido', E.Message, E);
  end;
  actRefrescar.Execute;
end;

procedure TfEditorPedidosProveedor.actRecibirPedidoUpdate(Sender: TObject);
begin
  inherited;
  (Sender as TAction).Enabled := HayDatos and
                                 not (ViewGrid.NumSeleccionados > 1) and
                                 ViewGrid.esSeleccionCeldaDatos and
                                (FPedidos.SITUACION = SITUACION_PEDIDO_PENDIENTE);
end;

procedure TfEditorPedidosProveedor.AsignarVista;
begin
//  ViewGrid := frViewPedidosProveedor1; //CreateView(TfrViewPedidosProveedor) as IViewPedidosProveedor;
  ViewGrid := CreateView(TfrViewPedidosProveedor) as IViewPedidosProveedor;
end;

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

//  FHeaderText := 'Lista de pedidos a proveedor';
//  FWindowCaption := FHeaderText;

  AsignarVista;
end;

destructor TfEditorPedidosProveedor.Destroy;
begin
  FPedidos := NIL;
  FController := NIL;
  inherited;
end;

procedure TfEditorPedidosProveedor.DuplicarInterno;
var
  APedido : IBizPedidoProveedor;
  ConMismoContrato : Boolean;

begin
  inherited;

  ConMismoContrato := (ShowConfirmMessage('Atención', Format('¿Desea asignar el mismo contrato de cliente %s al nuevo pedidos a proveedor?', [Pedidos.REF_CON_CLIENTE])) = IDYES);

  APedido := FController.Duplicar(Pedidos, ConMismoContrato);
  try
    FController.Ver(APedido);
  finally
    actRefrescar.Execute;
  end;
end;

procedure TfEditorPedidosProveedor.EliminarInterno;
var
  APedidos: IBizPedidoProveedor;
  AllItems: Boolean;
begin
  APedidos := Nil;
  AllItems := False;

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

  if AllItems then
  begin
    if (Application.MessageBox('¿Desea borrar los pedidos de proveedor seleccionados?', 'Atención', MB_YESNO) = IDYES) then
    begin
      SeleccionarFilasDesdeGrid(ViewGrid._FocusedView, (Pedidos as ISeleccionable).SelectedRecords);
      APedidos := (Controller as IPedidosProveedorController).ExtraerSeleccionados(Pedidos) as IBizPedidoProveedor;
    end
  end
  else begin
    if (Application.MessageBox('¿Desea borrar el pedido de proveedor seleccionado?', 'Atención', MB_YESNO) = IDYES) then
        APedidos := Pedidos;
  end;

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

  ViewGrid.GotoFirst;
end;

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

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

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

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

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

function TfEditorPedidosProveedor.GetPedidos: IBizPedidoProveedor;
begin
  Result := FPedidos;
end;

procedure TfEditorPedidosProveedor.ImprimirInterno;
var
  Respuesta : Integer;
  APedidos: IBizPedidoProveedor;
  AllItems: Boolean;
begin
  APedidos := 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, (Pedidos as ISeleccionable).SelectedRecords);
                    APedidos := (Controller as IPedidosProveedorController).ExtraerSeleccionados(Pedidos) as IBizPedidoProveedor;
                  end
                  else
                    APedidos := Pedidos;

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

end;

procedure TfEditorPedidosProveedor.ModificarInterno;
begin
  inherited;
  FController.Ver(Pedidos);
end;

procedure TfEditorPedidosProveedor.NuevoInterno;
var
  Respuesta : Integer;

begin
  inherited;
  FController.Anadir(Pedidos);
  FController.Ver(Pedidos);
//TEMPORAL
  actRefrescar.Execute;
end;

procedure TfEditorPedidosProveedor.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  if (ATitulo = '') then
     FTitulo := 'Lista de pedidos a proveedor - ' + AppFactuGES.EmpresaActiva.NOMBRE
  else
     FTitulo := ATitulo;

  inherited PonerTitulos(FTitulo);
end;

procedure TfEditorPedidosProveedor.PrevisualizarInterno;
var
  Respuesta : Integer;
  APedidos: IBizPedidoProveedor;
  AllItems: Boolean;
begin
  APedidos := 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, (Pedidos as ISeleccionable).SelectedRecords);
                    APedidos := (Controller as IPedidosProveedorController).ExtraerSeleccionados(Pedidos) as IBizPedidoProveedor;
                  end
                  else
                    APedidos := Pedidos;

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

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

procedure TfEditorPedidosProveedor.SetPedidos(const Value: IBizPedidoProveedor);
begin
  FPedidos := Value;
  dsDataTable.DataTable := FPedidos.DataTable;
  if Assigned(ViewGrid) then
    (ViewGrid as IViewPedidosProveedor).Pedidos := Pedidos;
end;

end.
  