Patch level :4.0 440
Files correlati : Ricompilazione Demo : [ ] Commento :stampa pagato per commessa/fornitore abbastanza funzionante git-svn-id: svn://10.65.10.50/trunk@14116 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
8aba412f06
commit
ed04a6ea37
572
ca/ca3600.cpp
572
ca/ca3600.cpp
@ -198,7 +198,7 @@ class TPag_per_cms_recordset : public TISAM_recordset
|
||||
|
||||
protected:
|
||||
TDate _dadata, _adata;
|
||||
long _codfor;
|
||||
long _dacodfor, _acodfor;
|
||||
TString16 _campodata;
|
||||
TString _codcosto, _codcms, _codfas;
|
||||
TAssoc_array _costi,_pagamenti,_fiscali,_sociali; //array che contengono i conti letti dal .ini
|
||||
@ -228,7 +228,7 @@ protected:
|
||||
bool cerca_sociali(const TBill& bill) const;
|
||||
|
||||
public:
|
||||
virtual void set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long codfor, const TString& campodata);
|
||||
virtual void set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long dacodfor, const long acodfor, const TString& campodata);
|
||||
virtual void set_custom_filter(TCursor& cur) const;
|
||||
void scan_pags();
|
||||
void scan_movs();
|
||||
@ -697,294 +697,293 @@ void TPag_per_cms_recordset::find_commesse(const long nreg, const TRectype& riga
|
||||
//..con la isam query implementato nella query_movama_by_numregcg()
|
||||
TISAM_recordset movana(query_movama_by_numregcg(nreg));
|
||||
const TRecnotype items = movana.items();
|
||||
if (items <= 0)
|
||||
return;
|
||||
|
||||
if (items > 0)
|
||||
{
|
||||
if (items > 1)
|
||||
error_box(TR("Esiste piu' di un movimento analitico collegato al movimento contabile %ld"),nreg);
|
||||
if (items > 1)
|
||||
warning_box(TR("Esiste piu' di un movimento analitico collegato al movimento contabile %ld"),nreg);
|
||||
|
||||
movana.move_last(); //si posiziona sul record corretto
|
||||
//prepara il record tmpcurr sul file temporaneo _tmp su cui registrare i dati da stampare
|
||||
TRectype& tmpcurr = _tmp->curr();
|
||||
tmpcurr.zero();
|
||||
movana.move_last(); //si posiziona sul record corretto
|
||||
|
||||
//crea un movimento p.n. con il numero reg che viene passato al metodo (nreg relativo..
|
||||
//..ad un movimento della fattura originaria)
|
||||
TMovimentoPN pn;
|
||||
pn.curr().put(MOV_NUMREG, nreg);
|
||||
if (pn.read() == NOERR)
|
||||
//crea il movana e le sue righe
|
||||
const TAnal_mov anal_mov(movana.get(MOVANA_NUMREG).as_int());
|
||||
TRecord_array& anal_rows = anal_mov.body();
|
||||
//scandisce le righe del movana alla ricerca di righe compatibili con le commesse sullo sheet
|
||||
for (int m = anal_rows.last_row(); m > 0; m--)
|
||||
{
|
||||
if (check_cms_cdc_fsc(anal_rows[m]))
|
||||
break;
|
||||
}
|
||||
//se non ne ha trovata manco una di righe buone esce!
|
||||
if (m <= 0)
|
||||
return;
|
||||
|
||||
//prepara il record tmpcurr sul file temporaneo _tmp su cui registrare i dati da stampare
|
||||
TRectype& tmpcurr = _tmp->curr();
|
||||
tmpcurr.zero();
|
||||
|
||||
//crea un movimento p.n. con il numero reg che viene passato al metodo (nreg relativo..
|
||||
//..ad un movimento della fattura originaria)
|
||||
TMovimentoPN pn;
|
||||
pn.curr().put(MOV_NUMREG, nreg);
|
||||
if (pn.read() == NOERR)
|
||||
{
|
||||
const TRectype& movfat = pn.curr();
|
||||
|
||||
real totdoc_cms;
|
||||
real totdoc, totdoc_netto;
|
||||
TAssoc_array commesse;
|
||||
|
||||
//Movimenti CON SALDACONTO
|
||||
//se movimento IVA..
|
||||
if (pn.iva_items() > 0)
|
||||
{
|
||||
const TRectype& movfat = pn.curr();
|
||||
|
||||
real totdoc_cms;
|
||||
real totdoc, totdoc_netto;
|
||||
TAssoc_array commesse;
|
||||
|
||||
//Movimenti CON SALDACONTO
|
||||
//se movimento IVA..
|
||||
if (pn.iva_items() > 0)
|
||||
//trova le RMOVANA del MOVANA corrente che hanno il conto = a quello della i-esima rigaiva
|
||||
for (int j = 0; j < pn.iva_items(); j++)
|
||||
{
|
||||
for (int j = 0; j < pn.iva_items(); j++)
|
||||
const TRectype& rmoviva = pn.iva(j);
|
||||
const TBill zio(rmoviva);
|
||||
//il tutto si fa solo se l'indicatore di bilancio del conto nella riga iva e' != 5
|
||||
if (zio.indicatore_bilancio() != 5)
|
||||
{
|
||||
const TRectype& rmoviva = pn.iva(j);
|
||||
const TBill zio(rmoviva);
|
||||
//il tutto si fa solo se l'indicatore di bilancio del conto nella riga iva e' != 5
|
||||
if (zio.indicatore_bilancio() != 5)
|
||||
//e vediamo 'sto conto della riga iva..
|
||||
const int gruppo_iva = zio.gruppo();
|
||||
const int conto_iva = zio.conto();
|
||||
const long sottoconto_iva = zio.sottoconto();
|
||||
|
||||
real imponibile_iva = rmoviva.get_real(RMI_IMPONIBILE);
|
||||
real imposta_iva = rmoviva.get_real(RMI_IMPOSTA);
|
||||
const TString& tipodet = rmoviva.get(RMI_TIPODET);
|
||||
//controlla se l'imposta va sommata (tipo detrazione iva non nulla)
|
||||
if (tipodet.full())
|
||||
imponibile_iva += imposta_iva;
|
||||
|
||||
//distributore per il lordo iva (che sara' distribuito successivamente in base..
|
||||
//..agli importi delle righe analitiche corretti per le % iva
|
||||
TGeneric_distrib agip (imponibile_iva, TCurrency::get_firm_dec());
|
||||
|
||||
for (int k = 1; k <= anal_rows.rows(); k++) //scansiona righe analitiche..
|
||||
{
|
||||
//e vediamo 'sto conto della riga iva..
|
||||
const int gruppo_iva = zio.gruppo();
|
||||
const int conto_iva = zio.conto();
|
||||
const long sottoconto_iva = zio.sottoconto();
|
||||
|
||||
//crea il movana legato al moviva
|
||||
const TAnal_mov anal_mov(rmoviva);
|
||||
//trova le RMOVANA del MOVANA corrente che hanno il conto = a quello della i-esima rigaiva
|
||||
TRecord_array& anal_rows = anal_mov.body();
|
||||
|
||||
if (anal_rows.rows() > 0) //se il movana ha righe...
|
||||
real perc_ded_iva = UNO; //%iva deducibile (di default 100, a meno del prorata)
|
||||
if (imposta_iva != ZERO)
|
||||
{
|
||||
real imponibile_iva = rmoviva.get_real(RMI_IMPONIBILE);
|
||||
real imposta_iva = rmoviva.get_real(RMI_IMPOSTA);
|
||||
const TString& tipodet = rmoviva.get(RMI_TIPODET);
|
||||
//controlla se l'imposta va sommata (tipo detrazione iva non nulla)
|
||||
if (tipodet.full())
|
||||
imponibile_iva += imposta_iva;
|
||||
|
||||
//distributore per il lordo iva (che sara' distribuito successivamente in base..
|
||||
//..agli importi delle righe analitiche corretti per le % iva
|
||||
TGeneric_distrib agip (imponibile_iva, TCurrency::get_firm_dec());
|
||||
|
||||
for (int k = 1; k <= anal_rows.rows(); k++) //scansiona righe analitiche..
|
||||
//controllo prorata
|
||||
const TString80 commessa_riga_anal = anal_rows[k].get(RMOVANA_CODCMS);
|
||||
const TRectype& pla = cache().get(LF_COMMESSE, commessa_riga_anal);
|
||||
const bool prorata = pla.get_bool("PRORATA");
|
||||
if (prorata)
|
||||
{
|
||||
real perc_ded_iva = UNO; //%iva deducibile (di default 100, a meno del prorata)
|
||||
if (imposta_iva != ZERO)
|
||||
{
|
||||
//controllo prorata
|
||||
const TString80 commessa_riga_anal = anal_rows[k].get(RMOVANA_CODCMS);
|
||||
const TRectype& pla = cache().get(LF_COMMESSE, commessa_riga_anal);
|
||||
const bool prorata = pla.get_bool("PRORATA");
|
||||
if (prorata)
|
||||
{
|
||||
const TDate datareg = pn.curr().get_date(MOV_DATAREG);
|
||||
const int anno = datareg.year();
|
||||
TRegistro registro(pn.curr().get(MOV_REG), anno);
|
||||
//%deducibilità iva rivista con il prorata
|
||||
perc_ded_iva = (CENTO - registro.prorata(anno))/CENTO;
|
||||
imposta_iva.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
|
||||
}
|
||||
} //if imposta_iva...
|
||||
const TDate datareg = pn.curr().get_date(MOV_DATAREG);
|
||||
const int anno = datareg.year();
|
||||
TRegistro registro(pn.curr().get(MOV_REG), anno);
|
||||
//%deducibilità iva rivista con il prorata
|
||||
perc_ded_iva = (CENTO - registro.prorata(anno))/CENTO;
|
||||
imposta_iva.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
|
||||
}
|
||||
} //if imposta_iva...
|
||||
|
||||
//prende il conto sulla riga analitica e lo confronta con quello della riga iva
|
||||
const int gruppo_anal = atoi(anal_rows[k].get(RMOVANA_CODCONTO).left(3));
|
||||
const int conto_anal = atoi(anal_rows[k].get(RMOVANA_CODCONTO).mid(3,3));
|
||||
const long sottoconto_anal = atol(anal_rows[k].get(RMOVANA_CODCONTO).mid(6,6));
|
||||
|
||||
//il codconto anale e iva coincidono?..
|
||||
if (gruppo_iva == gruppo_anal && conto_iva == conto_anal && sottoconto_iva == sottoconto_anal)
|
||||
{
|
||||
//..in tal caso aggiunge l'importo della riga analitica al distributore, dopo..
|
||||
//..averlo corretto in base alle % precedentemente calcolate
|
||||
real importo_anal = anal_rows[k].get_real(RMOVANA_IMPORTO);
|
||||
const real perc_iva = imposta_iva / imponibile_iva;
|
||||
const real perc_corretta_iva = perc_iva * (UNO - perc_ded_iva);
|
||||
importo_anal = importo_anal * (UNO - perc_corretta_iva);
|
||||
|
||||
agip.add(importo_anal);
|
||||
} //if(gruppo_iva==...
|
||||
} //for (anal_rows...
|
||||
|
||||
for (int l = 1; l <= anal_rows.rows(); l++) //..allora le scansiona..
|
||||
{
|
||||
//prende il conto sulla riga analitica e lo confronta con quello della riga iva
|
||||
const int gruppo_anal = atoi(anal_rows[l].get(RMOVANA_CODCONTO).left(3));
|
||||
const int conto_anal = atoi(anal_rows[l].get(RMOVANA_CODCONTO).mid(3,3));
|
||||
const long sottoconto_anal = atol(anal_rows[l].get(RMOVANA_CODCONTO).mid(6,6));
|
||||
|
||||
//il codconto anale e iva coincidono?
|
||||
if (gruppo_iva == gruppo_anal && conto_iva == conto_anal && sottoconto_iva == sottoconto_anal)
|
||||
{
|
||||
//impoerto
|
||||
real importo = agip.get();
|
||||
//commessa,cdc,fase della riga analitica devono essere coincidenti con quelle dello sheet
|
||||
if (check_cms_cdc_fsc(anal_rows[l]))
|
||||
{
|
||||
//costruzione dell'assoc_array 'commesse' con cms/cdc/fsc ed importi
|
||||
TToken_string cms_cdc_fsc;
|
||||
cms_cdc_fsc.add(anal_rows[l].get(RMOVANA_CODCMS));
|
||||
cms_cdc_fsc.add(anal_rows[l].get(RMOVANA_CODCCOSTO));
|
||||
cms_cdc_fsc.add(anal_rows[l].get(RMOVANA_CODFASE));
|
||||
|
||||
real* imp = (real*)commesse.objptr(cms_cdc_fsc);
|
||||
//aggiunge un elemento all'assoc_array...
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_cdc_fsc, imp);
|
||||
}
|
||||
*imp += importo;
|
||||
totdoc_cms += importo;
|
||||
|
||||
} //if check_cms_cdc_fsc...
|
||||
|
||||
} //if(gruppo_iva==...
|
||||
|
||||
} //for (anal_rows...
|
||||
|
||||
} //if anal_rows() > 0...
|
||||
} //if indicatore_bilancio!=5...
|
||||
|
||||
} //for (pn.iva_items(...
|
||||
|
||||
totdoc = totale_documento(pn.curr()); //tot doc con ritenute fiscali + ritenute sociali (da stampare)
|
||||
totdoc_netto = pn.curr().get_real(MOV_TOTDOC); //questo si usa solo per il calcolo del residuo
|
||||
} //if(pn.iva_items(...
|
||||
else //..movimento NON iva (sempre con saldaconto)
|
||||
{
|
||||
for (int j = 0; j < pn.cg_items(); j++)
|
||||
{
|
||||
const TRectype& rmov = pn.cg(j);
|
||||
const TBill zio_cg(rmov);
|
||||
|
||||
TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO));
|
||||
importo.normalize('D');
|
||||
|
||||
if (zio_cg.tipo() > ' ')
|
||||
{
|
||||
totdoc -= importo.valore();
|
||||
totdoc_netto -= importo.valore(); //valore per il calcolo del residuo
|
||||
}
|
||||
else
|
||||
if (cerca_fiscali(zio_cg) || cerca_sociali(zio_cg))
|
||||
totdoc -= importo.valore(); //valore da stampare nella colonna Tot.fattura con ritenute
|
||||
} //for j < pn.cg_items...
|
||||
|
||||
TAnal_mov anal_mov(nreg);
|
||||
TRecord_array& anal_rows = anal_mov.body();
|
||||
|
||||
if (anal_rows.rows() > 0) //se il movana ha righe...
|
||||
{
|
||||
|
||||
for (int k = 1; k <= anal_rows.rows(); k++) //..allora le scansiona..
|
||||
{
|
||||
//prende gr/co/sott sulla riga analitica...
|
||||
//prende il conto sulla riga analitica e lo confronta con quello della riga iva
|
||||
const int gruppo_anal = atoi(anal_rows[k].get(RMOVANA_CODCONTO).left(3));
|
||||
const int conto_anal = atoi(anal_rows[k].get(RMOVANA_CODCONTO).mid(3,3));
|
||||
const long sottoconto_anal = atol(anal_rows[k].get(RMOVANA_CODCONTO).mid(6,6));
|
||||
//..e crea il conto contabile corrispondente
|
||||
TBill conto_cg(gruppo_anal, conto_anal, sottoconto_anal);
|
||||
|
||||
//l'indicatore di bilancio del conto contabile appena creato e' valido?
|
||||
if (conto_cg.indicatore_bilancio() != 5)
|
||||
{
|
||||
const real importo_anal = anal_rows[k].get_real(RMOVANA_IMPORTO);
|
||||
|
||||
//costruzione dell'assoc_array 'commesse' con cms/cdc/fsc ed importi
|
||||
TToken_string cms_cdc_fsc;
|
||||
cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODCMS));
|
||||
cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODCCOSTO));
|
||||
cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODFASE));
|
||||
//il codconto anale e iva coincidono?..
|
||||
if (gruppo_iva == gruppo_anal && conto_iva == conto_anal && sottoconto_iva == sottoconto_anal)
|
||||
{
|
||||
//..in tal caso aggiunge l'importo della riga analitica al distributore, dopo..
|
||||
//..averlo corretto in base alle % precedentemente calcolate
|
||||
real importo_anal = anal_rows[k].get_real(RMOVANA_IMPORTO);
|
||||
const real perc_iva = imposta_iva / imponibile_iva;
|
||||
const real perc_corretta_iva = perc_iva * (UNO - perc_ded_iva);
|
||||
importo_anal = importo_anal * (UNO - perc_corretta_iva);
|
||||
|
||||
real* imp = (real*)commesse.objptr(cms_cdc_fsc);
|
||||
agip.add(importo_anal);
|
||||
} //if(gruppo_iva==...
|
||||
} //for (anal_rows...
|
||||
|
||||
if (imp == NULL)
|
||||
for (int l = 1; l <= anal_rows.rows(); l++) //..allora le scansiona..
|
||||
{
|
||||
//prende il conto sulla riga analitica e lo confronta con quello della riga iva
|
||||
const int gruppo_anal = atoi(anal_rows[l].get(RMOVANA_CODCONTO).left(3));
|
||||
const int conto_anal = atoi(anal_rows[l].get(RMOVANA_CODCONTO).mid(3,3));
|
||||
const long sottoconto_anal = atol(anal_rows[l].get(RMOVANA_CODCONTO).mid(6,6));
|
||||
|
||||
//il codconto anale e iva coincidono?
|
||||
if (gruppo_iva == gruppo_anal && conto_iva == conto_anal && sottoconto_iva == sottoconto_anal)
|
||||
{
|
||||
//impoerto
|
||||
real importo = agip.get();
|
||||
//commessa,cdc,fase della riga analitica devono essere coincidenti con quelle dello sheet
|
||||
if (check_cms_cdc_fsc(anal_rows[l]))
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_cdc_fsc, imp);
|
||||
}
|
||||
//costruzione dell'assoc_array 'commesse' con cms/cdc/fsc ed importi
|
||||
TToken_string cms_cdc_fsc;
|
||||
cms_cdc_fsc.add(anal_rows[l].get(RMOVANA_CODCMS));
|
||||
cms_cdc_fsc.add(anal_rows[l].get(RMOVANA_CODCCOSTO));
|
||||
cms_cdc_fsc.add(anal_rows[l].get(RMOVANA_CODFASE));
|
||||
|
||||
TImporto importo(anal_rows[k].get_char(RMOVANA_SEZIONE), anal_rows[k].get_real(RMOVANA_IMPORTO));
|
||||
importo.normalize('D');
|
||||
real* imp = (real*)commesse.objptr(cms_cdc_fsc);
|
||||
//aggiunge un elemento all'assoc_array...
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_cdc_fsc, imp);
|
||||
}
|
||||
*imp += importo;
|
||||
totdoc_cms += importo;
|
||||
|
||||
*imp += importo.valore();
|
||||
totdoc_cms += importo.valore();
|
||||
} //if(conto_cg.indicatore...
|
||||
} //for(k<anal_rows...
|
||||
} //if(anal_rows>0...
|
||||
} //else (pn.iva_items(...
|
||||
} //if check_cms_cdc_fsc...
|
||||
|
||||
//parte comune a movimenti IVA e non (vengono anche qui considerate le ritenute fiscali
|
||||
//e sociali perche' possono essere state inserite direttamente nella partita e non nel movimento
|
||||
//(quindi non si puo' in questo caso applicare la totale_documento()
|
||||
//Le ritenute fiscali vanno sempre sommate..
|
||||
real totpagato = riga_pag.get_real(PART_IMPORTO) + riga_pag.get_real(PART_RITENUTE);
|
||||
//Le ritenute sociali invece vanno testate con la test_swap..
|
||||
const real ritsoc = riga_pag.get_real(PART_RITSOC);
|
||||
if (!ritsoc.is_zero())
|
||||
} //if(gruppo_iva==...
|
||||
|
||||
} //for (anal_rows...
|
||||
|
||||
} //if indicatore_bilancio!=5...
|
||||
|
||||
} //for (pn.iva_items(...
|
||||
|
||||
totdoc = totale_documento(pn.curr()); //tot doc con ritenute fiscali + ritenute sociali (da stampare)
|
||||
totdoc_netto = pn.curr().get_real(MOV_TOTDOC); //questo si usa solo per il calcolo del residuo
|
||||
} //if(pn.iva_items(...
|
||||
else //..movimento NON iva (sempre con saldaconto)
|
||||
{
|
||||
for (int j = 0; j < pn.cg_items(); j++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
const TRectype& rmov = pn.cg(j);
|
||||
const TBill zio_cg(rmov);
|
||||
|
||||
const real percentuale = totpagato / totdoc_netto;
|
||||
TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO));
|
||||
importo.normalize('D');
|
||||
|
||||
//calcolo del residuo (solo movimenti saldacontati)
|
||||
//mi servono,dalla riga partita che viene passata,i valori dei campi per la chiave del
|
||||
//file delle scadenze
|
||||
const TPartita match(riga_pag);
|
||||
//ci serve la riga di fattura che origina la nostra riga pagamento
|
||||
const int riga_fatt = cerca_riga_fattura_origine(match, riga_pag);
|
||||
//quanto era stato pagato del documento prima della attuale riga_pag
|
||||
const real totpagato_prec = calcola_pagato_prec(match, riga_fatt, riga_pag);
|
||||
const real perc_prec = totpagato_prec / totdoc_netto;
|
||||
|
||||
TGeneric_distrib distributore(totdoc_cms * percentuale, TCurrency::get_firm_dec());
|
||||
TGeneric_distrib distributore_prec(totdoc_cms * perc_prec, TCurrency::get_firm_dec());
|
||||
{
|
||||
FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
|
||||
if (zio_cg.tipo() > ' ')
|
||||
{
|
||||
const real& impcms = *(real*)imp;
|
||||
distributore.add(impcms);
|
||||
distributore_prec.add(impcms); //distributore di importo pagato sulle commesse
|
||||
totdoc -= importo.valore();
|
||||
totdoc_netto -= importo.valore(); //valore per il calcolo del residuo
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
if (cerca_fiscali(zio_cg) || cerca_sociali(zio_cg))
|
||||
totdoc -= importo.valore(); //valore da stampare nella colonna Tot.fattura con ritenute
|
||||
} //for j < pn.cg_items...
|
||||
|
||||
for (int k = 1; k <= anal_rows.rows(); k++) //..allora le scansiona..
|
||||
{
|
||||
//prende gr/co/sott sulla riga analitica...
|
||||
const int gruppo_anal = atoi(anal_rows[k].get(RMOVANA_CODCONTO).left(3));
|
||||
const int conto_anal = atoi(anal_rows[k].get(RMOVANA_CODCONTO).mid(3,3));
|
||||
const long sottoconto_anal = atol(anal_rows[k].get(RMOVANA_CODCONTO).mid(6,6));
|
||||
//..e crea il conto contabile corrispondente
|
||||
TBill conto_cg(gruppo_anal, conto_anal, sottoconto_anal);
|
||||
|
||||
//l'indicatore di bilancio del conto contabile appena creato e' valido?
|
||||
if (conto_cg.indicatore_bilancio() != 5)
|
||||
{
|
||||
const real importo_anal = anal_rows[k].get_real(RMOVANA_IMPORTO);
|
||||
|
||||
//costruzione dell'assoc_array 'commesse' con cms/cdc/fsc ed importi
|
||||
TToken_string cms_cdc_fsc;
|
||||
cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODCMS));
|
||||
cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODCCOSTO));
|
||||
cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODFASE));
|
||||
|
||||
real* imp = (real*)commesse.objptr(cms_cdc_fsc);
|
||||
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_cdc_fsc, imp);
|
||||
}
|
||||
|
||||
TImporto importo(anal_rows[k].get_char(RMOVANA_SEZIONE), anal_rows[k].get_real(RMOVANA_IMPORTO));
|
||||
importo.normalize('D');
|
||||
|
||||
*imp += importo.valore();
|
||||
totdoc_cms += importo.valore();
|
||||
} //if(conto_cg.indicatore...
|
||||
} //for(k<anal_rows...
|
||||
} //else (pn.iva_items(...
|
||||
|
||||
//parte comune a movimenti IVA e non (vengono anche qui considerate le ritenute fiscali
|
||||
//e sociali perche' possono essere state inserite direttamente nella partita e non nel movimento
|
||||
//(quindi non si puo' in questo caso applicare la totale_documento()
|
||||
//Le ritenute fiscali vanno sempre sommate..
|
||||
real totpagato = riga_pag.get_real(PART_IMPORTO) + riga_pag.get_real(PART_RITENUTE);
|
||||
//Le ritenute sociali invece vanno testate con la test_swap..
|
||||
const real ritsoc = riga_pag.get_real(PART_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;
|
||||
}
|
||||
|
||||
const real percentuale = totpagato / totdoc_netto;
|
||||
|
||||
//calcolo del residuo (solo movimenti saldacontati)
|
||||
//mi servono,dalla riga partita che viene passata,i valori dei campi per la chiave del
|
||||
//file delle scadenze
|
||||
const TPartita match(riga_pag);
|
||||
//ci serve la riga di fattura che origina la nostra riga pagamento
|
||||
const int riga_fatt = cerca_riga_fattura_origine(match, riga_pag);
|
||||
//quanto era stato pagato del documento prima della attuale riga_pag
|
||||
const real totpagato_prec = calcola_pagato_prec(match, riga_fatt, riga_pag);
|
||||
const real perc_prec = totpagato_prec / totdoc_netto;
|
||||
|
||||
TGeneric_distrib distributore(totdoc_cms * percentuale, TCurrency::get_firm_dec());
|
||||
TGeneric_distrib distributore_prec(totdoc_cms * perc_prec, TCurrency::get_firm_dec());
|
||||
{
|
||||
FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
|
||||
{
|
||||
const real& impcms = *(real*)imp;
|
||||
distributore.add(impcms);
|
||||
distributore_prec.add(impcms); //distributore di importo pagato sulle commesse
|
||||
}
|
||||
}
|
||||
|
||||
// campi del pagamento che vanno spediti nel file temporaneo
|
||||
//codice fornitore e descrizione
|
||||
const long codforn = riga_pag.get_long(PART_SOTTOCONTO);
|
||||
tmpcurr.put("CODFORN", codforn);
|
||||
TString16 keyclifo;
|
||||
keyclifo.format("F|%ld", codforn);
|
||||
const TRectype& rec_clifo = cache().get(LF_CLIFO, keyclifo);
|
||||
tmpcurr.put("DESFORN", rec_clifo.get(CLI_RAGSOC));
|
||||
FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
|
||||
{
|
||||
const real& impcms = *(real*)imp;
|
||||
|
||||
//nreg,data pagamento,descrizione pagamento
|
||||
tmpcurr.put("NREG", nreg);
|
||||
tmpcurr.put("DATAPAG", riga_pag.get_date(PART_DATAPAG));
|
||||
tmpcurr.put("DATAREG", riga_pag.get_date(PART_DATAREG));
|
||||
tmpcurr.put("DESCRPAG", riga_pag.get(PART_DESCR));
|
||||
// campi del pagamento che vanno spediti nel file temporaneo
|
||||
//codice fornitore e descrizione
|
||||
const long codforn = riga_pag.get_long(PART_SOTTOCONTO);
|
||||
tmpcurr.put("CODFORN", codforn);
|
||||
TString16 keyclifo;
|
||||
keyclifo.format("F|%ld", codforn);
|
||||
const TRectype& rec_clifo = cache().get(LF_CLIFO, keyclifo);
|
||||
tmpcurr.put("DESFORN", rec_clifo.get(CLI_RAGSOC));
|
||||
|
||||
//documento origine
|
||||
tmpcurr.put("NDOC", movfat.get_long(MOV_NUMDOC));
|
||||
tmpcurr.put("DATADOC", movfat.get_date(MOV_DATADOC));
|
||||
tmpcurr.put("PROT", movfat.get_long(MOV_PROTIVA));
|
||||
tmpcurr.put("TOTDOC", totdoc);
|
||||
tmpcurr.put("TOTPAG", distributore.get()); //pagamento nella partita
|
||||
//totres = importo da pagare (sulla fattura) - pagamenti precedenti al
|
||||
tmpcurr.put("TOTRES", impcms - distributore_prec.get());
|
||||
|
||||
//campi relativi a cdc,commessa,fase
|
||||
TToken_string cdc_cms_fsc = k;
|
||||
tmpcurr.put("CMS",cdc_cms_fsc.get(0));
|
||||
tmpcurr.put("CDC",cdc_cms_fsc.get(1));
|
||||
tmpcurr.put("FSC",cdc_cms_fsc.get(2));
|
||||
//nreg,data pagamento,descrizione pagamento
|
||||
tmpcurr.put("NREG", nreg);
|
||||
tmpcurr.put("DATAPAG", riga_pag.get_date(PART_DATAPAG));
|
||||
tmpcurr.put("DATAREG", riga_pag.get_date(PART_DATAREG));
|
||||
tmpcurr.put("DESCRPAG", riga_pag.get(PART_DESCR));
|
||||
|
||||
//e finalmente aggiunge il record al file temporaneo
|
||||
_tmp->write();
|
||||
} //FOR_EACH_...
|
||||
//documento origine
|
||||
tmpcurr.put("NDOC", movfat.get_long(MOV_NUMDOC));
|
||||
tmpcurr.put("DATADOC", movfat.get_date(MOV_DATADOC));
|
||||
tmpcurr.put("PROT", movfat.get_long(MOV_PROTIVA));
|
||||
tmpcurr.put("TOTDOC", totdoc);
|
||||
tmpcurr.put("TOTPAG", distributore.get()); //pagamento nella partita
|
||||
//totres = importo da pagare (sulla fattura) - pagamenti precedenti al
|
||||
tmpcurr.put("TOTRES", impcms - distributore_prec.get());
|
||||
|
||||
//campi relativi a cdc,commessa,fase
|
||||
TToken_string cdc_cms_fsc = k;
|
||||
tmpcurr.put("CMS",cdc_cms_fsc.get(0));
|
||||
tmpcurr.put("CDC",cdc_cms_fsc.get(1));
|
||||
tmpcurr.put("FSC",cdc_cms_fsc.get(2));
|
||||
|
||||
} //pn.read()...
|
||||
//e finalmente aggiunge il record al file temporaneo
|
||||
_tmp->write();
|
||||
} //FOR_EACH_...
|
||||
|
||||
} //pn.read()...
|
||||
|
||||
} //if (items>0...
|
||||
}
|
||||
|
||||
bool TPag_per_cms_recordset::part_callback(const TRelation& rel, void* pJolly)
|
||||
@ -1001,12 +1000,14 @@ bool TPag_per_cms_recordset::part_callback(const TRelation& rel, void* pJolly)
|
||||
void TPag_per_cms_recordset::scan_pags()
|
||||
{
|
||||
//costruzione filtro
|
||||
TRectype filtrec(LF_PARTITE);
|
||||
filtrec.put(PART_TIPOCF, 'F');
|
||||
filtrec.put(PART_GRUPPO, 0);
|
||||
filtrec.put(PART_CONTO, 0);
|
||||
if (_codfor > 0)
|
||||
filtrec.put(PART_SOTTOCONTO, _codfor);
|
||||
TRectype dafiltrec(LF_PARTITE);
|
||||
dafiltrec.put(PART_TIPOCF, 'F');
|
||||
dafiltrec.put(PART_GRUPPO, 0);
|
||||
dafiltrec.put(PART_CONTO, 0);
|
||||
dafiltrec.put(PART_SOTTOCONTO, _dacodfor);
|
||||
|
||||
TRectype afiltrec(dafiltrec);
|
||||
afiltrec.put(PART_SOTTOCONTO, _acodfor);
|
||||
|
||||
TString filtro = "(TIPOMOV>=\"3\")"; //deve essere un pagamento a fornitore!!!
|
||||
|
||||
@ -1024,11 +1025,11 @@ void TPag_per_cms_recordset::scan_pags()
|
||||
}
|
||||
//applica il filtro alla relazione
|
||||
TRelation rel(LF_PARTITE);
|
||||
TCursor cur(&rel, filtro, 1, &filtrec, &filtrec);
|
||||
TCursor cur(&rel, filtro, 1, &dafiltrec, &afiltrec);
|
||||
cur.scan(part_callback, this, "Movimenti con saldaconto...");
|
||||
}
|
||||
|
||||
void TPag_per_cms_recordset::set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long codfor, const TString& campodata)
|
||||
void TPag_per_cms_recordset::set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long dacodfor, const long acodfor, const TString& campodata)
|
||||
{
|
||||
//se esiste il file temporano con tracciato persomalizzato lo cancella e lo ricrea vuoto
|
||||
TFilename trr; //file tracciato record
|
||||
@ -1043,7 +1044,8 @@ void TPag_per_cms_recordset::set_filter(const TPag_per_cms_mask& msk, const int
|
||||
//deve stare qui per poter generare la chiave del file temporaneo in base al tipo di data di estrazione
|
||||
_campodata = campodata;
|
||||
//stessa cosa per il simpatico codice fornitore
|
||||
_codfor = codfor;
|
||||
_dacodfor = dacodfor;
|
||||
_acodfor = acodfor;
|
||||
|
||||
//crea il file .trr in base ai parametri del metodo
|
||||
crea_trr(trr);
|
||||
@ -1085,7 +1087,7 @@ void TPag_per_cms_recordset::set_filter(const TPag_per_cms_mask& msk, const int
|
||||
scan_pags();
|
||||
|
||||
//se c'e' un filtro sui fornitori, non si fa lo scan dei movimenti senza saldaconto
|
||||
if (codfor <= 0)
|
||||
if (dacodfor <= 0 && acodfor <= 0)
|
||||
scan_movs();
|
||||
}
|
||||
|
||||
@ -1100,7 +1102,7 @@ protected:
|
||||
virtual bool get_usr_val(const TString& name, TVariant& var) const;
|
||||
|
||||
public:
|
||||
void set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long codfor, const TString& campodata);
|
||||
void set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long dacodfor, const long acodfor, const TString& campodata);
|
||||
};
|
||||
|
||||
|
||||
@ -1117,7 +1119,7 @@ bool TPag_per_cms_rep::set_recordset(const TString& sql)
|
||||
}
|
||||
|
||||
|
||||
void TPag_per_cms_rep::set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long codfor, const TString& campodata)
|
||||
void TPag_per_cms_rep::set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long dacodfor, const long acodfor, const TString& campodata)
|
||||
{
|
||||
TAnal_report::set_recordset(NULL);
|
||||
|
||||
@ -1125,7 +1127,7 @@ void TPag_per_cms_rep::set_filter(const TPag_per_cms_mask& msk, const int cms_ro
|
||||
|
||||
TPag_per_cms_recordset* recset = new TPag_per_cms_recordset(query);
|
||||
|
||||
recset->set_filter(msk, cms_row, codfor, campodata);
|
||||
recset->set_filter(msk, cms_row, dacodfor, acodfor, campodata);
|
||||
TAnal_report::set_recordset(recset);
|
||||
}
|
||||
|
||||
@ -1138,7 +1140,9 @@ void TPag_per_cms_rep::set_filter(const TPag_per_cms_mask& msk, const int cms_ro
|
||||
class TPag_per_cms : public TSkeleton_application
|
||||
{
|
||||
public:
|
||||
void stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_book& book, TPag_per_cms_rep& rep, const long codfor, const TString& campodata);
|
||||
void stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_book& book,
|
||||
TPag_per_cms_rep& rep, const long dacodfor, const long acodfor,
|
||||
const TString& campodata);
|
||||
const TMultilevel_code_info& get_level_one() const;
|
||||
virtual void main_loop();
|
||||
};
|
||||
@ -1152,7 +1156,9 @@ const TMultilevel_code_info& TPag_per_cms::get_level_one() const
|
||||
return ca_multilevel_code_info(logic);
|
||||
}
|
||||
|
||||
void TPag_per_cms::stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_book& book, TPag_per_cms_rep& rep, const long codfor, const TString& campodata)
|
||||
void TPag_per_cms::stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_book& book, TPag_per_cms_rep& rep,
|
||||
const long dacodfor, const long acodfor,
|
||||
const TString& campodata)
|
||||
{
|
||||
TSheet_field& sheet = mask.sfield(F_RIGHE);
|
||||
TString video_string; //stringa che compare nella progind
|
||||
@ -1178,7 +1184,7 @@ void TPag_per_cms::stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_bo
|
||||
for (int l = liv1.levels()-2; l >= 0; l--) //se la struttura è a più livelli costruisce la tokenstring
|
||||
row.insert("|", liv1.total_len(l));
|
||||
|
||||
rep.set_filter(mask, 0, codfor, campodata); //fa la set filter sulla prima riga (che è quella usata)
|
||||
rep.set_filter(mask, 0, dacodfor, acodfor, campodata); //fa la set filter sulla prima riga (che è quella usata)
|
||||
book.add(rep);
|
||||
}
|
||||
sheet.destroy(); //cancella le commesse aggiunte in automatico sullo sheet
|
||||
@ -1187,7 +1193,7 @@ void TPag_per_cms::stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_bo
|
||||
{
|
||||
FOR_EACH_SHEET_ROW(sheet, r, row) //per ogni cdc/cms che appare nello sheet di pag.1 della msk..
|
||||
{
|
||||
rep.set_filter(mask, r, codfor, campodata); //..chiama il metodone globale che crea e compila il file..
|
||||
rep.set_filter(mask, r, dacodfor, acodfor, campodata); //..chiama il metodone globale che crea e compila il file..
|
||||
//..temporaneo i cui dati riempiranno il report
|
||||
book.add(rep); //aggiunge il report relativo alla cdc/cms corrente al book
|
||||
}
|
||||
@ -1227,25 +1233,13 @@ void TPag_per_cms::main_loop()
|
||||
default:break;
|
||||
}
|
||||
|
||||
//scansione su tutti i fornitori selezionati; questa opzione e' praticamente utile solo..
|
||||
//..quando il numero di fornitori selezionati non e' elevato;infatti,per ogni fornitore..
|
||||
//..selezionato, viene eseguito tutto il giro del programma
|
||||
const long dacodfor = mask.get_long(F_DACODFOR);
|
||||
const long acodfor = mask.get_long(F_ACODFOR);
|
||||
|
||||
if (dacodfor > 0 || acodfor > 0) //specifica il range dei clifo..
|
||||
{
|
||||
TISAM_recordset clifo("USE CLIFO\nFROM TIPOCF='F' CODCF=#DACODFOR\nTO TIPOCF='F' CODCF=#ACODFOR");
|
||||
clifo.set_var("#DACODFOR", TVariant(dacodfor));
|
||||
clifo.set_var("#ACODFOR", TVariant(acodfor));
|
||||
//scansione su tutti i fornitori selezionati; questa opzione e' praticamente utile solo..
|
||||
//..quando il numero di fornitori selezionati non e' elevato;infatti,per ogni fornitore..
|
||||
//..selezionato, viene eseguito tutto il giro del programma
|
||||
for (bool ok = clifo.move_first(); ok; ok = clifo.move_next())
|
||||
{
|
||||
const long codforn = clifo.get("CODCF").as_int();
|
||||
stampa_per_commessa(mask, book, rep, codforn, campodata);
|
||||
}
|
||||
}
|
||||
else
|
||||
stampa_per_commessa(mask, book, rep, 0, campodata); //se non si specifica alcun clifo...
|
||||
stampa_per_commessa(mask, book, rep, dacodfor, acodfor, campodata); //se non si specifica alcun clifo...
|
||||
|
||||
book.print_or_preview(); //stampa il book dei report
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user