From 574082a69df0ac2e7994792e95011082c3ad0f6e Mon Sep 17 00:00:00 2001 From: luca83 <luca83@c028cbd2-c16b-5b4b-a496-9718f37d4682> Date: Wed, 12 May 2010 15:14:54 +0000 Subject: [PATCH] Patch level : 10.0 patch ??? Files correlati : ps0713 e tutte le maschere Ricompilazione Demo : [ ] Commento : Portato sulla 10.0 il ps dell'ATS con prevista l'analitica git-svn-id: svn://10.65.10.50/trunk@20447 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ps/ps0713.cpp | 6 +- ps/ps0713300.cpp | 287 +++++++++++++++++++++++++++++-------------- ps/ps0713300a.h | 21 ++-- ps/ps0713400.cpp | 9 +- ps/ps0713500.cpp | 306 +++++++++++++++++++++++++++++++--------------- ps/ps0713500a.h | 11 +- ps/ps0713500a.uml | 67 +++------- ps/ps0713600.cpp | 19 ++- 8 files changed, 455 insertions(+), 271 deletions(-) diff --git a/ps/ps0713.cpp b/ps/ps0713.cpp index 23b90e04e..489db54f2 100755 --- a/ps/ps0713.cpp +++ b/ps/ps0713.cpp @@ -9,11 +9,11 @@ int main(int argc, char** argv) { case 0: ps0713100(argc, argv); break; //Esportazione righe IVA case 1: ps0713200(argc, argv); break; //Importazione commesse -//case 2: ps0713300(argc, argv); break; //Importazione fatture di acquisto per ATS + case 2: ps0713300(argc, argv); break; //Importazione fatture di acquisto case 3: ps0713400(argc, argv); break; //Importazione fatture di vendita -//case 4: ps0713500(argc, argv); break; //Importazione spese per ATS + case 4: ps0713500(argc, argv); break; //Importazione spese case 5: ps0713600(argc, argv); break; //Importazione fatture fornitori / fatture da ricevere - default: ps0713100(argc, argv); break; //Esportazione righe IVA + default: ps0713100(argc, argv); break; //Esportazione righe IVA } exit(0); return 0; diff --git a/ps/ps0713300.cpp b/ps/ps0713300.cpp index 09db134c9..33530cad4 100755 --- a/ps/ps0713300.cpp +++ b/ps/ps0713300.cpp @@ -2,142 +2,223 @@ #include <automask.h> #include <execp.h> #include <progind.h> -#include <reputils.h> -#include <utility.h> -#include <relation.h> -#include <reprint.h> +#include <tabutil.h> #include <textset.h> -#include "tabutil.h" - -#include "ps0713.h" -#include "ps0713300a.h" - #include <causali.h> #include <clifo.h> #include <mov.h> #include <rmoviva.h> +#include "../ca/calib01.h" +#include "../ca/calib02.h" +#include "../ca/movana.h" +#include "../ca/rmovana.h" +#include "ps0713300a.h" + ////////////////////////////////////// + //// TIMPORTA_FATACQ_ANROW //// + ////////////////////////////////////// -/////////////////////////////////////////////////////////// -// TAutomask -/////////////////////////////////////////////////////////// +//classe TImporta_fatacq_anrow +class TImporta_fatacq_anrow: public TToken_string +{ +public: + const long idlavoro(); + const int gruppo(); + const int conto(); + const int sotco(); + + TImporta_fatacq_anrow& operator= (const char* key){ set(key); return *this; } -class TImportaFat_mask : public TAutomask + TImporta_fatacq_anrow(const long idlavoro, const int gruppo, const int conto, const int sotco); + TImporta_fatacq_anrow(const char* key):TToken_string(key){} + TImporta_fatacq_anrow(const TToken_string& key):TToken_string(key){} + TImporta_fatacq_anrow(const TImporta_fatacq_anrow& key):TToken_string(key){} + TImporta_fatacq_anrow():TToken_string(){} +}; + +//IDLAVORO: metodo che restituisce l'Idlavoro +const long TImporta_fatacq_anrow::idlavoro() +{ + return get_long(0); +} + +//GRUPPO: metodo che restituisce il gruppo +const int TImporta_fatacq_anrow::gruppo() +{ + return get_int(1); +} + +//CONTO: metodo che restituisce il conto +const int TImporta_fatacq_anrow::conto() +{ + return get_int(2); +} + +//SOTCO: metodo che restituisce il sottoconto +const int TImporta_fatacq_anrow::sotco() +{ + return get_int(3); +} + +//metodo costruttore +TImporta_fatacq_anrow::TImporta_fatacq_anrow(const long idlavoro, const int gruppo, const int conto, const int sotco) +{ + add(idlavoro); + add(gruppo); + add(conto); + add(sotco); +} + + /////////////////////////////////// + //// TIMPORTA_FATACQ_MSK //// + /////////////////////////////////// + +//Classe TImporta_fatacq_msk +class TImporta_fatacq_msk : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: - TImportaFat_mask(); + TImporta_fatacq_msk(); }; -TImportaFat_mask::TImportaFat_mask() :TAutomask ("ps0713300a") +TImporta_fatacq_msk::TImporta_fatacq_msk() :TAutomask ("ps0713300a") { } -bool TImportaFat_mask::on_field_event(TOperable_field& f, TField_event e, long jolly) -{ - switch (f.dlg()) - { - //giochetto per avere la lista dei files validi nella directory di trasferimento! - case F_NAME: - if (e == fe_button) - { - TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), - "File@32"); - TFilename path = get(F_PATH); - path.add("*.csv"); //files delle testate - list_files(path, as.rows_array()); - TFilename name; - FOR_EACH_ARRAY_ROW(as.rows_array(), i, row) - { - name = *row; - *row = name.name(); - } - if (as.run() == K_ENTER) - { - f.set(as.row(as.selected())); - } - } - break; - default: - break; - } +//ON_FIELD_EVENT: metodo che gestisce i comportamenti dei vari campi della maschera +//(per adesso segnaposto) +bool TImporta_fatacq_msk::on_field_event(TOperable_field& f, TField_event e, long jolly) +{ return true; } - /////////////////////////////////////////////// - //// CLASSI DERIVATE PER IMPORTAZIONE DATI //// - /////////////////////////////////////////////// + /////////////////////////////////// + //// TIMPORTA_FATACQ_REC //// + /////////////////////////////////// -///////////////////////////////////////////////////////////// -// Recordset specifici per i dati da trasferire -///////////////////////////////////////////////////////////// - -//Piano dei conti -class TImporta_fatt_recordset : public TCSV_recordset +//Classe TImporta_fatacq_rec +class TImporta_fatacq_rec : public TCSV_recordset { public: - TImporta_fatt_recordset(const char * fileName); + TImporta_fatacq_rec(const char * fileName); }; -TImporta_fatt_recordset::TImporta_fatt_recordset(const char * fileName) - : TCSV_recordset("CSV(\",\")") +TImporta_fatacq_rec::TImporta_fatacq_rec(const char * fileName) + : TCSV_recordset("CSV(\",\")") { load_file(fileName); } -/////////////////////////////////////// -// TSkeleton_application -/////////////////////////////////////// -class TFattCSV : public TSkeleton_application + /////////////////////////////////// + //// TIMPORTA_FATACQ_APP //// + /////////////////////////////////// + +//Classe TImporta_fatacq_app +class TImporta_fatacq_app : public TSkeleton_application { - virtual bool check_autorization() const {return false;} + TImporta_fatacq_msk* _msk; + TConfig* _configfile; + +protected: + virtual bool check_autorization() const {return false;} virtual const char * extra_modules() const {return "ve";} - TImportaFat_mask* _msk; - TConfig* _configfile; - - -//protected: - - public: virtual bool create(); virtual bool destroy(); virtual void main_loop(); - bool transfer(const TFilename& file); + long genera_movcg(); + void genera_analitica(const long numreg, TAssoc_array& righean); + bool transfer(const TFilename& file, const long numreg, TAssoc_array& righean); - TFattCSV() {}; + TImporta_fatacq_app() {}; }; -bool TFattCSV::transfer(const TFilename& file) +long TImporta_fatacq_app::genera_movcg() { - TImporta_fatt_recordset s(file); + TISAM_recordset movrec("USE MOV"); + movrec.move_last(); + long numreg = movrec.get(MOV_NUMREG).as_int(); numreg++; + + TLocalisamfile mov(LF_MOV); + mov.put(MOV_NUMREG, numreg); + mov.rewrite(); + + return numreg; +} + +void TImporta_fatacq_app::genera_analitica(const long numreg, TAssoc_array& righean) +{ + TProgind pi(righean.items(), "Importazione analitica in corso...", true, true); + + const TDate datareg = _msk->get_date(F_DATAREG); + const int anno = _msk->get_date(F_DATAREG).year(); + + TToken_string key; + key.add(_msk->get(F_CODCAU)); + key.add(1); + key.add(1); + const TRectype& causale = cache().get(LF_RCAUSALI, key); + + //instanzio il movimento di analitica + TAnal_mov anmo(0); + anmo.put(MOVANA_NUMREGCG, numreg); + anmo.put(MOVANA_DATACOMP, datareg); + anmo.put(MOVANA_DATAREG, datareg); + anmo.put(MOVANA_CODCAUS, _msk->get(F_CODCAU)); + anmo.put(MOVANA_ANNOES, anno); + + //per ogni oggetto dell'assoc_array, creo una riga di analitica + FOR_EACH_ASSOC_OBJECT(righean, obj, keyar, itm) + { + if (!pi.addstatus(1)) + break; + + TImporta_fatacq_anrow& row = (TImporta_fatacq_anrow)keyar; + const long idlav = row.idlavoro(); + const int gruppo = row.gruppo(); TString8 grup; grup.format("%03d", gruppo); + const int conto = row.conto(); TString8 cont; cont.format("%03d", conto); + const int sotco = row.sotco(); TString16 sotc; sotc.format("%06ld", sotco); + TString80 codconto; codconto << grup << cont << sotc; + + real& imp = *(real*)itm; imp.round(2); + + if (!imp.is_zero()) + { + TRectype& ranmo = anmo.new_row(); + ranmo.put(RMOVANA_ANNOES, anno); + ranmo.put(RMOVANA_SEZIONE, causale.get("SEZIONE")); + ranmo.put(RMOVANA_CODCONTO, codconto); + ranmo.put(RMOVANA_CODCMS, idlav); + ranmo.put(RMOVANA_IMPORTO, imp); + } + } +} + +bool TImporta_fatacq_app::transfer(const TFilename& file, const long numreg, TAssoc_array& righean) +{ + TImporta_fatacq_rec s(file); TProgind pi(s.items(),"Importazione fatture in corso ...",true,true); - _configfile->set_paragraph("Transaction"); //setto il paragrafo [Transaction] del file ini - - _configfile->set("Action","INSERT"); + _configfile->set_paragraph("Transaction"); //setto il paragrafo [Transaction] del file ini + _configfile->set("Action","MODIFY"); _configfile->set("Mode","AUTO"); - _configfile->set_paragraph("23"); //setto il paragrafo [23] del file ini (testata) - + _configfile->set(MOV_NUMREG, numreg); _configfile->set(MOV_TIPO,"F"); _configfile->set(MOV_CODCF, _msk->get(F_CODCF)); - - _configfile->set(MOV_CODCAUS, _msk->get(F_CODCAU)); - + _configfile->set(MOV_CODCAUS, _msk->get(F_CODCAU)); _configfile->set(MOV_DATAREG, _msk->get(F_DATAREG)); - int nriga = 1; - for (bool ok=s.move_first();ok;ok=s.move_next()) + for (bool ok = s.move_first(); ok; ok = s.move_next()) { if (!pi.addstatus(1)) break; @@ -147,12 +228,28 @@ bool TFattCSV::transfer(const TFilename& file) _configfile->set_paragraph(paragraph); TString16 codcom = s.get(0).as_string(); - real imp = s.get(1).as_real(); + real imp = s.get(1).as_real(); - _configfile->set(RMI_IMPONIBILE,imp.string()); - _configfile->set(RMI_CODIVA,_msk->get(F_CODIVA)); - _configfile->set(RMI_CODCMS,codcom); + TTable cms("CMS"); + cms.put("CODTAB", codcom); + int err = cms.read(); + const int gruppo = err == NOERR ? cms.get_int("I1") : 0; + const int conto = err == NOERR ? cms.get_int("I2") : 0; + const long sotco = err == NOERR ? cms.get_int("I3") : 0; + TImporta_fatacq_anrow ankey(atol(codcom), gruppo, conto, sotco); + + if(righean.is_key(ankey)) + { + real& imponibile = *(real*)righean.objptr(ankey); + imponibile += imp; + } + else + righean.add(ankey, imp); + + _configfile->set(RMI_IMPONIBILE, imp.string()); + _configfile->set(RMI_CODIVA, _msk->get(F_CODIVA)); + _configfile->set(RMI_CODCMS, codcom); } _configfile->set_paragraph("Transaction"); @@ -162,24 +259,24 @@ bool TFattCSV::transfer(const TFilename& file) const char* nomeini = "ps0713300fatt.ini"; -bool TFattCSV::create() +bool TImporta_fatacq_app::create() { xvt_fsys_removefile(nomeini); _configfile = new TConfig(nomeini); - _msk = new TImportaFat_mask(); + _msk = new TImporta_fatacq_msk(); return TSkeleton_application::create(); } -bool TFattCSV::destroy() +bool TImporta_fatacq_app::destroy() { delete _msk; delete _configfile; return TApplication::destroy(); } -void TFattCSV::main_loop() +void TImporta_fatacq_app::main_loop() { KEY tasto; tasto = _msk->run(); @@ -189,9 +286,12 @@ void TFattCSV::main_loop() //genero il nome del file da caricare TFilename name = _msk->get(F_PATH); name.add(_msk->get(F_NAME)); - if (transfer(name)) + TAssoc_array righean; + const long numreg = genera_movcg(); + if (transfer(name, numreg, righean)) { - + genera_analitica(numreg, righean); + TString app; app << "cg2 -0 -i" << nomeini; TExternal_app primanota(app); @@ -202,13 +302,12 @@ void TFattCSV::main_loop() } } - -TFattCSV& app() { return (TFattCSV&) main_app(); } +TImporta_fatacq_app& app() { return (TImporta_fatacq_app&) main_app(); } int ps0713300 (int argc, char* argv[]) { - TFattCSV main_app; + TImporta_fatacq_app main_app; main_app.run(argc, argv, TR("Importazione Fatture")); return true; } \ No newline at end of file diff --git a/ps/ps0713300a.h b/ps/ps0713300a.h index 16e094d45..13e5adfc7 100755 --- a/ps/ps0713300a.h +++ b/ps/ps0713300a.h @@ -1,13 +1,10 @@ //campi maschera ps0713300a - -#define F_CODITTA 101 -#define F_RAGSOC 102 -#define F_PATH 103 -#define F_NAME 104 -#define F_CODIVA 105 -#define F_DESIVA 106 -#define F_CODCAU 107 -#define F_DESCAU 108 -#define F_CODCF 109 -#define F_FRAGSOC 110 -#define F_DATAREG 111 +#define F_PATH 101 +#define F_NAME 102 +#define F_CODIVA 103 +#define F_DESIVA 104 +#define F_CODCAU 105 +#define F_DESCAU 106 +#define F_CODCF 107 +#define F_FRAGSOC 108 +#define F_DATAREG 109 diff --git a/ps/ps0713400.cpp b/ps/ps0713400.cpp index acc051280..1f20cbd40 100755 --- a/ps/ps0713400.cpp +++ b/ps/ps0713400.cpp @@ -100,13 +100,12 @@ TImporta_fatven_rec::TImporta_fatven_rec(const char * fileName) //Classe TImporta_fatven_app class TImporta_fatven_app : public TSkeleton_application { - virtual bool check_autorization() const {return false;} - virtual const char * extra_modules() const {return "ve";} - - TImporta_fatven_msk* _msk; - + TImporta_fatven_msk* _msk; protected: + virtual bool check_autorization() const {return false;} + virtual const char * extra_modules() const {return "ve";} + long togli_apici_numero(TImporta_fatven_rec& s, int i); const TString& togli_apici(TImporta_fatven_rec& s, int i); bool find_clifo(long& codcf, TString& paiv, long& abi, long& cab, TString& codpag); diff --git a/ps/ps0713500.cpp b/ps/ps0713500.cpp index 8cc9f5a34..0aeadccea 100755 --- a/ps/ps0713500.cpp +++ b/ps/ps0713500.cpp @@ -2,92 +2,120 @@ #include <automask.h> #include <execp.h> #include <progind.h> -#include <reputils.h> -#include <utility.h> -#include <relation.h> -#include <reprint.h> #include <textset.h> #include <recarray.h> - -#include "tabutil.h" - -#include "ps0713.h" -#include "ps0713500a.h" - #include <rcausali.h> #include <clifo.h> #include <mov.h> #include <rmov.h> +#include "tabutil.h" -/////////////////////////////////////////////////////////// -// TAutomask -/////////////////////////////////////////////////////////// +#include "../ca/calib01.h" +#include "../ca/calib02.h" +#include "../ca/movana.h" +#include "../ca/rmovana.h" -class TImportaSpese_mask : public TAutomask +#include "ps0713500a.h" + + + + ////////////////////////////////////// + //// TIMPORTA_SPESE_ANROW //// + ////////////////////////////////////// + +//classe TImporta_spese_anrow +class TImporta_spese_anrow: public TToken_string +{ +public: + const long idlavoro(); + const int gruppo(); + const int conto(); + const int sotco(); + + TImporta_spese_anrow& operator= (const char* key){ set(key); return *this; } + + TImporta_spese_anrow(const long idlavoro, const int gruppo, const int conto, const int sotco); + TImporta_spese_anrow(const char* key):TToken_string(key){} + TImporta_spese_anrow(const TToken_string& key):TToken_string(key){} + TImporta_spese_anrow(const TImporta_spese_anrow& key):TToken_string(key){} + TImporta_spese_anrow():TToken_string(){} +}; + +//IDLAVORO: metodo che restituisce l'Idlavoro +const long TImporta_spese_anrow::idlavoro() +{ + return get_long(0); +} + +//GRUPPO: metodo che restituisce il gruppo +const int TImporta_spese_anrow::gruppo() +{ + return get_int(1); +} + +//CONTO: metodo che restituisce il conto +const int TImporta_spese_anrow::conto() +{ + return get_int(2); +} + +//SOTCO: metodo che restituisce il sottoconto +const int TImporta_spese_anrow::sotco() +{ + return get_int(3); +} + +//metodo costruttore +TImporta_spese_anrow::TImporta_spese_anrow(const long idlavoro, const int gruppo, const int conto, const int sotco) +{ + add(idlavoro); + add(gruppo); + add(conto); + add(sotco); +} + + + ////////////////////////////////// + //// TIMPORTA_SPESE_MSK //// + ////////////////////////////////// + +//Clase TImporta_spese_msk +class TImporta_spese_msk : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: - TImportaSpese_mask(); + TImporta_spese_msk(const char* name); }; -TImportaSpese_mask::TImportaSpese_mask() :TAutomask ("ps0713500a") -{ -} +TImporta_spese_msk::TImporta_spese_msk(const char* name) + :TAutomask (name) {} -bool TImportaSpese_mask::on_field_event(TOperable_field& f, TField_event e, long jolly) -{ - switch (f.dlg()) - { - //giochetto per avere la lista dei files validi nella directory di trasferimento! - case F_NAME: - if (e == fe_button) - { - TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), - "File@32"); - TFilename path = get(F_PATH); - path.add("*.csv"); //files delle testate - list_files(path, as.rows_array()); - TFilename name; - FOR_EACH_ARRAY_ROW(as.rows_array(), i, row) - { - name = *row; - *row = name.name(); - } - if (as.run() == K_ENTER) - { - f.set(as.row(as.selected())); - } - } - break; - default: - break; - } +//ON_FIELD_EVENT: metodo che gestisce i comportamenti dei vari campi della maschera +//(per adesso segnaposto) +bool TImporta_spese_msk::on_field_event(TOperable_field& f, TField_event e, long jolly) +{ return true; } - /////////////////////////////////////////////// - //// CLASSI DERIVATE PER IMPORTAZIONE DATI //// - /////////////////////////////////////////////// + ////////////////////////////////// + //// TIMPORTA_SPESE_REC //// + ////////////////////////////////// -///////////////////////////////////////////////////////////// -// Recordset specifici per i dati da trasferire -///////////////////////////////////////////////////////////// - -//Piano dei conti -class TImporta_spese_recordset : public TCSV_recordset +//Clase TImporta_spese_rec +class TImporta_spese_rec : public TCSV_recordset { protected: virtual TRecnotype new_rec(const char* buf = NULL); public: - TImporta_spese_recordset(const char * fileName); + TImporta_spese_rec(const char * fileName); }; -TRecnotype TImporta_spese_recordset::new_rec(const char* buf) +TRecnotype TImporta_spese_rec::new_rec(const char* buf) { TToken_string str(256,'\t'); //nuovo record tab separator @@ -126,34 +154,40 @@ TRecnotype TImporta_spese_recordset::new_rec(const char* buf) } -TImporta_spese_recordset::TImporta_spese_recordset(const char * fileName) +TImporta_spese_rec::TImporta_spese_rec(const char * fileName) : TCSV_recordset("CSV(,)") { load_file(fileName); } -/////////////////////////////////////// -// TSkeleton_application -/////////////////////////////////////// -class TSpeseCSV : public TSkeleton_application + ////////////////////////////////// + //// TIMPORTA_SPESE_APP //// + ////////////////////////////////// + +//Classe TImporta_spese_app +class TImporta_spese_app : public TSkeleton_application { - virtual bool check_autorization() const {return false;} + TImporta_spese_msk* _msk; +protected: + virtual bool check_autorization() const {return false;} virtual const char * extra_modules() const {return "ve";} -protected: - void chiudi_movimento(TConfig& configfile, TImporto& tot_doc, TDate& data); + void chiudi_movimento(TConfig& configfile, TImporto& tot_doc, TDate& data, const long numreg, TAssoc_array& righean); public: virtual void main_loop(); - bool transfer(const TMask& msk); + long genera_movcg(); + void genera_movana(const long numreg, TAssoc_array& righean); + bool transfer(); - TSpeseCSV() {}; + TImporta_spese_app() {}; }; -const char* const nomeini = "ps0713500ats.ini"; //non si conosce il perch� +const char* const nomeini = "ps0713500ats.ini"; -void TSpeseCSV::chiudi_movimento(TConfig& configfile, TImporto& tot_doc, TDate& data) +void TImporta_spese_app::chiudi_movimento(TConfig& configfile, TImporto& tot_doc, TDate& data, const long numreg, TAssoc_array& righean) { + genera_movana(numreg, righean); //aggiungo i campi che mancano in testata configfile.set_paragraph("23"); configfile.set(MOV_DATAREG, data); @@ -177,12 +211,77 @@ void TSpeseCSV::chiudi_movimento(TConfig& configfile, TImporto& tot_doc, TDate& primanota.run(); } -bool TSpeseCSV::transfer(const TMask& msk) +long TImporta_spese_app::genera_movcg() +{ + TISAM_recordset movrec("USE MOV"); + movrec.move_last(); + long numreg = movrec.get(MOV_NUMREG).as_int(); numreg++; + + TLocalisamfile mov(LF_MOV); + mov.put(MOV_NUMREG, numreg); + mov.rewrite(); + + return numreg; +} + +void TImporta_spese_app::genera_movana(const long numreg, TAssoc_array& righean) +{ + TProgind pi(righean.items(), "Importazione analitica in corso...", true, true); + + const TDate datareg(TODAY); + const int anno = datareg.year(); + + TToken_string key; + key.add(_msk->get(F_CODCAU)); + key.add(1); + key.add(1); + const TRectype& causale = cache().get(LF_RCAUSALI, key); + + //instanzio il movimento di analitica + TAnal_mov anmo(0); + anmo.put(MOVANA_NUMREGCG, numreg); + anmo.put(MOVANA_DATACOMP, datareg); + anmo.put(MOVANA_DATAREG, datareg); + anmo.put(MOVANA_CODCAUS, _msk->get(F_CODCAU)); + anmo.put(MOVANA_ANNOES, anno); + + //per ogni oggetto dell'assoc_array, creo una riga di analitica + FOR_EACH_ASSOC_OBJECT(righean, obj, keyar, itm) + { + if (!pi.addstatus(1)) + break; + + TImporta_spese_anrow& row = (TImporta_spese_anrow)keyar; + const long idlav = row.idlavoro(); + const int gruppo = row.gruppo(); TString8 grup; grup.format("%03d", gruppo); + const int conto = row.conto(); TString8 cont; cont.format("%03d", conto); + const int sotco = row.sotco(); TString16 sotc; sotc.format("%06ld", sotco); + TString80 codconto; codconto << grup << cont << sotc; + + real& imp = *(real*)itm; imp.round(2); + + if (!imp.is_zero()) + { + TImporto importo('D', imp); + importo.normalize(); + + TRectype& ranmo = anmo.new_row(); + ranmo.put(RMOVANA_ANNOES, anno); + ranmo.put(RMOVANA_SEZIONE, causale.get("SEZIONE")); + ranmo.put(RMOVANA_CODCONTO, codconto); + ranmo.put(RMOVANA_CODCMS, idlav); + ranmo.put(RMOVANA_IMPORTO, importo.valore().string()); + ranmo.put(RMOVANA_SEZIONE, importo.sezione()); + } + } +} + +bool TImporta_spese_app::transfer() { //genero il nome del file da caricare - TFilename name = msk.get(F_PATH); - name.add(msk.get(F_NAME)); - TImporta_spese_recordset s(name); + TFilename name = _msk->get(F_PATH); + name.add(_msk->get(F_NAME)); + TImporta_spese_rec s(name); TProgind pi(s.items(),"Importazione spese in corso ...",true,true); @@ -193,17 +292,17 @@ bool TSpeseCSV::transfer(const TMask& msk) int nriga = 2; TImporto tot_doc; + TAssoc_array righean; + long numreg; - const TRectype& causale = cache().get(LF_RCAUSALI, msk.get(F_CODCAU)); + const TRectype& causale = cache().get(LF_RCAUSALI, _msk->get(F_CODCAU)); - - for (bool ok=s.move_first();ok;ok=s.move_next()) + for (bool ok = s.move_first(); ok; ok = s.move_next()) { if (!pi.addstatus(1)) break; - - TString80 tmp; + TString80 tmp; //importo tmp = s.get(2).as_string(); @@ -222,7 +321,7 @@ bool TSpeseCSV::transfer(const TMask& msk) //codice commessa tmp = s.get(0).as_string(); tmp.strip("\""); - + const TString80 codcms = tmp; const TRectype& commessa = cache().get("CMS", tmp); //data @@ -240,16 +339,19 @@ bool TSpeseCSV::transfer(const TMask& msk) if(data != dataold) { if (dataold.ok()) - chiudi_movimento(configfile, tot_doc, data); + chiudi_movimento(configfile, tot_doc, data, numreg, righean); + + numreg = genera_movcg(); TFilename filename(nomeini); filename.fremove(); configfile.set_paragraph("Transaction"); - configfile.set("Action","INSERT"); + configfile.set("Action","MODIFY"); configfile.set("Mode","AUTO"); configfile.set_paragraph("23"); //setto il paragrafo [23] del file ini (testata) + configfile.set(MOV_NUMREG, numreg); configfile.set(MOV_CODCAUS, causale.get(RCA_CODCAUS)); configfile.set_paragraph("24,1"); @@ -258,7 +360,8 @@ bool TSpeseCSV::transfer(const TMask& msk) configfile.set(RMV_CONTO, causale.get(RCA_CONTO)); configfile.set(RMV_SOTTOCONTO, causale.get(RCA_SOTTOCONTO)); - tot_doc.reset(); + righean.destroy(); + tot_doc.reset(); nriga = 2; dataold = data; } @@ -271,30 +374,37 @@ bool TSpeseCSV::transfer(const TMask& msk) paragraph.format("%d,%d",LF_RMOV,nriga++); configfile.set_paragraph(paragraph); - configfile.set(RMV_IMPORTO,importo.valore().string()); - configfile.set(RMV_SEZIONE,importo.sezione()); - configfile.set(RMV_CODCMS,commessa.get("CODTAB")); - configfile.set(RMV_DATAREG,data); - configfile.set(RMV_GRUPPO,commessa.get("I1")); - configfile.set(RMV_CONTO,commessa.get("I2")); - configfile.set(RMV_SOTTOCONTO,commessa.get("I3")); + configfile.set(RMV_IMPORTO, importo.valore().string()); + configfile.set(RMV_SEZIONE, importo.sezione()); + configfile.set(RMV_CODCMS, commessa.get("CODTAB")); + configfile.set(RMV_DATAREG, data); + configfile.set(RMV_GRUPPO, commessa.get("I1")); + configfile.set(RMV_CONTO, commessa.get("I2")); + configfile.set(RMV_SOTTOCONTO, commessa.get("I3")); + + TImporta_spese_anrow ankey(commessa.get_long("CODTAB"), commessa.get_int("I1"), commessa.get_int("I2"), commessa.get_int("I3")); + if(righean.is_key(ankey)) + { + real& imponibile = *(real*)righean.objptr(ankey); + imponibile += importo.valore(); + } + else + righean.add(ankey, importo.valore()); } - } - - chiudi_movimento(configfile, tot_doc, data); + chiudi_movimento(configfile, tot_doc, data, numreg, righean); return true; } -void TSpeseCSV::main_loop() +void TImporta_spese_app::main_loop() { - TImportaSpese_mask msk; + _msk = new TImporta_spese_msk("ps0713500a"); - if (msk.run() == K_ENTER) + if (_msk->run() == K_ENTER) { - if (transfer(msk)) + if (transfer()) { message_box(TR("Importazione spese completata")); xvt_fsys_removefile(nomeini); @@ -303,12 +413,12 @@ void TSpeseCSV::main_loop() } -TSpeseCSV& app() { return (TSpeseCSV&) main_app(); } +TImporta_spese_app& app() { return (TImporta_spese_app&) main_app(); } int ps0713500 (int argc, char* argv[]) { - TSpeseCSV main_app; + TImporta_spese_app main_app; main_app.run(argc, argv, TR("Importazione Spese")); return true; } \ No newline at end of file diff --git a/ps/ps0713500a.h b/ps/ps0713500a.h index f142d6bf4..0a5e45654 100755 --- a/ps/ps0713500a.h +++ b/ps/ps0713500a.h @@ -1,8 +1,5 @@ -//campi maschera ps0713400a - -#define F_CODITTA 101 -#define F_RAGSOC 102 -#define F_PATH 103 -#define F_NAME 104 -#define F_CODCAU 105 +//campi maschera ps0713500a +#define F_PATH 101 +#define F_NAME 102 +#define F_CODCAU 103 #define F_DESCAU 106 \ No newline at end of file diff --git a/ps/ps0713500a.uml b/ps/ps0713500a.uml index 9a59e94ff..d49f05ff6 100755 --- a/ps/ps0713500a.uml +++ b/ps/ps0713500a.uml @@ -1,68 +1,38 @@ #include "ps0713500a.h" -TOOLBAR "" 0 20 0 2 +TOOLBAR "" 0 0 0 2 -BUTTON DLG_ELABORA 10 2 -BEGIN - PICTURE BMP_ELABORA - MESSAGE EXIT,K_ENTER - PROMPT -12 -1 "" -END - -BUTTON DLG_QUIT 10 2 -BEGIN - PROMPT -22 -1 "" -END - -STRING DLG_PROFILE 50 -BEGIN - PROMPT 9 -12 "Profilo " - PSELECT - FLAGS "H" -END +#include <elabar.h> ENDPAGE PAGE "Inserimento fatture" 0 0 0 -3 -GROUPBOX DLG_NULL 90 3 +STRING DLG_PROFILE 50 BEGIN - PROMPT 2 1 "@bDitta corrente" + PROMPT 1 -1 "Profilo " + PSELECT + FLAGS "H" END -NUMBER F_CODITTA 5 +GROUPBOX DLG_NULL 78 4 BEGIN - PROMPT 3 2 "Codice " - FLAGS "FD" - USE LF_NDITTE - INPUT CODDITTA F_CODITTA - OUTPUT F_RAGSOC RAGSOC - CHECKTYPE REQUIRED + PROMPT 1 1 "@bSorgente" END -STRING F_RAGSOC 50 +STRING F_PATH 256 50 BEGIN - PROMPT 23 2 "" - FLAGS "D" -END - -GROUPBOX DLG_NULL 90 4 -BEGIN - PROMPT 2 4 "@bSorgente" -END - -STRING F_PATH 256 39 -BEGIN - PROMPT 3 5 "Cartella " - DSELECT - CHECKTYPE REQUIRED + PROMPT 2 2 "Cartella " + DSELECT FIELD ComInPath FLAGS "M" + CHECKTYPE REQUIRED END STRING F_NAME 18 BEGIN - PROMPT 3 6 "File (*.csv) " + PROMPT 2 3 "File (*.csv) " + FSELECT "*.csv" FIELD ComInFile FLAGS "B" CHECKTYPE REQUIRED @@ -70,12 +40,12 @@ END GROUPBOX DLG_NULL 90 3 BEGIN - PROMPT 2 8 "@bCausale" + PROMPT 1 5 "@bCausale" END STRING F_CODCAU 3 BEGIN - PROMPT 3 9 "Causale " + PROMPT 2 6 "Causale " FIELD CODCAU FLAGS "UZ" USE LF_CAUSALI @@ -92,7 +62,7 @@ END STRING F_DESCAU 50 BEGIN - PROMPT 25 9 "Descrizione " + PROMPT 25 6 "Descrizione " FIELD DESCR USE LF_CAUSALI KEY 2 INPUT DESCR F_DESCAU @@ -104,8 +74,5 @@ BEGIN COPY OUTPUT F_CODCAU END - - ENDPAGE - ENDMASK \ No newline at end of file diff --git a/ps/ps0713600.cpp b/ps/ps0713600.cpp index 528e3be2b..5a0030214 100755 --- a/ps/ps0713600.cpp +++ b/ps/ps0713600.cpp @@ -161,6 +161,7 @@ TImporta_fat_for_anrow::TImporta_fat_for_anrow(const long idlavoro, const int gr class TImporta_fat_for_app : public TSkeleton_application { TImporta_fat_for_msk* _msk; + protected: virtual bool check_autorization() const { return false; } virtual const char * extra_modules() const { return "ve"; } @@ -302,9 +303,10 @@ bool TImporta_fat_for_app::importa(const TFilename& name, TAssoc_array& righean, return true; } +//GENERA_MOVCG: metodo che genera la testata del movimento di prima nota long TImporta_fat_for_app::genera_movcg() { - TISAM_recordset movrec(TR("USE MOV")); + TISAM_recordset movrec("USE MOV"); movrec.move_last(); long numreg = movrec.get(MOV_NUMREG).as_int(); numreg++; @@ -315,9 +317,10 @@ long TImporta_fat_for_app::genera_movcg() return numreg; } +//GENERA_ANALITICA: metodo che genera il movimento di contabilit� analitica void TImporta_fat_for_app::genera_analitica(TAssoc_array& righean, TImporta_fat_for_anrow& kmax, const real& quad, const long numregcg) { - TProgind pi(righean.items(), "Importazione in corso...", true, true); + TProgind pi(righean.items(), "Importazione analitica in corso...", true, true); TToken_string key; key.add(_msk->get(F_CODCAU)); @@ -326,12 +329,15 @@ void TImporta_fat_for_app::genera_analitica(TAssoc_array& righean, TImporta_fat_ const TRectype& causale = cache().get(LF_RCAUSALI, key); const int anno = _msk->get_date(F_DATADOC).year(); + //instanzio il movimento di analitica TAnal_mov anmo(0); anmo.put(MOVANA_NUMREGCG, numregcg); anmo.put(MOVANA_DATACOMP, _msk->get_date(F_DATAREG)); anmo.put(MOVANA_DATAREG, _msk->get_date(F_DATAREG)); anmo.put(MOVANA_CODCAUS, _msk->get(F_CODCAU)); + anmo.put(MOVANA_ANNOES, anno); + //aggiungo i campi relativi ai documenti solo quando li ho a disposizione if(_msk->get_int(F_TIPOFAT) == 1) { const real iva = cache().get("%IVA", _msk->get(F_CODIVA), "R0"); @@ -360,6 +366,7 @@ void TImporta_fat_for_app::genera_analitica(TAssoc_array& righean, TImporta_fat_ anmo.put(MOVANA_TOTDOC, totdoc.string()); } + //per ogni oggetto dell'assoc_array, creo una riga di analitica FOR_EACH_ASSOC_OBJECT(righean, obj, keyar, itm) { if (!pi.addstatus(1)) @@ -402,6 +409,7 @@ void TImporta_fat_for_app::genera_analitica(TAssoc_array& righean, TImporta_fat_ } } +//IMPORTA_FAT: metodo che genera l'ini per l'importazione delle fatture a fornitore void TImporta_fat_for_app::importa_fat(TAssoc_array& righecg, TImporta_fat_for_anrow& kmax, const real& quad, TConfig* configfile, const long numregcg) { const TDate datareg = _msk->get_date(F_DATAREG); @@ -453,6 +461,7 @@ void TImporta_fat_for_app::importa_fat(TAssoc_array& righecg, TImporta_fat_for_a int nrigaiv = 0; + //per ogni riga dell'assoc_array, creo un paragrafo riga FOR_EACH_ASSOC_OBJECT(righecg, obj, keyar1, itm1) { if (!pi.addstatus(1)) @@ -482,6 +491,7 @@ void TImporta_fat_for_app::importa_fat(TAssoc_array& righecg, TImporta_fat_for_a } } + //se c'� bisogno, faccio una riga in pi� if(quad > ZERO) { TString8 paragraph; @@ -506,6 +516,8 @@ void TImporta_fat_for_app::importa_fat(TAssoc_array& righecg, TImporta_fat_for_a configfile->set_paragraph(paragraph); } +//IMPORTA_FAT_RIC: metodo che genera l'ini per l'importazione delle fatture da ricevere +//(attenzione: genero righe IVA) void TImporta_fat_for_app::importa_fat_ric(TAssoc_array& righecg, TImporta_fat_for_anrow& kmax, const real& quad, TConfig* configfile, const long numregcg) { const TDate datareg = _msk->get_date(F_DATAREG); @@ -534,6 +546,7 @@ void TImporta_fat_for_app::importa_fat_ric(TAssoc_array& righecg, TImporta_fat_f int nrigaco = 1; + //prima riga: serve a bilanaciare le altre TString8 paragraph; paragraph.format("%d,%d", LF_RMOV, 1); configfile->set_paragraph(paragraph); @@ -550,6 +563,7 @@ void TImporta_fat_for_app::importa_fat_ric(TAssoc_array& righecg, TImporta_fat_f key.add(2,1); const TRectype& causale2 = cache().get(LF_RCAUSALI, key); + //per ogni oggetto dell'assoc_array, preparo un paragrafo riga FOR_EACH_ASSOC_OBJECT(righecg, obj, keyar, itm) { if (!pi.addstatus(1)) @@ -576,6 +590,7 @@ void TImporta_fat_for_app::importa_fat_ric(TAssoc_array& righecg, TImporta_fat_f } } + //se serve, faccio una riga in pi� if(quad > ZERO) { TString8 paragraph;