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); } } }