diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index b7920e144..2a38463c9 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -624,6 +624,13 @@ void TPrimanota_application::init_mask(TMask& m) } m.show(F_ADJUST_IVA, _quadratura); + + TMask_field* ixc = m.find_by_id(F_IVAXCASSA); + if (ixc) + { + const TDate dr = m.get(F_DATAREG); + ixc->enable(gestione_IVAxCassa(dr)); + } } // Show/Hide campi valuta: F_VALUTA, F_CAMBIO, F_DATACAMBIO (GROUP 3) diff --git a/cg/cg2100b.uml b/cg/cg2100b.uml index 247339cd3..18096e73e 100755 --- a/cg/cg2100b.uml +++ b/cg/cg2100b.uml @@ -9,7 +9,7 @@ PAGE "Testata" -1 -1 77 20 GROUPBOX DLG_NULL 78 4 BEGIN - PROMPT 1 0 "@BMovimento di sola contabilita'" + PROMPT 1 0 "@BMovimento di sola contabilità" END NUMBER F_NUMREG 7 @@ -22,7 +22,7 @@ END DATE F_DATAREG BEGIN - PROMPT 1 1 "Data operazione " + PROMPT 2 1 "Data operazione " FIELD DATAREG CHECKTYPE REQUIRED MESSAGE COPY,K_DATAREG @@ -31,7 +31,7 @@ END DATE F_DATACOMP BEGIN - PROMPT 1 2 "Data di competenza " + PROMPT 2 2 "Data di competenza " FIELD DATACOMP MESSAGE COPY,K_DATACOMP FLAGS "G" diff --git a/cg/cg2100e.h b/cg/cg2100e.h index 06ebed354..db330cfef 100755 --- a/cg/cg2100e.h +++ b/cg/cg2100e.h @@ -28,21 +28,22 @@ #define S_SPUNTA 101 #define S_IMPORTO 102 #define S_SALDO 103 -#define S_VALUTA 104 -#define S_RESIDUO 105 -#define S_TOTALE 106 -#define S_DATASCAD 107 -#define S_NUMDOC 108 -#define S_DATADOC 109 -#define S_IMPORTO_EUR 110 -#define S_RESIDUO_EUR 111 -#define S_ANNO 112 -#define S_PARTITA 113 -#define S_RIGAF 114 -#define S_RATA 115 -#define S_RIGAP 116 -#define S_RITFIS 117 -#define S_RITSOC 118 -#define S_MODOPAG 119 -#define S_NREG 120 -#define S_NRIG 121 +#define S_DATAPAG 104 +#define S_VALUTA 105 +#define S_RESIDUO 106 +#define S_TOTALE 107 +#define S_DATASCAD 108 +#define S_NUMDOC 109 +#define S_DATADOC 110 +#define S_IMPORTO_EUR 111 +#define S_RESIDUO_EUR 112 +#define S_ANNO 113 +#define S_PARTITA 114 +#define S_RIGAF 115 +#define S_RATA 116 +#define S_RIGAP 117 +#define S_RITFIS 118 +#define S_RITSOC 119 +#define S_MODOPAG 120 +#define S_NREG 121 +#define S_NRIG 122 diff --git a/cg/cg2100e.uml b/cg/cg2100e.uml index 6b5bdeca6..b268af166 100755 --- a/cg/cg2100e.uml +++ b/cg/cg2100e.uml @@ -225,6 +225,7 @@ BEGIN ITEM " @1B" ITEM "Importo\nPagamento@13F" ITEM "Sal\ndo@3BF" + ITEM "Data@10" ITEM "Val.@3" ITEM "Residuo\nScadenza@13F" ITEM "Importo\nScadenza@13F" @@ -455,6 +456,11 @@ BEGIN ITEM "9|Bonifico" END +DATE S_DATAPAG +BEGIN + PROMPT 2 10 "Data " +END + ENDPAGE TOOLBAR "topbar" 0 0 0 2 diff --git a/cg/cg2102.cpp b/cg/cg2102.cpp index 97ffc1c5f..a1e8f42f0 100755 --- a/cg/cg2102.cpp +++ b/cg/cg2102.cpp @@ -2252,8 +2252,12 @@ bool TPrimanota_application::datareg_handler(TMask_field& f, KEY key) if (mov.read() == NOERR) dr = mov.get_date(MOV_DATAREG); } - + TPrimanota_application& a = app(); + TMask_field* ixc = m.find_by_id(F_IVAXCASSA); + if (ixc) + ixc->enable(gestione_IVAxCassa(dr)); + const int ae = a._esercizi.date2esc(dr); // Codice esercizio if (ae <= 0) return f.error_box(TR("La data dell'operazione non appartiene a nessun esercizio")); @@ -2271,8 +2275,6 @@ bool TPrimanota_application::datareg_handler(TMask_field& f, KEY key) if (key == K_ENTER || f.focusdirty()) { - m.enable(F_IVAXCASSA, a.gestione_IVAxCassa(dr)); - const long numreg = m.get_long(F_NUMREG); const bool error = numreg == 0 || numreg > a._lastreg; @@ -2289,15 +2291,6 @@ bool TPrimanota_application::datareg_handler(TMask_field& f, KEY key) f.warning_box(FR("La data dell'operazione è antecedente al %s,\n" "ultima registrazione sul libro giornale del %d"), gio.last_reg().string(), ar); - - const TDate chiusura = a._esercizi[ae].chiusura(); - if (chiusura.ok() && dr <= chiusura) - { - f.error_box(FR("La data dell'operazione è antecedente al %s,\n" - "data di chiusura dell'esercizio %d"), - chiusura.stringa(), ae); - if (error) return false; - } } if (m.query_mode()) @@ -2320,13 +2313,13 @@ bool TPrimanota_application::datareg_handler(TMask_field& f, KEY key) { if (dr < reg.last_print()) { - f.error_box(FR("La data dell'operazione e' antecedente al %s,\n" + f.error_box(FR("La data dell'operazione è antecedente al %s,\n" "ultima stampa del registro '%s' del %d"), reg.last_print().string(), (const char*)codreg, ar); if (error) return false; } if (f.dirty() && dr < reg.last_reg()) - f.warning_box(FR("La data dell'operazione e' antecedente al %s,\n" + f.warning_box(FR("La data dell'operazione è antecedente al %s,\n" "ultima registrazione sul registro '%s' del %d"), reg.last_reg().string(), (const char*)codreg, ar); } @@ -2334,7 +2327,7 @@ bool TPrimanota_application::datareg_handler(TMask_field& f, KEY key) if (reg.iva() != nessuna_iva && a._rel->controlla_liquidazione(dr, reg) == true) { const char* const mese = itom(dr.month()); - f.warning_box(FR("La liquidazione IVA relativa al mese di %s e' gia' stata calcolata"), mese); + f.warning_box(FR("La liquidazione IVA relativa al mese di %s è già stata calcolata"), mese); } } } @@ -2401,9 +2394,9 @@ bool TPrimanota_application::datacomp_handler(TMask_field& f, KEY key) const TDate chiusura = app()._esercizi[ae].chiusura(); if (chiusura.ok() && dc <= chiusura) { - return f.error_box(FR("%s è antecedente al %s,\n" - "data di chiusura dell'esercizio %d"), - data, chiusura.stringa(), ae); + f.error_box(FR("%s è antecedente al %s,\ndata di chiusura dell'esercizio %d"), + data, chiusura.stringa(), ae); + // Errore non bloccante } } @@ -2839,13 +2832,17 @@ bool TPrimanota_application::clifo_handler(TMask_field& f, KEY key) if (occas && a.occas_mask().get(O_CODICE).blank()) m.send_key(K_SPACE, F_OCCASEDIT); // Lancia maschera occasionali - if (m.field(F_IVAXCASSA).active()) + TMask_field* ixc = m.find_by_id(F_IVAXCASSA); + if (ixc) { - const int alleg = clifo.get_int(CLI_ALLEG); - m.set(F_IVAXCASSA, alleg != 6); + TString16 paiv = clifo.get(CLI_PAIV); + if (paiv.blank() && occas) + paiv = a.occas_mask().get(O_PAIV); + const int alleg = clifo.get_int(CLI_ALLEG); + const bool ic = ixc->active() && (alleg < 5 || alleg == 7) && paiv.full() && !m.get_bool(F_LIQDIFF); + ixc->set(ic ? "X" : ""); } } - } return true; @@ -2929,7 +2926,6 @@ bool TPrimanota_application::main_codiva_handler(TMask_field& f, KEY key) // Certified 99% bool TPrimanota_application::liqdiff_handler(TMask_field& f, KEY key) { - if (key == K_SPACE && f.mask().is_running()) { TSheet_field & cgs = app().cgs(); @@ -2954,7 +2950,6 @@ bool TPrimanota_application::liqdiff_handler(TMask_field& f, KEY key) FOR_EACH_SHEET_ROW(cgs, r, row) { const TString4 type(row->get(rowtype)); - if (type == "D") { row->add(conto.get(0), tp); @@ -2967,6 +2962,13 @@ bool TPrimanota_application::liqdiff_handler(TMask_field& f, KEY key) } cgs.force_update(); } + + if (key == K_ENTER) + { + if (f.get().full() && f.mask().get_bool(F_IVAXCASSA)) + return f.error_box(TR("Non è ammesso selezionare IVA per cassa e liquidazione differita")); + } + return true; } @@ -3283,25 +3285,6 @@ bool TPrimanota_application::corrvaluta_handler(TMask_field& f, KEY key) return true; } -bool TPrimanota_application::gestione_IVAxCassa(const TDate& data) const -{ - bool yes = has_module(ICAUT); - if (yes) - { - TString16 codtab; - codtab.format("%05ld%04d", get_firm(), data.year()); - const TRectype& lia = cache().get("%LIA", codtab); - yes = lia.get_bool("B5"); - if (yes) - { - TDate dal = lia.get("D0"); if (!dal.ok()) dal = TDate(1,1,data.year()); - TDate al = lia.get("D1"); if (!al.ok()) dal = TDate(31,12,data.year()); - yes = data >= dal && data <= al; - } - } - return yes; -} - bool TPrimanota_application::activate_numrif(TMask& m, bool init_pag) { // Il numero riferimento esiste diff --git a/cg/cg2102.h b/cg/cg2102.h index 65ea2934c..dacffd59f 100755 --- a/cg/cg2102.h +++ b/cg/cg2102.h @@ -207,7 +207,6 @@ protected: bool gestione_valuta() const { return _ges_val; } bool gestione_saldaconto() const { return _ges_sal; } bool npart_is_prot() const { return _npart_is_prot; } - bool gestione_IVAxCassa(const TDate& data) const; bool is_saldaconto() const { return _is_saldaconto; } bool is_fattura() const { return is_saldaconto() && causale().tipomov() == 1; } diff --git a/cg/cg2107.cpp b/cg/cg2107.cpp index df0da3350..7383f83dd 100755 --- a/cg/cg2107.cpp +++ b/cg/cg2107.cpp @@ -148,6 +148,7 @@ void TEasySolder_mask::save_sheet() const real ritsoc = valuta.in_valuta() ? ZERO : get_row_real(s, row, S_RITSOC); const bool a_saldo = goodrat && get_row_bool(s, row, S_SALDO); const TTipo_pag tipopag = (TTipo_pag)get_row_int(s, row, S_MODOPAG); + const TDate datapag = get_row_str(s, row, S_DATAPAG); if (a_saldo || !importo.is_zero() || !ritfis.is_zero() || !ritsoc.is_zero() || nrigp > 0) { @@ -173,7 +174,7 @@ void TEasySolder_mask::save_sheet() part.put(PART_DATADOC, cm.get(F_DATADOC)); part.put(PART_DATAREG, cm.get(F_DATAREG)); part.put(PART_DESCR, cm.get(F_DESCR)); - part.put(PART_DATAPAG, cm.get(F_DATAREG)); + part.put(PART_DATAPAG, datapag); part.put(PART_TIPOPAG, tipopag); // Copia dati causale corrente @@ -760,6 +761,19 @@ static bool sheet_rate_filler(TTree& tree, void* jolly, word flags) set_row_str(sheet, row, S_NUMDOC, riga.get(PART_NUMDOC)); set_row_str(sheet, row, S_DATADOC, riga.get(PART_DATADOC)); } + + // Propone data di pagamento per le RIBA + if (!good_pag) + { + TDate dp(TODAY); + if (scad->get_int(SCAD_TIPOPAG) > 1) + { + const TDate ds = scad->get(SCAD_DATASCAD); + if (ds > dp) + dp = ds; + } + set_row_str(sheet, row, S_DATAPAG, dp); + } } if (good_pag) { @@ -794,7 +808,11 @@ static bool sheet_rate_filler(TTree& tree, void* jolly, word flags) set_row_int(sheet, row, S_RIGAF, nriga); set_row_int(sheet, row, S_RATA, nrata); set_row_str(sheet, row, S_MODOPAG, rigp.get(PART_TIPOPAG)); - if (!good_rat) + if (good_rat) + { + set_row_str(sheet, row, S_DATAPAG, rigp.get(PART_DATAPAG)); + } + else { set_row_str(sheet, row, S_DATASCAD, rigp.get(PART_DATAPAG)); const int nrow = sheet.items()-1; diff --git a/cg/cg4300.cpp b/cg/cg4300.cpp index e81201507..aff31412a 100755 --- a/cg/cg4300.cpp +++ b/cg/cg4300.cpp @@ -113,9 +113,9 @@ bool TLiquidazione_app::user_create() if (msg != NULL) subj = msg->body(); if (_is_interactive) - pnd = new TProgind (3,TR("Preparazione archivi\nPrego attendere"), - FALSE, TRUE); - else begin_wait(); + pnd = new TProgind (3,TR("Preparazione archivi"), false, true); + else + begin_wait(); _nditte = new TRelation(LF_NDITTE); _nditte->add(LF_ATTIV,"CODDITTA=CODDITTA"); @@ -353,16 +353,15 @@ bool TLiquidazione_app::user_create() _isannual = _isriepilogo = _month == 13; //modifica del 03/05/1995 - int need_refresh = FALSE; - int m; - - for (m = 1; m < _month; m++) + bool need_refresh = false; + for (int m = 1; m < _month; m++) + { if (is_month_ok_strict(m) && (!look_lim(m) || !_lim->get_bool("B0"))) { - need_refresh = TRUE; + need_refresh = true; break; } - + } if (need_refresh) _recalc = ever; @@ -381,10 +380,11 @@ bool TLiquidazione_app::user_create() // riaggiusta relazione _nditte->read(); - for (int mese = 1; mese < _month; mese++) + for (int mese = 1; mese < _month; mese++) + { if ((is_month_plain(mese) && !(_freqviva == "T" && _recalc_regis)) || _recalc == ever) update_firm(mese); - + } if (is_month_plain(_month) || _month == 13) update_firm(_month); @@ -396,7 +396,7 @@ bool TLiquidazione_app::user_create() // se ci sono altri mesi dopo l'ultimo calcolato, invalida il // flag 'calcolato' del primo, per causare il ricalcolo dei // successivi (evitando problemi per credito precedente) - for (m = _month+1; m <= 13; m++) if (look_lim(m)) + for (int m = _month+1; m <= 13; m++) if (look_lim(m)) { _lim->zero("B0"); _lim->rewrite(); @@ -499,7 +499,7 @@ bool TLiquidazione_app::user_destroy() delete _rel; delete _cur; - return TRUE; + return true; } bool TLiquidazione_app::set_print(int) @@ -512,10 +512,10 @@ bool TLiquidazione_app::set_print(int) switch(_menu) { case 1: // liquidazione - _isprint = TRUE; + _isprint = true; while (set_liquidazione()) { - if (_selected.ones() > 0l) + if (_selected.ones()) return recalc_all() && _isprint; else warning_box(TR("Nessuna ditta selezionata!")); @@ -598,11 +598,10 @@ bool TLiquidazione_app::ch_year_handler(TMask_field& f, KEY key) app().reset_choices(f.mask()); app().set_year(f.get()); app().build_nomiditte(); - app().build_ditte_sheet(f.mask().source_file() == "cg4300a.msk" ? - (wht)atoi(f.mask().get(CG43_RDB_VERS)) : - all); + app().build_ditte_sheet(f.mask().source_file().ends_with("cg4300a.msk") ? + (wht)f.mask().get_int(CG43_RDB_VERS) : all); } - return TRUE; + return true; } void TLiquidazione_app::build_nomiditte(TProgind* pnd) @@ -671,7 +670,7 @@ bool TLiquidazione_app::to_ditt_handler(TMask_field& f, KEY key) app().set_choice_limits(m); m.set(CG43_FLD_SELECTED, l); } - return TRUE; + return true; } bool TLiquidazione_app::fr_ditt_handler(TMask_field& f, KEY key) @@ -679,7 +678,7 @@ bool TLiquidazione_app::fr_ditt_handler(TMask_field& f, KEY key) TMask& m = f.mask(); if (key == K_F9) { - TArray_sheet* sh = ((TLiquidazione_app&)main_app()).get_ditte_sheet(); + TArray_sheet* sh = app().get_ditte_sheet(); sh->disable_check(); sh->disable(DLG_USER); @@ -700,7 +699,7 @@ bool TLiquidazione_app::fr_ditt_handler(TMask_field& f, KEY key) app().set_choice_limits(m); m.set(CG43_FLD_SELECTED, l); } - return TRUE; + return true; } bool TLiquidazione_app::what_freq_handler(TMask_field& f, KEY key) @@ -721,7 +720,7 @@ bool TLiquidazione_app::what_freq_handler(TMask_field& f, KEY key) app().build_ditte_sheet((wht)atoi(f.get())); app().reset_choices(f.mask()); } - return TRUE; + return true; } bool TLiquidazione_app::lst_tm_handler(TMask_field& f, KEY key) @@ -729,7 +728,7 @@ bool TLiquidazione_app::lst_tm_handler(TMask_field& f, KEY key) if (f.to_check(key)) { const int m = atoi(f.get()); - TMask& msk = f.mask(); + TMask& msk = f.mask(); if (m == 13) { @@ -747,12 +746,11 @@ bool TLiquidazione_app::lst_tm_handler(TMask_field& f, KEY key) TWait_cursor hourglass; app().reset_choices(f.mask()); app().set_month(m); - app().build_ditte_sheet(f.mask().source_file() == "cg4300a.msk" ? - (wht)atoi(f.mask().get(CG43_RDB_VERS)) : - all); + app().build_ditte_sheet(f.mask().source_file().ends_with("cg4300a.msk") ? + (wht)f.mask().get_int(CG43_RDB_VERS) : all); } } - return TRUE; + return true; } bool TLiquidazione_app::select_button(TMask_field& f, KEY key) @@ -769,14 +767,14 @@ bool TLiquidazione_app::select_button(TMask_field& f, KEY key) app().set_choice_limits(f.mask()); } } - return TRUE; + return true; } bool TLiquidazione_app::reset_button(TMask_field& f, KEY key) { if (key == K_SPACE) app().reset_choices(f.mask()); - return TRUE; + return true; } bool TLiquidazione_app::chk_final_handler(TMask_field& f, KEY key) @@ -790,19 +788,28 @@ bool TLiquidazione_app::chk_final_handler(TMask_field& f, KEY key) const bool abilita = !m.get_bool(CG43_CHK_FINAL) && mese != 13; m.enable(CG43_LST_CALC, abilita); } - return TRUE; + return true; } void TLiquidazione_app::reset_choices(TMask& m) { _selected.reset(); _ditte->check(-1, FALSE); - if (m.source_file() == "cg4300a.msk") + if (m.source_file().ends_with("cg4300a.msk")) { const long ditta = get_firm(); m.set(CG43_FLD_DFR, ditta, 0x2); m.set(CG43_FLD_DTO, ditta, 0x2); - const wht freq = (wht)m.get_int(CG43_RDB_VERS); + + wht freq = all; + if (look_lia(ditta, false, m.get_int(CG43_FLD_ANNO))) + { + freq = _lia->get_char("S7") == 'T' ? trimestre : mnt; + if (m.get_int(CG43_RDB_VERS) != freq) + m.set(CG43_RDB_VERS, freq, 0x3); + } + else + freq = (wht)m.get_int(CG43_RDB_VERS); select_firm_range(ditta, ditta, freq); set_choice_limits(m); } @@ -935,5 +942,5 @@ int cg4300(int argc, char* argv[]) TLiquidazione_app* main_app = new TLiquidazione_app(menu); main_app->run(argc, argv, title); delete main_app; - return TRUE; + return true; } diff --git a/cg/cg4300.h b/cg/cg4300.h index 4ab420e29..80afde291 100755 --- a/cg/cg4300.h +++ b/cg/cg4300.h @@ -450,8 +450,10 @@ protected: bool residuo_da_liquidare(long numreg, int numrig, const TDate& last_pag, real& importo_res, real& imponibile_res, real& imposta_res) const; - bool print_inc_diff_log(int& rw, int tipoatt); - bool print_dainc_diff_log(int& rw, int tipoatt); + bool print_inc_diff_log(int& rw, int tipoatt, int tipoiva); + bool print_dainc_diff_log(int& rw, int tipoatt, int tipoiva); + bool ivadiff_chiusa(const TRectype& mov, const TDate& fine) const; + bool sarebbe_da_pagare(const TRectype& mov, const TDate& fine) const; public: @@ -545,12 +547,15 @@ public: void zero_plafond (int month, const char* codatt); void add_plafond (int month, const char* codatt, int type, const real& howmuch, bool intra); - + + // IVA differita e per cassa + void zero_diff(int month, const char* codatt); // Azzera tabella IVA x Cassa + // Ritorna il parametro della liquidazione differita per la ditta corrente, cosi come // e' scritto sui parametri liquidazione (LIA) // Se si passa 0 (default) vede prende la ditta correntemente in corso di calcolo // Analogamente per l'anno - bool TLiquidazione_app::is_differita(long firm = 0, int year = 0); + bool is_differita(long firm = 0, int year = 0); // ritorna l'aliquota ordinaria dal // codice IVA apposito immesso nei parametri studio diff --git a/cg/cg4301.cpp b/cg/cg4301.cpp index 6643d2134..84c6530a8 100755 --- a/cg/cg4301.cpp +++ b/cg/cg4301.cpp @@ -33,14 +33,10 @@ bool TLiquidazione_app::recalc_all() { - _prind = new TProgind(_selected.ones()*2, _printonly ? - TR(" Stampa liquidazione... \n" - " Preparazione archivi \n" - " ") : - TR(" Calcolo liquidazione... \n" - " Preparazione archivi \n" - " "), - TRUE,TRUE); + TString msg; + msg = _printonly ? TR("Stampa") : TR("Calcolo"); + msg << TR(" liquidazione:\npreparazione archivi..."); + _prind = new TProgind(_selected.ones()*2, msg, true, true); for (int l = 0; l < _ditte->items(); l++) { @@ -65,14 +61,14 @@ bool TLiquidazione_app::recalc_all() _nditte->curr().put("CODDITTA",codditta); _nditte->read(); _freqviva = nomeditta.get(3); - bool mens = _freqviva == "M"; + const bool mens = _freqviva == "M"; // determina attivita' prevalente e istanzia cazzuole // per vedere che Kazzo di liquidazione calcolare - TString attprev = _nditte->curr().get("CODATTPREV"); + const TString8 attprev = _nditte->curr().get("CODATTPREV"); TString16 key; - key.format("%ld|%s", codditta, (const char *) attprev); + key.format("%ld|%s", codditta, (const char *)attprev); const TRectype & atts = cache().get(LF_ATTIV, key); // istanzia benzinaro @@ -104,14 +100,14 @@ bool TLiquidazione_app::recalc_all() * -------------------------------------------------------------- */ - int need_refresh = FALSE; + int need_refresh = false; if (_recalc != ever) { int m = _month == 13 ? _month : 1; for (; m < _month; m++) if (is_month_ok_strict(m) && (!look_lim(m) || !_lim->get_bool("B0"))) { - need_refresh = TRUE; + need_refresh = true; break; } @@ -122,11 +118,14 @@ bool TLiquidazione_app::recalc_all() } int m; for (m = 1; m <= _month; m++) // fino a 13 compreso + { if (is_month_plain(m) || _recalc == ever) { - if (_prind->iscancelled()) break; + if (_prind->iscancelled()) + break; update_firm(m); } + } // se ci sono altri mesi dopo l'ultimo calcolato, invalida il // flag 'calcolato' del primo, per causare il ricalcolo dei @@ -158,15 +157,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) // Ritorna FALSE soltanto se il ricalcolo era necessario e non e' // stato effettuato per scelta dello stronzo commercialista. - TConfig c(CONFIG_DITTA, "cg"); - - _isdiff = c.get_bool("GesLiqDiff"); - if (_isdiff) - { - TFilename tmp; tmp.tempdir(); - tmp.add("liqdiff.txt"); - ofstream log(tmp); - } + _isdiff = ini_get_bool(CONFIG_DITTA, "cg", "GesLiqDiff"); if (month == 13 && recalc) { @@ -180,9 +171,8 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) } } - look_lim(liq_month(month), TRUE); - _isdiffacc = is_differita(); + _isdiffacc = is_differita(); // Gestione differimento acconto IVA _isdifferita = _isdiffacc; look_lia(); @@ -192,7 +182,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) // controlla che il periodo corrente non sia l'inizio dell'attivita' // nel caso, differita va a FALSE _monthinatt = 1; - const TDate inatt = _nditte->curr().get("DINIZIOATT"); + const TDate inatt = _nditte->curr().get(NDT_DINIZIOATT); if (is_in_liq_period(inatt)) _isdifferita = false; if (inatt.year() == atoi(_year)) @@ -222,24 +212,24 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) _nditte->save_status(); if (_nditte->is_first_match(LF_ATTIV)) { - TString buf(256); do { - const TString8 codatt = _nditte->curr(LF_ATTIV).get("CODATT"); - TString80 desatt = _nditte->curr(LF_ATTIV).get("DESCR"); - quater = _nditte->curr().get_bool("FLIVA11Q"); + const TString8 codatt = _nditte->curr(LF_ATTIV).get("CODATT"); + const TString80 desatt = _nditte->curr(LF_ATTIV).get("DESCR"); + quater = _nditte->curr().get_bool("FLIVA11Q"); - // attivita' mista: ce ne sono in realta' due + // attività mista: ce ne sono in realtà due // viene calcolato nel ciclo su tipoatt (che viene ripetuto solo se diventa TRUE); - _mixed = false; + _mixed = false; - buf.format( _printonly ? FR("Stampa liquidazione (%d)...\n%s: %s\n") : - FR("Calcolo liquidazione (%d)...\n%s: %s\n"), - month, - (const char*)_nditte_r->get("RAGSOC"), - (const char*)desatt); - - if (_prind) _prind->set_text(buf); + if (_prind) + { + TString buf(80); + buf.format( _printonly ? FR("Stampa liquidazione (mese %d)...\n%s: %s\n") : + FR("Calcolo liquidazione (mese %d)...\n%s: %s\n"), + month, (const char*)_nditte_r->get(NDT_RAGSOC), (const char*)desatt); + _prind->set_text(buf); + } // se ricalcola l'annuale si tiene tutte le vendite e corrispettivi di // tutti i lerci mesi. Analogamente se sta calcolando una trimestrale. @@ -255,11 +245,14 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) for (int tipoatt = 1; tipoatt <= (_mixed ? 2 : 1); tipoatt++) { - bool waspla = false; - TString8 cattiv(codatt); cattiv << tipoatt; - if (tipoatt == 1 && (waspla = look_pla(cattiv, false))) + + const bool waspla = look_pla(cattiv, false); + if (!waspla) + break; // Non calcolare attività inesistenti 29-11-2012 + + if (tipoatt == 1 && waspla) { _p8 = _pla->get_real("R5"); _p8b = _pla->get_real("R6"); @@ -280,7 +273,7 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) for (int i = atoi(_year); i>=anno; i--) { _year.format("%d", i); - if (look_pla(cattiv, FALSE)) // Reperisce percentuale prorata anno indicato (se esiste la tabella) + if (look_pla(cattiv, false)) // Reperisce percentuale prorata anno indicato (se esiste la tabella) pa.add(_year, _pla->get_real("R8")); } _year = yr; // Risetta l'anno corretto e riposiziona la tabella... @@ -327,14 +320,14 @@ bool TLiquidazione_app::update_firm(int month, bool recalc) } if (!_isregis) - stliq = riepliq = TRUE; + stliq = riepliq = true; if (_comp_acconto) - stliq = riepliq = FALSE; + stliq = riepliq = false; if (calc || !recalc) if (!update_att(month, cattiv) && stliq) - describe_error(TR("Attivita' non ricalcolate: possibili errori"), + describe_error(TR("Attività non ricalcolate: possibili errori"), codatt); if (_recalc_regis) continue; @@ -488,9 +481,11 @@ void TLiquidazione_app::zero_att(int month, const char* codatt) "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20", "R21", "R22", "R23", "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31", "R32", "R33", - "S0", "S1", "S2" }; + "S0", "S1", "S2", NULL }; - TString att, year, codtab; + TString80 codtab; + TString16 att; + TString4 year; int m, start, stop; start = 0; stop = 1; @@ -503,7 +498,7 @@ void TLiquidazione_app::zero_att(int month, const char* codatt) else if (atoi(_year) < 1998) stop = 0; // Solo PIM - + // PIM / PIS for (int i = start; i <= stop; i++) // Ciclo per le tabelle da azzerare { TTable * tab = (TTable*) arr[i]; @@ -516,7 +511,7 @@ void TLiquidazione_app::zero_att(int month, const char* codatt) year = codtab.mid(0,4); if (m == month && att == codatt && year == _year) { - for (int j = 0; j < 37; j++) // Ciclo per i campi del record da azzerare (34 + 3) + for (int j = 0; flds[j]; j++) // Ciclo per i campi del record da azzerare (34 + 3) tab->zero(flds[j]); tab->rewrite(); } @@ -528,7 +523,7 @@ void TLiquidazione_app::zero_att(int month, const char* codatt) if (look_plm(month, codatt)) { // zero PLM, POM, PAM, PUM - TString codtab(_plm->get("CODTAB")); + const TString16 codtab(_plm->get("CODTAB")); _plm->zero(); _pom->zero(); _pam->zero(); @@ -552,8 +547,8 @@ void TLiquidazione_app::zero_att(int month, const char* codatt) const TString8 att = (const char*)*_pia_codatt; if (m == month && att == codatt && (_year == *_pia_anno)) { - _pia->put("R0",""); // Imponibile - _pia->put("R1",""); // Imposta + _pia->zero("R0"); // Imponibile + _pia->zero("R1"); // Imposta _pia->rewrite(); } } @@ -561,23 +556,90 @@ void TLiquidazione_app::zero_att(int month, const char* codatt) } if (_isplafond && month != 13) zero_plafond(month,codatt); + + if (month != 13) + zero_diff(month,codatt); +} + +bool TLiquidazione_app::ivadiff_chiusa(const TRectype& mov, const TDate& fine) const +{ + const long numreg = mov.get_long(MOV_NUMREG); + + TString query; + query << "USA IVADIFF SELECT BETWEEN(DATAREGP,0," << fine.date2ansi() << ')' + << "\nFROM NUMREG==" << numreg + << "\nTO NUMREG==" << numreg; + TISAM_recordset id(query); + const TRectype& rid = id.cursor()->curr(); + + bool some_pag = false; // Ci sono pagamenti? + TImporto tot; + for (bool ok = id.move_first(); ok; ok = id.move_next()) + { + const char sez = rid.get_char("SEZIONE"); + const real imp = rid.get(RMI_IMPOSTA); + if (!imp.is_zero()) + { + if (rid.get_int(MOV_TIPOMOV) > 1) + some_pag = true; + tot += TImporto(sez, imp); + } + } + const bool chiusa = some_pag && tot.valore() < 0.01; + return chiusa; } // Fattura più vecchia di un anno a ente NON pubblico -static bool sarebbe_da_pagare(const TRectype& mov, const TDate& fine) +bool TLiquidazione_app::sarebbe_da_pagare(const TRectype& mov, const TDate& fine) const { + if (mov.get_int(MOV_TIPOMOV) != tm_fattura) + return false; + const TDate datareg = mov.get(MOV_DATAREG); const long giorni = fine - datareg; - if (giorni <= 365) - return false; // E' passato meno di un anno + if (giorni < 0) + return false; - const TDate datainc = mov.get(MOV_DATAINC); - if (datainc.ok() && datainc <= fine) - return false; // Già pagata senza saldaconto + if (mov.get_bool(MOV_LIQDIFF)) + { + const TDate datainc = mov.get(MOV_DATAINC); + if (datainc.ok() && datainc <= fine) + return false; // Già pagata senza saldaconto + } else + if (mov.get_bool(MOV_IVAXCASSA)) + { + if (!gestione_IVAxCassa(fine) || _isviaggio) // Le agenzie viaggio non posso aderire al regime IVA per cassa + return true; // Ho superato la soglia di applicabilità dell'IVA per cassa + } + else + return true; // Regime IVA normale TString8 key; key.format("%c|%ld", mov.get_char(MOV_TIPO), mov.get_long(MOV_CODCF)); const TRectype& clifo = cache().get(LF_CLIFO, key); - return clifo.get_int(CLI_ALLEG) != 7; // Non è un ente pubblico + const int alleg = clifo.get_int(CLI_ALLEG); + + if (alleg == 5 || alleg == 6 || alleg == 9) // Privati, import ed export non hanno IVA per cassa + return true; + + if (alleg == 7 || alleg == 8) // Ente pubblico e amministrazione controllata ... + return false; // ... possono aspettare le calende greche + + TString16 paiv = clifo.get(CLI_PAIV); + if (paiv.empty() && clifo.get_bool(CLI_OCCAS)) + { + const TRectype& occas = cache().get(LF_OCCAS, mov.get(MOV_OCFPI)); + paiv = occas.get(OCC_PAIV); + } + if (paiv.blank()) + return true; // In assenza di Partita IVA non c'è IVA per cassa + + if (ivadiff_chiusa(mov, fine)) + return false; + + if (giorni >= 365) + return true; // E' passato più di un anno! + + return false; } bool TLiquidazione_app::residuo_da_liquidare(long numreg, int numrig, const TDate& last_pag, @@ -601,8 +663,8 @@ bool TLiquidazione_app::residuo_da_liquidare(long numreg, int numrig, const TDat for (bool ok = id.move_first(); ok; ok = id.move_next()) { const char sez = id.get("SEZIONE").as_string()[0]; - const int tipomov = id.get(PART_TIPOMOV).as_int(); - if ((tipomov == 1 || tipomov == 2) || !last_pag.ok()) + const tipo_movimento tipomov = (tipo_movimento)id.get(PART_TIPOMOV).as_int(); + if (tipomov <= tm_nota_credito || !last_pag.ok()) { importo += TImporto(sez, id.get(PAGSCA_IMPORTO).as_real()); imponib += TImporto(sez, id.get(RMI_IMPONIBILE).as_real()); @@ -613,17 +675,12 @@ bool TLiquidazione_app::residuo_da_liquidare(long numreg, int numrig, const TDat const TDate data_pag = id.get("DATAREGP").as_date(); if (data_pag >= last_pag) continue; - - const TImporto vers(sez, id.get("VERSATA").as_real()); - if (!vers.is_zero()) - { - importo += TImporto(sez, id.get(PAGSCA_IMPORTO).as_real()); - imponib += TImporto(sez, id.get(RMI_IMPONIBILE).as_real()); - imposta += vers; - } + importo += TImporto(sez, id.get(PAGSCA_IMPORTO).as_real()); + imponib += TImporto(sez, id.get(RMI_IMPONIBILE).as_real()); + imposta += TImporto(sez, id.get(RMI_IMPOSTA).as_real()); } } - if (importo.valore() > ZERO) + if (imponib.valore() > ZERO) { importo_res = importo.valore(); imponib_res = imponib.valore(); @@ -654,7 +711,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) // occhecasino. Se _comp_acconto e' TRUE, i movimenti considerati // saranno solo quelli di dicembre per data <= 20/12; { - const bool has_sc = has_module(SCAUT, CHK_DONGLE); + const bool has_sc = has_module(SCAUT, CHK_DONGLE) && ini_get_bool(CONFIG_DITTA, "cg", "GesSal"); real totintra = ZERO; real nond19_imp = ZERO; real nond19_iva = ZERO; @@ -698,9 +755,6 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real rottami_cd3_3 = ZERO; // imponibile acquisto rottami real rottami_cd3_4 = ZERO; // imposta acquisto rottami - real vt_imponibile[23]; - real vt_imposta[23]; - real esni_rimb = ZERO; // ci sommo tutti esenti e ni validi per rimborso real corr_CEE = ZERO; real corr_noCEE = ZERO; @@ -738,20 +792,24 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real bdog_iva = ZERO; real agr_imp = ZERO; real agr_iva = ZERO; + real fdiff_imp = ZERO; real fdiff_iva = ZERO; real fdiffinc_imp = ZERO; real fdiffinc_iva = ZERO; - real fdiff_imp_acq = ZERO; - real fdiff_iva_acq = ZERO; - real fdiffinc_imp_acq = ZERO; - real fdiffinc_iva_acq = ZERO; + real fdiff_imp_acq = ZERO; + real fdiff_iva_acq = ZERO; + real fdiffinc_imp_acq = ZERO; + real fdiffinc_iva_acq = ZERO; _diff_ven_ap = ZERO; _diff_ven_ap_iva = ZERO; _diff_acq_ap = ZERO; _diff_acq_ap_iva = ZERO; + // PEM + real vt_imponibile[23]; + real vt_imposta[23]; for (int j = 0; j < 23; j++) { vt_imponibile[j] = ZERO; @@ -853,19 +911,20 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) _cur->setregion(from, to); TString filter; - filter.format("((ANSI(DATAREG)>=%ld)&&(ANSI(DATAREG)<=%ld))", fromdate.date2ansi(), t.date2ansi()); - if (_isviaggio || _isdiff) - { - if (_isviaggio) - filter << format("||((ANSI(DATA74TER)>=%ld)&&(ANSI(DATA74TER)<=%ld))", f74.date2ansi(), t.date2ansi()); - if (_isdiff) - filter << "|| NUM(LIQDIFF==\"X\")"; - } + //filter.format("((ANSI(DATAREG)>=%ld)&&(ANSI(DATAREG)<=%ld))", fromdate.date2ansi(), t.date2ansi()); + filter.format("(BETWEEN(DATAREG,%ld,%ld))", fromdate.date2ansi(), t.date2ansi()); + if (_isviaggio) + filter << format("||(BETWEEN(DATA74TER,%ld,%ld))", f74.date2ansi(), t.date2ansi()); + if (_isdiff) + filter << "||(NUM(LIQDIFF==\"X\"))"; + if (has_sc && gestione_IVAxCassa(fromdate)) + filter << "||(NUM(IVAXCASSA==\"X\"))"; + _cur->setfilter(filter); const long items = _cur->items(); _cur->freeze(); - *_cur = 0; + *_cur = 0; TString16 trueatt(codatt); const int tipatt = trueatt[5] - '0'; @@ -885,8 +944,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const TString4 tipodoc = _mov->get(MOV_TIPODOC); const bool corrisp = _reg->get_bool("B0"); const tiporeg tipomov = (tiporeg)_reg->get_int("I0"); + const tipo_movimento tm = (tipo_movimento)_mov->get_int(MOV_TIPOMOV); // Controlla se la data del documento si riferisce all'anno precedente (PRORATA 1998) - const TDate datedoc(_mov->get(MOV_DATADOC)); + const TDate datedoc = _mov->get(MOV_DATADOC); if (_isviaggio) { @@ -900,16 +960,19 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const bool cau_intra = rcs.get_bool("INTRACOM"); const bool cau_valintra = rcs.get_bool("VALINTRA"); + if (_mov->get_long(MOV_NUMREG) == 20339) + int cazzone = 1; + // Inizio gestione IVA differita - const bool iva_cass = has_module(ICAUT) && _mov->get_bool(MOV_IVAXCASSA); const bool iva_diff = _isdiff && _mov->get_bool(MOV_LIQDIFF); + const bool iva_cass = !iva_diff && _mov->get_bool(MOV_IVAXCASSA) && tm > 0; const bool movdiff = iva_diff || iva_cass; bool dok = is_date_ok(date, month, liqmonth, year_int); TPartite_array arrpart; // Partite interessate TPointer_array pagscatt; // Righe di pagsca interessate - if (movdiff) + if (movdiff && tm == tm_fattura) { // Sezione preferita per fatture decisa in base a vendita->'A' o acquisto->'D' const char sezfat = tipomov == vendita ? 'D' : 'A'; @@ -925,14 +988,14 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const TPartita* p = arrpart.first(); const int row = p ? p->mov2rig(numreg, 0) : 0; game_found = row > 0; - if (game_found) + if (game_found && !ivadiff_chiusa(_mov->curr(), fine)) { const TRiga_partite& rp = p->riga(row); TImporto pg, nc; flag_pg_nc = rp.calcola_pagato_periodo(inizio+1L, fine, pg, nc, &pagscatt); - if (!p->chiusa() && sarebbe_da_pagare(_mov->curr(), fine)) + if (sarebbe_da_pagare(_mov->curr(), fine)) { - rp.calcola_pagato_periodo(TDate(1,1,date.year()), fine, pg, nc, NULL); + rp.calcola_pagato_periodo(TDate(0L), fine, pg, nc, NULL); TImporto saldo = rp.importo(false); saldo += pg; saldo += nc; saldo.normalize(sezfat); @@ -943,7 +1006,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) } if (!game_found) // No saldaconto o partita assente { - datainc = _mov->get(MOV_DATAINC); + datainc = iva_diff ? _mov->get_date(MOV_DATAINC) : TDate(); if (datainc.ok() && datainc <= fine) tot_incassato = _mov->get_real(MOV_TOTDOC); else @@ -1008,15 +1071,13 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const int accmonth = _isdifferita ? 11 : 12; /* - * Patrizia: se e' differita i mov. vanno da 1/11 a 30/11 + * Patrizia: se è differita i mov. vanno da 1/11 a 30/11 * potrei allora andarmi a leggere i risultati della liq di 11 * ma il cliente potrebbe voler calcolare l'acconto prima * di aver calcolato la liquidazione (perche' cosi' complicato?) */ - //if (_comp_acconto && date.month() == accmonth && date.day() > 20) - if (_comp_acconto && date.month() == accmonth) - if (!_isdifferita && date.day() > 20) - continue; + if (_comp_acconto && !_isdifferita && date.month() == accmonth && date.day() > 20) + continue; // Ciclo sulle righe iva del movimento do @@ -1045,9 +1106,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) const int tipoagr = _iva->get_int("S4"); const int tipoag = _iva->get_int("S5"); const int tipopla = _iva->get_int("S3"); - int isrimbinfr = _iva->get_bool("B3"); // vale per calcolo rimborso se ES o NI + int isrimbinfr = _iva->get_bool("B3"); // vale per calcolo rimborso se ES o NI const real perciva = _iva->get_real("R0") / CENTO; - int ivarimb = !_iva->get_bool("B4"); // non escluso calcolo rimb. per al. media + int ivarimb = !_iva->get_bool("B4"); // non escluso calcolo rimb. per al. media const TString4 tipocr_s = _rmoviva->get(RMI_TIPOCR); const int tipocr = atoi(tipocr_s); @@ -1079,20 +1140,21 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real impon_det; // Imponibile detraibile real impos_det; // Imposta detraibile - if (movdiff) + if (movdiff && tm == tm_fattura) { - const char sezfat = tipomov == vendita ? 'D' : 'A'; + const char sezfat = tipomov == vendita ? 'D' : 'A'; const TDate datareg = _mov->get(MOV_DATAREG); TLocalisamfile id(LF_IVADIFF); id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG)); id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG)); - id.put(PART_TIPOMOV, 1); id.put("NUMPRO", 0); + id.put(PART_TIPOMOV, tm); + CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt); id.put("TIPOATT", rmi_tipoatt); id.put("ANNOLIQ", datareg.year()); - int mesereg = datareg.month(); - if (_freqviva == "T") + int mesereg = mesereg = datareg.month(); + if (_freqviva[0] == 'T') { const int resto = mesereg % 3; if (resto > 0) @@ -1125,7 +1187,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) id.put(RMI_NUMREG, _rmoviva->get(RMI_NUMREG)); id.put(RMI_NUMRIG, _rmoviva->get(RMI_NUMRIG)); id.put(MOV_DATAREG, _mov->get(MOV_DATADOC)); - id.put("NUMPRO", nrigp); + CHECKD(nrigp > 0, "Invalid NRIGP ", nrigp); + id.put("NUMPRO", min(nrigp, 999)); + CHECKD(rmi_tipoatt > 0, "Invalid tipo att ", rmi_tipoatt); id.put("TIPOATT", rmi_tipoatt); id.put("TIPOIVA", tipomov == 2 ? 2 : 1); id.put("TIPODIFF", iva_cass ? 2 : 1); @@ -1133,14 +1197,21 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) TImporto pagtmp; bool ultimo = false; + tipo_movimento tipomov_pag = tm_pagamento; if (nrigp > 0 && nrigp < 9999) { const TPartita& p = arrpart.partita(pagsca); const TRiga_partite& rp = p.riga(nrigp); - id.put(PART_TIPOMOV, rp.tipo()); + tipomov_pag = rp.tipo(); + id.put(PART_TIPOMOV, tipomov_pag); id.put("NUMREGP", rp.get(PART_NREG)); id.put("NUMRIGP", rp.get(PART_NUMRIG)); - id.put("DATAREGP", rp.get(PART_DATAPAG)); + TDate d = rp.get(PART_DATAPAG); + if (!d.ok()) + d = rp.get(PART_DATADOC); + if (!d.ok()) + d = rp.get(PART_DATAREG); + id.put("DATAREGP", d); pagtmp = p.importo_pagsca(pagsca); if (p.chiusa() && rp.tipo() >= 3) { @@ -1158,7 +1229,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) else { // Falso record generato da datainc - id.put(PART_TIPOMOV, 3); + id.put(PART_TIPOMOV, tipomov_pag); id.put("NUMREGP", _mov->get(MOV_NUMREG)); id.put("NUMRIGP", nrigp); id.put("DATAREGP", _mov->get(MOV_DATAINC)); @@ -1168,7 +1239,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) id.put("ANNOLIQ", year_int); int meseliq = id.get_date("DATAREGP").month(); - if (_freqviva == "T") + if (_freqviva[0] == 'T') { const int resto = meseliq % 3; if (resto > 0) @@ -1198,23 +1269,40 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) real val = imponibile_orig * perc; round_imposta(val); id.put(RMI_IMPONIBILE, val); - incdiff_imp += val; + + if (tipomov_pag >= tm_pagamento) + incdiff_imp += val; val = imposta_orig * perc; round_imposta(val); id.put(RMI_IMPOSTA, val); - incdiff_iva += val; + if (tipomov_pag >= tm_pagamento) + incdiff_iva += val; } - if (_isfinal && id.get_int(PART_TIPOMOV) > 2) - id.put("VERSATA", id.get(RMI_IMPOSTA)); - else - id.zero("VERSATA"); + int err = id.write_rewrite(); + if (err != NOERR) + error_box("Errore %d in aggiornamento file IVADIFF", err); - id.write_rewrite(); + const long numreg = _rmoviva->get_long(RMI_NUMREG); + if (numreg > 0) // Chiude o riapre la partita + { + TISAM_recordset recset("USE IVADIFF\nFROM NUMREG=#NR\nTO NUMREG=#NR"); + recset.set_var("#NR", numreg); + TLocalisamfile& id = recset.cursor()->file(); + for (bool ok = recset.move_first(); ok; ok = recset.move_next()) + { + const bool chiusa = id.get_bool("CHIUSA"); + if (chiusa != ultimo) + { + id.put("CHIUSA", ultimo); + id.rewrite(); + } + } + } } - diff_imp = imponibile_orig - incdiff_imp; - diff_iva = imposta_orig - incdiff_iva; + diff_imp = imponibile_orig; + diff_iva = imposta_orig; } else { @@ -1509,7 +1597,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) // senza entusiasmo ed interrogandomi sul senso della vita if (ivarimb) { - bool ok = _isagricolo ? tipoagr == 2 : FALSE; + bool ok = _isagricolo ? tipoagr == 2 : false; if (tipomov == acquisto && !ok) ok = (tipocr == 0 || tipocr == 1 || tipocr == 5 || tipocr == 9); @@ -2368,7 +2456,6 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt) if (month == 13) { TTable pem("PEM"); - for (int reg = 0; reg < 23; reg++) { look_pem(pem, reg); @@ -2418,8 +2505,9 @@ void TLiquidazione_app::iva11_set_arr_phase_1(const TString& codatt) // TAB11_RQA34 ovvero "RQA34" non viene trasferito! - // Sebbene per motivi di pieta' viene comunque lasciato nel tracciato record (esigenze PRASSI) - if (codiva.empty()) return; + // Sebbene per motivi di pietà viene comunque lasciato nel tracciato record (esigenze PRASSI) + if (codiva.blank()) + return; if (is_acquisto) { @@ -3261,10 +3349,10 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) // detrazioni solo non in regime agricolo if (!attivita_agricola) { - risultato -= (_plm->get_real("R3")); - res_cred += (_plm->get_real("R3")); - } - + const real r3 = _plm->get_real("R3"); + risultato -= r3; + res_cred += r3; + } /* totalizza importi 74 ter */ if (_isviaggio) { @@ -3482,7 +3570,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) while ((tmpatt = atts.get()) != NULL) { const TString8 att(tmpatt); - int tipoatt = att[att.len() -1] - '0'; + const int tipoatt = att.right(1)[0] - '0'; if (tipoatt == 1) // su PLA l'attivita' e' sempre 1 { if (!look_pla(att)) @@ -3574,7 +3662,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) if (!prorata.is_zero() && look_plm(13, att)) { const real old_r33 = _plm->get("R33"); - real new_r33 = old_r33 * prorata / 100; + real new_r33 = old_r33 * prorata / CENTO; round_imposta(new_r33); _plm->put("R33", new_r33); _plm->rewrite(); @@ -3729,14 +3817,15 @@ void TLiquidazione_app::write_liq(int month, const char* codatts) _lim->put("R12", res_cred); _lim->put("R13", res_debt); - _lim->put("R26", fdiff_imp); - _lim->put("R27", fdiff_iva); - _lim->put("R28", fdiffinc_imp); - _lim->put("R29", fdiffinc_iva); - _lim->put("R30", fdiff_imp_acq); - _lim->put("R31", fdiff_iva_acq); - _lim->put("R32", fdiffinc_imp_acq); - _lim->put("R33", fdiffinc_iva_acq); + _lim->put("R26", fdiff_imp); // Imponibile IVA diff Fatture di vendita + _lim->put("R27", fdiff_iva); // Imposta IVA diff Fatture di vendita + _lim->put("R28", fdiffinc_imp); // Imponibile IVA diff Incassi + _lim->put("R29", fdiffinc_iva); // Imposta IVA diff Incassi + + _lim->put("R30", fdiff_imp_acq); // Imponibile IVA diff Fatture di acquisto + _lim->put("R31", fdiff_iva_acq); // Imposta IVA diff Fatture di acquisto + _lim->put("R32", fdiffinc_imp_acq); // Imponibile IVA diff Pagamenti + _lim->put("R33", fdiffinc_iva_acq); // Imposta IVA diff Pagamenti _lam->put("R0", iva_vend); _lam->put("R1", iva_acq); @@ -3893,8 +3982,9 @@ void TLiquidazione_app::recalc_annual(const char* att) TString16 codiva,reg,tiva; TToken_string va7("",'!'); - int tipoatt = att[strlen(att) -1] - '0'; - TString aaa(att); + const TString8 aaa(att); + const int tipoatt = aaa.right(1)[0] - '0'; + CHECKD(tipoatt > 0, "Tipo att non valido ", tipoatt); look_pla(aaa); volaff1 = _pla->get_real("R14"); @@ -3955,12 +4045,12 @@ void TLiquidazione_app::recalc_annual(const char* att) _CorrItem& ca = (_CorrItem&) corr_ann[codiva]; ca._totale += _pim->get_real("R3"); if (!is_key) // se non c'e' lo aggiunge - ca._aliquota = _iva->get_real("R0")/CENTO; // Se e' nuovo setta l'aliquota + ca._aliquota = _iva->get_real("R0")/CENTO; // Se è nuovo setta l'aliquota } if (tipoatt == 1) - volaff1 += imp_ifs; + volaff1 += imp_ifs; else - volaff2 += imp_ifs; + volaff2 += imp_ifs; } // Ora si scorporano i corrispettivi raggruppati per codice IVA e si totalizzano gli imponibili diff --git a/cg/cg4302.cpp b/cg/cg4302.cpp index abbfed5df..202f3ce8d 100755 --- a/cg/cg4302.cpp +++ b/cg/cg4302.cpp @@ -327,7 +327,8 @@ bool TLiquidazione_app::look_prp(int month, const char* codatt, const char* codr const char* tipocr, const char* codiva, int tipodet, bool create) { - bool ok = FALSE; + bool ok = false; + _prp_r->zero(); (*_prp_anno) = _year; (*_prp_mese) = format("%02d", month); @@ -337,16 +338,13 @@ bool TLiquidazione_app::look_prp(int month, const char* codatt, const char* codr (*_prp_tipocr) = tipocr; (*_prp_tipodet) = tipodet; - TString s = _prp_r->get("CODTAB"); - - _prp->read(); - ok = _prp->good(); - + const TString80 s = _prp_r->get("CODTAB"); + ok = _prp->read() == NOERR; if (!ok && create) { _prp_r->zero(); _prp_r->put("CODTAB",s); - _prp->write(); + ok = _prp->write() == NOERR; } return ok; } @@ -521,7 +519,8 @@ bool TLiquidazione_app::look_pla(const char* a, bool create) buf.ltrim(); buf.rtrim(1); buf << "1"; - while (buf.len() < 6) buf.insert("0"); + while (buf.len() < 6) + buf.insert("0"); _pla_r->zero(); (*_pla_ditta) = format("%05ld", get_firm()); @@ -957,9 +956,8 @@ bool TLiquidazione_app::is_differita(long firm, int year) real TLiquidazione_app::aliquota_agvia() { real r; - TConfig cnf(CONFIG_STUDIO, "cg"); - const TString& codagv = cnf.get("CodAgv"); - if (codagv.not_empty() && look_iva(codagv)) // Controlla se è vuoto! CM600475 + const TString& codagv = ini_get_string(CONFIG_STUDIO, "cg", "CodAgv"); + if (codagv.full() && look_iva(codagv)) // Controlla se è vuoto! CM600475 r = _iva->get_real("R0"); return r; } diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp index e37a8d2fe..165498d14 100755 --- a/cg/cg4303.cpp +++ b/cg/cg4303.cpp @@ -6,14 +6,14 @@ #include "cg4300.h" +#include "recset.h" + void TLiquidazione_app::add_plafond(int month, const char* codatt, int type, const real& howmuch, bool intra) { look_ppa(month,codatt,type); const char* field = intra ? "R1" : "R0"; - real r = _ppa_r->get(field); - r += howmuch; - _ppa_r->put(field, r); + _ppa_r->add(field, howmuch); _ppa->rewrite(); } @@ -598,14 +598,14 @@ _DescrItem* TLiquidazione_app::recalc_rimborso(int month, const char* codatts, if (rimborsami && !alv.is_zero()) { // vedi di quanto ala eccede alv; deve essere > 10% - real ecc = (ala/alv) - real(1.0); + const real ecc = (ala/alv) - UNO; rimborsami = (ecc >= SOGLIA_MAGGIORE_ALIQUOTA_DEL_CAZZO_PER_AVER_DIRITTO_AL_RIMBORSO); } if (stliq && rimborsami) { if (d == NULL) d = new _DescrItem(RIMBORSO); - d->_f1 = TRUE; + d->_f1 = true; d->_r2 = vtot; d->_r3 = atot; d->_r4 = ivav; @@ -622,3 +622,41 @@ _DescrItem* TLiquidazione_app::recalc_rimborso(int month, const char* codatts, } return d; } + +// Azzera tabella IVA x CASSA +void TLiquidazione_app::zero_diff(int month, const char* codatt) +{ + // Azzero tuttp al momento dell'azzeramento della prima attività + if (_nditte->is_first_match(LF_ATTIV)) + { + if (month > 12 || (_freqviva == "T" && (month % 3) != 1)) + return; + + TString query; + query << "USE IVADIFF KEY 2"; + query << "\nFROM ANNOLIQ=" << _year; + if (month > (_freqviva == "T" ? 3 : 1)) + query << " MESELIQ=" << month; + TISAM_recordset id(query); + TLocalisamfile& file = id.cursor()->file(); + for (bool ok = id.move_first(); ok; ok = id.move_next()) + { + file.zero("ANNOLIQ"); + file.zero("MESELIQ"); + file.zero("IMPORTO"); + file.zero("IMPONIBILE"); + file.zero("IMPOSTA"); + file.zero("DATAREG"); + file.zero("NUMREGP"); + file.zero("NUMRIGP"); + file.zero("DATAREGP"); + file.zero("DATAREGP"); + file.zero("TIPOMOV"); + file.zero("TIPOIVA"); + file.zero("TIPOATT"); + file.zero("TIPODIFF"); + file.zero("CHIUSA"); + file.rewrite(); + } + } +} diff --git a/cg/cg4304.cpp b/cg/cg4304.cpp index ff1a5e787..b3b66fb7d 100755 --- a/cg/cg4304.cpp +++ b/cg/cg4304.cpp @@ -809,6 +809,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool } // if (tipomov == vendita) { + /* Non voglio piu' il riepilogo delle fatture emesse IVA diff if (!diffimp.is_zero() || !diffiva.is_zero() || !diffimp_acq.is_zero() || !diffiva_acq.is_zero()) { @@ -841,6 +842,8 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool _descr_arr.insert(head, j++); head->_f0 = false; head->_f1 = true; + head->_f2 = atoi(activity.right(1)); // Tipo attività = 1 (servizi) o 2 (mista) + head->_f3 = tipomov; totd = new _DescrItem(TOT_ROW_D); _descr_arr.insert(totd, j); } @@ -859,6 +862,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool t30 += diffimp_acq; t31 += diffiva_acq; } + */ if (!diffincimp.is_zero() || !diffinciva.is_zero() || !diffincimp_acq.is_zero() || !diffinciva_acq.is_zero()) { @@ -891,6 +895,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool headi->_f0 = false; headi->_f1 = true; headi->_f2 = atoi(activity.right(1)); // Tipo attività = 1 (servizi) o 2 (mista) + headi->_f3 = tipomov; totdi = new _DescrItem(TOT_ROW_DI); _descr_arr.insert(totdi, j); } @@ -1235,7 +1240,7 @@ void TLiquidazione_app::describe_liq(int month, const char* codatts, _DescrItem* d->_r6 = _lim->get_real("R6"); d->_r7 = _lim->get_real("R14"); d->_r9 = _lim->get_real("R9"); - d->_r29 = _lim->get_real("R29"); + d->_r29 = _lim->get_real("R29"); // fdiffinc_iva_ven d->_r33 = _lim->get_real("R33"); // fdiffinc_iva_acq if (atoi(_year) <= 1997) // Dal 1998 in poi il conguaglio prorata non va stampato, ma conglobato nell'iva acquisti @@ -1398,8 +1403,9 @@ void TLiquidazione_app::describe_consistence(const char* codatt) void TLiquidazione_app::describe_error(const char* err, const char* codatt) { - if (!_isprint || !_canprint || (_isregis && _isfinal)) return; - _errors.add(new _ErrItem(err,codatt,_nditte->curr().get("CODDITTA"))); + if (!_isprint || !_canprint || (_isregis && _isfinal)) + return; + _errors.add(new _ErrItem(err, codatt, _nditte->curr().get(NDT_CODDITTA))); } // ---------------------------------------------------------------- @@ -1708,16 +1714,14 @@ void TLiquidazione_app::set_liqacc_2000(_DescrItem& d) set_auto_ff(); } -bool TLiquidazione_app::print_dainc_diff_log(int& rw, int tipoatt) +bool TLiquidazione_app::print_dainc_diff_log(int& rw, int tipoatt, int tipoiva) { - if (_isregis) - return false; - TString limit; limit << "ANNOLIQ=" << _year; if (_month < 13) limit << " MESELIQ=" << _month; TString query; query << "USE IVADIFF KEY 2 SELECT (TIPOMOV==1)"; - if (tipoatt == 1 || tipoatt == 2) + //if (_isregis && tipoiva > 0) query << "&&(TIPOIVA==" << tipoiva << ')'; + if (tipoatt > 0) query << " &&(TIPOATT==" << tipoatt << ")"; query << "\nBY TIPOIVA DATAREG"; query << "\nJOIN MOV INTO NUMREG==NUMREG"; @@ -1738,47 +1742,48 @@ bool TLiquidazione_app::print_dainc_diff_log(int& rw, int tipoatt) const TDate nulldate; residuo_da_liquidare(rec.get_long(RMI_NUMREG), rec.get_int(RMI_NUMRIG), nulldate, importo, imponibile, imposta); - if (!importo.is_zero()) + const int ti = rec.get_int("TIPOIVA"); + if (ti != header) { - const int ti = rec.get_int("TIPOIVA"); - if (ti != header) - { - if (ti < 2) - set_row(rw++, TR("Fatture a liquidazione differita o per cassa da incassare")); - else - set_row(rw++, TR("Fatture a liquidazione differita o per cassa da pagare")); - set_row(rw++, "IVA@17gImporto@30gImponibile@49gImposta@58gTipologia@71gFattura@92gRagione sociale"); - header = ti; - } - - const TString4 codiva = rec.get("CODIVA"); - const TString16 numfat = id.get("MOV.NUMDOC").as_string(); - const TString16 datafat = rec.get("DATAREG"); - const char* tipolog = id.get("TIPODIFF").as_int() == 2 ? TR("Per Cassa") : TR("Differita"); - - TParagraph_string clifo(id.get("CLIFO.RAGSOC").as_string(), 40); - set_row(rw++, "%s@9g%r@25g%r@41g%r@58g%s@71g%s@81g%s@92g%s", - (const char*)codiva, &importo, &imponibile, &imposta, - tipolog, (const char*)numfat, (const char*)datafat, - clifo.get()); + if (ti < 2) + set_row(rw++, TR("Fatture da incassare")); + else + set_row(rw++, TR("Fatture da pagare")); + set_row(rw++, "IVA@17gImporto@30gImponibile@49gImposta@57gC/D@74gProt.@80gN. Doc.@89gData reg.@100gCodice@107gRagione sociale"); + header = ti; } + + const TString4 codiva = rec.get("CODIVA"); + const int protiva = id.get("MOV.PROTIVA").as_int(); + const TString8 numfat = id.get("MOV.NUMDOC").as_string(); + const TString16 datafat = rec.get("DATAREG"); + const char* tipolog = id.get("TIPODIFF").as_int() == 2 ? TR("C") : TR("D"); + + const long codcf = id.get("CLIFO.CODCF").as_int(); + TParagraph_string clifo(id.get("CLIFO.RAGSOC").as_string(), 25); + + set_row(rw++, "%s@9g%r@25g%r@41g%r@58g%s@74g%5d@80g%s@89g%s@100g%6ld@107g%s", + (const char*)codiva, &importo, &imponibile, &imposta, + tipolog, protiva, (const char*)numfat, (const char*)datafat, + codcf, clifo.get()); + const char* ragsoc2 = clifo.get(); + if (ragsoc2 != NULL && strlen(ragsoc2) > 3) + set_row(rw++, "@107g%s", ragsoc2); } } return rfat > 0; } -bool TLiquidazione_app::print_inc_diff_log(int& rw, int tipoatt) +bool TLiquidazione_app::print_inc_diff_log(int& rw, int tipoatt, int tipoiva) { - if (_isregis) - return false; - TString limit; limit << "ANNOLIQ=" << _year; if (_month < 13) limit << " MESELIQ=" << _month; TString query; query << "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)"; - if (tipoatt == 1 || tipoatt == 2) - query << "&&(TIPOATT==" << tipoatt << ")"; + // if (_isregis && tipoiva > 0) query << "&&(TIPOIVA==" << tipoiva << ')'; + if (tipoatt > 0) + query << " &&(TIPOATT==" << tipoatt << ")"; query << "\nBY TIPOIVA DATAREGP"; query << "\nJOIN MOV INTO NUMREG==NUMREG"; query << "\nJOIN CLIFO TO MOV INTO TIPOCF==TIPO CODCF==CODCF"; @@ -1796,10 +1801,10 @@ bool TLiquidazione_app::print_inc_diff_log(int& rw, int tipoatt) if (ti != header) { if (ti < 2) - set_row(rw++, TR("Fatture a liquidazione differita o per cassa incassate")); + set_row(rw++, TR("Fatture incassate")); else - set_row(rw++, TR("Fatture a liquidazione differita o per cassa pagate")); - set_row(rw++, "IVA@17gImporto@30gImponibile@49gImposta@58gPagamento@71gFattura@92gRagione sociale"); + set_row(rw++, TR("Fatture pagate")); + set_row(rw++, "IVA@17gImporto@30gImponibile@49gImposta@57gC/D@61gPagamento@74gProt.@80gN. Doc.@89gData reg.@100gCodice@107gRagione sociale"); header = ti; } @@ -1807,14 +1812,22 @@ bool TLiquidazione_app::print_inc_diff_log(int& rw, int tipoatt) const real importo = rec.get("IMPORTO"); const real imponibile = rec.get(RMI_IMPONIBILE); const real imposta = rec.get(RMI_IMPOSTA); + const char* tipolog = id.get("TIPODIFF").as_int() == 2 ? TR("C") : TR("D"); const TString16 datapag = rec.get("DATAREGP"); + const int protiva = id.get("MOV.PROTIVA").as_int(); const TString16 numfat = id.get("MOV.NUMDOC").as_string(); const TString16 datafat = rec.get("DATAREG"); - TParagraph_string clifo(id.get("CLIFO.RAGSOC").as_string(), 40); - set_row(rw++, "%s@9g%r@25g%r@41g%r@58g%s@71g%s@81g%s@92g%s", + + const long codcf = id.get("CLIFO.CODCF").as_int(); + TParagraph_string clifo(id.get("CLIFO.RAGSOC").as_string(), 25); + + set_row(rw++, "%s@9g%r@25g%r@41g%r@58g%s@61g%s@74g%5d@80g%s@89g%s@100g%6ld@107g%s", (const char*)codiva, &importo, &imponibile, &imposta, - (const char*)datapag, (const char*)numfat, (const char*)datafat, - clifo.get()); + tipolog, (const char*)datapag, protiva, (const char*)numfat, (const char*)datafat, + codcf, clifo.get()); + const char* ragsoc2 = clifo.get(); + if (ragsoc2 != NULL && strlen(ragsoc2) > 3) + set_row(rw++, "@107g%s", ragsoc2); } } @@ -1834,14 +1847,16 @@ void TLiquidazione_app::set_pim_head(_DescrItem& d) set_row(r++,""); if (d._flags == PIM_HEAD_D) { + set_row(r++, TR("Movimenti a liquidazione differita o per cassa registrati nel periodo")); set_bookmark(TR("Riepilogo progressivi a liquidazione differita"), _att_bookmark); - print_dainc_diff_log(r, d._f2); + print_dainc_diff_log(r, d._f2, d._f3); } else if (d._flags == PIM_HEAD_DI) { - set_bookmark(TR("Riepilogo progressivi a liquidazione differita incassati"), _att_bookmark); - print_inc_diff_log(r, d._f2); + set_row(r++, TR("Incassi/pagamenti a liquidazione differita o per cassa")); + set_bookmark(TR("Riepilogo progressivi a liquidazione differita incassati"), _att_bookmark); +// print_inc_diff_log(r, d._f2, d._f3); } else // PIS_HEAD { @@ -1938,13 +1953,14 @@ void TLiquidazione_app::set_pim(_DescrItem& d) (const char*)d._s1, (const char*)d._s2, &(d._r26), &(d._r27), &(d._r30), &(d._r31)); } - else + else if (d._flags == PIM_ROW_DI || d._flags == PIS_ROW_DI) { set_row(rw++,"%4s %s@25g%r@41g%r@91g%r@107g%r", (const char*)d._s1, (const char*)d._s2, &(d._r28), &(d._r29), &(d._r32), &(d._r33)); } + } void TLiquidazione_app::set_plm_diff(const _DescrItem& d) @@ -1953,9 +1969,12 @@ void TLiquidazione_app::set_plm_diff(const _DescrItem& d) set_row(rw++,""); set_row(rw++,""); if (d._flags == TOT_ROW_D) + { set_row(rw++,FR("Totale@25g%r@41g%r@91g%r@107g%r"), &(d._r26), &(d._r27), &(d._r30), &(d._r31)); + } else { + // Totale incassi/pagamenti ad IVA differita o per cassa set_row(rw++,FR("Totale@25g%r@41g%r@91g%r@107g%r"), &(d._r28), &(d._r29), &(d._r32), &(d._r33)); if (_isannual) { @@ -2412,7 +2431,7 @@ void TLiquidazione_app::set_grand_2000(_DescrItem& d, int &rw) if (!_is_visliq) iva_vend += rett_debt; set_row(rw++,FR("@11gIVA esigibile per il periodo@75g%r"), &iva_vend); - if (diffinc_iva != ZERO) + if (!diffinc_iva.is_zero()) set_row(rw++,FR("@11gIVA a liquidazione differita incassata@75g%r"), &diffinc_iva); if (_is_visliq) set_row(rw++,FR("@11g$[r]Rettifiche IVA a debito$[n]@75g%r"), &rett_debt); // Rettifiche modificabili diff --git a/cg/cg4400.cpp b/cg/cg4400.cpp index 4936f2e1b..b149fd00d 100755 --- a/cg/cg4400.cpp +++ b/cg/cg4400.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -194,7 +195,8 @@ void TStampa_registri_app::get_dati_ditta() const TRectype& TStampa_registri_app::look_lia(long ditta) { - if (ditta <= 0) ditta = get_firm(); + if (ditta <= 0) + ditta = get_firm(); TString16 y; y.format("%05ld%04d", ditta, _annoes); const TRectype& lia = cache().get("%LIA", y); @@ -313,7 +315,7 @@ bool TStampa_registri_app::compila_reg(const TMask& m) if (_tabreg->read() != NOERR) { if (_tipo_stampa != libro_unico) - warning_box(FR("Il registro IVA specificato non esiste nella \n Ditta %ld"), _ditta); + warning_box(FR("Il registro IVA %s della ditta %ld non esiste"), (const char*)_codreg, _ditta); return false; } else @@ -1047,7 +1049,9 @@ int TStampa_registri_app::riga_rmoviva() if (!ok) return 0; - const int mese_liq = _cur->curr(LF_MOV).get_int(MOV_MESELIQ); + const TRectype& mov = _cur->curr(LF_MOV); + + const int mese_liq = mov.get_int(MOV_MESELIQ); int nrec = 0; const TRecnotype nr = rmoviva.recno(); @@ -1060,6 +1064,9 @@ int TStampa_registri_app::riga_rmoviva() const TString4 codiva = iva.get(RMI_CODIVA); _riga_rmi.add_riga(iva); + + if (!mov.get_bool(MOV_LIQDIFF) && !(mov.get_bool(MOV_IVAXCASSA) && mov.get_int(MOV_TIPOMOV)>0)) + _riga_prospettoXcassa.add_riga(impo, impos, ZERO, ZERO, codiva, 0, 0, false, 0); //stampa di prova, cumula progressivi dai movimenti, anziche' dalle tabelle (solo bollato) if (_tipo_stampa == prova) @@ -1269,11 +1276,8 @@ bool TStampa_registri_app::controlla_mov() tiporeg TStampa_registri_app::cerca_reg(const TString& c) { - tiporeg t; - TString16 cod = ""; - - t = vendita; - cod << _annoes << c; + tiporeg t = vendita; + TString8 cod; cod << _annoes << c; _tabreg->zero(); _tabreg->put("CODTAB", cod); if (_tabreg->read() == NOERR) @@ -1289,14 +1293,14 @@ int TStampa_registri_app::stampa_prospetto(int rr, bool print_prec) { reset_print(); riga.fill('-'); - set_row(rr, "%s", (const char*)riga); - rr++; - set_row(rr, TR("Legenda Tipo Operazione: 1=operazione intracomunitaria 2=AF art.34 comma 3")); + set_row(rr++, riga); + + riga = TR("Legenda Tipo Operazione: 1=intra; 2=AF art.34 comma 3"); if (_auto_intraf) - set_row(rr, FR("@78g3=operazione intracomunitaria e AF art.34 comma 3 4=Fattura a liquidazione differita")); - else - set_row(rr, FR("@78g4=Fattura a liquidazione differita")); - rr++; + riga << TR("; 3=intra e AF art.34 comma 3"); + riga << TR("; 4=liquidazione differita"); + riga << TR("; 5=IVA per cassa"); + set_row(rr++, riga); _stampa = _st_tot_fin; if (_stampa) @@ -1305,7 +1309,7 @@ int TStampa_registri_app::stampa_prospetto(int rr, bool print_prec) rr+=2; for (int j = 0; j < _doc_array.items(); j++) { - TTipodoc& doc = (TTipodoc&)_doc_array[j]; + const TTipodoc& doc = (TTipodoc&)_doc_array[j]; set_row(rr, "%2s", (const char*) doc._tipodoc); set_row(rr, "@3g%s", (const char*) doc._descrdoc); set_row(rr, "@54g%r", &doc._totdoc); @@ -1514,9 +1518,9 @@ int TStampa_registri_app::stampa_acquisti(int row) void TStampa_registri_app::set_page_tot_reg() { - int rr=1; - + int rr = 1; rr = stampa_prospetto(rr, false); + //*****deve azzerare i totali progressivi dei riporti e segnalare all'header di non stampare //la riga di riporto _totali_stampati = true; //siamo in stampa totali, quindi... @@ -1541,7 +1545,7 @@ void TStampa_registri_app::set_page_tot_reg() { TRiga& riga = (TRiga&)array[k]; - if (_tipo_stampa == prova && riga._imponibile == ZERO && riga._imposta == ZERO && riga._implordo == ZERO) + if (_tipo_stampa == prova && riga._imponibile.is_zero() && riga._imposta.is_zero() && riga._implordo.is_zero()) continue; set_row(rr, "%-4s", (const char*)riga._codiva); @@ -1606,6 +1610,7 @@ void TStampa_registri_app::set_page_tot_reg() } } // for } + if (_stampa_plafonds) stampa_plafonds(rr); } @@ -1620,8 +1625,8 @@ HIDDEN void print_real(TPrintrow& row, const real& num, int pos) bool TStampa_registri_app::stampa_plafonds(int r, bool test_mode) { - TTable pla ("%PLA"); - TTable ppa ("PPA"); + TTable pla("%PLA"); + TTable ppa("PPA"); TString80 chiave; int num; real r1, r2, r3, r8, r8b, r9, disponibile; @@ -1895,6 +1900,190 @@ real TStampa_registri_app::stampa_valori_plafonds(const real& r1, const int mese return r; } +bool TStampa_registri_app::some_IVAxCassa() const +{ + if (_tipo_reg != vendita && _tipo_reg != acquisto) + return false; + + int da_mese = _data_da.month(); + int a_mese = _data_a.month(); + + if (_frequiva == 'T') + { + const int dr = da_mese % 3; + if (dr != 1) + da_mese -= (dr == 0 ? 2 : 1); + + const int ar = a_mese % 3; + if (ar != 0) + a_mese += (ar == 1 ? 2 : 1); + } + + TString query; + query = "USE IVADIFF KEY 2 SELECT (TIPOMOV>2)"; + query << "\nFROM ANNOLIQ=" << _data_da.year() << " MESELIQ=" << da_mese; + query << "\nTO ANNOLIQ=" << _data_a.year() << " MESELIQ=" << a_mese; + TISAM_recordset id(query); + return id.items() > 0; +} + +bool TStampa_registri_app::print_IVAxCassa(int month) +{ + if (_tipo_reg != vendita && _tipo_reg != acquisto) + return false; + + TPrinter& pr = printer(); + TPrintrow riga; + const TString linea(_stampa_width, '-'); + + TString query; + query = "USE IVADIFF SELECT (BETWEEN(DATAREGP,#DAL,#AL))&&(MOV.REG=#REG)&&(TIPOMOV>2)&&(STR(IMPONIBILE>0))&&(STR(MESELIQ==#MON))"; + query << "\nBY DATAREGP DATAREG"; + query << "\nJOIN MOV INTO NUMREG==NUMREG"; + query << "\nJOIN CLIFO TO MOV INTO TIPOCF==TIPO CODCF==CODCF"; + TISAM_recordset id(query); + id.set_var("#DAL", _data_da); + id.set_var("#AL", _data_a); + id.set_var("#REG", _codreg); + id.set_var("#MON", long(month)); + + // Sporco trucco per evitare intestazioni inutili + const bool il = _intesta_liq; + _intesta_liq = true; + + if (id.items() > 0) + { + riga.reset(); + riga.put(linea, 0); + pr.print(riga); + + riga.reset(); + if (_tipo_reg == vendita) + riga.put(TR("DETTAGLIO INCASSI FATTURE CON IVA DIFFERITA O PER CASSA"), 40); + else + riga.put(TR("DETTAGLIO PAGAMENTI FATTURE CON IVA DIFFERITA O PER CASSA"), 40); + pr.print(riga); + + riga.reset(); pr.print(riga); + + riga.put(linea, 0); pr.print(riga); + + riga.reset(); + riga.put(TR("Documento"), 19); + riga.put(TR("T Tipo"), 66); + riga.put(TR("Forz"), 123); + riga.put(TR("Num"), 128); + pr.print(riga); + + riga.reset(); + riga.put(TR("Data pag. prot."), 0); + riga.put(TR("Data"), 17); + riga.put(TR("Numero Codice Ragione Sociale"), 24); + riga.put(TR("O Doc."), 66); + riga.put(TR("Importo"), 78); + riga.put(TR("Imponibile"), 90); + riga.put(TR("IVA"), 102); + riga.put(TR("Imposta"), 115); + riga.put(TR("Scad"), 123); + riga.put(TR("Reg"), 128); + pr.print(riga); + + riga.put(linea, 0); pr.print(riga); + + const TRectype& rec = id.cursor()->curr(); + for (bool ok = id.move_first(); ok; ok = id.move_next()) + { + const TString4 codiva = rec.get("CODIVA"); + const real importo = rec.get("IMPORTO"); + const real imponibile = rec.get("IMPONIBILE"); + const real imposta = rec.get("IMPOSTA"); + + TParagraph_string clifo(id.get("CLIFO.RAGSOC").as_string(), 27); + + riga.reset(); + riga.put(rec.get_date("DATAREGP").string(brief, '/'), 0); + riga.put(format("%6ld", id.get("MOV.PROTIVA").as_int()), 8); + riga.put(rec.get_date(MOV_DATAREG).string(brief, '/'), 15); + riga.put(id.get("MOV.NUMDOC").as_string(), 24); + riga.put(format("%6ld", id.get("CLIFO.CODCF").as_int()), 31); + riga.put(clifo.get(), 38); + riga.put(rec.get_int("TIPODIFF") == 2 ? "5" : "4", 66); // 4 = Differita; 5 = x Cassa + riga.put(id.get("MOV.TIPODOC").as_string(), 68); + print_real(riga, importo, 70); + print_real(riga, imponibile, 85); + riga.put(rec.get("CODIVA"), 102); + print_real(riga, imposta, 107); + riga.put(rec.get_int("NUMPRO") >= 999 ? "X" : "", 123); + riga.put(format("%6ld", rec.get_long(MOV_NUMREG)), 125); + pr.print(riga); + + _riga_prospettoXcassa.add_riga(ZERO, ZERO, imponibile, imposta, codiva, 0, 0, false, 0); + } + } + + if (_riga_prospettoXcassa.items() <= 0) + return id.items() > 0; // Ho stampato qualcosa? + + riga.reset(); + if (pr.rows_left() < _riga_prospettoXcassa.items()+5) + { + pr.formfeed(); + riga.put(linea, 0); + } + pr.print(riga); + + riga.reset(); + riga.put(TR("PROSPETTO IMPORTI CON IVA ORDINARIA ED IVA DIFFERITA O PER CASSA"), 40); + pr.print(riga); + + riga.reset(); + pr.print(riga); + + riga.reset(); + riga.put(TR("IVA Descrizione"), 0); + riga.put(TR("Imponibile"), 34); + riga.put(TR("Imposta"), 53); + riga.put(TR("Imponibile diff."), 84); + riga.put(TR("Imposta diff."), 109); + pr.print(riga); + + real tot_imponib, tot_imposta, tot_imponibp, tot_impostap; + _riga_prospettoXcassa.sort(compare_righeiva); + for (int s = 0; s < _riga_prospettoXcassa.items(); s++) + { + const TRigaiva& ri = _riga_prospettoXcassa.riga(s); + + riga.reset(); + riga.put(ri._codiva, 0); + riga.put(descr_iva(ri._codiva), 5); + print_real(riga, ri._imponibile, 29); + print_real(riga, ri._imposta, 45); + print_real(riga, ri._imponibilep,85); + print_real(riga, ri._impostap, 107); + pr.print(riga); + + tot_imponib += ri._imponibile; + tot_imposta += ri._imposta; + tot_imponibp+= ri._imponibilep; + tot_impostap+= ri._impostap; + } + + riga.reset(); + pr.print(riga); + riga.put(TR("TOTALE"), 0); + print_real(riga, tot_imponib, 29); + print_real(riga, tot_imposta, 45); + print_real(riga, tot_imponibp, 85); + print_real(riga, tot_impostap,107); + pr.print(riga); + + _riga_prospettoXcassa.destroy(); + + _intesta_liq = il; // Ripristina flag intestazioni + + return true; +} + //********* PRINT!!! *********// bool TStampa_registri_app::preprocess_print(int file, int counter) @@ -1930,7 +2119,7 @@ bool TStampa_registri_app::preprocess_page(int file, int counter) TString80 comune, prov, comcf, capcf, civcf, stacf; TString80 viacf; TString ragsoc, codfis, piva; - TString tipo_op = ""; + TString4 tipo_op = ""; TLocalisamfile& mov = _cur->file(LF_MOV); TLocalisamfile& caus = _cur->file(LF_CAUSALI); @@ -2001,10 +2190,12 @@ bool TStampa_registri_app::preprocess_page(int file, int counter) long codcf = mov.get_long(MOV_CODCF); long numgio = mov.get_long(MOV_NUMGIO); bool stampato = mov.get_bool(MOV_REGST); - TString16 codval = mov.get(MOV_CODVALI); + TString4 codval = mov.get(MOV_CODVALI); real corrval = mov.get_real(MOV_CORRVALUTA); - bool autof = caus.get_bool(CAU_AUTOFATT); - bool liqdiff = mov.get_bool(MOV_LIQDIFF); + const bool autof = caus.get_bool(CAU_AUTOFATT); + const bool liqdiff = mov.get_bool(MOV_LIQDIFF); + const bool IVAxcassa= !liqdiff && mov.get_bool(MOV_IVAXCASSA); + TString80 descrcau = caus.get(CAU_DESCR); real totdoc = mov.get_real(MOV_TOTDOC); @@ -2116,12 +2307,18 @@ bool TStampa_registri_app::preprocess_page(int file, int counter) { if (protiva != _uprotivap + 1) { - set_row(_r+1, FR("@2g*** NUM.PROT.FUORI SEQUENZA")); + set_row(_r+1, FR(" @b*** NUM.PROT.FUORI SEQUENZA@r")); riga = _r+2; } _uprotivap = uprotiva ? uprotiva : protiva; } } + + if (mov.get_bool(MOV_IVAXCASSA) && mov.get_int(MOV_TIPOMOV) <= 0) + { + set_row(_r+1, FR(" @b*** IVA PER CASSA SENZA SALDACONTO@r")); + riga = _r+2; + } } const char* r; @@ -2222,7 +2419,7 @@ bool TStampa_registri_app::preprocess_page(int file, int counter) _riga_rmi.destroy(); } - if ( intra && autof) + if (intra && autof) { _auto_intraf = true; tipo_op = "3"; @@ -2233,8 +2430,10 @@ bool TStampa_registri_app::preprocess_page(int file, int counter) tipo_op = "2"; else if (liqdiff) tipo_op = "4"; + else if (IVAxcassa) + tipo_op = "5"; - set_row(_r, "@66g%s", (const char*) tipo_op); + set_row(_r, "@66g%s", (const char*)tipo_op); if (_tipo_stampa == prova) //stampa di prova { @@ -2273,14 +2472,15 @@ bool TStampa_registri_app::preprocess_page(int file, int counter) } } - if (riga <= rr) riga = ++rr; + if (riga <= rr) + riga = ++rr; - if (corrval != ZERO) + if (!corrval.is_zero()) { TCurrency curr(corrval, codval); TString80 vall = curr.string(true); vall.right_just(19); - set_row(riga, FR("@24gCodice valuta %-3s Corrispettivo in valuta %s"), (const char*) codval, (const char*) vall); + set_row(riga, FR("@24gCodice valuta %-3s Corrispettivo in valuta %s"), (const char*)codval, (const char*)vall); } } return true; @@ -2295,15 +2495,15 @@ print_action TStampa_registri_app::postprocess_page (int file, int counter) { reset_print(); - TRecnotype pos = _cur->pos(); - long items = _cur->items(); + const TRecnotype pos = _cur->pos(); + const TRecnotype items = _cur->items(); const bool last_mov = pos == items-1; if (_stampa_plafonds && !last_mov) { // Nel caso sia richiesta la stampa prospetto mensile plafond e vi siano mesi // senza movimenti, è necessario forzarne la stampa - TDate save_date(_datareg); + const TDate save_date(_datareg); // Caso speciale, in cui non vi siano movimenti sull'ultimo mese indicato in stampa //const bool print_over = last_mov && _dataregp == _dataregs && _dataregp.month() < _data_a.month(); @@ -2322,7 +2522,14 @@ print_action TStampa_registri_app::postprocess_page (int file, int counter) _datareg = save_date; } + if (last_mov) + { + printer().formfeed(); + print_IVAxCassa(_datareg.month()); + } + if (_liquidazione) + { if (!_st_liq[_datareg.month()] && stampo_liquidazione(_datareg.month())) { _st_liq[_datareg.month()] = true; @@ -2340,7 +2547,8 @@ print_action TStampa_registri_app::postprocess_page (int file, int counter) } } } - + } + if (last_mov) { if (_stampa_plafonds || (_tipo_stampa != libro_unico && _liquidazione)) @@ -2431,10 +2639,6 @@ void TStampa_registri_app::preprocess_header() char tipo = ' '; char type = ' '; int mese, anno; - TString riga(_stampa_width); - TString data(30); - - riga.fill('-'); if (_tipo_stampa != libro_unico) { @@ -2447,7 +2651,9 @@ void TStampa_registri_app::preprocess_header() anno = _annoes; } - data.format("%s %s %d", "mese di", itom(mese), anno); + TString data; + if (mese > 0) + data.format(FR("mese di %s %d"), itom(mese), anno); reset_header(); @@ -2458,8 +2664,7 @@ void TStampa_registri_app::preprocess_header() else r+=2; } - else // se stampa di prova o su libro unico l'intestazione della ditta - // va sempre stampata + else // se stampa di prova o su libro unico l'intestazione della ditta va sempre stampata r = stampa_intestazione(); if (_stampa_num_pag) // Stampa numero di pagina in alto a destra @@ -2483,8 +2688,7 @@ void TStampa_registri_app::preprocess_header() if (_tipo_stampa == libro_unico) set_header(r, FR("@94gProgr.Studio %ld@114gProgr.Utente %ld"), _u_stampata, _pagine_stampate); - // cosi' sono sicura che l'aggiornamento viene fatto ad ogni salto pagina - // (cioe' a rottura di mese) + // cosi' sono sicura che l'aggiornamento viene fatto ad ogni salto pagina (cioe' a rottura di mese) if (_tipo_stampa != prova) aggiorna_reg(_ok_vidi); @@ -2527,6 +2731,7 @@ void TStampa_registri_app::preprocess_header() //l'intestazione (piuttosto dettagliata) e' gestita //dal prg di liquidazione perche' molte info che devono //comparire in questa intestazione la stampa reg. non le conosce. + const TString riga(_stampa_width, '-'); //non sto stampando la liquidazione if (!_intesta_liq) @@ -2536,13 +2741,13 @@ void TStampa_registri_app::preprocess_header() if (_tipo_reg == vendita) //registro vendite { - cor = 'R'; + cor = 'R'; // Ricavi nd1 = ' '; nd2 = ' '; } if (_tipo_reg == acquisto) { - cor = 'C'; + cor = 'C'; // Cessioni nd1 = 'N'; nd2 = 'D'; } @@ -2678,7 +2883,7 @@ bool TStampa_registri_app::stampo_liquidazione(int mese) //test tradotti alla lettera da AS/400 //assolutamente incongruenti !!! const bool trim_month_flag = (_frequiva == 'T' && (mese == 3 || mese == 6 || mese == 9 || mese == 12)) - ||_frequiva != 'T' || (mese == 12 && _tipo_riepilogativo == 'A'); + ||_frequiva != 'T' || (mese == 12 && _tipo_riepilogativo == 'A'); if (_tipo_stampa == prova) { @@ -2721,15 +2926,15 @@ void TStampa_registri_app::liq_other_case() switch (_scelta) { - case prosegui_cal_stampa: - tipo_messaggio = 'L'; // Stampa Liquidazione con ricalcolo - break; - case prosegui_stampa: - tipo_messaggio = 'S'; // Stampa Liquidazione senza ricalcolo - break; - default: - tipo_messaggio = '\0'; - break; + case prosegui_cal_stampa: + tipo_messaggio = 'L'; // Stampa Liquidazione con ricalcolo + break; + case prosegui_stampa: + tipo_messaggio = 'S'; // Stampa Liquidazione senza ricalcolo + break; + default: + tipo_messaggio = '\0'; + break; } if (_tipo_stampa != prova) @@ -2936,7 +3141,7 @@ void TStampa_registri_app::aggiorna_reg(const bool aggiorna_vidi) IndBil.zero(); - TRectype nuovo (IndBil.curr()); + TRectype nuovo(IndBil.curr()); IndBil.put("ANNO", _annoes); IndBil.put("CODLIB", _codlib); @@ -3083,6 +3288,17 @@ void TStampa_registri_app::no_movimenti() send_message(calc ? 'R' : 'C', app, calc ? a : mese); } + if (some_IVAxCassa()) + { + if (! printer().isopen()) + printer().open(); + + int mese = a; + if (_frequiva == 'T') + mese += 2 - ((mese-1) % 3); + print_IVAxCassa(mese); + } + if (_tipo_reg == riepilogativo || _liquidazione || _stampa_plafonds) { for (int m = da; m <= a; m++) @@ -3107,7 +3323,7 @@ void TStampa_registri_app::no_movimenti() } } - // In prova va stampato per ogni mese (sia Mensile che Trimestrale; + // In prova va stampato per ogni mese (sia Mensile che Trimestrale); // in bollato, solo per i mesi che ancora mancano) const bool print_plafond_bollato = _tipo_stampa != prova && (m == 1 || m > _u_data.month()); if (_stampa_plafonds && (_tipo_stampa == prova || print_plafond_bollato)) @@ -3118,46 +3334,46 @@ void TStampa_registri_app::no_movimenti() if (stampa_plafonds(-1)) // Con -1 compone e stampa printrows all'istante printer().formfeed(); } - + //la funzione stampo_liquidazione non stampera' la liquidazione sul //registro il cui mese di stampa ultima liq. e' > del mese in esame //caso a parte il mese 12 (che posso ristampare 2 volte) - if (_liquidazione) - if (stampo_liquidazione(m)) - { - if (_tipo_reg == riepilogativo) - { - if (!(_freq_riepilogo == 'M' || - (m == 3 || m == 6 || m == 9 || m == 12))) continue; - } + if (_liquidazione && stampo_liquidazione(m)) + { + if (_tipo_reg == riepilogativo) + { + if (!(_freq_riepilogo == 'M' || + (m == 3 || m == 6 || m == 9 || m == 12))) continue; + } - if (! printer().isopen()) - printer().open(); - TFilename f; - f.temp("rgp"); - _datareg = TDate(1, m, _annoes); // serve alla preprocess_header - if (_scelta == B0_settato || _scelta == prosegui_stampa) - { - if (_tipo_stampa == prova) - send_message('S',f, m); - else - send_message('s',f, m); - } - else //_scelta == prosegui_cal_stampa - { + if (! printer().isopen()) + printer().open(); + + TFilename f; + f.temp("rgp"); + _datareg = TDate(1, m, _annoes); // serve alla preprocess_header + if (_scelta == B0_settato || _scelta == prosegui_stampa) + { + if (_tipo_stampa == prova) + send_message('S',f, m); + else + send_message('s',f, m); + } + else //_scelta == prosegui_cal_stampa + { if (_tipo_stampa == prova) send_message('L', f, m); else send_message('l', f, m); - } - if (fexist(f)) - { - _intesta_liq = true; - merge_export_file(f,false,true); - printer().formfeed(); - _intesta_liq = false; - remove(f); - } + } + if (f.exist()) + { + _intesta_liq = true; + merge_export_file(f,false,true); + printer().formfeed(); + _intesta_liq = false; + remove(f); + } } }//for } @@ -3315,7 +3531,8 @@ bool TStampa_registri_app::set_print(int n) const TDate d(31,12,_annoes); if (_data_a == d) _tipo_riepilogativo = m.get(TIPO_RIEPILOGATIVO)[0]; - else _tipo_riepilogativo = ' '; + else + _tipo_riepilogativo = ' '; printer().setdate(_data_stampa); } else //stampe definitive @@ -3712,7 +3929,7 @@ void TStampa_registri_app::stampa_prospetto_riepilogo(tiporeg tipo, const TStrin row.put(TR("Registro IVA:"), 0); row.put(codreg, 14); row.put(format("%-.40s",(const char*)_tabreg->get("S0")), 18); - row.put(TR("Attivita\'"), 60); + row.put(TR("Attività"), 60); if (_annoes > 2007) { diff --git a/cg/cg4400.h b/cg/cg4400.h index 925ef8515..9305bd5d9 100755 --- a/cg/cg4400.h +++ b/cg/cg4400.h @@ -38,7 +38,7 @@ class TStampa_registri_app : public TPrintapp // TLocalisamfile *_clifo, *_occas, *_com, *_anag, *_unloc, *_attiv, *_indlib; // TTable *_tablia, *_tabpim, *_tabprm, *_tabprp, *_table; TTable *_tabreg; - TRigaiva_array _iva_array, _riga_rmi; + TRigaiva_array _iva_array, _riga_rmi, _riga_prospettoXcassa; TTipodoc_array _doc_array; TRiga_array _tot_iva_array, _tot_prec_iva_array; TBit_array _selected; @@ -146,6 +146,10 @@ public: void scrivi_reg(const TDate&); int stampa_acquisti(int); real stampa_valori_plafonds(const real&, const int, TTable&, const char*); + + bool some_IVAxCassa() const; // C'e' IVA per cassa o differita da stampare? + bool print_IVAxCassa(int month); + void build_nomiditte(TProgind* pnd = NULL); void set_year(int y) { _annoes = y; } void clear_stliq(); diff --git a/cg/cg4500.cpp b/cg/cg4500.cpp index 6ff12556f..fbfb3c4fb 100755 --- a/cg/cg4500.cpp +++ b/cg/cg4500.cpp @@ -1,9 +1,12 @@ -#include -#include #include "cg4501.h" #include "cg4500a.h" #include "cglib01.h" +#include +#include +#include + + class TAp_eser : public TSkeleton_application { int _anno, _newanno; @@ -26,7 +29,7 @@ public: bool apertura_es(); }; -TAp_eser& app() { return (TAp_eser&) main_app(); } +static TAp_eser& app() { return (TAp_eser&) main_app(); } bool TAp_eser::mask_newanno (TMask_field& f, KEY k) { @@ -256,21 +259,21 @@ int cg4500 (int argc, char* argv[]) switch (toupper(*argv[2])) { case 'C': - { - TAp_eser a; - a.run(argc, argv, TR("Apertura nuovo esercizio")); - } - break; + { + TAp_eser a; + a.run(argc, argv, TR("Apertura nuovo esercizio")); + } + break; case 'I': - { - TAp_iva a; - a.run(argc, argv, TR("Apertura nuovo esercizio IVA")); - } - break; + { + TAp_iva a; + a.run(argc, argv, TR("Apertura nuovo esercizio IVA")); + } + break; default: error_box("Uso: cg4 -4 [C,I]"); - break; + break; } - return TRUE; + return 0; } diff --git a/cg/cg4501.cpp b/cg/cg4501.cpp index 4d2c9751f..5ec6f8bcc 100755 --- a/cg/cg4501.cpp +++ b/cg/cg4501.cpp @@ -1,17 +1,19 @@ -#include -#include - #include "cg4501.h" #include "cg4500b.h" -#include "nditte.h" + +#include +#include +#include + + +#include bool TAp_iva::mask_annoiva (TMask_field& f, KEY k) { if ( (k == K_ENTER) && f.to_check(k) ) { - int annoiva = f.mask().get_int(F_ANNOIVA); - TConfig conf(CONFIG_DITTA); - int annoivap = conf.get_int("AnLiIv"); + const int annoiva = f.mask().get_int(F_ANNOIVA); + const int annoivap = ini_get_int(CONFIG_DITTA, "cg", "AnLiIv"); if (annoivap > 0 && annoiva != annoivap + 1) return f.error_box(FR("Il nuovo anno esercizio IVA deve essere %d"), (annoivap+1)); } @@ -26,39 +28,11 @@ bool TAp_iva::create() return TSkeleton_application::create(); } -bool TAp_iva::apertura_iva() +void TAp_iva::libro_unico() { - TString16 annoiva; - TString16 codlia; - TDate data; - - int annop = _annop; + TString4 annoiva; annoiva.format("%04d", _annoiva); - - //viene aggiornata la tabella LIA (liquidazione iva annuale) - TTable tablia ("%LIA"); - codlia.format("%05ld%04d", get_firm(), _annoiva); - tablia.put ("CODTAB", codlia); - if (tablia.read() == NOERR) - tablia.remove(); - - tablia.zero(); - codlia.format("%05ld%04d", get_firm(), annop); - tablia.put ("CODTAB", codlia); - - if (tablia.read() != NOERR) - return error_box(TR("Non esiste il record relativo all'anno iva precedente sulla tabella liquidazione annuale iva")); - else - { - codlia.format("%05ld%04d", get_firm(), _annoiva); - tablia.put("CODTAB", codlia); - tablia.put("S7", _frequenza); - tablia.put("B2", _is_minagr); - tablia.zero("R0"); - tablia.write(); - } - //viene aggiornata la tabella del libro unico. TRelation lbu("%LBU"); TRectype & tablbu = lbu.curr(); @@ -78,9 +52,8 @@ bool TAp_iva::apertura_iva() tablbu.put ("CODTAB", _annop); cur.setregion(tablbu, tablbu); items = cur.items(); - + cur.freeze(); - for (cur = 0L; cur.pos() < items; ++cur) { TString16 cod(tablbu.get("CODTAB")); @@ -90,6 +63,46 @@ bool TAp_iva::apertura_iva() tablbu.zero("I0"); lbu.write(); } +} + +bool TAp_iva::apertura_iva() +{ + TString16 codlia; + + TString4 annoiva; annoiva.format("%04d", _annoiva); + + //viene aggiornata la tabella LIA (liquidazione iva annuale) + TTable tablia ("%LIA"); + + codlia.format("%05ld%04d", get_firm(), _annoiva); + tablia.put ("CODTAB", codlia); + if (tablia.read() == NOERR) + tablia.remove(); + + tablia.zero(); + codlia.format("%05ld%04d", get_firm(), _annop); + tablia.put ("CODTAB", codlia); + + if (tablia.read() != NOERR) + return error_box(TR("Non esiste il record relativo all'anno IVA precedente sulla tabella liquidazione annuale IVA")); + else + { + codlia.format("%05ld%04d", get_firm(), _annoiva); + tablia.put("CODTAB", codlia); + tablia.put("S7", _frequenza); + tablia.put("B2", _is_minagr); + tablia.zero("R0"); + + if (tablia.get_bool("B5")) // IVA per casssa + { + tablia.put("D0", TDate( 1, 1, _annoiva)); + tablia.put("D1", TDate(31,12, _annoiva)); + } + + tablia.write(); + } + + // libro_unico(); // Obsoleto? //viene aggiornata la tabella dei registri. TRelation reg("REG"); @@ -99,7 +112,7 @@ bool TAp_iva::apertura_iva() TCursor cur_reg(®, "", 1, &tabreg, &tabreg); - items = cur_reg.items(); + TRecnotype items = cur_reg.items(); cur_reg.freeze(); for (cur_reg = 0L; cur_reg.pos() < items; ++cur_reg) { @@ -116,12 +129,12 @@ bool TAp_iva::apertura_iva() cur_reg.freeze(); for (cur_reg = 0L; cur_reg.pos() < items; ++cur_reg) { - int tiporeg = tabreg.get_int("I0"); + const int tiporeg = tabreg.get_int("I0"); if ( (tiporeg == 1)||(tiporeg == 2)||(tiporeg==3)||(tiporeg==9)) { TString16 cod = tabreg.get("CODTAB"); - cod.overwrite(annoiva); + tabreg.put("CODTAB", cod); tabreg.zero("I1"); tabreg.zero("I2"); @@ -129,9 +142,9 @@ bool TAp_iva::apertura_iva() tabreg.zero("I5"); tabreg.zero("I6"); tabreg.zero("S1"); - tabreg.put("D0", data); - tabreg.put("D2", data); - tabreg.put("D3", data); + tabreg.zero("D0"); + tabreg.zero("D2"); + tabreg.zero("D3"); tabreg.zero("R1"); tabreg.zero("R2"); @@ -153,7 +166,8 @@ bool TAp_iva::apertura_iva() nditte.rewrite(); } message_box(TR("Apertura nuovo esercizio IVA completata")); - return TRUE; + + return true; } void TAp_iva::main_loop() diff --git a/cg/cg4501.h b/cg/cg4501.h index edf381224..9f50c5416 100755 --- a/cg/cg4501.h +++ b/cg/cg4501.h @@ -6,13 +6,8 @@ #include #endif -#ifndef __TABUTIL_H -#include -#endif - class TAp_iva : public TSkeleton_application { -// TTable* _reg, * _lia, * _lbu; int _annoiva; int _annop; long _ditta; @@ -21,15 +16,12 @@ class TAp_iva : public TSkeleton_application protected: static bool mask_annoiva(TMask_field&, KEY); + void libro_unico(); public: virtual bool create(); - virtual bool destroy() { return TRUE;} virtual void main_loop(); bool setta(); bool apertura_iva(); - - TAp_iva() {} - virtual ~TAp_iva() {} }; diff --git a/cg/cg5300.cpp b/cg/cg5300.cpp index f6a89527e..7b93f3426 100755 --- a/cg/cg5300.cpp +++ b/cg/cg5300.cpp @@ -2,15 +2,11 @@ // modifica parametri contabilita' relativi alla liquidazione #include -#include #include #include -#include #include -#include #include #include -#include #include "cg5.h" #include "cg5300a.h" @@ -23,9 +19,9 @@ class TParaliq_app : public TRelation_application { - TRelation * _rel; - TMask * _msk; - int _yearliq; + TRelation* _rel; + TMask* _msk; + int _yearliq; protected: // Applicat virtual void on_config_change(); @@ -174,10 +170,10 @@ bool TParaliq_app::utcred_handler(TMask_field& f, KEY k) const int anno_liq = m.get_int(F_YEAR); TString80 cod_mesi; TString des_mesi(128); - TString16 mese; - TList_field & mese_res = ((TList_field &) m.field(F_MESE_RES_AL)); + TString8 mese; + TList_field& mese_res = m.lfield(F_MESE_RES_AL); - if (anno_liq >= 2000 && f.get().not_empty()) + if (anno_liq >= 2000 && !f.get().not_empty()) { m.field(F_CRED_PREC).set_prompt(TR("Credito compensabile inizio anno ")); m.field(F_CRED_RES).set_prompt(TR("Credito in compensaz.utilizzato ")); @@ -292,8 +288,7 @@ void TParaliq_app::init_array(TMask& m, bool update) void TParaliq_app::on_config_change() { - TConfig d(CONFIG_DITTA); - _yearliq = (int)d.get_long("AnLiIv"); + _yearliq = ini_get_int(CONFIG_DITTA, "cg", "AnLiIv"); } bool TParaliq_app::user_create() @@ -442,7 +437,8 @@ int TParaliq_app::rewrite(const TMask& m) } TTable& lia = (TTable&)_rel->lfile(); - lia.put("CODTAB", format("%05ld%04d", firm, year)); + TString16 ct; ct.format("%05ld%04d", firm, year); + lia.put("CODTAB", ct); was = lia.read() == NOERR; if (!was) lia.zero(); m.autosave(*_rel); diff --git a/cg/cg5300a.uml b/cg/cg5300a.uml index 179fc4a6e..25e9d07e7 100755 --- a/cg/cg5300a.uml +++ b/cg/cg5300a.uml @@ -176,7 +176,7 @@ END SPREADSHEET F_SHEET_PLA 78 BEGIN -PROMPT 1 16 "Parametri attivita'" +PROMPT 1 16 "Parametri attività" ITEM "Attiv.@5F" ITEM "Tipo@3" ITEM "Prorata" diff --git a/cg/cglib03.cpp b/cg/cglib03.cpp index 73950415a..a13aee5cc 100755 --- a/cg/cglib03.cpp +++ b/cg/cglib03.cpp @@ -2,6 +2,7 @@ #include "cglib03.h" #include +#include #include #include @@ -31,6 +32,7 @@ static int codind2tipodet(const TString & codind, real& perc) } return tipodet; } + real indetraibile_al(const TString& codind, const TCausale& caus, int annodoc, int & tipodet,const bool is_liq) { real perc; @@ -105,6 +107,28 @@ int analizza_IVA(const real& imptot, const real& ivatot, const real perc_ind, return flag; } +bool gestione_IVAxCassa(const TDate& data, long firm) +{ + bool yes = dongle().active(ICAUT) && dongle().active(SCAUT); + if (yes) + { + const int anno = data.year(); + if (firm <= 0) + firm = prefix().get_codditta(); + TString16 codtab; + codtab.format("%05ld%04d", firm, anno); + const TRectype& lia = cache().get("%LIA", codtab); + yes = lia.get_bool("B5"); + if (yes) + { + TDate dal = lia.get("D0"); if (dal.year() != anno) dal = TDate( 1, 1,anno); + TDate al = lia.get("D1"); if (al.year() != anno) al = TDate(31,12,anno); + yes = data >= dal && data <= al; + } + } + return yes; +} + // Anticamente TIPODET conteneva in tipo di indetraibilita, // ora invece trattasi di un codice di indetraibilita' // associato ad un motivo ed una percentuale di indetraibilita' @@ -208,7 +232,7 @@ bool TRigaiva_array::add_riga(const TRectype& iva) if (ok) { real percind; - const TString & codind = iva.get(RMI_TIPODET); + const TString& codind = iva.get(RMI_TIPODET); const int tipodet = codind2tipodet(codind, percind); const TString4 codiva = iva.get(RMI_CODIVA); const int tipocr = iva.get_int (RMI_TIPOCR); diff --git a/cg/cglib03.h b/cg/cglib03.h index 83994848d..dd1bf93cc 100755 --- a/cg/cglib03.h +++ b/cg/cglib03.h @@ -157,5 +157,6 @@ int analizza_IVA(const real& imptot, const real& ivatot, const real perc_ind, real& imp_det, real& iva_det, real& imp_ind, real& iva_ind); int get_tipodet_from_rmi(const TRectype& rmi, const TRectype& mv, real& percind, const bool is_liq = false); +bool gestione_IVAxCassa(const TDate& data, long firm = 0); #endif diff --git a/cg/cgsalda3.cpp b/cg/cgsalda3.cpp index fb1053007..7c11bca2f 100755 --- a/cg/cgsalda3.cpp +++ b/cg/cgsalda3.cpp @@ -685,9 +685,12 @@ TFieldtypes TSolder_tree::get_var(const TString& name, TVariant& var) const } else if (name == PART_DATADOC) { - var = rpag.get(name); - if (var.is_zero()) - var = rpag.get(PART_DATAREG); + TDate d = rpag.get(PART_DATAPAG); + if (!d.ok()) + d = rpag.get(PART_DATADOC); + if (!d.ok()) + d = rpag.get(PART_DATAREG); + var = d; } else if (rpag.TRectype::exist(name)) var = rpag.get(name); diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index 46f44ee98..3d3f94d5e 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -1118,7 +1118,11 @@ int TRiga_partite::calcola_pagato_periodo(const TDate& dal, const TDate& al, TIm { const TRectype& pag = scad.row(p); // Riga pagamento const TRiga_partite& sum = partita().riga(p); // Riga partite - const TDate datapag = sum.get_date(PART_DATAPAG); + TDate datapag = sum.get_date(PART_DATAPAG); + if (!datapag.ok()) + datapag = sum.get_date(PART_DATADOC); + if (!datapag.ok()) + datapag = sum.get_date(PART_DATAREG); if ((!dal.ok() || datapag >= dal) && (!al.ok() || datapag <= al)) pags.add((TRectype*)&pag); } @@ -1140,7 +1144,11 @@ int TRiga_partite::calcola_pagato_periodo(const TDate& dal, const TDate& al, TIm { const TRectype& pag = unas.row(r); const TRiga_partite& sum = partita().riga(r); - const TDate datapag = sum.get_date(PART_DATAPAG); + TDate datapag = sum.get_date(PART_DATAPAG); + if (!datapag.ok()) + datapag = sum.get_date(PART_DATADOC); + if (!datapag.ok()) + datapag = sum.get_date(PART_DATAREG); if ((!dal.ok() || datapag >= dal) && (!al.ok() || datapag <= al)) pags.add((TRectype*)&pag); } diff --git a/cg/f171.dir b/cg/f171.dir index ca3820ff1..6a05d773b 100644 --- a/cg/f171.dir +++ b/cg/f171.dir @@ -1,3 +1,3 @@ 171 0 -$ivadiff|0|0|127|0|IVA ad esigibilità differita o per cassa||| +$ivadiff|0|0|110|0|IVA ad esigibilità differita o per cassa||| diff --git a/cg/f171.trr b/cg/f171.trr index 05b0568dc..3dcb37c9e 100644 --- a/cg/f171.trr +++ b/cg/f171.trr @@ -18,7 +18,7 @@ SEZIONE|1|1|0|Sezione are vere IMPORTO|4|18|3|Importo IMPONIBILE|4|18|3|Imponibile IMPOSTA|4|18|3|Imposta -VERSATA|4|18|3|Imposta Versata +CHIUSA|8|1|0|Partita chiusa 2 NUMREG+NUMRIG+NUMPRO| ANNOLIQ+MESELIQ+DATAREGP|X