Patch level :10.0 1000!!

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Aggiunta trattazione al rendiconto delle parcelle che, in base allo stato, devono essere considerate come bolle o fatture.


git-svn-id: svn://10.65.10.50/branches/R_10_00@22125 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2011-05-16 13:55:09 +00:00
parent b3a87f898d
commit ce2750e446
5 changed files with 155 additions and 36 deletions

View File

@ -111,7 +111,7 @@ void TConf_Analitica::config_loader(TSheet_field& sf, TConfig& config, TString4
row.add(num_doc.get(0));
row.add("");
row.add(num_doc.get(1));
if (tipo == "ND")
if (tipo == "ND" || tipo == "PA")
{
row.add(num_doc.get(2));
row.add(num_doc.get(3));
@ -135,7 +135,7 @@ void TConf_Analitica::config_setter(TSheet_field& sf, TConfig& config, TString4
{
TToken_string num_doc;
num_doc.add(row->get(0));
if (tipo == "ND")
if (tipo == "ND" || tipo == "PA")
{
num_doc.add(row->get(2));
num_doc.add(row->get(3));
@ -150,6 +150,7 @@ bool TConf_Analitica::preprocess_config (TMask& mask, TConfig& config)
config_loader(mask.sfield(F_RIGHE_NUM), config, "ND");
config_loader(mask.sfield(F_RIGHE_FDR), config, "NF");
config_loader(mask.sfield(F_RIGHE_RER), config, "RR");
config_loader(mask.sfield(F_RIGHE_PAR), config, "PA");
return true;
}
@ -158,6 +159,7 @@ bool TConf_Analitica::postprocess_config (TMask& mask, TConfig& config)
config_setter(mask.sfield(F_RIGHE_NUM), config, "ND");
config_setter(mask.sfield(F_RIGHE_FDR), config, "NF");
config_setter(mask.sfield(F_RIGHE_RER), config, "RR");
config_setter(mask.sfield(F_RIGHE_PAR), config, "PA");
return true;
}

View File

@ -49,9 +49,11 @@
#define F_PDCREQ 143
#define F_SEZRIF 144
//pagina con le regole del rendiconto
#define F_RIGHE_NUM 170
#define F_RIGHE_FDR 171
#define F_RIGHE_RER 172
#define F_RIGHE_PAR 173
//elementi dello sheet dei documenti da escludere dal rendiconto
#define SN_CODNUM 101
@ -66,4 +68,9 @@
//elementi dello sheet delle causali per ratei e risconti
#define SR_CODNUM 101
#define SR_DESCR 102
#define SR_DESCR 102
//elementi dello sheet degli stati numerazione parcella
#define SP_CODNUM 101
#define SP_DESCR 102
#define SP_STATOFATT 103

View File

@ -405,14 +405,14 @@ END
ENDPAGE
PAGE "Regole rendiconto" -1 -1 78 20
PAGE "Regole rendiconto" -1 -1 78 23
TEXT -1
BEGIN
PROMPT 1 1 "@bNumerazioni documenti da escludere nel rendiconto"
END
SPREADSHEET F_RIGHE_NUM -1 4
SPREADSHEET F_RIGHE_NUM -1 3
BEGIN
PROMPT 1 2 ""
ITEM "Numerazione"
@ -424,28 +424,41 @@ END
TEXT -1
BEGIN
PROMPT 1 7 "@bNumerazioni documenti per le fatture da ricevere nel rendiconto"
PROMPT 1 6 "@bNumerazioni documenti per le fatture da ricevere nel rendiconto"
END
SPREADSHEET F_RIGHE_FDR -1 4
SPREADSHEET F_RIGHE_FDR -1 3
BEGIN
PROMPT 1 8 ""
PROMPT 1 7 ""
ITEM "Numerazione"
ITEM "Descrizione@50"
END
TEXT -1
BEGIN
PROMPT 1 13 "@bCausali per ratei e risconti"
PROMPT 1 11 "@bCausali per ratei e risconti"
END
SPREADSHEET F_RIGHE_RER -1 4
SPREADSHEET F_RIGHE_RER -1 3
BEGIN
PROMPT 1 14 ""
PROMPT 1 12 ""
ITEM "Causale"
ITEM "Descrizione@50"
END
TEXT -1
BEGIN
PROMPT 1 16 "@bRegole su numerazioni Parcella"
END
SPREADSHEET F_RIGHE_PAR -1 3
BEGIN
PROMPT 1 17 ""
ITEM "Numerazione"
ITEM "Descrizione@50"
ITEM "Stato fattura"
END
ENDPAGE
ENDMASK
@ -522,7 +535,7 @@ ENDPAGE
ENDMASK
PAGE "Riga numerazione per fatture da ricevere" -1 -1 78 8
PAGE "Riga numerazione per fatture da ricevere" -1 -1 78 4
STRING SF_CODNUM 4
BEGIN
@ -540,7 +553,7 @@ END
STRING SF_DESCR 50
BEGIN
PROMPT 1 3 "Descrizione "
PROMPT 1 2 "Descrizione "
USE %NUM KEY 2
INPUT S0 SF_DESCR
DISPLAY "Descrizione@50" S0
@ -571,7 +584,7 @@ ENDPAGE
ENDMASK
PAGE "Riga causali per ratei e risconti" -1 -1 78 8
PAGE "Riga causali per ratei e risconti" -1 -1 78 4
STRING SR_CODNUM 4
BEGIN
@ -588,7 +601,7 @@ END
STRING SR_DESCR 50
BEGIN
PROMPT 1 3 "Descrizione "
PROMPT 1 2 "Descrizione "
USE LF_CAUSALI
KEY 2
SELECT MOVIND!=''
@ -620,3 +633,58 @@ END
ENDPAGE
ENDMASK
PAGE "Riga numerazioni di tipo Parcella" -1 -1 78 6
STRING SP_CODNUM 4
BEGIN
PROMPT 1 1 "Codice numerazione "
USE %NUM
CHECKTYPE REQUIRED
INPUT CODTAB SP_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT SP_CODNUM CODTAB
OUTPUT SP_DESCR S0
KEY 1
FLAGS "UZ"
END
STRING SP_DESCR 50
BEGIN
PROMPT 1 2 "Descrizione "
USE %NUM KEY 2
INPUT S0 SP_DESCR
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT SP_CODNUM
END
STRING SP_STATOFATT 1
BEGIN
PROMPT 1 3 "Stato da cui considerare il documento come fattura "
CHECKTYPE REQUIRED
END
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 10 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_DELREC 10 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_CANCEL 10 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -331,6 +331,7 @@ class TPrint_rendiconto_ca_recordset : public TISAM_recordset
TString _prefix;
TAssoc_array _ratrisc;
TString_array _num_fdr;
TString_array _num_par;
TRiclass _ricl;
protected:
@ -360,7 +361,8 @@ protected:
int sort_indbil(int indbil) const;
const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const;
const TString& riclassifica(const TString& contone, TRectype& tmpcurr) const;
bool is_causale_rateo_risconto(const char* codcaus);
bool is_causale_rateo_risconto(const char* codcaus) const;
int ricava_tipo_documento (const TDocumento& doc) const;
public: //da libreria
virtual const TVariant& get(const char* column_name) const;
@ -400,6 +402,15 @@ TPrint_rendiconto_ca_recordset::TPrint_rendiconto_ca_recordset(const TString& sq
break;
_num_fdr.add(codfdr);
}
//TString_array contenente le numerazioni delle parcelle e lo stato da cui considerarle fatture
for (int j = 0;;j++)
{
TToken_string num_par(config.get("PA", NULL, j)); //scansione delle righe PA(i)=.. sul paragrafo di configurazione CA
if (num_par.empty_items())
break;
_num_par.add(num_par);
}
}
@ -712,11 +723,39 @@ static int bill2indbil(const TString& codconto, bool is_anal)
}
//controlla se la causale passata e' di tipo rateo/risconto
bool TPrint_rendiconto_ca_recordset::is_causale_rateo_risconto(const char* codcaus)
bool TPrint_rendiconto_ca_recordset::is_causale_rateo_risconto(const char* codcaus) const
{
return _ratrisc.objptr(codcaus) != NULL;
}
int TPrint_rendiconto_ca_recordset::ricava_tipo_documento (const TDocumento& doc) const
{
int tipo_documento = doc.tipo_riclassificato();
if (tipo_documento == TTipo_documento::_fattura)
{
//attenzione! se il documento fosse una ignorantissima parcella, il tipo documento verrebbe..
//..deciso in base allo stato del documento stesso, secondo la regola data nella configurazione del..
//..rendiconto
const TString4 codnum = doc.numerazione();
const TString4 stato = doc.get(DOC_STATO);
FOR_EACH_ARRAY_ROW(_num_par, r, riga)
{
const TString4 par_codnum = riga->get(0);
if (par_codnum == codnum)
{
const TString4 par_stato = riga->get(1);
if (stato < par_stato)
tipo_documento = TTipo_documento::_bolla;
break;
}
}
}
return tipo_documento;
}
//compila i campi del file temporaneo che sara' poi stampato
void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana,
const TDocumento* doc, TLog_report& log)
@ -790,16 +829,16 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRec
#endif
//serve un documento da cui ricavare i parametri di stampa
TDocumento* newdoc = (TDocumento*)doc;
TDocumento* original_doc = (TDocumento*)doc;
bool should_delete = false;
if (newdoc == NULL && movana.get_long(MOVANA_DNDOC) > 0)
if (original_doc == NULL && movana.get_long(MOVANA_DNDOC) > 0)
{
const TString4 dacodnum = movana.get(MOVANA_DCODNUM);
newdoc = new TDocumento('D', movana.get_int(MOVANA_DANNO), dacodnum, movana.get_long(MOVANA_DNDOC));
original_doc = new TDocumento('D', movana.get_int(MOVANA_DANNO), dacodnum, movana.get_long(MOVANA_DNDOC));
should_delete = true; //settato true per cancellare il doc al termine del metodo(sennò addio memoria!)
}
const bool dadoc = newdoc != NULL;
const bool dadoc = original_doc != NULL;
//i movimenti possono essere normali o generati da documento...
if (dadoc) //movimento generato da documento
{
@ -807,7 +846,7 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRec
tmpcurr.put("CODNUM", codnum); //codnum del documento che origina il movana
tmpcurr.put("ANNO", movana.get(MOVANA_DANNO)); //anno del doc di origine
tmpcurr.put("NUMRD", movana.get(MOVANA_DNDOC)); //numero del doc che origina movana
tmpcurr.put("DATA", newdoc->get(DOC_DATADOC)); //data del documento che genera movana..
tmpcurr.put("DATA", original_doc->get(DOC_DATADOC)); //data del documento che genera movana..
} //..non esiste il campo in movana
else //movimento normale (senza documento)
{
@ -821,25 +860,26 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRec
const int anno_caus = movana.get_date(MOVANA_DATAREG).year();
const TCausale caus(movana.get(MOVANA_CODCAUS), anno_caus); //la causale serve un po' ovunque...
//caso in cui il movimento derivi da un documento
//ricerca del mitico documento padre della riga documento attuale!
if (newdoc != NULL)
if (original_doc != NULL)
{
tmpcurr.put("NUMDOCRIF", newdoc->get(DOC_NUMDOCRIF)); //docrif del documento originante il movana
tmpcurr.put("DATADOCRIF", newdoc->get(DOC_DATADOCRIF)); //datadocrif del documento originante il movana
tmpcurr.put("NUMDOCRIF", original_doc->get(DOC_NUMDOCRIF)); //docrif del documento originante il movana
tmpcurr.put("DATADOCRIF", original_doc->get(DOC_DATADOCRIF)); //datadocrif del documento originante il movana
//procedura per ottenere i campi del documento
//deve tener conto del vero tipo del documento,nel caso sia classificato come _altro;in questo
int tipo_babbo = TTipo_documento::_altro;
//deve tener conto del vero tipo del documento,nel caso sia classificato come _altro; in questo..
//..caso si deve accorgere se e' in realta' una bolla o una fattura (utilizza la tipo_riclassificato())
const int tipo_documento = newdoc->tipo_riclassificato();
int tipo_babbo = TTipo_documento::_altro;
const int tipo_documento = ricava_tipo_documento(*original_doc);
TToken_string riferimento(20, '\n'); //tokenstring su cui scrivere gli estremi dei docs padri (se li trova!)
TString80 rif; //stringa di lavoro su cui viene scritto un doc originale
const int rows = newdoc->physical_rows(); //righe del doc attuale
const int rows = original_doc->physical_rows(); //righe del doc attuale
for (int i = 1; i <= rows; i++) //scandisce tutte le righe del doc..
{
const TRiga_documento& riga = (*newdoc)[i];
const TRiga_documento& riga = (*original_doc)[i];
//commessa e fase della riga documento
const TString codcms_rigadoc = riga.codice_commessa();
const TString codfase_rigadoc = riga.fase_commessa();
@ -966,7 +1006,7 @@ F=IMF*/
break;
}
} //if(newdoc != NULL)
} //if(original_doc != NULL)
else //movimenti puri di analitica (no documento di origine!)
{
if (is_causale_rateo_risconto(caus.codice())) //movimenti con causali "rateo/risconto"
@ -979,7 +1019,7 @@ F=IMF*/
selettore |= MATURATO;
selettore |= IMPEGNATO;
}
} //if(newdoc != NULL)
} //if(original_doc != NULL)
//riempie i record del file temporaneo nel caso di rmovana con documento di origine
char sezione = rmovana.get_char(RMOVANA_SEZIONE);
@ -1014,9 +1054,9 @@ F=IMF*/
}
else
{ //iva errata -> non ha causali -> cerca di capire se cliente o fornitore
if (newdoc != NULL)
if (original_doc != NULL)
{
if (newdoc->get_char(DOC_TIPOCF) == 'C')
if (original_doc->get_char(DOC_TIPOCF) == 'C')
sezione_normale = 'A';
else
sezione_normale = 'D';
@ -1070,7 +1110,7 @@ F=IMF*/
tmpcurr.put("CODFASE", rmovana.get(RMOVANA_CODFASE)); //codice fase
if (should_delete)
delete newdoc;
delete original_doc;
//I movimenti di budget (preventivi e variazioni) vanno nascosti nei body!!! Devono essere considerati in..
//..quanto servono per sapere quali conti sono stati movimentati per i budget, in modo che per ogni conto..

View File

@ -2344,7 +2344,7 @@ bool TAnal_mov::save_saldi(const int annoes)
saldi.put(SALDANA_FASE, key.get(4));
saldi.put(SALDANA_CONTO, key.get(5));
int err = saldi.read(_isequal, _testandlock);
int err = saldi.read(_isequal, _lock);
if (err != NOERR)
{
//Richiesta specifica del nostro Fuhrer! I saldi appartenenti ad esercizi futuri NON ancora aperti vanno..
@ -2359,6 +2359,8 @@ bool TAnal_mov::save_saldi(const int annoes)
saldi.put(SALDANA_FASE, key.get(4));
saldi.put(SALDANA_CONTO, key.get(5));
err = saldi.write();
if (err != NOERR)
cantwrite_box(saldi.name());
}
// else
// continue; // NON devo dare errori fuorvianti causa saldi nel futuro che ci saranno ma non vanno scritti