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(num_doc.get(0));
row.add(""); row.add("");
row.add(num_doc.get(1)); 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(2));
row.add(num_doc.get(3)); 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; TToken_string num_doc;
num_doc.add(row->get(0)); 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(2));
num_doc.add(row->get(3)); 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_NUM), config, "ND");
config_loader(mask.sfield(F_RIGHE_FDR), config, "NF"); config_loader(mask.sfield(F_RIGHE_FDR), config, "NF");
config_loader(mask.sfield(F_RIGHE_RER), config, "RR"); config_loader(mask.sfield(F_RIGHE_RER), config, "RR");
config_loader(mask.sfield(F_RIGHE_PAR), config, "PA");
return true; 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_NUM), config, "ND");
config_setter(mask.sfield(F_RIGHE_FDR), config, "NF"); config_setter(mask.sfield(F_RIGHE_FDR), config, "NF");
config_setter(mask.sfield(F_RIGHE_RER), config, "RR"); config_setter(mask.sfield(F_RIGHE_RER), config, "RR");
config_setter(mask.sfield(F_RIGHE_PAR), config, "PA");
return true; return true;
} }

View File

@ -49,9 +49,11 @@
#define F_PDCREQ 143 #define F_PDCREQ 143
#define F_SEZRIF 144 #define F_SEZRIF 144
//pagina con le regole del rendiconto
#define F_RIGHE_NUM 170 #define F_RIGHE_NUM 170
#define F_RIGHE_FDR 171 #define F_RIGHE_FDR 171
#define F_RIGHE_RER 172 #define F_RIGHE_RER 172
#define F_RIGHE_PAR 173
//elementi dello sheet dei documenti da escludere dal rendiconto //elementi dello sheet dei documenti da escludere dal rendiconto
#define SN_CODNUM 101 #define SN_CODNUM 101
@ -67,3 +69,8 @@
//elementi dello sheet delle causali per ratei e risconti //elementi dello sheet delle causali per ratei e risconti
#define SR_CODNUM 101 #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 ENDPAGE
PAGE "Regole rendiconto" -1 -1 78 20 PAGE "Regole rendiconto" -1 -1 78 23
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 1 1 "@bNumerazioni documenti da escludere nel rendiconto" PROMPT 1 1 "@bNumerazioni documenti da escludere nel rendiconto"
END END
SPREADSHEET F_RIGHE_NUM -1 4 SPREADSHEET F_RIGHE_NUM -1 3
BEGIN BEGIN
PROMPT 1 2 "" PROMPT 1 2 ""
ITEM "Numerazione" ITEM "Numerazione"
@ -424,28 +424,41 @@ END
TEXT -1 TEXT -1
BEGIN 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 END
SPREADSHEET F_RIGHE_FDR -1 4 SPREADSHEET F_RIGHE_FDR -1 3
BEGIN BEGIN
PROMPT 1 8 "" PROMPT 1 7 ""
ITEM "Numerazione" ITEM "Numerazione"
ITEM "Descrizione@50" ITEM "Descrizione@50"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 1 13 "@bCausali per ratei e risconti" PROMPT 1 11 "@bCausali per ratei e risconti"
END END
SPREADSHEET F_RIGHE_RER -1 4 SPREADSHEET F_RIGHE_RER -1 3
BEGIN BEGIN
PROMPT 1 14 "" PROMPT 1 12 ""
ITEM "Causale" ITEM "Causale"
ITEM "Descrizione@50" ITEM "Descrizione@50"
END 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 ENDPAGE
ENDMASK ENDMASK
@ -522,7 +535,7 @@ ENDPAGE
ENDMASK 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 STRING SF_CODNUM 4
BEGIN BEGIN
@ -540,7 +553,7 @@ END
STRING SF_DESCR 50 STRING SF_DESCR 50
BEGIN BEGIN
PROMPT 1 3 "Descrizione " PROMPT 1 2 "Descrizione "
USE %NUM KEY 2 USE %NUM KEY 2
INPUT S0 SF_DESCR INPUT S0 SF_DESCR
DISPLAY "Descrizione@50" S0 DISPLAY "Descrizione@50" S0
@ -571,7 +584,7 @@ ENDPAGE
ENDMASK 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 STRING SR_CODNUM 4
BEGIN BEGIN
@ -588,7 +601,7 @@ END
STRING SR_DESCR 50 STRING SR_DESCR 50
BEGIN BEGIN
PROMPT 1 3 "Descrizione " PROMPT 1 2 "Descrizione "
USE LF_CAUSALI USE LF_CAUSALI
KEY 2 KEY 2
SELECT MOVIND!='' SELECT MOVIND!=''
@ -620,3 +633,58 @@ END
ENDPAGE ENDPAGE
ENDMASK 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; TString _prefix;
TAssoc_array _ratrisc; TAssoc_array _ratrisc;
TString_array _num_fdr; TString_array _num_fdr;
TString_array _num_par;
TRiclass _ricl; TRiclass _ricl;
protected: protected:
@ -360,7 +361,8 @@ protected:
int sort_indbil(int indbil) const; int sort_indbil(int indbil) const;
const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const; const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const;
const TString& riclassifica(const TString& contone, 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 public: //da libreria
virtual const TVariant& get(const char* column_name) const; 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; break;
_num_fdr.add(codfdr); _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 //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; 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 //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, void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana,
const TDocumento* doc, TLog_report& log) const TDocumento* doc, TLog_report& log)
@ -790,16 +829,16 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRec
#endif #endif
//serve un documento da cui ricavare i parametri di stampa //serve un documento da cui ricavare i parametri di stampa
TDocumento* newdoc = (TDocumento*)doc; TDocumento* original_doc = (TDocumento*)doc;
bool should_delete = false; 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); 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!) 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... //i movimenti possono essere normali o generati da documento...
if (dadoc) //movimento generato 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("CODNUM", codnum); //codnum del documento che origina il movana
tmpcurr.put("ANNO", movana.get(MOVANA_DANNO)); //anno del doc di origine 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("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 } //..non esiste il campo in movana
else //movimento normale (senza documento) 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 int anno_caus = movana.get_date(MOVANA_DATAREG).year();
const TCausale caus(movana.get(MOVANA_CODCAUS), anno_caus); //la causale serve un po' ovunque... 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! //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("NUMDOCRIF", original_doc->get(DOC_NUMDOCRIF)); //docrif del documento originante il movana
tmpcurr.put("DATADOCRIF", newdoc->get(DOC_DATADOCRIF)); //datadocrif 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 //procedura per ottenere i campi del documento
//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; 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 = ricava_tipo_documento(*original_doc);
TToken_string riferimento(20, '\n'); //tokenstring su cui scrivere gli estremi dei docs padri (se li trova!) 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 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.. 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 //commessa e fase della riga documento
const TString codcms_rigadoc = riga.codice_commessa(); const TString codcms_rigadoc = riga.codice_commessa();
const TString codfase_rigadoc = riga.fase_commessa(); const TString codfase_rigadoc = riga.fase_commessa();
@ -966,7 +1006,7 @@ F=IMF*/
break; break;
} }
} //if(newdoc != NULL) } //if(original_doc != NULL)
else //movimenti puri di analitica (no documento di origine!) else //movimenti puri di analitica (no documento di origine!)
{ {
if (is_causale_rateo_risconto(caus.codice())) //movimenti con causali "rateo/risconto" if (is_causale_rateo_risconto(caus.codice())) //movimenti con causali "rateo/risconto"
@ -979,7 +1019,7 @@ F=IMF*/
selettore |= MATURATO; selettore |= MATURATO;
selettore |= IMPEGNATO; selettore |= IMPEGNATO;
} }
} //if(newdoc != NULL) } //if(original_doc != NULL)
//riempie i record del file temporaneo nel caso di rmovana con documento di origine //riempie i record del file temporaneo nel caso di rmovana con documento di origine
char sezione = rmovana.get_char(RMOVANA_SEZIONE); char sezione = rmovana.get_char(RMOVANA_SEZIONE);
@ -1014,9 +1054,9 @@ F=IMF*/
} }
else else
{ //iva errata -> non ha causali -> cerca di capire se cliente o fornitore { //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'; sezione_normale = 'A';
else else
sezione_normale = 'D'; sezione_normale = 'D';
@ -1070,7 +1110,7 @@ F=IMF*/
tmpcurr.put("CODFASE", rmovana.get(RMOVANA_CODFASE)); //codice fase tmpcurr.put("CODFASE", rmovana.get(RMOVANA_CODFASE)); //codice fase
if (should_delete) if (should_delete)
delete newdoc; delete original_doc;
//I movimenti di budget (preventivi e variazioni) vanno nascosti nei body!!! Devono essere considerati in.. //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.. //..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_FASE, key.get(4));
saldi.put(SALDANA_CONTO, key.get(5)); saldi.put(SALDANA_CONTO, key.get(5));
int err = saldi.read(_isequal, _testandlock); int err = saldi.read(_isequal, _lock);
if (err != NOERR) if (err != NOERR)
{ {
//Richiesta specifica del nostro Fuhrer! I saldi appartenenti ad esercizi futuri NON ancora aperti vanno.. //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_FASE, key.get(4));
saldi.put(SALDANA_CONTO, key.get(5)); saldi.put(SALDANA_CONTO, key.get(5));
err = saldi.write(); err = saldi.write();
if (err != NOERR)
cantwrite_box(saldi.name());
} }
// else // else
// continue; // NON devo dare errori fuorvianti causa saldi nel futuro che ci saranno ma non vanno scritti // continue; // NON devo dare errori fuorvianti causa saldi nel futuro che ci saranno ma non vanno scritti