unit uDetallesFacturaProveedorController;

interface

uses
  uDADataTable, uControllerDetallesArticulos, uBizDetallesFacturaProveedor, uIDataModuleFacturasProveedor,
  uBizContactos, uBizArticulos;

type
  IDetallesFacturaProveedorController = interface(IControllerDetallesArticulos)
  ['{49F6199E-E031-42F5-AEA5-E70C3E3479A1}']
    procedure AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor); overload;
    procedure ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor);
    procedure AnadirDetalleFacturaAsociadaAbono(ADetalles: IBizDetallesFacturaProveedor; AReferencia: String; AFecha: String);
  end;

  TDetallesFacturaProveedorController = class(TControllerDetallesArticulos, IDetallesFacturaProveedorController)
  private
    FDataModule : IDataModuleFacturasProveedor;
  protected
    procedure AsignarDatos(ADetalles: IDAStronglyTypedDataTable; IDCabecera: Integer); override;
    procedure RellenarDescuentos(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); overload; override;
    procedure RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); override;

    procedure AsignarController; override;

  public
    procedure AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor); overload;
    procedure ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor); overload;
    procedure AnadirDetalleFacturaAsociadaAbono(ADetalles: IBizDetallesFacturaProveedor; AReferencia: String; AFecha: String);
    constructor Create; override;
    destructor Destroy; override;
  end;

implementation

{ TDetallesFacturaProveedorController }

uses Variants, uControllerDetallesDTO, uDataModuleFacturasProveedor, uArticulosFacturaProveedorController,
  uControllerDetallesBase, Dialogs, SysUtils, uDialogUtils;

procedure TDetallesFacturaProveedorController.ActualizarDetalles(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor);
var
  AArticulos : IBizArticulo;
begin
  if Assigned(ADetalles) then
  begin
    try
      AArticulos := (FArticulosController.BuscarTodos(AProveedor) as IBizArticulo);
      ActualizarDetalles(ADetalles, AArticulos);
      EliminarArticulosProveedor(ADetalles);
      ShowInfoMessage('Se han eliminado todos los artículos que no pertenecen al nuevo proveedor seleccionado, y los que pertenecen sus descuentos han sido adaptados al proveedor seleccionado');
    finally
      AArticulos := Nil;
    end;
  end;
end;

procedure TDetallesFacturaProveedorController.AnadirArticulos(ADetalles: IDAStronglyTypedDataTable; AProveedor: IBizProveedor);
var
  AArticulos: IBizArticulo;
begin
  if Assigned(ADetalles) then
  begin
    AArticulos := (FArticulosController.BuscarTodos as IBizArticulo);
    try
      AArticulos := (FArticulosController as IArticulosFacturaProveedorController).ElegirArticulos(AArticulos, 'Elija los artículos que desea añadir a esta factura de Proveedor', True, AProveedor);
      Add(ADetalles, AArticulos);
    finally
      AArticulos := Nil;
    end;
  end;
end;

procedure TDetallesFacturaProveedorController.AnadirDetalleFacturaAsociadaAbono(
  ADetalles: IBizDetallesFacturaProveedor; AReferencia, AFecha: String);
begin
  AnadirConceptoInicial(ADetalles, 'ABONO DE FACTURA ' + AReferencia + ' con fecha ' + AFecha);
end;

procedure TDetallesFacturaProveedorController.AsignarController;
begin
  FArticulosController := TArticulosFacturaProveedorController.Create;
end;

procedure TDetallesFacturaProveedorController.AsignarDatos(ADetalles: IDAStronglyTypedDataTable; IDCabecera: Integer);
begin
  inherited;

  with (ADetalles as IBizDetallesFacturaProveedor) do
  begin
    Edit;
    ID := FDataModule.GetNextID(DataTable.LogicalName);
    ID_FACTURA := IDCabecera;
    Post
  end;
end;

constructor TDetallesFacturaProveedorController.Create;
begin
  inherited;
  FDataModule := TDataModuleFacturasProveedor.Create(Nil);
end;

destructor TDetallesFacturaProveedorController.Destroy;
begin
  FDataModule := Nil;
  inherited;
end;

procedure TDetallesFacturaProveedorController.RellenarDescuentos(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo);
begin
  if Assigned(AArticulos) then
    RellenarDescuento(ADetalles, AArticulos.DESCUENTO)
  else
    RellenarDescuento(ADetalles, 0)
end;

procedure TDetallesFacturaProveedorController.RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo);
begin
  if Assigned(AArticulos) then
  begin
    ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_COSTE;
    ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_PORTE).AsVariant := AArticulos.PRECIO_PORTE
  end
  else
  begin
    ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := Null;
    ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_PORTE).AsVariant := Null
  end;
end;

end.
