unit uEditorAlbaranProveedor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uEditorDBItem, DB, uDADataTable, JvAppStorage,
  JvAppRegistryStorage, JvComponent, JvFormPlacement, ImgList,
  PngImageList, StdActns, ActnList, ComCtrls, TBX, TB2Item, TB2Dock,
  TB2Toolbar, ExtCtrls, JvExControls, JvNavigationPane,
  uCustomView, uViewBase, JvComponentBase,
  StdCtrls, pngimage, AppEvnts, cxControls, cxContainer, cxEdit, cxTextEdit, cxMemo, cxDBEdit,
  uViewIncidencias,
  uAlbaranesProveedorController,
  uViewDetallesBase, uViewDetallesAlbaranProveedor,
  dxLayoutLookAndFeels, JvExComCtrls, JvStatusBar, uViewTotales,
  uIEditorAlbaranProveedor, uBizAlbaranesProveedor, uViewAlbaranProveedor,
  uViewDetallesDTO, uViewDetallesArticulos, uDAInterfaces, cxLabel;

type
  TfEditorAlbaranProveedor = class(TfEditorDBItem, IEditorAlbaranProveedor)
    pagContenido: TTabSheet;
    pagInicidencias: TTabSheet;
    frViewIncidenciasCli: TfrViewIncidencias;
    dxLayoutLookAndFeelList1: TdxLayoutLookAndFeelList;
    dxLayoutOfficeLookAndFeel1: TdxLayoutOfficeLookAndFeel;
    frViewDetallesAlbaranProveedor1: TfrViewDetallesAlbaranProveedor;
    frViewTotales1: TfrViewTotales;

    procedure FormShow(Sender: TObject); 
    procedure CustomEditorClose(Sender: TObject; var Action: TCloseAction);
    procedure pgPaginasChanging(Sender: TObject; var AllowChange: Boolean);
    procedure frViewTotales1edtDescuentoPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure frViewTotales1edtIVAPropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);
    procedure frViewTotales1ePortePropertiesValidate(Sender: TObject;
      var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean);

//    procedure frViewDatosYSeleccionContactoedtlNombrePropertiesChange(Sender: TObject);
  private
    procedure RecalcularPortePorUnidad;

  protected
    FAlbaran: IBizAlbaranProveedor;
    FViewAlbaran: IViewAlbaranProveedor;
    FController : IAlbaranesProveedorController;

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

    function GetAlbaran: IBizAlbaranProveedor;
    procedure SetAlbaran(const Value: IBizAlbaranProveedor); virtual;

    function GetViewAlbaran: IViewAlbaranProveedor;
    procedure SetViewAlbaran(const Value: IViewAlbaranProveedor);

    procedure GuardarInterno; override;
    procedure EliminarInterno; override;
    procedure PrevisualizarInterno; override;
    procedure ImprimirInterno; override;

    property ViewAlbaran: IViewAlbaranProveedor read GetViewAlbaran write SetViewAlbaran;

    procedure OnProveedorChanged(Sender : TObject);

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

implementation

uses
  uViewDatosYSeleccionProveedor, uDataModuleUsuarios, uProveedoresController,
  uBizDireccionesContacto, uDialogUtils, uDataTableUtils, uFactuGES_App;

{$R *.dfm}

{ TfEditorAlbaranProveedor }

{
**************************** TfEditorAlbaranProveedor ****************************
}
procedure TfEditorAlbaranProveedor.AsignarVista;
var
  AViewAlbaranProveedor: TfrViewAlbaranProveedor;

begin
  AViewAlbaranProveedor := TfrViewAlbaranProveedor.create(Self);
  with AViewAlbaranProveedor do
  begin
    Parent := pagGeneral;
    Align := alClient;
    dxLayoutControl1.LookAndFeel := dxLayoutOfficeLookAndFeel1;
  end;
  ViewAlbaran := AViewAlbaranProveedor;
end;

constructor TfEditorAlbaranProveedor.Create(AOwner: TComponent);
begin
  inherited;
  AsignarVista;
  pgPaginas.ActivePageIndex := 0;
end;

procedure TfEditorAlbaranProveedor.CustomEditorClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  FViewAlbaran := NIL;
  FAlbaran := NIL;
end;

destructor TfEditorAlbaranProveedor.Destroy;
begin
  // Utilizar mejor OnClose;
  inherited;
end;

procedure TfEditorAlbaranProveedor.EliminarInterno;
begin
  if (Application.MessageBox('¿Desea borrar este albarán de proveedor?', 'Atención', MB_YESNO) = IDYES) then
  begin
    FController.Eliminar(FAlbaran);
    inherited
  end
end;

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

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

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

  Albaran.DataTable.Active := True;
  pgPaginas.ActivePage := pagGeneral;
end;

procedure TfEditorAlbaranProveedor.frViewTotales1edtDescuentoPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
  FAlbaran.DESCUENTO := DisplayValue;
end;

procedure TfEditorAlbaranProveedor.frViewTotales1edtIVAPropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
  FAlbaran.IVA := DisplayValue;
end;

procedure TfEditorAlbaranProveedor.frViewTotales1ePortePropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  inherited;
  if (not VarIsNull(DisplayValue)) and (length(DisplayValue) > 0) then
    FAlbaran.IMPORTE_PORTE := DisplayValue
  else
    FAlbaran.IMPORTE_PORTE := 0;

  RecalcularPortePorUnidad;
end;

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

function TfEditorAlbaranProveedor.GetAlbaran: IBizAlbaranProveedor;
begin
  Result := FAlbaran;
end;

function TfEditorAlbaranProveedor.GetViewAlbaran: IViewAlbaranProveedor;
begin
  Result := FViewAlbaran;
end;

procedure TfEditorAlbaranProveedor.GuardarInterno;
var
  bEsNuevo : Boolean;
begin
  inherited;

  ShowHourglassCursor;
//  frViewDetallesAlbaranProveedor1.SaveGridStatus;
  frViewDetallesAlbaranProveedor1.BeginUpdate;
  try
    bEsNuevo := FAlbaran.EsNuevo;
    FController.Guardar(FAlbaran);
  finally
    frViewDetallesAlbaranProveedor1.EndUpdate;
//    frViewDetallesAlbaranProveedor1.RestoreGridStatus;
    HideHourglassCursor;
  end;
  if bEsNuevo then
    ShowInfoMessage('El albarán se ha dado de alta con el código ' + FAlbaran.REFERENCIA);

  Modified := False;
end;

procedure TfEditorAlbaranProveedor.ImprimirInterno;
var
  AllItems: Boolean;
begin
  inherited;
  AllItems := False;
  FController.Print(FAlbaran, AllItems);
end;

procedure TfEditorAlbaranProveedor.OnProveedorChanged(Sender: TObject);
begin
  if Assigned(FAlbaran) then
  begin
    FAlbaran.Proveedor := ViewAlbaran.ViewProveedorAlbaran.Proveedor;

    // Si el pedido tiene detalles hay que mirar si los descuentos
    // para los artículos hay que cambiarlos.
    if (FAlbaran.Detalles.RecordCount > 0) then
    begin
       FController.DetallesController.ActualizarDetalles(FAlbaran.Detalles, FAlbaran.Proveedor);
    end;
  end;
end;

procedure TfEditorAlbaranProveedor.pgPaginasChanging(Sender: TObject; var AllowChange: Boolean);
begin
  inherited;
  if (not Assigned(FAlbaran))
  or (FAlbaran.ID_PROVEEDOR = 0) then
  begin
    ShowWarningMessage('Antes de introducir conceptos debe elegir un proveedor para este albarán');
    AllowChange := False;
  end;
end;

procedure TfEditorAlbaranProveedor.PonerTitulos(const ATitulo: string);
var
  FTitulo : String;
begin
  FTitulo := ATitulo;
  if (FTitulo = '') and Assigned(FAlbaran) then
  begin
      if FAlbaran.EsNuevo then
         FTitulo := 'Nuevo albarán de proveedor'
      else
         FTitulo := 'Albarán de proveedor'  + ' - ' + FAlbaran.Proveedor.Nombre
  end;

  inherited PonerTitulos(FTitulo);
  Self.Caption := FTitulo + ' (' + AppFactuGES.EmpresaActiva.NOMBRE + ')';
end;

procedure TfEditorAlbaranProveedor.PrevisualizarInterno;
var
  AllItems: Boolean;
begin
  inherited;
  AllItems := False;
  FController.Preview(FAlbaran, AllItems);
end;

procedure TfEditorAlbaranProveedor.RecalcularPortePorUnidad;
begin
  //Esta lógica se llamará en el editor porque es para facilitar el rellenado de información del documento
  //no puede ir en la clase de negocio porque no es una lógica que tenga sentido fuera del editor.
  if Assigned(Controller)
  and Assigned(Controller.DetallesController) then
      Controller.DetallesController.DesglosarPorteDetalles(FAlbaran.IMPORTE_PORTE, FAlbaran.Detalles)
end;

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

  if Assigned(FController) then
  begin
    frViewDetallesAlbaranProveedor1.Controller := Controller.DetallesController;
  end;
end;

procedure TfEditorAlbaranProveedor.SetAlbaran(const Value: IBizAlbaranProveedor);
begin
  FAlbaran := Value;

  if Assigned(FAlbaran) then
  begin
    dsDataTable.DataTable := FAlbaran.DataTable;
    frViewTotales1.DADataSource.DataTable := dsDataTable.DataTable;
    frViewIncidenciasCli.DADataSource.DataTable := dsDataTable.DataTable;

    if Assigned(FViewAlbaran) then
    begin
      ViewAlbaran.ViewProveedorAlbaran.OnProveedorChanged := NIL;
      try
        FViewAlbaran.Albaran := FAlbaran;
        frViewDetallesAlbaranProveedor1.Detalles := FAlbaran.Detalles;
        frViewDetallesAlbaranProveedor1.Albaran := FAlbaran; //Para poder sacar los descuento del articulos segun el proveedor seleccionado
      finally
        ViewAlbaran.ViewProveedorAlbaran.OnProveedorChanged := OnProveedorChanged;
      end;
    end;
  end;
end;

procedure TfEditorAlbaranProveedor.SetViewAlbaran(const Value: IViewAlbaranProveedor);
begin
  FViewAlbaran := Value;

  if Assigned(FViewAlbaran) and Assigned(Albaran) then
    FViewAlbaran.Albaran := Albaran;
end;

end.
