unit uDetallesFacturaClienteController;

interface

uses
  uControllerDetallesBase, uBizDetallesFacturaCliente, uIDataModuleFacturasCliente;

type
  IDetallesFacturaClienteController = interface(IControllerDetallesBase)
  ['{D3942A48-C55B-4A98-AC5B-B5E652ED393E}']
    procedure AsignarID(ADetalles: IBizDetallesFacturaCliente; IDCabecera: Integer; AEsNuevo:Boolean);
  end;

  TDetallesFacturaClienteController = class(TControllerDetallesBase, IDetallesFacturaClienteController)
  private
    FDataModule : IDataModuleFacturasCliente;
  public
    procedure AsignarID(ADetalles: IBizDetallesFacturaCliente; IDCabecera: Integer; AEsNuevo:Boolean);
    constructor Create; override;
    destructor Destroy; override;
  end;

implementation

{ TDetallesFacturaClienteController }

uses
  uDataModuleFacturasCliente;

procedure TDetallesFacturaClienteController.AsignarID(ADetalles: IBizDetallesFacturaCliente; IDCabecera: Integer; AEsNuevo:Boolean);
begin
  with ADetalles do
  begin
    DataTable.DisableControls;
    try
      if not DataTable.Active then
        DataTable.Active := True;

      { ¡¡¡¡ OJO !!!!
        Para asignar el ID en los detalles hay
        que tener en cuenta una cosa:
        Si se cambia el ID, ese detalle ya no
        pertenece a esa cabecera porque ya no se
        cumple la condición de la relacion:
          Master.ID = Detail.ID_PRESUPUESTO.

        Por esa razón no sirve hacer un recorrido
        desde el principio hasta el final porque
        las detalles van desapareciendo según asignamos
        el valor al campo ID y nos mueve aleatoriamente
        la posición del registro actual.

        Es mejor hacer un bucle sencillo hasta que
        "se gasten" todos los detalles. Cuando el
        RecordCount llegue a 0 quiere decir que hemos
        tratado todos los detalles.

        El bucle cambia en el caso de ser llamada esta funcion desde modificar
        un presupuesto ya que en ese caso si que hay que hacer un recorrido
        total de las tuplas de detalle.
      }

      if AEsNuevo then
      begin
        while RecordCount > 0 do
        begin
          DataTable.First;
          Edit;
          ID := FDataModule.GetNextID(DataTable.LogicalName);
          ID_FACTURA := IDCabecera;
          Post
        end
      end
      else
      begin
        DataTable.First;
        while not DataTable.EOF do
        begin
          if not AEsNuevo then
          begin
            Edit;
            ID := FDataModule.GetNextID(DataTable.LogicalName);
            ID_FACTURA := IDCabecera;
            Post
          end;
          DataTable.Next
        end;
      end;
    finally
      DataTable.EnableControls;
    end;
  end;
end;

constructor TDetallesFacturaClienteController.Create;
begin
  inherited;
  FDataModule := TDataModuleFacturasCliente.Create(Nil);
end;

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

end.
