Mercator 11.0 kan taken uitvoeren in consolemodus. Deze taken kunnen bijvoorbeeld worden geactiveerd door de Windows Taakplanner. Deze uitvoering van Mercator gebeurt zonder enige interface. Er is een loggingsysteem beschikbaar. De logs worden geplaatst in de submap LogFiles van Mercator. Deze map wordt automatisch aangemaakt.
Deze gebruiksmodus van Mercator vereist de installatie van een SSL-certificaat dat de wachtwoorden hieronder genoemd gaat versleutelen.
Om Mercator in consolemodus te starten, moet Mercator.exe een parameter/argument (altijd de eerste) doorgegeven worden die aangeeft waar een ini-bestand te vinden is met de parameters van de taak.
C:\Mercator\Mercator.exe C:\Mercator\MercatorTasks.ini
Een voorbeeld van een ini-bestand is beschikbaar in de onderstaande zip. Dit ini-bestand bevat de volgende parameters:
- IdDossier : leeg of het id van het dossier in een multi-dossier configuratie.
- UserLogin : de naam van een Mercator-gebruiker die zal worden gebruikt om Mercator te starten.
- Password : zijn wachtwoord. Dit zal automatisch worden versleuteld tijdens de eerste uitvoering van de taak.
- InitReporting : 1 als de rapportgenerator zal worden gebruikt in de taak (bijvoorbeeld voor het genereren van PDF-bestanden), anders 0.
- SendLog : verstuurt de logs per e-mail aan een of meerdere beheerders aan het einde van de taak
- 0 : nooit
- 1 : altijd
- 2 : alleen in geval van fouten
Deze uitvoeringsmodus van Mercator "verbruikt" een gebruikerslicentie gedurende de gehele duur van de taak. Als er geen licentie beschikbaar is, zal een foutmelding worden gegenereerd omdat Mercator dan niet kan starten.
Instellingen voor verzenden per e-mail
Als het verzenden van logs per e-mail wordt gebruikt, moeten de verbindingsparameters voor de mailserver worden ingevuld. Voor een klassieke mailserver:
- SmtpHost : naam van de mailserver.
- StmpPort : te gebruiken TCP-poort.
- SmtpSsl : 1 als SSL moet worden ingeschakeld, 0 anders.
- SmtpLogin : login voor geauthenticeerde verbinding, leeg anders.
- SmtpPassword : wachtwoord voor een geauthenticeerde verbinding. Dit wordt automatisch versleuteld tijdens de eerste uitvoering van de taak.
- SmtpSenderMail : e-mailadres van de afzender.
- SmtpSenderName : naam van de afzender.
Voor verzending via Office365 - Api Graph moeten de parameters ClientId, ClientSecret, Tenant en UserId worden geplaatst in de SQL-tabel free_table_secrets, zoals uitgelegd op deze pagina. Het ini-bestand moet als volgt worden ingevuld:
- SmtpOffice365Graph : 1
- SmtpSenderMail : e-mailadres van de afzender
- SmtpSenderName : naam van de afzender
Daarna, in beide gevallen :
- SmtpRecipients : e-mailadressen van de ontvangers, gescheiden door ;
- SmtpCc : e-mailadressen in CC gescheiden door ;
Het is mogelijk om het verzenden van e-mails te testen zonder uitvoering van de taak door testmail als tweede parameter/argument aan Mercator.exe door te geven.
C:\Mercator\Mercator.exe C:\Mercator\MercatorTasks.ini testmail
Taakinstellingen
Mercator in consolemodus kan een onbeperkt aantal taken uitvoeren. Elke taak moet overeenkomen met een openbare methode zonder parameters, geplaatst in de Main customizer.
Deze methode moet het volgende retourneren:
- void
- of Task als deze asynchrone code bevat (minimumversie 12.0.30)
Elke methode naam moet in het ini-bestand worden vermeld, op een aparte regel
De nummering van de taken moet beginnen bij 1, oplopend en onafgebroken zijn.
Bijvoorbeeld, als het ini-bestand het volgende bevat
Task1 = MethodForMercatorTasks1
Task2 = MethodForMercatorTasks2Async
Dan ziet de Main customizer er als volgt uit:
namespace Main
{
public class Customizer
{
public void MethodForMercatorTasks1()
{
// taak 1
}
public async Task MethodForMercatorTasks2Async()
{
// taak 2
await ...
}
}
}
Net als bij een klassieke customizer is het mogelijk om een externe DLL te refereren om zijn functionaliteiten te gebruiken.
De C#-code van deze methoden kan MercatorUi.Globals.MercatorTasksToMain gebruiken om:
1. Een optie (bestaand of aangepast) in het ini-bestand te lezen
string myValue = MercatorUi.Globals.MercatorTasksToMain.IniFile.IniReadValue("MercatorTasks", "MyOption");
2. Naar het logboek te schrijven
MercatorUi.Globals.MercatorTasksToMain.Log("Schrijf naar het logboek!");
Belangrijke opmerking: als de logverzendmodus 2 is (alleen in geval van fouten), is het belangrijk om onderscheid te maken tussen foutlogs en gewone activiteitenlogs. Standaard wordt elke invoer in het log niet als een fout beschouwd. Om dit te veranderen, moet de methode Log de extra parameter isError: true krijgen.
3. Een e-mail te verzenden volgens de in het ini-bestand gedefinieerde parameters
IneoSmtp.Smtp mail = MercatorUi.Globals.MercatorTasksToMain.GetNewStmp();
mail.Subject = "Mijn onderwerp";
mail.Message = "Mijn bericht";
if (!mail.SendMail())
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij verzenden e-mail: " + mail.Error, isError: true);
else
MercatorUi.Globals.MercatorTasksToMain.Log("E-mail correct verzonden naar " + mail.Recipient);
4. Een bericht bovenaan het log plaatsen, dat in de e-mail zal worden opgenomen
MercatorUi.Globals.MercatorTasksToMain.CurrentLog.Insert(0, "Zie hieronder het log van de Mercator-taak die zojuist is uitgevoerd in consolemodus.\r\n\r\n");
5. Code uitvoeren wanneer alle taken zijn voltooid
MercatorUi.Globals.MercatorTasksToMain.AllTasksFinished += (s, e) =>
{
if (MercatorUi.Globals.MercatorTasksToMain.CurrentLogContainsErrors)
MercatorUi.Globals.MercatorTasksToMain.CurrentLog.Append("\r\n\r\nWAARSCHUWING: dit logboek bevat fouten!");
};
Met betrekking tot customizers
Als Mercator-functies die in deze taken worden gebruikt Mercator-customizers vereisen, moeten deze via code worden geladen voordat deze functies worden aangeroepen. Het is raadzaam om alleen de benodigde aanpasser(s) te laden. (Voor de centralissatie in de boekhouding moet bijvoorbeeld de Accounting-customizer worden geladen.)
- MercatorUi.Globals.Main.InitCustomizerGescom();
- MercatorUi.Globals.Main.InitCustomizerAccounting();
- MercatorUi.Globals.Main.InitCustomizerIntrastat();
- MercatorUi.Globals.Main.InitCustomizerCrm();
- MercatorUi.Globals.Main.InitCustomizerMcdClient();
Elke customizer hoeft slechts één keer te worden geladen, ook als er meerdere taken worden uitgevoerd.
Belangrijke opmerkingen over plannen
Een taak die in de Windows Taakplanner is aangemaakt, moet worden uitgevoerd onder de credentials van een gebruiker die Mercator in "normale" modus (niet console) zonder fouten of beperkingen kan gebruiker.
Het is noodzakelijk om de hoofdmap van Mercator op te geven als de standaardmap voor deze taak.
Het SSL-certificaat moet in de certificatenopslag van deze gebruiker zijn geïnstalleerd.
Het is mogelijk om verschillende taken te maken met bijvoorbeeld verschillende ini-bestanden, of hetzelfde ini-bestand.
Als er meerdere taken zijn, is het belangrijk dat ze niet allemaal op hetzelfde moment beginnen.
Wanneer er meerdere acties moeten worden uitgevoerd, is het aan te raden om ze te groeperen in hetzelfde ini-bestand (Task1, Task2, ...) in plaats van afzonderlijke ini-bestanden te maken en deze taken opeenvolgend uit te voeren. De aanbevolen modus zorgt ervoor dat dezelfde instantie van Mercator wordt gebruikt voor deze verschillende taken.
Wanneer u een taak voor het eerst start, maakt Mercator een map LogFiles aan in de hoofdmap van Mercator. Zorg er daarom voor dat uw credentials het aanmaken van deze map toestaan. Deze map kan ook handmatig worden aangemaakt. Mercator in de consolemodus moet schrijfrechten voor deze map hebben. Als er geen logbestand wordt aangemaakt, moet u deze rechten controleren.
Voordat u een taak plant, is het raadzaam deze in een opdrachtvenster (cmd.exe) uit te voeren. Zorg er ook voor dat de opdracht wordt uitgevoerd in de hoofdmap van Mercator. Zo kunt u eventuele foutmeldingen direct bekijken.
k:\
cd k:\Mercator\
Mercator.exe k:\Mercator\MercatorTasks.ini
Voorbeeld van een taak: centralisatie in boekhouding van de documenten van de dag
public void PostIntoAccounting()
{
MercatorUi.Forms.Accounting.AccountingProcedures.Procedures.PostIntoAccountingParams p = new MercatorUi.Forms.Accounting.AccountingProcedures.Procedures.PostIntoAccountingParams(
DateTime.Today, // date1
DateTime.Today, // date2
new string[3] { "VEN", "NCV", "FactF" }, // gecentraliseerde journalen
true, // postPayments
true, // performMatching
"001" // dossier indien meerdere
);
MercatorUi.Forms.Accounting.AccountingProcedures.Procedures.PostIntoAccounting(p, true);
if (!string.IsNullOrEmpty(p.LastError))
MercatorUi.Globals.MercatorTasksToMain.Log(p.LastError);
MercatorUi.Globals.MercatorTasksToMain.Log("VERKOPEN & AANKOPEN");
MercatorUi.Globals.MercatorTasksToMain.Log(p.ResultPostSalesPurchases);
if (p.LogErrorsPostSalesPurchases != null)
MercatorUi.Globals.MercatorTasksToMain.Log(p.LogErrorsPostSalesPurchases.ToString(), isError: true);
MercatorUi.Globals.MercatorTasksToMain.Log("BETALINGEN");
MercatorUi.Globals.MercatorTasksToMain.Log(p.ResultPostPayments);
if (p.LogErrorsPostPayments != null)
MercatorUi.Globals.MercatorTasksToMain.Log(p.LogErrorsPostPayments.ToString(), isError: true);
MercatorUi.Globals.MercatorTasksToMain.Log("AFPUNTING");
MercatorUi.Globals.MercatorTasksToMain.Log(p.ResultMatching, isError: p.ResultMatching != Api.Iif_langue(Globals.Langue, 47));
}
In het ini-bestand:
Task1 = PostIntoAccounting
Voorbeeld van een taak: automatische facturering van de leveringen van de dag
public void DeliveriesInvoicing()
{
doDeliveriesInvoicing("1Bliv", "1Fact");
doDeliveriesInvoicing("2Bliv", "2Fact");
doDeliveriesInvoicing("3Bliv", "3Fact");
}
private void doDeliveriesInvoicing(string seqLivr, string seqFactu)
{
MercatorUi.Globals.MercatorTasksToMain.Log($"Facturering van {seqLivr} naar {seqFactu}");
DataSet dsSequenc = Api.Zselect(Globals.RepData, "select * from SEQUENC where journal = @seqLivr \r\n"
+ "select * from SEQUENC where journal = @seqFactu",
new MercatorSqlParam("@seqLivr", seqLivr, SqlDbType.Char),
new MercatorSqlParam("@seqFactu", seqFactu, SqlDbType.Char));
if (dsSequenc == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("Sequenc select : " + Api.LastError, isError: true);
return;
}
if (dsSequenc.Tables[0].Rows.Count == 0)
{
MercatorUi.Globals.MercatorTasksToMain.Log($"De sequentie {seqLivr} bestaat niet!", isError: true);
return;
}
if (dsSequenc.Tables[1].Rows.Count == 0)
{
MercatorUi.Globals.MercatorTasksToMain.Log($"De sequentie {seqFactu} bestaat niet!", isError: true);
return;
}
MercatorUi.Forms.Gescom.GescomDialogs.GescomAskDeliveriesInvoicing.GescomAskDeliveriesInvoicingRet askRet =
new MercatorUi.Forms.Gescom.GescomDialogs.GescomAskDeliveriesInvoicing.GescomAskDeliveriesInvoicingRet(
dsSequenc.Tables[0].Rows[0], // sequencOrig
dsSequenc.Tables[1].Rows[0], // sequencDest
($"(pieds_v.date = '{DateTime.Today.ToString("yyyyMMdd")}')"), // whereClause
false, // groupLines
false, // groupCustNoVat
false, // invoiceAccount
false, // withQZero
false, // dateAllLines
false, // noComment
-99999); // minimum
Api.LastError = "";
int generatedInvoicesCount = MercatorUi.Forms.Gescom.GescomProcedures.Procedures.DeliveriesInvoicing(MercatorUi.Engine.Gescom.Billing.TypeVAEnum.V, askRet, true);
if (string.IsNullOrEmpty(Api.LastError))
MercatorUi.Globals.MercatorTasksToMain.Log($"Document(en) {seqFactu} gegenereerd: {generatedInvoicesCount}.");
else
MercatorUi.Globals.MercatorTasksToMain.Log($"Document(en) {seqFactu} gegenereerd: {generatedInvoicesCount}.\r\n" + Api.LastError, isError: true);
}
In het ini-bestand:
Task1 = DeliveriesInvoicing
Voorbeeld van een taak: verzenden van een PDF-rapport per e-mail (Lijst van klanten voor de huidige maand)
public void SendPdfReport()
{
List<MercatorSqlParam> lp = new List<MercatorSqlParam>
{
new MercatorSqlParam("@DATE_1", new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1)),
new MercatorSqlParam("@DATE_2", DateTime.Today)
};
MercatorUi.Reporting.OutputDescriptorExport outputDescriptorExport = new MercatorUi.Reporting.OutputDescriptorExport(MercatorUi.Reporting.ExportReportEnum.PDF, null, MercatorUi.Reporting.ExportOpenAfterEnum.No) { ExportToBytes = true };
Api.LastError = "";
MercatorUi.Reporting.ReportingStatic.RunReportFromDocum("H2ZP118RW1", new List<MercatorUi.Reporting.OutputDescriptor> { outputDescriptorExport }, lp);
if (outputDescriptorExport.FileContent == null)
{
MercatorUi.Globals.MercatorTasksToMain.Log("PDF genereren: " + (!string.IsNullOrEmpty(Api.LastError) ? Api.LastError : "onbekende fout"), isError: true);
}
else
{
IneoSmtp.Smtp mail = MercatorUi.Globals.MercatorTasksToMain.GetNewStmp();
mail.Subject = "Klantenlijst";
mail.Message = "Bijgevoegd is de klantenlijst.";
mail.BytesAttachments = new Dictionary<string, byte[]> { { "Klantenlijst.pdf", outputDescriptorExport.FileContent } };
if (!mail.SendMail())
MercatorUi.Globals.MercatorTasksToMain.Log("Fout bij verzenden e-mail: " + mail.Error, isError: true);
else
MercatorUi.Globals.MercatorTasksToMain.Log("E-mail correct verzonden naar " + mail.Recipient);
}
}
In het ini-bestand:
Task1 = SendPdfReport
Te laden :
0000003239.zip (0 Kb - 05-08-2024)