feat: Implementación de rangos de precio por palabra con validación de continuidad
This commit is contained in:
@@ -16,26 +16,35 @@ public class PricingRepository
|
||||
public async Task<CategoryPricing?> GetByCategoryIdAsync(int categoryId)
|
||||
{
|
||||
using var conn = _db.CreateConnection();
|
||||
return await conn.QuerySingleOrDefaultAsync<CategoryPricing>(
|
||||
"SELECT * FROM CategoryPricing WHERE CategoryId = @Id", new { Id = categoryId });
|
||||
var sql = @"
|
||||
SELECT * FROM CategoryPricing WHERE CategoryId = @Id;
|
||||
SELECT * FROM WordPricingRanges WHERE CategoryPricingId = (SELECT Id FROM CategoryPricing WHERE CategoryId = @Id) ORDER BY FromCount;";
|
||||
|
||||
using var multi = await conn.QueryMultipleAsync(sql, new { Id = categoryId });
|
||||
var pricing = await multi.ReadSingleOrDefaultAsync<CategoryPricing>();
|
||||
if (pricing != null)
|
||||
{
|
||||
pricing.WordRanges = (await multi.ReadAsync<WordPricingRange>()).ToList();
|
||||
}
|
||||
return pricing;
|
||||
}
|
||||
|
||||
public async Task UpsertPricingAsync(CategoryPricing pricing)
|
||||
{
|
||||
using var conn = _db.CreateConnection();
|
||||
// Lógica de "Si existe actualiza, sino inserta"
|
||||
var exists = await conn.ExecuteScalarAsync<int>(
|
||||
"SELECT COUNT(1) FROM CategoryPricing WHERE CategoryId = @CategoryId", new { pricing.CategoryId });
|
||||
var exists = await conn.QuerySingleOrDefaultAsync<CategoryPricing>(
|
||||
"SELECT Id FROM CategoryPricing WHERE CategoryId = @CategoryId", new { pricing.CategoryId });
|
||||
|
||||
if (exists > 0)
|
||||
if (exists != null)
|
||||
{
|
||||
pricing.Id = exists.Id;
|
||||
var updateSql = @"
|
||||
UPDATE CategoryPricing
|
||||
SET BaseWordCount = @BaseWordCount,
|
||||
ExtraWordPrice = @ExtraWordPrice, SpecialChars = @SpecialChars,
|
||||
SpecialCharPrice = @SpecialCharPrice, BoldSurcharge = @BoldSurcharge,
|
||||
FrameSurcharge = @FrameSurcharge
|
||||
WHERE CategoryId = @CategoryId";
|
||||
WHERE Id = @Id";
|
||||
await conn.ExecuteAsync(updateSql, pricing);
|
||||
}
|
||||
else
|
||||
@@ -44,8 +53,21 @@ public class PricingRepository
|
||||
INSERT INTO CategoryPricing
|
||||
(CategoryId, BaseWordCount, ExtraWordPrice, SpecialChars, SpecialCharPrice, BoldSurcharge, FrameSurcharge)
|
||||
VALUES
|
||||
(@CategoryId, @BaseWordCount, @ExtraWordPrice, @SpecialChars, @SpecialCharPrice, @BoldSurcharge, @FrameSurcharge)";
|
||||
await conn.ExecuteAsync(insertSql, pricing);
|
||||
(@CategoryId, @BaseWordCount, @ExtraWordPrice, @SpecialChars, @SpecialCharPrice, @BoldSurcharge, @FrameSurcharge);
|
||||
SELECT CAST(SCOPE_IDENTITY() as int);";
|
||||
pricing.Id = await conn.QuerySingleAsync<int>(insertSql, pricing);
|
||||
}
|
||||
|
||||
// Gestionar Rangos de Palabras
|
||||
await conn.ExecuteAsync("DELETE FROM WordPricingRanges WHERE CategoryPricingId = @Id", new { Id = pricing.Id });
|
||||
if (pricing.WordRanges != null && pricing.WordRanges.Any())
|
||||
{
|
||||
foreach (var range in pricing.WordRanges)
|
||||
{
|
||||
range.CategoryPricingId = pricing.Id;
|
||||
}
|
||||
var rangeSql = "INSERT INTO WordPricingRanges (CategoryPricingId, FromCount, ToCount, PricePerWord) VALUES (@CategoryPricingId, @FromCount, @ToCount, @PricePerWord)";
|
||||
await conn.ExecuteAsync(rangeSql, pricing.WordRanges);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user