Patch level :2.2 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento :stampa pagato analitica in corso d'opera (un casino pauroso!) git-svn-id: svn://10.65.10.50/trunk@13585 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
0bd4accb45
commit
3e93550834
553
ca/ca3600.cpp
553
ca/ca3600.cpp
@ -13,7 +13,6 @@
|
||||
#include "..\cg\cg2103.h"
|
||||
#include "..\ve\velib.h"
|
||||
|
||||
#include "panapdc.h"
|
||||
#include "pconana.h"
|
||||
#include "movana.h"
|
||||
#include "rmovana.h"
|
||||
@ -105,7 +104,7 @@ bool TPag_per_cms_mask::on_field_event(TOperable_field& o, TField_event e, long
|
||||
if (e == fe_button)
|
||||
{
|
||||
config_setter(sfield(F_PDCC), "Pdcc");
|
||||
config_setter(sfield(F_PDCA), "Pdca");
|
||||
// config_setter(sfield(F_PDCA), "Pdca"); ***per ora solo Pdcc***
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -121,9 +120,9 @@ TPag_per_cms_mask::TPag_per_cms_mask()
|
||||
// creazione dei campi della pagina della maschera con lo sheet di cdc/cms/fasi
|
||||
create_sheet(F_RIGHE);
|
||||
|
||||
//Seconda pagina (sheets dei conti)
|
||||
//Seconda pagina (sheets dei conti) ***per ora solo Pdcc***
|
||||
//Controllo sul tipo di piano dei conti da utilizzare (Analitico/Contabile)
|
||||
TConfig& cfg = ca_config();
|
||||
/* TConfig& cfg = ca_config();
|
||||
const bool use_pdcc = cfg.get_bool("UsePdcc");
|
||||
|
||||
set(F_PIANO, use_pdcc ? "Contabile" : "Analitico");
|
||||
@ -145,8 +144,9 @@ TPag_per_cms_mask::TPag_per_cms_mask()
|
||||
sfield(F_PDCA).sheet_mask().hide(-1);
|
||||
|
||||
config_loader(sfield(F_PDCA), "Pdca");
|
||||
}
|
||||
|
||||
}*/
|
||||
//carica i parametri dei conti per lo sheet dei conti contabili
|
||||
config_loader(sfield(F_PDCC), "Pdcc");
|
||||
// setta gli handlers a tutti i campi generati della maschera;senza questa chiamata la on_field_event
|
||||
// non puo' funzionare sui campi generati!!!
|
||||
set_handlers();
|
||||
@ -200,6 +200,8 @@ protected:
|
||||
long _codfor;
|
||||
TString8 _campodata;
|
||||
TString _codcosto, _codcms, _codfas;
|
||||
TAssoc_array _costi,_pagamenti,_fiscali,_sociali; //array che contengono i conti letti dal .ini
|
||||
|
||||
|
||||
protected: //da libreria
|
||||
// virtual const TVariant& get(const char* column_name) const;
|
||||
@ -210,6 +212,12 @@ protected:
|
||||
static bool mov_callback(const TRelation& rel, void* pJolly);
|
||||
long find_movimento(const TRectype& riga_pag) const;
|
||||
void find_commesse(const long nreg, const TRectype& riga_pag);
|
||||
bool check_cms_cdc_fsc(const TRectype& rec_analriga);
|
||||
void lettura_conti(TAssoc_array& assoc, const char tipoconto);
|
||||
int cerca_riga_fattura_origine(const TPartita& match, const TRectype& riga_pag);
|
||||
real totale_documento(const TRectype& mov) const;
|
||||
real calcola_pagato_prec(const TPartita& match, const int riga_fatt, const TRectype& riga_pag);
|
||||
bool test_swap(TCausale& caus, bool ritsoc) const;
|
||||
|
||||
public:
|
||||
virtual void set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long codfor);
|
||||
@ -278,6 +286,100 @@ void TPag_per_cms_recordset::crea_trr(const TFilename& trr) const
|
||||
of << "CONTO+NREG+DATAPAG" << endl;
|
||||
}
|
||||
|
||||
void TPag_per_cms_recordset::lettura_conti(TAssoc_array& assoc, const char tipoconto)
|
||||
{
|
||||
TConfig conti("ca3600.ini","Pdcc"); //paragrafo da scandire nell'ini (solo conti contabili!!)
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
// Controlla sulla causale se il segno del totale documento (ritsoc=FALSE)
|
||||
// o quello delle ritenute sociali (ritsoc=TRUE) e' invertito rispetto al normale
|
||||
bool TPag_per_cms_recordset::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;
|
||||
}
|
||||
|
||||
// Calcola il totale del documento tenendo conto del segno della prima riga e di quella delle
|
||||
// ritenute sociali sulla causale
|
||||
real TPag_per_cms_recordset::totale_documento(const TRectype& mov) const
|
||||
{
|
||||
real tot = mov.get_real(MOV_TOTDOC); // Legge totale
|
||||
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;
|
||||
}
|
||||
|
||||
return tot;
|
||||
}
|
||||
|
||||
int TPag_per_cms_recordset::cerca_riga_fattura_origine(const TPartita& match, const TRectype& riga_pag)
|
||||
{
|
||||
//scansione delle righe partita passata, precedenti alla riga_pag
|
||||
const int k = riga_pag.get_int(PART_NRIGA);
|
||||
for (int i = match.pred(k); i > 0; i = match.pred(i))
|
||||
{
|
||||
const TRiga_partite& riga_part = match.riga(i);
|
||||
if (riga_part.is_fattura())
|
||||
{
|
||||
for (int j = riga_part.rate(); j > 0; j--)
|
||||
{
|
||||
if (match.esiste(i, j, k)) //se esiste il pagamento k della rata j della riga partita i contenente la fattura
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
real TPag_per_cms_recordset::calcola_pagato_prec(const TPartita& match, const int riga_fatt, const TRectype& riga_pag)
|
||||
{
|
||||
real pagato = ZERO;
|
||||
if (riga_fatt > 0)
|
||||
{
|
||||
const int k = riga_pag.get_int(PART_NRIGA);
|
||||
const TDate data_rif = riga_pag.get(_campodata); //data di riferimento selezionata sulla maschera
|
||||
|
||||
const TRiga_partite& riga_part = match.riga(riga_fatt);
|
||||
for (int i = riga_part.rate(); i > 0; i--)
|
||||
{
|
||||
TRiga_scadenze& sc = riga_part.rata(i);
|
||||
for (int j = sc.last(); j > 0; j = sc.pred(j))
|
||||
{
|
||||
const TRiga_partite& pag = match.riga(j);
|
||||
const TDate datapag = pag.get_date(_campodata);
|
||||
const long cmp = datapag - data_rif;
|
||||
//la riga pagamento e' da considerare quando ha data anteriore a quella di riferimento oppur
|
||||
//ha data uguale ma numero di registrazione inferiore (insomma, il pagamento e' precedente
|
||||
//a quello di riga_pag)
|
||||
if (cmp < 0 || (cmp == 0 && j <= k))
|
||||
{
|
||||
pagato += pag.get_real(PAGSCA_IMPORTO);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return pagato;
|
||||
}
|
||||
|
||||
long TPag_per_cms_recordset::find_movimento(const TRectype& riga_pag) const
|
||||
{
|
||||
int n_fatture = 0; //numero di fatture trovate
|
||||
@ -376,189 +478,304 @@ void TPag_per_cms_recordset::scan_movs(const TPag_per_cms_mask& msk)
|
||||
crea_righe_stampa(_righesociali, 4);*/
|
||||
}
|
||||
|
||||
bool TPag_per_cms_recordset::check_cms_cdc_fsc(const TRectype& rec_analriga)
|
||||
{
|
||||
if (_codcosto.not_empty() && _codcosto != rec_analriga.get(RMOVANA_CODCCOSTO))
|
||||
return false;
|
||||
if (_codcms.not_empty() && _codcms != rec_analriga.get(RMOVANA_CODCMS))
|
||||
return false;
|
||||
if (_codfas.not_empty() && _codfas != rec_analriga.get(RMOVANA_CODFASE))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//prepara l'assoc con tutte le righe da mandare in stampa per quanto riguarda i movimenti con
|
||||
//saldaconto (siano essi con o senza iva)
|
||||
void TPag_per_cms_recordset::find_commesse(const long nreg, const TRectype& riga_pag)
|
||||
{
|
||||
/* TMovimentoPN pn;
|
||||
pn.curr().put(MOV_NUMREG, nreg);
|
||||
if (pn.read() == NOERR)
|
||||
//cerca un record di MOVANA che abbia numregcg = nreg;usa il nuovo metodo fighissimo..
|
||||
//..con la isam query
|
||||
TString query, strnreg;
|
||||
strnreg.format("%07ld", nreg);
|
||||
|
||||
query << "USE MOVANA KEY 3\n";
|
||||
query << "WHERE NUMREGCG=";
|
||||
query << strnreg;
|
||||
query << "\n";
|
||||
|
||||
TISAM_recordset movana(query);
|
||||
|
||||
for (TRecnotype i = 0; movana.move_to(i); i++)
|
||||
{
|
||||
const TRectype& movfat = pn.curr();
|
||||
const long numregcg = movana.get(MOVANA_NUMREGCG).as_int();
|
||||
//se trova il record cercato in RMOVANA...
|
||||
if (numregcg == nreg)
|
||||
{
|
||||
//prepara il record tmpcurr sul file temporaneo _tmp su cui registrare i dati da stampare
|
||||
TRectype& tmpcurr = _tmp->curr();
|
||||
tmpcurr.zero();
|
||||
|
||||
real totdoc_cms;
|
||||
real totdoc, totdoc_netto;
|
||||
TAssoc_array commesse;
|
||||
//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();
|
||||
|
||||
//Movimenti CON SALDACONTO
|
||||
//se movimento IVA..
|
||||
if (pn.iva_items() > 0)
|
||||
{
|
||||
for (int i = 0; i < pn.iva_items(); i++)
|
||||
{
|
||||
const TRectype& rmoviva = pn.iva(i);
|
||||
const TString& codcms = rmoviva.get(RMI_CODCMS);
|
||||
const TString& codfase = rmoviva.get(RMI_FASCMS);
|
||||
real totdoc_cms;
|
||||
real totdoc, totdoc_netto;
|
||||
TAssoc_array commesse;
|
||||
|
||||
const TBill conto(rmoviva);
|
||||
//Movimenti CON SALDACONTO
|
||||
//se movimento IVA..
|
||||
if (pn.iva_items() > 0)
|
||||
{
|
||||
for (int i = 0; i < pn.iva_items(); i++)
|
||||
{
|
||||
const TRectype& rmoviva = pn.iva(i);
|
||||
const TBill zio(rmoviva);
|
||||
//il tutto si fa solo se l'indicatore del conto nella riga iva e' != 5
|
||||
if (zio.indicatore_bilancio() != 5)
|
||||
{
|
||||
const int gruppo_iva = zio.gruppo();
|
||||
const int conto_iva = zio.conto();
|
||||
const long sottoconto_iva = zio.sottoconto();
|
||||
|
||||
if (cms_in_range(codcms, codfase) && conto.indicatore_bilancio() != 5)
|
||||
{
|
||||
TToken_string cms_fsc = codcms;
|
||||
if (codfase.not_empty())
|
||||
cms_fsc.add(codfase);
|
||||
//trova le RMOVANA del MOVANA corrente che hanno il conto = a quello della i-esima rigaiva
|
||||
TAnal_mov anal_mov(nreg);
|
||||
TRecord_array& anal_rows = anal_mov.body();
|
||||
|
||||
const real importo = rmoviva.get_real(RMI_IMPONIBILE);
|
||||
real imposta = rmoviva.get_real(RMI_IMPOSTA);
|
||||
real* imp = (real*)commesse.objptr(cms_fsc);
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_fsc, imp);
|
||||
}
|
||||
*imp += importo;
|
||||
totdoc_cms += importo;
|
||||
if (anal_rows.rows() > 0) //se il movana ha righe...
|
||||
{
|
||||
for (i = 1; i <= anal_rows.rows(); i++)
|
||||
{
|
||||
|
||||
if (imposta != ZERO)
|
||||
{
|
||||
//controllo prorata
|
||||
const TRectype& pla = cache().get("CMS", codcms);
|
||||
const bool prorata = pla.get_bool("B4");
|
||||
if (prorata)
|
||||
{
|
||||
const TDate datareg = pn.curr().get_date(MOV_DATAREG);
|
||||
const int anno = datareg.year();
|
||||
TRegistro registro(pn.curr().get(MOV_REG), anno);
|
||||
//prende il conto sulla riga analitica e lo confronta con quello della riga iva
|
||||
const int gruppo_anal = atoi(anal_rows[i].get(RMOVANA_CODCONTO).left(3));
|
||||
const int conto_anal = atoi(anal_rows[i].get(RMOVANA_CODCONTO).mid(3,3));
|
||||
const long sottoconto_anal = atol(anal_rows[i].get(RMOVANA_CODCONTO).mid(6,6));
|
||||
|
||||
imposta *= (CENTO - registro.prorata(anno))/CENTO;
|
||||
imposta.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
|
||||
}
|
||||
//il codconto anale e iva coincidono?
|
||||
if (gruppo_iva == gruppo_anal && conto_iva == conto_anal && sottoconto_iva == sottoconto_anal)
|
||||
{
|
||||
|
||||
*imp += imposta;
|
||||
totdoc_cms += imposta;
|
||||
}
|
||||
const real imponibile_iva = rmoviva.get_real(RMI_IMPONIBILE);
|
||||
real imposta_iva = rmoviva.get_real(RMI_IMPOSTA);
|
||||
|
||||
}
|
||||
}
|
||||
//commessa,cdc,fase della riga analitica devono essere coincidenti con quelle dello sheet
|
||||
if (check_cms_cdc_fsc(anal_rows[i]))
|
||||
{
|
||||
//costruzione dell'assoc_array con cms/cdc/fsc ed importi
|
||||
TToken_string cms_cdc_fsc;
|
||||
cms_cdc_fsc.add(anal_rows[i].get(RMOVANA_CODCMS));
|
||||
cms_cdc_fsc.add(anal_rows[i].get(RMOVANA_CODCCOSTO));
|
||||
cms_cdc_fsc.add(anal_rows[i].get(RMOVANA_CODFASE));
|
||||
|
||||
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
|
||||
}
|
||||
else //..movimento NON iva (sempre con saldaconto)
|
||||
{
|
||||
for (int i = 0; i < pn.cg_items(); i++)
|
||||
{
|
||||
const TRectype& rmov = pn.cg(i);
|
||||
const TBill conto(rmov);
|
||||
real* imp = (real*)commesse.objptr(cms_cdc_fsc);
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_cdc_fsc, imp);
|
||||
}
|
||||
*imp += imponibile_iva;
|
||||
totdoc_cms += imponibile_iva;
|
||||
|
||||
TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO));
|
||||
importo.normalize('D');
|
||||
if (imposta_iva != ZERO)
|
||||
{
|
||||
//controllo prorata
|
||||
const TRectype& pla = cache().get(LF_COMMESSE, anal_rows[i].get(RMOVANA_CODCMS));
|
||||
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);
|
||||
|
||||
if (conto.tipo() > ' ')
|
||||
{
|
||||
totdoc -= importo.valore();
|
||||
totdoc_netto -= importo.valore(); //valore per il calcolo del residuo
|
||||
continue;
|
||||
}
|
||||
imposta_iva *= (CENTO - registro.prorata(anno))/CENTO;
|
||||
imposta_iva.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
|
||||
}
|
||||
|
||||
if (cerca_fiscali(conto) || cerca_sociali(conto))
|
||||
{
|
||||
totdoc -= importo.valore(); //valore da stampare nella colonna Tot.fattura con ritenute
|
||||
continue;
|
||||
}
|
||||
*imp += imposta_iva;
|
||||
totdoc_cms += imposta_iva;
|
||||
}
|
||||
|
||||
const TString& codcms = rmov.get(RMV_CODCMS);
|
||||
const TString& codfase = rmov.get(RMV_FASCMS);
|
||||
/* TGeneric_distrib agip(imponibile_iva, TCurrency::get_firm_dec());
|
||||
FOR_EACH_ASSOC_OBJECT(commesse, h, k, importo)
|
||||
{
|
||||
const real& impcms = *(real*)importo;
|
||||
agip.add(impcms);
|
||||
agip_prec.add(impcms); //distributore di importo pagato sulle commesse
|
||||
}*/
|
||||
}
|
||||
|
||||
if (cms_in_range(codcms,codfase) && conto.indicatore_bilancio() != 5)
|
||||
{
|
||||
TToken_string cms_fsc = codcms;
|
||||
if (codfase.not_empty())
|
||||
cms_fsc.add(codfase);
|
||||
} //if(gruppo_iva==..
|
||||
|
||||
real* imp = (real*)commesse.objptr(cms_fsc);
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_fsc, imp);
|
||||
}
|
||||
*imp += importo.valore();
|
||||
totdoc_cms += importo.valore();
|
||||
}
|
||||
} //for (anal_rows...
|
||||
} //if anal_rows() > 0...
|
||||
} //if indicatore_bilancio!=5..
|
||||
|
||||
}
|
||||
}
|
||||
//aggiungi le slice con gli importi delle righe di analitica
|
||||
//estrai gli importi risultanti e aggiungili a commesse (come sotto) solo se la commessa coincide
|
||||
//con quella selezionata
|
||||
//ricordarsi di considerare l'indetraibilita'
|
||||
|
||||
//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
|
||||
}
|
||||
}
|
||||
/* if (conto.indicatore_bilancio() != 5)
|
||||
{
|
||||
const real importo = rmoviva.get_real(RMI_IMPONIBILE);
|
||||
real imposta = rmoviva.get_real(RMI_IMPOSTA);
|
||||
real* imp = (real*)commesse.objptr(cms_fsc);
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_fsc, imp);
|
||||
}
|
||||
*imp += importo;
|
||||
totdoc_cms += importo;
|
||||
|
||||
FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
|
||||
{
|
||||
const real& impcms = *(real*)imp;
|
||||
TPag_per_cms_struct* ppcs = new TPag_per_cms_struct;
|
||||
if (imposta != ZERO)
|
||||
{
|
||||
//controllo prorata
|
||||
const TRectype& pla = cache().get("CMS", codcms);
|
||||
const bool prorata = pla.get_bool("B4");
|
||||
if (prorata)
|
||||
{
|
||||
const TDate datareg = pn.curr().get_date(MOV_DATAREG);
|
||||
const int anno = datareg.year();
|
||||
TRegistro registro(pn.curr().get(MOV_REG), anno);
|
||||
|
||||
// campi del pagamento
|
||||
ppcs->_tipo = 0; //movimenti da saldaconto
|
||||
ppcs->_codforn = riga_pag.get_long(PART_SOTTOCONTO);
|
||||
ppcs->_datapag = riga_pag.get_date(_campodata);
|
||||
ppcs->_importopagato.set_num(distributore.get()); //pagamento nella partita
|
||||
ppcs->_importopagato_prec.set_num(distributore_prec.get()); //pagamenti precedenti al
|
||||
ppcs->_descrpagamento = riga_pag.get(PART_DESCR);
|
||||
// campi della fattura
|
||||
ppcs->_nreg = nreg;
|
||||
ppcs->_numfat = movfat.get(MOV_NUMDOC);
|
||||
ppcs->_datafat = movfat.get_date(MOV_DATADOC);
|
||||
ppcs->_protiva = movfat.get_long(MOV_PROTIVA);
|
||||
ppcs->_totfat = totdoc; //questo e' quello che viene stampato in Tot.fattura
|
||||
imposta *= (CENTO - registro.prorata(anno))/CENTO;
|
||||
imposta.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
|
||||
}
|
||||
|
||||
TToken_string cms_fsc = k;
|
||||
*imp += imposta;
|
||||
totdoc_cms += imposta;
|
||||
}
|
||||
|
||||
ppcs->_commessa = cms_fsc.get(0);
|
||||
ppcs->_fase = cms_fsc.get(1);
|
||||
ppcs->_importocommessa.set_num(impcms); //importo da pagare scritto sulla fattura
|
||||
}*/
|
||||
}
|
||||
|
||||
_righe.add(ppcs); //aggiunge il pagamento all'array dei pagamenti
|
||||
}
|
||||
}*/
|
||||
// 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
|
||||
}
|
||||
else //..movimento NON iva (sempre con saldaconto)
|
||||
{
|
||||
for (int i = 0; i < pn.cg_items(); i++)
|
||||
{
|
||||
const TRectype& rmov = pn.cg(i);
|
||||
const TBill conto(rmov);
|
||||
|
||||
TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO));
|
||||
importo.normalize('D');
|
||||
|
||||
if (conto.tipo() > ' ')
|
||||
{
|
||||
totdoc -= importo.valore();
|
||||
totdoc_netto -= importo.valore(); //valore per il calcolo del residuo
|
||||
continue;
|
||||
}
|
||||
|
||||
/* if (cerca_fiscali(conto) || cerca_sociali(conto))
|
||||
{
|
||||
totdoc -= importo.valore(); //valore da stampare nella colonna Tot.fattura con ritenute
|
||||
continue;
|
||||
}
|
||||
|
||||
const TString& codcms = rmov.get(RMV_CODCMS);
|
||||
const TString& codfase = rmov.get(RMV_FASCMS);
|
||||
|
||||
if (conto.indicatore_bilancio() != 5)
|
||||
{
|
||||
real* imp = (real*)commesse.objptr(cms_fsc);
|
||||
if (imp == NULL)
|
||||
{
|
||||
imp = new real;
|
||||
commesse.add(cms_fsc, imp);
|
||||
}
|
||||
*imp += importo.valore();
|
||||
totdoc_cms += importo.valore();
|
||||
}*/
|
||||
|
||||
}
|
||||
} //else...
|
||||
|
||||
//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
|
||||
}
|
||||
}
|
||||
|
||||
/* FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
|
||||
{
|
||||
const real& impcms = *(real*)imp;
|
||||
TPag_per_cms_struct* ppcs = new TPag_per_cms_struct;
|
||||
|
||||
// campi del pagamento
|
||||
ppcs->_tipo = 0; //movimenti da saldaconto
|
||||
ppcs->_codforn = riga_pag.get_long(PART_SOTTOCONTO);
|
||||
ppcs->_datapag = riga_pag.get_date(_campodata);
|
||||
ppcs->_importopagato.set_num(distributore.get()); //pagamento nella partita
|
||||
ppcs->_importopagato_prec.set_num(distributore_prec.get()); //pagamenti precedenti al
|
||||
ppcs->_descrpagamento = riga_pag.get(PART_DESCR);
|
||||
// campi della fattura
|
||||
ppcs->_nreg = nreg;
|
||||
ppcs->_numfat = movfat.get(MOV_NUMDOC);
|
||||
ppcs->_datafat = movfat.get_date(MOV_DATADOC);
|
||||
ppcs->_protiva = movfat.get_long(MOV_PROTIVA);
|
||||
ppcs->_totfat = totdoc; //questo e' quello che viene stampato in Tot.fattura
|
||||
|
||||
TToken_string cms_fsc = k;
|
||||
|
||||
ppcs->_commessa = cms_fsc.get(0);
|
||||
ppcs->_fase = cms_fsc.get(1);
|
||||
ppcs->_importocommessa.set_num(impcms); //importo da pagare scritto sulla fattura
|
||||
|
||||
_righe.add(ppcs); //aggiunge il pagamento all'array dei pagamenti
|
||||
}*/
|
||||
|
||||
} //pn.read()...
|
||||
} //if (numregcg==nreg)...
|
||||
} //for TRecnotype...
|
||||
}
|
||||
|
||||
bool TPag_per_cms_recordset::part_callback(const TRelation& rel, void* pJolly)
|
||||
@ -567,8 +784,8 @@ bool TPag_per_cms_recordset::part_callback(const TRelation& rel, void* pJolly)
|
||||
const TRectype& riga_part_pag = rel.curr();
|
||||
|
||||
const long nreg = recordset->find_movimento(riga_part_pag); //prima cerco un movimento della fattura...
|
||||
/* if (nreg > 0) //..se ne trovo almeno uno cerco la commessa corrispondente
|
||||
recordset->find_commesse(nreg, riga_part_pag);*/
|
||||
if (nreg > 0) //..se ne trovo almeno uno cerco la commessa corrispondente
|
||||
recordset->find_commesse(nreg, riga_part_pag);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -651,6 +868,13 @@ void TPag_per_cms_recordset::set_filter(const TPag_per_cms_mask& msk, const int
|
||||
_dadata = msk.get_date(F_DATAINI);
|
||||
_adata = msk.get_date(F_DATAFIN);
|
||||
|
||||
|
||||
//carica i conti memorizzati nel ca3600.ini
|
||||
lettura_conti(_costi, 'C');
|
||||
lettura_conti(_pagamenti, 'P');
|
||||
lettura_conti(_fiscali, 'F');
|
||||
lettura_conti(_sociali, 'S');
|
||||
|
||||
//scansione movimenti con saldaconto
|
||||
scan_pags(msk);
|
||||
|
||||
@ -766,6 +990,15 @@ void TPag_per_cms::stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_bo
|
||||
|
||||
void TPag_per_cms::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;
|
||||
}
|
||||
|
||||
TPag_per_cms_mask mask;
|
||||
while (mask.run() == K_ENTER)
|
||||
{
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
//sheets conti e righe relative
|
||||
#define F_PDCC 301
|
||||
#define F_PDCA 302
|
||||
//#define F_PDCA 302 ***per ora solo Pdcc***
|
||||
#define F_PIANO 319
|
||||
|
||||
#define S_TIPO 101
|
||||
|
@ -160,7 +160,7 @@ BEGIN
|
||||
GROUP 5
|
||||
END
|
||||
|
||||
TEXT -1
|
||||
/*TEXT -1 ***per ora solo Pdcc***
|
||||
BEGIN
|
||||
PROMPT 1 5 "@bPiano dei conti analitico"
|
||||
GROUP 6
|
||||
@ -175,7 +175,7 @@ BEGIN
|
||||
ITEM "Cdc4"
|
||||
ITEM "Cdc5"
|
||||
GROUP 6
|
||||
END
|
||||
END*/
|
||||
|
||||
BUTTON DLG_SAVEREC 12 2
|
||||
BEGIN
|
||||
@ -402,7 +402,8 @@ ENDMASK
|
||||
//----------------------Piano dei conti analitico------------------------------//
|
||||
//-----------Pagina di riga dello sheet PDCA----------------------//
|
||||
|
||||
PAGE "Riga Piano dei conti analitico" -1 -1 78 8
|
||||
//***per ora solo Pdcc***
|
||||
/*PAGE "Riga Piano dei conti analitico" -1 -1 78 8
|
||||
|
||||
LIST S_TIPO 1 18
|
||||
BEGIN
|
||||
@ -462,4 +463,4 @@ END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
ENDMASK
|
||||
ENDMASK*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user