unit uBizContactos;

interface

uses
  uDAInterfaces, uDADataTable,
  schContactosClient_Intf, uBizDatosBancarios, uBizCategoriasContacto,
  uDBSelectionListUtils;

const
  BIZ_CLIENT_CONTACTO = 'Client.Contacto';
  BIZ_CLIENT_CLIENTE = 'Client.Cliente';
  BIZ_CLIENT_PROVEEDOR = 'Client.Proveedor';
  BIZ_CLIENT_VENDEDOR = 'Client.Vendedor';
  BIZ_CLIENT_INSTALADOR = 'Client.Instalador';

  CATEGORIA_CLIENTE = 1;
  CATEGORIA_PROVEEDOR = 2;
  CATEGORIA_VENDEDOR = 3;
  CATEGORIA_INSTALADOR = 4;

type
  IBizContacto = interface (IContactos)
    ['{D0373875-7F16-4772-9DA9-C1A1CA218120}']
    procedure SetDatosBancarios(AValue : IBizDatosBancarios);
    function GetDatosBancarios : IBizDatosBancarios;
    property DatosBancarios : IBizDatosBancarios read GetDatosBancarios
      write SetDatosBancarios;

    function GetCategoria : String;
    property Categoria : String read GetCategoria;

    function _GetCategorias: IBizCategoriasContacto;
    procedure _SetCategorias(const Value: IBizCategoriasContacto);
    property _Categorias : IBizCategoriasContacto read _GetCategorias
      write _SetCategorias;

    function GetSelectedRecords: ISelectedRecords;
    property SelectedRecords : ISelectedRecords read GetSelectedRecords;

    function EsNuevo : Boolean;    
  end;

  IBizCliente = interface (IBizContacto)
    ['{CF183EF1-DF27-491C-AEE3-F17AABBA6541}']
    function GetID_VENDEDORValue: Integer;
    procedure SetID_VENDEDORValue(const aValue: Integer);
    function GetPROCEDENCIAValue: String;
    procedure SetPROCEDENCIAValue(const aValue: String);

    property ID_VENDEDOR: Integer read GetID_VENDEDORValue write SetID_VENDEDORValue;
    property PROCEDENCIA: String read GetPROCEDENCIAValue write SetPROCEDENCIAValue;
  end;

  IBizProveedor = interface (IBizContacto)
    ['{0DA195B8-70DE-4DD0-BCD9-44BE30522DD7}']
    function GetDISTRIBUYEValue: String;
    procedure SetDISTRIBUYEValue(const aValue: String);
    function GetDESCUENTOValue: Float;
    procedure SetDESCUENTOValue(const aValue: Float);

    property DISTRIBUYE: String read GetDISTRIBUYEValue write SetDISTRIBUYEValue;
    property DESCUENTO: Float read GetDESCUENTOValue write SetDESCUENTOValue;
  end;

  IBizInstalador = interface (IBizContacto)
    ['{2B1B8D9D-2A26-4970-9B7C-9D585B8030DB}']
  end;

  IBizVendedor = interface (IBizContacto)
    ['{31F93CBB-CE69-4621-9BD7-C79D302A2F58}']
    function GetPORCENTAJE_COMISIONValue: Float;
    procedure SetPORCENTAJE_COMISIONValue(const aValue: Float);

    property PORCENTAJE_COMISION: Float read GetPORCENTAJE_COMISIONValue write SetPORCENTAJE_COMISIONValue;    
  end;


  TBizContacto = class(TContactosDataTableRules, IBizContacto, ISelectedRecords)
  private
    function GetSelected: Boolean;
    procedure SetSelected(const Value: Boolean);
  protected
    FDatosBancarios : IBizDatosBancarios;
    FDatosBancariosLink : TDADataSource;
    FCategorias : IBizCategoriasContacto;
    FCategoriasLink : TDADataSource;

    FSelectedRecords : TSelectedRecords;
    
    function _GetCategorias: IBizCategoriasContacto;
    procedure _SetCategorias(const Value: IBizCategoriasContacto);

    procedure SetDatosBancarios(AValue : IBizDatosBancarios);
    function GetDatosBancarios : IBizDatosBancarios;
    function GetCategoria : String;

    procedure OnNewRecord(Sender: TDADataTable); override;
  public
    function EsNuevo : Boolean;
    procedure IniciarValoresContactoNuevo; virtual;
    constructor Create(aDataTable: TDADataTable); override;
    destructor Destroy; override;
    property Categoria : String read GetCategoria;

    property _Categorias : IBizCategoriasContacto read _GetCategorias
      write _SetCategorias;

    property DatosBancarios : IBizDatosBancarios read GetDatosBancarios
      write SetDatosBancarios;

    function GetSelectedRecords: ISelectedRecords;
    property SelectedRecords : ISelectedRecords read GetSelectedRecords implements ISelectedRecords;

    property Selected : Boolean read GetSelected write SetSelected;
  end;

  TBizCliente = class(TBizContacto, IBizCliente)
  protected
    function GetID_VENDEDORValue: Integer; virtual;
    procedure SetID_VENDEDORValue(const aValue: Integer); virtual;
    function GetPROCEDENCIAValue: String; virtual;
    procedure SetPROCEDENCIAValue(const aValue: String); virtual;
    
    property ID_VENDEDOR: Integer read GetID_VENDEDORValue write SetID_VENDEDORValue;
    property PROCEDENCIA: String read GetPROCEDENCIAValue write SetPROCEDENCIAValue;
  public
    procedure IniciarValoresContactoNuevo; override;
  end;

  TBizProveedor = class(TBizContacto, IBizProveedor)
  protected
    function GetDISTRIBUYEValue: String; virtual;
    procedure SetDISTRIBUYEValue(const aValue: String); virtual;
    function GetDESCUENTOValue: Float; virtual;
    procedure SetDESCUENTOValue(const aValue: Float); virtual;

    property DISTRIBUYE: String read GetDISTRIBUYEValue write SetDISTRIBUYEValue;
    property DESCUENTO: Float read GetDESCUENTOValue write SetDESCUENTOValue;
  public
    procedure IniciarValoresContactoNuevo; override;
  end;

  TBizInstalador = class(TBizContacto, IBizInstalador)
  public
    procedure IniciarValoresContactoNuevo; override;
  end;

  TBizVendedor = class(TBizContacto, IBizVendedor)
  protected
    function GetPORCENTAJE_COMISIONValue: Float; virtual;
    procedure SetPORCENTAJE_COMISIONValue(const aValue: Float); virtual;

    property PORCENTAJE_COMISION: Float read GetPORCENTAJE_COMISIONValue write SetPORCENTAJE_COMISIONValue;
  public
    procedure IniciarValoresContactoNuevo; override;
  end;


implementation

uses
  uDataTableUtils, Classes, DateUtils, SysUtils, uDataModuleUsuarios;

{ TBizContacto }

function TBizContacto.GetSelected: Boolean;
begin
  Result := FSelectedRecords.CurrentRowSelected
end;

procedure TBizContacto.SetSelected(const Value: Boolean);
begin
  FSelectedRecords.CurrentRowSelected := True;
end;


constructor TBizContacto.Create(aDataTable: TDADataTable);
begin
  inherited;
  FCategoriasLink := TDADataSource.Create(NIL);
  FCategoriasLink.DataTable := aDataTable;

  FDatosBancariosLink := TDADataSource.Create(NIL);
  FDatosBancariosLink.DataTable := aDataTable;

  FSelectedRecords := TSelectedRecords.Create(aDataTable);
end;

destructor TBizContacto.Destroy;
begin
  FCategorias := NIL;
  FCategoriasLink.Free;

  FDatosBancarios := NIL;
  FDatosBancariosLink.Free;

  FreeAndNIL(FSelectedRecords);  
  inherited;
end;

function TBizContacto.EsNuevo: Boolean;
begin
  Result := (ID < 0);
end;

function TBizContacto.GetCategoria: String;
begin
  case ID_CATEGORIA of
    1   : Result := 'Cliente';
    2   : Result := 'Proveedor';
    3   : Result := 'Vendedor';
    4   : Result := 'Instalador';
  end;
end;

function TBizContacto.GetDatosBancarios: IBizDatosBancarios;
begin
  Result := FDatosBancarios;
end;

function TBizContacto.GetSelectedRecords: ISelectedRecords;
begin
  Result := FSelectedRecords;
end;

procedure TBizContacto.IniciarValoresContactoNuevo;
begin
  //
  USUARIO := dmUsuarios.LoginInfo.Usuario;
end;

procedure TBizContacto.OnNewRecord(Sender: TDADataTable);
begin
  inherited;
  ID := GetRecNo; // -1, -2, -3...
  IniciarValoresContactoNuevo;
end;

procedure TBizContacto.SetDatosBancarios(AValue: IBizDatosBancarios);
begin
  FDatosBancarios := AValue;
  EnlazarMaestroDetalle(FDatosBancariosLink, FDatosBancarios);
end;

function TBizContacto._GetCategorias: IBizCategoriasContacto;
begin
  Result := FCategorias;
end;

procedure TBizContacto._SetCategorias(const Value: IBizCategoriasContacto);
begin
  FCategorias := Value;
  EnlazarMaestroDetalle(FCategoriasLink, FCategorias);
end;

{ TBizCliente }

function TBizCliente.GetID_VENDEDORValue: Integer;
begin
  result := DataTable.Fields[idx_ClientesID_VENDEDOR].AsInteger;
end;

procedure TBizCliente.SetID_VENDEDORValue(const aValue: Integer);
begin
  DataTable.Fields[idx_ClientesID_VENDEDOR].AsInteger := aValue;
end;

function TBizCliente.GetPROCEDENCIAValue: String;
begin
  result := DataTable.Fields[idx_ClientesPROCEDENCIA].AsString;
end;

procedure TBizCliente.IniciarValoresContactoNuevo;
begin
  inherited;
  ID_CATEGORIA := CATEGORIA_CLIENTE;
end;

procedure TBizCliente.SetPROCEDENCIAValue(const aValue: String);
begin
  DataTable.Fields[idx_ClientesPROCEDENCIA].AsString := aValue;
end;

{ TBizInstalador }

procedure TBizInstalador.IniciarValoresContactoNuevo;
begin
  inherited;
  ID_CATEGORIA := CATEGORIA_INSTALADOR;
end;

{ TBizProveedor }

function TBizProveedor.GetDISTRIBUYEValue: String;
begin
  result := DataTable.Fields[idx_ProveedoresDISTRIBUYE].AsString;
end;

procedure TBizProveedor.IniciarValoresContactoNuevo;
begin
  inherited;
  ID_CATEGORIA := CATEGORIA_PROVEEDOR;
end;

procedure TBizProveedor.SetDISTRIBUYEValue(const aValue: String);
begin
  DataTable.Fields[idx_ProveedoresDISTRIBUYE].AsString := aValue;
end;

function TBizProveedor.GetDESCUENTOValue: Float;
begin
  result := DataTable.Fields[idx_ProveedoresDESCUENTO].AsFloat;
end;

procedure TBizProveedor.SetDESCUENTOValue(const aValue: Float);
begin
  DataTable.Fields[idx_ProveedoresDESCUENTO].AsFloat := aValue;
end;

{ TBizVendedor }

function TBizVendedor.GetPORCENTAJE_COMISIONValue: Float;
begin
  result := DataTable.Fields[idx_VendedoresPORCENTAJE_COMISION].AsFloat;
end;

procedure TBizVendedor.SetPORCENTAJE_COMISIONValue(const aValue: Float);
begin
  DataTable.Fields[idx_VendedoresPORCENTAJE_COMISION].AsFloat := aValue;
end;

procedure TBizVendedor.IniciarValoresContactoNuevo;
begin
  inherited;
  ID_CATEGORIA := CATEGORIA_VENDEDOR;
end;


initialization
  RegisterDataTableRules(BIZ_CLIENT_CONTACTO, TBizContacto);

  RegisterDataTableRules(BIZ_CLIENT_CLIENTE, TBizCliente);
  RegisterDataTableRules(BIZ_CLIENT_PROVEEDOR, TBizProveedor);
  RegisterDataTableRules(BIZ_CLIENT_VENDEDOR, TBizVendedor);
  RegisterDataTableRules(BIZ_CLIENT_INSTALADOR, TBizInstalador);

finalization

end.
