/// <summary> /// Edite la commande en fonction du type /// après retour du service intermag /// </summary> /// <param name="doPieceOrigin">N° de l'ABC qui a été envoyé au founisseur</param> /// <param name="magPiece"></param> /// <param name="ds"></param> /// <param name="targetDb"></param> /// <param name="typeIndex"></param> private void editCde(string doPieceOrigin, string magPiece, DataSet ds, string targetDb, int typeIndex) { try { if (openBaseCial() == false) { throw new Exception("Connexion à la base impossible"); } IBODocumentAchat3 docAOrigin = GetInstance().FactoryDocumentAchat.ReadPiece( DocumentType.DocumentTypeAchatCommandeConf, doPieceOrigin ); // Vérouille le doc docAOrigin.CouldModified(); if (typeIndex == 0) { editCommandeDepot(docAOrigin, magPiece); } else if (typeIndex == 1) { editCommandeRetro(docAOrigin, magPiece, targetDb); } } catch (Exception e) { throw new Exception(e.ToString()); } }
public bool DocumentIsClosed(string doPiece) { openBaseCial(); IBODocumentAchat3 docA = GetInstance().FactoryDocumentAchat.ReadPiece(DocumentType.DocumentTypeAchatCommandeConf, doPiece); docA.CouldModified(); return(true); }
/// <summary> /// Vérifie que le doc en cours ainsi que lees éventuels docs /// liés ne sont pas en cours d'utilisation /// </summary> /// <param name="CmLignes"></param> /// <param name="doPiece"></param> /// <returns></returns> public bool DocumentIsClosed(Collection <Contremarque> CmLignes, string doPiece) { if (openBaseCial()) { try { var doc = (IBODocumentVente3)GetDocument(doPiece); doc.CouldModified(); // Sinon le doc reste ouvert pour OM doc.Write(); } catch (Exception) { throw new Exception($"Veuillez fermer le document {doPiece}"); } foreach (Contremarque cm in CmLignes) { if (cm.Liaisons != null) { foreach (LiaisonCde li in cm.Liaisons) { if (li.Qte > 0) { try { IBODocumentAchat3 doc = GetInstance().FactoryDocumentAchat.ReadPiece(DocumentType.DocumentTypeAchatCommandeConf, li.NumPiece); doc.CouldModified(); // TODO doc.Read() doc.Write(); } catch (Exception) { throw new Exception($"Veuillez fermer le document {li.NumPiece}"); } } } } } } return(true); }
public bool DocumentIsClosed(string doPiece) { if (openBaseCial()) { try { IBODocumentAchat3 doc = GetInstance().FactoryDocumentAchat.ReadPiece(DocumentType.DocumentTypeAchatCommandeConf, doPiece); doc.CouldModified(); // Sinon le doc reste ouvert pour OM doc.Write(); } catch (Exception) { throw new Exception($"Veuillez fermer le document {doPiece}"); } } return(true); }
public Commande GetCommande(string DoPiece) { if (openBaseCial()) { var Doc = GetDocument(DoPiece); if (Doc == null) { throw new Exception($"Document {DoPiece} non trouvé"); } if (Doc.DO_Type != DocumentType.DocumentTypeAchatCommande) { Doc.Read(); throw new Exception("Le document doit être un APC."); } foreach (IBODocumentAchatLigne3 ligne in Doc.FactoryDocumentLigne.List) { if (ligne.FactoryDocumentLigneLienCM.List.Count > 0) { Doc.Read(); throw new Exception("Le document ne doit pas contenir de contremarque."); } } _OMDocument = (IBODocumentAchat3)Doc; //_OMDocument = GetInstance().FactoryDocumentAchat.ReadPiece(DocumentType.DocumentTypeAchatCommande, DoPiece); //_OMDocument.CouldModified(); } using (var cnx = new SqlConnection(cnxString)) { cnx.Open(); using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = @"SELECT AF.CT_Num, CT.FRANCO, CT.CT_Intitule, AG1.AG_No AS AG_No1, AG2.AG_No AS AG_No2, A.AR_PrixAch, A.AR_Ref, AE.AE_Ref, AG1.EG_Enumere AS Gamme1, AG2.EG_Enumere AS Gamme2, (SELECT SUM(DL_Qte) FROM F_DOCLIGNE WHERE AR_Ref = A.AR_Ref AND DO_Type = 7 AND MONTH(DL_DateBL) = MONTH(GETDATE()) AND YEAR(DL_DateBL) = YEAR(GETDATE())-1) AS Stat, DL.DL_Qte, DL.EU_Qte, A.AR_Sommeil, A.SUPPRIME, A.SUPPRIME_USINE, A.AR_Design, A.AR_CodeBarre, CASE WHEN ISNULL(TG.TG_Ref, '') = '' THEN AF.AF_RefFourniss ELSE TG.TG_Ref END AS RefFourn, AF.AF_Colisage, AF.AF_QteMini, D.DP_Code, AC.AC_PrixVen, UA.U_Intitule AS UniteAch, ISNULL(S.AS_QteMini, 0) AS AS_QteMini, ISNULL(S.AS_QteMaxi, 0) AS AS_QteMaxi, CASE WHEN AG1.EG_Enumere IS NOT NULL THEN ISNULL(GS.GS_QteSto, 0) ELSE ISNULL(S.AS_QteSto, 0) END AS QteSto, CASE WHEN AG1.EG_Enumere IS NOT NULL THEN ISNULL(GS.GS_QteCom, 0) ELSE ISNULL(S.AS_QteCom, 0) END AS QteCom, CASE WHEN AG1.EG_Enumere IS NOT NULL THEN ISNULL(GS.GS_QteRes, 0) ELSE ISNULL(S.AS_QteRes, 0) END AS QteRes, UV.U_Intitule AS UniteVen, CASE WHEN ISNULL(S.AS_QteMini, 0) = 0 OR A.AR_Sommeil = 1 OR A.SUPPRIME LIKE 'oui' OR A.SUPPRIME_USINE LIKE 'oui' THEN 0 ELSE 1 END AS OBS FROM F_ARTICLE A LEFT JOIN F_ARTGAMME AG1 ON AG1.AR_Ref = A.AR_Ref AND AG1.AG_Type = 0 LEFT JOIN F_ARTGAMME AG2 ON AG2.AR_Ref = A.AR_Ref AND AG2.AG_Type = 1 LEFT JOIN F_ARTENUMREF AE ON AE.AG_No1 = AG1.AG_No AND AE.AG_No2 = ISNULL(AG2.AG_No, 0) JOIN F_ARTFOURNISS AF ON AF.AR_Ref = A.AR_Ref JOIN F_COMPTET CT ON CT.CT_Num = AF.CT_Num LEFT JOIN F_TARIFGAM TG ON TG.AG_No1 = AG1.AG_No AND TG.AG_No2 = ISNULL(AG2.AG_No, 0) AND TG.TG_RefCF = AF.CT_Num LEFT JOIN F_ARTSTOCK S ON S.AR_Ref = A.AR_Ref LEFT JOIN F_GAMSTOCK GS ON GS.AR_Ref = A.AR_Ref AND GS.AG_No1 = AG1.AG_No AND GS.AG_No2 = ISNULL(AG2.AG_No, 0) JOIN P_UNITE AS UV ON UV.cbIndice = A.AR_UniteVen JOIN P_UNITE AS UA ON UA.cbIndice = AF.AF_Unite JOIN F_ARTCLIENT AC ON AC.AR_Ref = A.AR_Ref AND AC.AC_Categorie = 1 LEFT JOIN F_DEPOTEMPL D ON S.DE_No = D.DE_No AND S.DP_NoPrincipal = D.DP_No LEFT JOIN F_DOCLIGNE DL ON DL.AR_Ref = A.AR_Ref AND DL.DO_Piece = @doPiece WHERE AF.CT_Num = (SELECT DO_Tiers FROM F_DOCENTETE WHERE DO_Piece = @doPiece) AND AF.AF_Principal = 1 ORDER BY A.AR_Ref, Gamme1, Gamme2"; cmd.Parameters.AddWithValue("@doPiece", DoPiece); using (SqlDataReader reader = cmd.ExecuteReader()) { if (!reader.HasRows) { throw new Exception("Aucun résultat"); } _Commande = new Commande(); while (reader.Read()) { if (_Commande.CtNum == null) { _Commande.CtNum = reader["CT_Num"].ToString(); _Commande.Fournisseur = reader["CT_Intitule"].ToString(); _Commande.Piece = DoPiece; _Commande.Franco = reader["FRANCO"].ToString(); } var ligne = new LigneCommande() { ArRef = (string)reader["AR_Ref"], AeRef = (reader["AE_Ref"] == DBNull.Value) ? null : (string)reader["AE_Ref"], Gamme1 = (reader["Gamme1"] == DBNull.Value) ? null : (string)reader["Gamme1"], Gamme2 = (reader["Gamme2"] == DBNull.Value) ? null : (string)reader["Gamme2"], AGNo1 = (reader["AG_No1"] == DBNull.Value) ? (int?)null : (int)reader["AG_No1"], AGNo2 = (reader["AG_No2"] == DBNull.Value) ? (int?)null : (int)reader["AG_No2"], Stat = double.Parse(reader["Stat"] == DBNull.Value ? "0" : reader["Stat"].ToString()), Sommeil = (Int16)reader["AR_Sommeil"] == 1, Supprime = (string)reader["SUPPRIME"] == "Oui", SupprimeUsine = (string)reader["SUPPRIME_USINE"] == "Oui", RefFourn = (string)reader["RefFourn"], Designation = (string)reader["AR_Design"], UniteVente = (string)reader["UniteVen"], UniteAchat = (string)reader["UniteAch"], Colisage = double.Parse(reader["AF_Colisage"].ToString()), Qec = double.Parse(reader["AF_QteMini"].ToString()), StockMin = double.Parse(reader["AS_QteMini"].ToString()), StockMax = double.Parse(reader["AS_QteMaxi"].ToString()), pxTTC = double.Parse(reader["AC_PrixVen"].ToString()), Qte = (reader["DL_Qte"] == DBNull.Value) ? (double?)null : double.Parse(reader["DL_Qte"].ToString()), CodeBarre = reader["AR_CodeBarre"].ToString(), Emplacement = reader["DP_Code"].ToString(), Stock = (reader["QteSto"] == DBNull.Value) ? 0 : double.Parse(reader["QteSto"].ToString()), QteCom = double.Parse(reader["QteCom"].ToString()), QteRes = double.Parse(reader["QteRes"].ToString()), ArPrixAch = double.Parse(reader["AR_PrixAch"].ToString()), }; ligne.PropertyChanged += Ligne_PropertyChanged; _Commande.Lignes.Add(ligne); } return(_Commande); } } } }
private void addVbcLigneToAbcExistant(IBODocumentVenteLigne3 ligneV, LiaisonCde liaison) { IBODocumentAchat3 docA = GetInstance().FactoryDocumentAchat.ReadPiece(DocumentType.DocumentTypeAchatCommandeConf, liaison.NumPiece); foreach (IBODocumentAchatLigne3 ligneA in docA.FactoryDocumentLigne.List) { int dlNoIn = int.Parse(ligneA.InfoLibre["DLNo"]); if (dlNoIn == liaison.DLNoIn) { // Si la quantité demandée est inférieure à la quantité de la ligne if (liaison.Qte < liaison.DlQteBL) { IBODocumentAchatLigne3 liaisonALigne = (IBODocumentAchatLigne3)docA.FactoryDocumentLigne.Create(); addArticleFromLigneAToLigneB(ligneA, liaisonALigne, liaison.Qte); // Force le prix d'achat de la ligne d'origine (peut être une cde depot) if (liaisonALigne.Fournisseur.CT_Num != ligneA.Article.FournisseurPrincipal.Fournisseur.CT_Num) { liaisonALigne.DL_PrixUnitaire = ligneA.DL_PrixUnitaire; } double conversion = 1; double convDiv = 1; foreach (IBOArticleTarifFournisseur3 tarif in ligneA.Article.FactoryArticleTarifFournisseur.List) { if (tarif.Fournisseur == docA.Fournisseur) { conversion = tarif.AF_Conversion; convDiv = tarif.AF_ConvDiv; } } liaisonALigne.DL_Qte = liaison.Qte; liaisonALigne.EU_Qte = (liaison.Qte / conversion) * convDiv; liaisonALigne.SetDefaultRemise(); liaisonALigne.Collaborateur = ligneV.Collaborateur; liaisonALigne.DO_Ref = liaison.DlNoOut.ToString(); liaisonALigne.DL_Design = ligneV.DL_Design; liaisonALigne.TxtComplementaire = ligneV.TxtComplementaire; liaisonALigne.Write(); liaisonALigne.Refresh(); dlNoIn = int.Parse(liaisonALigne.InfoLibre["DLNo"]); // Si la ligne d'origine avait déjà une contremarque if (liaison.CMQteTotal > 0) { ligneA.DL_Qte = liaison.DlQteBL - liaison.Qte; ligneA.EU_Qte = (ligneA.DL_Qte / conversion) * convDiv; ligneA.SetDefaultRemise(); ligneA.Write(); } else { // Crée une nouvelle ligne avec le delta à partir de la ligne d'origine IBODocumentAchatLigne3 ligneACopy = (IBODocumentAchatLigne3)docA.FactoryDocumentLigne.Create(); double delta = liaison.DlQteBL - liaison.Qte; addArticleFromLigneAToLigneB(ligneA, ligneACopy, delta); if (ligneACopy.Fournisseur.CT_Num != ligneA.Article.FournisseurPrincipal.Fournisseur.CT_Num) { ligneACopy.DL_PrixUnitaire = ligneA.DL_PrixUnitaire; } ligneACopy.DL_Qte = delta; ligneACopy.EU_Qte = (delta / conversion) * convDiv; ligneACopy.SetDefaultRemise(); ligneACopy.Collaborateur = ligneA.Collaborateur; ligneACopy.DL_Design = ligneA.DL_Design; ligneACopy.TxtComplementaire = ligneA.TxtComplementaire; ligneACopy.Write(); ligneACopy.Refresh(); // Supprime la ligne d'origine ligneA.Remove(); } } // Ajout de la CM using (SqlConnection cnx = new SqlConnection(cnxString)) { cnx.Open(); using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = @"INSERT INTO F_CMLIEN(DL_NoOut, DL_NoIn, CM_Qte) VALUES(@dlNoOut, @dlNoIn, @cmQte)"; cmd.Parameters.AddWithValue("@dlNoOut", ligneV.InfoLibre["DLNo"]); cmd.Parameters.AddWithValue("@dlNoIn", dlNoIn); cmd.Parameters.AddWithValue("@cmQte", liaison.Qte); cmd.ExecuteNonQuery(); } } } } }
/// <summary> /// Génère des APC en contremarque /// Envoi les APC au magasin cible /// </summary> /// <param name="CmLignes"></param> /// <param name="doPiece"></param> /// <param name="disableIntermag"></param> public void saveAll(Collection <Contremarque> CmLignes, string doPiece, bool disableIntermag) { var docV = (IBODocumentVente3)GetDocument(doPiece); if (!openBaseCial()) { throw new Exception("Impossible de se connecter à Sage :-("); } #region Ajout ABC Existant // Prétraitement Si Ajout à ABC existant foreach (IBODocumentVenteLigne3 ligneV in docV.FactoryDocumentLigne.List) { int DLNo = int.Parse(ligneV.InfoLibre["DLNo"]); if (CmLignes.Count(c => c.DlNo == DLNo) == 0) { continue; } Contremarque cm = CmLignes.Where(c => c.DlNo == DLNo).First(); if (!cm.RowChecked) { continue; } // Ajout a ABC existant (1 seul possible) double liaisonTot = cm.Liaisons.Sum(l => l.Qte); if (liaisonTot > 0) { IEnumerable <LiaisonCde> liaisons = cm.Liaisons.Where(l => l.Qte > 0); LiaisonCde liaison = liaisons.First(); Log($"Réserve {liaison.Qte} x {cm.RefMag} sur {liaison.NumPiece} existant"); liaison.DlNoOut = int.Parse(ligneV.InfoLibre["DLNo"]); addVbcLigneToAbcExistant(ligneV, liaison); } } #endregion Ajout ABC Existant #region Groupe les lignes par fournisseur var dict = new Dictionary <string, Collection <Contremarque> >(); foreach (Contremarque cm in CmLignes) { // Ne prend pas en compte les lignes déjà en contremarque ou avec liaison if (!cm.RowChecked || cm.NumPiece != "" || cm.Liaisons.Sum(l => l.Qte) > 0) { continue; } string key = cm.SelectedFourn == "Principal" ? cm.FournPrinc : cm.SelectedFourn; if (!dict.ContainsKey(key)) { dict.Add(key, new Collection <Contremarque>()); } dict[key].Add(cm); } if (dict.Count == 0) { return; } #endregion Groupe les lignes par fournisseur #region Ajout contremarque foreach (KeyValuePair <string, Collection <Contremarque> > entry in dict) { IPMDocument procDocA; IBOFournisseur3 fourn; if (!entry.Value[0].IsInterMag) { // Génération d'un APC Fournisseur Log($"Génération d'un APC Fournisseur principal {entry.Value[0].FournPrinc}"); procDocA = GetInstance().CreateProcess_Document(DocumentType.DocumentTypeAchatCommande); fourn = GetInstance().CptaApplication.FactoryFournisseur.ReadNumero(entry.Value[0].FournPrinc); } else { // Génération d'un ABC InterMag Log($"Génération d'un ABC Fournisseur intermag {entry.Key}"); procDocA = GetInstance().CreateProcess_Document(DocumentType.DocumentTypeAchatCommandeConf); using (SqlConnection cnx = new SqlConnection(cnxString)) { cnx.Open(); using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = "SELECT CT_Num FROM F_COMPTET WHERE CT_Classement = @abrege AND CT_Type = 1"; cmd.Parameters.AddWithValue("@abrege", entry.Value[0].SelectedFourn); using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) { reader.Read(); fourn = GetInstance() .CptaApplication.FactoryFournisseur.ReadNumero((string)reader["CT_Num"]); } } } } IBODocumentAchat3 docAEntete = (IBODocumentAchat3)procDocA.Document; docAEntete.DO_DateLivr = docV.DO_DateLivr; docAEntete.SetDefaultFournisseur(fourn); docAEntete.Collaborateur = docV.Collaborateur; foreach (Contremarque cm in entry.Value) { IBODocumentAchatLigne3 docALigne = null; if (cm.IsCommentaire) { docALigne = (IBODocumentAchatLigne3)docAEntete.FactoryDocumentLigne.Create(); docALigne.DL_Design = cm.Design; docALigne.WriteDefault(); } else { // Retrouve la ligne de vente pour ajouter l'article foreach (IBODocumentVenteLigne3 ligneV in docV.FactoryDocumentLigne.List) { int DLNo = int.Parse(ligneV.InfoLibre["DLNo"]); if (DLNo == cm.DlNo) { double qt = cm.QteTotal; docALigne = (IBODocumentAchatLigne3)addArticleFromLigne(procDocA, ligneV, qt); docALigne.DL_Design = cm.Design; // Applique par defaut le conditionnement de vente docALigne.DL_Qte = qt; docALigne.EU_Qte = qt; docALigne.EU_Enumere = ligneV.Article.Unite.Intitule; docALigne.AF_RefFourniss = cm.RefFourn; // Tente de convertir si fourn princ foreach (IBOArticleTarifFournisseur3 tarif in docALigne.Article.FactoryArticleTarifFournisseur.List) { if (tarif.Fournisseur == fourn && tarif.AF_ConvDiv != tarif.AF_Conversion) { //Debug.Print($"{tarif.Article.AR_Ref}, {tarif.AF_Conversion}, {tarif.AF_ConvDiv}"); double qtColisee = qt * (tarif.AF_ConvDiv / tarif.AF_Conversion); docALigne.EU_Qte = qtColisee; docALigne.EU_Enumere = tarif.Unite.Intitule; } } docALigne.SetDefaultRemise(); docALigne.Collaborateur = docV.Collaborateur; docALigne.DO_Ref = cm.DlNo.ToString(); docALigne.DO_DateLivr = ligneV.DO_DateLivr; docALigne.TxtComplementaire = cm.TexteComplementaire; docALigne.Write(); } } } } // Si devis => Demande de prix // On applique après lacréation des ligne car sinon le DO_Ref va se copier sur chaque ligne if (CmLignes.First().Type == 0) { docAEntete.DO_Ref = "DEMANDE PRIX"; docAEntete.DO_Statut = DocumentStatutType.DocumentStatutTypeSaisie; } else { docAEntete.DO_Ref = "RESERVATION"; docAEntete.DO_Statut = DocumentStatutType.DocumentStatutTypeAPrepare; } // On vire les articles liés en doublons // on le sait car le champs DO_Ref est vide foreach (IBODocumentAchatLigne3 ligne in procDocA.Document.FactoryDocumentLigne.List) { if (ligne.DO_Ref == "") { ligne.Remove(); } } if (procDocA.CanProcess) { procDocA.Process(); foreach (IBODocumentAchatLigne3 ligne in GetDocument(docAEntete.DO_Piece).FactoryDocumentLigne.List) { if (ligne.Article != null && (ligne.Article.AR_Ref == "DIVERS" || ligne.Article.Famille.FA_CodeFamille == "UNIQUE")) { new DiversRepository().saveLigneAchat(ligne); } } } else { Log(GetProcessError(procDocA)); return; } Log($"Document {docAEntete.DO_Piece} créé."); // Création des lignes de contremarque // Log("Création des lignes de contremarque"); using (SqlConnection cnx = new SqlConnection(cnxString)) { cnx.Open(); foreach (Contremarque cm in entry.Value) { if (cm.IsCommentaire || cm.IsRemarqueInterne) { continue; } using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = @"INSERT INTO F_CMLIEN(DL_NoOut, DL_NoIn, CM_Qte) VALUES(@dlNoOut, (SELECT DL_No FROM F_DOCLIGNE WHERE DO_Ref = @dlNoOut AND DO_Piece = @doPiece), @cmQte)"; cmd.Parameters.AddWithValue("@dlNoOut", cm.DlNo.ToString()); cmd.Parameters.AddWithValue("@doPiece", docAEntete.DO_Piece); cmd.Parameters.AddWithValue("@cmQte", Convert.ToDouble(cm.Qte, CultureInfo.CurrentCulture)); cmd.ExecuteNonQuery(); } } // Maj les NumPiece du doc achat using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = "UPDATE F_DOCLIGNE SET DO_Ref = NULL, NumPiece = dbo.GET_CM_PIECE(DL_No) WHERE DO_Piece = @doPiece"; cmd.Parameters.AddWithValue("@doPiece", docAEntete.DO_Piece); cmd.ExecuteNonQuery(); } // Si c'est une commande intermag on envoie en intermag if (entry.Value[0].IsInterMag) { // TODO A surveiller, reload le doc depuis la base car erreur Accès refusé var docAchat = (IBODocumentAchat3)GetDocument(docAEntete.DO_Piece); docAchat.DO_Statut = DocumentStatutType.DocumentStatutTypeSaisie; docAchat.Write(); if (disableIntermag) { Log("La commande ne sera pas envoyée par intermag"); } else { Log("Envoi de la commande intermag"); InterMagRepository imRepos = new InterMagRepository(); imRepos.Log += new InterMagRepository.LogEventHandler(Log); imRepos.sendSqlCde(imRepos.getCommande(docAEntete.DO_Piece), entry.Value[0].SelectedFourn); } } } Log("------"); } // endforeach dict // Maj les numPieces du doc vente using (var cnx = new SqlConnection(cnxString)) { cnx.Open(); using (var cmd = cnx.CreateCommand()) { cmd.CommandText = "UPDATE F_DOCLIGNE SET DO_Ref = NULL, NumPiece = dbo.GET_CM_PIECE(DL_No) WHERE DO_Piece = @doPiece"; cmd.Parameters.AddWithValue("@doPiece", docV.DO_Piece); cmd.ExecuteNonQuery(); } } #endregion Ajout contremarque }
/// <summary> /// Cde Retro: Duplique le bon de commande fournisseur en cde magasin /// </summary> /// <param name="docOrigin"></param> /// <param name="magPieces"></param> /// <param name="targetDb"></param> private void editCommandeRetro(IBODocumentAchat3 docOrigin, string magPieces, string targetDb) { try { // Commande RETRO IBOFournisseur3 fourn; using (SqlConnection cnx = new SqlConnection(cnxString)) { cnx.Open(); using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = "SELECT CT_Num FROM F_COMPTET WHERE CT_Classement = @ctClassement AND CT_Type = 1"; cmd.Parameters.AddWithValue("@ctClassement", targetDb); using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) { if (reader.HasRows) { reader.Read(); fourn = GetInstance().CptaApplication.FactoryFournisseur.ReadNumero(reader["CT_Num"].ToString()); } else { throw new Exception($"Fournisseur '{targetDb}' non trouvé"); } } } } // Duplication du doc d'origine en document d'achat magasin IPMDocument procDoc = GetInstance().CreateProcess_Document(DocumentType.DocumentTypeAchatCommandeConf); IBODocumentAchat3 docNew = (IBODocumentAchat3)procDoc.Document; docNew.SetDefaultDO_Piece(); docNew.DO_Statut = DocumentStatutType.DocumentStatutTypeConfirme; docNew.DO_Ref = magPieces; docNew.SetDefaultFournisseur(fourn); docNew.Collaborateur = docOrigin.Collaborateur; IBODocumentAchatLigne3 docNewLigne; foreach (IBODocumentAchatLigne3 docOrigineLigne in docOrigin.FactoryDocumentLigne.List) { if (docOrigineLigne.Article == null) { // Ligne de commentaire docNewLigne = (IBODocumentAchatLigne3)docNew.FactoryDocumentLigne.Create(); docNewLigne.DL_Design = docOrigineLigne.DL_Design; docNewLigne.Write(); } else { docNewLigne = (IBODocumentAchatLigne3)addArticleFromLigne(procDoc, docOrigineLigne, docOrigineLigne.DL_Qte); docNewLigne.AF_RefFourniss = docOrigineLigne.AF_RefFourniss; docNewLigne.Taxe[0] = GetInstance().CptaApplication.FactoryTaxe.ReadCode("8"); docNewLigne.DL_PrixUnitaire = docOrigineLigne.DL_MontantHT / docOrigineLigne.DL_Qte; docNewLigne.SetDefaultRemise(); docNewLigne.DO_Ref = docOrigineLigne.InfoLibre["DLNo"]; docNewLigne.TxtComplementaire = docOrigineLigne.TxtComplementaire; docNewLigne.DL_Design = docOrigineLigne.DL_Design; docNewLigne.Write(); } } if (procDoc.CanProcess) { procDoc.Process(); foreach (IBODocumentAchatLigne3 ligne in GetDocument(docNew.DO_Piece).FactoryDocumentLigne.List) { if (ligne.Article != null && (ligne.Article.AR_Ref == "DIVERS" || ligne.Article.Famille.FA_CodeFamille == "UNIQUE")) { new DiversRepository().saveLigneAchat(ligne); } } using (SqlConnection cnx = new SqlConnection(cnxString)) { cnx.Open(); // Met à jour les infos libres using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = @"UPDATE F_DOCENTETE SET [Date Statut] = GETDATE(), [RETRO_FOURN] = @retroFourn WHERE DO_Piece = @doPiece"; cmd.Parameters.AddWithValue("@doPiece", docNew.DO_Piece); cmd.Parameters.AddWithValue("@retroFourn", docOrigin.Fournisseur.CT_Num); cmd.ExecuteNonQuery(); } } docNew.Refresh(); } else { throw new Exception(GetProcessError(procDoc)); } // Met à jour la référence du doc origine docOrigin.DO_Ref = $"Voir {docNew.DO_Piece}"; docOrigin.DO_Statut = DocumentStatutType.DocumentStatutTypeConfirme; docOrigin.Write(); // Contremarque using (SqlConnection cnx = new SqlConnection(cnxString)) { cnx.Open(); SqlTransaction transaction = cnx.BeginTransaction(); try { using (SqlCommand cmd = cnx.CreateCommand()) { cmd.Transaction = transaction; // Recup les lignes du doc d'origine cmd.CommandText = @"SELECT CM.DL_NoIn, CM.DL_NoOut, CM_Qte FROM F_CMLIEN CM JOIN F_DOCLIGNE DL ON DL.DL_No = CM.DL_NoIn WHERE DL.DO_PIECE = @doPiece "; cmd.Parameters.AddWithValue("@doPiece", docOrigin.DO_Piece); using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.HasRows) { // Y a de la contremarque sur le doc while (reader.Read()) { int dlNoIn = (int)reader["DL_NoIn"]; using (SqlCommand cmd3 = cnx.CreateCommand()) { cmd3.Transaction = transaction; cmd3.CommandText = "UPDATE F_CMLIEN SET DL_NoIn = (SELECT DL_No FROM F_DOCLIGNE WHERE DO_Ref = @dlNoIn) WHERE DL_NoIn = @dlNoIn"; cmd3.Parameters.AddWithValue("@dlNoIn", dlNoIn.ToString()); cmd3.ExecuteNonQuery(); } // On remplace DO_Ref par sa valeur réelle using (SqlCommand cmdUpd = cnx.CreateCommand()) { cmdUpd.Transaction = transaction; cmdUpd.CommandText = "UPDATE F_DOCLIGNE SET DO_Ref = @doRef WHERE DO_Ref = @uid"; cmdUpd.Parameters.AddWithValue("@doRef", magPieces); cmdUpd.Parameters.AddWithValue("@uid", docOrigin.DO_Piece + dlNoIn); cmdUpd.ExecuteNonQuery(); } } } } transaction.Commit(); } } catch (Exception e) { transaction.Rollback(); throw new Exception(e.ToString()); } } Log($"{dbName} :: Doc Achat {docOrigin.DO_Piece} dupliqué vers le doc achat {docNew.DO_Piece}"); // Met à jour la commande distante IntermagServiceClient client = createClient(targetDb); client.SetDoRef(docNew.DO_Piece, targetDb, magPieces.Split('/')[0]); client.Close(); // Suppression du document fournisseur d'origine if (MessageBox.Show( "Souhaitez-vous supprimer le document fournisseur d'origine?", "Suppression doc origine", MessageBoxButtons.YesNo) == DialogResult.Yes) { docOrigin.Remove(); } else { Log($"Vous devrez supprimer le document d'achat n° {docOrigin.DO_Piece} manuellement."); // Dévérouille le doc docOrigin.Read(); } } catch (Exception e) { throw new Exception(e.ToString()); } }
/// <summary> /// Cde dépot: Met à jour les prix, statut ... /// </summary> /// <param name="docAOrigin"></param> /// <param name="magPiece"></param> private void editCommandeDepot(IBODocumentAchat3 docAOrigin, string magPiece) { try { // Commande Dépôt docAOrigin.DO_Ref = magPiece; docAOrigin.DO_Statut = DocumentStatutType.DocumentStatutTypeConfirme; //docAOrigin.InfoLibre["Date Statut"] = DateTime.Now; docAOrigin.Write(); using (SqlConnection cnx = new SqlConnection(cnxString)) { cnx.Open(); using (SqlCommand cmd = cnx.CreateCommand()) { cmd.CommandText = "UPDATE F_DOCENTETE SET [Date Statut] = GETDATE() WHERE DO_Piece = @doPiece"; cmd.Parameters.AddWithValue("@doPiece", docAOrigin.DO_Piece); cmd.ExecuteNonQuery(); } } docAOrigin.Refresh(); // Simule une commande client Tarif 6 pour recup les prix remisés // et les appliquer au doc d'achat IPMDocument procDocV = GetInstance().CreateProcess_Document(DocumentType.DocumentTypeVenteCommande); IBODocumentVente3 docVEntete = (IBODocumentVente3)procDocV.Document; docVEntete.SetDefaultClient(GetInstance().CptaApplication.FactoryClient.ReadNumero("DEVEL")); docVEntete.CategorieTarif = GetInstance().FactoryCategorieTarif.ReadIntitule("Tarif Article N° 6"); IBODocumentVenteLigne3 docVLigne; foreach (IBODocumentAchatLigne3 ligneOrigin in docAOrigin.FactoryDocumentLigne.List) { if (ligneOrigin.Article != null) { Debug.Print(ligneOrigin.Article.AR_Ref); docVLigne = (IBODocumentVenteLigne3)docVEntete.FactoryDocumentLigne.Create(); IBOArticle3 a = ligneOrigin.Article; double qte = ligneOrigin.DL_Qte; docVLigne.SetDefaultArticle(a, qte); docVLigne.SetDefaultRemise(); ligneOrigin.DL_PrixUnitaire = docVLigne.DL_PrixUnitaire; ligneOrigin.Remise.FromString(docVLigne.Remise.ToString()); ligneOrigin.DO_Ref = magPiece; ligneOrigin.Write(); if (ligneOrigin.Article.AR_Ref == "DIVERS" || ligneOrigin.Article.Famille.FA_CodeFamille == "UNIQUE") { new DiversRepository().saveLigneAchat(ligneOrigin); } } } // Déverrouille le doc docAOrigin.Read(); } catch (Exception e) { throw new Exception(e.ToString()); } }