Aggiunta calcolo valore prodotto e miglioramenti UI

Implementato il calcolo del valore reale dei prodotti in asta,
includendo il prezzo "Compra Subito", spese di spedizione e
risparmio stimato. Aggiunta una nuova sezione "Info Prodotto"
nella UI per visualizzare i dettagli estratti e i calcoli.

- **AuctionMonitorControl.xaml**: Aggiunta sezione fissa per
  mostrare informazioni prodotto e calcolo valore.
- **AuctionMonitorControl.xaml.cs**: Gestiti eventi per il
  caricamento e aggiornamento delle informazioni prodotto.
- **MainWindow**: Integrati handler per il calcolo e refresh
  delle informazioni prodotto.
- **AuctionInfo.cs**: Aggiunte proprietà per gestire prezzo
  "Compra Subito", spese di spedizione e limiti di vincita.
- **ProductValueCalculator.cs**: Nuova utility per calcolare
  il valore del prodotto e parsare informazioni dall'HTML.
- **AuctionViewModel.cs**: Binding per visualizzare risparmio,
  costo totale e convenienza nella UI.
- **Documentazione**: Aggiornata con dettagli sull'algoritmo
  di calcolo e layout UI.

Fix:
- Risolto problema di encoding UTF-8 per emoji nella UI.
- Migliorato parsing HTML per prezzi e limiti di vincita.

TODO:
- Testare parsing su più aste e gestire edge cases.
- Implementare caricamento automatico delle informazioni.
This commit is contained in:
2025-11-21 16:55:21 +01:00
parent f124f2e4e8
commit ee67bedc31
171 changed files with 134519 additions and 241 deletions

View File

@@ -75,6 +75,40 @@ namespace AutoBidder.Models
[System.Text.Json.Serialization.JsonIgnore]
public bool IsAttackInProgress { get; set; } = false;
// === INFORMAZIONI PRODOTTO PER CALCOLO VALORE ===
/// <summary>
/// Prezzo "Compra Subito" del prodotto (valore nominale)
/// </summary>
public double? BuyNowPrice { get; set; }
/// <summary>
/// Spese di spedizione per questo prodotto
/// </summary>
public double? ShippingCost { get; set; }
/// <summary>
/// Indica se c'è un limite di vincita per questo prodotto (1 volta ogni X giorni)
/// </summary>
public bool HasWinLimit { get; set; } = false;
/// <summary>
/// Descrizione del limite di vincita (es: "1 volta ogni 30 giorni")
/// </summary>
public string? WinLimitDescription { get; set; }
/// <summary>
/// Costo medio per puntata da utilizzare nei calcoli (default: 0.20€)
/// </summary>
public double BidCost { get; set; } = 0.20;
/// <summary>
/// Ultimo valore calcolato del prodotto (costo reale considerando puntate)
/// Null se non ancora calcolato
/// </summary>
[JsonIgnore]
public ProductValue? CalculatedValue { get; set; }
/// <summary>
/// Aggiunge una voce al log dell'asta con limite automatico di righe
/// </summary>
@@ -96,4 +130,70 @@ namespace AutoBidder.Models
public int PollingLatencyMs { get; set; } = 0; // Ultima latenza polling ms
}
/// <summary>
/// Rappresenta il valore calcolato di un prodotto all'asta
/// </summary>
public class ProductValue
{
/// <summary>
/// Prezzo attuale dell'asta in euro
/// </summary>
public double CurrentPrice { get; set; }
/// <summary>
/// Numero totale di puntate effettuate sull'asta
/// </summary>
public int TotalBids { get; set; }
/// <summary>
/// Numero di puntate effettuate dall'utente
/// </summary>
public int MyBids { get; set; }
/// <summary>
/// Costo delle puntate dell'utente (MyBids × BidCost)
/// </summary>
public double MyBidsCost { get; set; }
/// <summary>
/// Costo totale per l'utente se vince (CurrentPrice + MyBidsCost + ShippingCost)
/// </summary>
public double TotalCostIfWin { get; set; }
/// <summary>
/// Prezzo "Compra Subito" del prodotto
/// </summary>
public double? BuyNowPrice { get; set; }
/// <summary>
/// Spese di spedizione
/// </summary>
public double? ShippingCost { get; set; }
/// <summary>
/// Risparmio rispetto al prezzo "Compra Subito" (può essere negativo)
/// </summary>
public double? Savings { get; set; }
/// <summary>
/// Percentuale di risparmio rispetto al prezzo "Compra Subito"
/// </summary>
public double? SavingsPercentage { get; set; }
/// <summary>
/// Indica se conviene continuare (risparmio positivo)
/// </summary>
public bool IsWorthIt { get; set; }
/// <summary>
/// Timestamp del calcolo
/// </summary>
public DateTime CalculatedAt { get; set; }
/// <summary>
/// Messaggio riassuntivo del valore
/// </summary>
public string Summary { get; set; } = "";
}
}