Files
SIG-CM/src/SIGCM.Infrastructure/Repositories/PricingRepository.cs

116 lines
4.3 KiB
C#

using Dapper;
using SIGCM.Domain.Entities;
using SIGCM.Infrastructure.Data;
namespace SIGCM.Infrastructure.Repositories;
public class PricingRepository
{
private readonly IDbConnectionFactory _db;
public PricingRepository(IDbConnectionFactory db)
{
_db = db;
}
public async Task<CategoryPricing?> GetByCategoryIdAsync(int categoryId)
{
using var conn = _db.CreateConnection();
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();
var exists = await conn.QuerySingleOrDefaultAsync<CategoryPricing>(
"SELECT Id FROM CategoryPricing WHERE CategoryId = @CategoryId", new { pricing.CategoryId });
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 Id = @Id";
await conn.ExecuteAsync(updateSql, pricing);
}
else
{
var insertSql = @"
INSERT INTO CategoryPricing
(CategoryId, BaseWordCount, ExtraWordPrice, SpecialChars, SpecialCharPrice, BoldSurcharge, FrameSurcharge)
VALUES
(@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);
}
}
public async Task<IEnumerable<Promotion>> GetActivePromotionsAsync()
{
using var conn = _db.CreateConnection();
return await conn.QueryAsync<Promotion>(
"SELECT * FROM Promotions WHERE IsActive = 1");
}
// --- SECCIÓN PROMOCIONES ---
public async Task<IEnumerable<Promotion>> GetAllPromotionsAsync()
{
using var conn = _db.CreateConnection();
return await conn.QueryAsync<Promotion>("SELECT * FROM Promotions ORDER BY Id DESC");
}
public async Task<int> CreatePromotionAsync(Promotion promo)
{
using var conn = _db.CreateConnection();
var sql = @"
INSERT INTO Promotions (Name, CategoryId, MinDays, DaysOfWeek, DiscountPercentage, DiscountFixedAmount, IsActive)
VALUES (@Name, @CategoryId, @MinDays, @DaysOfWeek, @DiscountPercentage, @DiscountFixedAmount, @IsActive);
SELECT CAST(SCOPE_IDENTITY() as int);";
return await conn.QuerySingleAsync<int>(sql, promo);
}
public async Task UpdatePromotionAsync(Promotion promo)
{
using var conn = _db.CreateConnection();
var sql = @"
UPDATE Promotions
SET Name = @Name, CategoryId = @CategoryId, MinDays = @MinDays,
DaysOfWeek = @DaysOfWeek, DiscountPercentage = @DiscountPercentage,
DiscountFixedAmount = @DiscountFixedAmount, IsActive = @IsActive
WHERE Id = @Id";
await conn.ExecuteAsync(sql, promo);
}
public async Task DeletePromotionAsync(int id)
{
using var conn = _db.CreateConnection();
await conn.ExecuteAsync("DELETE FROM Promotions WHERE Id = @Id", new { Id = id });
}
}