Ce customizer permet de recalculer le stock minimum. Dans l'exemple ci-dessous, il est appelé à partir d'un nouveau point de menu dans le menu "Gestion".
Après la sélection d'un dépôt, d'une fourchette de dates et éventuellement l'application du filtre courant sur les articles, le customizer met à jour le stock minimum en fonction des ventes correspondant aux critères sélectionnés.
Dans notre exemple, la quantité calculée est augmentée de 10 % avant d'être sauvée comme stock minimum.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
using MercatorUi.Forms.Sig;
using MercatorUi.Wait;
namespace Main
{
public class Customizer : MercatorUi.ICustomizers.IExec
{
public void Main(MercatorUi.ICustomizers.ExecAction Action)
{
if (Action == MercatorUi.ICustomizers.ExecAction.MenuCreated)
{
// Ajout menu sous Gestion pour mise à jour stock min sur base des ventes ancienne période
var menu = _Divers.MenuElementByText(_Divers.Iif_langue(MercatorUi.Globals.Langue, "Verwaltung", "Administration", "Beheer", "Gestion"));
if (menu != null)
menu.SubItems.Add(new MercatorUi._BaseClasses.MenuElement("Màj stocks MIN par période", "", null, StockMin_Click));
}
}
void StockMin_Click(object sender, EventArgs e)
{
// Mise à jour stock min sur base des ventes ancienne période
var depot = Dialogs.AskDepot("Pour quel dépôt ?");
if (depot == null)
return;
bool bDefaultDepot = (Globals.DepotDef == depot.Id);
var dates = Dialogs.AskDates("Sur quelle période se baser pour générer les nouvelles valeurs MIN de stock ?");
if (dates == null || dates.GetLength(0) < 2)
return;
string filter = "";
Form wonTop = Globals.Main.WonTopForm();
if (wonTop != null)
{
var sigForm = wonTop as SigForm;
if (sigForm != null && sigForm.Sig.Module == MercatorUi.Sig._SigEnum.STOCK)
filter = sigForm.Filter;
}
if (!string.IsNullOrEmpty(filter))
if (!Dialogs.AnswerYesNo(string.Format("Appliquer le filtre '{0}' ?", filter)))
filter = "";
else
filter = " and " + filter;
string sqlQuery = @"select LIGNES_V.ID_ARTICLE, sum(LIGNES_V.Q) as Tot_Q
from PIEDS_V
inner join LIGNES_V on PIEDS_V.ID = LIGNES_V.ID and PIEDS_V.JOURNAL = LIGNES_V.JOURNAL and PIEDS_V.PIECE = LIGNES_V.PIECE
inner join STOCK on LIGNES_V.ID_ARTICLE = STOCK.S_ID -- this join is needed for filters to work
where (PIEDS_V.TYPE = 1)
and (LIGNES_V.ID_ARTICLE <> '')
and (PIEDS_V.DATE between @DATE_1 and @DATE_2)
and LIGNES_V.Q <> 0
and PIEDS_V.ID_DEPOT = @ID_DEPOT
{0}
group by ID_ARTICLE
order by ID_ARTICLE";
sqlQuery = string.Format(sqlQuery, filter);
var paramDate1 = new MercatorSqlParam("@DATE_1", dates[0]);
var paramDate2 = new MercatorSqlParam("@DATE_2", dates[1]);
var paramDepot = new MercatorSqlParam("@ID_DEPOT", depot.Id);
WaitStatic.WaitWindow("Calcul quantités vendues sur la période...");
var dataSet = Api.Zselect(Globals.RepData, sqlQuery, paramDate1, paramDate2, paramDepot);
WaitStatic.WaitClear();
if (dataSet != null && dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0)
{
if (Dialogs.AnswerYesNo(string.Format("{0} entrées trouvées\r\n\r\nMettre à jour les stocks min de ces articles ?", dataSet.Tables[0].Rows.Count)))
{
Progress.ProgressCreate(dataSet.Tables[0].Rows.Count);
var stringBuilder = new StringBuilder();
// Mise à zéro de tous les articles retournés par le filtre (ou tous si pas de filtre)
if (bDefaultDepot)
stringBuilder.AppendFormat("update STOCK set S_STOCKMIN = 0 where S_STOCKMIN<>0{0}\r\n", filter);
stringBuilder.AppendFormat("update dispo set dispo.STOCKMIN = 0 from DISPO inner join STOCK on dispo.ID_STOCK = stock.S_ID where STOCKMIN<>0 and ID_MAGASIN = '{0}'{1}\r\n\r\n", depot.Id, filter);
Api.TrimDataTable(dataSet.Tables[0]);
foreach (DataRow row in dataSet.Tables[0].Rows)
{
decimal Q = Convert.ToDecimal(row["Tot_Q"]);
string s_id = (string)row["ID_ARTICLE"];
// Ajout 10%
Q = Math.Ceiling(Q * 1.1m);
if (bDefaultDepot)
stringBuilder.AppendFormat("update STOCK set S_STOCKMIN = {0} where S_ID = '{1}'\r\n", Q, s_id);
stringBuilder.AppendFormat("update DISPO set STOCKMIN = {0} where ID_STOCK = '{1}' and ID_MAGASIN = '{2}'\r\n\r\n", Q, s_id, depot.Id);
Progress.ProgressIncrement(1);
}
WaitStatic.WaitWindow("Mise à jour des stocks min...");
bool result = Api.SqlExec(Globals.RepData, new SqlCommand(stringBuilder.ToString()));
WaitStatic.WaitClear();
Progress.ProgressDestroy();
if (result)
Dialogs.Stop("Mise à jour terminée avec succès !");
else
Dialogs.Stop("Une erreur est survenue : " + Api.LastError);
}
}
else
Dialogs.Stop("Aucune vente d'article n'a été trouvée pour cette période et ce dépôt !");
}
}
}