diff --git a/ha/ha0300a.h b/ha/ha0300a.h index 171efeab4..9ac2baf41 100755 --- a/ha/ha0300a.h +++ b/ha/ha0300a.h @@ -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 diff --git a/ha/ha0500.cpp b/ha/ha0500.cpp index cd29b853e..9b14950d0 100755 --- a/ha/ha0500.cpp +++ b/ha/ha0500.cpp @@ -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 - 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) - 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 + //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()) + { + //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()) { 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(); diff --git a/ha/halib.h b/ha/halib.h index dd981abb9..6dec8b945 100755 --- a/ha/halib.h +++ b/ha/halib.h @@ -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