unit uBizClientesServer;

interface

uses
  schContactosServer_Intf, uDAInterfaces, uDADelta,
  uDADataTable, uDABusinessProcessor, uBizContactosServer;

const
  BIZ_SERVER_CLIENTE = 'Server.Cliente';

type
  TBizClienteServer = class(TBizContactosServer)
  private
    FReferenciaAutomatica : Boolean;
    function DarReferencia : String;
    function IncrementarReferencia : Boolean;
    procedure CrearCuentaContable(aChange: TDADeltaChange);
  protected
    procedure Insert_Datos_Contacto(aChange: TDADeltaChange); override;
    procedure Update_Datos_Contacto(aChange: TDADeltaChange); override;
    procedure Delete_Datos_Contacto(aChange: TDADeltaChange); override;

    procedure BeforeProcessDelta(Sender: TDABusinessProcessor; const aDelta: IDADelta); override;
    procedure AfterProcessChange(Sender: TDABusinessProcessor; aChange: TDADeltaChange; Processed: Boolean; var CanRemoveFromDelta: Boolean); override;
  end;

implementation

uses
  uDataModuleServer, uDAClasses, srvContabilidad_Impl,
  schContactosClient_Intf, uBusinessUtils, FactuGES_Intf,
  uROServer, SysUtils;

const
  REF_CLIENTE = 'REF_CLIENTE';

{ TBizClienteServer }

procedure TBizClienteServer.AfterProcessChange(Sender: TDABusinessProcessor; aChange: TDADeltaChange; Processed: Boolean; var CanRemoveFromDelta: Boolean);
begin
  inherited;

  // Actualizamos el contador de referencias.
  case aChange.ChangeType of
    ctInsert, ctUpdate: begin
                          if FReferenciaAutomatica then
                          begin
                            IncrementarReferencia;
                            FReferenciaAutomatica := False;
                          end;
                        end;
  end;
end;

procedure TBizClienteServer.CrearCuentaContable(aChange: TDADeltaChange);
var
  AContabilidadService : IsrvContabilidad;
  Intf : IInterface;
  AClientID : TGUID;

  ANombre: string;
  AIDEmpresa: Integer;
  AIDCliente: Integer;
  AIDTienda: Integer;
begin
  AIDCliente := aChange.NewValueByName[fld_ClientesID];
  AIDTienda := aChange.NewValueByName[fld_ClientesID_TIENDA];
  AIDEmpresa := aChange.NewValueByName[fld_ClientesID_EMPRESA];
  ANombre := aChange.NewValueByName[fld_ClientesNOMBRE];

  CreateGUID(AClientID);
  GetClassFactory('srvContabilidad').CreateInstance(AClientID, Intf);
  AContabilidadService := Intf as IsrvContabilidad;

  if not AContabilidadService.TieneCuentaAsociada(AIDCliente, AIDEmpresa) then
    AContabilidadService.AnadirSubCuentaCliente(AIDCliente, AIDTienda, AIDEmpresa, ANombre);
end;

procedure TBizClienteServer.BeforeProcessDelta(Sender: TDABusinessProcessor; const aDelta: IDADelta);
begin
  FReferenciaAutomatica := False;

  case Sender.CurrentChange.ChangeType of
    ctInsert, ctUpdate: begin
      //Si la referencia no ha sido asignada le asignamos una nosotros
      if REFERENCIAIsNull or (Length(REFERENCIA) = 0) then
      begin
        FReferenciaAutomatica := True;
        REFERENCIA := DarReferencia;
      end;
    end;
  end;
end;

function TBizClienteServer.DarReferencia: String;
begin
  Result := _DarReferenciaInterna(REF_CLIENTE);
end;

procedure TBizClienteServer.Delete_Datos_Contacto(aChange: TDADeltaChange);
var
  ASchema : TDASchema;
  ACurrentConn : IDAConnection;
  ACommand : IDASQLCommand;
begin
  inherited;

  ASchema := BusinessProcessor.Schema;
  ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor);

  ACommand := ASchema.NewCommand(ACurrentConn, 'Delete_ClientesDatos');
  try
    with ACommand do
    begin
      ParamByName('OLD_ID_CLIENTE').Value := aChange.OldValueByName[fld_ClientesID];
      Execute;
    end;
  finally
    ACommand := NIL;
  end;
end;

function TBizClienteServer.IncrementarReferencia: Boolean;
begin
  Result := _IncrementarReferenciaInterna(REF_CLIENTE);
end;

procedure TBizClienteServer.Insert_Datos_Contacto(aChange: TDADeltaChange);
var
  ASchema : TDASchema;
  ACurrentConn : IDAConnection;
  ACommand : IDASQLCommand;
begin
  inherited;

  ASchema := BusinessProcessor.Schema;
  ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor);

  ACommand := ASchema.NewCommand(ACurrentConn, 'Insert_ClientesDatos');
  try
    with ACommand do
    begin
      ParamByName('ID_CLIENTE').Value := aChange.NewValueByName[fld_ClientesID];
//      ParamByName('ID_AGENTE').Value := aChange.NewValueByName[fld_ClientesID_AGENTE];
      ParamByName('GRUPO_CLIENTE').Value := aChange.NewValueByName[fld_ClientesGRUPO_CLIENTE];
      ParamByName('NOMBRE_COMERCIAL').Value := aChange.NewValueByName[fld_ClientesNOMBRE_COMERCIAL];
      ParamByName('VENCIMIENTO_FACTURAS').Value := aChange.NewValueByName[fld_ClientesVENCIMIENTO_FACTURAS];
      ParamByName('BLOQUEADO').Value := aChange.NewValueByName[fld_ClientesBLOQUEADO];
      ParamByName('MOTIVO_BLOQUEO').Value := aChange.NewValueByName[fld_ClientesMOTIVO_BLOQUEO];
      ParamByName('RECARGO_EQUIVALENCIA').Value := aChange.NewValueByName[fld_ClientesRECARGO_EQUIVALENCIA];
      ParamByName('REGIMEN_IVA').Value := aChange.NewValueByName[fld_ClientesREGIMEN_IVA];
      ParamByName('ID_TIPO_IVA').Value := aChange.NewValueByName[fld_ClientesID_TIPO_IVA];
      ParamByName('ID_FORMA_PAGO').Value := aChange.NewValueByName[fld_ClientesID_FORMA_PAGO];
      ParamByName('TIENDA_WEB').Value := aChange.NewValueByName[fld_ClientesTIENDA_WEB];
      ParamByName('CODIGO_ASIGNADO').Value := aChange.NewValueByName[fld_ClientesCODIGO_ASIGNADO];
      ParamByName('IGNORAR_CONTABILIDAD').Value := aChange.NewValueByName[fld_ClientesIGNORAR_CONTABILIDAD];
      ParamByName('TIENE_SUBCUENTA').Value := aChange.NewValueByName[fld_ClientesTIENE_SUBCUENTA];
      ParamByName('PROCEDENCIA_CLIENTE').Value := aChange.NewValueByName[fld_ClientesPROCEDENCIA_CLIENTE];
      Execute;
    end;


    //En caso de no ignorar contabilidad se deberá dar de alta una cuenta para el cliente si el usuario no la ha asignado
    if (aChange.NewValueByName[fld_ClientesIGNORAR_CONTABILIDAD] = 0) and
       (aChange.NewValueByName[fld_ClientesTIENE_SUBCUENTA] = 0) then
    begin
      CrearCuentaContable(aChange);
    end;

  finally
    ACommand := NIL;
  end;
end;


procedure TBizClienteServer.Update_Datos_Contacto(aChange: TDADeltaChange);
var
  ASchema : TDASchema;
  ACurrentConn : IDAConnection;
  ACommand : IDASQLCommand;
begin
  inherited;

  ASchema := BusinessProcessor.Schema;
  ACurrentConn := GetBusinessProcessorConnection(BusinessProcessor);

  ACommand := ASchema.NewCommand(ACurrentConn, 'Update_ClientesDatos');
  try
    with ACommand do
    begin
      ParamByName('OLD_ID_CLIENTE').Value := aChange.OldValueByName[fld_ClientesID];
      ParamByName('ID_CLIENTE').Value := aChange.NewValueByName[fld_ClientesID];
//      ParamByName('ID_AGENTE').Value := aChange.NewValueByName[fld_ClientesID_AGENTE];
      ParamByName('GRUPO_CLIENTE').Value := aChange.NewValueByName[fld_ClientesGRUPO_CLIENTE];
      ParamByName('NOMBRE_COMERCIAL').Value := aChange.NewValueByName[fld_ClientesNOMBRE_COMERCIAL];
      ParamByName('VENCIMIENTO_FACTURAS').Value := aChange.NewValueByName[fld_ClientesVENCIMIENTO_FACTURAS];
      ParamByName('BLOQUEADO').Value := aChange.NewValueByName[fld_ClientesBLOQUEADO];
      ParamByName('MOTIVO_BLOQUEO').Value := aChange.NewValueByName[fld_ClientesMOTIVO_BLOQUEO];
      ParamByName('RECARGO_EQUIVALENCIA').Value := aChange.NewValueByName[fld_ClientesRECARGO_EQUIVALENCIA];
      ParamByName('REGIMEN_IVA').Value := aChange.NewValueByName[fld_ClientesREGIMEN_IVA];
      ParamByName('ID_TIPO_IVA').Value := aChange.NewValueByName[fld_ClientesID_TIPO_IVA];
      ParamByName('ID_FORMA_PAGO').Value := aChange.NewValueByName[fld_ClientesID_FORMA_PAGO];
      ParamByName('TIENDA_WEB').Value := aChange.NewValueByName[fld_ClientesTIENDA_WEB];
      ParamByName('CODIGO_ASIGNADO').Value := aChange.NewValueByName[fld_ClientesCODIGO_ASIGNADO];
      ParamByName('IGNORAR_CONTABILIDAD').Value := aChange.NewValueByName[fld_ClientesIGNORAR_CONTABILIDAD];
      ParamByName('TIENE_SUBCUENTA').Value := aChange.NewValueByName[fld_ClientesTIENE_SUBCUENTA];
      ParamByName('PROCEDENCIA_CLIENTE').Value := aChange.NewValueByName[fld_ClientesPROCEDENCIA_CLIENTE];
      Execute;
    end;

    //En caso de no ignorar contabilidad se deberá dar de alta una cuenta para el cliente si el usuario no la ha asignado
    if (aChange.NewValueByName[fld_ClientesIGNORAR_CONTABILIDAD] = 0) and
       (aChange.NewValueByName[fld_ClientesTIENE_SUBCUENTA] = 0) then
    begin
      CrearCuentaContable(aChange);
    end;

  finally
    ACommand := NIL;
  end;
end;

initialization
  RegisterBusinessProcessorRules(BIZ_SERVER_CLIENTE, TBizClienteServer);

end.
