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_RICARICO QTAGG2 H01
//S_MATURATO QTAGG5 H01 //S_MATURATO QTAGG5 H01
// QTAGG3 H01 - H02 -> usato come campo di appoggio per gli importi in elaborazione ha0500
//F_ANTICIPATO QTAGG4 H02 //F_ANTICIPATO QTAGG4 H02
//F_RESTITUITO QTAGG5 H02 //F_RESTITUITO QTAGG5 H02

View File

@ -126,9 +126,8 @@ protected:
void elabora_documenti(const TMask& mask, TISAM_recordset& recset, TLog_report& log); void elabora_documenti(const TMask& mask, TISAM_recordset& recset, TLog_report& log);
//metodi medio livello //metodi medio livello
bool aggiorna_contratti_anticipo(const TString& rdoc_codart, const real& rdoc_qta, TDocumento& contratto); bool aggiorna_contratti(const TRiga_documento& rdoc, TDocumento& contratto);
bool aggiorna_contratti_posticipo(const TString& rdoc_codart, const real& rdoc_qta, TDocumento& contratto); bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente);
bool aggiorna_contratti(TDocumento& curr_doc, TArray& contratti_cliente);
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log); bool genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log);
//metodi basso livello //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; 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) 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) if (rdoc_codart == rigamerce_codart)
{ {
const real rigamerce_premio = rigamerce->get_real(RC_1_PREMIO); 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) if (rigamerce_premio != ZERO)
{ {
//aggiornamento delle righe di tipo spesa (verigH02) per aggiornare le somme restituite //normalizzazione della qta
FOR_EACH_PHYSICAL_RDOC(contratto, ra, rigacontratto) const TString& umqta_tot = rigamerce->get(RDOC_UMQTA); //prende la UM dal contratto che farà da riferimento!
{ TArticolo articolo(rdoc_codart);
//cerca una riga anticipo da evadere sul contratto per aggiornare la somma restituita sull'anticipo const real normalized_rdoc_qta = articolo.convert_to_um(rdoc_qta, umqta_tot, rdoc_umqta, true);
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)
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;
rigacontratto->put(RCA_2_RESTITUITO, somma_restituita);
elaborato = true;
}
} //FOR_EACH_PHYSICAL.. fine casino sulla riga di tipo spese
//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())
{
//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 += 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()) if (rigamerce->is_merce())
{ {
real somma_bonus = rigamerce->get_real(RC_1_BONUS); 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->put(RC_1_BONUS, somma_bonus);
rigamerce->add(RDOC_QTA, normalized_rdoc_qta); //riscrive sul campo di appoggio del contratto
elaborato = true; elaborato = true;
} }
}
//aggiornamento delle quantità per le righe di tipo merce (verigH01) } //if(rigamerce_premio != ZERO...
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(rdoc_codart... } //if(rdoc_codart...
} //FOR_EACH_PHYSICAL.. } //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.. //aggiorna, in base al documento in esame curr_doc, le somme restituite nelle righe di tipo verigh02 nei contratti validi..
//..del cliente //..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; 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++) for (int i = 0; i < contratti_cliente.items(); i++)
{ {
TDocumento& contratto = (TDocumento&)contratti_cliente[i]; TDocumento& contratto = (TDocumento&)contratti_cliente[i];
const TString& tipo_contratto = contratto.get(DOC_TIPOCFFATT); elaborato |= aggiorna_contratti(*rdoc, contratto);
//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);
}
} //for(int i.. } //for(int i..
} //FOR_EACH... } //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); TString80 riga_contratto_codart = riga_contratto.get(RDOC_CODART);
riga_contratto_codart.trim(); 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 real riga_contratto_qta = riga_contratto.get_real(RDOC_QTA);
const TString4 riga_contratto_um = riga_contratto.get(RDOC_UMQTA); const TString4 riga_contratto_um = riga_contratto.get(RDOC_UMQTA);
const real riga_contratto_premio = riga_contratto.get_real(RC_1_PREMIO); 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); TRiga_documento& nac_row = nac.new_row(tipo_riga);
nac_row.put(RDOC_NRIGA, i); nac_row.put(RDOC_NRIGA, i);
nac_row.put(RDOC_CODART, cod_riga); 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) if (definitivo && err == NOERR)
{ {
//prima di registrare il contratto vanno svuotati i campi appoggio sulle righe che sono stati usati.. //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++) for (int i = 1; i <= contratto.rows(); i++)
{ {
TRiga_documento& riga_contratto = contratto[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! //array con l'insieme dei contratti e dei documenti elaborati per un singolo cliente!
TArray contratti_cliente, documenti_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()) for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{ {
if (!pi.addstatus(1)) 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 //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()); TDocumento* curr_doc = new TDocumento(recset.cursor()->curr());
//elabora il documento corrente aggiornando le somme restituite sui contratti validi //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); documenti_cliente.add(curr_doc);
else else
delete(curr_doc); 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) //generazione NAC (una per contratto cliente)
genera_nac(mask, contratti_cliente, documenti_cliente, log); 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() 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); open_files(LF_DOC, LF_RIGHEDOC, 0);
return TSkeleton_application::create(); return TSkeleton_application::create();

View File

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