#include "770100a.h" #include "770101.h" #include "770102.h" #include // // Lista modifiche // // 27.5.96 work_tipoluogo() disabilita il campo PROGRBANCA e lo abilita // solo se e' un versamento in banca // // 5.6.96 Calcolo contributo INPS // 22.7.96 Esegue controllo ritenuta solo se diversa da ZERO // Tolti tutti i trunc() per lasciare i decimali nei conti // 24.7.96 Non considera piu' la perc. come 100 se lasciata vuota // HIDDEN TString80 tmp1, tmp2; HIDDEN real __impo = ZERO; HIDDEN real __compe = ZERO; HIDDEN real __percra = ZERO; HIDDEN TString80 __rite; HIDDEN bool __bRicalcolaRigaPag = FALSE; HIDDEN real __rCompensoCg = ZERO; void CalcolaInps(const real& rPercCassaPrev,const real& rCompenso, const real &rPercContrInps, const real& rPercAssContrInps,const real &rQuotaCommitContrInps, real& rInpsPerc,real &rInpsComplex); void TSchedaPercipienti::init_mask(TMask& m) { update_lasts(m); __bRicalcolaRigaPag = FALSE; __rCompensoCg = ZERO; if (tipo_coll() != nessuno) { const bool variazione = coll_variazione(); if (!variazione) compila_testata(m); switch (tipo_coll()) { case pagamento: case occasionale: // Compilo riga di pagamento SOLO SE NON ce ne sono gia'.. if ( (tipo_coll() == pagamento && _rel->pag_items() == 0) || tipo_coll() == occasionale ) { const real totrit(m.get(F_TOTRIT)); const real totdoc(m.get(F_TOTDOC)); const real compenso(m.get(F_COMPENS)); const real spese(m.get(F_SPESE)); if ((tipo_coll() == pagamento && (_coll._compenso + totrit == totdoc) ) || (tipo_coll() == occasionale)) { TSheet_field& pags = (TSheet_field&)m.field(F_PAGAMENTI); TRectype rpag(_rel->pag(0)); rpag.zero(); real& imponibile = _coll._compenso; rpag.put("DATAPAG", _coll._datadoc); rpag.put("COMPENSO", compenso); rpag.put("SPESA", spese); // forza il ricalcolo della riga pag. (da check_causale) __bRicalcolaRigaPag = TRUE; __rCompensoCg = compenso; // Update spreadsheet rec2row(pags.row(0), rpag, 0); pags.force_update(); } } // break; default: // per evitare di riscrivere tutto dopo registra _coll._tipo_coll = nessuno; break; } } fill_sheet(m); } // Utilizzato in collegamento da cg real TSchedaPercipienti::calcola_ritenuta(const real& imponibile, TString& sPercRa, real& rPercCassaPrev,real& rPercContrInps,real& rPercAssContrInps, real& rQuotaCommitContrInps, bool& bContrInps) { TTable cau("%ca7"); TString codcau(curr_mask().get(F_CODCAUS)); cau.zero(); cau.put("CODTAB", codcau); cau.read(); real rQuotaRaCaus = cau.get_real("R0"); sPercRa = cau.get("R0"); bContrInps=cau.get_bool("B4"); if (bContrInps) { rPercCassaPrev=cau.get_real("R5"); rPercContrInps=cau.get_real("R1"); rPercAssContrInps=cau.get_real("R2"); rQuotaCommitContrInps=cau.get_real("R3"); } else { rPercCassaPrev=ZERO; rPercContrInps=ZERO; rPercAssContrInps=ZERO; rQuotaCommitContrInps=ZERO; } real rite = ZERO; rite = (imponibile * rQuotaRaCaus)/100.00; return rite; } // Utilizzato in collegamento da cg Forse ora da togliere.. real TSchedaPercipienti::calcola_imponibile(const real& compenso) { TTable cau("%ca7"); TString codcau(curr_mask().get(F_CODCAUS)); cau.zero(); cau.put("CODTAB", codcau); if (cau.read() != NOERR) return ZERO; real quota_imp = cau.get_int("R4"); TString16 cod_qua(cau.get("S1")); real imponibile_calcolato = ZERO; // Calcola imponibile if (compenso != ZERO) imponibile_calcolato = (compenso * quota_imp) / 100.00; return imponibile_calcolato; } bool TSchedaPercipienti::vers_notify(TSheet_field& s, int r, KEY k) { switch(k) { // Inserimento riga case K_INS: // Impedisce inserimento di nuove righe return FALSE; // Inizio modifica riga case K_SPACE: { // Pulisco descrizioni luogo e tipo versamento (solo se non gia' indicati!) TSheet_field& vers = app().vers(); TMask& mp = vers.sheet_mask(); TString16 tipo(mp.get(F_TIPOVERS)); TString16 luo (mp.get(F_LUOVERS)); if (tipo.empty()) mp.reset(70); if (luo.empty()) mp.reset(71); break; } default: break; } return TRUE; } bool TSchedaPercipienti::pags_notify(TSheet_field& s, int r, KEY k) { switch(k) { // Inserimento riga case K_INS: // Impedisce inserimento di nuove righe return FALSE; // Inizio modifica riga case K_SPACE: { app()._azzerato_pag = FALSE; // Se c'e' competenza => diventa obbligatoria DATAPAG TSheet_field& pags = app().pags(); TMask& m = app().curr_mask(); // Salvo imponibile e compenso precedenti alla modifica. // v. imponibile_handler e compenso_handler TToken_string& row = pags.row(r); __compe = row.get(1); __impo = row.get(3); __percra = atof(row.get(4)); __rite = row.get(7); if (__percra == 0.0) __percra = atof(s.mask().get(F_PERRIT)); const long annoc = m.get_long(F_ANNOCOMP); const long mesec = m.get_long(F_MESECOMP); #define F_DATAPAG 101 TMask& mp = pags.sheet_mask(); TEdit_field& fld = mp.efield(F_DATAPAG); if (annoc != 0L || mesec != 0L) fld.check_type(CHECK_REQUIRED); else fld.check_type(CHECK_NONE); break; } // Fine modifica di una riga case K_ENTER: // Pulisco i buffer di confronto __impo = ZERO; __compe = ZERO; __percra = ZERO; __rite = ""; break; default: break; } return TRUE; } TSheet_field& TSchedaPercipienti::pags() const { TSheet_field& s = (TSheet_field&)curr_mask().field(F_PAGAMENTI); return s; } TSheet_field& TSchedaPercipienti::vers() const { TSheet_field& s = (TSheet_field&)curr_mask().field(F_VERSAMENTI); return s; } bool TSchedaPercipienti::my_empty_items(TToken_string& r, bool vers) { TString rr; if (vers) for (int i=0; i < COLONNE_SIGNIFICATIVE_SPREADSHEET_VERSAMENTI; i++) { rr = r.get(i); rr.trim(); switch (i) { case 0: // 1015 if (rr.not_empty()) return FALSE; break; case 1: if (rr.not_empty()) return FALSE; break; case 2: // lugo e tipo vers. case 3: if (rr.not_empty()) if (rr != "N") return FALSE; break; case 4: case 5: if (rr.not_empty()) return FALSE; break; case 6: if (rr.not_empty()) { real rrr(real::ita2eng(rr)); if (rrr != ZERO) return FALSE; } break; default: break; } } else for (int i=0; i < COLONNE_SIGNIFICATIVE_SPREADSHEET_PAGAMENTI; i++) { rr = r.get(i); rr.trim(); switch (i) { case 0: // Data if (rr.not_empty()) return FALSE; break; case 1: // Compenso if (rr.not_empty()) { real rrr(real::ita2eng(rr)); if (rrr != ZERO) return FALSE; } break; case 2: // Spese e Imponibile case 3: if (rr.not_empty()) { real rrr(real::ita2eng(rr)); if (rrr != ZERO) return FALSE; } break; case 4: // r.a. che faccio ? break; case 5: case 6: if (rr.not_empty()) { real rrr(real::ita2eng(rr)); if (rrr != ZERO) return FALSE; } break; default: break; } } return TRUE; } void TSchedaPercipienti::pag_pack() { TString_array& rows = pags().rows_array(); const int max = rows.items(); for (int i = 0; i < max; i++) { TToken_string& r = (TToken_string&)rows[i]; if (my_empty_items(r, FALSE)) // Remove all empty strings rows.destroy(i, FALSE); } rows.pack(); // rows.sort(compare_rows); // Pack and sort array } void TSchedaPercipienti::ver_pack() { TString_array& rows = vers().rows_array(); const int max = rows.items(); for (int i = 0; i < max; i++) { TToken_string& r = (TToken_string&)rows[i]; if (my_empty_items(r, TRUE)) // Remove all empty strings rows.destroy(i, FALSE); } rows.pack(); // rows.sort(compare_rows); // Pack and sort array } // // LOAD_PAG_SHEET // // Inizializza array sheet dei pagamenti // void TSchedaPercipienti::load_pag_sheet(const long numvers) { real comp, spese, imp, ritpag; int i, iNumRigaAS; TSheet_field& pag = pags(); _pags->destroy(); iNumRigaAS = 0; // numero di riga dell'array-sheet. Viene incrementato // solo quando si trovano pagamenti 'giusti' (cioe' solo // quando si aggiungono elementi all'array-sheet) for ( i = 0; i < pag.items(); i++) { TToken_string* d = new TToken_string(64); TToken_string& riga = pag.row(i); // Scarto le righe non significative if (my_empty_items(riga, FALSE)) continue; const long nvers = riga.get_long(9); // "Se il pagamento e' gia' stato selezionato DA UN ALTRO versamento // NON si deve vedere! " if (nvers > 0 && nvers != numvers) continue; const long npag = i; const int LARGHEZZA_COL = 15; d->add(" "); // 0 spazio per la 'X' di selezione TString dep(riga.get(0)); d->add(dep); // 1 data pagamento comp = riga.get(1); dep = comp.string("."); dep.right_just(LARGHEZZA_COL); d->add(dep); // 2 compenso spese = riga.get(2); dep = spese.string("."); dep.right_just(LARGHEZZA_COL); d->add(dep); // 3 spese // NB // se cambia posizione nriga o ritpag nella tokenstring cambia // anche in pag_select()! ritpag = riga.get(SS_POS_RITPAG); dep = ritpag.string("."); dep.right_just(LARGHEZZA_COL); d->add(dep); d->add(i, SS_POS_NRIGA); // Metto nell'array-sheet anche NUMVERS d->add(nvers, SS_POS_NVER); _pags->add(*d); // aggiungo la riga nell'array_sheet // Setto il bit alla posizione numpag e metto la X if (nvers == numvers) { _selected.set(npag); _pags->check(iNumRigaAS, TRUE); } iNumRigaAS++; // ignoro in questo contatore i pagamenti che NON // si vedono (se il pagamento e' scartato prima di qui // non ci passa) } } void TSchedaPercipienti::attach_pag_vers (int pag, long numvers) { TSheet_field& pag_s = pags(); TToken_string& riga = pag_s.row(pag); // setta NUMVERS nello sheet riga.destroy(9); riga.add(numvers, 9); // setta NUMVERS nel record _rel->pag(pag).put("NUMVERS", numvers); } void TSchedaPercipienti::detach_pag_vers (int pag) { TSheet_field& pag_s = pags(); TToken_string& riga = pag_s.row(pag); riga.destroy(9); riga.add(-1L, 9); // setta NUMVERS nel record _rel->pag(pag).put("NUMVERS", -1L); } // // VERS_ATTACHED ( numvers ) // // Determina se c'e' ALMENO UN pagamento collegato al versamento NUMVERS // bool TSchedaPercipienti::vers_attached(const long numvers) { long numv = 0L; // Aggiorna lo sheet dei pagamenti per questo versamento app().load_pag_sheet(numvers); for (int j = 0; j < _pags->items(); j++) { // Leggo NUMVERS TToken_string& riga = _pags->row(j); numv = riga.get_long(SS_POS_NVER); if (numv > 0L) if (numv == numvers) return TRUE; } return FALSE; } // // CHECK_PAGAMENTI // Questo serve solo a impedire di uscire senza aver collegato almeno // un pagamento // bool TSchedaPercipienti::check_pagamenti(TMask_field& f, KEY k) { const long numvers = get_numvers(f); return app().vers_attached(numvers); } void TSchedaPercipienti::setta_ritvers(TMask_field& f, const real& ritenuta) { TString80 rit_str(ritenuta.string()); f.mask().set(F_RITVERS, rit_str); f.mask().field(F_RITVERS).set_dirty(); // Forza on_hit() } // Guardo se ho compilato la data OPP. il flag 1015 // Leggo la maschera o la riga dello ss bool TSchedaPercipienti::compilato_vers(TMask_field& f) { TString16 datav; char v1015; if (f.mask().is_running()) { datav = f.mask().get(F_DATAVERS); v1015 = f.mask().get(F_VERS_1015)[0]; } else { TSheet_field& ver = app().vers(); const int riga_corr = ver.selected(); TToken_string& riga = ver.row(riga_corr); v1015 = riga.get(0)[0]; datav = riga.get(1); datav.trim(); } return datav.not_empty() || v1015 == 'X'; } // // GET_NUMVERS // // Determina il numero di versamento corrente, prendendolo : // // dalla maschera, se e' running SENNO' // dalla riga corrente dello spreadsheet // long TSchedaPercipienti::get_numvers(TMask_field& f) { long numvers = 0L; // Prendo il numvers da campo nascosto nella maschera if (f.mask().is_running()) numvers = f.mask().get_long(VERF_NUMVERS); else { TSheet_field& ver = app().vers(); const int riga_corr = ver.selected(); TToken_string& riga = ver.row(riga_corr); numvers = riga_corr + 1; // numvers = riga.get_long(SS_POS_NUMVERS); } return numvers; } bool TSchedaPercipienti::pag_azzera (TMask_field& f, KEY k) { if (k == K_SPACE) app()._azzerato_pag = TRUE; // Messo a FALSE in pag_notify // Serve per NON far riscrivere la % di ritenuta return TRUE; } bool TSchedaPercipienti::ver_azzera (TMask_field& f, KEY k) { long numvers = get_numvers(f); int nriga = 0; TNikArray_sheet& pags = *app()._pags; if (k == K_SPACE) { app().load_pag_sheet(numvers); for (int j = 0; j < pags.items(); j++) { TToken_string& riga = pags.row(j); long numv = riga.get_long(SS_POS_NVER); if (numv > 0L) if (numv == numvers) { nriga = pags.row(j).get_int(SS_POS_NRIGA); pags.row(j).add(-1L, SS_POS_NVER); app().detach_pag_vers(nriga); } } } return TRUE; } // // PAG_SELECT // // Collegamento tra versamenti e pagamenti // // Calcolo ritenuta = SUM(ritpag) {dei pagamenti collegati} // // Usa: load_pag_sheet() attach_pag_vers() e detach_pag_vers() // bool TSchedaPercipienti::pag_select (TMask_field& f, KEY k) { if (k == K_SPACE) { if (!app().compilato_vers(f)) return f.warning_box("Inserire prima la data del versamento"); long numvers = get_numvers(f); long numpag = 0L; int nriga = 0; // 13.7.95 Ricalcola la ritenuta, azzerando contenuto precedente real ritenuta = ZERO; TBit_array& selected = app()._selected; selected.reset(); // Costruisce array_sheet dei pagamenti app().load_pag_sheet(numvers); TNikArray_sheet& ASpags = *app()._pags; /* const int iPagsASheetItems = ASpags.items(); // Metto la 'X' per quelli gia' collegati (se e' acceso il bit[NUMPAG]) for (int j = 0; j < iPagsASheetItems; j++) ASpags.check(j, selected[j]);*/ // seleziona e aggiungi alle gia' selezionate if (ASpags.run() == K_ENTER) { for (int j = 0; j < ASpags.items(); j++) { // get effettivo numero riga pag. nriga = ASpags.row(j).get_int(AS_POS_NRIGA); int mesec = -1; int annoc = -1; // competenza if (ASpags.checked(j)) { // Scrive nello spread-sheet e nella relazione app().attach_pag_vers(nriga, numvers); // Scrive nell'array_sheet (e' da qui che leggo dopo) ASpags.row(j).add((long)numvers, AS_POS_NVER); TDate datapag(ASpags.row(j).get(1)); if (mesec < 0) { mesec = datapag.month(); annoc = datapag.year(); } else { if (mesec != datapag.month() || annoc != datapag.year()) // TBI inserire un'altra riga di versamento (?) ; } selected.set(numpag); real dep(real::ita2eng(ASpags.row(j).get(AS_POS_RITPAG))); ritenuta += dep; } else // pags.checked() { // resetta se era stato settato prima if (selected[numpag]) { selected.reset(numpag); ASpags.row(j).add(-1L, AS_POS_NVER); app().detach_pag_vers(nriga); } } } setta_ritvers(f, ritenuta); } // if k==K_ENTER } return TRUE; } #define F_SER_VERS 209 #define F_ABI_VERS 210 #define F_NUM_VERS 211 #define F_CAB_VERS 212 #define F_QUIETANZA_VERS 213 void TSchedaPercipienti::work_tipoluogo(TMask_field& f) { TMask& m = f.mask(); char tipo = m.get(F_TIPOVERS)[0]; char luogo = m.get(F_LUOVERS)[0]; TSheet_field& ss = app().vers(); const int row = ss.selected(); m.hide (-2); // nasconde tutto // ss.enable_cell(row,4); if (tipo == 'B') { m.show (-6); // ABI e CAB m.enable(SM_PROGRBANCA); // abilita progressivo vers.banca ss.enable_cell(row,6); } else { m.disable(SM_PROGRBANCA); ss.disable_cell(row,6); if (tipo == 'D') { if (luogo == 'T') { m.show(-3); // SOLO quietanza ss.disable_cell(row,4); } else { m.show(-4); // serie e numero ss.enable_cell(row,4); } } // else if (tipo == 'C') { m.show (-5); // SOLO numero versamento ss.disable_cell(row,4); } } } bool TSchedaPercipienti::luo_hndl(TMask_field& f, KEY k) { if (k == K_TAB) work_tipoluogo(f); if (k == K_ENTER) { work_tipoluogo(f); TMask& m = f.mask(); char tipo = m.get(F_TIPOVERS)[0]; char luogo = m.get(F_LUOVERS)[0]; // Se ho indicato il luogo => devo indicare anche il TIPO if (isalpha(luogo)) return tipo == ' ' || tipo == '\0' ? f.warning_box("Indicare il tipo del versamento") : TRUE; } return TRUE; } bool TSchedaPercipienti::abicab_hndl(TMask_field& f, KEY k) { if (f.to_check(k)) { TString16 park(f.get()); TMask& m = f.mask(); char tipo = m.get(F_TIPOVERS)[0]; // ABI/CAB solo se tipo e' B if (tipo != 'B') return TRUE; for (int i=0; i 5) { f.reset(); return f.warning_box("Codice CAB non valido"); } // controllo numericità del codice ABI/CAB if (!isdigit(park[i])) return f.warning_box("Il codice ABI/CAB deve essere numerico"); } } return TRUE; } bool TSchedaPercipienti::tipo_hndl(TMask_field& f, KEY k) { if (k == K_TAB) work_tipoluogo(f); if (k == K_ENTER || k == K_TAB) { TMask& m = f.mask(); char tipo = m.get(F_TIPOVERS)[0]; char luogo = m.get(F_LUOVERS)[0]; // Se ho indicato il tipo => devo indicare anche il LUOGO if (isalpha(tipo)) return luogo == ' ' || luogo == '\0' ? f.warning_box("Indicare il luogo del versamento") : TRUE; } return TRUE; } // // VERS1015_HANDLER // bool TSchedaPercipienti::vers1015_handler(TMask_field& f, KEY k) { if (k == K_ENTER) { TString16 datas = f.mask().get(F_DATAVERS); const bool v1015 = f.mask().get_bool(F_VERS_1015); const bool attaccati = check_pagamenti(f,k); if (attaccati) if (!v1015 && datas.empty()) return f.warning_box("Manca la data del versamento"); // Non considerare versamenti non significativi if (v1015 || datas.not_empty()) return attaccati ? TRUE : f.warning_box("Nessun pagamento collegato"); const real rite (f.mask().get(F_RITVERS)); // Pero' se c'e' la ritenuta non lo far passare if (rite != ZERO) return f.warning_box("Manca la data oppure il flag di versamento 1015"); return TRUE; } if (k == K_SPACE || k == K_F2) { TSheet_field& ss = app().vers(); const bool v1015 = (f.get() == "X"); const int row = ss.selected(); int i; // Disabilito tutto MA NON ritenuta if (v1015) { // Se son gia' disabilitati non fare nulla if (ss.cell_disabled(row, 1)) return TRUE; f.mask().reset(102); f.mask().reset(103); f.mask().reset(104); f.mask().reset(105); f.mask().reset(106); f.mask().disable(102); f.mask().disable(103); f.mask().disable(104); f.mask().disable(105); f.mask().disable(106); for (i=1; i<6; i++) ss.disable_cell(row,i); } else { f.mask().enable(102); f.mask().enable(103); f.mask().enable(104); f.mask().enable(105); f.mask().enable(106); for (i=1; i<6; i++) ss.enable_cell(row,i); } } return TRUE; } // // Quadro C e E1: immissione per le sole persone fisiche // bool TSchedaPercipienti::check_causale(TMask_field& f, KEY k) { TMask& m = f.mask(); if (k == K_TAB && m.is_running()) // if (f.to_check(k)) { TFixed_string cod_caus(f.get(),3); if (cod_caus.empty()) { KEY ke = m.last_key(); if (ke != K_QUIT && ke != K_ESC) return f.warning_box("Manca la causale"); } else { TString16 cod_qua (m.get(F_CODQUA)); char tipo = m.get(F_TIPOA)[0]; if (cod_qua == "C" || cod_qua == "E1") if (tipo == 'G') return f.warning_box("Con il quadro C o E1 e' possibile l'immissione" " per le sole persone fisiche"); if (__bRicalcolaRigaPag) { real rInpsComplex, rInpsPerc; TSheet_field& pags = app().pags(); TMask& ssMask = pags.sheet_mask(); real rPercCassaPrev = ZERO; real rPercContrInps = ZERO; real rPercAssContrInps = ZERO; real rQuotaCommitContrInps = ZERO; bool bContrInps=FALSE; // aggiorna la riga ( collegamenti con 6(occas.) e 3(pag.) ) TString sPercRa(6); real rImpoCg = app().calcola_imponibile(__rCompensoCg); real rRiteCg = app().calcola_ritenuta(rImpoCg,sPercRa,rPercCassaPrev, rPercContrInps,rPercAssContrInps,rQuotaCommitContrInps,bContrInps); TToken_string& tsRiga = pags.row(0); tsRiga.add(rImpoCg.string(), 3); tsRiga.add(sPercRa, 4); tsRiga.add(rRiteCg.string(), 5); // Calcola anche contributo INPS if (bContrInps) { real rScorporaComp, rImpInps; CalcolaInps(rPercCassaPrev,__rCompensoCg,rPercContrInps,rPercAssContrInps, rQuotaCommitContrInps,rInpsPerc,rInpsComplex); TString sInpsComp(rInpsComplex.string()); TString sInpsPerc(rInpsPerc.string()); tsRiga.add(sInpsPerc,6); tsRiga.add(sInpsComp,7); } // Calcola il netto real rSpesa(tsRiga.get(2)); real rNetto = __rCompensoCg-rRiteCg+rSpesa-rInpsPerc; tsRiga.add(rNetto.string(),8); pags.force_update(0); // Per evitare che i valori vengano azzerati: __compe = __rCompensoCg; __impo = rImpoCg; __percra = atof(sPercRa); __rite = rRiteCg.string(); } } } return TRUE; } /////////////////////////////////////////////////////////////////////////// // // RIGA PAGAMENTI // /////////////////////////////////////////////////////////////////////////// // // SPESA_HANDLER // // Forza il ricalcolo del netto se cambia la spesa // bool TSchedaPercipienti::spesa_handler(TMask_field& f, KEY k) { if (k == K_TAB) f.mask().send_key(K_TAB, MPAG_NETTO); // forza il ricalcolo del netto return TRUE; } // CHECK_RITENUTA // o Controlla se la ritenuta e' corretta (SOLO SE != ZERO 22.7.96) // o Ricalcola la ritenuta se e' stata vuotata bool TSchedaPercipienti::check_ritenuta(TMask_field& f, KEY k) { if (k == K_TAB) { TString rit(f.get()); const bool changed_rit = __rite.not_empty() ? __rite != rit : FALSE; const real imponibile(f.mask().get(MPAG_IMPONIBILE)); if (rit.empty()) calcola_ritenuta(f,imponibile); else if (changed_rit) f.mask().send_key(K_TAB, MPAG_NETTO); // forza il ricalcolo del netto } // Controlla solo se RITENUTA != ZERO if (k == K_ENTER) { TMask& m = f.mask(); const bool forzatura = app().curr_mask().get_bool(F_FORCED); real perc_ra = (m.get_real(MPAG_PERCRA) ); if (perc_ra == ZERO) perc_ra = 100.00; const real imponibile (m.get(MPAG_IMPONIBILE)); real ritenuta (m.get(MPAG_RITPAG)); if (ritenuta == ZERO) return TRUE; real rite = ZERO; // Se non indico la percentuale => considero come 100% if (perc_ra != ZERO) rite = (imponibile * perc_ra) / 100.00; else rite = imponibile; rite.trunc(); ritenuta.trunc(); rite.round(0); ritenuta.round(0); #ifdef DBG TString rites(rite.string()); TString riten(ritenuta.string()); #endif // Segnala solo se la ritenuta calcolata non e' compresa in quella // letta piu' o meno 1 if ( (rite < ritenuta-1) || (rite > ritenuta+1) ) { #ifdef DBG f.warning_box("Ritenuta errata calcolo: %s trovo: %s", (const char*) rites, (const char*) riten); #else f.warning_box("Ritenuta errata"); #endif return forzatura; } } return TRUE; } // // CALCOLA_IMPONIBILE // // Chiamato dall'handler del COMPENSO // Calcola l'imponibile SE il compenso e' diverso da ZERO // e lo setta nella maschera // real TSchedaPercipienti::calcola_imponibile(TMask_field& f, const real& compenso, const bool force) { TMask& mm = app().curr_mask(); TMask& lm = f.mask(); real quota_imp = mm.get_real(F_QUOTAIMP); TString16 cod_qua = mm.get(F_CODQUA); real imponibile_calcolato = ZERO; const bool bContributoInps = mm.get_bool(F_FLAG_INPS); const real imp_prec(lm.get(MPAG_IMPONIBILE)); // Ricalcolo sempre. NO! modifica del 4/10/95. Su richiesta di Omero if (imp_prec != ZERO && !force) return imp_prec; // Calcola imponibile if (compenso != ZERO) { imponibile_calcolato = (compenso * quota_imp) / 100.00; // scorpora la percentuale cassa previdenza real rPercCassaPrev=ZERO; rPercCassaPrev = mm.get_real(F_CASSA_PREV); imponibile_calcolato = (imponibile_calcolato / (100.00 + rPercCassaPrev)) * 100.00; TString impost(imponibile_calcolato.string()); lm.set(MPAG_IMPONIBILE, impost); } return imponibile_calcolato; } bool TSchedaPercipienti::imponibile_handler(TMask_field& f, KEY k) { if (k == K_TAB) { const real imponibile(f.mask().get(MPAG_IMPONIBILE)); const bool forza_ricalcolo = __impo != imponibile; if (__impo != imponibile) __impo = imponibile; if (forza_ricalcolo) calcola_ritenuta(f, imponibile, forza_ricalcolo); } return TRUE; } void CalcolaInps(const real& rPercCassaPrev,const real& rCompenso, const real& rPercContrInps,const real &rPercAssContrInps, const real& rQuotaCommitContrInps, real& rInpsPerc,real& rInpsComplex) { real rScorporaComp, rImpInps; rScorporaComp = (rCompenso / (100.00 + rPercCassaPrev)) * 100.00; rImpInps = (rScorporaComp / 100.00) * rPercAssContrInps; rImpInps.round(0); rInpsComplex = (rImpInps / 100.00 ) * rPercContrInps; // Se zero si considera 2/3 if (rQuotaCommitContrInps == ZERO) rInpsPerc = rInpsComplex - ((rInpsComplex * 2)/3); else rInpsPerc = rInpsComplex - ((rInpsComplex * rQuotaCommitContrInps)/100.00); } // // Handler del COMPENSO // // "Calcola ritenuta quando inserisci il compenso" // chiama calcola_imponibile se compenso e' cambiato // bool TSchedaPercipienti::compenso_handler(TMask_field& f, KEY k) { TMask& mm = app().curr_mask(); // main mask TMask& lm = f.mask(); // local mask const bool forzatura = mm.get_bool(F_FORCED); real compenso (lm.get(MPAG_COMPENSO)); real imponibile = ZERO; TString16 cod_qua(mm.get(F_CODQUA)); const bool bContributoInps = mm.get_bool(F_FLAG_INPS); bool bCambiatoCompenso = FALSE; if (k == K_TAB) { if (__compe != ZERO && compenso == ZERO) app()._azzerato_pag = FALSE; if (compenso == ZERO) return TRUE; bCambiatoCompenso = __compe != ZERO ? __compe != compenso : FALSE; if (__compe != compenso) __compe = compenso; // per evitare di perdere l'imponibile imponibile = calcola_imponibile(f, compenso, bCambiatoCompenso); #ifdef DBG tmp1 = imponibile.string(); tmp2 = compenso.string(); if (cod_qua != "E1") if (imponibile > compenso) warning_box("Imponibile = %s - Compenso = %s", (const char*)tmp1,(const char*)tmp2 ); #endif calcola_ritenuta(f, imponibile, bCambiatoCompenso); // "Solo per il quadro E1 l'imponibile puo' essere maggiore del compenso" if (cod_qua != "E1") if (imponibile > compenso) { f.warning_box("L'imponibile non puo' essere" " maggiore del compenso"); return forzatura; } // Calcolo contributo INPS if (bContributoInps) { real rInpsPercPrima = lm.get_real(MPAG_INPSPERC); real rInpsCompPrima = lm.get_real(MPAG_INPSCOMP); real rScorporaComp, rImpInps, rInpsComplex, rInpsPerc; real rPercCassaPrev = mm.get_real(F_CASSA_PREV); real rPercContrInps = mm.get_real(F_PERC_INPS); real rPercAssContrInps = mm.get_real(F_PERC_ASS_INPS); real rQuotaCommitContrInps = mm.get_real(F_PERC_COMMIT_INPS); CalcolaInps(rPercCassaPrev,compenso,rPercContrInps,rPercAssContrInps, rQuotaCommitContrInps,rInpsPerc,rInpsComplex); TString sInpsComp(rInpsComplex.string()); TString sInpsPerc(rInpsPerc.string()); // Setto i compensi INPS solo se prima erano vuoti if (rInpsPercPrima == ZERO || bCambiatoCompenso) lm.set(MPAG_INPSPERC, sInpsPerc); if (rInpsCompPrima == ZERO || bCambiatoCompenso) lm.set(MPAG_INPSCOMP, sInpsComp); } lm.send_key(K_TAB, MPAG_NETTO); // forza il ricalcolo del netto } if (k == K_ENTER) { // "Solo per il quadro E1 l'imponibile puo' essere maggiore del compenso" if (cod_qua != "E1") if (imponibile > compenso) { f.warning_box("L'imponibile non puo' essere" " maggiore del compenso"); return forzatura; } } return TRUE; } // // CALCOLA_RITENUTA // // Calcola la ritenuta in base alla % r.a. indicata ( o, se vuota, a quella // della causale ) e setta il campo della maschera // // --[ NB ]-- // Ricalcola solo se VUOTA // bool TSchedaPercipienti::calcola_ritenuta(TMask_field& f, const real& imponibile, const bool forza, const real percent) { TMask& m=f.mask(); real rPercRaRiga = m.get_real(MPAG_PERCRA); real rPercRaCaus = app().curr_mask().get_real(F_PERRIT); const bool azzerato = app()._azzerato_pag; const real rit_prec(m.get(MPAG_RITPAG)); if (rit_prec != ZERO && !forza) return FALSE; real rPerc = ZERO; // Uso la percentuale della causale SE NON indicata qui E // SE NON viene passata come parametro (in percra_handler quando si cambia // l'aliquota) if (percent == ZERO) rPerc = rPercRaRiga != ZERO ? rPercRaRiga : rPercRaCaus; else rPerc = percent; // // Faccio vedere % R.A. presa dalla causale se non l'ho indicata // e se non ho premuto Azzera (1.12.95) // Pero' se uno fa azzera e poi riscrive il compenso deve riapparire... // // const bool prendi_ra_da_causale = forza ? TRUE : perc_ra == ZERO && !azzerato; const bool prendi_ra_da_causale = rPercRaRiga == ZERO && !azzerato; if (prendi_ra_da_causale) { TString quota_rast(rPercRaCaus.string()); m.set(MPAG_PERCRA, quota_rast); } // Calcolo ritenuta ... real rite = (imponibile * rPerc) / 100.00; // .. riempie il campo corrispondente TString ritest(rite.string()); m.set(MPAG_RITPAG, ritest); m.send_key(K_TAB, MPAG_NETTO); // forza il ricalcolo del netto return TRUE; } // // Handler della percentuale di r.a. // ricalcolo la ritenuta quando cambia // bool TSchedaPercipienti::percra_handler(TMask_field& f, KEY k) { if (k == K_TAB) { const real compenso (f.mask().get(MPAG_COMPENSO)); const real imponibile (f.mask().get(MPAG_IMPONIBILE)); real percra(f.get()); const bool forza_ricalcolo = __percra != percra; if (__percra != percra) __percra = percra; if (compenso != ZERO) { if (forza_ricalcolo) calcola_ritenuta (f, imponibile, forza_ricalcolo); } } return TRUE; } bool TSchedaPercipienti::netto_handler(TMask_field& f, KEY k) { if (k == K_TAB) calcola_netto(f); return TRUE; } // // Calcola e setta il NETTO // // Il netto e' ricalcolato e settato sempre visto che non e' gestibile // real TSchedaPercipienti::calcola_netto(TMask_field& f) { real netto = ZERO; TMask& m = f.mask(); const real ritenuta (m.get(MPAG_RITPAG)); const real compenso (m.get(MPAG_COMPENSO)); const real spesa (m.get(MPAG_SPESA)); const real inpsperc (m.get(MPAG_INPSPERC)); netto = compenso - ritenuta + spesa - inpsperc; // netto.trunc(); f.mask().set(MPAG_NETTO, netto.string()); return netto; }