Beispiel #1
0
        public void GeneraScritture(string elencoCedolini)
        {
            if (elencoCedolini == "")
            {
                return;
            }
            DataAccess Conn      = Meta.Conn;
            int        esercizio = Conn.GetEsercizio();

            DataTable tCedolino         = DataAccess.CreateTableByName(Meta.Conn, "payroll", "*");
            DataTable tContratto        = DataAccess.CreateTableByName(Meta.Conn, "parasubcontract", "*");
            DataTable tCedolinoRitenuta = DataAccess.CreateTableByName(Meta.Conn, "payrolltax", "*");
            DataTable tTipoRitenuta     = DataAccess.CreateTableByName(Meta.Conn, "tax", "*");
            string    filtroCedolini    = QHS.FieldInList("idpayroll", elencoCedolini);

            DataAccess.RUN_SELECT_INTO_TABLE(Meta.Conn, tTipoRitenuta, null, null, null, true);
            DataAccess.RUN_SELECT_INTO_TABLE(Meta.Conn, tCedolino, null, filtroCedolini, null, true);
            DataAccess.RUN_SELECT_INTO_TABLE(Meta.Conn, tCedolinoRitenuta, null, filtroCedolini, null, true);
            string elencoContratti = QHS.FieldInList("idcon", QueryCreator.ColumnValues(tCedolino, null, "idcon", true));

            DataAccess.RUN_SELECT_INTO_TABLE(Meta.Conn, tContratto, null, elencoContratti, null, true);
            string flagEpExp = Conn.DO_READ_VALUE("config", QHS.CmpEq("ayear", Conn.GetEsercizio()), "flagepexp").ToString().ToUpper();


            // L'anagrafica usata per la parte verso ente è quella della cfg. ritenute, eventualmente spacchettata
            //  ove ci sia la ripartizione percentuale (in questo caso sarebbe opportuno usare la liq. diretta)
            //Invece l'anagrafica per la parte "conto ente" è quella della cfg. delle partite di giro
            object idregauto = Conn.DO_READ_VALUE("config", QHS.CmpEq("ayear", Conn.GetSys("esercizio")), "idregauto");

            TaxEntryHelper TEH = new TaxEntryHelper(Conn);

            foreach (DataRow CurrCedolino in tCedolino.Rows)
            {
                DataRow CurrContratto = tContratto.Select(QHC.CmpEq("idcon", CurrCedolino["idcon"]))[0];

                object idreg = CurrContratto["idreg"];
                object idupb = CurrContratto["idupb"];

                EP_functions EP = new EP_functions(Meta.Dispatcher);
                if (!EP.attivo)
                {
                    return;
                }
                EP.GetEntryForDocument(CurrCedolino);

                object descr = "Contratto n." + CurrContratto["ncon"].ToString() + " del " +
                               CurrContratto["ycon"].ToString() + " - " +
                               "Cedolino n. " + CurrCedolino["fiscalyear"] + "/" + CurrCedolino["npayroll"];
                object doc = "Contr. " + CurrContratto["ncon"].ToString() + "/" +
                             CurrContratto["ycon"].ToString() +
                             " Cedolino " + CurrCedolino["npayroll"] + "/" + CurrCedolino["fiscalyear"];


                DataRow mainEntry = EP.SetEntry(descr, Meta.GetSys("datacontabile"),
                                                doc, Meta.GetSys("datacontabile"), EP_functions.GetIdForDocument(CurrCedolino));

                EP.ClearDetails(mainEntry);
                object idaccmot_main = CurrContratto["idaccmotive"];
                if (idaccmot_main == DBNull.Value)
                {
                    MessageBox.Show("Non è stata impostata la causale per la prestazione.");
                    return;
                }

                string idepcontext    = "PRESTAZ";
                object idacc_registry = EP.GetSupplierAccountForRegistry(
                    CurrContratto["idaccmotivedebit"], CurrContratto["idreg"]);

                if (idacc_registry == null || idacc_registry == DBNull.Value)
                {
                    MessageBox.Show("Non è stato configurato il conto di debito/credito opportuno");
                    return;
                }

                decimal totale = CfgFn.GetNoNullDecimal(CurrCedolino["feegross"]);


                string idrelated = BudgetFunction.GetIdForDocument(CurrCedolino);
                object idepexp   = Conn.DO_READ_VALUE("epexp", QHS.AppAnd(QHS.CmpEq("idrelated", idrelated), QHS.CmpEq("nphase", 2)), "idepexp");
                if ((idepexp == null || idepexp == DBNull.Value) && flagEpExp == "S" && esercizio > 2015)
                {
                    MessageBox.Show("Errore", "Non è stato trovato alcun impegno di budget per il contratto");
                    return;
                }



                decimal contributiNonConfigurati = 0;

                //Per tutti i CONTRIBUTI:
                //Se è configurato il conto di debito
                //	effettua la scrittura COSTO->debito conto ente  (idaccmotive_cost -> idaccmotive_debit)
                // altrimenti
                //  effettua la scrittura COSTO->debito verso ente   (idaccmotive_cost -> idaccmotive_pay)

                foreach (DataRow Rit in tCedolinoRitenuta.Rows)
                {
                    decimal amount = CfgFn.GetNoNullDecimal(Rit["admintax"]);
                    if (amount == 0)
                    {
                        continue;
                    }

                    string  filtroRit = QHC.CmpEq("taxcode", Rit["taxcode"]);
                    DataRow TipoRit   = tTipoRitenuta.Select(filtroRit)[0];
                    if (TipoRit == null)
                    {
                        continue;
                    }

                    //Se la causale di costo non è configurata, prende la causale principale
                    object idaccmotive_cost = idaccmot_main;
                    if (TipoRit["idaccmotive_cost"] != DBNull.Value)
                    {
                        idaccmotive_cost = TipoRit["idaccmotive_cost"];
                    }
                    if (idaccmotive_cost == idaccmot_main)
                    {
                        idaccmotive_cost = DBNull.Value;
                    }

                    object idaccmotive_touse = DBNull.Value;
                    bool   debitoCONTOerario = false;
                    if (TipoRit["idaccmotive_debit"] != DBNull.Value)
                    {
                        idaccmotive_touse = TipoRit["idaccmotive_debit"];//debito CONTO erario
                        debitoCONTOerario = true;
                    }
                    else
                    {
                        idaccmotive_touse = TipoRit["idaccmotive_pay"];//debito VERSO erario
                    }

                    if (idaccmotive_touse == DBNull.Value)
                    {
                        MessageBox.Show("Il contributo " + TipoRit["description"].ToString() +
                                        " non è correttamente configurato per l'E/P");
                        return;                         //Errore fatale!
                    }

                    if (idaccmotive_cost == DBNull.Value)
                    {
                        contributiNonConfigurati += amount;
                    }
                    else
                    {
                        string idrelatedContrib = BudgetFunction.GetIdForDocument(Rit);
                        object idepexpContrib   = Conn.DO_READ_VALUE("epexp", QHS.AppAnd(QHS.CmpEq("idrelated", idrelatedContrib), QHS.CmpEq("nphase", 2)), "idepexp");
                        if ((idepexpContrib == null || idepexpContrib == DBNull.Value) && flagEpExp == "S" && esercizio > 2015)
                        {
                            MessageBox.Show("Errore", "Non è stato trovato alcun impegno di budget per il contributo" + Rit["taxcode"].ToString());
                            return;
                        }
                        DataRow[] ContiContribCosto = EP.GetAccMotiveDetails(idaccmotive_cost.ToString());
                        foreach (DataRow CP in ContiContribCosto)
                        {
                            EP.EffettuaScritturaImpegnoBudget(idepcontext, amount,
                                                              CP["idacc"],
                                                              idreg, idupb,
                                                              CurrCedolino["start"], CurrCedolino["stop"],
                                                              CurrCedolino, idaccmotive_cost, idepexpContrib, null, idrelatedContrib);
                        }
                    }
                    //Fa la scrittura sul conto di debito conto/verso erario usando la tabella anagrafiche della cfg ritenute
                    DataRow[] ContiContribFinanz = EP.GetAccMotiveDetails(idaccmotive_touse.ToString());
                    if (debitoCONTOerario)
                    {
                        foreach (DataRow CP in ContiContribFinanz)
                        {
                            EP.EffettuaScrittura(idepcontext, amount,
                                                 CP["idacc"],
                                                 idregauto, idupb, //era Curr["idreg"]
                                                 CurrCedolino["start"], CurrCedolino["stop"],
                                                 CurrCedolino, idaccmotive_touse);
                        }
                    }
                    else
                    {
                        DataTable Regs = TEH.GetIdRegFor(Rit["taxcode"], DBNull.Value, DBNull.Value);
                        if (Regs == null || Regs.Rows.Count == 0)
                        {
                            MessageBox.Show("Anagrafica per il versamento non trovata per la ritenuta di tipo " + Rit["taxref"].ToString(), "Errore");
                        }
                        else
                        {
                            foreach (DataRow Registry in Regs.Rows)
                            {
                                decimal amount_to_consider = amount * CfgFn.GetNoNullDecimal(Registry["quota"]);
                                int     idreg_to_consider  = CfgFn.GetNoNullInt32(Registry["idreg"]);
                                foreach (DataRow CP in ContiContribFinanz)
                                {
                                    EP.EffettuaScrittura(idepcontext, amount_to_consider,
                                                         CP["idacc"],
                                                         idreg_to_consider, idupb, //era Curr["idreg"]
                                                         CurrCedolino["start"], CurrCedolino["stop"],
                                                         CurrCedolino, idaccmotive_touse);
                                }
                            }
                        }
                    }
                }

                //Effettua la scrittura sulla causale principale
                DataRow[] ContiPrinc = EP.GetAccMotiveDetails(idaccmot_main);
                foreach (DataRow CP in ContiPrinc)
                {
                    EP.EffettuaScritturaImpegnoBudget(idepcontext, totale + contributiNonConfigurati,
                                                      CP["idacc"], idreg, idupb,
                                                      CurrCedolino["start"], CurrCedolino["stop"],
                                                      CurrCedolino, idaccmot_main, idepexp, null, idrelated);
                }


                //Effettua la scrittura sul conto di debito vs fornitore
                EP.EffettuaScrittura(idepcontext, totale,
                                     idacc_registry,
                                     idreg, idupb, CurrCedolino["start"], CurrCedolino["stop"],
                                     CurrCedolino, idaccmot_main);

                EP.RemoveEmptyDetails();

                MetaData MetaEntry = Meta.Dispatcher.Get("entry");
                PostData Post      = MetaEntry.Get_PostData();

                Post.InitClass(EP.D, Meta.Conn);
                if (Post.DO_POST())
                {
                    EditEntry(CurrCedolino);
                }
                else
                {
                    EP.viewDetails(Meta);
                }
            }
        }