unit uBizProveedoresServer;

interface

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

const
  BIZ_SERVER_PROVEEDOR = 'Server.Proveedor';

type
  TBizProveedorServer = 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_PROVEEDOR = 'REF_PROVEEDOR';

{ TBizProveedorServer }

procedure TBizProveedorServer.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 TBizProveedorServer.CrearCuentaContable(aChange: TDADeltaChange);
var
  AIDProveedor: Integer;
  bEsAcreedor: Integer;
  ANombre: string;

  ASchema : TDASchema;
  ACurrentConn : IDAConnection;
  dsData: IDADataset;

  Intf: IInterface;
  AContabilidadService: IsrvContabilidad;
  AClientID: TGUID;
begin
  AIDProveedor := aChange.NewValueByName[fld_ProveedoresID];
  bEsAcreedor := aChange.NewValueByName[fld_ProveedoresES_ACREEDOR];
  ANombre := aChange.NewValueByName[fld_ProveedoresNOMBRE];

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

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

  try
    dsData := ASchema.NewDataset(ACurrentConn, 'DarEmpresasContacto', ['ID_CONTACTO'], [AIDProveedor]);
    dsData.Active := True;

    //Por cada una de las empresas que tiene asociadas el contacto se añade una subcuenta en su ejercicio activo, en el caso de no tener
    while not dsData.EOF do
    begin
      if not AContabilidadService.TieneCuentaAsociada(AIDProveedor, dsData.FieldValues[0]) then
         AContabilidadService.AnadirSubCuentaProveedor(AIDProveedor, bEsAcreedor, dsData.FieldValues[0], ANombre);
      dsData.Next;
    end;

  finally
    dsData := NIL;
    ACurrentConn := NIL;
  end;
end;


procedure TBizProveedorServer.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 TBizProveedorServer.DarReferencia: String;
begin
  Result := _DarReferenciaInterna(REF_PROVEEDOR);
end;

procedure TBizProveedorServer.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_ProveedoresDatos');
  try
    with ACommand do
    begin
      ParamByName('OLD_ID_PROVEEDOR').Value := aChange.OldValueByName[fld_ProveedoresID];
      Execute;
    end;
  finally
    ACommand := NIL;
  end;
end;

function TBizProveedorServer.IncrementarReferencia: Boolean;
begin
  Result := _IncrementarReferenciaInterna(REF_PROVEEDOR);
end;

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

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

  ACommand := ASchema.NewCommand(ACurrentConn, 'Insert_ProveedoresDatos');
  try
    with ACommand do
    begin
      ParamByName('ID_PROVEEDOR').Value := aChange.NewValueByName[fld_ProveedoresID];
      ParamByName('DESCUENTO').Value := aChange.NewValueByName[fld_ProveedoresDESCUENTO];
      ParamByName('DESCRIPCION_PROVEEDOR').Value := aChange.NewValueByName[fld_ProveedoresDESCRIPCION_PROVEEDOR];
      ParamByName('CODIGO_ASIGNADO').Value := aChange.NewValueByName[fld_ProveedoresCODIGO_ASIGNADO];
      ParamByName('REGIMEN_IVA').Value := aChange.NewValueByName[fld_ProveedoresREGIMEN_IVA];
      ParamByName('ID_TIPO_IVA').Value := aChange.NewValueByName[fld_ProveedoresID_TIPO_IVA];
      ParamByName('ID_FORMA_PAGO').Value := aChange.NewValueByName[fld_ProveedoresID_FORMA_PAGO];
      ParamByName('TIENDA_WEB').Value := aChange.NewValueByName[fld_ProveedoresTIENDA_WEB];
      ParamByName('HOMOLOGADO').Value := aChange.NewValueByName[fld_ProveedoresHOMOLOGADO];
      ParamByName('CERTIFICACION').Value := aChange.NewValueByName[fld_ProveedoresCERTIFICACION];
      ParamByName('GRUPO_PROVEEDOR').Value := aChange.NewValueByName[fld_ProveedoresGRUPO_PROVEEDOR];
      ParamByName('IGNORAR_CONTABILIDAD').Value := aChange.NewValueByName[fld_ProveedoresIGNORAR_CONTABILIDAD];
      ParamByName('TIENE_SUBCUENTA').Value := aChange.NewValueByName[fld_ProveedoresTIENE_SUBCUENTA];
      ParamByName('NOMBRE_COMERCIAL').Value := aChange.NewValueByName[fld_ProveedoresNOMBRE_COMERCIAL];
      ParamByName('ES_ACREEDOR').Value := aChange.NewValueByName[fld_ProveedoresES_ACREEDOR];
      ParamByName('VENCIMIENTO_FACTURAS_1').Value := aChange.NewValueByName[fld_ProveedoresVENCIMIENTO_FACTURAS_1];
      ParamByName('VENCIMIENTO_FACTURAS_2').Value := aChange.NewValueByName[fld_ProveedoresVENCIMIENTO_FACTURAS_2];
      ParamByName('VENCIMIENTO_FACTURAS_3').Value := aChange.NewValueByName[fld_ProveedoresVENCIMIENTO_FACTURAS_3];

      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_ProveedoresIGNORAR_CONTABILIDAD] = 0) and
       (aChange.NewValueByName[fld_ProveedoresTIENE_SUBCUENTA] = 0) then
    begin
      CrearCuentaContable(aChange);
    end;
  finally
    ACommand := NIL;
  end;
end;


procedure TBizProveedorServer.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_ProveedoresDatos');
  try
    with ACommand do
    begin
      ParamByName('OLD_ID_PROVEEDOR').Value := aChange.OldValueByName[fld_ProveedoresID];
      ParamByName('ID_PROVEEDOR').Value := aChange.NewValueByName[fld_ProveedoresID];
      ParamByName('DESCUENTO').Value := aChange.NewValueByName[fld_ProveedoresDESCUENTO];
      ParamByName('DESCRIPCION_PROVEEDOR').Value := aChange.NewValueByName[fld_ProveedoresDESCRIPCION_PROVEEDOR];
      ParamByName('CODIGO_ASIGNADO').Value := aChange.NewValueByName[fld_ProveedoresCODIGO_ASIGNADO];
      ParamByName('REGIMEN_IVA').Value := aChange.NewValueByName[fld_ProveedoresREGIMEN_IVA];
      ParamByName('ID_TIPO_IVA').Value := aChange.NewValueByName[fld_ProveedoresID_TIPO_IVA];
      ParamByName('ID_FORMA_PAGO').Value := aChange.NewValueByName[fld_ProveedoresID_FORMA_PAGO];
      ParamByName('TIENDA_WEB').Value := aChange.NewValueByName[fld_ProveedoresTIENDA_WEB];
      ParamByName('HOMOLOGADO').Value := aChange.NewValueByName[fld_ProveedoresHOMOLOGADO];
      ParamByName('CERTIFICACION').Value := aChange.NewValueByName[fld_ProveedoresCERTIFICACION];
      ParamByName('GRUPO_PROVEEDOR').Value := aChange.NewValueByName[fld_ProveedoresGRUPO_PROVEEDOR];
      ParamByName('IGNORAR_CONTABILIDAD').Value := aChange.NewValueByName[fld_ProveedoresIGNORAR_CONTABILIDAD];
      ParamByName('TIENE_SUBCUENTA').Value := aChange.NewValueByName[fld_ProveedoresTIENE_SUBCUENTA];
      ParamByName('NOMBRE_COMERCIAL').Value := aChange.NewValueByName[fld_ProveedoresNOMBRE_COMERCIAL];
      ParamByName('ES_ACREEDOR').Value := aChange.NewValueByName[fld_ProveedoresES_ACREEDOR];

      ParamByName('VENCIMIENTO_FACTURAS_1').Value := aChange.NewValueByName[fld_ProveedoresVENCIMIENTO_FACTURAS_1];
      ParamByName('VENCIMIENTO_FACTURAS_2').Value := aChange.NewValueByName[fld_ProveedoresVENCIMIENTO_FACTURAS_2];
      ParamByName('VENCIMIENTO_FACTURAS_3').Value := aChange.NewValueByName[fld_ProveedoresVENCIMIENTO_FACTURAS_3];

      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_PROVEEDOR, TBizProveedorServer);

end.
