diff --git a/tc/tc0.cpp b/tc/tc0.cpp new file mode 100755 index 000000000..e5c9009e6 --- /dev/null +++ b/tc/tc0.cpp @@ -0,0 +1,23 @@ +#include + +#include "tc0.h" + +int main(int argc, char** argv) +{ + const int op = argc < 2 ? 0 : argv[1][1]-'0'; + switch (op) + { +// case 1: tc0200(argc,argv); break; +// case 2: tc0300(argc,argv); break; +// case 3: tc0400(argc,argv); break; + case 4: tc0500(argc,argv); break; //gestore tabelle multirel + default: tc0100(argc,argv); break; //parametri + } + exit(0); + return 0; +} + + + + + diff --git a/tc/tc0.h b/tc/tc0.h new file mode 100755 index 000000000..4785a7e2d --- /dev/null +++ b/tc/tc0.h @@ -0,0 +1,21 @@ +#ifndef __TC0_H +#define __TC0_H + +int tc0100(int argc, char** argv); +int tc0500(int argc, char** argv); + +#endif // __TC0_H + + + + + + + + + + + + + + diff --git a/tc/tc0100.cpp b/tc/tc0100.cpp new file mode 100755 index 000000000..ec2786ef1 --- /dev/null +++ b/tc/tc0100.cpp @@ -0,0 +1,6 @@ +#include "tc0.h" + +int tc0100(int argc, char **argv) +{ + return 0; +} diff --git a/tc/tc0500.cpp b/tc/tc0500.cpp new file mode 100755 index 000000000..2814499f7 --- /dev/null +++ b/tc/tc0500.cpp @@ -0,0 +1,35 @@ +#include + +#include "tc0.h" +#include "tcts.h" + + +class TTeamSystem_multirel_app : public TMultirel_application +{ + +protected: + virtual void get_mask_name(TString& tabname) const; + //magico metodo per impedire la navigazione su tabelle diverse da quella corrente del cursore + virtual bool has_filtered_cursor() const { return true; } + + +public: + + TTeamSystem_multirel_app() {} + virtual ~TTeamSystem_multirel_app() {} +}; + + +void TTeamSystem_multirel_app::get_mask_name(TString& tabname) const +{ + TMultirel_application::get_mask_name(tabname); + tabname.overwrite("ts", 2); +} + + +int tc0500(int argc, char* argv[]) +{ + TTeamSystem_multirel_app a; + a.run(argc, argv, TR("Tabella")); + return 0; +} diff --git a/tc/tc1.cpp b/tc/tc1.cpp new file mode 100755 index 000000000..a87169554 --- /dev/null +++ b/tc/tc1.cpp @@ -0,0 +1,20 @@ +#include + +#include "tc1.h" + +int main(int argc, char** argv) +{ + const int op = argc < 2 ? 0 : argv[1][1]-'0'; + switch (op) + { + case 0: tc1100(argc,argv); break; //trasferimento zucchetti + default: tc1100(argc,argv); break; + } + exit(0); + return 0; +} + + + + + diff --git a/tc/tc1.h b/tc/tc1.h new file mode 100755 index 000000000..2ce6133a0 --- /dev/null +++ b/tc/tc1.h @@ -0,0 +1,20 @@ +#ifndef __TC1_H +#define __TC1_H + +int tc1100(int argc, char** argv); + +#endif // __TC1_H + + + + + + + + + + + + + + diff --git a/tc/tc1100.cpp b/tc/tc1100.cpp new file mode 100755 index 000000000..00fbe446e --- /dev/null +++ b/tc/tc1100.cpp @@ -0,0 +1,618 @@ +#include +#include +#include + +#include "tc1.h" +#include "tc1100a.h" + +#include +#include +#include +#include + +#define ALIAS_REG 100 + +class TInvio_file: public TFile_text +{ +protected: + virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); + +public: + TInvio_file(const TString& file_name); + virtual ~TInvio_file() { } +}; + +TInvio_file::TInvio_file(const TString& file_name) + : TFile_text(file_name, "tc1100a.ini") +{ +} + +class TInvio_mask : public TAutomask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + + TInvio_mask(); + + virtual ~TInvio_mask(){}; +}; + +TInvio_mask::TInvio_mask() :TAutomask ("tc1100a") +{ +} + +bool TInvio_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODDITTA: + if (e==fe_init && o.empty()) + { + set(F_CODDITTA, main_app().get_firm()); + ((TEdit_field&) o).check(); + disable(F_CODDITTA); + } + break; + default: + break; + } + return TRUE; +} + +class TInvio : public TSkeleton_application +{ + TCursor* _cur; + TInvio_mask* _msk; + TInvio_file* _trasfile; + long _nrecords, _nrecsfattvend, _nrecsfattacqu, _nrecsmocontab; + int _nfiles; + long _nrecsdettaglio; + TString16 _descrdettaglio; + TDate _dataini, _datafin; + bool _totale, _finemov; + +protected: + virtual bool create(void); + virtual bool destroy(void); + virtual void main_loop() ; + void invio_zucchetti(); + long i_zucchetti_causali(const bool invio = TRUE); + long i_zucchetti_clifor(const bool invio = TRUE); + long i_zucchetti_conti(const bool invio = TRUE); + long i_zucchetti_movcont(const bool invio = TRUE); + long i_zucchetti_moviva(const char acqven, const bool invio = TRUE); + void i_zucchetti_testa_dettaglio(const TString16& descr, const long nrecs); + void i_zucchetti_coda_dettaglio(const TString16& descr, const long nrecs); + void i_zucchetti_testa(); + void i_zucchetti_coda(); +public: + int get_nfiles() {return _nfiles;}; + long get_nrecords() {return _nrecords;}; + long get_nrecsdettaglio() {return _nrecsdettaglio;}; + TString16& get_descrdettaglio() {return _descrdettaglio;}; + const bool totale() {return _totale;}; + const bool finemov() {return _finemov;}; + TInvio() {} ; + virtual ~TInvio() {} ; +}; + +// restituisce un riferimento all' applicazione +inline TInvio& app() { return (TInvio&) main_app();} + +// gestione dei messaggi estesi nei campi +void TInvio_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) +{ + const TString code(s.get(0)); + TString valore; + if (code == "_FISSO") + { + // gestione dei campi fissi per i record delle riba + // sintassi: _FISSO,! + // dove: è la stringa fissa da emettere + TString in(s.get()); + CHECK(in[0]=='!',"Macro _FISSO senza carattere '!'"); + in.ltrim(1); + in.trim(); + valore = in; + } + else if (code == "_ANNO") + { + TDate data(str); + int anno = data.year(); + valore.format("%ld", anno); + } + else if (code == "_MESE") + { + TDate data(str); + int mese = data.month(); + valore.format("%ld", mese); + } + else if (code == "_SEZIONE") + { + valore = str; + const char sezione = s.get()[0]; + const char sezriga = cur.curr(LF_RMOV).get_char(RMV_SEZIONE); + if (sezione != sezriga) + valore = ""; + } + else if (code == "_CAUSALE") + { + TFilename configname = "tc1100conf.ini"; + TConfig configfile(configname); + TToken_string causali = configfile.get("STANDARD", "CAUSALI"); + const char sezione = cur.curr(LF_RMOV).get_char(RMV_SEZIONE); + if (sezione == 'D') + valore = causali.get(0); + else + valore = causali.get(1); + } + else if (code == "_NUMFILES") + { + const int nfiles = app().get_nfiles(); + valore.format("%ld", nfiles); + } + else if (code == "_NUMRECORDS") + { + const long nrecords = app().get_nrecords(); + valore.format("%ld", nrecords); + } + else if (code == "_NUMRECORDSDETTAGLIO") + { + const long nrecords = app().get_nrecsdettaglio(); + valore.format("%ld", nrecords); + } + else if (code == "_TIPOFILE") + { + valore = app().get_descrdettaglio(); + } + else if (code == "_OPZIONI") + { + TString in(s.get()); + TFilename configname = "tc1100conf.ini"; + TConfig configfile(configname); + valore = configfile.get(in, "OPZIONI"); + } + else if (code == "_OGGI") + { + TDate data(TODAY); + valore = data.string(full, '-', full, full, amg_date); + valore.strip("-"); + } + else if (code == "_CODIFICA") + { + const char tipocf = str[0]; + if (tipocf == 'C') + valore = "P"; + else + valore = "R"; + } + else if (code == "_NUMDOC") + { + if (cur.file("REG").get("I0") == 1) + valore = cur.curr().get(MOV_NUMDOC); + else + valore = cur.curr().get(MOV_PROTIVA); + } + else if (code == "_SEGNO") + { + TString archivio(s.get()); + TString campo(s.get()); + const real importo = cur.curr(archivio).get_real(campo); + valore = "+"; + if (importo < 0) + valore = "-"; + } + else if (code == "_IMPORTO") + { + real importo(str); + valore = importo.string(0,2); + valore.strip("-"); + valore.strip("+"); + valore.strip("."); + } + else if (code == "_TIPODOC") + { + const char tipodoc = str[0]; + valore = (tipodoc == 'F') ? "1" : "2"; + } + else if (code == "_DIVERSI") + { + valore = (app().finemov() ? "X" : " "); + } + else if (code == "_TOTALE") + { + real importo(ZERO); + if (app().totale()) + { + importo = cur.curr(LF_MOV).get_real(MOV_TOTDOC); + importo+=cur.curr(LF_MOV).get_real(MOV_RITFIS); + } + valore = importo.string(11,2); + valore.strip("-"); + valore.strip("+"); + valore.strip("."); + } + else if (code == "_SEGNOTOTALE") + { + real importo(ZERO); + if (app().totale()) + { + importo = cur.curr(LF_MOV).get_real(MOV_TOTDOC); + importo+=cur.curr(LF_MOV).get_real(MOV_RITFIS); + } + valore = importo.string(11,2); + valore.trim(); + valore = valore.sub(0,1); + if (valore[0] != '-' && valore[0] != '+') + valore = "+"; + } + else if (code == "_GIUFIS") + { + const char tipopers = cur.curr(LF_CLIFO).get_char(CLI_TIPOPERS); + valore = (tipopers == 'F') ? " " : "S"; + } + else if (code == "_BLACKLIST") + { + const bool sospeso = cur.curr(LF_CLIFO).get_bool(CLI_SOSPESO); + valore = (sospeso == true) ? "S" : " "; + } + else NFCHECK("Macro non definita: %s", (const char *)code); + str = valore; +} + +void TInvio::i_zucchetti_testa() +{ + // cursore fittizio + TRelation rel(LF_CAUSALI); + TCursor cur(&rel); + _nrecords = 0; + _nfiles = 0; + if (_msk->get_bool(F_CAUSALI)) + { + _nrecords += i_zucchetti_causali(FALSE)+2; + _nfiles++; + } + if (_msk->get_bool(F_CLIFOR)) + { + _nrecords += i_zucchetti_clifor(FALSE)+2; + _nfiles++; + } + if (_msk->get_bool(F_CONTI)) + { + _nrecords += i_zucchetti_conti(FALSE)+2; + _nfiles++; + } + if (_msk->get_bool(F_MOVCONT)) + { + _nrecsmocontab = i_zucchetti_movcont(FALSE); + if (_nrecsmocontab > 0) + { + _nrecords += _nrecsmocontab+2; + _nfiles++; + } + } + if (_msk->get_bool(F_MOVIVA)) + { + _nrecsfattvend = i_zucchetti_moviva('V', FALSE); + if (_nrecsfattvend > 0) + { + _nrecords += _nrecsfattvend+2; + _nfiles++; + } + _nrecsfattacqu = i_zucchetti_moviva('A', FALSE); + if (_nrecsfattacqu > 0) + { + _nrecords += _nrecsfattacqu+2; + _nfiles++; + } + } + TRecord_text rec; + rec.set_type("I"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); +} + +void TInvio::i_zucchetti_testa_dettaglio(const TString16& descr, const long nrecs) +{ + // cursore fittizio + TRelation rel(LF_CAUSALI); + TCursor cur(&rel); + _nrecsdettaglio = nrecs; + _descrdettaglio = descr; + TRecord_text rec; + rec.set_type("F"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); +} + +void TInvio::i_zucchetti_coda_dettaglio(const TString16& descr, const long nrecs) +{ + // cursore fittizio + TRelation rel(LF_CAUSALI); + TCursor cur(&rel); + _nrecsdettaglio = nrecs; + _descrdettaglio = descr; + TRecord_text rec; + rec.set_type("E"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); +} + +void TInvio::i_zucchetti_coda() +{ + TRelation rel(LF_CAUSALI); + TCursor cur(&rel); + TRecord_text rec; + rec.set_type("C"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); +} + +long TInvio::i_zucchetti_causali(const bool invio) +{ + TRelation rel(LF_CAUSALI); + TCursor cur(&rel); + const long cur_items = cur.items(); + if (cur_items != 0 && invio) + { + i_zucchetti_testa_dettaglio("CAUSMOVM", cur_items); + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + TRecord_text rec; + rec.set_type("21"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); + } + i_zucchetti_coda_dettaglio("CAUSMOVM", cur_items); + } + return cur_items; +} + +long TInvio::i_zucchetti_conti(const bool invio) +{ + TRelation rel(LF_PCON); + TCursor cur(&rel); + const long cur_items = cur.items(); + if (cur_items != 0 && invio) + { + i_zucchetti_testa_dettaglio("DESCONTI", cur_items); + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + TRecord_text rec; + rec.set_type("20"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); + } + i_zucchetti_coda_dettaglio("DESCONTI", cur_items); + } + return cur_items; +} + +long TInvio::i_zucchetti_movcont(const bool invio) +{ + TRectype da(LF_MOV); + TRectype a(LF_MOV); + da.put(MOV_DATAREG, _dataini); + a.put(MOV_DATAREG, _datafin); + TRelation rel(LF_MOV); + rel.add(LF_RMOV, "NUMREG==NUMREG", 1); + TCursor cur(&rel, "23->PROTIVA == \"\"", 2, &da, &a); + + const long cur_items = cur.items(); + long totrec = 0; + if (cur_items != 0) + { + if (invio) + i_zucchetti_testa_dettaglio("MOCONTAB", _nrecsmocontab); + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + const long numreg = cur.curr().get_long(MOV_NUMREG); + bool continua = TRUE; + while (continua) + { + const long numregrig = cur.curr(LF_RMOV).get_long(RMV_NUMREG); + if (numreg == numregrig) + { + if (invio) + { + TRectype& cur_rec_righe = cur.curr(LF_RMOV); + TRecord_text recrighe; + recrighe.set_type("50"); + cur.save_status(); + _finemov = !(cur.next_match(LF_RMOV, "NUMREG")); + cur.restore_status(); + _trasfile->autoload(recrighe, cur); + _trasfile->write(recrighe); + } + totrec++; + } + continua = cur.next_match(LF_RMOV, "NUMREG"); + } + } + if (invio) + i_zucchetti_coda_dettaglio("MOCONTAB", _nrecsmocontab); + } + return totrec; +} + +long TInvio::i_zucchetti_moviva(const char acqven, const bool invio) +{ + TRectype da(LF_MOV); + TRectype a(LF_MOV); + da.put(MOV_DATAREG, _dataini); + a.put(MOV_DATAREG, _datafin); + TRelation rel(LF_MOV); + rel.add(LF_RMOVIVA, "NUMREG==NUMREG", 1); + rel.add("REG", "CODTAB[1,4]==ANNOIVA|CODTAB[5,7]==REG", 1); + TString filtro = "(23->PROTIVA != \"\") && "; + if (acqven == 'V') + filtro << "(REG->I0 == 1)"; + else + filtro << "(REG->I0 == 2)"; + TCursor cur(&rel, "", 2, &da, &a); + cur.setfilter(filtro, TRUE); + const long cur_items = cur.items(); + long totrec = 0; + if (cur_items != 0) + { + if (invio) + i_zucchetti_testa_dettaglio(acqven == 'V' ? "FATTVEND" : "FATTACQU", acqven == 'V' ? _nrecsfattvend : _nrecsfattacqu); + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + if (invio) + { + TRecord_text rec; + rec.set_type("30"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); + } + totrec++; + const long numreg = cur.curr().get_long(MOV_NUMREG); + bool continua = TRUE; + while (continua) + { + const long numregrig = cur.curr(LF_RMOVIVA).get_long(RMI_NUMREG); + if (numreg == numregrig) + { + if (invio) + { + TRectype& cur_rec_righe = cur.curr(LF_RMOVIVA); + TRecord_text recrighe; + recrighe.set_type("31"); + cur.save_status(); + _totale = !(cur.next_match(LF_RMOVIVA, "NUMREG")); + cur.restore_status(); + _trasfile->autoload(recrighe, cur); + _trasfile->write(recrighe); + } + totrec++; + } + continua = cur.next_match(LF_RMOVIVA, "NUMREG"); + } + } + if (invio) + i_zucchetti_coda_dettaglio(acqven == 'V' ? "FATTVEND" : "FATTACQU", acqven == 'V' ? _nrecsfattvend : _nrecsfattacqu); + } + return totrec; +} + +long TInvio::i_zucchetti_clifor(const bool invio) +{ + TRelation rel(LF_CLIFO); + TCursor cur(&rel); + const long cur_items = cur.items(); + if (cur_items != 0 && invio) + { + i_zucchetti_testa_dettaglio("CLIEFORN", cur_items*2); + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + TRecord_text rec; + + rec.set_type("10"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); + + rec.set_type("11"); + _trasfile->autoload(rec, cur); + _trasfile->write(rec); + } + i_zucchetti_coda_dettaglio("CLIEFORN", cur_items*2); + } + return cur_items+cur_items; +} + +//metodone globale che chiama, come un menu, i vari sottometodi in base alle scelte sulla maschera +void TInvio::invio_zucchetti() +{ + //prende i parametri dal file di configurazione dell'applicazione + TFilename configname = "tc1100a.ini"; + TConfig configfile(configname); + //prepara il file su cui scrivere, ovvero il _trasfile + TFilename filename = _msk->get(F_DESTINAZIONE); + filename.add(configfile.get("NOMEFILE", "OPZIONI")); + if (filename.exist()) + remove(filename); + + _trasfile = new TInvio_file(filename); + _trasfile->open(filename,'w'); + + i_zucchetti_testa(); + + if (_msk->get_bool(F_CAUSALI)) + i_zucchetti_causali(); + if (_msk->get_bool(F_CLIFOR)) + i_zucchetti_clifor(); + if (_msk->get_bool(F_CONTI)) + i_zucchetti_conti(); + if (_msk->get_bool(F_MOVCONT)) + i_zucchetti_movcont(); + if (_msk->get_bool(F_MOVIVA)) + { + i_zucchetti_moviva('V'); + i_zucchetti_moviva('A'); + } + i_zucchetti_coda(); + _trasfile->close(); + delete _trasfile; + _trasfile = NULL; +} + +bool TInvio::create() +{ + _msk = new TInvio_mask(); + _trasfile = NULL; + return TSkeleton_application::create(); +} + +bool TInvio::destroy() +{ + if (_trasfile) + delete _trasfile; + delete _msk; + + return TSkeleton_application::destroy(); +} + +void TInvio::main_loop() +{ + TFilename configname = "tc1100conf.ini"; + configname.custom_path(); + TConfig configfile(configname); + _msk->set(F_NUMEROINVIO, configfile.get_int("NUMEROINVIO","OPZIONI")+1); + _msk->set(F_DATAINI, configfile.get("DATA","OPZIONI")); + _msk->set(F_DESTINAZIONE, configfile.get("PERCORSO","OPZIONI")); + + while (_msk->run() != K_QUIT) + { + _totale = false; + _finemov = false; + configfile.set("NUMEROINVIO", _msk->get(F_NUMEROINVIO),"OPZIONI"); + configfile.set("DATA", _msk->get_date(F_DATAFIN),"OPZIONI"); + configfile.set("PERCORSO", _msk->get(F_DESTINAZIONE),"OPZIONI"); + configfile.set_paragraph("CAUSALI"); + _dataini = _msk->get_date(F_DATAINI); + _datafin = _msk->get_date(F_DATAFIN); + const char tipoinvio = _msk->get(F_TIPOINVIO)[0]; + if (tipoinvio == 'Z') + invio_zucchetti(); + } +} + +int tc1100(int argc, char **argv) +{ + TInvio a; + a.run(argc, argv, "Invio dati contabilità Zucchetti"); + return 0; +} + diff --git a/tc/tc1100a.h b/tc/tc1100a.h new file mode 100755 index 000000000..b6f4fd037 --- /dev/null +++ b/tc/tc1100a.h @@ -0,0 +1,18 @@ +// invio dati ad altra procedura + +#define F_CODDITTA 101 +#define F_RAGSOC 102 +#define F_CAUSALI 110 +#define F_CONTI 111 +#define F_CLIFOR 112 +#define F_MOVCONT 113 +#define F_MOVIVA 114 +#define F_CORRISP 115 +#define F_SALDACONTO 116 +#define F_TIPOINVIO 120 +#define F_DESTINAZIONE 121 +#define F_NUMEROINVIO 122 +#define F_DATAINI 123 +#define F_DATAFIN 124 +#define F_RIPRISTINA 125 +#define F_DATARIPRISTINO 126 diff --git a/tc/tc1100a.ini b/tc/tc1100a.ini new file mode 100755 index 000000000..1df9d70eb --- /dev/null +++ b/tc/tc1100a.ini @@ -0,0 +1,840 @@ +[MAIN] +DECSEP = , +FIELDSEP = +RECORDSEP = +RECORDSIZE = 200 +SKIPLINES = 0 +TYPEFIELD = 0 +TYPELEN = 0 +TYPEPOS = -1 + +[TYPE STRINGA] +ALIGN = L +DATA = S +DECIMAL = 0 +FILLER = ' ' +LENGTH = 0 +PICTURE = + +[TYPE NUMERO] +ALIGN = R +DATA = N +DECIMAL = 0 +FILLER = '0' +LENGTH = 0 +PICTURE = + +[TYPE DATA] +ALIGN = +DATA = D +DECIMAL = 0 +FILLER = '0' +LENGTH = 8 +PICTURE = 3444 + +[TYPE IMPORTO] +ALIGN = R +DATA = S +DECIMAL = 0 +FILLER = '0' +LENGTH = 0 + +//record di testata +[RECORD I] + +NAME(0) = TIPO RECORD TESTATA GENERALE +TYPE(0) = STRINGA +POSITION(0) = 0 +LENGTH(0) = 1 +MESSAGE(0)=_FISSO,!T + +NAME(1) = NUMERO FILE TRASFERITI +TYPE(1) = NUMERO +POSITION(1) = 1 +LENGTH(1) = 3 +MESSAGE(1)=_NUMFILES + +NAME(2) = NUMERO RECORD TRASFERITI +TYPE(2) = NUMERO +POSITION(2) = 4 +LENGTH(2) = 13 +MESSAGE(2)=_NUMRECORDS + +NAME(3) = CODICE DITTA +TYPE(3) = NUMERO +POSITION(3) = 17 +LENGTH(3) = 6 +MESSAGE(3)=_OPZIONI,CODICEDITTA + +NAME(4) = NUMERO SPEDIZIONE +TYPE(4) = NUMERO +POSITION(4) = 23 +LENGTH(4) = 2 +MESSAGE(4)=_OPZIONI,NUMEROINVIO + +NAME(5) = DATA SPEDIZIONE +TYPE(5) = STRINGA +POSITION(5) = 25 +LENGTH(5) = 8 +MESSAGE(5)=_OGGI + +NAME(6) = TIPO SPEDIZIONE +TYPE(6) = STRINGA +POSITION(6) = 33 +LENGTH(6) = 1 +MESSAGE(6)=_FISSO,!V + +//record di coda +[RECORD C] + +NAME(0) = TIPO RECORD CODA GENERALE +TYPE(0) = STRINGA +POSITION(0) = 0 +LENGTH(0) = 1 +MESSAGE(0)=_FISSO,!T + +NAME(1) = NUMERO FILE TRASFERITI +TYPE(1) = NUMERO +POSITION(1) = 1 +LENGTH(1) = 3 +MESSAGE(1)=_NUMFILES + +NAME(2) = NUMERO RECORD TRASFERITI +TYPE(2) = NUMERO +POSITION(2) = 4 +LENGTH(2) = 13 +MESSAGE(2)=_NUMRECORDS + +NAME(3) = CODICE DITTA +TYPE(3) = NUMERO +POSITION(3) = 17 +LENGTH(3) = 6 +MESSAGE(3)=_OPZIONI,CODICEDITTA + +NAME(4) = NUMERO SPEDIZIONE +TYPE(4) = NUMERO +POSITION(4) = 23 +LENGTH(4) = 2 +MESSAGE(4)=_OPZIONI,NUMEROINVIO + +NAME(5) = DATA SPEDIZIONE +TYPE(5) = STRINGA +POSITION(5) = 25 +LENGTH(5) = 8 +MESSAGE(5)=_OGGI + +NAME(6) = TIPO SPEDIZIONE +TYPE(6) = STRINGA +POSITION(6) = 33 +LENGTH(6) = 1 +MESSAGE(6)=_FISSO,!V + +//record inizio dettagli +[RECORD F] + +NAME(0) = TIPO RECORD TESTATA GRUPPO +TYPE(0) = STRINGA +POSITION(0) = 0 +LENGTH(0) = 1 +MESSAGE(0)=_FISSO,!F + +NAME(1) = TIPO FILE +TYPE(1) = STRINGA +POSITION(1) = 1 +LENGTH(1) = 8 +MESSAGE(1)=_TIPOFILE + +//record fine dettagli +[RECORD E] + +NAME(0) = TIPO RECORD CODA GRUPPO +TYPE(0) = STRINGA +POSITION(0) = 0 +LENGTH(0) = 1 +MESSAGE(0)=_FISSO,!E + +NAME(1) = TIPO FILE +TYPE(1) = STRINGA +POSITION(1) = 1 +LENGTH(1) = 8 +MESSAGE(1)=_TIPOFILE + +NAME(2) = NUMERO RECORD TRASFERITI +TYPE(2) = NUMERO +POSITION(2) = 9 +LENGTH(2) = 8 +MESSAGE(2)=_NUMRECORDSDETTAGLIO + +//clienti e fornitori prima parte +[RECORD 10] + +NAME(1) = TIPO DETTAGLIO CLIFOR 1 +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D10 + +NAME(2) = FLAG CLIFO +TYPE(2) = STRINGA +POSITION(2) = 3 +LENGTH(2) = 1 +FIELD(2) = 20->TIPOCF + +NAME(3) = CODICE CLIFO +TYPE(3) = NUMERO +POSITION(3) = 4 +LENGTH(3) = 6 +FIELD(3) = 20->CODCF + +NAME(4) = CODICE SOGGETTO +TYPE(4) = STRINGA +POSITION(4) = 10 +LENGTH(4) = 8 + +NAME(5) = COGNOME SOGGETTO +TYPE(5) = STRINGA +POSITION(5) = 18 +LENGTH(5) = 25 +FIELD(5) = 20->RAGSOC[1,25] + +NAME(6) = NOME SOGGETTO +TYPE(6) = STRINGA +POSITION(6) = 43 +LENGTH(6) = 25 +FIELD(6) = 20->RAGSOC[26,25] + +NAME(7) = CODICE FISCALE +TYPE(7) = STRINGA +POSITION(7) = 68 +LENGTH(7) = 16 +FIELD(7) = 20->PAIV + +NAME(8) = CODICE FISCALE ERRATO +TYPE(8) = STRINGA +POSITION(8) = 84 +LENGTH(8) = 1 + +NAME(9) = SOGGETTO INTRACOMUNITARIO +TYPE(9) = STRINGA +POSITION(9) = 85 +LENGTH(9) = 1 + +NAME(10) = FLAG COMPILATA DENOMINAZIONE +TYPE(10) = STRINGA +POSITION(10) = 86 +LENGHT(10) = 1 +MESSAGE(10)=_GIUFIS + +NAME(11) = FILLER +TYPE(11) = STRINGA +POSITION(11) = 87 +LENGTH(11) = 113 + +//clienti e fornitori seconda parte +[RECORD 11] + +NAME(1) = TIPO DETTAGLIO CLIFOR 2 +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D11 + +NAME(2) = VIA DI RESIDENZA +TYPE(2) = STRINGA +POSITION(2) = 3 +LENGTH(2) = 32 +FIELD(2)=20->INDCF + +NAME(3) = NUMERO CIVICO +TYPE(3) = STRINGA +POSITION(3) = 35 +LENGTH(3) = 5 +FIELD(3)=20->CIVCF + +NAME(4) = CODICE COMUNE +TYPE(4) = STRINGA +POSITION(4) = 40 +LENGTH(4) = 4 +FIELD(4)=20->COMCF + +NAME(5) = CAP DI RESIDENZA +TYPE(5) = STRINGA +POSITION(5) = 44 +LENGTH(5) = 5 +FIELD(5)=20->CAPCF + +NAME(6) = COMUNE DI RESIDENZA +TYPE(6) = STRINGA +POSITION(6) = 49 +LENGTH(6) = 23 + +NAME(7) = PROVINCIA DI RESIDENZA +TYPE(7) = STRINGA +POSITION(7) = 72 +LENGTH(7) = 2 + +NAME(8) = PARTITA IVA +TYPE(8) = STRINGA +POSITION(8) = 74 +LENGTH(8) = 11 +FIELD(8)=20->PAIV + +NAME(9) = PARTITA IVA ERRATA +TYPE(9) = STRINGA +POSITION(9) = 85 +LENGTH(9) = 1 + +NAME(10) = TIPO SOGGETTO +TYPE(10) = STRINGA +POSITION(10) = 86 +LENGTH(10) = 1 +FIELD(10) = 20->TIPOPERS + +NAME(11) = FLAG SAN MARINO +TYPE(11) = STRINGA +POSITION(11) = 87 +LENGTH(11) = 1 + +NAME(12) = BOLLA DOGANALE +TYPE(12) = STRINGA +POSITION(12) = 88 +LENGTH(12) = 1 + +NAME(13) = CODMOV DR770 +TYPE(13) = STRINGA +POSITION(13) = 89 +LENGTH(13) = 1 + +NAME(14) = BLACK LIST +TYPE(14) = STRINGA +POSITION(14) = 90 +LENGTH(14) = 1 +MESSAGE(14)=_BLACKLIST + +NAME(15) = FILLER +TYPE(15) = STRINGA +POSITION(15) = 91 +LENGTH(15) = 109 + +//sottoconti del piano dei conti +[RECORD 20] + +NAME(1) = TIPO DETTAGLIO SOTTOCONTI +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D20 + +NAME(2) = SOTTOCONTO +TYPE(2) = NUMERO +POSITION(2) = 3 +LENGTH(2) = 6 +FIELD(2)=19->SOTTOCONTO + +NAME(3) = DESCRIZIONE +TYPE(3) = STRINGA +POSITION(3) = 9 +LENGTH(3) = 30 +FIELD(3)=19->DESCR + +NAME(4) = DESCRIZIONE ABBREVIATA +TYPE(4) = STRINGA +POSITION(4) = 39 +LENGTH(4) = 10 +FIELD(4)=19->DESCR[1,10] + +NAME(5) = TIPO CONTO +TYPE(5) = STRINGA +POSITION(5) = 49 +LENGTH(5) = 1 + +NAME(6) = ACQUISTI PER VENTILAZIONE +TYPE(6) = STRINGA +POSITION(6) = 50 +LENGTH(6) = 1 + +NAME(7) = ACQUISTI DESTINATI RIV +TYPE(7) = STRINGA +POSITION(7) = 51 +LENGTH(7) = 1 + +NAME(8) = PERCENTUALE INDETRAIBILITA +TYPE(8) = NUMERO +POSITION(8) = 52 +LENGTH(8) = 5 + +NAME(9) = FILLER +TYPE(9) = STRINGA +POSITION(9) = 57 +LENGTH(9) = 143 + +//causali movimenti contabili +[RECORD 21] + +NAME(1) = TIPO DETTAGLIO CAUSALI +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D21 + +NAME(2) = CAUSALE +TYPE(2) = STRINGA +POSITION(2) = 3 +LENGTH(2) = 3 +FIELD(2) = 26->CODCAUS + +NAME(3) = DESCRIZIONE +TYPE(3) = STRINGA +POSITION(3) = 6 +LENGTH(3) = 29 +FIELD(3) = 26->DESCR[1,29] + +NAME(4) = LIMITE INFERIORE DARE +TYPE(4) = NUMERO +POSITION(4) = 35 +LENGTH(4) = 6 + +NAME(5) = LIMITE SUPERIORE DARE +TYPE(5) = NUMERO +POSITION(5) = 41 +LENGTH(5) = 6 + +NAME(6) = LIMITE INFERIORE AVERE +TYPE(6) = NUMERO +POSITION(6) = 47 +LENGTH(6) = 6 + +NAME(7) = LIMITE SUPERIORE AVERE +TYPE(7) = NUMERO +POSITION(7) = 53 +LENGTH(7) = 6 + +NAME(8) = FILLER +TYPE(8) = STRINGA +POSITION(8) = 59 +LENGTH(8) = 141 + +//fatture: testate x fatture vendita, acquisti ,corrispettivi normali,corrispettivi ventilati +[RECORD 30] + +NAME(1) = TIPO DETTAGLIO MOV IVA (FATTURE) +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D30 + +NAME(2) = ATTIVITA IVA +TYPE(2) = NUMERO +POSITION(2) = 3 +LENGTH(2) = 2 + +NAME(3) = ANNO REGISTRAZIONE +TYPE(3) = NUMERO +POSITION(3) = 5 +LENGTH(3) = 4 +MESSAGE(3) = _ANNO +FIELD(3) = 23->DATAREG + +NAME(4) = MESE REGISTRAZIONE +TYPE(4) = NUMERO +POSITION(4) = 9 +LENGTH(4) = 2 +MESSAGE(4) = _MESE +FIELD(4) = 23->DATAREG + +NAME(5) = ANNO COMPETENZA +TYPE(5) = NUMERO +POSITION(5) = 11 +LENGTH(5) = 4 +MESSAGE(5) = _ANNO +FIELD(5) = 23->DATACOMP + +NAME(6) = MESE COMPETENZA +TYPE(6) = NUMERO +POSITION(6) = 15 +LENGTH(6) = 2 +MESSAGE(6) = _MESE +FIELD(6) = 23->DATACOMP + +NAME(7) = SEZIONE +TYPE(7) = NUMERO +POSITION(7) = 17 +LENGTH(7) = 2 + +NAME(8) = TIPO DOCUMENTO +TYPE(8) = STRINGA +POSITION(8) = 19 +LENGTH(8) = 1 +FIELD(8) = 23->TIPODOC[1,1] +MESSAGE(8) = _TIPODOC + +NAME(9) = TIPO FATTURA +TYPE(9) = STRINGA +POSITION(9) = 20 +LENGTH(9) = 2 + +NAME(10) = NUMERO DOCUMENTO +TYPE(10) = NUMERO +POSITION(10) = 22 +LENGTH(10) = 7 +FIELD(10) = 23->NUMDOC +MESSAGE(10) = _NUMDOC + +NAME(11) = NUMERO BIS +TYPE(11) = STRINGA +POSITION(11) = 29 +LENGTH(11) = 1 + +NAME(12) = NUMERO FATTURA FORNITORE +TYPE(12) = STRINGA +POSITION(12) = 30 +LENGTH(12) = 10 +FIELD(12) = 23->NUMDOC + +NAME(13) = DATA REGISTRAZIONE +TYPE(13) = DATA +POSITION(13) = 40 +LENGTH(13) = 8 +FIELD(13) = 23->DATAREG + +NAME(14) = DATA FATTURA +TYPE(14) = DATA +POSITION(14) = 48 +LENGTH(14) = 8 +FIELD(14) = 23->DATADOC + +NAME(15) = DATA SCADENZA +TYPE(15) = DATA +POSITION(15) = 56 +LENGTH(15) = 8 + +NAME(16) = DATA RISCONTO +TYPE(16) = DATA +POSITION(16) = 64 +LENGTH(16) = 8 + +NAME(17) = DATA RATEO +TYPE(17) = DATA +POSITION(17) = 72 +LENGTH(17) = 8 + +NAME(18) = CODICE PAGAMENTO +TYPE(18) = NUMERO +POSITION(18) = 80 +LENGTH(18) = 3 + +NAME(19) = TIPO PAGAMENTO +TYPE(19) = STRINGA +POSITION(19) = 83 +LENGTH(19) = 1 + +NAME(20) = CENTRO DI COSTO CLIFOR +TYPE(20) = NUMERO +POSITION(20) = 84 +LENGTH(20) = 4 + +NAME(21) = CODICE CLIFOR +TYPE(21) = NUMERO +POSITION(21) = 88 +LENGTH(21) = 6 +FIELD(21) = 23->CODCF + +NAME(22) = TIPO CODIFICA +TYPE(22) = STRINGA +POSITION(22) = 94 +LENGTH(22) = 1 +FIELD(22) = 23->TIPO +MESSAGE(22) = _CODIFICA + +NAME(23) = CODICE CODIFICA PARTITA IVA +TYPE(23) = STRINGA +POSITION(23) = 95 +LENGTH(23) = 16 + +NAME(24) = DESCRIZIONE ALTERNATIVA +TYPE(24) = STRINGA +POSITION(24) = 111 +LENGTH(24) = 29 + +NAME(25) = TIPO DESCRIZIONE AGGIUNTIVA +TYPE(25) = STRINGA +POSITION(25) = 140 +LENGTH(25) = 1 + +NAME(26) = FLAG PARTITA +TYPE(26) = STRINGA +POSITION(26) = 141 +LENGTH(26) = 1 + +NAME(27) = MESE STAMPA +TYPE(27) = NUMERO +POSITION(27) = 142 +LENGTH(27) = 2 + +NAME(28) = IMPORTO ALTRE RITENUTE +TYPE(28) = IMPORTO +POSITION(28) = 144 +LENGTH(28) = 11 + +NAME(29) = SEGNO +TYPE(29) = STRINGA +POSITION(29) = 155 +LENGTH(29) = 1 +MESSAGE(29) = _SEGNO + +NAME(30) = RITENUTA ACCONTO +TYPE(30) = IMPORTO +POSITION(30) = 156 +LENGTH(30) = 11 +FIELD(30) = 23->RITFIS +MESSAGE(30) = _IMPORTO + +NAME(31) = SEGNO +TYPE(31) = STRINGA +POSITION(31) = 167 +LENGTH(31) = 1 +MESSAGE(31) = _SEGNO,23,RITFIS + +NAME(32) = FLAG CONTABILIZZAZIONE +TYPE(32) = STRINGA +POSITION(32) = 168 +LENGTH(32) = 1 + +NAME(33) = MITTENTE +TYPE(33) = STRINGA +POSITION(33) = 169 +LENGTH(33) = 5 + +NAME(34) = CHIAVE FATTURA MITTENTE +TYPE(34) = STRINGA +POSITION(34) = 174 +LENGTH(34) = 10 + +NAME(35) = FILLER +TYPE(35) = STRINGA +POSITION(35) = 184 +LENGTH(35) = 16 + +//righe fatture: righe x fatture vendita, acquisti ,corrispettivi normali,corrispettivi ventilati +[RECORD 31] + +NAME(1) = TIPO DETTAGLIO RIGHE MOVIVA (RIGHE FATTURA) +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D31 + +NAME(2) = CODICE IVA +TYPE(2) = STRINGA +POSITION(2) = 3 +LENGTH(2) = 2 +FIELD(2)= 25->CODIVA[1,2] +FILLER(2) = '0' + +NAME(3) = IMPORTO IMPONIBILE EURO +TYPE(3) = IMPORTO +POSITION(3) = 5 +LENGTH(3) = 11 +FIELD(3)= 25->IMPONIBILE +MESSAGE(3) = _IMPORTO + +NAME(4) = SEGNO IMPONIBILE +TYPE(4) = STRINGA +POSITION(4) = 16 +LENGTH(4) = 1 +MESSAGE(4) = _SEGNO,25,IMPONIBILE + +NAME(5) = IMPORTO IMPOSTA EURO +TYPE(5) = IMPORTO +POSITION(5) = 17 +LENGTH(5) = 11 +FIELD(5)= 25->IMPOSTA +MESSAGE(5) = _IMPORTO + +NAME(6) = SEGNO IMPOSTA +TYPE(6) = STRINGA +POSITION(6) = 28 +LENGTH(6) = 1 +MESSAGE(6) = _SEGNO,25,IMPOSTA + +NAME(7) = CODICE NORMA +TYPE(7) = STRINGA +POSITION(7) = 29 +LENGTH(7) = 2 +FIELD(7) = 25->CODIVA[3,4] +FILLER(7) = '0' + +NAME(8) = CENTRO DI COSTO +TYPE(8) = STRINGA +POSITION(8) = 31 +LENGTH(8) = 4 + +NAME(9) = CONTROPARTITA +TYPE(9) = NUMERO +POSITION(9) = 35 +LENGTH(9) = 6 +FIELD(9) = 25->SOTTOCONTO + +NAME(10) = IMPORTO TOTALE EURO +TYPE(10) = IMPORTO +POSITION(10) = 41 +LENGTH(10) = 11 +MESSAGE(10)= _TOTALE + +NAME(11) = SEGNO TOTALE +TYPE(11) = STRINGA +POSITION(11) = 52 +LENGTH(11) = 1 +MESSAGE(11)= _SEGNOTOTALE + +NAME(12) = IMPORTO VALUTA +TYPE(12) = IMPORTO +POSITION(12) = 53 +LENGTH(12) = 13 + +NAME(13) = SEGNO VALUTA +TYPE(13) = STRINGA +POSITION(13) = 66 +LENGTH(13) = 1 +MESSAGE(13) = _FISSO,!+ + +NAME(14) = TIPO VALUTA +TYPE(14) = STRINGA +POSITION(14) = 67 +LENGTH(14) = 3 + +NAME(15) = CODICE CEE +TYPE(15) = STRINGA +POSITION(15) = 70 +LENGTH(15) = 2 + +NAME(16) = FILLER +TYPE(16) = STRINGA +POSITION(16) = 72 +LENGTH(16) = 128 + +//movimento contabile di prima nota +[RECORD 50] + +NAME(1) = TIPO DETTAGLIO MOV CONT +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D50 + +NAME(2) = DATA REGISTRAZIONE +TYPE(2) = DATA +POSITION(2) = 3 +LENGTH(2) = 8 +FIELD(2) = 23->DATAREG + +NAME(3) = CODICE CAUSALE +TYPE(3) = STRINGA +POSITION(3) = 11 +LENGTH(3) = 3 +FIELD(3) = 23->CODCAUS +MESSAGE(3) = _CAUSALE + +NAME(4) = DESCRIZIONE +TYPE(4) = STRINGA +POSITION(4) = 14 +LENGTH(4) = 29 +FIELD(4) = 23->DESCR + +NAME(5) = IMPORTO EURO +TYPE(5) = IMPORTO +POSITION(5) = 43 +LENGTH(5) = 13 +FIELD(5) = 24->IMPORTO +MESSAGE(5) = _IMPORTO + +NAME(6) = SEGNO IMPORTO +TYPE(6) = STRINGA +POSITION(6) = 56 +LENGTH(6) = 1 +MESSAGE(6) = _SEGNO,23,TOTDOC + +NAME(7) = CENTRO DI COSTO DARE +TYPE(7) = NUMERO +POSITION(7) = 57 +LENGTH(7) = 4 + +NAME(8) = SOTTOCONTO DARE +TYPE(8) = NUMERO +POSITION(8) = 61 +LENGTH(8) = 6 +FIELD(8) = 24->SOTTOCONTO +MESSAGE(8) = _SEZIONE,D + +NAME(9) = CENTRO DI COSTO AVERE +TYPE(9) = NUMERO +POSITION(9) = 67 +LENGTH(9) = 4 + +NAME(10) = SOTTOCONTO AVERE +TYPE(10) = NUMERO +POSITION(10) = 71 +LENGTH(10) = 6 +FIELD(10) = 24->SOTTOCONTO +MESSAGE(10)= _SEZIONE,A + +NAME(11) = TIPO CODIFICA DARE +TYPE(11) = STRINGA +POSITION(11) = 77 +LENGTH(11) = 1 + +NAME(12) = PARTITA IVA DARE +TYPE(12) = NUMERO +POSITION(12) = 78 +LENGTH(12) = 16 + +NAME(13) = TIPO CODIFICA AVERE +TYPE(13) = STRINGA +POSITION(13) = 94 +LENGTH(13) = 1 + +NAME(14) = PARTITA IVA AVERE +TYPE(14) = NUMERO +POSITION(14) = 95 +LENGTH(14) = 16 + +NAME(15) = FLAG DIVERSI +TYPE(15) = STRINGA +POSITION(15) = 111 +LENGTH(15) = 1 +MESSAGE(15) = _DIVERSI + +NAME(16) = FLAG CONTABILIZZAZIONE +TYPE(16) = STRINGA +POSITION(16) = 112 +LENGTH(16) = 1 + +NAME(17) = FILLER +TYPE(17) = STRINGA +POSITION(17) = 113 +LENGTH(17) = 87 + +//riga movimento contabile di prima nota +[RECORD 51] + +NAME(1) = TIPO DETTAGLIO DESCRIZIONI AGGIUNTIVE MOV CONT +TYPE(1) = STRINGA +POSITION(1) = 0 +LENGTH(1) = 3 +MESSAGE(1)=_FISSO,!D51 + +NAME(2) = DESCRIZIONE +TYPE(2) = STRINGA +POSITION(2) = 3 +LENGTH(2) = 29 +FIELD(2) = 24->DESCR + +NAME(3) = FLAG FINE DESCRIZIONI +TYPE(3) = STRINGA +POSITION(3) = 32 +LENGTH(3) = 1 + +NAME(4) = FILLER +TYPE(4) = STRINGA +POSITION(4) = 33 +LENGTH(4) = 167 diff --git a/tc/tc1100a.uml b/tc/tc1100a.uml new file mode 100755 index 000000000..eab868a21 --- /dev/null +++ b/tc/tc1100a.uml @@ -0,0 +1,121 @@ +#include "cg7100a.h" + +PAGE "Invio dati contabilita'" -1 -1 78 20 + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 2 1 "@bDitta corrente" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 3 2 "Codice " + FLAGS "FD" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 23 2 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 76 6 +BEGIN + PROMPT 2 4 "Dati da inviare" +END + +BOOLEAN F_CAUSALI +BEGIN + PROMPT 3 5 "Causali" + FLAGS "D" +END + +BOOLEAN F_CONTI +BEGIN + PROMPT 3 6 "Conti" +END + +BOOLEAN F_CLIFOR +BEGIN + PROMPT 3 7 "Clienti/Fornitori" +END + +BOOLEAN F_MOVCONT +BEGIN + PROMPT 3 8 "Movimenti contabili" + MESSAGE TRUE,ENABLE F_DATAFIN +END + +BOOLEAN F_MOVIVA +BEGIN + PROMPT 40 5 "Movimenti IVA" + MESSAGE TRUE,ENABLE F_DATAFIN +END + +BOOLEAN F_CORRISP +BEGIN + PROMPT 40 6 "Corrispettivi" + MESSAGE TRUE,ENABLE F_DATAFIN +END + +BOOLEAN F_SALDACONTO +BEGIN + PROMPT 40 7 "Saldaconto" + FLAGS "D" +END + +LISTBOX F_TIPOINVIO 20 +BEGIN + PROMPT 2 10 "Invio a " + ITEM "Z|Zucchetti" +END + +STRING F_DESTINAZIONE 20 +BEGIN + PROMPT 2 11 "Destinazione " +END + +NUMBER F_NUMEROINVIO 2 +BEGIN + PROMPT 2 12 "Numero invio " +END + +DATE F_DATAINI +BEGIN + PROMPT 20 12 "Data iniz. " +END + +DATE F_DATAFIN +BEGIN + PROMPT 44 12 "Data fin. " +END + +BUTTON F_RIPRISTINA 20 +BEGIN + PROMPT 2 14 "Annulla invio" + MESSAGE SHOW,F_DATARIPRISTINO|ENABLE,F_DATARIPRISTINO +END + +DATE F_DATARIPRISTINO +BEGIN + PROMPT 25 14 "Annulla invio fino al " + FLAGS "HD" +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/tc/tc1100conf.ini b/tc/tc1100conf.ini new file mode 100755 index 000000000..45b912f7c --- /dev/null +++ b/tc/tc1100conf.ini @@ -0,0 +1,10 @@ +[OPZIONI] +CODICEDITTA = +DATA = +NOMEFILE = +NUMEROINVIO = +PERCORSO = + +[CAUSALI] +STANDARD= + diff --git a/tc/tc9.cpp b/tc/tc9.cpp new file mode 100755 index 000000000..29b1a063d --- /dev/null +++ b/tc/tc9.cpp @@ -0,0 +1,21 @@ +#include + +#include "tc9.h" + +int main(int argc, char** argv) +{ + const int op = argc < 2 ? 0 : argv[1][1]-'0'; + switch (op) + { + case 0: tc9100(argc,argv); break; // Invio a Proforma + case 1: tc9200(argc,argv); break; // Invio a Sispac/Cosmo + default: tc9100(argc,argv); break; + } + exit(0); + return 0; +} + + + + + diff --git a/tc/tc9.h b/tc/tc9.h new file mode 100755 index 000000000..c15b7a871 --- /dev/null +++ b/tc/tc9.h @@ -0,0 +1,21 @@ +#ifndef __TC9_H +#define __TC9_H + +int tc9100(int argc, char** argv); +int tc9200(int argc, char** argv); + +#endif // __TC9_H + + + + + + + + + + + + + + diff --git a/tc/tc9100.cpp b/tc/tc9100.cpp new file mode 100755 index 000000000..ad07ecc3a --- /dev/null +++ b/tc/tc9100.cpp @@ -0,0 +1,1524 @@ +#include +#include +#include +#include +#include +#include + +#include "tc9.h" +#include "tc9100a.h" + +#include +#include + +#include "../cg/cg2101.h" +#include "../cg/cg2103.h" +#include "../cg/cgsaldac.h" + +#include "../ca/calib01.h" +#include "../ca/movana.h" +#include "../ca/rmovana.h" + +#include +#include + + +class TInvioP_file: public TFile_text +{ +protected: + virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); + +public: + TInvioP_file(const TString& file_name); + virtual ~TInvioP_file() { } +}; + +TInvioP_file::TInvioP_file(const TString& file_name) + : TFile_text(file_name, "tc9100a.ini") +{ +} + +////////////////////////////////////////////////////// +// MASCHERA +////////////////////////////////////////////////////// + +class TInvioP_mask : public TAutomask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); + void config_loader(TSheet_field& sf, const char* paragrafo); + void config_setter(TSheet_field& sf, const char* paragrafo); + +public: + TInvioP_mask(); + virtual ~TInvioP_mask(){}; +}; + +TInvioP_mask::TInvioP_mask() :TAutomask ("tc9100a") +{ + config_loader(sfield(F_PDCC), "Pdcc"); +} + +bool TInvioP_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODDITTA: + if (e==fe_init && o.empty()) + { + set(F_CODDITTA, main_app().get_firm()); + ((TEdit_field&) o).check(); + disable(F_CODDITTA); + } + break; + case DLG_SAVEREC: + if (e == fe_button) + { + config_setter(sfield(F_PDCC), "Pdcc"); + } + break; + default: + break; + } + return true; +} + +void TInvioP_mask::config_loader(TSheet_field& sf, const char* paragrafo) +{ + //carica file configurazione conti; attenzione!!!il file di configurazione in questione e' il + //medesimo del programma per la stampa del pagato in contabilita' analitica, visto che i due + //programmi necessitano degli stessi conti + TFilename configname = "ca3600a.ini"; + configname.custom_path(); + TConfig configfile(configname, paragrafo); + + TString_array conti; + + int first_enabled_row = -1; + int n = configfile.list_variables(conti, false, paragrafo, true); + FOR_EACH_ARRAY_ROW(conti, i, row) + { + sf.row(-1) = configfile.get(*row); //carica la riga del .ini senza il contatore + sf.check_row(i); + TString pippo = sf.row(i); + pippo = pippo.left(1); //disabilita le righe di tipo C e P che riguardano la sola stampa.. +/* if (pippo == "C" || pippo == "P") //..del pagato + sf.disable_row(i); + else + { + if (first_enabled_row < 0) //se la riga non e' C o P deve incrementare il contatore della.. + first_enabled_row = i; //..prima riga disabilitata + }*/ + } + if (first_enabled_row >= 0) //se il contatore della prima riga disabilitata e' stato.. + sf.select(first_enabled_row); //..incrementato, sposta il focus alla prima riga abile +} + +void TInvioP_mask::config_setter(TSheet_field& sf, const char* paragrafo) +{ + TFilename configname = "ca3600a.ini"; + configname.custom_path(); + TConfig configfile(configname, paragrafo); + + configfile.remove_all(); //svuota il paragrafo sul .ini prima di ricompilarlo (se non si facesse + //non si riuscirebbero ad ammazzare le righe sul .ini + FOR_EACH_SHEET_ROW (sf, i, row) + { + TToken_string conto(""); + conto.add(row->get(0)); + conto.add(row->get(1)); + conto.add(row->get(2)); + conto.add(row->get(3)); + + configfile.set("conto", conto, NULL, true, i); + } +} + +////////////////////////////////////////////// +// STRUCT (saldo di 1 conto) +////////////////////////////////////////////// +struct TInvioP_saldo : public TObject +{ + TString16 _zio; + TImporto _importo; + + TInvioP_saldo(const TRectype& r); + TInvioP_saldo(const TString& zio, const TImporto& importo); +}; + +TInvioP_saldo::TInvioP_saldo(const TRectype& r) +{ + const TBill zio(r); + _zio = zio.string(0x8); + + const char sezione = r.get_char(RMV_SEZIONE); + const real imp = r.get_real(RMV_IMPORTO); + _importo.set(sezione, imp); + _importo.normalize(); +} + +TInvioP_saldo::TInvioP_saldo(const TString& zio, const TImporto& importo) + : _zio(zio), _importo(importo) +{} + + +////////////////////////////////////////////// +// SALDI MOVIMENTO CONTABILE +////////////////////////////////////////////// +class TInvioP_saldi_cg : public TArray +{ +public: + //prende l'oggetto i-esimo (in questo caso un TInvioP_saldo) e ritorna il conto di tale oggetto + const TString& conto(int i) { return ((TInvioP_saldo*)objptr(i))->_zio; } + //stessa roba ma per l'importo + TImporto& importo(int i) { return ((TInvioP_saldo*)objptr(i))->_importo; } + bool sottrai_importo(const TString& conto, const TImporto& importo); + void somma(const TRectype& rmov); + void sottrai(const TRectype& rmovana); +}; + +void TInvioP_saldi_cg::somma(const TRectype& rmov) +{ + TInvioP_saldo* s = new TInvioP_saldo(rmov); + add(s); +} + +bool TInvioP_saldi_cg::sottrai_importo(const TString& zio, const TImporto& imp) +{ + int k; + //caso fortunato + //scandisce gli elementi dell'array;se ne trova uno (k-esimo) con conto ed importo coincidenti.. + //..con quelli passati al metodo, azzera l'importo di tale elemento dell'array + for (k = 0; k < items(); k++) + { + if (conto(k) == zio && importo(k) == imp) + { + importo(k).set('D', ZERO); + return true; + } + } + + //caso sfortunato + //in questo caso gli importi dell'elemento k-esimo dell'array e passato al metodo NON coincidono + TImporto residuo = imp; + int ultima_riga_buona = -1; + + for (k = 0; k < items() && !residuo.is_zero(); k++) + { + if (conto(k) == zio) + { + TImporto& val = importo(k); + residuo.normalize(val.sezione()); + if (residuo >= val) + { + residuo -= val; + val.set('D', ZERO); + } + else + { + val -= residuo; + residuo.set('D', ZERO); + } + ultima_riga_buona = k; + } + } + //alla fine del ciclo sull'array resta un residuo non nullo.. + if (!residuo.is_zero()) + { + residuo.normalize(); + residuo.swap_section(); + if (ultima_riga_buona >= 0) + importo(ultima_riga_buona) += residuo; + } + return true; +} + +void TInvioP_saldi_cg::sottrai(const TRectype& rmovana) +{ + //adesso tocca alle righe contabili senza commessa + const int gruppo = atoi(rmovana.get(RMOVANA_CODCONTO).left(3)); + const int conto = atoi(rmovana.get(RMOVANA_CODCONTO).mid(3,3)); + const long sottoconto = atol(rmovana.get(RMOVANA_CODCONTO).mid(6,6)); + + const TBill zio(gruppo, conto, sottoconto); + + const TImporto importo(rmovana.get_char(RMOVANA_SEZIONE), rmovana.get_real(RMOVANA_IMPORTO)); + sottrai_importo(zio.string(0x8), importo); +} + +////////////////////////////////////////////// +// APPLICAZIONE +////////////////////////////////////////////// + +class TInvioP : public TSkeleton_application +{ + TCursor* _cur; + TInvioP_mask* _msk; + TDate _dataini, _datafin; + long _nregcosto, _nregpag; + real _importo; + char _accsal; + TConfig* _configfile; + TAssoc_array _fiscali,_sociali, _costi, _pagamenti; //array che contengono i conti + +protected: + virtual bool create(void); + virtual bool destroy(void); + virtual void main_loop() ; + void invio_proforma(); + bool i_proforma_movimenti(); + bool i_proforma_righe(TCursor& cur, TInvioP_file* trasfile); + bool i_proforma_pagamenti(); + bool i_proforma_clifor(char tipocf = 'C'); + bool i_proforma_conti(); + + real totale_documento(TMovimentoPN& pn, const bool includi_ritenute = true) const; + void lettura_conti(TAssoc_array& assoc, const char tipoconto); + bool cerca_conto(const TBill& bill, const TAssoc_array& assoc, const char tipoconto) const; + bool cerca_fiscali(const TBill& bill) const; + bool cerca_sociali(const TBill& bill) const; + int cerca_pagamento(const TBill& bill) const; + int cerca_costo(const TBill& bill) const; + bool test_swap(TCausale& caus, bool ritsoc) const; + real calcola_pagamento(TRectype& curpag_rec, real& iva_indetraibile); + bool sottrai_iva(TMovimentoPN& pn, const TRectype& rigaiva); + void stringa_grcosot(TRecord_text& recrighe, const TString& zio); + long calcola_fattura_originale(long nreg) const; + bool calcola_imponibile_totdoc(const long nreg, const TRectype& pag_rec, + real& imponibile, real& totdoc, real& totpagato, real& iva_indetraibile) const; + void calcola_imposte(const real& importo, const real& imposta, + const TString& codind, real& iva_det, real& iva_ind) const; + +public: + const real get_importo() {return _importo;} + const long get_nregcosto() const {return _nregcosto;} + const long get_nregpag() const {return _nregpag;} + const char get_accsal() const {return _accsal;} + const TString& get_vocespesa(const TString& zio) const; + TInvioP_file* apri_file(const char* nome); + void chiudi_file(TInvioP_file* trasfile); + + TInvioP() {}; + virtual ~TInvioP() {}; +}; + +// restituisce un riferimento all' applicazione +inline TInvioP& app() { return (TInvioP&) main_app();} + +// gestione dei messaggi estesi nei campi +void TInvioP_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) +{ + const TString code(s.get(0)); + TString valore; + if (code == "_FISSO") + { + // gestione dei campi fissi per i record delle riba + // sintassi: _FISSO,! + // dove: è la stringa fissa da emettere + TString in(s.get()); + CHECK(in[0]=='!',"Macro _FISSO senza carattere '!'"); + in.ltrim(1); + in.trim(); + valore = in; + } + else if (code == "_TELEFONO") + { + valore = str; + valore.trim(); + str = cur.curr().get("PTEL"); + valore << str; + valore.trim(); + } + else if (code == "_RAGSOC") + { + valore = str; + valore = valore.strip_double_spaces(); + } + else if (code == "_FLAG") + { + if (app().get_accsal() == 'S') + valore = "S"; + else + valore = "A"; + + } + else if (code == "_NREGCOSTO") + { + valore.format("%ld", app().get_nregcosto()); + } + else if (code == "_NREGPAG") + { + valore.format("%ld", app().get_nregpag()); + } + else if (code == "_IMPORTO") + { + valore = app().get_importo().string(); + } + + else NFCHECK("Macro non definita: %s", (const char *)code); + str = valore; +} + +TInvioP_file* TInvioP::apri_file(const char* nome) +{ + TFilename filename = _msk->get(F_DESTINAZIONE); + filename.add(nome); + filename.ext("txt"); + if (filename.exist()) + remove(filename); + + TInvioP_file* trasfile = new TInvioP_file(filename); + trasfile->open(filename,'w'); + trasfile->force_record_separator(); + return trasfile; +} + +void TInvioP::chiudi_file(TInvioP_file* trasfile) +{ + trasfile->close(); + delete trasfile; +} + +const TString& TInvioP::get_vocespesa(const TString& zio) const +{ + TConfig configfile("tc9100conf.ini", "OPZIONI"); + const TString16 confstringa = configfile.get("CONFSTRINGA"); + const int len = confstringa.len(); + + TLocalisamfile panapdc(LF_PANAPDC); + panapdc.zero(); + panapdc.setkey(2); + panapdc.put("GRUPPO", atoi(zio.mid(0,3))); + panapdc.put("CONTO", atoi(zio.mid(3,3))); + panapdc.put("SOTTOCONTO", atol(zio.mid(6,6))); + const TRectype r(panapdc.curr()); + + for (panapdc.read(); !panapdc.eof(); panapdc.next()) + { + if (panapdc.curr() != r) + break; + const TString& codconto = panapdc.get("CODCONTO"); + if (codconto.starts_with(confstringa)) + return codconto.mid(len); + } + return EMPTY_STRING; +} + +bool TInvioP::i_proforma_conti() +{ + TInvioP_file* trasfile = apri_file("pianocon"); + + TRelation rel(LF_PCON); + TCursor cur(&rel); + const long cur_items = cur.items(); + if (cur_items != 0) + { + TProgind pi(cur_items, "Trasferimento conti...", true, true); + + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + pi.addstatus(1); + if (pi.iscancelled()) + break; + + TRecord_text rec; + rec.set_type("P"); + trasfile->autoload(rec, cur); + trasfile->write(rec); + } + } + chiudi_file(trasfile); + return true; +} + +bool TInvioP::i_proforma_movimenti() +{ + TInvioP_file* trasfile = apri_file("registra"); //file testate + TInvioP_file* trasfilerighe = apri_file("righe"); //file righe movimenti + + //trasferimento testate movimenti (cerca direttamente sui movimenti analitici in chiave 2.. + //..,cioè per DATACOMP e con NUMREGCG!=0 + TRectype da(LF_MOV); + TRectype a(LF_MOV); + da.put(MOV_DATAREG, _dataini); + a.put(MOV_DATAREG, _datafin); + TRelation rel(LF_MOV); + rel.add(LF_CAUSALI, "CODCAUS==CODCAUS"); + + TCursor cur(&rel, "", 2, &da, &a); //chiave per data + + const long cur_items = cur.items(); + if (cur_items != 0) + { + //prepara i record di tipo testata da scrivere + TRecord_text rec; + rec.set_type("T"); + + TProgind pi(cur_items, "Trasferimento movimenti...", true, true); + + cur.freeze(); + const TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + pi.addstatus(1); + if (pi.iscancelled()) + break; + + //carica e scrive il record di testata in base alle informazioni contenute nel tc9100a.ini + trasfile->autoload(rec, cur); + trasfile->write(rec); + //trasferisce le righe del movimento analitico corrente solo + i_proforma_righe(cur, trasfilerighe); + } + } + chiudi_file(trasfilerighe); + chiudi_file(trasfile); + return true; +} + +bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe) +{ + //---- righe movimenti ---- + TInvioP_saldi_cg conti_importi; + + //Creo un movimento PN (con numreg = a quello del mov)che servira' un po' dovunque + TMovimentoPN pn; + pn.curr() = cur.curr(); + if (pn.read() == NOERR) + { + for (int j = 0; j < pn.cg_items(); j++) + conti_importi.somma(pn.cg(j)); + } + + TRecord_text recrighe; //istanzia il tipo record corretto da scrivere sul trasfilerighe + recrighe.set_type("R"); + + TAnal_mov analmov(cur.curr()); //..istanzia il movimento analitico con numregcg=numreg del mov + const long analrighe_items = analmov.body().rows(); + + if (analrighe_items > 0) //se il movana ha righe.. + { + TRelation rel_rmovana(LF_RMOVANA); //crea una relazione sulle righe anali cui aggiunge mov e movana + rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); + rel_rmovana.add(LF_MOV, "NUMREG==NUMREGCG", 1, LF_MOVANA); + TCursor cur_rmovana(&rel_rmovana); //crea il cursore sulle righe analitiche che serve per poter usare la autoload + cur_rmovana.curr(LF_MOVANA) = analmov; + cur_rmovana.curr(LF_MOV) = cur.curr(); + + for (int i = 1; i <= analrighe_items; i++) + { + //..e scandisce le righe + const TRectype& riga = analmov.body().row(i); + //inganna il cursore passandogli la riga analitica in esame (bastardo!) + cur_rmovana.curr() = riga; + //carica le righe analitiche + trasfilerighe->autoload(recrighe, cur_rmovana); + //toglie le righe contabili corrispondenti che sono appena state aggiunte con la autoload (sarebbero.. + //..duplicate se non lo facesse!!!) + conti_importi.sottrai(riga); + + //procedura orrenda per eliminare gli zeri dai gr/co/sot e passarli come stringhe! + const TString16 zio = cur_rmovana.curr().get(RMOVANA_CODCONTO); + stringa_grcosot(recrighe, zio); + + //procedura per scrivere la fase che deve essere spezzata in due per sottoprogetto ed edizione + const TString& codfase = riga.get(RMOVANA_CODFASE); + if (codfase.full()) + { + recrighe.add(codfase.left(4), 14); + recrighe.add(codfase.mid(4,4), 15); + } + + //procedura per ricavare la voce di spesa + const TString& vocespesa = get_vocespesa(zio); + recrighe.add(vocespesa, 16); + + //scrive sul file di trasferimento (alla faccia della semplicita'!) + trasfilerighe->write(recrighe); + } + } + //prende le righe contabili che non sono state eliminate dalle analitiche nelle sottrai(riga).. + //..in modo da passare anche quelle (in caso contrario sarebbero andati perduti gli importi di.. + //..tali righe che non avevano commessa!) + const long conti_importi_items = conti_importi.items(); + TString workstring; //stringa di lavoro che serve nel ciclo sotto + for (int k = 0; k < conti_importi_items; k++) + { + if (!conti_importi.importo(k).is_zero()) + { + //aggiunge i valori ai campi uno ad uno perchè non ha un cursore per fare l'autoload + recrighe.destroy(); + recrighe.add(pn.curr().get(MOV_NUMREG), 0); //numreg + workstring = "N"; + recrighe.add(workstring, 1); //rigaiva + TImporto& imp = conti_importi.importo(k); + workstring.cut(0) << imp.sezione(); + recrighe.add(workstring, 2); //sezione + //procedura orrenda per eliminare gli zeri dai gr/co/sot e passarli come stringhe! + const TString& zio = conti_importi.conto(k); + stringa_grcosot(recrighe, zio); + + const TString tipocf = pn.curr().get(MOV_TIPO); + recrighe.add(tipocf, 6); //tipocf + + //procedura per stringare il codice clifo + if (tipocf > ' ') + { + const long codcf = pn.curr().get_long(MOV_CODCF); + TString cf; + cf.format("%ld", codcf); + recrighe.add(cf, 7); //codcf + } + else + { + recrighe.add("", 7); //codcf + } + + recrighe.add(pn.curr().get(RMV_DESCR), 8); //descrizione + recrighe.add(imp.valore().string(), 9); //importo + + //procedura per ricavare la voce di spesa + const TString& vocespesa = get_vocespesa(zio); + recrighe.add(vocespesa, 16); + + //e finalmente scrive le righe avanzate... + trasfilerighe->write(recrighe); + } + } + + //---- righe iva ---- + //adesso tocca alle righe iva...e sara' un casino indicibile! + + //assoc array contenente tutti i diversi conti che incontrera' nello scanning delle righe iva + TAssoc_array conti; + //causale del movimento: serve per conoscere il tipo di detraibilita' dell'iva (piu' sotto) + const TCausale caus(pn.curr().get(MOV_CODCAUS)); + const int anno = pn.curr().get_date(MOV_DATAREG).year(); + real imp_detr, iva_detr, imp_indetr, iva_indetr; + + //scanning delle righe iva alla ricerca dei conti che compaiono + for (int l = 0; l < pn.iva_items(); l++) + { + //prende il conto e lo mette nell'assoc_array dei conti (notare che, essendo un assoc_array,.. + //..non vengono inseriti doppioni! mitico!!) + TBill conto; + conto.get(pn.iva(l)); + const char* codconto = conto.string(0x8); + + //ad ogni conto lega un assoc_array (codivae) che conterra' tutti i codici iva legati a quel.. + //..conto nelle righe iva con i relativi importi + TAssoc_array* codivae = (TAssoc_array*) conti.objptr(codconto); + if (codivae == NULL) //se non esiste l'assoc_array legato al conto lo crea + { + codivae = new TAssoc_array; + //aggiunge all'assoc_array conti il suo elemento assoc_array codivae..ha un assoc_array.. + //..di assoc_array! + conti.add(codconto, codivae); + } + + const TString4 codiva = pn.iva(l).get(RMI_CODIVA); //prende il codice iva dalla riga iva + //aggiungere qui eventuale codice intero di indetraibilita' + + //ad ogni codiva presente in codivae lega un importo che risultera' la somma di tutti gli.. + //..importi con lo stesso conto e codice iva + real* tot_imp = (real*) codivae->objptr(codiva); + if (tot_imp == NULL) //se non esiste l'importo legato al codice iva lo crea + { + tot_imp = new real; + //aggiunge all'assoc_array codivae il suo elemento real tot_imp + codivae->add(codiva, tot_imp); + } + + //accresce l'importo tot_imp relativo alla coppia codiva+codconto corrente + const real imponibile = pn.iva(l).get_real(RMI_IMPONIBILE); + const real imposta = pn.iva(l).get_real(RMI_IMPOSTA); + const TString4 codind = pn.iva(l).get(RMI_TIPODET); + pn.analizza_riga_IVA(imponibile, imposta, caus, anno, codiva, codind, imp_detr, + iva_detr, imp_indetr, iva_indetr); + *tot_imp += imp_detr + imp_indetr + iva_indetr; + //aggiungere qui eventuale imposta + } + + TRecord_text recrigheiva; //istanzia il tipo record corretto da scrivere sul trasfilerighe + recrigheiva.set_type("I"); + int nrighe = 0; + + TRelation rel_rmoviva(LF_RMOVIVA); + rel_rmoviva.add(LF_MOV, "NUMREG==NUMREG"); + TCursor cur_rmoviva(&rel_rmoviva); + cur_rmoviva.curr(LF_MOV) = cur.curr(); + + const long analrigheiva_items = analmov.body().rows(); + + for (int n = 1; n <= analrigheiva_items; n++) + { + //scanning delle righe analitiche per estrarne i conti e controllare se compaiono nell'assoc_array.. + //..dei conti riempito con i conti trovati nelle righe iva + const TRectype& riga = analmov.body().row(n); + const TString& codconto = riga.get(RMOVANA_CODCONTO); + TAssoc_array* codivae = (TAssoc_array*) conti.objptr(codconto); //assoc_array codivae del codconto + + //se ha almeno un codice iva associato a questo conto nell'assoc_array dei conti.. + if (codivae != NULL) + { + //..prende l'importo della riga analitica.. + real importo_riga = riga.get_real(RMOVANA_IMPORTO); + //..lo ridistribuisce secondo le percentuali iva + TGeneric_distrib distributore(importo_riga, TCurrency::get_firm_dec()); + + FOR_EACH_ASSOC_OBJECT((*codivae), h, k, imp) + { + const real& imp_iva = *(real*)imp; + distributore.add(imp_iva); + } + + //crea una riga iva dal cursore, con numreg = numreg della testata del mov originale + TRectype& rigaiva = cur_rmoviva.curr(LF_RMOVIVA); + rigaiva.put(RMI_NUMREG, pn.curr().get(MOV_NUMREG)); + + //scan dell'assoc_array ridistribuito e inserimento dei valori nella riga iva appena creata + FOR_EACH_ASSOC_OBJECT((*codivae), hi, ki, impi) + { + rigaiva.put(RMI_NUMRIG, ++nrighe); + rigaiva.put(RMI_GRUPPO, codconto.mid(0,3)); + rigaiva.put(RMI_CONTO, codconto.mid(3,3)); + rigaiva.put(RMI_SOTTOCONTO, codconto.mid(6,6)); + const TBill zio(rigaiva); + rigaiva.put(RMI_TIPOC, zio.tipo()); + rigaiva.put(RMI_IMPONIBILE, distributore.get()); + rigaiva.put(RMI_CODIVA, ki); + + //deve sottrarre gli importi trovati dalle righe iva originali + sottrai_iva(pn, rigaiva); + + //scrittura delle righe di tipo I; notare che il cur passato alla autoload altri non e'.. + //..che la rigaiva appena completata + trasfilerighe->autoload(recrigheiva, cur_rmoviva); + + //procedura ignorante per stringare il codice clifo + if (zio.tipo() > ' ') + { + const long sottoconto = zio.sottoconto(); + TString cf; + cf.format("%ld", sottoconto); + recrigheiva.add(cf, 7); + } + + recrigheiva.add(riga.get(RMOVANA_DESCR).left(40), 8); //descrizione riga iva = riga anale corrente + recrigheiva.add(riga.get(RMOVANA_CODCMS), 13); //commessa presa dalla riga analitica corrente + + //procedura per scrivere la fase che deve essere spezzata in due per sottoprogetto ed edizione + const TString& codfase = riga.get(RMOVANA_CODFASE); + if (codfase.full()) + { + recrighe.add(codfase.left(4), 14); + recrighe.add(codfase.mid(4,4), 15); + } + + //procedura per ricavare la voce di spesa + TString uncle = zio.string(0x8); + const TString& vocespesa = get_vocespesa(uncle); + recrighe.add(vocespesa, 16); + + trasfilerighe->write(recrigheiva); + } + } //if(codivae!=.. + } //for(analmov.rows.. + + const long righeiva_items = pn.iva_items(); + if (righeiva_items > 0) + { + //deve trasferire le righe iva rimaste dopo la sottrazione degli importi dovuti alle righe analitiche + for (int m = 0; m < righeiva_items; m++) + { + const TRectype& riga = pn.iva(m); + if (!riga.get_real(RMI_IMPOSTA).is_zero()) + { + const TBill uncle(riga); + cur_rmoviva.curr() = riga; + trasfilerighe->autoload(recrigheiva, cur_rmoviva); + recrigheiva.add(uncle.tipo(), 6); //tipocf + recrigheiva.add(uncle.descrizione().left(40), 8); //descrizione della riga iva = descrizione conto + //procedura per ricavare la voce di spesa + TString zio = uncle.string(0x8); + const TString& vocespesa = get_vocespesa(zio); + recrighe.add(vocespesa, 14); + trasfilerighe->write(recrigheiva); + } + } + } + return true; +} + +bool TInvioP::sottrai_iva(TMovimentoPN& pn, const TRectype& rigaiva) +{ + const TBill zio(rigaiva); + const real imposta = rigaiva.get_real(RMI_IMPOSTA); + + int k; + //caso fortunato + //scandisce gli elementi dell'array;se ne trova uno (k-esimo) con conto ed importo coincidenti.. + //..con quelli passati al metodo, azzera l'importo di tale elemento dell'array + for (k = 0; k < pn.iva_items(); k++) + { + TRectype& iva_k = pn.iva(k); + const TBill conto_k(iva_k); + const real imposta_k = iva_k.get_real(RMI_IMPOSTA); + if (conto_k == zio && imposta_k == imposta) + { + iva_k.zero(RMI_IMPOSTA); + return true; + } + } + + //caso sfortunato + //in questo caso gli importi dell'elemento k-esimo dell'array e passato al metodo NON coincidono + real residuo = imposta; + int ultima_riga_buona = -1; + + for (k = 0; k < pn.iva_items() && !residuo.is_zero(); k++) + { + TRectype& iva_k = pn.iva(k); + const TBill conto_k(iva_k); + + if (conto_k == zio) + { + const real imposta_k = iva_k.get_real(RMI_IMPOSTA); + if (residuo >= imposta_k) + { + residuo -= imposta_k; + iva_k.zero(RMI_IMPOSTA); + } + else + { + iva_k.put(RMI_IMPOSTA, imposta_k - residuo); + residuo = ZERO; + } + ultima_riga_buona = k; + } + } + //alla fine del ciclo sull'array resta un residuo non nullo.. + if (!residuo.is_zero()) + { + if (ultima_riga_buona >= 0) + { + TRectype& iva_k = pn.iva(k); + iva_k.put(RMI_IMPOSTA, -residuo); + } + } + return true; +} + +void TInvioP::stringa_grcosot(TRecord_text& recrighe, const TString& zio) +{ + TString8 grcosot; + long gcs = 0; + + gcs = atoi(zio.left(3)); + grcosot.format("%d", gcs); + recrighe.add(grcosot, 3); //gruppo + + gcs = atoi(zio.mid(3,3)); + grcosot.format("%d", gcs); + recrighe.add(grcosot, 4); //conto + + gcs = atoi(zio.mid(6,6)); + grcosot.format("%d", gcs); + recrighe.add(grcosot, 5); //sottoconto +} + +// Calcola il totale del documento tenendo conto del segno della prima riga e di quella delle +// ritenute sociali sulla causale +real TInvioP::totale_documento(TMovimentoPN& pn, const bool includi_ritenute) const +{ + //testata del movimento di prima nota + const TRectype& mov = pn.curr(); + + real tot = mov.get_real(MOV_TOTDOC); // Legge totale + //i conti sulle ritenute li deve fare solo se il movimento e' iva!! + if (pn.iva_items() > 0) + { + if (includi_ritenute) + { + const real ritfis = mov.get_real(MOV_RITFIS); + tot += ritfis; // Somma ritenute fiscali + + const real ritsoc = mov.get_real(MOV_RITSOC); + + if (!ritsoc.is_zero()) + { + TCausale caus(mov.get(MOV_CODCAUS)); + const bool swapt = test_swap(caus, false); // Totale invertito ? + const bool swaps = test_swap(caus, true); // Ritenute sociali invertite ? + if (swapt ^ swaps) // Somma ritenute sociali con segno + tot -= ritsoc; + else + tot += ritsoc; + } + } + } + else //movimenti non iva; calcolo delle ritenute + { + TCausale caus(mov.get(MOV_CODCAUS)); + const char sez = caus.sezione_clifo(); + bool tot_is_zero = tot.is_zero(); + TImporto totdoc(sez, tot); + for (int i = 0; i < pn.cg_items(); i++) + { + const TRectype& rmov = pn.cg(i); + const TBill conto(rmov); + const TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO)); + + if (tot_is_zero && rmov.get_char(RMV_TIPOC) > ' ') + totdoc += importo; + else + { + if (includi_ritenute && (cerca_fiscali(conto) || cerca_sociali(conto))) + totdoc += importo; //valore da stampare nella colonna Tot.fattura con ritenute + } + } + tot = totdoc.valore(); + } + return tot; +} + +// Controlla sulla causale se il segno del totale documento (ritsoc=FALSE) +// o quello delle ritenute sociali (ritsoc=TRUE) e' invertito rispetto al normale +bool TInvioP::test_swap(TCausale& caus, bool ritsoc) const +{ + const char sez = ritsoc ? caus.sezione_ritsoc() : caus.sezione_clifo(); + const bool s = (caus.iva() == iva_vendite) ^ (sez == 'D'); + return s; +} + +bool TInvioP::cerca_conto(const TBill& bill, const TAssoc_array& assoc, const char tipoconto) const +{ + TToken_string key(15); + key.add(tipoconto); //il primo char della tokenstring e' il tipoconto (Fiscale o Sociale) + + key.add(bill.gruppo()); + if (assoc.is_key(key)) + return true; + + key.add(bill.conto()); + if (assoc.is_key(key)) + return true; + + key.add(bill.sottoconto()); + if (assoc.is_key(key)) + return true; + + return false; +} + +int TInvioP::cerca_costo(const TBill& bill) const +{ + if (cerca_conto(bill, _costi, 'C')) + return 1; + else + return 0; +} + +int TInvioP::cerca_pagamento(const TBill& bill) const +{ + if (cerca_conto(bill, _pagamenti, 'P')) + return 2; + else + return 0; +} + +bool TInvioP::cerca_fiscali(const TBill& bill) const +{ + if (bill.tipo() > ' ') //non si vogliono i conti tipo Cliente Fornitore + return false; + + return cerca_conto(bill, _fiscali, 'F'); +} + +bool TInvioP::cerca_sociali(const TBill& bill) const +{ + if (bill.tipo() > ' ') //non si vogliono i conti tipo Cliente Fornitore + return false; + + return cerca_conto(bill, _sociali, 'S'); +} + +void TInvioP::lettura_conti(TAssoc_array& assoc, const char tipoconto) +{ + TConfig conti("ca3600a.ini","Pdcc"); //paragrafo da scandire nell'ini + TAssoc_array& vars = conti.list_variables(); + + FOR_EACH_ASSOC_STRING(vars, h, k, val) //riempie l'assoc con i soli valori del paragrafo dell'ini + { + if (*val == tipoconto) //mette nell'assocarray solo i conti corrispondenti al tipoconto passato + assoc.add(val); + } +} + +void TInvioP::calcola_imposte(const real& importo, const real& imposta, + const TString& codind, real& iva_det, real& iva_ind) const +{ + iva_det = imposta; + iva_ind = ZERO; + + //esiste un codice di indetraibilita'? + if (codind.full()) + { + real perc = ZERO; + const TRectype& rec = cache().get("%DET", codind); + if (rec.empty()) + { + if (strchr("139", codind[0]) != NULL) // Clausola di salvaguardia + perc = CENTO; + } + else + { + if (rec.get_int("I0") > 0) + perc = rec.get_real("R0"); + } + //valori delle varie ive + iva_ind = imposta * perc / CENTO; + iva_ind.round(2); + iva_det = imposta - iva_ind; + } +} + +bool TInvioP::calcola_imponibile_totdoc(const long nreg, const TRectype& pag_rec, real& imponibile, real& totdoc, real& totpagato, real& iva_indetraibile) const +{ + totpagato = pag_rec.get_real(PAGSCA_IMPORTO); + + TMovimentoPN pn; + pn.curr().put(MOV_NUMREG, nreg); + bool ok = nreg > 0 && pn.read() == NOERR; + if (ok) + { + //percentuale di pagamento sul totale documento senza ritenute + const real totdoc_no_rit = totale_documento(pn, false); + const real perc_ritenute = totpagato / totdoc_no_rit; + //Movimenti CON SALDACONTO + //se movimento IVA.. + if (pn.iva_items() > 0) + { + real imposta; + const TRectype& movfat = pn.curr(); + + real ritfis = movfat.get_real(MOV_RITFIS); //ritenute sulla fattura: verranno pagate percentualmente + if (perc_ritenute < UNO) + { + ritfis *= perc_ritenute; + ritfis.round(2); + } + totpagato += pag_rec.get_real(PAGSCA_RITENUTE); //ritenute eventuali sul pagamento + totpagato += ritfis; + + //Le ritenute sociali invece vanno testate con la test_swap.. + real ritsoc = movfat.get_real(MOV_RITSOC); + if (perc_ritenute < UNO) + { + ritsoc *= perc_ritenute; + ritsoc.round(2); + } + ritsoc += pag_rec.get_real(PAGSCA_RITSOC); + + if (!ritsoc.is_zero()) + { + const TRectype& mov = pn.curr(); + TCausale caus(mov.get(MOV_CODCAUS)); + const bool swapt = test_swap(caus, false); // Totale invertito ? + const bool swaps = test_swap(caus, true); // Ritenute sociali invertite ? + if (swapt ^ swaps) // Somma ritenute sociali con segno + totpagato -= ritsoc; + else + totpagato += ritsoc; + } + for (int i = 0; i < pn.iva_items(); i++) + { + const TRectype& rmoviva = pn.iva(i); + const TBill conto(rmoviva); + + if (conto.indicatore_bilancio() != 5) + { + const real importo = rmoviva.get_real(RMI_IMPONIBILE); + const real iva = rmoviva.get_real(RMI_IMPOSTA); + //trattamento delle ive indetraibili! + const TString& codind = rmoviva.get(RMI_TIPODET); + + imponibile += importo; + + real iva_det, iva_ind; + //calcola i valori dell'iva detraibile e delle ive indetraibili in diverse percentuali + calcola_imposte(importo, iva, codind, iva_det, iva_ind); + //se esiste un'iva indetraibile.. + if (iva_ind != ZERO) + { + iva_indetraibile += iva_ind; + imponibile += iva_ind; + } + //l'iva detraibile va sempre bene sommata alle imposte + imposta += iva_det; + } + } + totdoc = totale_documento(pn); //tot doc con ritenute fiscali + ritenute sociali + + } //if pn.iva_items().. + else //NON iva + { + totdoc = totale_documento(pn); //tot doc con ritenute fiscali + ritenute sociali + imponibile = totdoc; //nel caso di non iva + + TCausale caus(pn.curr().get(MOV_CODCAUS)); + TImporto totpag(caus.sezione_clifo(), totpagato); + for (int i = 0; i < pn.cg_items(); i++) + { + const TRectype& rmov = pn.cg(i); + const TBill conto(rmov); + if (cerca_fiscali(conto) || cerca_sociali(conto)) + { + real imp = rmov.get_real(RMV_IMPORTO); + if (perc_ritenute < UNO) + { + imp *= perc_ritenute; + imp.round(2); + } + const TImporto importo(rmov.get_char(RMV_SEZIONE), imp); + totpag += importo; //valore da stampare nella colonna Tot.fattura con ritenute + } + } + totpagato = totpag.valore(); + } + } //if (pn.read() == NOERR + return ok; +} + +real TInvioP::calcola_pagamento(TRectype& curpag_rec, real& iva_indetraibile) +{ + //deve costruirsi la riga di partita che riguarda il documento di origine + //per prima cosa crea tale riga a partire dal pagamento, che ha una chiave lunghissima... + TToken_string key_part; + key_part.add(curpag_rec.get(PAGSCA_TIPOC)); + key_part.add(curpag_rec.get(PAGSCA_GRUPPO)); + key_part.add(curpag_rec.get(PAGSCA_CONTO)); + key_part.add(curpag_rec.get(PAGSCA_SOTTOCONTO)); + key_part.add(curpag_rec.get(PAGSCA_ANNO)); + key_part.add(curpag_rec.get(PAGSCA_NUMPART)); + key_part.add(curpag_rec.get(PAGSCA_NRIGA)); + //..ecco il record delle partite.. + const TRectype& rec_partite = cache().get(LF_PARTITE, key_part); + //..da cui prende nreg + const long nreg = rec_partite.get_long(PART_NREG); + //se nreg esiste... + + //dichiariamo una serie di simpatici real utilizzati in seguito + real totdoc,imponibile,totpagato; + + if (calcola_imponibile_totdoc(nreg, curpag_rec, imponibile, totdoc, totpagato, iva_indetraibile)) + { + const real percentuale = totpagato /totdoc; + //cerca se esiste una fattura da ricevere anteriore alla fattura da pagare + const long fdr = calcola_fattura_originale(nreg); + //se la trova deve tenerne conto in quanto la presente fattura (nreg) potrebbe pagare solo.. + //..una parte della fdr originale + if (fdr != nreg) + { + real imponibile_fdr, totdoc_fdr, totpagato_fdr, iva_indetraibile_fdr; + //riutilizza la calcola_imponibile_totdoc per l'fdr;si fa notare che in questo caso gli.. + //..ultimi due parametri del metodo sono del tutto inutili + if (calcola_imponibile_totdoc(fdr, curpag_rec, imponibile_fdr, totdoc_fdr, totpagato_fdr, iva_indetraibile_fdr)) + { + const real rapporto_pagati = totdoc / totdoc_fdr; + const real rapporto_imponibili = imponibile_fdr / imponibile; + //la fattura con totdoc paga una parte di una precedente fdr con totdoc maggiore! + //in questo caso totpagato e' quello della fattura e deve uscire senza ricalcolare.. + //..percentuali e cazzi vari (funziona ststisticamente!) + if (rapporto_pagati >= 0.7) + imponibile = imponibile_fdr; + + if (rapporto_imponibili < 0.7 || rapporto_imponibili > 0.85) + iva_indetraibile = ZERO; + } + } //if(fdr!=nreg.. + else //se non esiste una fdr eventuali ive indetraibili non sussistono + iva_indetraibile = ZERO; + + //calcolo finale del pagato + totpagato = imponibile * percentuale; + totpagato.round(2); + + } //if(calcola_imponibile_totdoc(nreg,... + + return totpagato; +} + +long TInvioP::calcola_fattura_originale(long nreg) const +{ + //prende il movimento del pagamento + const TRectype& mov = cache().get(LF_MOV, nreg); + + TToken_string key; + key.add(mov.get(MOV_DCODNUM)); + key.add(mov.get(MOV_DANNO)); + key.add(mov.get(MOV_DPROVV)); + key.add(mov.get(MOV_DNDOC)); + //crea il documento da cui deriva tale movimento (per il CSA e' in genere una fattura) + + TRecord_array doc(key, LF_RIGHEDOC); + for (int i = 1; i <= doc.rows(); i++) + { + const TRectype& rdoc = doc.row(i); + const TString& dacodnum = rdoc.get(RDOC_DACODNUM); + if (dacodnum.full()) + { + const TRectype& num_rec = cache().get("%NUM", dacodnum); + if (num_rec.get_bool("B3")) + { + key = rdoc.get(RDOC_DAPROVV); + key.add(rdoc.get(RDOC_DAANNO)); + key.add(dacodnum); + key.add(rdoc.get(RDOC_DANDOC)); + //cerca da quale documento deriva la fattura (la prima riga che trova e' ok) + const TRectype& original_doc = cache().get(LF_DOC, key); + //se trova il documento origine (per il CSA e' in genere una FDR) -> prende il suo nreg.. + //..come nreg da ritornare (attenzione che se il doc originale non e' stato contabilizzato.. + //..nreg diventa 0!) + if (!original_doc.empty()) + { + nreg = original_doc.get_long(DOC_NUMREG); + } + } + break; + } + } + return nreg; +} + +// oggetto che serve per memorizzare importo e flag acc/sal dei pagamenti.. +//..(usato nel trasferimento pagamenti) +struct TPay_info : public TObject +{ + real _somma; + char _accsal; +}; + +bool TInvioP::i_proforma_pagamenti() +{ + TInvioP_file* trasfilepag = apri_file("pagament"); + + TRectype da(LF_MOV); + TRectype a(LF_MOV); + da.put(MOV_DATAREG, _dataini); + a.put(MOV_DATAREG, _datafin); + TRelation rel(LF_MOV); + rel.add(LF_CAUSALI, "CODCAUS==CODCAUS"); + TCursor cur(&rel, "", 2, &da, &a); + const long cur_items = cur.items(); + + if (cur_items != 0) + { + //se ha almeno un movimento carica lo sheet dei conti che gli servira' in seguito nel calcolo.. + //..delle ritenute + lettura_conti(_fiscali, 'F'); + lettura_conti(_sociali, 'S'); + lettura_conti(_costi, 'C'); + lettura_conti(_pagamenti, 'P'); + + TProgind pi(cur_items, "Trasferimento pagamenti...", true, true); + + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + if (!pi.addstatus(1)) + break; + + //pagamenti saldacontati! vedi l'else per quelli non saldacontati + const tipo_movimento tipomov = (tipo_movimento)cur_rec.get_int(MOV_TIPOMOV); + if (tipomov == tm_pagamento || tipomov == tm_nota_credito || tipomov == tm_pagamento_insoluto) + { + //attraverso le partite,noto il MOV_NUMREG,riesce a collegarsi al pagamento in LF_PAGSCA + TRelation relpart(LF_PARTITE); + TRectype da(LF_PARTITE); + da.put(PART_NREG, cur_rec.get(MOV_NUMREG)); + TCursor curpart(&relpart, "", 2, &da, &da); + const long curpart_items = curpart.items(); + //se trova la partita relativa al numreg... + if (curpart_items != 0) + { + curpart.freeze(); + TRectype& curpart_rec = curpart.curr(); + TRelation relpag(LF_PAGSCA); + TRectype da(LF_PAGSCA); + //..collega i pagamenti filtrando con i parametri estratti dalle partite + for (curpart = 0; curpart.pos() < curpart_items; ++(curpart)) + { + da.put(PAGSCA_TIPOC, curpart_rec.get(PART_TIPOCF)); + da.put(PAGSCA_GRUPPO, curpart_rec.get(PART_GRUPPO)); + da.put(PAGSCA_CONTO, curpart_rec.get(PART_CONTO)); + da.put(PAGSCA_SOTTOCONTO, curpart_rec.get(PART_SOTTOCONTO)); + da.put(PAGSCA_ANNO, curpart_rec.get(PART_ANNO)); + da.put(PAGSCA_NUMPART, curpart_rec.get(PART_NUMPART)); + const int nrigapart = curpart_rec.get_int(PART_NRIGA); + TString80 filtro; + filtro.format("NRIGP == %d", nrigapart); + TCursor curpag(&relpag, filtro, 1, &da, &da); + const long curpag_items = curpag.items(); + + real iva_indet = ZERO; //valore dell'eventuale iva indetraibile + + //se trova i pagamenti,che sono alla fin fine cio' che cerca... + if (curpag_items != 0) + { + TAssoc_array pagame; + pagame.destroy(); + curpag.freeze(); + TRectype& curpag_rec = curpag.curr(); + for (curpag = 0; curpag.pos() < curpag_items; ++(curpag)) + { + TString80 indice = curpag_rec.get(PAGSCA_ANNO); + indice << '|' << curpag_rec.get(PAGSCA_NUMPART); + indice << '|' << curpag_rec.get(PAGSCA_NRIGA); + + TPay_info* pi = (TPay_info*)pagame.objptr(indice); + if (pi == NULL) + { + pi = new TPay_info; + pi->_accsal = 'A'; + pagame.add(indice, pi); + } + + //ricava l'importo del pagamento e lo aggiunge al memorizzatore + const real importo_pagato = calcola_pagamento(curpag_rec, iva_indet); + pi->_somma += importo_pagato; + if (curpag_rec.get_char(PAGSCA_ACCSAL) == 'S') + pi->_accsal = 'S'; + } + + // scrive i record risultanti + for (TPay_info* pi = (TPay_info*)pagame.first_item(); pi != NULL; pi = (TPay_info*)pagame.succ_item()) + { + TToken_string keypart; + keypart.add(curpart_rec.get(PART_TIPOCF)); + keypart.add(curpart_rec.get(PART_GRUPPO)); + keypart.add(curpart_rec.get(PART_CONTO)); + keypart.add(curpart_rec.get(PART_SOTTOCONTO)); + keypart.add(pagame.get_hashobj()->key()); + const TRectype& fattura = cache().get(LF_PARTITE, keypart); + _nregpag = cur_rec.get_long(MOV_NUMREG); //registrazione del movimento di pagamento + //deve cercare la prima registrazione da cui deriva il pagamento.. + const long nregfatt = fattura.get_long(PART_NREG); + _nregcosto = calcola_fattura_originale(nregfatt); + _importo = pi->_somma; + _accsal = pi->_accsal; + //..e finalmente scrive 'sta minchia di riga + TRecord_text recpag; + recpag.set_type("G"); + trasfilepag->autoload(recpag, curpag); + trasfilepag->write(recpag); + + //se ha una riga di iva indetraibile dovuta al cambio regime fiscale 2005->2006.. + //..deve aggiungere una ulteriore riga!! + if (iva_indet > ZERO) + { + _nregcosto = nregfatt; + _importo = iva_indet; + _accsal = 'S'; + recpag.set_type("G"); + trasfilepag->autoload(recpag, curpag); + trasfilepag->write(recpag); + } + } + + }//if curpag_items.. + }//for curpart =.. + }//if curpart_items.. + + }//if tipomov ==.. + if (tipomov == tm_nessuno) //tocca ai pagamenti NON saldacontati (procedura analoga a quella della stampa del pagato) + { + const long numregcg = cur_rec.get_long(MOV_NUMREG); + + //cerca un record di MOVANA che abbia numregcg = nreg;usa il nuovo metodo fighissimo.. + //..con la isam query + TString& query = get_tmp_string(); + query << "USE MOVANA KEY 3\n"; + query << "FROM NUMREGCG=" << numregcg << "\n"; + query << "TO NUMREGCG=" << numregcg; + + TISAM_recordset movana(query); + const TRecnotype items = movana.items(); + + if (items > 0) + { + if (items > 1) + error_box(TR("Esiste piu' di un movimento analitico collegato al movimento contabile %ld"),numregcg); + + movana.move_last(); //si posiziona sul record corretto + + //crea il movana legato al mov + const TAnal_mov anal_mov(cur_rec); + const TRecord_array& anal_rows = anal_mov.body(); + + for (int j = 1; j <= anal_rows.rows(); j++) //scansiona righe analitiche.. + { + const TRectype& anal_row = anal_rows[j]; + + //prende il conto sulla riga analitica e lo confronta con quelli della configurazione + const TString& conto_riga_analitica = anal_row.get(RMOVANA_CODCONTO); + const int gruppo_anal = atoi(conto_riga_analitica.left(3)); + const int conto_anal = atoi(conto_riga_analitica.mid(3,3)); + const long sottoconto_anal = atol(conto_riga_analitica.mid(6,6)); + + const TBill conto(gruppo_anal, conto_anal, sottoconto_anal); + int tipo = cerca_costo(conto) || cerca_pagamento(conto); + if (tipo > 0) + { + const char sezione = anal_row.get_char(RMOVANA_SEZIONE); + const real valore = anal_row.get_real(RMOVANA_IMPORTO); + TImporto imp(sezione, valore); + + switch (tipo) + { + case 1:imp.normalize('D');break; + case 2:imp.normalize('A');break; + default:break; + } + _nregpag = numregcg; + _nregcosto = numregcg; + _importo = imp.valore(); + //deve stabilire adesso se acconto o saldo controllando gli importi + _accsal = 'S'; + + //e finalmente aggiunge il record al file di esportazione + TRecord_text recpag; + recpag.set_type("G"); + trasfilepag->autoload(recpag, *movana.cursor()); + trasfilepag->write(recpag); + } //if (tipo > 0.. + + } //for(j0... + + } //else if tipomov ==.. + + }//for cur =.. + }//if cur_items.. + + chiudi_file(trasfilepag); + return true; +} + +bool TInvioP::i_proforma_clifor(char tipocf) +{ + TInvioP_file* trasfile = NULL; + + TString progind_string = "Trasferimento "; + + if (tipocf == 'C') + { + trasfile = apri_file("clienti"); + progind_string << "clienti"; + } + else + { + trasfile = apri_file("fornit"); + progind_string << "fornitori"; + } + + TString80 filtro = ""; + filtro.format("TIPOCF == \"%c\"", tipocf); + TRelation rel(LF_CLIFO); + rel.add(LF_COMUNI, "STATO==STATOCF|COM==COMCF", 1); + TCursor cur(&rel, filtro); + const long cur_items = cur.items(); + + if (cur_items != 0) + { + progind_string << "..."; + TProgind pi(cur_items, progind_string, true, true); + + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + pi.addstatus(1); + if (pi.iscancelled()) + break; + + TRecord_text rec; + rec.set_type("C"); + trasfile->autoload(rec, cur); + trasfile->write(rec); + } + } + chiudi_file(trasfile); + return true; +} + +//"metodo dei metodi":in base ai parametri della maschera esegue la procedura indicata +void TInvioP::invio_proforma() +{ + if (_msk->get_bool(F_MOVIMENTI)) + i_proforma_movimenti(); + if (_msk->get_bool(F_PAGAMENTI)) + i_proforma_pagamenti(); + if (_msk->get_bool(F_CLIENTI)) + i_proforma_clifor(); + if (_msk->get_bool(F_FORNITORI)) + i_proforma_clifor('F'); + if (_msk->get_bool(F_CONTI)) + i_proforma_conti(); +} + +bool TInvioP::create() +{ + _msk = new TInvioP_mask(); + _configfile = new TConfig("tc9100a.ini"); + return TSkeleton_application::create(); +} + +bool TInvioP::destroy() +{ + if (_configfile != NULL) + delete _configfile; + delete _msk; + + return TSkeleton_application::destroy(); +} + +void TInvioP::main_loop() +{ + //il programma si puo' usare SOLO se in contabilita' analitica si usa il piano dei conti contabile + TConfig& cfg = ca_config(); + const bool use_pdcc = cfg.get_bool("UsePdcc"); + if (!use_pdcc) + { + error_box(TR("Programma funzionante SOLO se in contabilita' analitica si usa il piano dei conti contabile")); + return; + } + + TFilename configname = "tc9100conf.ini"; //file configurazione della maschera + configname.custom_path(); + TConfig configfile(configname); + _msk->set(F_DATAINI, configfile.get("DATA","OPZIONI")); + _msk->set(F_DESTINAZIONE, configfile.get("PERCORSO","OPZIONI")); + + while (_msk->run()!=K_QUIT) + { + configfile.set("DATA", _msk->get_date(F_DATAFIN),"OPZIONI"); + configfile.set("PERCORSO", _msk->get(F_DESTINAZIONE),"OPZIONI"); + _dataini = _msk->get_date(F_DATAINI); + _datafin = _msk->get_date(F_DATAFIN); + const char tipoinvio = _msk->get(F_TIPOINVIO)[0]; + if (tipoinvio == 'P') + invio_proforma(); //dopo aver preso i parametri dalla maschera chiama il "metodo dei metodi" + } +} + +int tc9100(int argc, char **argv) +{ + TInvioP a; + a.run(argc, argv, "Invio dati contabilità a Proforma"); + + return 0; +} diff --git a/tc/tc9100a.h b/tc/tc9100a.h new file mode 100755 index 000000000..4f35bf6a5 --- /dev/null +++ b/tc/tc9100a.h @@ -0,0 +1,23 @@ +// invio dati ad altra procedura (Proforma) + +#define F_CODDITTA 301 +#define F_RAGSOC 302 +#define F_MOVIMENTI 303 +#define F_CLIENTI 304 +#define F_FORNITORI 305 +#define F_CONTI 306 +#define F_PAGAMENTI 307 +#define F_TIPOINVIO 308 +#define F_DESTINAZIONE 309 +#define F_DATAINI 310 +#define F_DATAFIN 311 +#define F_RIPRISTINA 312 +#define F_DATARIPRISTINO 313 + +#define F_PDCC 315 + +#define S_TIPO 101 +#define S_GRUPPO 102 +#define S_CONTO 103 +#define S_SOTTOCONTO 104 +#define S_DESCRIZIONE 105 diff --git a/tc/tc9100a.ini b/tc/tc9100a.ini new file mode 100755 index 000000000..892943b26 --- /dev/null +++ b/tc/tc9100a.ini @@ -0,0 +1,432 @@ +[MAIN] +DECSEP = , +FIELDSEP = +RECORDSEP = +RECORDSIZE = +SKIPLINES = 0 +TYPEFIELD = -1 +TYPELEN = -1 +TYPEPOS = -1 + +[TYPE STRINGA] +ALIGN = L +DATA = S +DECIMAL = 0 +FILLER = ' ' +LENGTH = 0 +PICTURE = + +[TYPE NUMERO] +ALIGN = R +DATA = N +DECIMAL = 0 +FILLER = '0' +PICTURE = + +[TYPE DATA] +ALIGN = +DATA = D +DECIMAL = 0 +FILLER = '0' +LENGTH = 8 +PICTURE = 1444 + +[TYPE IMPORTO] +ALIGN = R +DATA = N +DECIMAL = 2 +FILLER = '0' +LENGTH = 14 +PICTURE = @@@@@@@@@,@@ + +[RECORD T] + +NAME(0) = ID REGISTRAZIONE +TYPE(0) = NUMERO +POSITION(0) = 0 +LENGTH(0) = 10 +FIELD(0) = NUMREG + +NAME(1) = DATA REGISTRAZIONE +TYPE(1) = DATA +POSITION(1) = 10 +LENGTH(1) = 8 +FIELD(1) = DATAREG + +NAME(2) = CODICE CAUSALE +TYPE(2) = STRINGA +POSITION(2) = 18 +LENGTH(2) = 3 +FIELD(2) = CODCAUS + +NAME(3) = DESCRIZIONE CAUSALE +TYPE(3) = STRINGA +POSITION(3) = 21 +LENGTH(3) = 40 +FIELD(3) = 26->DESCR[1,40] + +NAME(4) = DESCRIZIONE TESTATA +TYPE(4) = STRINGA +POSITION(4) = 61 +LENGTH(4) = 240 +FIELD(4) = DESCR[1,40] + +NAME(5) = DATA DOCUMENTO +TYPE(5) = DATA +POSITION(5) = 301 +LENGTH(5) = 8 +FIELD(5) = DATADOC + +NAME(6) = NUMERO DOCUMENTO +TYPE(6) = STRINGA +POSITION(6) = 309 +LENGTH(6) = 6 +FIELD(6) = NUMDOC + +NAME(7) = TIPO DOCUMENTO +TYPE(7) = STRINGA +POSITION(7) = 315 +LENGTH(7) = 30 + +NAME(8) = CODICE CLIFOR +TYPE(8) = STRINGA +POSITION(8) = 345 +LENGTH(8) = 10 +FIELD(8) = CODCF + +NAME(9) = TOTALE IMPONIBILE +TYPE(9) = IMPORTO +POSITION(9) = 355 + +NAME(10) = TOTALE IVA +TYPE(10) = IMPORTO +POSITION(10) = 369 + +NAME(11) = TOTALE DOCUMENTO +TYPE(11) = IMPORTO +POSITION(11) = 383 +FIELD(11) = TOTDOC + +NAME(12) = DATA PAGAMENTO +TYPE(12) = DATA +POSITION(12) = 397 +LENGTH(12) = 8 + +NAME(13) = TIPO PAGAMENTO +TYPE(13) = STRINGA +POSITION(13) = 405 +LENGTH(13) = 20 +FIELD(13) = CODPAG + +NAME(14) = DATA COMPETENZA +TYPE(14) = DATA +POSITION(14) = 425 +LENGTH(14) = 8 +FIELD(14) = DATACOMP + +NAME(15) = NUMERO PROTOCOLLO +TYPE(15) = STRINGA +POSITION(15) = 433 +LENGTH(15) = 10 +FIELD(15) = PROTIVA + +NAME(16) = VALUTA +TYPE(16) = STRINGA +POSITION(16) = 443 +LENGTH(16) = 1 +MESSAGE(16)=_FISSO,!1 + +[RECORD R] + +NAME(0) = ID REGISTRAZIONE +TYPE(0) = NUMERO +POSITION(0) = 0 +LENGTH(0) = 10 +FIELD(0) = 23->NUMREG + +NAME(1) = FLAG RIGA IVA +TYPE(1) = STRINGA +POSITION(1) = 10 +LENGTH(1) = 1 +MESSAGE(1) = _FISSO,!N + +NAME(2) = FLAG DARE/AVERE +TYPE(2) = STRINGA +POSITION(2) = 11 +LENGTH(2) = 1 +FIELD(2) = SEZIONE + +NAME(3) = CODICE MASTRO +TYPE(3) = STRINGA +POSITION(3) = 12 +LENGTH(3) = 5 + +NAME(4) = CODICE CONTO +TYPE(4) = STRINGA +POSITION(4) = 17 +LENGTH(4) = 5 + +NAME(5) = CODICE SOTTOCONTO +TYPE(5) = STRINGA +POSITION(5) = 22 +LENGTH(5) = 5 + +NAME(6) = FLAG CLIFOR +TYPE(6) = STRINGA +POSITION(6) = 27 +LENGTH(6) = 1 + +NAME(7) = CODICE CLIFOR +TYPE(7) = STRINGA +POSITION(7) = 28 +LENGTH(7) = 10 + +NAME(8) = DESCRIZIONE RIGA +TYPE(8) = STRINGA +POSITION(8) = 38 +LENGTH(8) = 40 +FIELD(8) = DESCR[1,40] + +NAME(9) = IMPORTO SOTTOCONTO +TYPE(9) = IMPORTO +POSITION(9) = 78 +FIELD(9) = IMPORTO + +NAME(10) = IMPONIBILE +TYPE(10) = IMPORTO +POSITION(10) = 92 + +NAME(11) = CODICE IVA +TYPE(11) = STRINGA +POSITION(11) = 106 +LENGTH(11) = 4 + +NAME(12) = CP INDED +TYPE(12) = STRINGA +POSITION(12) = 110 +LENGTH(12) = 15 + +NAME(13) = COMMESSA +TYPE(13) = STRINGA +POSITION(13) = 125 +LENGTH(13) = 20 +FIELD(13) = CODCMS + +NAME(14) = SOTTOPROGETTO +TYPE(14) = STRINGA +POSITION(14) = 145 +LENGTH(14) = 20 + +NAME(15) = EDIZIONE +TYPE(15) = STRINGA +POSITION(15) = 165 +LENGTH(15) = 20 + +NAME(16) = VOCE DI SPESA +TYPE(16) = STRINGA +POSITION(16) = 185 +LENGTH(16) = 10 + +[RECORD I] + +NAME(0) = ID REGISTRAZIONE +TYPE(0) = NUMERO +POSITION(0) = 0 +LENGTH(0) = 10 +FIELD(0) = NUMREG + +NAME(1) = FLAG RIGA IVA +TYPE(1) = STRINGA +POSITION(1) = 10 +LENGTH(1) = 1 +MESSAGE(1) = _FISSO,!S + +NAME(3) = CODICE MASTRO +TYPE(3) = STRINGA +POSITION(3) = 12 +LENGTH(3) = 5 +FIELD(3) = GRUPPO + +NAME(4) = CODICE CONTO +TYPE(4) = STRINGA +POSITION(4) = 17 +LENGTH(4) = 5 +FIELD(4) = CONTO + +NAME(5) = CODICE SOTTOCONTO +TYPE(5) = STRINGA +POSITION(5) = 22 +LENGTH(5) = 5 +FIELD(5) = SOTTOCONTO + +NAME(6) = FLAG CLIFOR +TYPE(6) = STRINGA +POSITION(6) = 27 +LENGTH(6) = 1 +FIELD(6) = TIPOC + +NAME(7) = CODICE CLIFOR +TYPE(7) = STRINGA +POSITION(7) = 28 +LENGTH(7) = 10 + +NAME(8) = DESCRIZIONE RIGA +TYPE(8) = STRINGA +POSITION(8) = 38 +LENGTH(8) = 40 + +NAME(9) = IMPORTO SOTTOCONTO +TYPE(9) = IMPORTO +POSITION(9) = 78 + +NAME(10) = IMPONIBILE +TYPE(10) = IMPORTO +POSITION(10) = 92 +FIELD(10) = IMPONIBILE + +NAME(11) = CODICE IVA +TYPE(11) = STRINGA +POSITION(11) = 106 +LENGTH(11) = 4 +FIELD(11) = CODIVA + +NAME(12) = CP INDED +TYPE(12) = STRINGA +POSITION(12) = 110 +LENGTH(12) = 15 + +NAME(13) = COMMESSA +TYPE(13) = STRINGA +POSITION(13) = 125 +LENGTH(13) = 20 + +NAME(14) = SOTTOPROGETTO +TYPE(14) = STRINGA +POSITION(14) = 145 +LENGTH(14) = 20 + +NAME(15) = EDIZIONE +TYPE(15) = STRINGA +POSITION(15) = 165 +LENGTH(15) = 20 + +NAME(16) = VOCE DI SPESA +TYPE(16) = STRINGA +POSITION(16) = 185 +LENGTH(16) = 10 + + +[RECORD C] + +NAME(0) = CODICE +TYPE(0) = STRINGA +POSITION(0) = 0 +LENGTH(0) = 10 +FIELD(0) = 20->CODCF + +NAME(1) = RAGIONE SOCIALE +TYPE(1) = STRINGA +POSITION(1) = 11 +LENGTH(1) = 40 +MESSAGE(1) = _RAGSOC +FIELD(1) = 20->RAGSOC + +NAME(2) = PARTITA IVA +TYPE(2) = STRINGA +POSITION(2) = 50 +LENGTH(2) = 12 +FIELD(2)=20->PAIV + +NAME(3) = CODICE FISCALE +TYPE(3) = STRINGA +POSITION(3) = 62 +LENGTH(3) = 16 +FIELD(3) = 20->COFI + +NAME(4) = INDIRIZZO +TYPE(4) = STRINGA +POSITION(4) = 78 +LENGTH(4) = 40 +FIELD(4) = 20->INDCF + +NAME(5) = CAP DI RESIDENZA +TYPE(5) = STRINGA +POSITION(5) = 118 +LENGTH(5) = 5 +FIELD(5)=20->CAPCF + +NAME(6) = COMUNE DI RESIDENZA +TYPE(6) = STRINGA +POSITION(6) = 123 +LENGTH(6) = 23 +FIELD(6) = 13->DENCOM[1,40] + +NAME(7) = PROVINCIA DI RESIDENZA +TYPE(7) = STRINGA +POSITION(7) = 163 +LENGTH(7) = 2 +FIELD(7) = 13->PROVCOM + +NAME(8) = TELEFONO +TYPE(8) = STRINGA +POSITION(8) = 165 +LENGTH(8) = 20 +FIELD(8) = 20->TEL +MESSAGE(8) = _TELEFONO + +[RECORD P] + +NAME(0) = CODICE MASTRO +TYPE(0) = STRINGA +POSITION(0) = 0 +LENGTH(0) = 5 +FIELD(0)=19->GRUPPO + +NAME(1) = CODICE CONTO +TYPE(1) = STRINGA +POSITION(1) = 5 +B LENGTH(1) = 5 +FIELD(1)=19->CONTO + +NAME(2) = CODICE SOTTOCONTO +TYPE(2) = STRINGA +POSITION(2) = 10 +LENGTH(2) = 5 +FIELD(2)=19->SOTTOCONTO + +NAME(3) = DESCRIZIONE +TYPE(3) = STRINGA +POSITION(3) = 15 +LENGTH(3) = 80 +FIELD(3)=19->DESCR + +[RECORD G] + +NAME(0) = ID REGISTRAZIONE PAGAMENTO +TYPE(0) = NUMERO +POSITION(0) = 0 +LENGTH(0) = 10 +MESSAGE(0) = _NREGPAG + +NAME(1) = ID REGISTRAZIONE COSTO +TYPE(1) = NUMERO +POSITION(1) = 10 +LENGTH(1) = 10 +MESSAGE(1) = _NREGCOSTO + +NAME(2) = IMPORTO +TYPE(2) = IMPORTO +POSITION(2) = 20 +MESSAGE(2) = _IMPORTO + +NAME(3) = FLAG ACCONTO/SALDO +TYPE(3) = STRINGA +POSITION(3) = 34 +LENGTH(3) = 1 +MESSAGE(3) = _FLAG + +NAME(4) = VALUTA +TYPE(4) = STRINGA +POSITION(4) = 35 +LENGTH(4) = 1 +MESSAGE(4)=_FISSO,!1 diff --git a/tc/tc9100a.uml b/tc/tc9100a.uml new file mode 100755 index 000000000..331dba48a --- /dev/null +++ b/tc/tc9100a.uml @@ -0,0 +1,234 @@ +#include "cg7200a.h" + +TOOLBAR "" 0 -2 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -11 "" +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Invio dati contabilita'" -1 -1 78 20 + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 2 1 "@bDitta corrente" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 3 2 "Codice " + FLAGS "FD" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 23 2 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 76 6 +BEGIN + PROMPT 2 4 "Dati da inviare" +END + +BOOLEAN F_MOVIMENTI +BEGIN + PROMPT 3 5 "Movimenti contabili" + MESSAGE FALSE CLEAR,F_PAGAMENTI|DISABLE,F_DATAFIN + MESSAGE TRUE ENABLE,F_PAGAMENTI|ENABLE,F_DATAFIN +END + +BOOLEAN F_CLIENTI +BEGIN + PROMPT 3 6 "Clienti" +END + +BOOLEAN F_FORNITORI +BEGIN + PROMPT 3 7 "Fornitori" +END + +BOOLEAN F_CONTI +BEGIN + PROMPT 3 8 "Piano dei conti" +END + +BOOLEAN F_PAGAMENTI +BEGIN + PROMPT 40 5 "Pagamenti" +END + +LISTBOX F_TIPOINVIO 20 +BEGIN + PROMPT 2 10 "Invio a " + ITEM "P|Proforma" +END + +STRING F_DESTINAZIONE 20 +BEGIN + PROMPT 2 11 "Destinazione " +END + +DATE F_DATAINI +BEGIN + PROMPT 2 12 "Data iniziale " +END + +DATE F_DATAFIN +BEGIN + PROMPT 40 12 "Data finale " +END + +BUTTON F_RIPRISTINA 20 2 +BEGIN + PROMPT 2 14 "Annulla invio" + MESSAGE SHOW,F_DATARIPRISTINO|ENABLE,F_DATARIPRISTINO +END + +DATE F_DATARIPRISTINO +BEGIN + PROMPT 25 14 "Annulla invio fino al " + FLAGS "HD" +END + +ENDPAGE + +PAGE "Conti" -1 -1 78 20 + +TEXT -1 +BEGIN + PROMPT 1 1 "@bPiano dei conti contabile" +END + +SPREADSHEET F_PDCC 78 -6 +BEGIN + PROMPT 1 2 "Pdcc" + ITEM "Tipo" + ITEM "Gruppo" + ITEM "Conto" + ITEM "Sottoconto" + ITEM "Descrizione@50" +END + +TEXT -1 +BEGIN + PROMPT 1 17 "Inserire conti di tipo F per ritenute Fiscali" +END + +TEXT -1 +BEGIN + PROMPT 1 18 "S per ritenute Sociali, C per Costi, P per Pagamenti" +END + +BUTTON DLG_SAVEREC 12 2 +BEGIN + PROMPT -11 19 "" + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN +END + +ENDPAGE + +ENDMASK + +//-------------------------------------------------------------------- +// Riga dello sheet dei conti +//-------------------------------------------------------------------- + +PAGE "Riga Piano dei conti contabile" -1 -1 78 8 + +LIST S_TIPO 1 18 +BEGIN + PROMPT 1 1 "Tipo " + ITEM "C|Costi" + ITEM "P|Pagamenti" + ITEM "F|Ritenute fiscali" + ITEM "S|Ritenute sociali" +END + +NUMBER S_GRUPPO 3 +BEGIN + PROMPT 1 2 "Gruppo " + USE LF_PCON KEY 1 SELECT CONTO="" + INPUT GRUPPO S_GRUPPO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Descrizione@50" DESCR + OUTPUT S_GRUPPO GRUPPO + CHECKTYPE REQUIRED +END + +NUMBER S_CONTO 3 +BEGIN + PROMPT 1 3 "Conto " + USE LF_PCON KEY 1 SELECT ((CONTO!="")&&(SOTTOCONTO="")) + COPY INPUT S_GRUPPO + INPUT CONTO S_CONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT S_GRUPPO GRUPPO + OUTPUT S_CONTO CONTO + CHECKTYPE NORMAL + VALIDATE REQIF_FUNC 1 S_SOTTOCONTO +END + +NUMBER S_SOTTOCONTO 6 +BEGIN + PROMPT 1 4 "Sottoconto " + USE LF_PCON KEY 1 SELECT SOTTOCONTO!="" + COPY INPUT S_CONTO + INPUT SOTTOCONTO S_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT S_SOTTOCONTO SOTTOCONTO + OUTPUT S_CONTO CONTO + OUTPUT S_GRUPPO GRUPPO + OUTPUT S_DESCRIZIONE DESCR + CHECKTYPE NORMAL +END + +STRING S_DESCRIZIONE 50 +BEGIN + PROMPT 1 5 "Descrizione " + KEY 2 + USE LF_PCON KEY 2 + INPUT DESCR S_DESCRIZIONE + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + COPY OUTPUT S_SOTTOCONTO + CHECKTYPE REQUIRED +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/tc/tc9100conf.ini b/tc/tc9100conf.ini new file mode 100755 index 000000000..a30989f60 --- /dev/null +++ b/tc/tc9100conf.ini @@ -0,0 +1,5 @@ +[OPZIONI] +CONFSTRINGA = +DATA = +PERCORSO = + diff --git a/tc/tc9200.cpp b/tc/tc9200.cpp new file mode 100755 index 000000000..13366dbf7 --- /dev/null +++ b/tc/tc9200.cpp @@ -0,0 +1,385 @@ +#include +#include +#include + +#include "tc0.h" +#include "tc9200a.h" + +#include +#include +#include +#include + +#define ALIAS_REG 100 + +class TInvioS_file: public TFile_text +{ +protected: + virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); + +public: + TInvioS_file(const TString& file_name); + virtual ~TInvioS_file() { } +}; + +TInvioS_file::TInvioS_file(const TString& file_name) + : TFile_text(file_name, "tc9200a.ini") +{ +} + +class TInvioS_mask : public TAutomask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + + TInvioS_mask(); + + virtual ~TInvioS_mask(){}; +}; + +TInvioS_mask::TInvioS_mask() :TAutomask ("tc9200a") +{ +} + +bool TInvioS_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case F_CODDITTA: + if (e==fe_init && o.empty()) + { + set(F_CODDITTA, main_app().get_firm()); + ((TEdit_field&) o).check(); + disable(F_CODDITTA); + } + break; + default: + break; + } + return TRUE; +} + +class TInvioS : public TSkeleton_application +{ + TCursor* _cur; + TInvioS_mask* _msk; + TInvioS_file* _trasfile; + TConfig* _configfile; + TDate _dataini, _datafin; + +protected: + virtual bool create(void); + virtual bool destroy(void); + virtual void main_loop() ; + void invio_sispac(); + long i_sispac_clifor(const char* tipocf, const bool invio = TRUE); + long i_sispac_movcont(const bool invio = TRUE); + long i_sispac_moviva(const bool invio = TRUE); + +public: + TInvioS_file* apri_file(const char* nome); + void chiudi_file(TInvioS_file* trasfile); + TConfig& config() {return *_configfile;}; + TInvioS() {} ; + virtual ~TInvioS() {} ; +}; + +// restituisce un riferimento all' applicazione +inline TInvioS& app() { return (TInvioS&) main_app();} + +// gestione dei messaggi estesi nei campi +void TInvioS_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) +{ + const TString code(s.get(0)); + TString valore; + if (code == "_FISSO") + { + // gestione dei campi fissi per i record delle riba + // sintassi: _FISSO,! + // dove: è la stringa fissa da emettere + TString in(s.get()); + CHECK(in[0]=='!',"Macro _FISSO senza carattere '!'"); + in.ltrim(1); + in.trim(); + valore = in; + } + else if (code == "_TIPORIGA") + { + valore = str.empty() ? " " : "S"; + } + else if (code == "_CODPAG") + { + valore = app().config().get(str, "PAGAMENTI"); + } + else if (code == "_OPZIONI") + { + TString in(s.get()); + valore = app().config().get(in, "OPZIONI"); + } + else if (code == "_IMPORTO") + { + real importo(str); + valore = importo.string(0,2); + valore.strip("-"); + valore.strip("+"); + valore.strip("."); + } + else if (code == "_IMPORTORIGAIVA") + { + real imponibile = cur.curr(LF_RMOVIVA).get_real(RMI_IMPONIBILE);; + real imposta = cur.curr(LF_RMOVIVA).get_real(RMI_IMPOSTA);; + imponibile += imposta; + valore = imposta.string(0,2); + valore.strip("-"); + valore.strip("+"); + valore.strip("."); + } + else if (code == "_INDIR") + { + valore = cur.curr(LF_CLIFO).get(CLI_INDCF); + valore << ' ' << cur.curr(LF_CLIFO).get(CLI_CIVCF); + valore.cut(40); + } + else if (code == "_GIUFIS") + { + const char c = str[0]; + valore = (c == 'F') ? "S" : "N"; + } + else if (code == "_TITOLARE") + { + valore = (str.empty() ? "N" : "S"); + } + else if (code == "_TIPODET") + { + valore = (str.empty() ? " " : "100"); + } + else if (code == "_CONTO") + { + int gruppo = cur.curr(LF_CLIFO).get_int(CLI_GRUPPO); + if (gruppo == 10) + gruppo = 0; + int conto = cur.curr(LF_CLIFO).get_int(CLI_CONTO); + long codice = cur.curr(LF_CLIFO).get_int(CLI_CODCF); + valore.format("%03d%03d%06ld", gruppo, conto, codice); + } + else if (code == "_CONTOMOV") + { + int gruppo = cur.curr(LF_RMOV).get_int(RMV_GRUPPO); + if (gruppo == 10) + gruppo = 0; + int conto = cur.curr(LF_RMOV).get_int(RMV_CONTO); + long codice = cur.curr(LF_RMOV).get_int(RMV_SOTTOCONTO); + valore.format("%03d%03d%06ld", gruppo, conto, codice); + } + else if (code == "_CONTOMOVIVA") + { + int gruppo = cur.curr(LF_RMOVIVA).get_int(RMI_GRUPPO); + if (gruppo == 10) + gruppo = 0; + int conto = cur.curr(LF_RMOVIVA).get_int(RMI_CONTO); + long codice = cur.curr(LF_RMOVIVA).get_int(RMI_SOTTOCONTO); + valore.format("%03d%03d%06ld", gruppo, conto, codice); + } + else NFCHECK("Macro non definita: %s", (const char *)code); + str = valore; +} + +TInvioS_file* TInvioS::apri_file(const char* nome) +{ + TFilename filename = _msk->get(F_DESTINAZIONE); + filename.add(nome); + filename.ext("txt"); + if (filename.exist()) + remove(filename); + TInvioS_file* trasfile = new TInvioS_file(filename); + trasfile->open(filename,'w'); + trasfile->force_record_separator(); + return trasfile; +} + +void TInvioS::chiudi_file(TInvioS_file* trasfile) +{ + trasfile->close(); + delete trasfile; +} + +long TInvioS::i_sispac_movcont(const bool invio) +{ + TRectype da(LF_MOV); + TRectype a(LF_MOV); + TDate dataini = _msk->get_date(F_DATAINI); + TDate datafin = _msk->get_date(F_DATAFIN); + if (dataini.ok()) + da.put(MOV_DATAREG, dataini); + if (datafin.ok()) + a.put(MOV_DATAREG, datafin); + TRelation rel(LF_MOV); + rel.add(LF_RMOV, "NUMREG==NUMREG", 1); + rel.add(LF_CLIFO, "TIPOCF==TIPO|CODCF==CODCF", 1); + TCursor cur(&rel, "", 2, &da, &a); + const long cur_items = cur.items(); + if (cur_items != 0) + { + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + const long numreg = cur.curr().get_long(MOV_NUMREG); + bool continua = TRUE; + while (continua) + { + const long numregrig = cur.curr(LF_RMOV).get_long(RMV_NUMREG); + if (numreg == numregrig) + { + if (invio) + { + TRectype& cur_rec_righe = cur.curr(LF_RMOV); + TRecord_text recrighe; + recrighe.set_type("R"); + _trasfile->autoload(recrighe, cur); + _trasfile->write(recrighe); + } + } + continua = cur.next_match(LF_RMOV, "NUMREG"); + } + } + } + return 0; +} + + +long TInvioS::i_sispac_moviva(const bool invio) +{ + TRectype da(LF_MOV); + TRectype a(LF_MOV); + da.put(MOV_DATAREG, _dataini); + a.put(MOV_DATAREG, _datafin); + TRelation rel(LF_MOV); + rel.add(LF_RMOVIVA, "NUMREG==NUMREG", 1); + rel.add("REG", "CODTAB[1,4]==ANNOIVA|CODTAB[5,7]==REG", 1); + rel.add(LF_CLIFO, "TIPOCF==TIPO|CODCF==CODCF", 1); + TCursor cur(&rel, "", 2, &da, &a); + const long cur_items = cur.items(); + if (cur_items != 0) + + { + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + const long numreg = cur.curr().get_long(MOV_NUMREG); + bool continua = TRUE; + while (continua) + { + const long numregrig = cur.curr(LF_RMOVIVA).get_long(RMI_NUMREG); + if (numreg == numregrig) + { + if (invio) + { + TRectype& cur_rec_righe = cur.curr(LF_RMOVIVA); + TRecord_text recrighe; + recrighe.set_type("I"); + _trasfile->autoload(recrighe, cur); + _trasfile->write(recrighe); + } + } + continua = cur.next_match(LF_RMOVIVA, "NUMREG"); + } + } + } + return 0; +} + +long TInvioS::i_sispac_clifor(const char* tipocf, const bool invio) +{ + TString80 nomefile = "FILE"; + nomefile << tipocf; + TInvioS_file* trasfilecf = apri_file(_configfile->get(nomefile, "OPZIONI")); + TRelation rel(LF_CLIFO); + rel.add(LF_COMUNI, "STATO==STATOCF|COM==COMCF", 1); + rel.add(LF_ANAGFIS,"CODANAGR==CODANAGPER", 1); + rel.add(LF_ANAG,"TIPOA==TIPOPERS|CODANAGR==CODANAGPER", 1); + TString80 filtro; + filtro = "20->TIPOCF == \""; + filtro << tipocf; + filtro << "\""; + TCursor cur(&rel); + cur.setfilter(filtro, TRUE); + const long cur_items = cur.items(); + if (cur_items != 0 && invio) + { + cur.freeze(); + TRectype& cur_rec = cur.curr(); + for (cur = 0; cur.pos() < cur_items; ++(cur)) + { + TRecord_text rec; + rec.set_type(tipocf); + trasfilecf->autoload(rec, cur); + trasfilecf->write(rec); + } + } + chiudi_file(trasfilecf); + return 0; +} + +//metodone globale che chiama, come un menu, i vari sottometodi in base alle scelte sulla maschera +void TInvioS::invio_sispac() +{ + if (_msk->get_bool(F_CLIFOR)) + { + i_sispac_clifor("C"); + i_sispac_clifor("F"); + } + if (_msk->get_bool(F_MOVCONT)) + { + TString80 filename = _configfile->get("FILEM", "OPZIONI"); + _trasfile = apri_file(filename); + i_sispac_movcont(); + i_sispac_moviva(); + chiudi_file(_trasfile); + } +} + +bool TInvioS::create() +{ + _msk = new TInvioS_mask(); + TFilename configname = "tc9200conf.ini"; + configname.custom_path(); + _configfile = new TConfig(configname); + return TSkeleton_application::create(); +} + +bool TInvioS::destroy() +{ + delete _configfile; + delete _msk; + return TSkeleton_application::destroy(); +} + +void TInvioS::main_loop() +{ + _msk->set(F_NUMEROINVIO, _configfile->get_int("NUMEROINVIO","OPZIONI")+1); + _msk->set(F_DATAINI, _configfile->get("DATA","OPZIONI")); + _msk->set(F_DESTINAZIONE, _configfile->get("PERCORSO","OPZIONI")); + while (_msk->run() != K_QUIT) + { + _configfile->set("NUMEROINVIO", _msk->get(F_NUMEROINVIO),"OPZIONI"); + _configfile->set("DATA", _msk->get_date(F_DATAFIN),"OPZIONI"); + _configfile->set("PERCORSO", _msk->get(F_DESTINAZIONE),"OPZIONI"); + _configfile->set_paragraph("PAGAMENTI"); + _dataini = _msk->get_date(F_DATAINI); + _datafin = _msk->get_date(F_DATAFIN); + const char tipoinvio = _msk->get(F_TIPOINVIO)[0]; + if (tipoinvio == 'S') + invio_sispac(); + } +} + +int tc9200(int argc, char **argv) +{ + TInvioS a; + a.run(argc, argv, "Invio dati contabilità Sispac/Cosmo"); + return 0; +} + diff --git a/tc/tc9200a.h b/tc/tc9200a.h new file mode 100755 index 000000000..c6e887d03 --- /dev/null +++ b/tc/tc9200a.h @@ -0,0 +1,13 @@ +// invio dati ad altra procedura + +#define F_CODDITTA 101 +#define F_RAGSOC 102 +#define F_CLIFOR 112 +#define F_MOVCONT 113 +#define F_TIPOINVIO 120 +#define F_DESTINAZIONE 121 +#define F_NUMEROINVIO 122 +#define F_DATAINI 123 +#define F_DATAFIN 124 +#define F_RIPRISTINA 125 +#define F_DATARIPRISTINO 126 diff --git a/tc/tc9200a.ini b/tc/tc9200a.ini new file mode 100755 index 000000000..b90c0bdfe --- /dev/null +++ b/tc/tc9200a.ini @@ -0,0 +1,791 @@ +[MAIN] +DECSEP = , +FIELDSEP = +RECORDSEP = +RECORDSIZE = +SKIPLINES = 0 +TYPEFIELD = -1 +TYPELEN = -1 +TYPEPOS = -1 + +[TYPE STRINGA] +ALIGN = L +DATA = S +DECIMAL = 0 +FILLER = ' ' +LENGTH = 0 +PICTURE = + +[TYPE NUMERO] +ALIGN = R +DATA = N +DECIMAL = 0 +FILLER = '0' +PICTURE = + +[TYPE DATA] +ALIGN = +DATA = D +DECIMAL = 0 +FILLER = '0' +LENGTH = 10 +PICTURE = 1444 + +[TYPE IMPORTO] +ALIGN = R +DATA = N +DECIMAL = 2 +FILLER = '0' +LENGTH = 14 +PICTURE = @@@@@@@@@,@@ + +[RECORD R] + +NAME(0) = ID MOVIMENTO +TYPE(0) = NUMERO +LENGTH(0) = 10 +FIELD(0) = 23->NUMREG + +NAME(1) = DATA REGISTRAZIONE +TYPE(1) = DATA +LENGTH(1) = 10 +FIELD(1) = 23->DATAREG + +NAME(2) = DATA COMPETENZA BILANCIO +TYPE(2) = DATA +LENGTH(2) = 10 +FIELD(2) = 23->DATACOMP + +NAME(3) = DATA COMPETENZA LIQUIDAZIONE IVA +TYPE(3) = DATA +LENGTH(3) = 10 + +NAME(4) = DATA DOCUMENTO +TYPE(4) = DATA +LENGTH(4) = 10 +FIELD(4) = 23->DATADOC + +NAME(5) = NUMERO DOC +TYPE(5) = STRINGA +LENGTH(5) = 10 +FIELD(5) = 23->NUMDOC + +NAME(6) = CAUSALE +TYPE(6) = STRINGA +LENGTH(6) = 4 +FIELD(6) = 23->CODCAUS + +NAME(7) = DESCRIZIONE +TYPE(7) = STRINGA +LENGTH(7) = 40 +FIELD(7) = 23->DESCR[1,40] + +NAME(8) = PROVVISORIO +TYPE(8) = STRINGA +LENGTH(8) = 1 +FIELD(8) = 23->PROVVIS + +NAME(9) = REGISTRO IVA +TYPE(9) = STRINGA +LENGTH(9) = 2 +FIELD(9) = 23->REG + +NAME(10) = PROTOCOLLO IVA +TYPE(10) = STRINGA +LENGTH(10) = 10 +FIELD(10) = 23->PROTIVA + +NAME(11) = CONTO +TYPE(11) = STRINGA +LENGTH(11) = 12 +MESSAGE(11) = _CONTOMOV + +NAME(12) = CONTO COMPETENZA +TYPE(12) = STRINGA +LENGTH(12) = 12 + +NAME(13) = CODICE CLI/FOR +TYPE(13) = STRINGA +LENGTH(13) = 6 +FIELD(13) = CODCF + +NAME(14) = DESCRIZIONE RIGA +TYPE(14) = STRINGA +LENGTH(14) = 40 +FIELD(14) = DESCR[1,40] + +NAME(15) = IMPORTO RIGA +TYPE(15) = IMPORTO +FIELD(15) = 24->IMPORTO +MESSAGE(15) = _IMPORTO + +NAME(16) = IMPONIBILE +TYPE(16) = IMPORTO + +NAME(17) = CODICE IVA +TYPE(17) = STRINGA +LENGTH(17) = 3 + +NAME(18) = IMPORTO IVA +TYPE(18) = IMPORTO + +NAME(19) = INDETRAIBILITA +TYPE(19) = NUMERO + +NAME(20) = IMPORTO DIVISA +TYPE(20) = IMPORTO + +NAME(21) = DIVISA +TYPE(21) = STRINGA +LENGTH(21) = 3 +FIELD(21) = 23->CODVAL + +NAME(22) = CAMBIO +TYPE(22) = IMPORTO +FIELD(22) = 23->CAMBIO + +NAME(23) = CODICE PARTITA +TYPE(23) = STRINGA +LENGTH(23) = 10 + +NAME(24) = ANNO PARTITA +TYPE(24) = NUMERO +LENGTH(24) = 4 + +NAME(25) = DATA INIZIO COMP +TYPE(25) = DATA + +NAME(26) = DATA FINE COMP +TYPE(26) = DATA + +NAME(27) = CODICE ALIQUOTE FORFETARIE +TYPE(27) = STRINGA +LENGTH(27) = 1 + +NAME(28) = TIPO RIGA +TYPE(28) = STRINGA +LENGTH(28) = 1 +FIELD(28) = 24->TIPOC +MESSAGE(28) = _TIPORIGA + +NAME(29) = CAUSALE RIGA CONTABILE +TYPE(29) = STRINGA +LENGTH(29) = 2 + +NAME(30) = REGISTRO IVA VENDITE +TYPE(30) = STRINGA +LENGTH(30) = 2 +FIELD(30) = 23->CODCAUS + +NAME(31) = PROTOCOLLO IVA VENDITE +TYPE(31) = STRINGA +LENGTH(31) = 10 +FIELD(31) = 23->PROTIVA + +NAME(32) = CODICE SCADENZA DI RIFERIMENTO +TYPE(32) = NUMERO + +NAME(33) = TITOLARE PIVA +TYPE(33) = STRINGA +LENGTH(33) = 1 +FIELD(33) = 20->PAIV +MESSAGE(33) = _TITOLARE + +[RECORD I] + +NAME(0) = ID MOVIMENTO +TYPE(0) = NUMERO +LENGTH(0) = 10 +FIELD(0) = 23->NUMREG + +NAME(1) = DATA REGISTRAZIONE +TYPE(1) = DATA +LENGTH(1) = 10 +FIELD(1) = 23->DATAREG + +NAME(2) = DATA COMPETENZA BILANCIO +TYPE(2) = DATA +LENGTH(2) = 10 +FIELD(2) = 23->DATACOMP + +NAME(3) = DATA COMPETENZA LIQUIDAZIONE IVA +TYPE(3) = DATA +LENGTH(3) = 10 + +NAME(4) = DATA DOCUMENTO +TYPE(4) = DATA +LENGTH(4) = 10 +FIELD(4) = 23->DATADOC + +NAME(5) = NUMERO DOC +TYPE(5) = STRINGA +LENGTH(5) = 10 +FIELD(5) = 23->NUMDOC + +NAME(6) = CAUSALE +TYPE(6) = STRINGA +LENGTH(6) = 4 +FIELD(6) = 23->CODCAUS + +NAME(7) = DESCRIZIONE +TYPE(7) = STRINGA +LENGTH(7) = 40 +FIELD(7) = 23->DESCR[1,40] + +NAME(8) = PROVVISORIO +TYPE(8) = STRINGA +LENGTH(8) = 1 +FIELD(8) = 23->PROVVIS + +NAME(9) = REGISTRO IVA +TYPE(9) = STRINGA +LENGTH(9) = 2 +FIELD(9) = 23->REG + +NAME(10) = PROTOCOLLO IVA +TYPE(10) = STRINGA +LENGTH(10) = 10 +FIELD(10) = 23->PROTIVA + +NAME(11) = CONTO +TYPE(11) = STRINGA +LENGTH(11) = 12 +MESSAGE(11) = _CONTOMOVIVA + +NAME(12) = CONTO COMPETENZA +TYPE(12) = STRINGA +LENGTH(12) = 12 + +NAME(13) = CODICE CLI/FOR +TYPE(13) = STRINGA +LENGTH(13) = 6 +FIELD(13) = CODCF + +NAME(14) = DESCRIZIONE RIGA +TYPE(14) = STRINGA +LENGTH(14) = 40 +FIELD(14) = DESCR[1,40] + +NAME(15) = IMPORTO RIGA +TYPE(15) = IMPORTO +MESSAGE(15) = _IMPORTORIGAIVA + +NAME(16) = IMPONIBILE +TYPE(16) = IMPORTO +FIELD(16) = 25->IMPONIBILE +MESSAGE(16) = _IMPORTO + +NAME(17) = CODICE IVA +TYPE(17) = STRINGA +LENGTH(17) = 3 +FIELD(17) = 25->CODIVA + +NAME(18) = IMPORTO IVA +TYPE(18) = IMPORTO +FIELD(18) = 25->IMPOSTA +MESSAGE(18) = _IMPORTO + +NAME(19) = INDETRAIBILITA +TYPE(19) = NUMERO +FIELD(19) = 25->TIPODET +MESSAGE(19) = _TIPODET + +NAME(20) = IMPORTO DIVISA +TYPE(20) = IMPORTO + +NAME(21) = DIVISA +TYPE(21) = STRINGA +LENGTH(21) = 3 +FIELD(21) = 23->CODVAL + +NAME(22) = CAMBIO +TYPE(22) = IMPORTO +FIELD(22) = 23->CAMBIO + +NAME(23) = CODICE PARTITA +TYPE(23) = STRINGA +LENGTH(23) = 10 + +NAME(24) = ANNO PARTITA +TYPE(24) = NUMERO +LENGTH(24) = 4 + +NAME(25) = DATA INIZIO COMP +TYPE(25) = DATA + +NAME(26) = DATA FINE COMP +TYPE(26) = DATA + +NAME(27) = CODICE ALIQUOTE FORFETARIE +TYPE(27) = STRINGA +LENGTH(27) = 1 + +NAME(28) = TIPO RIGA +TYPE(28) = STRINGA +LENGTH(28) = 1 +MESSAGE(28) = _FISSO,!I + +NAME(29) = CAUSALE RIGA CONTABILE +TYPE(29) = STRINGA +LENGTH(29) = 2 + +NAME(30) = REGISTRO IVA VENDITE +TYPE(30) = STRINGA +LENGTH(30) = 2 +FIELD(30) = 23->CODCAUS + +NAME(31) = PROTOCOLLO IVA VENDITE +TYPE(31) = STRINGA +LENGTH(31) = 10 +FIELD(31) = 23->PROTIVA + +NAME(32) = CODICE SCADENZA DI RIFERIMENTO +TYPE(32) = NUMERO + +NAME(33) = TITOLARE PIVA +TYPE(33) = STRINGA +LENGTH(33) = 1 +FIELD(33) = 20->PAIV +MESSAGE(33) = _TITOLARE + +[RECORD C] + +NAME(0) = CODICE UNIVOCO CLIENTE +TYPE(0) = STRINGA +LENGTH(0) = 6 +FIELD(0) = 20->CODCF + +NAME(1) = RAGIONE SOCIALE +TYPE(1) = STRINGA +LENGTH(1) = 40 +FIELD(1) = 20->RAGSOC[1,40] + +NAME(2) = RAGIONE SOCIALE 2 +TYPE(2) = STRINGA +LENGTH(2) = 40 +FIELD(2) = 20->RAGSOC[41,10] + +NAME(3) = INDIRIZZO +TYPE(3) = STRINGA +LENGTH(3) = 40 +MESSAGE(3) = _INDIR + +NAME(4) = CITTA +TYPE(4) = STRINGA +LENGTH(4) = 30 +FIELD(4) = 13->DENCOM[1,30] + +NAME(5) = CAP +TYPE(5) = STRINGA +LENGTH(5) = 9 +FIELD(5) = 20->CAPCF + +NAME(6) = PROVINCIA +TYPE(6) = STRINGA +LENGTH(6) = 2 +FIELD(6) = 13->PROVCOM + +NAME(7) = REGIONE +TYPE(7) = STRINGA +LENGTH(7) = 3 +FIELD(7) = 13->CODREG + +NAME(8) = NAZIONE +TYPE(8) = STRINGA +LENGTH(8) = 3 +FIELD(8) = 13->STATO + +NAME(9) = INDIRIZZO E-MAIL +TYPE(9) = STRINGA +LENGTH(9) = 40 +FIELD(9) = 20->MAIL + +NAME(10) = PREFISSO INTERNAZIONALE TELEFONO 1 +TYPE(10) = STRINGA +LENGTH(10) = 5 + +NAME(11) = PREFISSO NAZIONALE TELEFONO 1 +TYPE(11) = STRINGA +LENGTH(11) = 5 +FIELD(11) = 20->PTEL + +NAME(12) = NUMERO TELEFONO 1 +TYPE(12) = STRINGA +LENGTH(12) = 10 +FIELD(12) = 20->TEL + +NAME(13) = PREFISSO INTERNAZIONALE TELEFONO 2 +TYPE(13) = STRINGA +LENGTH(13) = 5 + +NAME(14) = PREFISSO NAZIONALE TELEFONO 2 +TYPE(14) = STRINGA +LENGTH(14) = 5 +FIELD(14) = 20->PTEL2 + +NAME(15) = NUMERO TELEFONO 2 +TYPE(15) = STRINGA +LENGTH(15) = 10 +FIELD(15) = 20->TEL2 + +NAME(16) = PREFISSO INTERNAZIONALE FAX +TYPE(16) = STRINGA +LENGTH(16) = 5 + +NAME(17) = PREFISSO NAZIONALE TELEFONO FAX +TYPE(17) = STRINGA +LENGTH(17) = 5 +FIELD(17) = 20->PFAX + +NAME(18) = NUMERO TELEFONO FAX +TYPE(18) = STRINGA +LENGTH(18) = 10 +FIELD(18) = 20->FAX + +NAME(19) = PERSONA DA CONTATTARE +TYPE(19) = STRINGA +LENGTH(19) = 30 +FIELD(19) = 20->REFERENTE[1,30] + +NAME(20) = CHIAVE DI RICERCA +TYPE(20) = STRINGA +LENGTH(20) = 40 +FIELD(20) = 20->RICALT + +NAME(21) = NOTE +TYPE(21) = STRINGA +LENGTH(21) = 80 + +NAME(22) = PERSONA FISICA S/N +TYPE(22) = STRINGA +LENGTH(22) = 1 +FIELD(22) = 20->TIPOPERS +MESSAGE(22) = _GIUFIS + +NAME(23) = SESSO M/F +TYPE(23) = STRINGA +LENGTH(23) = 1 +FIELD(23) = 8->SESSO + +NAME(24) = DATA DI NASCITA +TYPE(24) = DATA +LENGTH(24) = 10 +FIELD(24)= 8->DATANASC + +NAME(25) = CITTA DI NASCITA +TYPE(25) = STRINGA +LENGTH(25) = 30 +FIELD(25) = 8->COMNASC + +NAME(26) = DENOMINAZIONE (COGNOME) +TYPE(26) = STRINGA +LENGTH(26) = 25 +FIELD(26) = 6->RAGSOC[1,25] + +NAME(27) = NOME +TYPE(27) = STRINGA +LENGTH(27) = 25 +FIELD(27) = 6->RAGSOC[26,25] + +NAME(28) = INDIRIZZO SEDE LEGALE +TYPE(28) = STRINGA +LENGTH(28) = 40 +FIELD(28) = 20->INDCF + +NAME(29) = CITTA SEDE LEGALE +TYPE(29) = STRINGA +LENGTH(29) = 30 +FIELD(29) = 13->DENCOM[1,40] + +NAME(30) = CAP SEDE LEGALE +TYPE(30) = STRINGA +LENGTH(30) = 9 +FIELD(30) = 20->CAPCF + +NAME(31) = PROVINCIA SEDE LEGALE +TYPE(31) = STRINGA +LENGTH(31) = 2 +FIELD(31) = 13->PROVCOM + +NAME(32) = REGIONE SEDE LEGALE +TYPE(32) = STRINGA +LENGTH(32) = 3 +FIELD(32) = 13->CODREG + +NAME(33) = CODICE ISO PIVA +TYPE(33) = STRINGA +LENGTH(33) = 2 +FIELD(33) = 20->STATOPAIV + +NAME(34) = PARTITA IVA +TYPE(34) = STRINGA +LENGTH(34) = 12 +FIELD(34) = 20->PAIV + +NAME(35) = CODICE FISCALE +TYPE(35) = STRINGA +LENGTH(35) = 16 +FIELD(35) = 20->COFI + +NAME(36) = CODICE FISCALE ESTERO +TYPE(36) = STRINGA +LENGTH(36) = 16 + +NAME(37) = CONTO +TYPE(37) = STRINGA +LENGTH(37) = 12 +MESSAGE(37) = _CONTO + +NAME(38) = CONTO CONTROPARTITA PER FATTURA +TYPE(38) = STRINGA +LENGTH(38) = 12 + +NAME(39) = CONTO CONTROPARTITA PER PAGAMENTI +TYPE(39) = STRINGA +LENGTH(39) = 12 + +NAME(40) = CODICE IVA CONTROPARTITA +TYPE(40) = STRINGA +LENGTH(40) = 3 + +NAME(41) = CODICE DIVISA CONTROPARTITA +TYPE(41) = STRINGA +LENGTH(41) = 3 + +NAME(42) = BLOCCATO +TYPE(42) = STRINGA +LENGTH(42) = 1 + +NAME(43) = DATA INIZIO RAPPORTO +TYPE(43) = DATA +LENGTH(43) = 10 + +NAME(44) = TIPO PAGAMENTO +TYPE(44) = STRINGA +LENGTH(44) = 1 +FIELD(44)= 20->CODPAG +MESSAGE(44) = _CODPAG + +NAME(45) = TITOLARE PIVA S/N +TYPE(45) = STRINGA +LENGTH(45) = 1 +FIELD(45) = 20->PAIV +MESSAGE(45) = _TITOLARE + +[RECORD F] + +NAME(0) = CODICE UNIVOCO FORNITORE +TYPE(0) = STRINGA +LENGTH(0) = 6 +FIELD(0) = 20->CODCF + +NAME(1) = RAGIONE SOCIALE +TYPE(1) = STRINGA +LENGTH(1) = 40 +FIELD(1) = 20->RAGSOC[1,40] + +NAME(2) = RAGIONE SOCIALE 2 +TYPE(2) = STRINGA +LENGTH(2) = 40 +FIELD(2) = 20->RAGSOC[41,10] + +NAME(3) = INDIRIZZO +TYPE(3) = STRINGA +LENGTH(3) = 40 +MESSAGE(3) = _INDIR + +NAME(4) = CITTA +TYPE(4) = STRINGA +LENGTH(4) = 30 +FIELD(4) = 13->DENCOM[1,40] + +NAME(5) = CAP +TYPE(5) = STRINGA +LENGTH(5) = 9 +FIELD(5)=20->CAPCF + +NAME(6) = PROVINCIA +TYPE(6) = STRINGA +LENGTH(6) = 2 +FIELD(6) = 13->PROVCOM + +NAME(7) = REGIONE +TYPE(7) = STRINGA +LENGTH(7) = 3 +FIELD(7) = 13->CODREG + +NAME(8) = NAZIONE +TYPE(8) = STRINGA +LENGTH(8) = 3 +FIELD(8) = 13->STATO + +NAME(9) = INDIRIZZO E-MAIL +TYPE(9) = STRINGA +LENGTH(9) = 40 +FIELD(9) = 20->MAIL + +NAME(10) = PREFISSO INTERNAZIONALE TELEFONO 1 +TYPE(10) = STRINGA +LENGTH(10) = 5 + +NAME(11) = PREFISSO NAZIONALE TELEFONO 1 +TYPE(11) = STRINGA +LENGTH(11) = 5 +FIELD(11) = 20->PTEL + +NAME(12) = NUMERO TELEFONO 1 +TYPE(12) = STRINGA +LENGTH(12) = 10 +FIELD(12) = 20->TEL + +NAME(13) = PREFISSO INTERNAZIONALE TELEFONO 2 +TYPE(13) = STRINGA +LENGTH(13) = 5 + +NAME(14) = PREFISSO NAZIONALE TELEFONO 2 +TYPE(14) = STRINGA +LENGTH(14) = 5 +FIELD(14) = 20->PTEL2 + +NAME(15) = NUMERO TELEFONO 2 +TYPE(15) = STRINGA +LENGTH(15) = 10 +FIELD(15) = 20->TEL2 + +NAME(16) = PREFISSO INTERNAZIONALE FAX +TYPE(16) = STRINGA +LENGTH(16) = 5 + +NAME(17) = PREFISSO NAZIONALE TELEFONO FAX +TYPE(17) = STRINGA +LENGTH(17) = 5 +FIELD(17) = 20->PFAX + +NAME(18) = NUMERO TELEFONO FAX +TYPE(18) = STRINGA +LENGTH(18) = 10 +FIELD(18) = 20->FAX + +NAME(19) = PERSONA DA CONTATTARE +TYPE(19) = STRINGA +LENGTH(19) = 30 +FIELD(19) = 20->REFERENTE[1,30] + +NAME(20) = CHIAVE DI RICERCA +TYPE(20) = STRINGA +LENGTH(20) = 40 + +NAME(21) = NOTE +TYPE(21) = STRINGA +LENGTH(21) = 80 + +NAME(22) = PERSONA FISICA S/N +TYPE(22) = STRINGA +LENGTH(22) = 1 +FIELD(22) = 20->TIPOPERS +MESSAGE(22) = _GIUFIS + +NAME(23) = SESSO M/F +TYPE(23) = STRINGA +LENGTH(23) = 1 +FIELD(23) = 8->SESSO + +NAME(24) = DATA DI NASCITA +TYPE(24) = DATA +LENGTH(24) = 10 +FIELD(24)= 8->DATANASC + +NAME(25) = CITTA DI NASCITA +TYPE(25) = STRINGA +LENGTH(25) = 30 +FIELD(25) = 8->COMNASC + +NAME(26) = DENOMINAZIONE (COGNOME) +TYPE(26) = STRINGA +LENGTH(26) = 25 +FIELD(26) = 6->RAGSOC[1,25] + +NAME(27) = NOME +TYPE(27) = STRINGA +LENGTH(27) = 25 +FIELD(27) = 6->RAGSOC[26,25] + +NAME(28) = INDIRIZZO SEDE LEGALE +TYPE(28) = STRINGA +LENGTH(28) = 40 +FIELD(28) = 20->INDCF + +NAME(29) = CITTA SEDE LEGALE +TYPE(29) = STRINGA +LENGTH(29) = 30 +FIELD(29) = 13->DENCOM[1,40] + +NAME(30) = CAP SEDE LEGALE +TYPE(30) = STRINGA +LENGTH(30) = 9 +FIELD(30) = 20->CAPCF + +NAME(31) = PROVINCIA SEDE LEGALE +TYPE(31) = STRINGA +LENGTH(31) = 2 +FIELD(31) = 13->PROVCOM + +NAME(32) = REGIONE SEDE LEGALE +TYPE(32) = STRINGA +LENGTH(32) = 3 +FIELD(32) = 13->CODREG + +NAME(33) = CODICE ISO PIVA +TYPE(33) = STRINGA +LENGTH(33) = 2 + +NAME(34) = PARTITA IVA +TYPE(34) = STRINGA +LENGTH(34) = 12 +FIELD(34)=20->PAIV + +NAME(35) = CODICE FISCALE +TYPE(35) = STRINGA +LENGTH(35) = 16 +FIELD(35) = 20->COFI + +NAME(36) = CODICE FISCALE ESTERO +TYPE(36) = STRINGA +LENGTH(36) = 16 + +NAME(37) = CONTO +TYPE(37) = STRINGA +LENGTH(37) = 12 + +NAME(38) = CONTO CONTROPARTITA PER PAGAMENTI +TYPE(38) = STRINGA +LENGTH(38) = 12 + +NAME(39) = CONTO CONTROPARTITA PER FATTURA +TYPE(39) = STRINGA +LENGTH(39) = 12 + +NAME(40) = CODICE IVA CONTROPARTITA +TYPE(40) = STRINGA +LENGTH(40) = 3 + +NAME(41) = CODICE DIVISA CONTROPARTITA +TYPE(41) = STRINGA +LENGTH(41) = 3 + +NAME(42) = GESTIONE ENASARCO +TYPE(42) = STRINGA +LENGTH(42) = 1 + +NAME(43) = DATA INIZIO RAPPORTO +TYPE(43) = DATA +LENGTH(43) = 10 + +NAME(44) = BLOCCATO +TYPE(44) = STRINGA +LENGTH(44) = 1 + +NAME(45) = TIPO PAGAMENTO +TYPE(45) = STRINGA +LENGTH(45) = 1 + diff --git a/tc/tc9200a.uml b/tc/tc9200a.uml new file mode 100755 index 000000000..b397f0fbf --- /dev/null +++ b/tc/tc9200a.uml @@ -0,0 +1,80 @@ +#include "cg7100a.h" + +PAGE "Invio dati contabilita'" -1 -1 78 20 + +GROUPBOX DLG_NULL 76 3 +BEGIN + PROMPT 2 1 "@bDitta corrente" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 3 2 "Codice " + FLAGS "FD" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 23 2 "" + FLAGS "D" +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 2 4 "Dati da inviare" +END + +BOOLEAN F_CLIFOR +BEGIN + PROMPT 3 5 "Clienti/Fornitori" +END + +BOOLEAN F_MOVCONT +BEGIN + PROMPT 3 6 "Movimenti" + MESSAGE TRUE,ENABLE F_DATAFIN +END + +LISTBOX F_TIPOINVIO 20 +BEGIN + PROMPT 2 8 "Invio a " + ITEM "S|Sispac/Cosmo" +END + +STRING F_DESTINAZIONE 20 +BEGIN + PROMPT 2 9 "Destinazione " +END + +NUMBER F_NUMEROINVIO 2 +BEGIN + PROMPT 2 10 "Numero invio " +END + +DATE F_DATAINI +BEGIN + PROMPT 20 10 "Data iniz. " +END + +DATE F_DATAFIN +BEGIN + PROMPT 44 10 "Data fin. " +END + +BUTTON DLG_OK 9 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/tc/tc9200conf.ini b/tc/tc9200conf.ini new file mode 100755 index 000000000..c78eb22c7 --- /dev/null +++ b/tc/tc9200conf.ini @@ -0,0 +1,11 @@ +[OPZIONI] +DATA = +FILEC = +FILEF = +FILEM = +NUMEROINVIO = +PERCORSO = + +[PAGAMENTO] +0001= +0013= diff --git a/tc/tc9300.cpp b/tc/tc9300.cpp new file mode 100755 index 000000000..5c83e794a --- /dev/null +++ b/tc/tc9300.cpp @@ -0,0 +1,7 @@ +//NON riportare nulla!!!! Esiste dalla 4.0; qui e' solo un segnaposto +#include "tc9.h" + +int tc9300(int argc, char **argv) +{ + return 0; +} diff --git a/tc/tcts.h b/tc/tcts.h index 275401255..2adbe6877 100755 --- a/tc/tcts.h +++ b/tc/tcts.h @@ -1,2 +1,3 @@ -#define F_CODTAB 101 -#define F_DESC 102 +#define F_COD 101 +#define F_CODTAB 102 +#define F_DESC 103 diff --git a/tc/tctscau.uml b/tc/tctscau.uml index 47dcd73c1..72d390cfe 100755 --- a/tc/tctscau.uml +++ b/tc/tctscau.uml @@ -6,37 +6,49 @@ TOOLBAR "" 0 -3 0 3 ENDPAGE -PAGE "@bCausali" -1 -1 78 15 +PAGE "Causali" -1 -1 78 15 GROUPBOX DLG_NULL 78 3 BEGIN PROMPT 1 1 "Causale" END +LIST F_COD 5 +BEGIN + PROMPT 1 1 "" + ITEM "CAU|CAU" + FIELD COD + FLAGS "H" + KEY 1 +END + NUMBER F_CODTAB 3 BEGIN PROMPT 2 2 "" - FIELD CODTAB - USE NAZ - INPUT CODTAB F_CODTAB - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODTAB CODTAB - OUTPUT F_DESC S0 + USE LF_MULTIREL + INPUT COD F_COD SELECT + INPUT FIRST F_CODTAB + DISPLAY "Codice" FIRST + DISPLAY "Descrizione@60" DATA + OUTPUT F_CODTAB FIRST + OUTPUT F_DESC DATA CHECKTYPE REQUIRED + FIELD FIRST + FLAGS "Z" KEY 1 END STRING F_DESC 50 BEGIN PROMPT 10 2 "Descrizione " - FIELD S0 - USE NAZ KEY 2 - INPUT S0 F_DESC - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB + USE LF_MULTIREL KEY 2 + INPUT COD F_COD SELECT + INPUT DATA F_DESC + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice" FIRST COPY OUTPUT F_CODTAB - KEY 2 + FIELD DATA + KEY 3 CHECKTYPE REQUIRED END diff --git a/tc/tctscdp.uml b/tc/tctscdp.uml index 4f69c71c5..e07935835 100755 --- a/tc/tctscdp.uml +++ b/tc/tctscdp.uml @@ -6,37 +6,49 @@ TOOLBAR "" 0 -3 0 3 ENDPAGE -PAGE "@bCondizioni di pagamento" -1 -1 78 15 +PAGE "Condizioni di pagamento" -1 -1 78 15 GROUPBOX DLG_NULL 78 3 BEGIN PROMPT 1 1 "Condizione di pagamento" END +LIST F_COD 5 +BEGIN + PROMPT 1 1 "" + ITEM "CDP|CDP" + FIELD COD + FLAGS "H" + KEY 1 +END + NUMBER F_CODTAB 4 BEGIN PROMPT 2 2 "" - FIELD CODTAB - USE NAZ - INPUT CODTAB F_CODTAB - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODTAB CODTAB - OUTPUT F_DESC S0 + USE LF_MULTIREL + INPUT COD F_COD SELECT + INPUT FIRST F_CODTAB + DISPLAY "Codice" FIRST + DISPLAY "Descrizione@60" DATA + OUTPUT F_CODTAB FIRST + OUTPUT F_DESC DATA CHECKTYPE REQUIRED + FIELD FIRST + FLAGS "Z" KEY 1 END STRING F_DESC 50 BEGIN PROMPT 10 2 "Descrizione " - FIELD S0 - USE NAZ KEY 2 - INPUT S0 F_DESC - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB + USE LF_MULTIREL KEY 2 + INPUT COD F_COD SELECT + INPUT DATA F_DESC + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice" FIRST COPY OUTPUT F_CODTAB - KEY 2 + FIELD DATA + KEY 3 CHECKTYPE REQUIRED END diff --git a/tc/tctscon.uml b/tc/tctscon.uml index aa57f54d2..52ff0b172 100755 --- a/tc/tctscon.uml +++ b/tc/tctscon.uml @@ -6,37 +6,49 @@ TOOLBAR "" 0 -3 0 3 ENDPAGE -PAGE "@bConti" -1 -1 78 15 +PAGE "Conti" -1 -1 78 15 GROUPBOX DLG_NULL 78 3 BEGIN PROMPT 1 1 "Conto" END +LIST F_COD 5 +BEGIN + PROMPT 1 1 "" + ITEM "CON|CON" + FIELD COD + FLAGS "H" + KEY 1 +END + NUMBER F_CODTAB 7 BEGIN PROMPT 2 2 "" - FIELD CODTAB - USE NAZ - INPUT CODTAB F_CODTAB - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODTAB CODTAB - OUTPUT F_DESC S0 + USE LF_MULTIREL + INPUT COD F_COD SELECT + INPUT FIRST F_CODTAB + DISPLAY "Codice@8" FIRST + DISPLAY "Descrizione@60" DATA + OUTPUT F_CODTAB FIRST + OUTPUT F_DESC DATA CHECKTYPE REQUIRED + FIELD FIRST + FLAGS "Z" KEY 1 END STRING F_DESC 50 BEGIN PROMPT 12 2 "Descrizione " - FIELD S0 - USE NAZ KEY 2 - INPUT S0 F_DESC - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB + USE LF_MULTIREL KEY 2 + INPUT COD F_COD SELECT + INPUT DATA F_DESC + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice@8" FIRST COPY OUTPUT F_CODTAB - KEY 2 + FIELD DATA + KEY 3 CHECKTYPE REQUIRED END diff --git a/tc/tctsnaz.uml b/tc/tctsnaz.uml index 56e2b4872..a44ac32bc 100755 --- a/tc/tctsnaz.uml +++ b/tc/tctsnaz.uml @@ -6,37 +6,49 @@ TOOLBAR "" 0 -3 0 3 ENDPAGE -PAGE "@bNazioni" -1 -1 78 15 +PAGE "Nazioni" -1 -1 78 15 GROUPBOX DLG_NULL 78 3 BEGIN PROMPT 1 1 "Nazione" END +LIST F_COD 5 +BEGIN + PROMPT 1 1 "" + ITEM "NAZ|NAZ" + FIELD COD + FLAGS "H" + KEY 1 +END + NUMBER F_CODTAB 4 BEGIN PROMPT 2 2 "" - FIELD CODTAB - USE NAZ - INPUT CODTAB F_CODTAB - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODTAB CODTAB - OUTPUT F_DESC S0 + USE LF_MULTIREL + INPUT COD F_COD SELECT + INPUT FIRST F_CODTAB + DISPLAY "Codice" FIRST + DISPLAY "Descrizione@60" DATA + OUTPUT F_CODTAB FIRST + OUTPUT F_DESC DATA CHECKTYPE REQUIRED + FIELD FIRST + FLAGS "Z" KEY 1 END STRING F_DESC 50 BEGIN PROMPT 10 2 "Descrizione " - FIELD S0 - USE NAZ KEY 2 - INPUT S0 F_DESC - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB + USE LF_MULTIREL KEY 2 + INPUT COD F_COD SELECT + INPUT DATA F_DESC + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice" FIRST COPY OUTPUT F_CODTAB - KEY 2 + FIELD DATA + KEY 3 CHECKTYPE REQUIRED END diff --git a/tc/tctsreg.uml b/tc/tctsreg.uml index f6de1d8dc..24061e106 100755 --- a/tc/tctsreg.uml +++ b/tc/tctsreg.uml @@ -6,37 +6,49 @@ TOOLBAR "" 0 -3 0 3 ENDPAGE -PAGE "@bRegistri" -1 -1 78 15 +PAGE "Registri" -1 -1 78 15 GROUPBOX DLG_NULL 78 3 BEGIN PROMPT 1 1 "Registro" END +LIST F_COD 5 +BEGIN + PROMPT 1 1 "" + ITEM "REG|REG" + FIELD COD + FLAGS "H" + KEY 1 +END + NUMBER F_CODTAB 3 BEGIN PROMPT 2 2 "" - FIELD CODTAB - USE NAZ - INPUT CODTAB F_CODTAB - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT F_CODTAB CODTAB - OUTPUT F_DESC S0 + USE LF_MULTIREL + INPUT COD F_COD SELECT + INPUT FIRST F_CODTAB + DISPLAY "Codice" FIRST + DISPLAY "Descrizione@60" DATA + OUTPUT F_CODTAB FIRST + OUTPUT F_DESC DATA CHECKTYPE REQUIRED + FIELD FIRST + FLAGS "Z" KEY 1 END STRING F_DESC 50 BEGIN PROMPT 10 2 "Descrizione " - FIELD S0 - USE NAZ KEY 2 - INPUT S0 F_DESC - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB + USE LF_MULTIREL KEY 2 + INPUT COD F_COD SELECT + INPUT DATA F_DESC + DISPLAY "Descrizione@60" DATA + DISPLAY "Codice" FIRST COPY OUTPUT F_CODTAB - KEY 2 + FIELD DATA + KEY 3 CHECKTYPE REQUIRED END