#include "halib.h" #include "../ve/velib04.h" class TElaborazione_NAC_definitive : public TElaborazione { protected: int find_contratti_cliente(long codcfatt, const TDate& data_elab, TArray& contratti_cliente); public: virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo); TElaborazione_NAC_definitive(const TString& codelab) : TElaborazione(codelab) { } }; //metodo che riempie un array con tutti i contratti del cliente passatogli (in base alla tipologia di contratti da elaborare) int TElaborazione_NAC_definitive::find_contratti_cliente(long codcfatt, const TDate& data_elab, TArray& contratti_cliente) { contratti_cliente.destroy(); //settaggio delle variabili //il codice numerazione lo trova nella configurazione Hardy, e lo deve scegliere in base alla tipologia di contratti che sta esaminando! TConfig config(CONFIG_DITTA, "ha"); const TString4 tip_ant = config.get("CoAntTip"); const TString4 tip_rifa = config.get("CoRifaTip"); const TString4 tip_post = config.get("CoPostTip"); TAssoc_array cod_num_cont; cod_num_cont.add(config.get("CoAntNum")); cod_num_cont.add(config.get("CoRifaNum")); cod_num_cont.add(config.get("CoPostNum")); FOR_EACH_ASSOC_OBJECT(cod_num_cont, h, k, o) { //deve cercare tutti i contratti del cliente e metterli nell'array TString query; query << "USE DOC KEY 5"; query << "\nSELECT ((TIPODOC=#A_TIPODOC)||(TIPODOC=#R_TIPODOC)||(TIPODOC=#P_TIPODOC))&&(STR(DOC2=#CODCF))"; query << "\nFROM PROVV=D CODNUM=" << k; query << "\nTO PROVV=D CODNUM=" << k; TISAM_recordset recset(query); recset.set_var("#A_TIPODOC", tip_ant); recset.set_var("#R_TIPODOC", tip_rifa); recset.set_var("#P_TIPODOC", tip_post); recset.set_var("#CODCF", codcfatt); const long n_contratti = recset.items(); //questo serve solo al sagace programmatore //aggiunge i contratti all'array: solo quelli in auge nel periodo di calcolo selezionato sulla maschera! for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { //contratti anticipo 'A': datainizio esiste sempre, datafine non esiste (va ad esaurimento) //contratti posticipo 'P': datainizio esiste sempre, datafine può non esistere //contratti rifatturazione 'R': come contratti anticipo //controlla validità del contratto con le date scelte per l'elaborazione dei documenti const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date(); //quindi la datainizio vale per tutti allo stesso modo (è obbligatoria nei contratti) //se l'elaborazione finisce prima che cominci il contratto -> il contratto non serve a nulla if (data_ini_contratto > data_elab) continue; //la data fine vale invece solo per i contratti 'P' e potrebbe non esserci (contratti senza scadenza) TDate data_fine_contratto; //se la data fine contratto non è valida (ma è presente!) non dobbiamo fare nulla, perchè il contratto non va elaborato data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date(); if (data_fine_contratto.ok()) { if (data_fine_contratto < data_elab) continue; } TContratto_premi* curr_contratto = new TContratto_premi(recset.cursor()->curr()); contratti_cliente.add(curr_contratto); } } return contratti_cliente.items(); } bool TElaborazione_NAC_definitive::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { TArray contratti; bool done = false; for (int i = 0; i < doc_in.items(); i++) { TDocumento& doc = doc_in[i]; const long codcf = doc.codcf(); const TDate data = doc.get(DOC_DATADOC); FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) { const TRectype* contr = rdoc->find_original_doc(); if (contr == NULL && find_contratti_cliente(codcf, data, contratti) == 1) contr = (TContratto_premi*)contratti.objptr(0); if (contr) { TContratto_premi cp(*contr); FOR_EACH_PHYSICAL_RDOC_BACK(cp, c, rc) { if (rc->tipo().codice() == HARDY_TIPORIGA_SOMMA) { rc->add(RCA_2_RESO_STORICO, rdoc->importo(false, false, 2)); done = cp.rewrite() == NOERR; break; } } } } } return done; } /////////////////////////////////////////////////////////// // main /////////////////////////////////////////////////////////// class TNac_def_app : public TSkeleton_application { protected: virtual void main_loop(); }; void TNac_def_app::main_loop() { if (argc() >= 2 && toupper(argv(2)[1]) == 'I') { open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_DOC, LF_RIGHEDOC, 0); TConfig ini(argv(2)+2, "Transaction"); const TString16 codelab = ini.get("Action"); ini.set_paragraph("33"); const char provv = ini.get_char(DOC_PROVV); const int anno = ini.get_int(DOC_ANNO); const TString4 codnum = ini.get(DOC_CODNUM); const long ndoc = ini.get_long(DOC_NDOC); TDocumento* doc = new TDocumento(provv, anno, codnum, ndoc); TLista_documenti doc_in, doc_out; doc_in.add(doc); const TDate oggi(TODAY); TElaborazione_NAC_definitive end(codelab); const bool done = end.elabora(doc_in, doc_out, oggi, false); ini.set("Result", done ? "SUCCESS" : "ERROR", "Transaction"); } } int ha0700(int argc, char* argv[]) { TNac_def_app app; app.run(argc, argv, TR("NAC definitive")); return 0; }