Patch level :2.2 274
Files correlati :traferimento proforma Ricompilazione Demo : [ ] Commento :trasferimento proforma con analitica funzionante; andra' bene? all'enrichetta l'ardua sentenza! git-svn-id: svn://10.65.10.50/trunk@13632 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
fcc3f1d8f8
commit
8e1a7012be
274
cg/cg7200.cpp
274
cg/cg7200.cpp
@ -6,6 +6,7 @@
|
|||||||
#include <filetext.h>
|
#include <filetext.h>
|
||||||
#include <msksheet.h>
|
#include <msksheet.h>
|
||||||
#include <printer.h>
|
#include <printer.h>
|
||||||
|
#include <progind.h>
|
||||||
#include <recarray.h>
|
#include <recarray.h>
|
||||||
#include <relation.h>
|
#include <relation.h>
|
||||||
#include <sort.h>
|
#include <sort.h>
|
||||||
@ -285,6 +286,7 @@ protected:
|
|||||||
bool cerca_sociali(const TBill& bill) const;
|
bool cerca_sociali(const TBill& bill) const;
|
||||||
bool test_swap(TCausale& caus, bool ritsoc) const;
|
bool test_swap(TCausale& caus, bool ritsoc) const;
|
||||||
real calcola_pagamento(TRectype& curpag_rec);
|
real calcola_pagamento(TRectype& curpag_rec);
|
||||||
|
bool sottrai_iva(TMovimentoPN& pn, const TRectype& rigaiva);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const real get_importo() {return _importo;};
|
const real get_importo() {return _importo;};
|
||||||
@ -415,10 +417,16 @@ bool TInvioP::i_proforma_conti()
|
|||||||
const long cur_items = cur.items();
|
const long cur_items = cur.items();
|
||||||
if (cur_items != 0)
|
if (cur_items != 0)
|
||||||
{
|
{
|
||||||
|
TProgind pi(cur_items, "Trasferimento conti...", true, true);
|
||||||
|
|
||||||
cur.freeze();
|
cur.freeze();
|
||||||
TRectype& cur_rec = cur.curr();
|
TRectype& cur_rec = cur.curr();
|
||||||
for (cur = 0; cur.pos() < cur_items; ++(cur))
|
for (cur = 0; cur.pos() < cur_items; ++(cur))
|
||||||
{
|
{
|
||||||
|
pi.addstatus(1);
|
||||||
|
if (pi.iscancelled())
|
||||||
|
break;
|
||||||
|
|
||||||
TRecord_text rec;
|
TRecord_text rec;
|
||||||
rec.set_type("P");
|
rec.set_type("P");
|
||||||
trasfile->autoload(rec, cur);
|
trasfile->autoload(rec, cur);
|
||||||
@ -436,16 +444,14 @@ bool TInvioP::i_proforma_movimenti()
|
|||||||
|
|
||||||
//trasferimento testate movimenti (cerca direttamente sui movimenti analitici in chiave 2..
|
//trasferimento testate movimenti (cerca direttamente sui movimenti analitici in chiave 2..
|
||||||
//..,cioè per DATACOMP e con NUMREGCG!=0
|
//..,cioè per DATACOMP e con NUMREGCG!=0
|
||||||
TRectype da(LF_MOVANA);
|
TRectype da(LF_MOV);
|
||||||
TRectype a(LF_MOVANA);
|
TRectype a(LF_MOV);
|
||||||
da.put(MOVANA_DATACOMP, _dataini);
|
da.put(MOV_DATAREG, _dataini);
|
||||||
a.put(MOV_DATACOMP, _datafin);
|
a.put(MOV_DATAREG, _datafin);
|
||||||
TRelation rel(LF_MOVANA);
|
TRelation rel(LF_MOV);
|
||||||
rel.add(LF_MOV, "NUMREG==NUMREGCG");
|
|
||||||
rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
|
rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
|
||||||
rel.add(LF_RMOVANA, "NUMREG==NUMREG");
|
|
||||||
rel.add(LF_RMOVIVA, "NUMREG==NUMREGCG");
|
TCursor cur(&rel, "", 2, &da, &a); //chiave per data
|
||||||
TCursor cur(&rel, "NUMREGCG!=0", 2, &da, &a);
|
|
||||||
|
|
||||||
const long cur_items = cur.items();
|
const long cur_items = cur.items();
|
||||||
if (cur_items != 0)
|
if (cur_items != 0)
|
||||||
@ -454,10 +460,16 @@ bool TInvioP::i_proforma_movimenti()
|
|||||||
TRecord_text rec;
|
TRecord_text rec;
|
||||||
rec.set_type("T");
|
rec.set_type("T");
|
||||||
|
|
||||||
|
TProgind pi(cur_items, "Trasferimento movimenti...", true, true);
|
||||||
|
|
||||||
cur.freeze();
|
cur.freeze();
|
||||||
const TRectype& cur_rec = cur.curr();
|
const TRectype& cur_rec = cur.curr();
|
||||||
for (cur = 0; cur.pos() < cur_items; ++(cur))
|
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
|
//carica e scrive il record di testata in base alle informazioni contenute nel proforma.ini
|
||||||
trasfile->autoload(rec, cur);
|
trasfile->autoload(rec, cur);
|
||||||
trasfile->write(rec);
|
trasfile->write(rec);
|
||||||
@ -472,57 +484,65 @@ bool TInvioP::i_proforma_movimenti()
|
|||||||
|
|
||||||
bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe)
|
bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe)
|
||||||
{
|
{
|
||||||
//---- righe movimenti analitica ----
|
//---- righe movimenti ----
|
||||||
//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");
|
|
||||||
|
|
||||||
TInvioP_saldi_cg conti_importi;
|
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;
|
TMovimentoPN pn;
|
||||||
pn.curr().put(MOV_NUMREG, numregcg);
|
pn.curr() = cur.curr();
|
||||||
if (pn.read() == NOERR)
|
if (pn.read() == NOERR)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < pn.cg_items(); j++)
|
for (int j = 0; j < pn.cg_items(); j++)
|
||||||
conti_importi.somma(pn.cg(j));
|
conti_importi.somma(pn.cg(j));
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
TRecord_text recrighe; //istanzia il tipo record corretto da scrivere sul trasfilerighe
|
||||||
for (i = 1; i <= analmov.body().rows(); i++)
|
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
|
TRelation rel_rmovana(LF_RMOVANA); //crea una relazione sulle righe anali cui aggiunge mov e movana
|
||||||
const TRectype& riga = analmov.body().row(i);
|
rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG");
|
||||||
//inganna il cursore passandogli la riga analitica in esame (bastardo!)
|
rel_rmovana.add(LF_MOV, "NUMREG==NUMREGCG", 1, LF_MOVANA);
|
||||||
cur.curr(LF_RMOVANA) = riga;
|
TCursor cur_rmovana(&rel_rmovana); //crea il cursore sulle righe analitiche che serve per poter usare la autoload
|
||||||
//carica le righe analitiche
|
cur_rmovana.curr(LF_MOVANA) = analmov;
|
||||||
trasfilerighe->autoload(recrighe, cur);
|
cur_rmovana.curr(LF_MOV) = cur.curr();
|
||||||
//tglie le righe contabili corrispondenti che sono appena state aggiunte con la autoload (sarebbero..
|
|
||||||
//..duplicate se non lo facesse!!!)
|
for (int i = 1; i <= analrighe_items; i++)
|
||||||
conti_importi.sottrai(riga);
|
{
|
||||||
//scrive sul file di trasferimento (alla faccia della semplicita'!)
|
//..e scandisce le righe
|
||||||
trasfilerighe->write(recrighe);
|
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)..
|
//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..
|
//..in modo da passare anche quelle (in caso contrario sarebbero andati perduti gli importi di..
|
||||||
//..tali righe che non avevano commessa!)
|
//..tali righe che non avevano commessa!)
|
||||||
|
const long conti_importi_items = conti_importi.items();
|
||||||
TString workstring; //stringa di lavoro che serve nel ciclo sotto
|
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())
|
if (!conti_importi.importo(i).is_zero())
|
||||||
{
|
{
|
||||||
//aggiunge i valori ai campi uno ad uno perchè non ha un cursore per fare l'autoload
|
//aggiunge i valori ai campi uno ad uno perchè non ha un cursore per fare l'autoload
|
||||||
recrighe.destroy();
|
recrighe.destroy();
|
||||||
recrighe.add(numregcg, 0); //numreg
|
recrighe.add(pn.curr().get(MOV_NUMREG), 0); //numreg
|
||||||
workstring = "N";
|
workstring = "N";
|
||||||
recrighe.add(workstring, 1); //rigaiva
|
recrighe.add(workstring, 1); //rigaiva
|
||||||
TImporto& imp = conti_importi.importo(i);
|
TImporto& imp = conti_importi.importo(i);
|
||||||
workstring = imp.sezione();
|
workstring.cut(0) << imp.sezione();
|
||||||
recrighe.add(workstring, 2); //sezione
|
recrighe.add(workstring, 2); //sezione
|
||||||
const TString& zio = conti_importi.conto(i);
|
const TString& zio = conti_importi.conto(i);
|
||||||
recrighe.add(zio.left(3), 3); //gruppo
|
recrighe.add(zio.left(3), 3); //gruppo
|
||||||
@ -541,19 +561,17 @@ bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe)
|
|||||||
//---- righe iva ----
|
//---- righe iva ----
|
||||||
//adesso tocca alle righe iva...e sara' un casino indicibile!
|
//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
|
//assoc array contenente tutti i diversi conti che incontrera' nello scanning delle righe iva
|
||||||
TAssoc_array conti;
|
TAssoc_array conti;
|
||||||
|
|
||||||
//scanning delle righe iva alla ricerca dei conti che compaiono
|
//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,..
|
//prende il conto e lo mette nell'assoc_array dei conti (notare che, essendo un assoc_array,..
|
||||||
//..non vengono inseriti doppioni! mitico!!)
|
//..non vengono inseriti doppioni! mitico!!)
|
||||||
TBill conto;
|
TBill conto;
|
||||||
conto.get(righeiva[j]);
|
conto.get(pn.iva(j));
|
||||||
const char* codconto = conto.string(8);
|
const char* codconto = conto.string(0x8);
|
||||||
|
|
||||||
//ad ogni conto lega un assoc_array (codivae) che conterra' tutti i codici iva legati a quel..
|
//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
|
//..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
|
if (codivae == NULL) //se non esiste l'assoc_array legato al conto lo crea
|
||||||
{
|
{
|
||||||
codivae = new TAssoc_array;
|
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!
|
//..di assoc_array!
|
||||||
conti.add(codconto, codivae);
|
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'
|
//aggiungere qui eventuale codice intero di indetraibilita'
|
||||||
|
|
||||||
//ad ogni codiva presente in codivae lega un importo che risultera' la somma di tutti gli..
|
//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
|
//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
|
//aggiungere qui eventuale imposta
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,7 +606,14 @@ bool TInvioP::i_proforma_righe(TCursor& cur, TInvioP_file* trasfilerighe)
|
|||||||
recrigheiva.set_type("I");
|
recrigheiva.set_type("I");
|
||||||
int nrighe = 0;
|
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..
|
//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
|
//..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);
|
real importo_riga = riga.get_real(RMOVANA_IMPORTO);
|
||||||
//..lo ridistribuisce secondo le percentuali iva
|
//..lo ridistribuisce secondo le percentuali iva
|
||||||
TGeneric_distrib distributore(importo_riga, TCurrency::get_firm_dec());
|
TGeneric_distrib distributore(importo_riga, TCurrency::get_firm_dec());
|
||||||
|
|
||||||
|
FOR_EACH_ASSOC_OBJECT((*codivae), h, k, imp)
|
||||||
{
|
{
|
||||||
FOR_EACH_ASSOC_OBJECT((*codivae), h, k, imp)
|
const real& imp_iva = *(real*)imp;
|
||||||
{
|
distributore.add(imp_iva);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,6 +925,7 @@ bool TInvioP::i_proforma_pagamenti()
|
|||||||
rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
|
rel.add(LF_CAUSALI, "CODCAUS==CODCAUS");
|
||||||
TCursor cur(&rel, "", 2, &da, &a);
|
TCursor cur(&rel, "", 2, &da, &a);
|
||||||
const long cur_items = cur.items();
|
const long cur_items = cur.items();
|
||||||
|
|
||||||
if (cur_items != 0)
|
if (cur_items != 0)
|
||||||
{
|
{
|
||||||
//se ha almeno un movimento carica lo sheet dei conti che gli servira' in seguito nel calcolo..
|
//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(_fiscali, 'F');
|
||||||
lettura_conti(_sociali, 'S');
|
lettura_conti(_sociali, 'S');
|
||||||
|
|
||||||
|
TProgind pi(cur_items, "Trasferimento pagamenti...", true, true);
|
||||||
|
|
||||||
cur.freeze();
|
cur.freeze();
|
||||||
TRectype& cur_rec = cur.curr();
|
TRectype& cur_rec = cur.curr();
|
||||||
for (cur = 0; cur.pos() < cur_items; ++(cur))
|
for (cur = 0; cur.pos() < cur_items; ++(cur))
|
||||||
{
|
{
|
||||||
|
pi.addstatus(1);
|
||||||
|
if (pi.iscancelled())
|
||||||
|
break;
|
||||||
|
|
||||||
const char tipomov = cur_rec.get(MOV_TIPOMOV)[0];
|
const char tipomov = cur_rec.get(MOV_TIPOMOV)[0];
|
||||||
if (tipomov == '3' || tipomov == '2' || tipomov == '6')
|
if (tipomov == '3' || tipomov == '2' || tipomov == '6')
|
||||||
{
|
{
|
||||||
@ -913,10 +1024,19 @@ bool TInvioP::i_proforma_pagamenti()
|
|||||||
bool TInvioP::i_proforma_clifor(char tipocf)
|
bool TInvioP::i_proforma_clifor(char tipocf)
|
||||||
{
|
{
|
||||||
TInvioP_file* trasfile = NULL;
|
TInvioP_file* trasfile = NULL;
|
||||||
|
|
||||||
|
TString progind_string = "Trasferimento ";
|
||||||
|
|
||||||
if (tipocf == 'C')
|
if (tipocf == 'C')
|
||||||
|
{
|
||||||
trasfile = apri_file("clienti");
|
trasfile = apri_file("clienti");
|
||||||
|
progind_string << "clienti";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
trasfile = apri_file("fornit");
|
trasfile = apri_file("fornit");
|
||||||
|
progind_string << "fornitori";
|
||||||
|
}
|
||||||
|
|
||||||
TString80 filtro = "";
|
TString80 filtro = "";
|
||||||
filtro.format("TIPOCF == \"%c\"", tipocf);
|
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);
|
rel.add(LF_COMUNI, "STATO==STATOCF|COM==COMCF", 1);
|
||||||
TCursor cur(&rel, filtro);
|
TCursor cur(&rel, filtro);
|
||||||
const long cur_items = cur.items();
|
const long cur_items = cur.items();
|
||||||
|
|
||||||
if (cur_items != 0)
|
if (cur_items != 0)
|
||||||
{
|
{
|
||||||
|
progind_string << "...";
|
||||||
|
TProgind pi(cur_items, progind_string, true, true);
|
||||||
|
|
||||||
cur.freeze();
|
cur.freeze();
|
||||||
TRectype& cur_rec = cur.curr();
|
TRectype& cur_rec = cur.curr();
|
||||||
for (cur = 0; cur.pos() < cur_items; ++(cur))
|
for (cur = 0; cur.pos() < cur_items; ++(cur))
|
||||||
{
|
{
|
||||||
|
pi.addstatus(1);
|
||||||
|
if (pi.iscancelled())
|
||||||
|
break;
|
||||||
|
|
||||||
TRecord_text rec;
|
TRecord_text rec;
|
||||||
rec.set_type("C");
|
rec.set_type("C");
|
||||||
trasfile->autoload(rec, cur);
|
trasfile->autoload(rec, cur);
|
||||||
|
@ -45,19 +45,19 @@ NAME(0) = ID REGISTRAZIONE
|
|||||||
TYPE(0) = NUMERO
|
TYPE(0) = NUMERO
|
||||||
POSITION(0) = 0
|
POSITION(0) = 0
|
||||||
LENGTH(0) = 10
|
LENGTH(0) = 10
|
||||||
FIELD(0) = 107->NUMREGCG
|
FIELD(0) = NUMREG
|
||||||
|
|
||||||
NAME(1) = DATA REGISTRAZIONE
|
NAME(1) = DATA REGISTRAZIONE
|
||||||
TYPE(1) = DATA
|
TYPE(1) = DATA
|
||||||
POSITION(1) = 10
|
POSITION(1) = 10
|
||||||
LENGTH(1) = 8
|
LENGTH(1) = 8
|
||||||
FIELD(1) = 107->DATAREG
|
FIELD(1) = DATAREG
|
||||||
|
|
||||||
NAME(2) = CODICE CAUSALE
|
NAME(2) = CODICE CAUSALE
|
||||||
TYPE(2) = STRINGA
|
TYPE(2) = STRINGA
|
||||||
POSITION(2) = 18
|
POSITION(2) = 18
|
||||||
LENGTH(2) = 3
|
LENGTH(2) = 3
|
||||||
FIELD(2) = 107->CODCAUS
|
FIELD(2) = CODCAUS
|
||||||
|
|
||||||
NAME(3) = DESCRIZIONE CAUSALE
|
NAME(3) = DESCRIZIONE CAUSALE
|
||||||
TYPE(3) = STRINGA
|
TYPE(3) = STRINGA
|
||||||
@ -69,19 +69,19 @@ NAME(4) = DESCRIZIONE TESTATA
|
|||||||
TYPE(4) = STRINGA
|
TYPE(4) = STRINGA
|
||||||
POSITION(4) = 61
|
POSITION(4) = 61
|
||||||
LENGTH(4) = 40
|
LENGTH(4) = 40
|
||||||
FIELD(4) = 107->DESCR[1,40]
|
FIELD(4) = DESCR[1,40]
|
||||||
|
|
||||||
NAME(5) = DATA DOCUMENTO
|
NAME(5) = DATA DOCUMENTO
|
||||||
TYPE(5) = DATA
|
TYPE(5) = DATA
|
||||||
POSITION(5) = 101
|
POSITION(5) = 101
|
||||||
LENGTH(5) = 8
|
LENGTH(5) = 8
|
||||||
FIELD(5) = 107->DATADOC
|
FIELD(5) = DATADOC
|
||||||
|
|
||||||
NAME(6) = NUMERO DOCUMENTO
|
NAME(6) = NUMERO DOCUMENTO
|
||||||
TYPE(6) = STRINGA
|
TYPE(6) = STRINGA
|
||||||
POSITION(6) = 109
|
POSITION(6) = 109
|
||||||
LENGTH(6) = 6
|
LENGTH(6) = 6
|
||||||
FIELD(6) = 107->NUMDOC
|
FIELD(6) = NUMDOC
|
||||||
|
|
||||||
NAME(7) = TIPO DOCUMENTO
|
NAME(7) = TIPO DOCUMENTO
|
||||||
TYPE(7) = STRINGA
|
TYPE(7) = STRINGA
|
||||||
@ -92,7 +92,7 @@ NAME(8) = CODICE CLIFOR
|
|||||||
TYPE(8) = STRINGA
|
TYPE(8) = STRINGA
|
||||||
POSITION(8) = 145
|
POSITION(8) = 145
|
||||||
LENGTH(8) = 10
|
LENGTH(8) = 10
|
||||||
FIELD(8) = 23->CODCF
|
FIELD(8) = CODCF
|
||||||
|
|
||||||
NAME(9) = TOTALE IMPONIBILE
|
NAME(9) = TOTALE IMPONIBILE
|
||||||
TYPE(9) = IMPORTO
|
TYPE(9) = IMPORTO
|
||||||
@ -105,7 +105,7 @@ POSITION(10) = 169
|
|||||||
NAME(11) = TOTALE DOCUMENTO
|
NAME(11) = TOTALE DOCUMENTO
|
||||||
TYPE(11) = IMPORTO
|
TYPE(11) = IMPORTO
|
||||||
POSITION(11) = 183
|
POSITION(11) = 183
|
||||||
FIELD(11) = 107->TOTDOC
|
FIELD(11) = TOTDOC
|
||||||
|
|
||||||
NAME(12) = DATA PAGAMENTO
|
NAME(12) = DATA PAGAMENTO
|
||||||
TYPE(12) = DATA
|
TYPE(12) = DATA
|
||||||
@ -116,19 +116,19 @@ NAME(13) = TIPO PAGAMENTO
|
|||||||
TYPE(13) = STRINGA
|
TYPE(13) = STRINGA
|
||||||
POSITION(13) = 205
|
POSITION(13) = 205
|
||||||
LENGTH(13) = 20
|
LENGTH(13) = 20
|
||||||
FIELD(13) = 23->CODPAG
|
FIELD(13) = CODPAG
|
||||||
|
|
||||||
NAME(14) = DATA COMPETENZA
|
NAME(14) = DATA COMPETENZA
|
||||||
TYPE(14) = DATA
|
TYPE(14) = DATA
|
||||||
POSITION(14) = 225
|
POSITION(14) = 225
|
||||||
LENGTH(14) = 8
|
LENGTH(14) = 8
|
||||||
FIELD(14) = 107->DATACOMP
|
FIELD(14) = DATACOMP
|
||||||
|
|
||||||
NAME(15) = NUMERO PROTOCOLLO
|
NAME(15) = NUMERO PROTOCOLLO
|
||||||
TYPE(15) = STRINGA
|
TYPE(15) = STRINGA
|
||||||
POSITION(15) = 235
|
POSITION(15) = 235
|
||||||
LENGTH(15) = 10
|
LENGTH(15) = 10
|
||||||
FIELD(15) = 23->PROTIVA
|
FIELD(15) = PROTIVA
|
||||||
|
|
||||||
NAME(16) = VALUTA
|
NAME(16) = VALUTA
|
||||||
TYPE(16) = STRINGA
|
TYPE(16) = STRINGA
|
||||||
@ -142,7 +142,7 @@ NAME(0) = ID REGISTRAZIONE
|
|||||||
TYPE(0) = NUMERO
|
TYPE(0) = NUMERO
|
||||||
POSITION(0) = 0
|
POSITION(0) = 0
|
||||||
LENGTH(0) = 10
|
LENGTH(0) = 10
|
||||||
FIELD(0) = 107->NUMREGCG
|
FIELD(0) = 23->NUMREG
|
||||||
|
|
||||||
NAME(1) = FLAG RIGA IVA
|
NAME(1) = FLAG RIGA IVA
|
||||||
TYPE(1) = STRINGA
|
TYPE(1) = STRINGA
|
||||||
@ -154,25 +154,25 @@ NAME(2) = FLAG DARE/AVERE
|
|||||||
TYPE(2) = STRINGA
|
TYPE(2) = STRINGA
|
||||||
POSITION(2) = 11
|
POSITION(2) = 11
|
||||||
LENGTH(2) = 1
|
LENGTH(2) = 1
|
||||||
FIELD(2) = 108->SEZIONE
|
FIELD(2) = SEZIONE
|
||||||
|
|
||||||
NAME(3) = CODICE MASTRO
|
NAME(3) = CODICE MASTRO
|
||||||
TYPE(3) = NUMERO
|
TYPE(3) = NUMERO
|
||||||
POSITION(3) = 12
|
POSITION(3) = 12
|
||||||
LENGTH(3) = 5
|
LENGTH(3) = 5
|
||||||
FIELD(3) = 108->CODCONTO[1,3]
|
FIELD(3) = CODCONTO[1,3]
|
||||||
|
|
||||||
NAME(4) = CODICE CONTO
|
NAME(4) = CODICE CONTO
|
||||||
TYPE(4) = NUMERO
|
TYPE(4) = NUMERO
|
||||||
POSITION(4) = 17
|
POSITION(4) = 17
|
||||||
LENGTH(4) = 5
|
LENGTH(4) = 5
|
||||||
FIELD(4) = 108->CODCONTO[4,6]
|
FIELD(4) = CODCONTO[4,6]
|
||||||
|
|
||||||
NAME(5) = CODICE SOTTOCONTO
|
NAME(5) = CODICE SOTTOCONTO
|
||||||
TYPE(5) = NUMERO
|
TYPE(5) = NUMERO
|
||||||
POSITION(5) = 22
|
POSITION(5) = 22
|
||||||
LENGTH(5) = 5
|
LENGTH(5) = 5
|
||||||
FIELD(5) = 108->CODCONTO[8,12]
|
FIELD(5) = CODCONTO[7,12]
|
||||||
|
|
||||||
NAME(6) = FLAG CLIFOR
|
NAME(6) = FLAG CLIFOR
|
||||||
TYPE(6) = STRINGA
|
TYPE(6) = STRINGA
|
||||||
@ -184,18 +184,18 @@ NAME(7) = CODICE CLIFOR
|
|||||||
TYPE(7) = NUMERO
|
TYPE(7) = NUMERO
|
||||||
POSITION(7) = 28
|
POSITION(7) = 28
|
||||||
LENGTH(7) = 10
|
LENGTH(7) = 10
|
||||||
FIELD(7) = 108->CODCONTO[7,12]
|
FIELD(7) = CODCONTO[7,12]
|
||||||
|
|
||||||
NAME(8) = DESCRIZIONE RIGA
|
NAME(8) = DESCRIZIONE RIGA
|
||||||
TYPE(8) = STRINGA
|
TYPE(8) = STRINGA
|
||||||
POSITION(8) = 38
|
POSITION(8) = 38
|
||||||
LENGTH(8) = 40
|
LENGTH(8) = 40
|
||||||
FIELD(8) = 108->DESCR[1,40]
|
FIELD(8) = DESCR[1,40]
|
||||||
|
|
||||||
NAME(9) = IMPORTO SOTTOCONTO
|
NAME(9) = IMPORTO SOTTOCONTO
|
||||||
TYPE(9) = IMPORTO
|
TYPE(9) = IMPORTO
|
||||||
POSITION(9) = 78
|
POSITION(9) = 78
|
||||||
FIELD(9) = 108->IMPORTO
|
FIELD(9) = IMPORTO
|
||||||
|
|
||||||
NAME(10) = IMPONIBILE
|
NAME(10) = IMPONIBILE
|
||||||
TYPE(10) = IMPORTO
|
TYPE(10) = IMPORTO
|
||||||
@ -215,7 +215,7 @@ NAME(13) = COMMESSA
|
|||||||
TYPE(13) = STRINGA
|
TYPE(13) = STRINGA
|
||||||
POSITION(13) = 125
|
POSITION(13) = 125
|
||||||
LENGTH(13) = 20
|
LENGTH(13) = 20
|
||||||
FIELD(13) = 108->CODCMS
|
FIELD(13) = CODCMS
|
||||||
|
|
||||||
NAME(14) = VOCE DI SPESA
|
NAME(14) = VOCE DI SPESA
|
||||||
TYPE(14) = STRINGA
|
TYPE(14) = STRINGA
|
||||||
@ -229,7 +229,7 @@ NAME(0) = ID REGISTRAZIONE
|
|||||||
TYPE(0) = NUMERO
|
TYPE(0) = NUMERO
|
||||||
POSITION(0) = 0
|
POSITION(0) = 0
|
||||||
LENGTH(0) = 10
|
LENGTH(0) = 10
|
||||||
FIELD(0) = 25->NUMREG
|
FIELD(0) = NUMREG
|
||||||
|
|
||||||
NAME(1) = FLAG RIGA IVA
|
NAME(1) = FLAG RIGA IVA
|
||||||
TYPE(1) = STRINGA
|
TYPE(1) = STRINGA
|
||||||
@ -241,31 +241,31 @@ NAME(3) = CODICE MASTRO
|
|||||||
TYPE(3) = NUMERO
|
TYPE(3) = NUMERO
|
||||||
POSITION(3) = 12
|
POSITION(3) = 12
|
||||||
LENGTH(3) = 5
|
LENGTH(3) = 5
|
||||||
FIELD(3) = 25->GRUPPO
|
FIELD(3) = GRUPPO
|
||||||
|
|
||||||
NAME(4) = CODICE CONTO
|
NAME(4) = CODICE CONTO
|
||||||
TYPE(4) = NUMERO
|
TYPE(4) = NUMERO
|
||||||
POSITION(4) = 17
|
POSITION(4) = 17
|
||||||
LENGTH(4) = 5
|
LENGTH(4) = 5
|
||||||
FIELD(4) = 25->CONTO
|
FIELD(4) = CONTO
|
||||||
|
|
||||||
NAME(5) = CODICE SOTTOCONTO
|
NAME(5) = CODICE SOTTOCONTO
|
||||||
TYPE(5) = NUMERO
|
TYPE(5) = NUMERO
|
||||||
POSITION(5) = 22
|
POSITION(5) = 22
|
||||||
LENGTH(5) = 5
|
LENGTH(5) = 5
|
||||||
FIELD(5) = 25->SOTTOCONTO
|
FIELD(5) = SOTTOCONTO
|
||||||
|
|
||||||
NAME(6) = FLAG CLIFOR
|
NAME(6) = FLAG CLIFOR
|
||||||
TYPE(6) = STRINGA
|
TYPE(6) = STRINGA
|
||||||
POSITION(6) = 27
|
POSITION(6) = 27
|
||||||
LENGTH(6) = 1
|
LENGTH(6) = 1
|
||||||
FIELD(6) = 25->TIPOC
|
FIELD(6) = TIPOC
|
||||||
|
|
||||||
NAME(7) = CODICE CLIFOR
|
NAME(7) = CODICE CLIFOR
|
||||||
TYPE(7) = NUMERO
|
TYPE(7) = NUMERO
|
||||||
POSITION(7) = 28
|
POSITION(7) = 28
|
||||||
LENGTH(7) = 10
|
LENGTH(7) = 10
|
||||||
FIELD(7) = 25->SOTTOCONTO
|
FIELD(7) = SOTTOCONTO
|
||||||
|
|
||||||
NAME(8) = DESCRIZIONE RIGA
|
NAME(8) = DESCRIZIONE RIGA
|
||||||
TYPE(8) = STRINGA
|
TYPE(8) = STRINGA
|
||||||
@ -279,13 +279,13 @@ POSITION(9) = 78
|
|||||||
NAME(10) = IMPONIBILE
|
NAME(10) = IMPONIBILE
|
||||||
TYPE(10) = IMPORTO
|
TYPE(10) = IMPORTO
|
||||||
POSITION(10) = 92
|
POSITION(10) = 92
|
||||||
FIELD(10) = 25->IMPONIBILE
|
FIELD(10) = IMPONIBILE
|
||||||
|
|
||||||
NAME(11) = CODICE IVA
|
NAME(11) = CODICE IVA
|
||||||
TYPE(11) = STRINGA
|
TYPE(11) = STRINGA
|
||||||
POSITION(11) = 106
|
POSITION(11) = 106
|
||||||
LENGTH(11) = 4
|
LENGTH(11) = 4
|
||||||
FIELD(11) = 25->CODIVA
|
FIELD(11) = CODIVA
|
||||||
|
|
||||||
NAME(12) = CP INDED
|
NAME(12) = CP INDED
|
||||||
TYPE(12) = STRINGA
|
TYPE(12) = STRINGA
|
||||||
@ -296,7 +296,6 @@ NAME(13) = COMMESSA
|
|||||||
TYPE(13) = STRINGA
|
TYPE(13) = STRINGA
|
||||||
POSITION(13) = 125
|
POSITION(13) = 125
|
||||||
LENGTH(13) = 20
|
LENGTH(13) = 20
|
||||||
FIELD(13) = 108->CODCMS
|
|
||||||
|
|
||||||
NAME(14) = VOCE DI SPESA
|
NAME(14) = VOCE DI SPESA
|
||||||
TYPE(14) = STRINGA
|
TYPE(14) = STRINGA
|
||||||
|
Loading…
x
Reference in New Issue
Block a user