예제 #1
0
        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);
        }
예제 #2
0
        /*
         * 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);
        }