namespace Main
{
public class Customizer
{
public void CheckSuppliers()
{
string reqSql = @"select fou.f_id as idfournisseur,lignes_c.journal,lignes_c.piece,(case when lignes_c.tot<0 then -lignes_c.tot else 0 end) as debit,(case when lignes_c.tot>0 then lignes_c.tot else 0 end) as credit,lignes_c.date,case when echeance> '19000101' then lignes_c.echeance else null end as echeance,lignes_c.commentair as info
from LIGNES_C
inner join FOU on lignes_c.id_fou=fou.f_id
where (lignes_c.lettrage <= 0) and (lignes_c.type_ligne >= 0)
order by fou.f_id,lignes_c.date".UnIndent(8);
List<BookingDescriptor> bookingDescriptors = Api.Zselect<BookingDescriptor>(Globals.RepData, reqSql);
if (bookingDescriptors == null)
{
Globals.MercatorTasksToMain.Log("Select : " + Api.LastError, isError: true);
return;
}
MercatorAI.FactoryOpenAI factory = new MercatorAI.FactoryOpenAI();
MercatorAI.Interfaces.IOpenAiChat openAiChat = factory.CreateOpenAiChat("gpt-5", out string error);
if (!string.IsNullOrEmpty(error))
{
Globals.MercatorTasksToMain.Log("Impossible d'initialiser le chat d'OpenAI : " + error, isError: true);
return;
}
string prompt = @"Voici une liste de postes ouverts comptables fournisseurs en date de ce jour au format JSON.
Indique-moi les anomalies potentielles comme :
- mouvements non lettrés qui pourraient l'être (montants identiques ou semblables, solde de plusieurs mouvements à zéro ou proche de zéro, ...),
- paiements sans facture,
- factures sans règlement mais en ignorant celles qui ne sont pas encore échues,
- d'autres anomalies que tu détecterais.
Les paiements sont dans les journaux ING et VBDA. ODV est un journal d'opérations diverses de correction.
JSON :".UnIndent(4) + Api.JsonConvertSerializeObject(bookingDescriptors);
string htmlResponse;
try
{
htmlResponse = openAiChat.Ask(prompt, systemMessage: "Tu es un assistant comptable expert.");
}
catch (Exception ex)
{
Globals.MercatorTasksToMain.Log(ex.Message, isError: true);
return;
}
IneoSmtp.Smtp mail = Globals.MercatorTasksToMain.GetNewStmp();
mail.Subject = "Analyse postes ouverts fournisseurs";
mail.Message = htmlResponse;
mail.ForceHtml = true;
if (!mail.SendMail())
Globals.MercatorTasksToMain.Log("Erreur envoi mail : " + mail.Error, isError: true);
else
Globals.MercatorTasksToMain.Log("Mail correctement envoyé à " + mail.Recipient);
}
public class BookingDescriptor
{
public string IdFournisseur { get; set; }
public string Journal { get; set; }
public Int64 Piece { get; set; }
public decimal Debit { get; set; }
public decimal Credit { get; set; }
public DateTime Date { get; set; }
public DateTime? Echeance { get; set; }
public string Info { get; set; }
}
}
}