Patch level :

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/branches/R_10_00@20851 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-09-13 13:39:46 +00:00
parent 91fb140565
commit fa2d23ce2b
3 changed files with 64 additions and 89 deletions

View File

@ -46,7 +46,6 @@
//S_RICARICO QTAGG2 H01
//S_MATURATO QTAGG5 H01
// QTAGG3 H01 - H02 -> usato come campo di appoggio per gli importi in elaborazione ha0500
//F_ANTICIPATO QTAGG4 H02
//F_RESTITUITO QTAGG5 H02

View File

@ -126,9 +126,8 @@ protected:
void elabora_documenti(const TMask& mask, TISAM_recordset& recset, TLog_report& log);
//metodi medio livello
bool aggiorna_contratti_anticipo(const TString& rdoc_codart, const real& rdoc_qta, TDocumento& contratto);
bool aggiorna_contratti_posticipo(const TString& rdoc_codart, const real& rdoc_qta, TDocumento& contratto);
bool aggiorna_contratti(TDocumento& curr_doc, TArray& contratti_cliente);
bool aggiorna_contratti(const TRiga_documento& rdoc, TDocumento& contratto);
bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente);
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log);
//metodi basso livello
@ -384,9 +383,15 @@ int THardy_elab_docs::find_contratti_cliente(const long codcf, const TMask& mask
}
bool THardy_elab_docs::aggiorna_contratti_anticipo(const TString& rdoc_codart, const real& rdoc_qta, TDocumento& contratto)
bool THardy_elab_docs::aggiorna_contratti(const TRiga_documento& rdoc, TDocumento& contratto)
{
bool elaborato = false;
const char tipo_contratto = contratto.get(DOC_TIPOCFFATT)[0];
//parametri della riga fattura
TString80 rdoc_codart = rdoc.get(RDOC_CODART);
rdoc_codart.trim();
const real rdoc_qta = rdoc.get_real(RDOC_QTA);
const TString4 rdoc_umqta = rdoc.get(RDOC_UMQTA);
FOR_EACH_PHYSICAL_RDOC(contratto, rm, rigamerce)
{
@ -395,41 +400,49 @@ bool THardy_elab_docs::aggiorna_contratti_anticipo(const TString& rdoc_codart, c
if (rdoc_codart == rigamerce_codart)
{
const real rigamerce_premio = rigamerce->get_real(RC_1_PREMIO);
//se il premio non è nullo procede all'aggiornamento del restituito
//se il premio non è nullo procede all'aggiornamento del restituito (solo contratti A/R e righe spese) e del bonus (tutti i contratti e righe merce)
if (rigamerce_premio != ZERO)
{
//aggiornamento delle righe di tipo spesa (verigH02) per aggiornare le somme restituite
//normalizzazione della qta
const TString& umqta_tot = rigamerce->get(RDOC_UMQTA); //prende la UM dal contratto che farà da riferimento!
TArticolo articolo(rdoc_codart);
const real normalized_rdoc_qta = articolo.convert_to_um(rdoc_qta, umqta_tot, rdoc_umqta, true);
//aggiornamento delle righe di tipo spesa (verigh02) per aggiornare le somme restituite nel caso di contratti di anticipo/rifatturazione
if (tipo_contratto == 'A' || tipo_contratto == 'R')
{
FOR_EACH_PHYSICAL_RDOC(contratto, ra, rigacontratto)
{
//cerca una riga anticipo da evadere sul contratto per aggiornare la somma restituita sull'anticipo
if (rigacontratto->is_spese())
{
//usa qtagg3 come campo di appoggio per il calcolo della somma restituita dovuta al contratto (parte da zero per ogni elaborazione di NAC)
//aggiorna la somma restituita dovuta al contratto (parte da zero per ogni elaborazione di NAC)
real somma_restituita = rigacontratto->get_real(RCA_2_RESTITUITO);
//la somma restituita deve essere incrementata per la qta di merce (caffè) che c'è sulla riga della fattura in esame...
//..moltiplicata per il premio che c'è nella riga di tipo merce del contratto in esame
somma_restituita += rdoc_qta * rigamerce_premio;
somma_restituita += normalized_rdoc_qta * rigamerce_premio;
rigacontratto->put(RCA_2_RESTITUITO, somma_restituita);
elaborato = true;
break;
}
} //FOR_EACH_PHYSICAL.. fine casino sulla riga di tipo spese
} //if(tipo_contratto == "A"...
//questo va bene invece per ogni riga merce (verigh01), sia per contratti di tipo A/R che di tipo P
if (rigamerce->is_merce())
{
real somma_bonus = rigamerce->get_real(RC_1_BONUS);
somma_bonus += rdoc_qta * rigamerce_premio;
somma_bonus += normalized_rdoc_qta * rigamerce_premio;
rigamerce->put(RC_1_BONUS, somma_bonus);
rigamerce->add(RDOC_QTA, normalized_rdoc_qta); //riscrive sul campo di appoggio del contratto
elaborato = true;
}
}
//aggiornamento delle quantità per le righe di tipo merce (verigH01)
if (rigamerce->is_merce())
{
real qta_tot = rigamerce->get_real(RDOC_QTA); //prende la qta tot dal contratto (è usato un campo di appoggio RDOC_QTA)
qta_tot += rdoc_qta; //aggiunge la qta della riga documento
rigamerce->put(RDOC_QTA, qta_tot); //riscrive sul campo di appoggio del contratto
}
} //if(rigamerce_premio != ZERO...
} //if(rdoc_codart...
} //FOR_EACH_PHYSICAL..
@ -437,43 +450,10 @@ bool THardy_elab_docs::aggiorna_contratti_anticipo(const TString& rdoc_codart, c
}
bool THardy_elab_docs::aggiorna_contratti_posticipo(const TString& rdoc_codart, const real& rdoc_qta, TDocumento& contratto)
{
bool elaborato = false;
FOR_EACH_PHYSICAL_RDOC(contratto, rm, rigamerce)
{
const TString& rigamerce_codart = rigamerce->get(RDOC_CODART);
//se trova il codart in una delle righe di contratto...
if (rdoc_codart == rigamerce_codart)
{
const real rigamerce_premio = rigamerce->get_real(RC_1_PREMIO);
//..aggiorna direttamente il bonus totale per l'articolo presente sulla riga
if (rigamerce_premio != ZERO)
{
//usa QTAGG3 come campo di appoggio per il calcolo della somma restituita dovuta al contratto (parte da zero per ogni elaborazione di NAC)
real somma_bonus = rigamerce->get_real(RC_1_BONUS);
somma_bonus += rdoc_qta * rigamerce_premio;
rigamerce->put(RC_1_BONUS, somma_bonus);
elaborato = true;
} //if(rigamerce...
//aggiornamento delle righe di tipo merce (verigH01)
if (rigamerce->is_merce())
{
real qta_tot = rigamerce->get_real(RDOC_QTA);
qta_tot += rdoc_qta;
rigamerce->put(RDOC_QTA, qta_tot);
}
} //if(rdoc_codart...
} //FOR_EACH_PHYSICAL..
return elaborato;
}
//aggiorna, in base al documento in esame curr_doc, le somme restituite nelle righe di tipo verigh02 nei contratti validi..
//..del cliente
bool THardy_elab_docs::aggiorna_contratti(TDocumento& curr_doc, TArray& contratti_cliente)
bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente)
{
bool elaborato = false;
@ -487,17 +467,7 @@ bool THardy_elab_docs::aggiorna_contratti(TDocumento& curr_doc, TArray& contratt
for (int i = 0; i < contratti_cliente.items(); i++)
{
TDocumento& contratto = (TDocumento&)contratti_cliente[i];
const TString& tipo_contratto = contratto.get(DOC_TIPOCFFATT);
//in base al tipo di contratto (Anticipo/Posticipo/Rifatturazione) decide cosa fare
if (tipo_contratto == "A" || tipo_contratto == "R")
{
elaborato |= aggiorna_contratti_anticipo(rdoc_codart, rdoc_qta, contratto);
} //if(tipo_contratto...
else if (tipo_contratto == "P")
{
elaborato |= aggiorna_contratti_posticipo(rdoc_codart, rdoc_qta, contratto);
}
elaborato |= aggiorna_contratti(*rdoc, contratto);
} //for(int i..
} //FOR_EACH...
@ -588,14 +558,11 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
{
TString80 riga_contratto_codart = riga_contratto.get(RDOC_CODART);
riga_contratto_codart.trim();
const real riga_contratto_bonus = riga_contratto.get_real(RDOC_QTAGG3);
if (riga_contratto_bonus != ZERO)
int cazzone = 1;
const real riga_contratto_qta = riga_contratto.get_real(RDOC_QTA);
const TString4 riga_contratto_um = riga_contratto.get(RDOC_UMQTA);
const real riga_contratto_premio = riga_contratto.get_real(RC_1_PREMIO);
// riga (dovrebbe essere un'unica riga per NAC, il cui valore sta in QTAGG3 ed è stato calcolato nella aggiorna_contratti())
// riga (dovrebbe essere un'unica riga per NAC, il cui valore sta in QTAGG3 ed è stato calcolato nella elabora_contratti())
TRiga_documento& nac_row = nac.new_row(tipo_riga);
nac_row.put(RDOC_NRIGA, i);
nac_row.put(RDOC_CODART, cod_riga);
@ -641,7 +608,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
if (definitivo && err == NOERR)
{
//prima di registrare il contratto vanno svuotati i campi appoggio sulle righe che sono stati usati..
//..per qta e premi vari e riempiti nella aggiorna_contratti()
//..per qta e premi vari e riempiti nella elabora_contratti()
for (int i = 1; i <= contratto.rows(); i++)
{
TRiga_documento& riga_contratto = contratto[i];
@ -680,7 +647,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& rec
//array con l'insieme dei contratti e dei documenti elaborati per un singolo cliente!
TArray contratti_cliente, documenti_cliente;
//giro sulle fatture (è il giro di più alto livello che viene esteso all'interno delle aggiorna_contratti)
//giro sulle fatture (è il giro di più alto livello che viene esteso all'interno delle elabora_contratti)
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
@ -707,7 +674,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& rec
//se ha trovato uno o più contratti validi nel periodo passa alla elaborazione dei documenti del cliente
TDocumento* curr_doc = new TDocumento(recset.cursor()->curr());
//elabora il documento corrente aggiornando le somme restituite sui contratti validi
if (aggiorna_contratti(*curr_doc, contratti_cliente))
if (elabora_contratti(*curr_doc, contratti_cliente))
documenti_cliente.add(curr_doc);
else
delete(curr_doc);
@ -716,6 +683,22 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& rec
//generazione NAC (una per contratto cliente)
genera_nac(mask, contratti_cliente, documenti_cliente, log);
//se elaborazione definitiva -> cambia lo stato ai documenti di vendita elaborati, mettendolo uguale..
//..a quello deciso in configurazione
const bool definitivo = mask.get_bool(F_DEFINITIVO);
if (definitivo)
{
TConfig config(CONFIG_DITTA, "ha");
const TString& stato_finale = config.get("StatoFinFatt");
FOR_EACH_ARRAY_ITEM(documenti_cliente, r, riga)
{
TDocumento& fattura = *(TDocumento*)riga;
fattura.put(DOC_STATO, stato_finale);
fattura.rewrite();
}
}
}
@ -762,11 +745,6 @@ void THardy_elab_docs::main_loop()
bool THardy_elab_docs::create()
{
//controlla se la chiave ha l'autorizzazione a questo programma (solo per hardy!)
Tdninst dninst;
if (!dninst.can_I_run(true))
return error_box(TR("Programma non autorizzato!"));
open_files(LF_DOC, LF_RIGHEDOC, 0);
return TSkeleton_application::create();

View File

@ -16,5 +16,3 @@
#define RCA_2_ANTICIPATO RDOC_QTAGG4
#define RCA_2_RESTITUITO RDOC_QTAGG5
//#define RC_1_BONUS_NAC RDOC_QTAGG3
//#define RC_2_RESO_NAC RDOC_QTAGG3