private bool doIntegrazione(DataTable tEntryDetailSource) { if (tEntryDetailSource == null) { MessageBox.Show(this, "La tabella dei dettagli scritture non è definita", "Errore"); return(false); } if (tEntryDetailSource.Rows.Count == 0) { MessageBox.Show(this, "La tabella dei dettagli scritture risulta vuota", "Avvertimento"); return(true); } DataTable tEntry = DataAccess.CreateTableByName(Meta.Conn, "entry", "*"); DataTable tEntryDetail = DataAccess.CreateTableByName(Meta.Conn, "entrydetail", "*"); DataSet ds = new DataSet(); ds.Tables.Add(tEntry); ds.Tables.Add(tEntryDetail); RowChange.SetOptimized(ds.Tables["entry"], true); RowChange.ClearMaxCache(ds.Tables["entry"]); RowChange.SetOptimized(ds.Tables["entrydetail"], true); RowChange.ClearMaxCache(ds.Tables["entrydetail"]); ds.Relations.Add("entryentrydetail", new DataColumn[] { tEntry.Columns["yentry"], tEntry.Columns["nentry"] }, new DataColumn[] { tEntryDetail.Columns["yentry"], tEntryDetail.Columns["nentry"] }, false); int currYear = (int)Meta.GetSys("esercizio"); MetaData MEntry = MetaData.GetMetaData(this, "entry"); MEntry.SetDefaults(ds.Tables["entry"]); MetaData.SetDefault(ds.Tables["entry"], "yentry", currYear); DateTime jan01 = new DateTime(currYear, 1, 1); object descr = "Integrazione dei risconti"; if (!doVerify()) { return(false); } DataRow rEntry3 = MEntry.Get_New_Row(null, ds.Tables["entry"]); //3-->5 rettifica DataRow rEntry8 = MEntry.Get_New_Row(null, ds.Tables["entry"]); //8-->15 commessa completata DataRow rEntry13 = MEntry.Get_New_Row(null, ds.Tables["entry"]); //13-->14 percentuale completamento rEntry3["identrykind"] = 5; rEntry3["adate"] = jan01; rEntry3["description"] = descr; rEntry8["identrykind"] = 15; rEntry8["adate"] = jan01; rEntry8["description"] = "Integrazione risconti Commessa completata"; //task 8769 rEntry13["identrykind"] = 14; rEntry13["adate"] = jan01; rEntry13["description"] = "Chiusura ratei percentuale completamento"; //task 8769 Dictionary <int, DataRow> parentRow = new Dictionary <int, DataRow>(); parentRow[3] = rEntry3; parentRow[8] = rEntry8; parentRow[13] = rEntry13; Dictionary <int, int> nChild = new Dictionary <int, int>(); nChild[3] = 0; nChild[8] = 0; nChild[13] = 0; string campoRiscontoAttivo = "idacc_deferredrevenue"; string campoRiscontoPassivo = "idacc_deferredcost"; //string campoRateoAttivo = "idacc_accruals"; object idacc_riscontoA = Meta.Conn.DO_READ_VALUE("config", QHS.CmpEq("ayear", currYear), campoRiscontoAttivo); if ((idacc_riscontoA == null) || (idacc_riscontoA == DBNull.Value)) { MessageBox.Show(this, "Attenzione non è stato specificato il conto del risconto attivo", "Errore"); return(false); } object idacc_riscontoP = Meta.Conn.DO_READ_VALUE("config", QHS.CmpEq("ayear", currYear), campoRiscontoPassivo); if ((idacc_riscontoP == null) || (idacc_riscontoP == DBNull.Value)) { MessageBox.Show(this, "Attenzione non è stato specificato il conto del risconto passivo", "Errore"); return(false); } MetaData MEntryDetail = MetaData.GetMetaData(this, "entrydetail"); MEntryDetail.SetDefaults(ds.Tables["entrydetail"]); MetaData.SetDefault(ds.Tables["entrydetail"], "yentry", currYear); //Emilia mi ha confermato che al momento lasciamo questa esclusione su tutta la upb 7/9/2018 Dictionary <string, bool> upbRateoAttivo = new Dictionary <string, bool>(); foreach (DataRow curr in tEntryDetailSource.Rows) { //fa un prescan di tutte le upb movimentate con un conto di rateo attivo int identrykind = CfgFn.GetNoNullInt32(curr["identrykind"]); object idAcc = curr["idacc"]; object newIdAcc = attualizzaAccount(idAcc); if (newIdAcc == DBNull.Value || newIdAcc == null) { MessageBox.Show("Non sono riuscito ad attualizzare il conto di codice " + conn.DO_READ_VALUE("account", QHS.CmpEq("idacc", idAcc), "codeacc"), "Errore"); continue; } object idRateoAttivo = attualizzaAccount(curr["idacc_accruals"]); // getRateoAttivo(Curr["idupb"].ToString()); if (identrykind == 8 && newIdAcc.Equals(idRateoAttivo)) { upbRateoAttivo[curr["idupb"].ToString()] = true; } } foreach (DataRow curr in tEntryDetailSource.Rows) { int identrykind = CfgFn.GetNoNullInt32(curr["identrykind"]); decimal importoDettaglio = CfgFn.GetNoNullDecimal(curr["amount"]); if (importoDettaglio == 0) { continue; } string idupb = curr["idupb"].ToString(); //solo per le tipo 8 saltiamo le upb movimentate con una scrittura tipo 8 come rateo attivo if ((identrykind == 8) && upbRateoAttivo.ContainsKey(idupb)) { continue; } object idAcc = curr["idacc"]; object newIdAcc = attualizzaAccount(idAcc); if (newIdAcc == DBNull.Value || newIdAcc == null) { MessageBox.Show("Non sono riuscito ad attualizzare il conto di codice " + conn.DO_READ_VALUE("account", QHS.CmpEq("idacc", idAcc), "codeacc"), "Errore"); continue; } string placcpart = valutaIdAcc(newIdAcc); if ((placcpart != "C") && (placcpart != "R")) { continue; } object idRiscontoPassivo = DBNull.Value; if (placcpart == "R") { idRiscontoPassivo = attualizzaAccount(curr["idacc_deferredcost"]); //getRiscontoPassivo(Curr["idupb"].ToString()); if (idRiscontoPassivo == DBNull.Value || idRiscontoPassivo == null) { idRiscontoPassivo = idacc_riscontoP; } } if (placcpart == "R" && identrykind == 3) { idRiscontoPassivo = idacc_riscontoP; } object idRateoAttivo = DBNull.Value; idRateoAttivo = attualizzaAccount(curr["idacc_accruals"]); // getRateoAttivo(Curr["idupb"].ToString()); //if (idRateoAttivo == DBNull.Value || idRateoAttivo == null) { // //string codiceUpb = // // conn.DO_READ_VALUE("upb", "codeupb", QHS.CmpEq("idupb", Curr["idupb"])).ToString(); // //MessageBox.Show("Conto di rateo attivo non configurato per l'UPB di codice " + codiceUpb, // // "Errore"); // continue; //} int flagaccountusage = CfgFn.GetNoNullInt32(curr["flagaccountusage"]); //per le tipo 8 (Assestamento Commessa Completata) prende solo i risconti //if ((identrykind == 8) && ((flagaccountusage & 12)==0)) continue; //per le tipo 3 (Risconto Rettifica) salta i conti di risconto if ((identrykind == 3) && (newIdAcc.Equals(idacc_riscontoA)) || (newIdAcc.Equals(idRiscontoPassivo))) { continue; } //per le tipo 8 (Assestamento Commessa Completata) salta i conti di rateo attivo //if (identrykind == 8 && newIdAcc.Equals(idRateoAttivo)) continue; //per le tipo 8 (Assestamento Commessa Completata) salta quelle che non sono di ricavo in dare if ((identrykind == 8) && ((placcpart != "R"))) { continue; //||(importoDettaglio>0) task 11249 non filtro più dare o avere } //per le tipo 13 (Assestamento Percentuale di Completamento) salta quelle che non sono di ricavo in avere if ((identrykind == 13) && ((placcpart != "R") || (importoDettaglio < 0))) { continue; } if ((identrykind == 13) && (placcpart == "C")) { string codeacc = conn.DO_READ_VALUE("account", QHS.CmpEq("idacc", idAcc), "codeacc").ToString(); MessageBox.Show("Il conto di codice " + codeacc + " non è un conto di ricavo ma è presente in una scrittura di tipo:\n\r" + "Assestamento Percentuale di Completamento" , "Errore"); continue; } object idaccountDare = DBNull.Value; object idaccountAvere = DBNull.Value; object riscontoChoosen = ""; if (placcpart == "C") { riscontoChoosen = idacc_riscontoA; } else { riscontoChoosen = idRiscontoPassivo; } if (identrykind == 3 || identrykind == 8) { idaccountDare = newIdAcc; idaccountAvere = riscontoChoosen; } else { idaccountDare = newIdAcc; idaccountAvere = idRateoAttivo; } DataRow rEntry = parentRow[identrykind]; nChild[identrykind] = nChild[identrykind] + 1; // Dettaglio COSTO - RICAVO (Non ho il problema di controllare l'esistenza di una riga pregressa // perché per come è costruita la tabella le righe sono tutte diverse tra di loro DataRow rEntryDetailCR = MEntryDetail.Get_New_Row(rEntry, ds.Tables["entrydetail"]); rEntryDetailCR["amount"] = -importoDettaglio; rEntryDetailCR["idacc"] = idaccountDare; foreach (string field in new string[] { "idreg", "idupb", "idepexp", "idepacc", "idsor1", "idsor2", "idsor3", "idaccmotive", "competencystart", "competencystop", "idrelated" }) { rEntryDetailCR[field] = curr[field]; } //EP.EffettuaScrittura(idepcontext, importoRisconto, idAcc, Curr["idreg"], Curr["idupb"], // jan01, Curr["competencystop"], null, Curr["idaccmotive"]); //// Dettaglio RISCONTO //string filter = costruisciFiltro(riscontoChoosen, Curr); //if (tEntryDetail.Select(filter).Length > 0) { // DataRow rFound = tEntryDetail.Select(filter)[0]; // rFound["amount"] = CfgFn.GetNoNullDecimal(rFound["amount"]) + importoDettaglio; //} //else { // DataRow rEntryDetailRis = MEntryDetail.Get_New_Row(rEntry, ds.Tables["entrydetail"]); // rEntryDetailRis["amount"] = importoDettaglio; // rEntryDetailRis["idacc"] = idaccountAvere; // foreach (string field in new string[] {"idreg", "idupb", "idepexp", "idepacc", "idsor1", "idsor2", "idsor3", // "idaccmotive", "competencystart", "competencystop"}) { // rEntryDetailRis[field] = Curr[field]; // } //} DataRow rEntryDetailRis = MEntryDetail.Get_New_Row(rEntry, ds.Tables["entrydetail"]); rEntryDetailRis["amount"] = importoDettaglio; rEntryDetailRis["idacc"] = idaccountAvere; foreach (string field in new string[] { "idreg", "idupb", "idepexp", "idepacc", "idsor1", "idsor2", "idsor3", "idaccmotive", "competencystart", "competencystop", "idrelated" }) { rEntryDetailRis[field] = curr[field]; } } foreach (int kind in new int[] { 3, 8, 13 }) { if (nChild[kind] == 0) { parentRow[kind].Delete(); } } if (ds.Tables["entry"].Rows.Count == 0) { MessageBox.Show(this, "Nessuna operazione da integrare.", "Avviso"); return(true); } FrmEntryPreSave frm = new FrmEntryPreSave(ds.Tables["entrydetail"], Meta.Conn, tEntryDetailSource); DialogResult dr = frm.ShowDialog(); if (dr != DialogResult.OK) { MessageBox.Show(this, "Operazione Annullata!", "Avviso"); return(true); } PostData Post = new Easy_PostData_NoBL(); Post.InitClass(ds, Meta.Conn); if (Post.DO_POST()) { DataRow rEntryPosted = ds.Tables["entry"].Rows[0]; EditRelatedEntryByKey(rEntryPosted); MessageBox.Show(this, "Integrazione dei residui completata con successo!"); } else { MessageBox.Show(this, "Errore nel salvataggio della scrittura di integrazione!", "Errore"); } return(true); }
/* * Estrae tutti i dettagli scrittura associati allo stato patrimoniale, della scrittura di epilogo dell'anno precedente. * TODO * Deve fare questo calcolo distinguendo per idupb, idreg */ private bool doApertura() { if (!doVerify()) { return(false); } DataTable tEntry = DataAccess.CreateTableByName(Meta.Conn, "entry", "*"); DataTable tEntryDetail = DataAccess.CreateTableByName(Meta.Conn, "entrydetail", "*"); DataSet ds = new DataSet(); ds.Tables.Add(tEntry); metaEntry.SetDefaults(tEntry); ds.Tables.Add(tEntryDetail); metaEntryDetail.SetDefaults(tEntryDetail); tEntry.setOptimized(true); RowChange.ClearMaxCache(tEntry); tEntryDetail.setOptimized(true); RowChange.ClearMaxCache(tEntryDetail); ds.Relations.Add(new DataRelation("x", new[] { tEntry.Columns["yentry"], tEntry.Columns["nentry"] }, new[] { tEntryDetail.Columns["yentry"], tEntryDetail.Columns["nentry"] }, false )); int lastEsercizio = esercizio - 1; string query = "SELECT ED.amount, ACC.codeacc as olcodeacc, LKP.newidacc as idacc, LKACC.codeacc, LKACC.title as account," + " ED.idupb, UPB.codeupb , UPB.title as upb, " + " ED.idreg, REGISTRY.title as registry, " + " ED.competencystart, ED.competencystop, " + " ED.idaccmotive, ACCMOTIVE.codemotive, ACCMOTIVE.title as accmotive,ED.idepexp,ED.idepacc " + " FROM entrydetail ED " + " JOIN entry E " + " ON E.yentry = ED.yentry AND E.nentry = ED.nentry " + " LEFT OUTER JOIN accountlookup LKP " + " ON " + QHS.CmpEq("ED.idacc", QHS.Field("LKP.oldidacc")) + " LEFT OUTER JOIN account LKACC " + " ON " + QHS.CmpEq("LKP.newidacc", QHS.Field("LKACC.idacc")) + " JOIN account ACC " + " ON " + QHS.CmpEq("ED.idacc", QHS.Field("ACC.idacc")) + " LEFT OUTER JOIN UPB " + " ON " + QHS.CmpEq("ED.idupb", QHS.Field("UPB.idupb")) + " LEFT OUTER JOIN REGISTRY " + " ON " + QHS.CmpEq("ED.idreg", QHS.Field("REGISTRY.idreg")) + " LEFT OUTER JOIN ACCMOTIVE " + " ON " + QHS.CmpEq("ED.idaccmotive", QHS.Field("ACCMOTIVE.idaccmotive")) + " WHERE " + QHS.AppAnd(QHS.CmpEq("ED.yentry", lastEsercizio), QHS.CmpEq("ACC.ayear", lastEsercizio), QHS.CmpEq("E.identrykind", 12) , QHS.IsNotNull("ACC.idpatrimony") // non saltiamo nulla e ribaltiamo semplicemente tutti i conti attualizzandoli nell'anno successivo ); DataTable tSaldo = Meta.Conn.SQLRunner(query); if (tSaldo == null) { MessageBox.Show(this, "Errore nella query che estrae i conti da aprire", "Errore"); return(false); } if (tSaldo.Rows.Count == 0) { MessageBox.Show(this, "La tabella dei saldi risulta vuota, procedura di apertura non eseguita", "Avvertimento"); return(true); } DataRow rEntry = fillEntryApertura(tEntry); if (rEntry == null) { MessageBox.Show(this, "Errore nella creazione della scrittura", "Errore"); return(false); } //decimal sumSP = 0; //bool addedSP = false; string f = QHS.CmpEq("ayear", esercizio); object idaccPat = Meta.Conn.DO_READ_VALUE("config", f, "idacc_patrimony"); if ((idaccPat == null) || (idaccPat == DBNull.Value)) { MessageBox.Show(this, "Non è stato selezionato il conto che pareggia l'epilogo dei conti patrimoniali", "Errore"); return(false); } foreach (DataRow rSaldo in tSaldo.Rows) { //if (!addedSP) addedSP = true; //sumSP += CfgFn.GetNoNullDecimal(rSaldo["amount"]); if (!calcolaDettaglioApertura(tEntryDetail, rEntry, rSaldo, idaccPat)) { return(false); } } FrmEntryPreSave frm = new FrmEntryPreSave(ds.Tables["entrydetail"], Meta.Conn, tSaldo); DialogResult dr = frm.ShowDialog(); if (dr != DialogResult.OK) { MessageBox.Show(this, "Operazione Annullata!"); return(true); } MetaData MetaEntry = MetaData.GetMetaData(this, "entry"); var Post = new Easy_PostData_NoBL(); Post.InitClass(ds, Meta.Conn); if (Post.DO_POST()) { DataRow rEntryPosted = tEntry.Rows[0]; EditEntry(rEntryPosted); MessageBox.Show(this, "Apertura dei conti effettuata"); } else { MessageBox.Show(this, "Errore nel salvataggio della scrittura di apertura!", "Errore"); return(false); } return(true); }