From 9263ff08f073eb07d19ad323f991421b90141c8b Mon Sep 17 00:00:00 2001 From: guy Date: Thu, 20 Oct 2011 15:35:39 +0000 Subject: [PATCH] Patch level : Files correlati : fe0 fe0100a.msk fetbcon.msk Ricompilazione Demo : [ ] Commento : Prima versione nuova gestione FE git-svn-id: svn://10.65.10.50/branches/R_10_00@22464 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- fe/fe0100.cpp | 1042 ++++++++++++++++++++++++++++-------------------- fe/fe0100a.h | 32 +- fe/fe0100a.uml | 166 +++++--- fe/fetbcon.h | 1 + fe/fetbcon.uml | 11 +- 5 files changed, 747 insertions(+), 505 deletions(-) diff --git a/fe/fe0100.cpp b/fe/fe0100.cpp index 7d7c22f21..03d88f2ed 100755 --- a/fe/fe0100.cpp +++ b/fe/fe0100.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -25,9 +26,6 @@ #include "fe0100a.h" #include "../cg/cglib01.h" -// Data limite da cui si cominciano a dichiarare anche gli scontrini -const TDate data_limite_scontrini(1,7,2011); - const long INVALID_NUMREG = 9999999L; /////////////////////////////////////////////////////////// @@ -56,6 +54,42 @@ static const TString& provincia_di(const TString& codcom) return cache().get(LF_COMUNI, key, COM_PROVCOM); } +static real importo_limite(int anno) +{ return anno <= 2010 ? 25000 : 3000; } + +static bool is_nota_variazione(const TRectype& mov) +{ + const int logicnum = mov.num(); + + if (logicnum == LF_MOV) + { + const real totdoc = mov.get_real(MOV_TOTDOC); + if (totdoc < ZERO) + return true; + + const int tipomov = mov.get_int(MOV_TIPOMOV); + if (tipomov == 2) // Nota di credito/debito per saldaconto + return true; + + const TString& tipodoc = mov.get(MOV_TIPODOC); + if (tipodoc == "NC" || tipodoc == "ND") // Nota di credito/debito senza saldaconto + return true; + } else + if (logicnum == LF_ALLEG) + { + const TString& numrett = mov.get(ALL_NUMRETT); + if (numrett.full()) + return true; + + const real importo = mov.get_real(ALL_IMPORTO); + const real imposta = mov.get_real(ALL_IMPOSTA); + if (importo < ZERO || imposta < ZERO) + return true; + } + + return false; +} + /////////////////////////////////////////////////////////// // TContratto /////////////////////////////////////////////////////////// @@ -71,6 +105,7 @@ protected: public: virtual bool ok() const { return !_rec.empty(); } bool totale_annuale(int anno, real& importo, real& imposta) const; + int modalita_pagamento() const; bool init(const TRectype& rec); TContratto(char tipocf, long codcf, const char* codcont); @@ -149,6 +184,13 @@ bool TContratto::totale_annuale(int anno, real& importo, real& imposta) const return importo > ZERO; } +int TContratto::modalita_pagamento() const +{ + int modpag = _rec.get_int("S6"); + if (modpag != 2 && modpag != 3) + modpag = 2; + return modpag; +} bool TContratto::init(const TRectype& rec) { @@ -653,54 +695,157 @@ TDati_rilevanti_set::TDati_rilevanti_set(int anno) trc.create_fields(9, *this); } +/////////////////////////////////////////////////////////// +// TDati_rilevanti_array +/////////////////////////////////////////////////////////// + +class TDati_rilevanti_array : public TObject +{ + TArray _data; + +public: + int items() const { return _data.items(); } + const TRectype& operator[](int i) { return (const TRectype&)_data[i]; } + bool add(const TRectype& alleg, bool send_all); + void add(const TArray& note, bool send_all); +}; + +bool TDati_rilevanti_array::add(const TRectype& alleg, bool send_all) +{ + const real importo = alleg.get_real(ALL_IMPORTO); + const real imposta = alleg.get_real(ALL_IMPOSTA); + if (importo.is_zero() && imposta.is_zero()) + return false; + + const TString80 contratto = alleg.get(ALL_CONTRATTO); + const TString8 numrett = alleg.get(ALL_NUMRETT); + if (contratto.full() || numrett.full()) + { + const char tipocf = alleg.get_char(ALL_TIPOCF); + const char codcf = alleg.get_char(ALL_CODCF); + TRectype* sum = NULL; + for (int i = _data.last(); i >= 0; i--) + { + TRectype& rec = (TRectype&)_data[i]; + const char t = rec.get_char(ALL_TIPOCF); + const long c = rec.get_long(ALL_CODCF); + if (t == tipocf && c == codcf) + { + const TString& k = rec.get(ALL_CONTRATTO); + const TString& n = rec.get(ALL_NUMDOC); + if (k == contratto || n == numrett) + { + sum = &rec; + break; + } + } + } + if (sum != NULL) + { + sum->add(ALL_IMPORTO, importo); + sum->add(ALL_IMPOSTA, imposta); + const TDate sum_data = sum->get(ALL_DATAREG); + const TDate all_data = alleg.get(ALL_DATAREG); + if (all_data > sum_data) + sum->put(ALL_DATAREG, all_data); + + const int old_mode = sum->get_int(ALL_IGNORA); + if (old_mode <= 1) + { + const int anno = sum->get_int(ALL_ANNO); + const int new_mode = sum->get_real(ALL_IMPORTO) < importo_limite(anno); + if (old_mode != new_mode) + sum->put(ALL_IGNORA, new_mode); + } + return true; // Aggiunto a record preesistente + } + else + { + // Ignora le note di variazione non collegate e di importo non rilevante + if (!send_all && !alleg.get_int(ALL_IGNORA) && is_nota_variazione(alleg)) + { + const int anno = alleg.get_int(ALL_ANNO); + const real importo = abs(alleg.get_real(ALL_IMPORTO)); + if (importo < importo_limite(anno)) + return false; + } + } + } + + if (!send_all) + { + // Ignora i record solitari non rilevanti + const int ignora = alleg.get_int(ALL_IGNORA); + if (ignora != 0) + return false; + } + + // Creo un nuovo record + return _data.add(alleg) >= 0; +} + +void TDati_rilevanti_array::add(const TArray& note, bool send_all) +{ + FOR_EACH_ARRAY_ITEM(note, t, obj) + { + const TRectype& nota = *(const TRectype*)obj; + add(nota, send_all); + } +} + + /////////////////////////////////////////////////////////// // TDati_rilevanti_msk /////////////////////////////////////////////////////////// #define MANUAL_ROW 900000L -enum TExclusion_mode { em_incluso, em_importo_limite, em_nullo, em_no_allegato, +enum TExclusion_mode { em_incluso, em_importo_limite, em_no_allegato, em_fiscalita_agevolata, em_estero, em_intra, em_data_limite, em_art8, em_passaggi_interni, - em_altro }; + em_forzato, em_inviato, em_altro }; class TDati_rilevanti_msk : public TAutomask { TMaskmode _mode; - bool _sheet_dirty, _send_all; - TAssoc_array _contratti; + bool _sheet_dirty; TExclusion_mode _why; TLog_report* _log; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void alleg_sort(TSheet_field& s) const; void load_sheet(); bool save_sheet(); bool save_if_dirty(); void set_dirty(bool d = true); + bool send_nota_variazione(const TRectype& alleg, TDati_rilevanti_set& operaz); + bool send_fatt(const TRectype& alleg, TDati_rilevanti_set& operaz); + protected: TRecnotype last_user_progr() const; TRecnotype nuovo_progr() const; bool check_rows(bool show_error); - bool send_nota_variazione(const TISAM_recordset& alleg, TDati_rilevanti_set& operaz); - bool send_fatt(const TISAM_recordset& alleg, TDati_rilevanti_set& operaz); - bool send_rec(const TISAM_recordset& alleg, TDati_rilevanti_set& operaz); + bool send_rec(const TRectype& alleg, TDati_rilevanti_set& operaz); TExclusion_mode segnala_movimento(const TRectype& mov, TExclusion_mode motivo); - bool is_nota_variazione(const TRectype& mov) const; - real importo_limite(int anno) const; - void elabora_note(const TArray& note, TFast_isamfile& falleg, long& nprog); - long fattura_associata(long numreg_var) const; + + bool fattura_associata(long numreg_var, TDate& datafatt, TString& numdoc) const; + bool controlla_mov(TRectype& mrec) const; + bool azzera_alleg(int anno, TAssoc_array& manuali) const; + void collega_variazioni() const; public: TRecnotype genera_alleg(); bool elabora_alleg(); bool send_alleg(); - bool azzera_alleg(bool manual, TRecnotype first) const; - TExclusion_mode elabora_movimento(const TRectype& mov, TFast_isamfile& falleg, TRecnotype& progr); - bool salva_allegato(const TRectype& mov, TFast_isamfile& falleg, TRecnotype& progr, + + TExclusion_mode elabora_movimento(const TRectype& mov, TBaseisamfile& falleg); + + bool salva_allegato(const TRectype& mov, TBaseisamfile& falleg, TRecnotype& progr, const real& corrispettivo, const real& imposta, int tipope); + TExclusion_mode validate_clifo(const TRectype& mov); TExclusion_mode validate_mov(const TRectype& mov); @@ -718,15 +863,16 @@ TExclusion_mode TDati_rilevanti_msk::segnala_movimento(const TRectype& mov, TExc TString msg; msg.format(FR("%s %6ld - Registrazione %7ld scartata: "), tipocf, codcf, numreg); switch (motivo) { - case em_nullo : msg << TR("Soggetto con codice nullo"); break; case em_importo_limite : msg << TR("importo inferiore al limite della comunicazione"); break; case em_no_allegato : msg << TR("Soggetto da non inserire in allegato"); break; case em_fiscalita_agevolata: msg << TR("Soggetto residente in stato a fiscalità agevolata"); break; case em_estero : msg << TR("Soggetto residente all'estero"); break; case em_intra : msg << TR("Movimento intra"); break; case em_data_limite : msg << TR("Data movimento fuori dal limite della comunicazione"); break; - case em_art8 : msg << TR("soggetto all'articolo 8 (del dpr 26-10-1972)"); break; - case em_passaggi_interni : msg << TR("passaggi interni"); break; + case em_art8 : msg << TR("Soggetto all'articolo 8 (del dpr 26-10-1972)"); break; + case em_passaggi_interni : msg << TR("Passaggi interni"); break; + case em_forzato : msg << TR("Forzato manualmente"); break; + case em_inviato : msg << TR("Inviato l'anno precedente"); break; default : msg << TR("Altri motivi"); break; } _why = motivo; @@ -742,7 +888,7 @@ TExclusion_mode TDati_rilevanti_msk::validate_clifo(const TRectype& mov) const long codcf = mov.get_long(MOV_CODCF); const TString16 ocfpi = mov.get(MOV_OCFPI); if (tipocf <= ' ' || (codcf <= 0 && ocfpi.blank())) - return segnala_movimento(mov, em_nullo); + return segnala_movimento(mov, em_altro); TString4 stato; if (ocfpi.full()) @@ -789,42 +935,17 @@ TExclusion_mode TDati_rilevanti_msk::validate_mov(const TRectype& mov) !mov.get_real(MOV_CORRVALUTA).is_zero()) segnala_movimento(mov, em_intra); - if (anno <= 2011) - { - const TDate datareg = mov.get_date(MOV_DATAREG); - const TString& tipodoc = mov.get(MOV_TIPODOC); - if (tipodoc == "SC" && datareg < data_limite_scontrini) - segnala_movimento(mov, em_data_limite); - } - return validate_clifo(mov); } -bool TDati_rilevanti_msk::is_nota_variazione(const TRectype& mov) const -{ - const int tipomov = mov.get_int(MOV_TIPOMOV); - if (tipomov == 2) // Nota di credito/debito per saldaconto - return true; - - const TString& tipodoc = mov.get(MOV_TIPODOC); - if (tipodoc == "NC" || tipodoc == "ND") // Nota di credito/debito senza saldaconto - return true; - - const real totdoc = mov.get_real(MOV_TOTDOC); - if (totdoc < ZERO) - return true; - - return false; -} - -long TDati_rilevanti_msk::fattura_associata(long numreg_var) const +bool TDati_rilevanti_msk::fattura_associata(long numreg_var, TDate& datafatt, TString& numdoc) const { long numreg_fatt = 0; if (main_app().has_module(SCAUT)) { TLocalisamfile partite(LF_PARTITE); - TRectype& part = partite.curr(); partite.setkey(2); + TRectype& part = partite.curr(); part.put(PART_NREG, numreg_var); part.put(PART_NUMRIG, 1); if (partite.read() == NOERR) // Ho trovato la partita ora cerco la fattura di riferimento @@ -839,206 +960,26 @@ long TDati_rilevanti_msk::fattura_associata(long numreg_var) const const long nreg_part = riga.get_long(PART_NREG); if (tipomov == 1 && nreg_part > 0) // Fattura { - numreg_fatt = nreg_part; + datafatt = riga.get(PART_DATAREG); + numdoc = riga.get(PART_NUMDOC); break; } } } } - return numreg_fatt; + return numdoc.full(); } -bool TDati_rilevanti_msk::salva_allegato(const TRectype& mov, TFast_isamfile& falleg, TRecnotype& progr, - const real& importo, const real& imposta, int tipope) -{ - bool update_existing_row = false; - const int anno = mov.get_int(MOV_ANNOIVA); - const long numreg_mov = mov.get_long(MOV_NUMREG); - - const bool is_variazione = importo < ZERO || is_nota_variazione(mov); - long num_fatt = 0; // Numero di registrazione rettificabile - long num_rett = 0; // Numero di registrazione rettificata - - falleg.zero(); - TRectype& alleg = falleg.curr(); - alleg.put(ALL_ANNO, anno); - alleg.put(ALL_PROGR, progr); - - const TString80 contratto = mov.get(MOV_CONTRATTO); - if (contratto.full()) // Gestione contratti - { - TString80 key; - key.format("%c%06ld_%s_%d", mov.get_char(MOV_TIPO), mov.get_long(MOV_CODCF), - (const char*)contratto, tipope); - real* first_progr = (real*)_contratti.objptr(key); - if (first_progr == NULL) // Primo movimento del contratto - { - first_progr = new real; - *first_progr = progr; - _contratti.add(key, first_progr); - } - else - { - // Aggiorno il record generato col primo movimento del contratto - const TRecnotype old_progr = first_progr->integer(); - CHECKD(old_progr > 0 && old_progr < progr, "Numero progressivo da contratto non valido ", old_progr); - alleg.put(ALL_PROGR, old_progr); - if (falleg.read() != NOERR) - { - TString msg; - msg << TR("Impossibile aggiornare record da contratto: ") << key; - _log->log(2, msg); - return false; - } - update_existing_row = true; - } - } - else - { - // Gestione note di credito - if (is_variazione) - { - num_fatt = fattura_associata(numreg_mov); - if (num_fatt > 0 && num_fatt < INVALID_NUMREG) - { - TLocalisamfile recset(LF_ALLEG); - recset.setkey(3); - recset.put(ALL_NUMREG, num_fatt); - if (recset.read(_isgteq) == NOERR && recset.get_long(ALL_NUMREG) == num_fatt) - { - const TDate data_fatt = recset.get(ALL_DATAREG); - const int anno_fatt = data_fatt.year(); - num_rett = num_fatt; // Memorizzo comunque il numero fattura da rettificare - - if (anno_fatt == anno) // Se sono dello stesso anno vario la fattura e non registro la nota di variazione - { - update_existing_row = true; - alleg = recset.curr(); - } - else - { - if (anno_fatt < 2010 || anno_fatt > anno) - { - num_rett = 0; - _why = em_data_limite; // Non pertinente - } - } - } - } - - const char* tipocf = mov.get_char(MOV_TIPO) == 'F' ? TR("Fornitore") : TR("Cliente"); - const long codcf = mov.get_long(MOV_CODCF); - TString msg; msg.format(FR("%s %6ld - Nota di variazione %ld "), tipocf, codcf, numreg_mov); - - if (num_rett > 0) - { - if (update_existing_row) - msg << TR("sommata"); - else - msg << TR("associata"); - msg << TR(" alla registrazione ") << num_rett; - _log->log(update_existing_row ? 0 : 1, msg); - } - else - { - // Variazione di fattura non rilevante: considero importo della variazione - if (_why == em_incluso && abs(importo) < importo_limite(anno)) - _why = em_importo_limite; - num_rett = INVALID_NUMREG; - } - } - } - - // I dati della registrazione IVA vanno aggiornati comunque - alleg.put(ALL_DATAREG, mov.get(MOV_DATAREG)); - - int modpag = mov.get_int(MOV_MODPAG); - if (modpag <= 0) - modpag = contratto.full() ? 2 : 1; - alleg.put(ALL_MODPAG, modpag); - - int err = 0; - if (update_existing_row) // Contratti o note di variazione - { - // Mi limito ad incrementare gli importi - alleg.add(ALL_IMPORTO, importo); - alleg.add(ALL_IMPOSTA, imposta); - - // Aggiorno il flag di inclusione se necessario - const TExclusion_mode em_old = (TExclusion_mode)alleg.get_int(ALL_IGNORA); - if (em_old == em_incluso || em_old == em_importo_limite) - { - const real imp_new = alleg.get(ALL_IMPORTO); - const TExclusion_mode em_new = imp_new >= importo_limite(anno) ? em_incluso : em_importo_limite; - if (em_new != em_old) - alleg.put(ALL_IGNORA, int(em_new)); - } - - err = falleg.rewrite(); - } - else - { - // Registro tutti i dati del cliente e gli importi - const char tipocf = mov.get_char(MOV_TIPO); - const long codcf = mov.get_long(MOV_CODCF); - alleg.put(ALL_TIPOCF, tipocf); - alleg.put(ALL_CODCF, codcf); - alleg.put(ALL_OCFPI, mov.get(MOV_OCFPI)); - alleg.put(ALL_NUMREG, numreg_mov); - alleg.put(ALL_TIPOPE, tipope); - alleg.put(ALL_IMPORTO, importo); - alleg.put(ALL_IMPOSTA, imposta); - - if (contratto.full()) - { - alleg.put(ALL_CONTRATTO, contratto); - if (_why == em_incluso) - { - TContratto cc(tipocf, codcf, contratto); - real netto, iva; - if (cc.totale_annuale(anno, netto, iva) && netto < importo_limite(anno)) - _why = em_importo_limite; // Contratto inutile :-) - } - } else - if (is_variazione) - { - alleg.put(ALL_NUMRETT, num_rett); - } - - alleg.put(ALL_IGNORA, int(_why)); - - err = falleg.rewrite_write(); - if (err == NOERR) - progr++; - } - - if (err != NOERR) - { - TString msg; - msg.format(FR("Errore %d di aggiornamento del file %s"), err, (const char*)falleg.name()); - _log->log(2, msg); - } - - return err == NOERR; -} - -real TDati_rilevanti_msk::importo_limite(int anno) const -{ return anno <= 2010 ? 25000 : 3000; } - -TExclusion_mode TDati_rilevanti_msk::elabora_movimento(const TRectype& mov, TFast_isamfile& falleg, TRecnotype& progr) +TExclusion_mode TDati_rilevanti_msk::elabora_movimento(const TRectype& mov, TBaseisamfile& falleg) { validate_mov(mov); const char tipocf = mov.get_char(MOV_TIPO); + const long codcf = mov.get_long(MOV_CODCF); const TString4 tipodoc = mov.get(MOV_TIPODOC); const TDate datareg = mov.get_date(MOV_DATAREG); - const int anno = datareg.year(); + const int anno = get_int(F_ANNO); -#ifdef DBG - if (mov.get_long(MOV_NUMREG) == 2673) - int cazzone = 1; -#endif - const TString& keytok = mov.get(MOV_NUMREG); TRecord_array righe_iva(keytok, LF_RMOVIVA); @@ -1053,10 +994,6 @@ TExclusion_mode TDati_rilevanti_msk::elabora_movimento(const TRectype& mov, TFas if (natura_operazione <= 0 || natura_operazione > 5) continue; - // Tratto a parte gli scontrini: devono sempre essere di tipo 4 - if (natura_operazione == 1 && tipodoc == "SC") - natura_operazione = 4; - // Esportazioni const bool art_8 = ci.get("S2") == "20" && ci.get("S3") == "1"; if (art_8) @@ -1069,6 +1006,7 @@ TExclusion_mode TDati_rilevanti_msk::elabora_movimento(const TRectype& mov, TFas real rmi_imponibile = rmi.get_real(RMI_IMPONIBILE); real rmi_imposta = rmi.get_real(RMI_IMPOSTA); + if (natura_operazione == 4 && rmi_imposta.is_zero()) // se l'imposta non è specificata sullo scontrino ... rmi_imposta = ci.scorpora(rmi_imponibile); // ... scorporo il lordo @@ -1076,61 +1014,171 @@ TExclusion_mode TDati_rilevanti_msk::elabora_movimento(const TRectype& mov, TFas tot_imposta += rmi_imposta; } - if (mov.get(MOV_CONTRATTO).blank() && tot_imponibile >= ZERO) + if (tot_imponibile.is_zero() && tot_imposta.is_zero()) + { + segnala_movimento(mov, em_importo_limite); + return em_importo_limite; + } + + const int modpag = mov.get_int(MOV_MODPAG); + if (modpag == 1 && tot_imponibile >= ZERO && _why == em_incluso) { // Considera solo registrazioni con importo rilevante if (tot_imponibile < importo_limite(anno)) - segnala_movimento(mov, em_importo_limite); + _why = em_importo_limite; // Non segnalare migliaia di movimenti inutilmente + } + + const long numreg = mov.get_long(MOV_NUMREG); + + // Registro tutti i dati del cliente e gli importi + falleg.zero(); + falleg.put(ALL_ANNO, anno); + falleg.put(ALL_PROGR, numreg); + falleg.put(ALL_IGNORA, int(_why)); + falleg.put(ALL_TIPOCF, tipocf); + falleg.put(ALL_CODCF, codcf); + falleg.put(ALL_OCFPI, mov.get(MOV_OCFPI)); + falleg.put(ALL_DATAREG, mov.get(MOV_DATAREG)); + falleg.put(ALL_NUMDOC, mov.get(MOV_NUMDOC)); + falleg.put(ALL_TIPOPE, tipocf == 'C' ? 1 : 2); + falleg.put(ALL_IMPORTO, tot_imponibile); + falleg.put(ALL_IMPOSTA, tot_imposta); + falleg.put(ALL_MODPAG, modpag); + if (modpag == 1) + { + falleg.put(ALL_DATARETT, mov.get(MOV_DATARETT)); + falleg.put(ALL_NUMRETT, mov.get(MOV_NUMRETT)); + } + else + falleg.put(ALL_CONTRATTO, mov.get(MOV_CONTRATTO)); + + const int err = falleg.rewrite_write(); + if (err != NOERR) + { + TString msg; + msg.format(FR("Errore %d di aggiornamento del record %d/%ld sul file %s"), + err, anno, numreg, (const char*)falleg.name()); + _log->log(2, msg); } - // Cessione o acquisto di beni o servizi (1 o 2) - const int tipope = tipocf == 'C' ? 1 : 2; - salva_allegato(mov, falleg, progr, tot_imponibile, tot_imposta, tipope); - return _why; } -bool TDati_rilevanti_msk::azzera_alleg(bool manual, TRecnotype first) const +// Test di coerenza tra MODPAG +bool TDati_rilevanti_msk::controlla_mov(TRectype& mrec) const { - const int anno = get_int(F_ANNO); + const long numreg = mrec.get_long(MOV_NUMREG); + int modpag = mrec.get_int(MOV_MODPAG); + TString80 contratto = mrec.get(MOV_CONTRATTO); + TDate datarett = mrec.get(MOV_DATARETT); + TString8 numrett = mrec.get(MOV_NUMRETT); - TFast_isamfile falleg(LF_ALLEG); - - // Azzeramento anno/attività selezionati - TString limit; - limit << ALL_ANNO << '=' << anno << ' ' - << ' ' << ALL_PROGR << '='; + bool update = false; - TRecnotype daprog = manual ? MANUAL_ROW : first; - TRecnotype aprog = manual ? 0 : MANUAL_ROW; + if (is_nota_variazione(mrec)) + { + if (contratto.full()) + { + mrec.put(MOV_CONTRATTO, contratto.cut(0)); + update = true; + } + if (modpag != 1) + { + mrec.put(MOV_MODPAG, modpag = 1); + update = true; + } + if (numrett.blank() && fattura_associata(numreg, datarett, numrett)) + { + mrec.put(MOV_DATARETT, datarett); + mrec.put(MOV_NUMRETT, numrett); + update = true; + } + if (numrett.full()) + { + const TAnagrafica a(mrec); + TString msg; + msg.format(FR("Nota n. %ld di %s associata al doc. %s del %s"), + numreg, (const char*)a.ragione_sociale(), (const char*)numrett, datarett.string()); + _log->log(0, msg); + } + } + else + { + if (contratto.full()) + { + if (modpag < 2) + { + const TContratto c(mrec.get_char(MOV_TIPO), mrec.get_long(MOV_CODCF), contratto); + mrec.put(MOV_MODPAG, modpag = c.modalita_pagamento()); + update = true; + } + if (numrett.full()) + { + mrec.zero(MOV_DATARETT); + mrec.zero(MOV_NUMRETT); + update = true; + } + } + else + { + if (modpag != 1) + { + mrec.put(MOV_MODPAG, modpag = 1); + update = true; + } + } + } + + return update; +} + +bool TDati_rilevanti_msk::azzera_alleg(int anno, TAssoc_array& manuali) const +{ + TFast_isamfile fast_alleg(LF_ALLEG); + TFast_isamfile fast_mov(LF_MOV); TString query; - query << "USE " << LF_ALLEG; - - if (manual) // Elimina i record immessi manualmente ed ignorati - query << "\nSELECT " << ALL_IGNORA << "!=\"\""; - - if (daprog > 0)query << "\nFROM " << limit << daprog; - if (aprog > 0) query << "\nTO " << limit << aprog; - + query << "USE " << LF_ALLEG + << "\nJOIN MOV INTO NUMREG==PROGR" + << "\nFROM ANNO=" << anno + << "\nTO ANNO=" << anno << " PROGR=" << MANUAL_ROW; TISAM_recordset alleg(query); - const TRecnotype items = alleg.items(); - TString str_pi; - str_pi << TR("Compattazione dati ") << anno; + TLocalisamfile& falleg = alleg.cursor()->file(); + TRectype& arec = falleg.curr(); - TProgind pi(items, str_pi); - const TRectype& rec = alleg.cursor()->curr(); + TLocalisamfile& fmov = alleg.cursor()->file(LF_MOV); + TRectype& mrec = fmov.curr(); + + TString msg; msg << TR("Azzeramento ") << falleg.description() << ' ' << anno; + TProgind pi(alleg.items(), msg, false); + + manuali.destroy(); for (bool ok = alleg.move_first(); ok; ok = alleg.move_next()) { - if (!pi.addstatus(1)) - break; - falleg.curr() = rec; - int err = falleg.remove(); - if (err != NOERR) - return cantwrite_box(falleg.name()); + pi.addstatus(1); + + const long progr = arec.get_long(ALL_PROGR); + const long numreg = mrec.get_long(MOV_NUMREG); + + bool kill = numreg != progr; + if (!kill) + { + const bool forzata = alleg.get(ALL_FORZATURA).as_bool(); + if (forzata) + manuali.add(arec.get(ALL_PROGR)); + else + { + if (controlla_mov(mrec)) + { + // fmov.rewrite(); // Non mi fido tanto + } + } + } + if (kill) + falleg.remove(); } - return items > 0; + return !manuali.empty(); } // Cerca l'ultimo numero di riga immesso manualmente @@ -1161,36 +1209,25 @@ TRecnotype TDati_rilevanti_msk::nuovo_progr() const for (int i = items-1; i >= 0; i--) { const TRecnotype sheet_progr = atol(righe.cell(i,col)); - if (sheet_progr > 0) - { - if (sheet_progr > progr) - progr = sheet_progr; - break; - } + if (sheet_progr > progr) + progr = sheet_progr; } } return progr+1; } -void TDati_rilevanti_msk::elabora_note(const TArray& note, TFast_isamfile& falleg, long& nprog) -{ - FOR_EACH_ARRAY_ITEM(note, i, obj) - { - const TRectype& not_var = *(const TRectype*)obj; - _why = em_incluso; - elabora_movimento(not_var, falleg, nprog); - } -} - TRecnotype TDati_rilevanti_msk::genera_alleg() { const int anno = get_int(F_ANNO); - _contratti.destroy(); // Azzera cache contratti + const TDate data_estrazione = get(F_DATA); TString str_pi; str_pi << TR("Movimenti ") << anno; _log = new TLog_report(str_pi); + + TAssoc_array manuali; + azzera_alleg(anno, manuali); TRecnotype nprog = 1; @@ -1200,35 +1237,56 @@ TRecnotype TDati_rilevanti_msk::genera_alleg() TFast_isamfile fmov(LF_MOV); TString query; - query << "USE MOV KEY 3 SELECT BETWEEN(DATAREG," << anno << "0101," << anno << "1231)" + query << "USE MOV KEY 3 SELECT BETWEEN(DATAREG," << anno << "0101," << get_date(F_DATA).date2ansi() << ")" << "\nFROM TIPO=C\nTO TIPO=F"; TISAM_recordset mov(query); const TRectype& mov_rec = mov.cursor()->curr(); const TRecnotype items = mov.items(); - long last_clifo = 0; - TArray note; - TProgind pi(items, str_pi); for (bool ok = mov.move_first(); ok; ok = mov.move_next()) { if (!pi.addstatus(1)) break; - const long curr_clifo = mov_rec.get_long(MOV_CODCF); - if (curr_clifo != last_clifo) - { - elabora_note(note, falleg, nprog); - last_clifo = curr_clifo; - note.destroy(); - } _why = em_incluso; + + const int annofe = mov_rec.get_int(MOV_ANNOFE); + if (annofe >= 2010) // Non elaborae i movimenti gia' inviati in definitivo! + { + segnala_movimento(mov_rec, em_inviato); + continue; + } + + const TString8 key = mov_rec.get(MOV_NUMREG); + if (manuali.is_key(key)) + { + segnala_movimento(mov_rec, em_forzato); + manuali.remove(key); + continue; + } + + const TDate datareg = mov_rec.get(MOV_DATAREG); if (is_nota_variazione(mov_rec)) - note.add(mov_rec); // Posticipa l'elaborazione delle note di varizione + { + TDate datarett = mov_rec.get(MOV_DATARETT); + TString8 numrett = mov_rec.get(MOV_NUMRETT); + if (!datarett.ok() || numrett.blank()) + fattura_associata(atol(key), datarett, numrett); + if (numrett.blank()) + numrett = "???????"; + if (!datarett.ok()) + datarett = TDate(31, 12, anno); + if (datarett.year() == anno) + elabora_movimento(mov_rec, falleg); // Elabora nota di variazione + } else - elabora_movimento(mov_rec, falleg, nprog); // Elabora immediatamente i documenti normali - } - elabora_note(note, falleg, nprog); // Elabora le eventuali note dell'ultimo fornitore + { + if (datareg.year() == anno) // Scarta fatture dell'anno dopo + elabora_movimento(mov_rec, falleg); + } + } } + collega_variazioni(); _log->preview(); delete _log; @@ -1237,6 +1295,39 @@ TRecnotype TDati_rilevanti_msk::genera_alleg() return nprog; } +void TDati_rilevanti_msk::collega_variazioni() const +{ + const int anno = get_int(F_ANNO); + TString query; + query << "USE ALLEG KEY 2 SELECT IGNORA<=" << int(em_importo_limite); + query << "\nJOIN ALLEG KEY 3 ALIAS 220 INTO ANNO=ANNO TIPOCF=TIPOCF CODCF==CODCF NUMRETT=NUMDOC"; + query << "\nFROM ANNO=" << anno << "\nTO ANNO=" << anno; + TISAM_recordset fatture(query); + + TProgind pi(fatture.items(), TR("Collegamente note di variazione"), false, true); + TRelation& rel = *fatture.cursor()->relation(); + + for (bool ok = fatture.move_first(); ok; ok = fatture.move_next()) + { + pi.addstatus(1); + if (rel.is_first_match(-220)) + { + real importo = fatture.get(ALL_IMPORTO).as_real(); + for (bool ok = true; ok; ok = rel.next_match(-220)) + importo += rel.curr(-220).get_real(ALL_IMPORTO); + + const TExclusion_mode old_mode = TExclusion_mode(fatture.get(ALL_IGNORA).as_int()); + const TExclusion_mode new_mode = importo < importo_limite(anno) ? em_importo_limite : em_incluso; + if (old_mode != new_mode) + { + TLocalisamfile& f = fatture.cursor()->file(); + f.put(ALL_IGNORA, new_mode); + f.rewrite(); + } + } + } +} + // Analizza tutti i movimenti dell'anno dell'attività corrente e genera i record rilevanti bool TDati_rilevanti_msk::elabora_alleg() { @@ -1244,53 +1335,27 @@ bool TDati_rilevanti_msk::elabora_alleg() return false; const TRecnotype prog = genera_alleg(); - azzera_alleg(false, prog); return prog > 1; } -bool TDati_rilevanti_msk::send_nota_variazione(const TISAM_recordset& alleg, TDati_rilevanti_set& operaz) +bool TDati_rilevanti_msk::send_nota_variazione(const TRectype& alleg, TDati_rilevanti_set& operaz) { - const TDate datareg = alleg.get(ALL_DATAREG).as_date(); - const long numreg = alleg.get(ALL_NUMREG).as_int(); + const TAnagrafica anag(alleg); - TDate data_fatt(31, 12, datareg.year()); - TString16 num_fatt; - - TLocalisamfile mov(LF_MOV); - TRectype& rec_nota = mov.curr(); - - const long num_rett = alleg.get(ALL_NUMRETT).as_int(); - if (num_rett > 0 && num_rett < INVALID_NUMREG) - { - mov.put(MOV_NUMREG, num_rett); - if (mov.read() == NOERR) - { - data_fatt = mov.get(MOV_DATAREG); - num_fatt = mov.get(MOV_NUMDOC); - } - } - - mov.put(MOV_NUMREG, numreg); - if (mov.read() != NOERR) - { - CHECKD(false, "Registrazione fantasma ", numreg); + real imponibile = alleg.get_real(ALL_IMPORTO); + real imposta = alleg.get_real(ALL_IMPOSTA); + if (imponibile.is_zero() && imposta.is_zero()) return false; - } - const TAnagrafica anag(alleg.cursor()->curr()); - - real imponibile = alleg.get(ALL_IMPORTO).as_real(); - real imposta = alleg.get(ALL_IMPOSTA).as_real(); - - const char tipocf = rec_nota.get_char(MOV_TIPO); + const char tipocf = alleg.get_char(ALL_TIPOCF); char segno_imponibile = tipocf == 'C' ? 'D' : 'C'; // Normalmente sono negative e quindi a debito del dichiarante char segno_imposta = segno_imponibile; - if (imponibile > ZERO) + if (imponibile >= ZERO) segno_imponibile = segno_imponibile == 'D' ? 'C' : 'D'; else imponibile = -imponibile; - if (imposta > ZERO) + if (imposta >= ZERO) segno_imposta = segno_imposta == 'D' ? 'C' : 'D'; else imposta = -imposta; @@ -1314,12 +1379,12 @@ bool TDati_rilevanti_msk::send_nota_variazione(const TISAM_recordset& alleg, TDa operaz.set(10, anag.stato_estero()); operaz.set(11, EMPTY_STRING); // TBI? Indirizzo estero } - operaz.set(12, datareg); - operaz.set(13, rec_nota.get(MOV_NUMDOC).left(15)); + operaz.set(12, alleg.get(ALL_DATAREG)); + operaz.set(13, alleg.get(ALL_NUMDOC)); operaz.set(14, imponibile); operaz.set(15, imposta); - operaz.set(16, data_fatt); - operaz.set(17, num_fatt); + operaz.set(16, alleg.get(ALL_DATARETT)); + operaz.set(17, alleg.get(ALL_NUMRETT)); operaz.set(18, segno_imponibile); operaz.set(19, segno_imposta); } @@ -1331,12 +1396,12 @@ bool TDati_rilevanti_msk::send_nota_variazione(const TISAM_recordset& alleg, TDa else operaz.set(3, anag.codice_fiscale()); - operaz.set(4, datareg); - operaz.set(5, rec_nota.get(MOV_NUMDOC).left(15)); + operaz.set(4, alleg.get(ALL_DATAREG)); + operaz.set(5, alleg.get(ALL_NUMDOC)); operaz.set(6, imponibile); operaz.set(7, imposta); - operaz.set(8, data_fatt); - operaz.set(9, num_fatt); + operaz.set(8, alleg.get(ALL_DATARETT)); + operaz.set(9, alleg.get(ALL_NUMRETT)); operaz.set(10, segno_imponibile); operaz.set(11, segno_imposta); } @@ -1344,31 +1409,14 @@ bool TDati_rilevanti_msk::send_nota_variazione(const TISAM_recordset& alleg, TDa return true; } -bool TDati_rilevanti_msk::send_fatt(const TISAM_recordset& alleg, TDati_rilevanti_set& operaz) +bool TDati_rilevanti_msk::send_fatt(const TRectype& alleg, TDati_rilevanti_set& operaz) { - if (!_send_all) - { - const int escluso = alleg.get(ALL_IGNORA).as_int(); - if (escluso > 0) - return false; - } + const TAnagrafica anag(alleg); - const TAnagrafica anag(alleg.cursor()->curr()); - - const real importo = alleg.get(ALL_IMPORTO).as_real(); - const real imposta = alleg.get(ALL_IMPOSTA).as_real(); + const real importo = alleg.get_real(ALL_IMPORTO); + const real imposta = alleg.get_real(ALL_IMPOSTA); const TString& paiv = anag.partita_IVA(); - - TLocalisamfile mov(LF_MOV); - const long numreg = alleg.get(ALL_NUMREG).as_int(); - mov.put(MOV_NUMREG, numreg); - if (mov.read() != NOERR) - { - CHECKD(false, "Registrazione fantasma ", numreg); - return false; - } - if (anag.stato_estero() > 0) { operaz.new_rec("3"); // Operazioni con soggetti non residenti @@ -1388,12 +1436,12 @@ bool TDati_rilevanti_msk::send_fatt(const TISAM_recordset& alleg, TDati_rilevant operaz.set(10, anag.stato_estero()); operaz.set(11, EMPTY_STRING); // TBI? Indirizzo estero } - operaz.set(12, alleg.get(ALL_DATAREG).as_date()); - operaz.set(13, mov.get(MOV_NUMDOC)); - operaz.set(14, alleg.get(ALL_MODPAG).as_int()); + operaz.set(12, alleg.get(ALL_DATAREG)); + operaz.set(13, alleg.get(ALL_NUMDOC)); + operaz.set(14, alleg.get(ALL_MODPAG)); operaz.set(15, importo); operaz.set(16, imposta); - operaz.set(17, alleg.get(ALL_TIPOPE).as_int()); + operaz.set(17, alleg.get(ALL_TIPOPE)); } else { @@ -1401,54 +1449,105 @@ bool TDati_rilevanti_msk::send_fatt(const TISAM_recordset& alleg, TDati_rilevant { operaz.new_rec("1"); // Operazioni con soggetti residenti non titolari di partita IVA operaz.set(2, anag.codice_fiscale()); - operaz.set(3, alleg.get(ALL_DATAREG).as_date()); - operaz.set(4, alleg.get(ALL_MODPAG).as_int()); + operaz.set(3, alleg.get(ALL_DATAREG)); + operaz.set(4, alleg.get(ALL_MODPAG)); operaz.set(5, real(importo+imposta)); } else { operaz.new_rec("2"); // Operazioni con soggetti residenti - titolari di partita IVA operaz.set(2, paiv); - operaz.set(3, alleg.get(ALL_DATAREG).as_date()); - operaz.set(4, mov.get(MOV_NUMDOC)); - operaz.set(5, alleg.get(ALL_MODPAG).as_int()); - operaz.set(6, alleg.get(ALL_IMPORTO).as_real()); - operaz.set(7, alleg.get(ALL_IMPOSTA).as_real()); - operaz.set(8, alleg.get(ALL_TIPOPE).as_int()); + operaz.set(3, alleg.get(ALL_DATAREG)); + operaz.set(4, alleg.get(ALL_NUMDOC)); + operaz.set(5, alleg.get(ALL_MODPAG)); + operaz.set(6, alleg.get(ALL_IMPORTO)); + operaz.set(7, alleg.get(ALL_IMPOSTA)); + operaz.set(8, alleg.get(ALL_TIPOPE)); } } return false; } -bool TDati_rilevanti_msk::send_rec(const TISAM_recordset& alleg, TDati_rilevanti_set& operaz) +bool TDati_rilevanti_msk::send_rec(const TRectype& alleg, TDati_rilevanti_set& operaz) { - const long numrett = alleg.get(ALL_NUMRETT).as_int(); - return numrett > 0 ? send_nota_variazione(alleg, operaz) : send_fatt(alleg, operaz); + bool done = false; + if (is_nota_variazione(alleg)) + { + const TString& numrett = alleg.get(ALL_NUMRETT); + const TDate datarett = alleg.get(ALL_DATARETT); + if (numrett.full() && numrett[0] != '?' && datarett.year() == alleg.get_int(ALL_ANNO)) + done = send_nota_variazione(alleg, operaz); + } + else + { + done = send_fatt(alleg, operaz); + } + return done; } // Genera file per invio telematico bool TDati_rilevanti_msk::send_alleg() { const int anno = get_int(F_ANNO); - _send_all = get_int(F_SENDALL) != 1; // Devo inviare anche dati NON rilevanti? - + const bool send_all = get_int(F_SENDALL) != 1; + TFilename temp = get(F_OUTFOLDER); if (temp.blank()) temp.tempdir(); temp.add("datiril.txt"); + TDati_rilevanti_array data; + + TString query; + query << "USE ALLEG KEY 2" + << "\nFROM " << ALL_ANNO << '=' << anno + << "\nTO " << ALL_ANNO << '=' << anno; + + TISAM_recordset alleg(query); + const TRecnotype tot_alleg = alleg.items(); + + if (tot_alleg > 0) + { + const TRectype& rec = alleg.cursor()->curr(); + + long last_clifo = 0; + TArray note; + + TProgind pi(tot_alleg, TR("Elaborazione file")); + for (bool ok = alleg.move_first(); ok; ok = alleg.move_next()) + { + if (!pi.addstatus(1)) + break; + const long clifo = rec.get_long(ALL_CODCF); + if (clifo != last_clifo) + { + data.add(note, send_all); + note.destroy(); + last_clifo = clifo; + } + if (rec.get(ALL_NUMRETT).full()) + note.add(rec); + else + data.add(rec, send_all); + } + data.add(note, send_all); + } + TDati_rilevanti_set recset(anno); recset.add_control_rec(0); - TString query; - query << "USE " << LF_ALLEG; - if (!_send_all) - query << " SELECT STR(" << ALL_IGNORA << "==0)"; - query << "\nFROM " << ALL_ANNO << '=' << anno - << "\nTO " << ALL_ANNO << '=' << anno; - TISAM_recordset alleg(query); - for (bool ok = alleg.move_first(); ok; ok = alleg.move_next()) - send_rec(alleg, recset); + const int tot = data.items(); + if (tot > 0) + { + TProgind pi(tot, TR("Generazione file")); + for (int a = 0; a < tot; a++) + { + if (!pi.addstatus(1)) + break; + if (send_all || !data[a].get_int(ALL_IGNORA)) + send_rec(data[a], recset); + } + } recset.add_control_rec(9); bool done = recset.save_as(temp); @@ -1466,6 +1565,63 @@ void TDati_rilevanti_msk::set_dirty(bool d) enable(DLG_SAVEREC, d); } +void TDati_rilevanti_msk::alleg_sort(TSheet_field& s) const +{ + const int c_codcf = s.cid2index(A_CODCF); + const int c_numdoc = s.cid2index(A_NUMDOC); + const int c_numrett = s.cid2index(A_NUMRETT); + const int c_forzata = s.cid2index(A_FORZATA); + const int c_ignora = s.cid2index(A_IGNORA); + const int c_importo = s.cid2index(A_IMPORTO); + const int tot = s.items(); + + for (int k = 0; k < 2; k++) + for (int i = tot-1; i >= 0; i--) + { + const TString8 numrett = s.cell(i, c_numrett); + if (numrett.full()) + { + const long codcf_i = atol(s.cell(i, c_codcf)); + int j = -1; + + // Cerca la fattura andando in su + for (j = i-1; j >= 0; j--) + { + const long codcf_j = atol(s.cell(j, c_codcf)); + if (codcf_j != codcf_i) + { + j = -1; + break; + } + if (numrett == s.cell(j, c_numdoc) || numrett == s.cell(j, c_numrett)) + break; + } + if (j < 0) // Non l'ho trovata + { + // Cerca la fattura andando in giù + for (j = i+1; j < tot; j++) + { + const long codcf_j = atol(s.cell(j, c_codcf)); + if (codcf_j != codcf_i) + { + j = tot; + break; + } + if (numrett == s.cell(j, c_numdoc)) + break; + } + } + if (j >= 0 && j < tot) // L'ho trovata + { + s.move_row(i, j+1); + if (*s.cell(j, c_numrett) <= ' ') + s.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, j, c_numdoc); + s.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, j+1, c_numrett); + } + } + } +} + void TDati_rilevanti_msk::load_sheet() { const char tipocf = get(F_TIPOCF)[0]; @@ -1477,39 +1633,43 @@ void TDati_rilevanti_msk::load_sheet() s.hide(); // Nascondo lo sheet per guadagnare un 20% di velocità di caricamento s.destroy(); - TString query; - query << "USE " << LF_ALLEG; - if (codcf > 0 || (show_all > 0 && show_all < 7)) + const int anno = get_int(F_ANNO); + + TString limit; limit << ALL_ANNO << '=' << anno; + if (codcf > 0) + limit << ' ' << ALL_TIPOCF << '=' << tipocf << ' ' << ALL_CODCF << '=' << codcf; + + TString sel; + if (ocfpi.full() || (show_all > 0 && show_all < 7)) { - query << " SELECT "; - if (codcf > 0) - { - query << "(" << ALL_TIPOCF << "='" << tipocf << "')&&(" << ALL_CODCF << "='" << codcf << "')"; - if (ocfpi.full()) - query << "&&(" << ALL_OCFPI << "='" << ocfpi << "')"; - } + if (ocfpi.full()) + sel << "(" << ALL_OCFPI << "='" << ocfpi << "')"; if (show_all > 0 && show_all < 7) { - if (codcf > 0) query << "&&"; - query << "(STR(" << ALL_IGNORA; + if (sel.full()) sel << "&&"; + sel << "(STR(" << ALL_IGNORA; switch (show_all) { - case 1: query << '<'; break; // Importi superiori al limite (20000 o 3000) - case 2: query << '='; break; // Importi inferiori al limite (20000 o 3000) - default: query << '>'; break; // Importi scartati (esteri o leggi speciali) + case 1: sel << '<'; break; // Importi superiori al limite (20000 o 3000) + case 2: sel << '='; break; // Importi inferiori al limite (20000 o 3000) + default: sel << '>'; break; // Importi scartati (esteri o leggi speciali) } - query << "1))"; + sel << "1))"; } } - const int anno = get_int(F_ANNO); - TString16 limit; limit << ALL_ANNO << '=' << anno; - query << "\nFROM " << limit << "\nTO " << limit; + + TString query; + query << "USE " << LF_ALLEG << " KEY 2"; + if (sel.full()) + query << " SELECT " << sel; + if (limit.full()) + query << "\nFROM " << limit << "\nTO " << limit; TISAM_recordset alleg(query); const TRecnotype items = alleg.items(); if (items > 0) { - TString pi_str; pi_str << TR("Caricamento ") << anno; + TString pi_str; pi_str << TR("Caricamento ") << items << TR(" movimenti del ") << anno; TProgind pi(items, pi_str); const TRectype& curr = alleg.cursor()->curr(); int rec = 0; @@ -1517,8 +1677,18 @@ void TDati_rilevanti_msk::load_sheet() { if (!pi.addstatus(1)) break; s.autoload_line(++rec, curr); + + const int modpag = curr.get_int(ALL_MODPAG); + if (modpag == 1) + s.enable_cell(rec-1, A_CONTRATTO, false); + else + { + s.enable_cell(rec-1, A_DATARETT, false); + s.enable_cell(rec-1, A_NUMRETT, false); + } } } + alleg_sort(s); s.force_update(); s.show(); @@ -1573,8 +1743,6 @@ bool TDati_rilevanti_msk::save_sheet() if (done) { - // Cancella le righe manuali marcate come da NON inviare - azzera_alleg(true, MANUAL_ROW); set_dirty(false); } @@ -1662,6 +1830,23 @@ bool TDati_rilevanti_msk::on_field_event(TOperable_field& o, TField_event e, lon if (e == fe_button && check_fields()) send_alleg(); break; + case F_ANNO: + if (e == fe_init || e == fe_modify) + { + int anno = atoi(o.get()); + if (anno < 2010) + anno = TDate(TODAY).year()-1; + TDate d = get(F_DATA); + if (d.year() != anno+1) + { + if (anno == 2010) + d = TDate(31,12,2011); + else + d = TDate(30,4,anno+1); + set(F_DATA, d); + } + } + break; case F_OUTFOLDER: if (e == fe_init && o.empty()) { @@ -1677,7 +1862,12 @@ bool TDati_rilevanti_msk::on_field_event(TOperable_field& o, TField_event e, lon if (e == fe_init) load_sheet(); else if (e == se_notify_modify) - set_dirty( true); else + { + set_dirty( true); + TSheet_field& s = (TSheet_field&)o; + TToken_string& row = s.row(jolly); + row.add("X", s.cid2index(A_FORZATA)); + } else if (e == se_query_add) { if (!check_rows(false)) @@ -1689,7 +1879,7 @@ bool TDati_rilevanti_msk::on_field_event(TOperable_field& o, TField_event e, lon TToken_string& row = s.row(jolly); row.add(nuovo_progr(), s.cid2index(A_RIGA)); row.add(TDate(TODAY), s.cid2index(A_DATAREG)); - row.add(3, s.cid2index(A_MODPAG)); + row.add(1, s.cid2index(A_MODPAG)); row.add(1, s.cid2index(A_TIPOPE)); } else if (e == se_query_del) @@ -1721,8 +1911,8 @@ bool TDati_rilevanti_msk::on_field_event(TOperable_field& o, TField_event e, lon case DLG_USER: if (e == fe_button) { - const long numreg = o.mask().get_long(A_NUMREG); - if (numreg > 0) + const long numreg = o.mask().get_long(A_RIGA); + if (numreg > 0 && numreg < MANUAL_ROW) { TRectype mov(LF_MOV); mov.put(MOV_NUMREG, numreg); @@ -1751,14 +1941,14 @@ public: bool TDati_rilevanti_app::create() { + // Controllo preventivo dell'avvenuta conversione del tracciato record + TRectype alleg(LF_ALLEG); + if (alleg.type(ALL_NUMDOC) == _nullfld) + return error_box(TR("Il database non è stato ancora convertito per il modulo FE")); + // Teoricamente è possibile visulizzare tutti i movimenti di un anno, per cui allargo il numero riga TSheet_field::set_line_number_width(6); - // Controllo preventivo dell'avvenuta conversione del tracciato record - const TRectype alleg(LF_ALLEG); - if (alleg.type(ALL_IGNORA) != _intfld) - return error_box(TR("Il database non è stato ancora convertito per il modulo FE")); - return TSkeleton_application::create(); } diff --git a/fe/fe0100a.h b/fe/fe0100a.h index 0d0d8db0e..b95af1cfd 100755 --- a/fe/fe0100a.h +++ b/fe/fe0100a.h @@ -1,5 +1,5 @@ #define F_ANNO 301 -#define F_DESCATT 302 +#define F_DATA 302 #define F_SHOWALL 303 #define F_SENDALL 304 #define F_OUTFOLDER 305 @@ -15,20 +15,22 @@ #define F_RIGHE 300 #define A_RIGA 101 -#define A_IGNORA 102 -#define A_TIPOCF 103 -#define A_CODCF 104 -#define A_OCFPI 105 -#define A_RAGSOC 106 -#define A_NUMREG 107 +#define A_FORZATA 102 +#define A_IGNORA 103 +#define A_TIPOCF 104 +#define A_CODCF 105 +#define A_OCFPI 106 +#define A_RAGSOC 107 #define A_DATAREG 108 -#define A_MODPAG 109 -#define A_IMPORTO 110 -#define A_IMPOSTA 111 -#define A_TIPOPE 112 -#define A_CONTRATTO 113 -#define A_NUMRETT 114 -#define A_PAIV 115 -#define A_COFI 116 +#define A_NUMDOC 109 +#define A_MODPAG 110 +#define A_IMPORTO 111 +#define A_IMPOSTA 112 +#define A_TIPOPE 113 +#define A_CONTRATTO 114 +#define A_DATARETT 115 +#define A_NUMRETT 116 +#define A_PAIV 117 +#define A_COFI 118 #define A_OCCAS 155 diff --git a/fe/fe0100a.uml b/fe/fe0100a.uml index 9d7e5f77f..07424deb7 100755 --- a/fe/fe0100a.uml +++ b/fe/fe0100a.uml @@ -15,7 +15,7 @@ BEGIN FLAGS "D" END -BUTTON DLG_CANCEL 2 2 +BUTTON DLG_CANCEL 2 2, BEGIN PROMPT 1 2 "Annulla" END @@ -61,9 +61,17 @@ BEGIN WARNING "Anno non valido" END -LIST F_SHOWALL 1 25 +DATE F_DATA BEGIN - PROMPT 33 1 "Mostra movimenti " + PROMPT 15 1 "Data limite " + CHECKTYPE REQUIRED + STR_EXPR YEAR(#THIS_FIELD)>#F_ANNO + WARNING "La data deve appartenere all'anno successivo" +END + +LIST F_SHOWALL 1 13 +BEGIN + PROMPT 45 1 "Mostra movimenti " ITEM "1|Rilevanti" ITEM "2|NON rilevanti" ITEM "4|Scartati" @@ -133,20 +141,22 @@ END SPREADSHEET F_RIGHE BEGIN PROMPT 0 5 "" - ITEM "Riga@6F" + ITEM "Numero\nRegistraz.@7F" + ITEM "Forzata@C" ITEM "Non\nInv.@2@F" ITEM "C/F@2F" ITEM "Codice@F" ITEM "Occasionale@16F" ITEM "Ragione Sociale@24" - ITEM "Numero\nRegistr.@7" ITEM "Data\nOperazione@10" + ITEM "Numero\nFattura@7" ITEM "Mod.\nPag.@4" ITEM "Importo\ndovuto@12" ITEM "Imposta@12" ITEM "Tipo.\nOper.@4" ITEM "Contratto@18" - ITEM "N. Reg.\nrettif.@7" + ITEM "Data Doc.\nrettif.@10" + ITEM "N. Doc.\nrettif.@7" ITEM "Partita IVA@15" ITEM "Codice Fiscale@17" DEFAULT "*" // Impedisce il salvataggio su profilo .ini @@ -189,7 +199,7 @@ ENDPAGE ENDMASK -PAGE "Riga" -1 -1 69 13 +PAGE "Riga" -1 -1 69 11 NUMBER A_RIGA 7 BEGIN @@ -198,6 +208,12 @@ BEGIN FIELD PROGR END +BOOLEAN A_FORZATA +BEGIN + PROMPT 40 0 "Forzatura manuale" + FIELD FORZATURA +END + LIST A_IGNORA 2 55 BEGIN PROMPT 1 1 "Non inv." @@ -219,7 +235,9 @@ LIST A_TIPOCF 1 10 BEGIN PROMPT 1 2 "" ITEM "C|Cliente" + MESSAGE "1",A_TIPOPE ITEM "F|Fornitore" + MESSAGE "2",A_TIPOPE FIELD TIPOCF END @@ -238,11 +256,12 @@ BEGIN CHEKTYPE REQUIRED ADD RUN cg0 -1 FIELD CODCF + FLAGS "G" END STRING A_OCFPI 16 BEGIN - PROMPT 34 2 "Occasionale " + PROMPT 36 2 "Occasionale " USE LF_OCCAS INPUT CFPI A_OCFPI DISPLAY "Codice@16" CFPI @@ -254,9 +273,10 @@ BEGIN GROUP 3 ADD RUN cg0 -6 FIELD OCFPI + FLAGS "G" END -STRING A_RAGSOC 50 45 +STRING A_RAGSOC 50 47 BEGIN PROMPT 1 3 "Ragione Sociale " FLAGS "D" @@ -264,74 +284,61 @@ END STRING A_PAIV 12 BEGIN - PROMPT 1 4 "P.IVA " + PROMPT 1 4 "Partita IVA " FLAGS "D" END STRING A_COFI 16 BEGIN - PROMPT 41 4 "C.F. " + PROMPT 33 4 "Codice Fiscale " FLAGS "D" END DATE A_DATAREG BEGIN - PROMPT 1 5 "Data operazione " + PROMPT 29 5 "Data " + USE LF_MOV KEY 3 + INPUT TIPO A_TIPOCF SELECT + INPUT CODCF A_CODCF SELECT + INPUT DATAREG A_DATAREG + DISPLAY "Data.Reg.@10" DATAREG + DISPLAY "Num.Reg.@7" NUMREG + DISPLAY "Descrizione@50" DESCR + DISPLAY "Data Doc.@10" DATADOC + DISPLAY "Num.Doc.@7" NUMDOC + OUTPUT A_DATAREG DATAREG + OUTPUT A_NUMDOC NUMDOC FIELD DATAREG - CHEKTYPE REQUIRED + VALIDATE NOT_EMPTY_FUNC END -NUMBER A_NUMREG 7 +STRING A_NUMDOC 7 BEGIN - PROMPT 41 5 "N. operazione " - FIELD NUMREG - USE LF_MOV SELECT (TIPO==#A_TIPOCF)&&(BETWEEN(CODCF,#A_CODCF,#A_CODCF)) - JOIN LF_CLIFO INTO TIPOCF==TIPO CODCF==CODCF - INPUT NUMREG A_NUMREG - DISPLAY "Numero@7" NUMREG - DISPLAY "Data@10" DATAREG - DISPLAY "Descrizione@50" DESCR - DISPLAY "Codice" CODCF - DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC - OUTPUT A_NUMREG NUMREG - CHECKTYPE NORMAL + PROMPT 49 5 "Fattura " + FLAGS "U" + COPY ALL A_DATAREG ADD RUN cg2 -0 - MESSAGE EMPTY DISABLE,DLG_USER - MESSAGE ENABLE,DLG_USER + STR_EXPR IF(#A_TIPOCF=="C";#A_NUMDOC!="";1) + WARNING "E' necessario inserire il numero della fattura di vendita" + FIELD NUMDOC END LIST A_MODPAG 1 20 BEGIN PROMPT 1 6 "Modalità di pagamento " - ITEM "3|3 - Non frazionato" - ITEM "1|1 - Acconto" - ITEM "2|2 - Saldo" + ITEM "1|1 - Non frazionato" + MESSAGE DISABLE,A_CONTRATTO|ENABLE,A_DATARETT|ENABLE,A_NUMRETT + ITEM "2|2 - Frazionato" + MESSAGE ENABLE,A_CONTRATTO|DISABLE,A_DATARETT|DISABLE,A_NUMRETT + ITEM "2|3 - Periodico" + MESSAGE ENABLE,A_CONTRATTO|DISABLE,A_DATARETT|DISABLE,A_NUMRETT FIELD MODPAG -END - -LIST A_TIPOPE 1 40 -BEGIN - PROMPT 1 8 "Tipologia operazione " - ITEM "1|1-Cessione e/o prestazione" - ITEM "2|2-Acquisto e/o prestazione ricevuta" - FIELD TIPOPE -END - -CURRENCY A_IMPORTO 12 -BEGIN - PROMPT 1 9 "Importo dovuto " - FIELD IMPORTO -END - -CURRENCY A_IMPOSTA 12 -BEGIN - PROMPT 42 9 "Imposta " - FIELD IMPOSTA + FLAGS "G" END STRING A_CONTRATTO 18 BEGIN - PROMPT 1 10 "Contratto " + PROMPT 1 7 "Contratto riferimento " USE &CON INPUT CODTAB[1,1] A_TIPOCF SELECT INPUT CODTAB[2,7] A_CODCF SELECT @@ -340,22 +347,55 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT A_CONTRATTO CODTAB[8,25] ADD RUN fe0 -1 &CON - CHEKCTYPE NORMAL + CHEKCTYPE REQUIRED FIELD CONTRATTO END -NUMBER A_NUMRETT 7 +DATE A_DATARETT BEGIN - PROMPT 1 12 "N. operazione da rettificare " - FIELD NUMRETT - COPY USE A_NUMREG - INPUT NUMREG A_NUMRETT - COPY DISPLAY A_NUMREG - OUTPUT A_NUMRETT NUMREG - CHECKTYPE SEARCH + PROMPT 1 8 "Documento rettificato " + FIELD DATARETT + USE LF_MOV KEY 3 + INPUT TIPO A_TIPOCF SELECT + INPUT CODCF A_CODCF SELECT + INPUT DATAREG A_DATARETT + COPY DISPLAY A_DATAREG + OUTPUT A_DATARETT DATADOC + OUTPUT A_NUMRETT NUMDOC ADD RUN cg2 -0 - NUM_EXPR (#A_NUMRETT=0)||(#A_NUMRETT=9999999)||(#A_NUMRETT!=#A_NUMREG) - WARNING "Inserire un numero registrazione diverso da quello principale" + NUM_EXPR IF(#A_IMPORTO<0;#A_DATARETT!="";1) + WARNING "Inserire la data della fattura rettificata" +END + +STRING A_NUMRETT 7 +BEGIN + PROMPT 50 8 "Numero " + FIELD NUMRETT + COPY ALL A_DATARETT + ADD RUN cg2 -0 + VALIDATE REQIF_FUNC 1 A_DATARETT + WARNING "Inserire il numero della fattura rettificata" +END + +LIST A_TIPOPE 1 41 +BEGIN + PROMPT 1 9 "Tipologia operazione " + ITEM "1|1-Cessione e/o prestazione" + ITEM "2|2-Acquisto e/o prestazione ricevuta" + FIELD TIPOPE + FLAGS "D" +END + +CURRENCY A_IMPORTO 12 +BEGIN + PROMPT 1 10 "Importo dovuto " + FIELD IMPORTO +END + +CURRENCY A_IMPOSTA 12 +BEGIN + PROMPT 44 10 "Imposta " + FIELD IMPOSTA END ENDPAGE diff --git a/fe/fetbcon.h b/fe/fetbcon.h index 1a8720a2d..1a76e3f06 100755 --- a/fe/fetbcon.h +++ b/fe/fetbcon.h @@ -7,6 +7,7 @@ #define F_CON_DESPADRE 207 #define F_CON_INIZIO 220 #define F_CON_FINE 221 +#define F_CON_MODPAG 222 #define F_CON_RATE 250 #define R_CON_ANNO 101 diff --git a/fe/fetbcon.uml b/fe/fetbcon.uml index 7c623728a..1491d1a9b 100755 --- a/fe/fetbcon.uml +++ b/fe/fetbcon.uml @@ -124,9 +124,18 @@ BEGIN WARNING "La data finale deve essere successiva a quella iniziale" END +RADIOBUTTON F_CON_MODPAG 1 78 +BEGIN + PROMPT 1 10 "Modalità di pagamento " + ITEM "2|Importo frazionato" + ITEM "3|Corrispettivi periodici" + FIELD S6 + FLAGS "Z" +END + SPREADSHEET F_CON_RATE 40 6 BEGIN - PROMPT 2 11 "" + PROMPT 2 13 "" ITEM "Anno" ITEM "Importo@12R" ITEM "Imposta@12R"