#include #include #include #include #include #include "in0.h" #include "in0200a.h" #include "inlib01.h" #include #include #include /////////////////////////////////////////////////////////// // TRecord_intra /////////////////////////////////////////////////////////// class TRecord_intra : public TString { int _ndec; protected: virtual void print_on(ostream& o) const; public: void reset(const TIntra_context& ic); void reset_data(); void put(const char* str, int pos, int dim, const char* flags = ""); void put(real num, int pos, int dim, int dec = 0); void put(long num, int pos, int dim); void put(char chr, int pos); void genera_testata(const TIntra_context& ic, long progr[], long tot[]); void put(const TRectype& rec, TIntra_context& ic); TRecord_intra(); }; // Scrive un campo generico sul record di invio void TRecord_intra::put(const char* str, int pos, int dim, const char* flags) { CHECKD(pos > 0 && pos < size(), "Invalid field position:", pos); CHECKD(dim > 0 && dim <= 200, "Invalid field dimension:", dim); TString256 val(str); if (val.len() < dim) { const bool rj = strchr(flags, 'R') != NULL; const bool zf = strchr(flags, 'Z') != NULL; if (rj) val.right_just(dim, zf ? '0' : ' '); else val.left_just(dim, zf ? '0' : ' '); } else val.cut(dim); overwrite(val, pos-1); } // Scrive un campo numerico sul record di invio void TRecord_intra::put(real num, int pos, int dim, int dec) { TString80 str; if (!num.is_zero()) { num.round(dec); const bool negativo = num < ZERO; if (negativo) num *= -1.0; if (dec < 0) { str = num.string(dim-dec, 0, '0'); str.rtrim(-dec); } else { str = num.string(dim, dec, '0'); } if (negativo) str[dim-1] += 64; } put(str, pos, dim, "RZ"); } // Scrive un campo intero sul record di invio void TRecord_intra::put(long num, int pos, int dim) { TString16 str; str.format("%0*ld", dim, num); put(str, pos, dim, "RZ"); } // Scrive un campo carattere sul record di invio void TRecord_intra::put(char chr, int pos) { const char str[2] = { chr, '\0' }; put(str, pos, 1); } // Azzera il record void TRecord_intra::reset(const TIntra_context& ic) { spaces(); put("EUROX", 1, 5); const TRectype& ditta = cache().get(LF_NDITTE, main_app().get_firm()); TString16 cod; cod.format("%c|%ld", ditta.get_char(NDT_TIPOA), ditta.get_long(NDT_CODANAGR)); const TRectype& anagr = cache().get(LF_ANAG, cod); put(anagr.get(ANA_PAIV), 6, 11); put(ic._progr, 17, 6); } void TRecord_intra::reset_data() { const TString80 key = left(22); spaces(); overwrite(key, 0); } // Scrive la testata con le informazioni della ditta void TRecord_intra::genera_testata(const TIntra_context& ic, long progr[], long tot[]) { reset(ic); put('0', 23); // Tipo record frontespizio put("", 24, 5, "RZ"); // Numero riga (0 per frontespizio) put(ic._tipo, 29); // Tipo riepilogo put(ic._anno % 100, 30, 2); put(ic._freq, 32); const int periodo = ic._freq == 'A' ? 0 : ic._periodo; put(periodo, 33, 2); TString16 cod = mid(5, 11); // Ricopia la parita iva della ditta put(cod, 35, 11); const TRectype& ditta = cache().get(LF_NDITTE, main_app().get_firm()); put(ditta.get_bool(NDT_PRESELEN) ? '1' : '0', 46); put(ditta.get_bool(NDT_CESSIVA) ? '1' : '0', 47); cod.cut(0); cod << ditta.get_char(NDT_TIPOSOGDEL) << '|'; cod << ditta.get(NDT_CODSOGDEL); if (cod.len() >= 3) { const TRectype& sogdel = cache().get(LF_ANAG, cod); put(sogdel.get(ANA_PAIV), 48, 11); } else put("", 48, 11, "Z"); for (int i = 0; i < 4; i++) { put(progr[i], 59 + i * 18, 5); put(tot[i], 64 + i * 18, 13, _ndec); } } // Scrive un intero record del file riepiloghi/rettifiche void TRecord_intra::put(const TRectype& rec, TIntra_context& ic) { reset_data(); const int sezione = rec.get_int(RIEPINTRA_SEZIONE); const TString & tipo = rec.get(RIEPINTRA_TIPO); put((long) sezione, 23, 1); put(rec.get_long(RIEPINTRA_NUMRIG), 24, 5); //? if (tipo == "A") { switch (sezione) { case 1: put(rec.get(RIEPINTRA_STATO), 29, 2); put(rec.get(RIEPINTRA_PIVA), 31, 12); put(rec.get_real(RIEPINTRA_AMMLIRE), 43, 13, _ndec); put(rec.get_real(RIEPINTRA_AMMVALUTA), 56, 13); put(rec.get_char(RIEPINTRA_NATURA), 69); put(rec.get(RIEPINTRA_NOMENCL).mid(0, 4), 70, 4, "Z"); //il campo viene spezzato in 3 pezzi put(rec.get(RIEPINTRA_NOMENCL).mid(4, 2), 74, 2, "Z"); put(rec.get(RIEPINTRA_NOMENCL).mid(6, 2), 76, 2, "Z"); if (ic._freq == 'M') { put(rec.get_real(RIEPINTRA_MASSAKG), 78, 10, 0); put(rec.get_real(RIEPINTRA_MASSAUMS), 88, 10, 0); put(rec.get_real(RIEPINTRA_VALSTAT), 98, 13, _ndec); put(rec.get_char(RIEPINTRA_CONSEGNA), 111); put(rec.get_char(RIEPINTRA_TRASPORTO), 112); put(rec.get(RIEPINTRA_PAESE), 113, 2); put(rec.get(RIEPINTRA_PAESEORIG), 115, 2); put(rec.get(RIEPINTRA_PROV), 117, 2); } else put("", 78, 100); break; case 2: { if (ic._freq == 'M') put(rec.get(RIEPINTRA_PERETT), 29, 2, "RZ"); else put("", 29, 2, "RZ"); if (ic._freq == 'T') put(rec.get(RIEPINTRA_PERETT)[1], 31); else put('0', 31); put(rec.get(RIEPINTRA_ANNORETT).right(2), 32, 2, "RZ"); put(rec.get(RIEPINTRA_STATO), 34, 2); put(rec.get(RIEPINTRA_PIVA), 36, 12); put(rec.get(RIEPINTRA_SEGNORETT), 48, 1); put(rec.get_real(RIEPINTRA_AMMLIRE), 49, 13, _ndec); put(rec.get_real(RIEPINTRA_AMMVALUTA), 62, 13); put(rec.get_char(RIEPINTRA_NATURA), 75); put(rec.get(RIEPINTRA_NOMENCL).mid(0, 4), 76, 4, "Z"); //il campo viene spezzato in 3 pezzi put(rec.get(RIEPINTRA_NOMENCL).mid(4, 2), 80, 2, "Z"); put(rec.get(RIEPINTRA_NOMENCL).mid(6, 2), 82, 2, "Z"); if (ic._freq == 'M') put(rec.get_real(RIEPINTRA_VALSTAT), 84, 13, _ndec); else put("", 84, 13); } break; case 3: put(rec.get(RIEPINTRA_STATO), 29, 2); put(rec.get(RIEPINTRA_PIVA), 31, 12); put(rec.get_real(RIEPINTRA_AMMLIRE), 43, 13, _ndec); put(rec.get_real(RIEPINTRA_AMMVALUTA), 56, 13); // put(numero fattura, 69, 15); facoltativo // put(data fattura, 84, 6); facoltativo put(rec.get(RIEPINTRA_CODSERV), 90, 6); put(rec.get_char(RIEPINTRA_MODEROG), 96); put(rec.get_char(RIEPINTRA_MODINCPAG), 97); put(rec.get(RIEPINTRA_ISOINCPAG), 98, 2); break; case 4: { put(ic._uffdog, 29, 6); put(rec.get(RIEPINTRA_ANNORETT).right(2), 35, 2, "RZ"); put(rec.get(RIEPINTRA_PROTEL), 37, 6, "RZ"); put(rec.get(RIEPINTRA_NUMRIGEL), 43, 5, "RZ"); put(rec.get(RIEPINTRA_STATO), 48, 2); put(rec.get(RIEPINTRA_PIVA), 50, 12); real ammlire = rec.get_real(RIEPINTRA_AMMLIRE); if (rec.get_real(RIEPINTRA_SEGNORETT) == "+") ammlire = -ammlire; put(rec.get_real(RIEPINTRA_AMMLIRE), 62, 13, _ndec); put(rec.get_real(RIEPINTRA_AMMVALUTA), 75, 13); // put(numero fattura, 88, 15); facoltativo // put(data fattura, 103, 6); facoltativo put(rec.get(RIEPINTRA_CODSERV), 109, 6); put(rec.get_char(RIEPINTRA_MODEROG), 115); put(rec.get_char(RIEPINTRA_MODINCPAG), 116); put(rec.get(RIEPINTRA_ISOINCPAG), 117, 2); } break; default: NFCHECK("sezione sconosciuta: %d", sezione); break; } } else { switch (sezione) { case 1: put(rec.get(RIEPINTRA_STATO), 29, 2); put(rec.get(RIEPINTRA_PIVA), 31, 12); put(rec.get_real(RIEPINTRA_AMMLIRE), 43, 13, _ndec); put(rec.get_char(RIEPINTRA_NATURA), 56); put(rec.get(RIEPINTRA_NOMENCL), 57, 8, "Z"); //il campo NON viene spezzato in 3 pezzi if (ic._freq == 'M') { put(rec.get_real(RIEPINTRA_MASSAKG), 65, 10); put(rec.get_real(RIEPINTRA_MASSAUMS), 75, 10); put(rec.get_real(RIEPINTRA_VALSTAT), 85, 13, _ndec); put(rec.get_char(RIEPINTRA_CONSEGNA), 98); put(rec.get_char(RIEPINTRA_TRASPORTO), 99); put(rec.get(RIEPINTRA_PAESE), 100, 2); put(rec.get(RIEPINTRA_PROV), 102, 2); } else put("", 65, 100); break; case 2: { if (ic._freq == 'M') put(rec.get(RIEPINTRA_PERETT), 29, 2, "RZ"); else put("", 29, 2, "RZ"); if (ic._freq == 'T') put(rec.get(RIEPINTRA_PERETT)[1], 31); else put('0', 31); put(rec.get(RIEPINTRA_ANNORETT).right(2), 32, 2, "RZ"); put(rec.get(RIEPINTRA_STATO), 34, 2); put(rec.get(RIEPINTRA_PIVA), 36, 12); put(rec.get(RIEPINTRA_SEGNORETT), 48, 1); put(abs(rec.get_real(RIEPINTRA_AMMLIRE)), 49, 13, _ndec); put(rec.get(RIEPINTRA_NATURA), 62, 1); put(rec.get(RIEPINTRA_NOMENCL), 63, 8, "Z"); // il campo NON viene spezzato in 3 pezzi if (ic._freq == 'M') put(abs(rec.get_real(RIEPINTRA_VALSTAT)), 71, 13, _ndec); else put("", 71, 13); } break; case 3: put(rec.get(RIEPINTRA_STATO), 29, 2); put(rec.get(RIEPINTRA_PIVA), 31, 12); put(rec.get_real(RIEPINTRA_AMMLIRE), 43, 13, _ndec); // put(numero fattura, 56, 15); facoltativo // put(data fattura, 71, 6); facoltativo put(rec.get(RIEPINTRA_CODSERV), 77, 6); put(rec.get_char(RIEPINTRA_MODEROG), 83); put(rec.get_char(RIEPINTRA_MODINCPAG), 84); put(rec.get(RIEPINTRA_ISOINCPAG), 85, 2); break; case 4: { put(ic._uffdog, 29, 6); put(rec.get(RIEPINTRA_ANNORETT).right(2), 35, 2, "RZ"); put(rec.get(RIEPINTRA_PROTEL), 37, 6, "RZ"); put(rec.get(RIEPINTRA_NUMRIGEL), 43, 5, "RZ"); put(rec.get(RIEPINTRA_STATO), 48, 2); put(rec.get(RIEPINTRA_PIVA), 50, 12); real ammlire = rec.get_real(RIEPINTRA_AMMLIRE); if (rec.get_real(RIEPINTRA_SEGNORETT) == "+") ammlire = -ammlire; put(ammlire, 2, 13, _ndec); // put(numero fattura, 75, 15); facoltativo // put(data fattura, 90, 6); facoltativo put(rec.get(RIEPINTRA_CODSERV), 96, 6); put(rec.get_char(RIEPINTRA_MODEROG), 102); put(rec.get_char(RIEPINTRA_MODINCPAG), 103); put(rec.get(RIEPINTRA_ISOINCPAG), 104, 2); } break; default: NFCHECK("sezione sconosciuta: %d", sezione); break; } } } // Scrive su file il record void TRecord_intra::print_on(ostream& o) const { ((TRecord_intra*)this)->rtrim(); TString::print_on(o); o << endl; } TRecord_intra::TRecord_intra() : TString(132), _ndec(0) { } /////////////////////////////////////////////////////////// // TInvioIntra1_2_mask /////////////////////////////////////////////////////////// class TInvioIntra1_2_mask : public TIntra_mask { long _progr[4]; long _totale[4]; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); virtual short type_field() const { return F_TIPO; } virtual short period_field() const { return F_PERIODO_M; } virtual int anno() const { return get_int(F_ANNO); } void calcola_repiloghi(const TRectype & rec); void proponi_numero(); public: void genera(char tipointra, char tipo, bool reset = false); void update_testata(char tipo); TInvioIntra1_2_mask::TInvioIntra1_2_mask() : TIntra_mask("in0200a") {} }; void TInvioIntra1_2_mask::proponi_numero() { const char tip = tipo(); int a = anno(), p = periodo(); long d = 0; TTable ird("IRD"); int err = ird.last(); while (err == NOERR) { const TString16 str = ird.get("CODTAB"); a = atoi(str.mid(1,4)); p = atoi(str.mid(5,2)); d = ird.get_long("I0"); if (tip == 'T' || tip == str[0]) break; err = ird.prev(); } if (anno() > a || periodo() > p) set(F_NUMERO, d+1); else set(F_NUMERO, 1L); } bool TInvioIntra1_2_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case F_ANNO: if (e == fe_init || e == fe_modify) { const int anno = atoi(o.get()); const char fa = frequenza(anno, 'A'); const char fc = frequenza(anno, 'C'); TList_field& list = (TList_field&)field(type_field()); TToken_string codes = "A|C"; TToken_string descr; descr.add(TR("Acquisti")); descr.add(TR("Cessioni")); if (fa == fc) { codes.add("T"); descr.add(TR("Tutti")); } list.replace_items(codes, descr); proponi_numero(); } break; case F_TIPO: case F_PERIODO_M: case F_PERIODO_T: case F_PERIODO_A: if (e == fe_modify) proponi_numero(); break; case F_RIEPILOGHI: if (e == fe_button) { const char tip = tipo(); if (tip == 'T') { ::genera_riepiloghi('A', anno(), periodo()); ::genera_riepiloghi('C', anno(), periodo()); } else ::genera_riepiloghi(tip, anno(), periodo()); } break; default:break; } return TIntra_mask::on_field_event(o, e, jolly); } void TInvioIntra1_2_mask::calcola_repiloghi(const TRectype & rec) { int sezione = rec.get_int(RIEPINTRA_SEZIONE); real r = rec.get_real(RIEPINTRA_AMMLIRE).round(0); // Arrotonda all'Euro i valori intermedi long val = atol(r.string()); if ((sezione == 2 || sezione == 4) && rec.get_char("SEGNORETT") == '-') val = -val; // Rettifiche negative _totale[--sezione] += val; } void TInvioIntra1_2_mask::genera(char tipointra, char tipo, bool reset) { TIntra_context ic; ic._tipo = tipo; ic._anno = anno(); ic._freq = frequenza(ic._anno); ic._periodo = periodo(); ic._progr = get_long(F_NUMERO); ic._uffdog = get(F_UFFDOG); TString8 codtab; codtab.format("%c%04d%02d", ic._tipo, ic._anno, ic._periodo); TTable ird("IRD"); ird.put("CODTAB", codtab); const bool exist = ird.read() == NOERR; if (reset && exist) { const char* ac = tipo == 'A' ? TR("acquisti") : TR("cessioni"); if (!yesno_box(FR("Il file %s del periodo indicato è già stato generato:\n" "Si desidera proseguire ugualmente?"), ac)) return; } TRelation rel(LF_RIEPRETT); TRectype filter(LF_RIEPRETT); filter.put("ANNO", ic._anno); filter.put("PERIODO", periodo_str()); TCursor riep(&rel, "", 2, &filter, &filter); const TRectype & rieprec = riep.curr(); const long items = riep.items(); TFilename name = get(F_PATH); TString filename(get(F_CODUA)); filename << format("%02d%02d%02d", today.day(), today.month(), get_int(F_NUMERO)); name.add(filename); ofstream out(name, ios::out | ios::app); if (!out.good()) { cantwrite_box(name); return; } if (reset) { _progr[0] = 0L; _progr[1] = 0L; _progr[2] = 0L; _progr[3] = 0L; _totale[0] = 0L; _totale[1] = 0L; _totale[2] = 0L; _totale[3] = 0L; } TProgress_monitor pi(2 * items, TR("Generazione Intra 1/2"), false); TRecord_intra rec; for (riep = 0L; pi.add_status() && riep.pos() < items; ++riep) calcola_repiloghi(rieprec); rec.genera_testata(ic, _progr, _totale); out << rec; for (riep = 0L; pi.add_status() && riep.pos() < items; ++riep) { rec.put(rieprec, ic); out << rec; } } void TInvioIntra1_2_mask::update_testata(char tipo) { TIntra_context ic; ic._tipo = tipo; ic._anno = anno(); ic._freq = frequenza(ic._anno); ic._periodo = periodo(); ic._progr = get_long(F_NUMERO); TFilename name = get(F_PATH); TString filename(get(F_CODUA)); TRecord_intra rec; filename << format("%02d%02d%02d", today.day(), today.month(), get_int(F_NUMERO)); name.add(filename); ofstream out(name, ios::out | ios::ate); if (!out.good()) { cantwrite_box(name); return; } rec.genera_testata(ic, _progr, _totale); out << rec; TString8 codtab; codtab.format("%c%04d%02d", ic._tipo, ic._anno, ic._periodo); TTable ird("IRD"); set(F_NUMERO, ic._progr + 1); ird.put("CODTAB", codtab); ird.put("I0", ic._progr + 1); ird.put("I2", _progr[0]); ird.put("I3", _progr[1]); ird.put("I4", _progr[2]); ird.put("I5", _progr[3]); ird.put("R2", _totale[0]); ird.put("R3", _totale[1]); ird.put("R4", _totale[2]); ird.put("R5", _totale[3]); ird.rewrite_write(); set(F_NUMERO, ic._progr + 1); TString msg("Generato il file "); msg << name; message_box(msg); } /////////////////////////////////////////////////////////// // TInvioIntra1_2_app /////////////////////////////////////////////////////////// class TInvioIntra1_2_app : public TSkeleton_application { protected: virtual void main_loop(); }; void TInvioIntra1_2_app::main_loop() { TInvioIntra1_2_mask m; open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_INTRA, LF_RINTRA, LF_RIEPRETT, 0); m.load(); m.set(F_PROGGIORN, 1); const TRectype& ditta = cache().get(LF_NDITTE, main_app().get_firm()); m.set(F_UFFDOG, ditta.get(NDT_UFFDOG)); while (m.run() == K_ENTER) { const char tip = m.tipo(); if (tip == 'T') { m.genera('B', 'C', true); m.genera('B', 'A'); m.genera('S', 'C'); m.genera('S', 'A'); m.update_testata('A'); } else { m.genera('B', tip, true); m.genera('S', tip); m.update_testata('C'); } } m.save(); } int in0200(int argc, char* argv[]) { TInvioIntra1_2_app a; a.run(argc, argv, TR("Generazione Intra 1/2")); return 0; }