unit uDireccionesContactoController;

interface

uses
  Windows, Forms, Classes, Controls, Contnrs, SysUtils, uDADataTable,
  uBizContactos, uBizDireccionesContacto, uIDataModuleContactos;

type
  IDireccionesContactoController = interface
  ['{9B6CB172-F32C-414F-A0E2-99920CAF88FB}']
    procedure AsignarID(ADetalles: IBizDireccionesContacto; IDCabecera: Integer; AEsNuevo:Boolean);
    procedure CopiarDireccionFiscal(AContacto: IBizContacto; ADireccion: IBizDireccionesContacto; AAnadir : Boolean = True); 
    procedure Ver(ADireccion : IBizDireccionesContacto);
    function Localizar(ADirecciones: IBizDireccionesContacto; const ID : Integer): Boolean;    
  end;

  TDireccionesContactoController = class(TInterfacedObject, IDireccionesContactoController)
  private
    FDataModule : IDataModuleContactos;
  public
    procedure CopiarDireccionFiscal(AContacto: IBizContacto; ADireccion: IBizDireccionesContacto; AAnadir : Boolean = True);
    procedure Ver(ADireccion : IBizDireccionesContacto);
    procedure AsignarID(ADetalles: IBizDireccionesContacto; IDCabecera: Integer; AEsNuevo:Boolean);
    function Localizar(ADirecciones: IBizDireccionesContacto; const ID : Integer): Boolean;
    constructor Create; virtual;
    destructor Destroy; override;
  end;

implementation

{ TDireccionesContactoController }

uses
  uDataModuleContactos, schContactosClient_Intf, uIEditorDireccionContacto,
  uEditorRegistryUtils, cxControls;

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

//        AuxPosicion := POSICION;

      { ¡¡¡¡ 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_CONTACTO := IDCabecera;
          Post
        end
      end
      else
      begin
        DataTable.First;
        while not DataTable.EOF do
        begin
          if AEsNuevo then
          begin
            Edit;
            ID := FDataModule.GetNextID(DataTable.LogicalName);
            ID_CONTACTO := IDCabecera;
            Post
          end;
          DataTable.Next
        end;
      end;
    finally
      DataTable.EnableControls;
    end;
  end;
end;

procedure TDireccionesContactoController.CopiarDireccionFiscal(
  AContacto: IBizContacto; ADireccion: IBizDireccionesContacto;
  AAnadir: Boolean);
begin
  if not Assigned(AContacto) then
    raise Exception.Create ('Contacto no asignado (CopiarDireccionFiscal)');

  if not Assigned(ADireccion) then
    raise Exception.Create ('Dirección no asignada (CopiarDireccionFiscal)');
    
  if AAnadir then
    ADireccion.DataTable.Insert
  else
    ADireccion.DataTable.Edit;
  try
    with ADireccion do
    begin
      NOMBRE := 'Dirección de entrega';
      CALLE := AContacto.CALLE;
      POBLACION := AContacto.POBLACION;
      PROVINCIA := AContacto.PROVINCIA;
      CODIGO_POSTAL := AContacto.CODIGO_POSTAL;
      TELEFONO := AContacto.TELEFONO_1;
      EMAIL := AContacto.EMAIL_1;
    end;
  finally
    ADireccion.DataTable.Post;
  end;
end;

constructor TDireccionesContactoController.Create;
begin
  inherited;
  FDataModule := TDataModuleContactos.Create(Nil);
end;

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

function TDireccionesContactoController.Localizar(
  ADirecciones: IBizDireccionesContacto; const ID: Integer): Boolean;
begin
  Result := True;
  ShowHourglassCursor;
  try
    with ADirecciones.DataTable do
    begin
      DisableControls;
      First;
      if not Locate(fld_DireccionesContactoID, ID, []) then
         Result := False;
      EnableControls;
    end;
  finally
    HideHourglassCursor;
  end;
end;

procedure TDireccionesContactoController.Ver(
  ADireccion: IBizDireccionesContacto);
var
  AEditor : IEditorEditorDireccion;
begin
  AEditor := NIL;	
  ShowHourglassCursor;
  try
    CreateEditor('EditorDireccion', IEditorEditorDireccion, AEditor);
    with AEditor do
    begin
         Direccion := ADireccion;
         Controller := Self;
    end;
  finally
    HideHourglassCursor;
  end;
  
  if Assigned(AEditor) then
    try
      AEditor.ShowModal;
      AEditor.Release;
    finally
      AEditor := NIL;
    end; 
end;
end.
