diff --git a/cg/cg7200.cpp b/cg/cg7200.cpp index 81abd5a33..0c3ef38d1 100755 --- a/cg/cg7200.cpp +++ b/cg/cg7200.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -285,6 +286,7 @@ protected: bool cerca_sociali(const TBill& bill) const; bool test_swap(TCausale& caus, bool ritsoc) const; real calcola_pagamento(TRectype& curpag_rec); + bool sottrai_iva(TMovimentoPN& pn, const TRectype& rigaiva); public: const real get_importo() {return _importo;}; @@ -415,10 +417,16 @@ bool TInvioP::i_proforma_conti() 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); @@ -436,16 +444,14 @@ bool TInvioP::i_proforma_movimenti() //trasferimento testate movimenti (cerca direttamente sui movimenti analitici in chiave 2.. //..,cioè per DATACOMP e con NUMREGCG!=0 - TRectype da(LF_MOVANA); - TRectype a(LF_MOVANA); - da.put(MOVANA_DATACOMP, _dataini); - a.put(MOV_DATACOMP, _datafin); - TRelation rel(LF_MOVANA); - rel.add(LF_MOV, "NUMREG==NUMREGCG"); + 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"); - rel.add(LF_RMOVANA, "NUMREG==NUMREG"); - rel.add(LF_RMOVIVA, "NUMREG==NUMREGCG"); - TCursor cur(&rel, "NUMREGCG!=0", 2, &da, &a); + + TCursor cur(&rel, "", 2, &da, &a); //chiave per data const long cur_items = cur.items(); if (cur_items != 0) @@ -454,10 +460,16 @@ bool TInvioP::i_proforma_movimenti() 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 proforma.ini trasfile->autoload(rec, cur); trasfile->write(rec); @@ -472,57 +484,65 @@ bool TInvioP::i_proforma_movimenti() bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe) { - //---- righe movimenti analitica ---- - //necessita del numreg del corrente movimento analitico per poterlo istanziare e prenderne le righe - const long numreg = cur.curr().get_long(MOVANA_NUMREG); - TAnal_mov analmov(numreg); //..istanzia il movimento analitico cercato.. - //..prende il numregcg che usera' per risalire ai movimenti analitico ed iva - const TString8 numregcg = analmov.get(MOVANA_NUMREGCG); - - TRecord_text recrighe; //istanzia il tipo record corretto da scrivere sul trasfilerighe - recrighe.set_type("R"); - + //---- righe movimenti ---- TInvioP_saldi_cg conti_importi; - //Creo un movimento PN (con numreg = a quello del movana)che servira' un po' dovunque + //Creo un movimento PN (con numreg = a quello del mov)che servira' un po' dovunque TMovimentoPN pn; - pn.curr().put(MOV_NUMREG, numregcg); + pn.curr() = cur.curr(); if (pn.read() == NOERR) { for (int j = 0; j < pn.cg_items(); j++) conti_importi.somma(pn.cg(j)); } - int i; - for (i = 1; i <= analmov.body().rows(); i++) + 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.. { - //..e scandisce le righe - const TRectype& riga = analmov.body().row(i); - //inganna il cursore passandogli la riga analitica in esame (bastardo!) - cur.curr(LF_RMOVANA) = riga; - //carica le righe analitiche - trasfilerighe->autoload(recrighe, cur); - //tglie le righe contabili corrispondenti che sono appena state aggiunte con la autoload (sarebbero.. - //..duplicate se non lo facesse!!!) - conti_importi.sottrai(riga); - //scrive sul file di trasferimento (alla faccia della semplicita'!) - trasfilerighe->write(recrighe); + 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); + //tglie le righe contabili corrispondenti che sono appena state aggiunte con la autoload (sarebbero.. + //..duplicate se non lo facesse!!!) + conti_importi.sottrai(riga); + //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 (i = 0; i < conti_importi.items(); i++) + + for (int i = 0; i < conti_importi_items; i++) { if (!conti_importi.importo(i).is_zero()) { //aggiunge i valori ai campi uno ad uno perchè non ha un cursore per fare l'autoload recrighe.destroy(); - recrighe.add(numregcg, 0); //numreg + recrighe.add(pn.curr().get(MOV_NUMREG), 0); //numreg workstring = "N"; recrighe.add(workstring, 1); //rigaiva TImporto& imp = conti_importi.importo(i); - workstring = imp.sezione(); + workstring.cut(0) << imp.sezione(); recrighe.add(workstring, 2); //sezione const TString& zio = conti_importi.conto(i); recrighe.add(zio.left(3), 3); //gruppo @@ -541,19 +561,17 @@ bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe) //---- righe iva ---- //adesso tocca alle righe iva...e sara' un casino indicibile! - //record_array con le righe iva aventi il numreg = numregcg analitico - TRecord_array righeiva(numregcg, LF_RMOVIVA); //assoc array contenente tutti i diversi conti che incontrera' nello scanning delle righe iva TAssoc_array conti; //scanning delle righe iva alla ricerca dei conti che compaiono - for (int j = 1; j <= righeiva.rows(); j++) + for (int j = 0; j < pn.iva_items(); j++) { //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(righeiva[j]); - const char* codconto = conto.string(8); + conto.get(pn.iva(j)); + 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 @@ -561,12 +579,12 @@ bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe) 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..ho un assoc_array.. + //aggiunge all'assoc_array conti il suo elemento assoc_array codivae..ha un assoc_array.. //..di assoc_array! conti.add(codconto, codivae); } - TString16 codiva = righeiva[j].get(RMI_CODIVA); //prende il codice iva dalla riga iva + const TString4 codiva = pn.iva(j).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.. @@ -580,7 +598,7 @@ bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe) } //accresce l'importo tot_imp relativo alla coppia codiva+codconto corrente - *tot_imp += righeiva[j].get_real(RMI_IMPONIBILE); + *tot_imp += pn.iva(j).get_real(RMI_IMPONIBILE); //aggiungere qui eventuale imposta } @@ -588,7 +606,14 @@ bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe) recrigheiva.set_type("I"); int nrighe = 0; - for (i = 1; i <= analmov.body().rows(); i++) + 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 (i = 1; i <= analrigheiva_items; i++) { //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 @@ -603,39 +628,118 @@ bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe) 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 = numregcg della testata analitica originale - TRectype& rigaiva = cur.curr(LF_RMOVIVA); - rigaiva.put(RMI_NUMREG, numregcg); - - //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)); - TBill zio(rigaiva); - rigaiva.put(RMI_TIPOC, zio.tipo()); - rigaiva.put(RMI_IMPONIBILE, distributore.get()); - rigaiva.put(RMI_CODIVA, ki); - - //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); - trasfilerighe->write(recrigheiva); - } - } + 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); + 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 + 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 k = 0; k < righeiva_items; k++) + { + const TRectype& riga = pn.iva(k); + if (!riga.get_real(RMI_IMPOSTA).is_zero()) + { + const TBill uncle(riga); + cur_rmoviva.curr() = riga; + trasfilerighe->autoload(recrigheiva, cur_rmoviva); + recrigheiva.add(uncle.descrizione().left(40), 8); //descrizione della riga iva = descrizione conto + 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; } @@ -821,6 +925,7 @@ bool TInvioP::i_proforma_pagamenti() 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.. @@ -828,10 +933,16 @@ bool TInvioP::i_proforma_pagamenti() lettura_conti(_fiscali, 'F'); lettura_conti(_sociali, 'S'); + TProgind pi(cur_items, "Trasferimento pagamenti...", true, true); + cur.freeze(); TRectype& cur_rec = cur.curr(); for (cur = 0; cur.pos() < cur_items; ++(cur)) { + pi.addstatus(1); + if (pi.iscancelled()) + break; + const char tipomov = cur_rec.get(MOV_TIPOMOV)[0]; if (tipomov == '3' || tipomov == '2' || tipomov == '6') { @@ -913,10 +1024,19 @@ bool TInvioP::i_proforma_pagamenti() 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); @@ -924,12 +1044,20 @@ bool TInvioP::i_proforma_clifor(char tipocf) 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); diff --git a/cg/proforma.ini b/cg/proforma.ini index 7d6d7fd4d..3ed16c537 100755 --- a/cg/proforma.ini +++ b/cg/proforma.ini @@ -45,19 +45,19 @@ NAME(0) = ID REGISTRAZIONE TYPE(0) = NUMERO POSITION(0) = 0 LENGTH(0) = 10 -FIELD(0) = 107->NUMREGCG +FIELD(0) = NUMREG NAME(1) = DATA REGISTRAZIONE TYPE(1) = DATA POSITION(1) = 10 LENGTH(1) = 8 -FIELD(1) = 107->DATAREG +FIELD(1) = DATAREG NAME(2) = CODICE CAUSALE TYPE(2) = STRINGA POSITION(2) = 18 LENGTH(2) = 3 -FIELD(2) = 107->CODCAUS +FIELD(2) = CODCAUS NAME(3) = DESCRIZIONE CAUSALE TYPE(3) = STRINGA @@ -69,19 +69,19 @@ NAME(4) = DESCRIZIONE TESTATA TYPE(4) = STRINGA POSITION(4) = 61 LENGTH(4) = 40 -FIELD(4) = 107->DESCR[1,40] +FIELD(4) = DESCR[1,40] NAME(5) = DATA DOCUMENTO TYPE(5) = DATA POSITION(5) = 101 LENGTH(5) = 8 -FIELD(5) = 107->DATADOC +FIELD(5) = DATADOC NAME(6) = NUMERO DOCUMENTO TYPE(6) = STRINGA POSITION(6) = 109 LENGTH(6) = 6 -FIELD(6) = 107->NUMDOC +FIELD(6) = NUMDOC NAME(7) = TIPO DOCUMENTO TYPE(7) = STRINGA @@ -92,7 +92,7 @@ NAME(8) = CODICE CLIFOR TYPE(8) = STRINGA POSITION(8) = 145 LENGTH(8) = 10 -FIELD(8) = 23->CODCF +FIELD(8) = CODCF NAME(9) = TOTALE IMPONIBILE TYPE(9) = IMPORTO @@ -105,7 +105,7 @@ POSITION(10) = 169 NAME(11) = TOTALE DOCUMENTO TYPE(11) = IMPORTO POSITION(11) = 183 -FIELD(11) = 107->TOTDOC +FIELD(11) = TOTDOC NAME(12) = DATA PAGAMENTO TYPE(12) = DATA @@ -116,19 +116,19 @@ NAME(13) = TIPO PAGAMENTO TYPE(13) = STRINGA POSITION(13) = 205 LENGTH(13) = 20 -FIELD(13) = 23->CODPAG +FIELD(13) = CODPAG NAME(14) = DATA COMPETENZA TYPE(14) = DATA POSITION(14) = 225 LENGTH(14) = 8 -FIELD(14) = 107->DATACOMP +FIELD(14) = DATACOMP NAME(15) = NUMERO PROTOCOLLO TYPE(15) = STRINGA POSITION(15) = 235 LENGTH(15) = 10 -FIELD(15) = 23->PROTIVA +FIELD(15) = PROTIVA NAME(16) = VALUTA TYPE(16) = STRINGA @@ -142,7 +142,7 @@ NAME(0) = ID REGISTRAZIONE TYPE(0) = NUMERO POSITION(0) = 0 LENGTH(0) = 10 -FIELD(0) = 107->NUMREGCG +FIELD(0) = 23->NUMREG NAME(1) = FLAG RIGA IVA TYPE(1) = STRINGA @@ -154,25 +154,25 @@ NAME(2) = FLAG DARE/AVERE TYPE(2) = STRINGA POSITION(2) = 11 LENGTH(2) = 1 -FIELD(2) = 108->SEZIONE +FIELD(2) = SEZIONE NAME(3) = CODICE MASTRO TYPE(3) = NUMERO POSITION(3) = 12 LENGTH(3) = 5 -FIELD(3) = 108->CODCONTO[1,3] +FIELD(3) = CODCONTO[1,3] NAME(4) = CODICE CONTO TYPE(4) = NUMERO POSITION(4) = 17 LENGTH(4) = 5 -FIELD(4) = 108->CODCONTO[4,6] +FIELD(4) = CODCONTO[4,6] NAME(5) = CODICE SOTTOCONTO TYPE(5) = NUMERO POSITION(5) = 22 LENGTH(5) = 5 -FIELD(5) = 108->CODCONTO[8,12] +FIELD(5) = CODCONTO[7,12] NAME(6) = FLAG CLIFOR TYPE(6) = STRINGA @@ -184,18 +184,18 @@ NAME(7) = CODICE CLIFOR TYPE(7) = NUMERO POSITION(7) = 28 LENGTH(7) = 10 -FIELD(7) = 108->CODCONTO[7,12] +FIELD(7) = CODCONTO[7,12] NAME(8) = DESCRIZIONE RIGA TYPE(8) = STRINGA POSITION(8) = 38 LENGTH(8) = 40 -FIELD(8) = 108->DESCR[1,40] +FIELD(8) = DESCR[1,40] NAME(9) = IMPORTO SOTTOCONTO TYPE(9) = IMPORTO POSITION(9) = 78 -FIELD(9) = 108->IMPORTO +FIELD(9) = IMPORTO NAME(10) = IMPONIBILE TYPE(10) = IMPORTO @@ -215,7 +215,7 @@ NAME(13) = COMMESSA TYPE(13) = STRINGA POSITION(13) = 125 LENGTH(13) = 20 -FIELD(13) = 108->CODCMS +FIELD(13) = CODCMS NAME(14) = VOCE DI SPESA TYPE(14) = STRINGA @@ -229,7 +229,7 @@ NAME(0) = ID REGISTRAZIONE TYPE(0) = NUMERO POSITION(0) = 0 LENGTH(0) = 10 -FIELD(0) = 25->NUMREG +FIELD(0) = NUMREG NAME(1) = FLAG RIGA IVA TYPE(1) = STRINGA @@ -241,31 +241,31 @@ NAME(3) = CODICE MASTRO TYPE(3) = NUMERO POSITION(3) = 12 LENGTH(3) = 5 -FIELD(3) = 25->GRUPPO +FIELD(3) = GRUPPO NAME(4) = CODICE CONTO TYPE(4) = NUMERO POSITION(4) = 17 LENGTH(4) = 5 -FIELD(4) = 25->CONTO +FIELD(4) = CONTO NAME(5) = CODICE SOTTOCONTO TYPE(5) = NUMERO POSITION(5) = 22 LENGTH(5) = 5 -FIELD(5) = 25->SOTTOCONTO +FIELD(5) = SOTTOCONTO NAME(6) = FLAG CLIFOR TYPE(6) = STRINGA POSITION(6) = 27 LENGTH(6) = 1 -FIELD(6) = 25->TIPOC +FIELD(6) = TIPOC NAME(7) = CODICE CLIFOR TYPE(7) = NUMERO POSITION(7) = 28 LENGTH(7) = 10 -FIELD(7) = 25->SOTTOCONTO +FIELD(7) = SOTTOCONTO NAME(8) = DESCRIZIONE RIGA TYPE(8) = STRINGA @@ -279,13 +279,13 @@ POSITION(9) = 78 NAME(10) = IMPONIBILE TYPE(10) = IMPORTO POSITION(10) = 92 -FIELD(10) = 25->IMPONIBILE +FIELD(10) = IMPONIBILE NAME(11) = CODICE IVA TYPE(11) = STRINGA POSITION(11) = 106 LENGTH(11) = 4 -FIELD(11) = 25->CODIVA +FIELD(11) = CODIVA NAME(12) = CP INDED TYPE(12) = STRINGA @@ -296,7 +296,6 @@ NAME(13) = COMMESSA TYPE(13) = STRINGA POSITION(13) = 125 LENGTH(13) = 20 -FIELD(13) = 108->CODCMS NAME(14) = VOCE DI SPESA TYPE(14) = STRINGA