///<inheritdoc/> public async Task <CalculateInssResult> CalculateInss(InssType type, decimal revenue, DateTime?date, CancellationToken cancellationToken = default) { CalculateInssResult result = null; InssTax inss = await _inssRepository.GetActive(type, date, cancellationToken); if (inss != null) { InssTaxRange range = inss .Range .OrderByDescending(o => o.EndValue) .FirstOrDefault(x => (revenue >= x.StartValue && revenue <= x.EndValue) || revenue >= x.EndValue); if (range != null) { result = new CalculateInssResult(); decimal value = (revenue * range.Rate / 100); value -= range.DeductedAmount; if (value > inss.Limit) { value = inss.Limit; result.IsLimit = true; } value = Math.Round(value, 2); result.Rate = range.Rate; result.Amount = value; } } return(result); }
/// <summary> /// Convert grpc inss type to enum inss type /// </summary> /// <param name="inssType">Grpc inss request type</param> private static InssBusinessType ConvertInssType(InssType inssType) { return(inssType switch { InssType.Worker => InssBusinessType.Worker, InssType.Individual => InssBusinessType.Individual, InssType.ManagingPartner => InssBusinessType.ManagingPartner, _ => InssBusinessType.Individual, });
/// <summary> /// Map inss type /// </summary> /// <param name="inssType">Inss type to map</param> private InssType MapInssType(Contract.Enums.InssType inssType) { InssType inssResultType = inssType switch { Contract.Enums.InssType.Worker => InssType.Worker, Contract.Enums.InssType.Individual => InssType.Individual, Contract.Enums.InssType.ManagingPartner => InssType.ManagingPartner, _ => InssType.Individual, }; return(inssResultType); }
///<inheritdoc/> public async Task <CalculateNetRevenueResult> CalculateNetRevenue(InssType type, decimal revenue, byte dependentsNumber, DateTime?date, CancellationToken cancellationToken = default) { CalculateNetRevenueResult result = new() { Inss = await CalculateInss(type, revenue, date, cancellationToken) }; if (result.Inss == null) { return(null); } result.Irpf = await CalculateIrpf(revenue, result.Inss.Amount, dependentsNumber, date, cancellationToken); result.NetRevenue = revenue - (result.Inss?.Amount ?? 0M) - (result.Irpf?.Amount ?? 0M); return(result); } }
///<inheritdoc/> public async Task <InssTax> GetActive(InssType type, DateTime?date, CancellationToken cancellationToken = default) { FilterDefinitionBuilder <InssTax> builder = Builders <InssTax> .Filter; FilterDefinition <InssTax> filter = builder.Eq(nameof(InssTax.Type).ToCamelCase(), type); if (date.HasValue) { filter = filter & builder.Lte(nameof(InssTax.DateStart).ToCamelCase(), date.Value) & ( builder.Gte(nameof(InssTax.DateEnd).ToCamelCase(), date.Value) | builder.Eq(nameof(InssTax.DateEnd).ToCamelCase(), BsonNull.Value) ); } else { filter &= builder.Eq(nameof(InssTax.Inactive).ToCamelCase(), false); } InssTax result = await Collection.Find(filter).FirstOrDefaultAsync(cancellationToken); return(result); }