diff --git a/ba/ba1600.cpp b/ba/ba1600.cpp index 09af732c5..1d1736780 100755 --- a/ba/ba1600.cpp +++ b/ba/ba1600.cpp @@ -141,12 +141,15 @@ int TInstall_ini::build_complete_list(const TString& module, TString_array& a, sum.set("Demo", demo() ? "X" : ""); } // Lista dei file appartenenti ai sottomoduli del modulo principale (0-9) - build_list(module, a, sommario, agg); + build_list(module, a, sommario, agg); + + TString_array b; //array locale temporaneo contenente la lista dei files da uccidere + build_kill_list(module, b, sommario, agg); TAuto_token_string altri(get("Moduli", module)); FOR_EACH_TOKEN(altri, mod) { const TString16 submodule = mod; - // Lista dei files apparteneti ai sottomoduli esterni (moduli esclusi!) + // Lista dei files appartenenti ai sottomoduli esterni (moduli esclusi!) if (submodule.len() > 2) build_list(submodule, a, sommario, agg); } @@ -182,6 +185,45 @@ int TInstall_ini::build_app_list(const TString& module, TString_array& a) return a.items(); } +//crea x ogni modulo il sottomodulo 10 con i files da accoppare +int TInstall_ini::build_kill_list(const TString& module, TString_array& a, + const char* sommario, bool agg) +{ + CHECKS(module.len() >= 2, "Bad module ", (const char*)module); + + TString paragraph; + paragraph << module << 99; + + TConfig* sum = NULL; + if (sommario && *sommario) + sum = new TConfig(sommario, paragraph); //va nei sottomoduli 99 + + TAuto_token_string tmp; + + TAssoc_array& varlist = list_variables(paragraph); + FOR_EACH_ASSOC_STRING(varlist, obj, key, str) + { + const bool is_kill = strncmp(key, "Kill", 4) == 0; + // Quando creo il disco di aggiornamento prendo solo i file che devono essere uccisi + if (is_kill) + { + tmp = str; // Nome e aggiornamento + + if (agg && tmp.get_char(1) <= ' ') //non e' selezionato + continue; + if (sum) + sum->set(key, tmp); + + tmp.lower(); + a.add(tmp); + } + } + + if (sum) + delete sum; + + return a.items(); +} void TInstall_ini::export_paragraph(const char* module, const char* summary,const bool remove_old) { @@ -199,7 +241,9 @@ void TInstall_ini::export_paragraph(const char* module, const char* summary,cons { // substitute... sum.remove_all(); - } else { + } + else + { // merge... sum.build_list(main_module, old_list); sum.set_paragraph(module); @@ -226,12 +270,14 @@ void TInstall_ini::export_paragraph(const char* module, const char* summary,cons THash_object* obj; TToken_string oldvalue; oldvars.restart(); - do { + do + { obj=oldvars.get_hashobj(); oldvalue=((TString &)obj->obj()); if (tmps == oldvalue.get(0)) break; - } while (obj); + } + while (obj); newkey=obj->key(); if (old_smodule!=module) { @@ -240,7 +286,9 @@ void TInstall_ini::export_paragraph(const char* module, const char* summary,cons sum.remove(newkey); sum.set_paragraph(module); } - } else { + } + else + { // nuovo file newkey = "File"; newkey << '(' << last_file_num++ << ')'; @@ -265,6 +313,11 @@ void TInstall_ini::export_module_paragraphs(const char* module, const char* summ if (set_paragraph(mod)) export_paragraph(mod, summary,remove_old); } + // esporta la lista di eventuali files da eliminare (sono i killed) + mod = module; + mod << 99; + if (set_paragraph(mod)) + export_paragraph(mod, summary,remove_old); if (remove_old) { @@ -314,9 +367,7 @@ int TInstall_ini::patch(const char* module) return patch; } -void TInstall_ini::version_info(const char* module, - int& year, int& release, - int& tag, int& patchlevel) +void TInstall_ini::version_info(const char* module,int& year, int& release,int& tag, int& patchlevel) { TString ver = version(module); if (ver[0] == '9') @@ -361,8 +412,7 @@ bool TInstall_ini::update_prices(const char* from) return TRUE; } -void TInstall_ini::prices(const char* module, word users, - real& full, real& assist, bool correct_ass) +void TInstall_ini::prices(const char* module, word users, real& full, real& assist, bool correct_ass) { real last_pac, last_ass; full = assist = 0.0; @@ -437,13 +487,19 @@ class TMod_composition_msk : public TMask protected: static bool sheet_notify(TSheet_field& sf, int row, KEY key); static bool missing_notify(TSheet_field& sf, int row, KEY key); + bool kill_missing(const char* name, bool update); + static bool link_handler(TMask_field& f, KEY k); + + static bool kill_notify(TSheet_field& sf, int row, KEY key); //metodo per la gestione della lista dei files da eliminare effettivamente + static bool obsolete_notify(TSheet_field& sf, int row, KEY key); //metodo x riempire la lista dei files che si consiglia di eliminare + bool kill_obsolete(const char* name, bool update); //metodi x eliminare i files dalla lista dei consigliati quando si aggiungono + static bool obs_handler(TMask_field& f, KEY k); //alla lista definitiva di eliminazione + static bool file_handler(TMask_field& f, KEY k); static bool edit_handler(TMask_field& f, KEY k); - static bool link_handler(TMask_field& f, KEY k); static bool deselect_handler(TMask_field& f, KEY k); static bool isam_handler(TMask_field& f, KEY k); - - bool kill_missing(const char* name, bool update); + static bool kill_handler(TMask_field& f, KEY k); public: void load(const TString& module); @@ -468,6 +524,21 @@ bool TMod_composition_msk::kill_missing(const char* name, bool update) return r >= 0; } +// Toglie il file dallo sheet degli ELIMINABILI +bool TMod_composition_msk::kill_obsolete(const char* name, bool update) +{ + TSheet_field& obs = sfield(F_OBSOLETE); + FOR_EACH_SHEET_ROW_BACK(obs, r, row) + { + if (row->compare(name, -1, TRUE) == 0) + { + obs.destroy(r, update); + break; + } + } + return r >= 0; +} + bool TMod_composition_msk::sheet_notify(TSheet_field& sf, int r, KEY key) { bool ok = TRUE; @@ -557,6 +628,81 @@ bool TMod_composition_msk::sheet_notify(TSheet_field& sf, int r, KEY key) return ok; } +//metodo per la gestione dello sheet con la lista dei files da ELIMINARE effettivamente +bool TMod_composition_msk::kill_notify(TSheet_field& sf, int r, KEY key) +{ + bool ok = TRUE; + switch(key) + { + case K_TAB: + // Posso cancellare solo le righe abilitate + sf.sheet_mask().enable(DLG_DELREC, !sf.cell_disabled(r, 1)); + break; + case K_ENTER: + { + TFilename mask = sf.row(r).get(0); + if (mask.find('*') >= 0 || mask.find('?') >= 0) + { + TString_array arr; list_files(mask, arr); + const int items = arr.items(); + + if (items > 0) + { + TMod_composition_msk& msk = (TMod_composition_msk&)sf.mask(); + TString_array & rows=msk.sfield(F_KILL).rows_array(); + + TFilename start; + DIRECTORY dir; xvt_fsys_get_dir(&dir); + xvt_fsys_convert_dir_to_str(&dir, start.get_buffer(), start.size()); + const int maxlen = start.len(); + + bool found = FALSE; + for (int i = 0; i < items; i++) + { + TString& file = arr.row(i); + if (file.compare(start, maxlen, TRUE) == 0) + file.ltrim(maxlen+1); + file.lower(); + + msk.kill_obsolete(file, FALSE); + + if (::find(file,rows)>=0) + { + TToken_string& row = sf.row(found ? -1 : r); + row = file; + row.add(" "); + found = TRUE; + } + } + // Se ne ho trovato almeno uno valido allora updato + if (found) + { + sf.force_update(); + TSheet_field& miss = msk.sfield(F_OBSOLETE); + miss.force_update(); + } + } + else + ok = sf.error_box("Nessun file corrisponde a %s", mask.get_buffer()); + } + } + break; + case K_DEL: + ok = !sf.cell_disabled(r, 1); + if (ok) + { + // Sposto la riga cancellata nello sheet a fianco + TSheet_field& miss = sf.mask().sfield(F_OBSOLETE); + miss.row(-1) = sf.row(r).get(0); + miss.force_update(); + } + break; + default: + break; + } + return ok; +} + bool TMod_composition_msk::missing_notify(TSheet_field& sf, int r, KEY key) { bool ok = TRUE; @@ -581,7 +727,7 @@ bool TMod_composition_msk::missing_notify(TSheet_field& sf, int r, KEY key) ok = FALSE; } return ok; -} +} bool TMod_composition_msk::file_handler(TMask_field& f, KEY k) { @@ -631,6 +777,17 @@ bool TMod_composition_msk::file_handler(TMask_field& f, KEY k) return TRUE; } +bool TMod_composition_msk::kill_handler(TMask_field& f, KEY k) +{ + if (k = K_TAB && f.focusdirty()) + { + TMod_composition_msk& msk = (TMod_composition_msk&)f.mask().get_sheet()->mask(); + msk.kill_obsolete(f.get(), TRUE); + } + + return TRUE; +} + bool TMod_composition_msk::edit_handler(TMask_field& f, KEY k) { if (k == K_SPACE) @@ -673,6 +830,66 @@ bool TMod_composition_msk::link_handler(TMask_field& f, KEY k) return TRUE; } +static int obsolete_found(TConfig& cfg, void* jolly) +{ + TAssoc_array& list = cfg.list_variables(); + TString_array& files = *(TString_array*)jolly; //castato jolly a TString_array; sono i files su disco + FOR_EACH_ASSOC_STRING(list, hash, key, string) + { + if (strncmp(key, "File(", 5) == 0) + { + int pos = files.find(string); + if (pos >=0) + files.destroy(pos, TRUE); //se trova il file sia su disco che nell'ini -> lo toglie dall'elenco su disco + } + } + return 0; +} + +// metodo per riempire lo sheet dei file che si CONSIGLIA di eliminare +bool TMod_composition_msk::obsolete_notify(TSheet_field& sf, int r, KEY key) +{ + if (key == K_INS) //la compilazione dello sheet avviene solo quando si preme il pulsante + + { + TWait_cursor hourglass; + TString_array& elenco_dir = sf.rows_array(); //string_array che conterra' i files della directory + elenco_dir.destroy(); //resetta l'elenco dei files della directory + list_files("*.*", elenco_dir); //legge tutti i files della dir corrente e li mette in elenco_dir + FOR_EACH_ARRAY_ROW(elenco_dir,i,row) //mette in minuscolo tutti i nomi di files su disco + row->lower(); + //e' il file install.ini + TInstall_ini ini; + ini.for_each_paragraph(obsolete_found, &elenco_dir); //per ogni paragrafo dell'install.ini chiama la obsolete_found + sf.force_update(); //aggiornamento dello sheet (di sinistra) sulla maschera + } + return TRUE; +} + +//spostamento oggetti da sheet obsoleti a sheet con files da eliminare (sulla mask e' da destra a sinistra) +bool TMod_composition_msk::obs_handler(TMask_field& f, KEY k) +{ + if (k == K_SPACE) + { + TMask& modmask = f.mask(); //maschera di riga dello sheet + TSheet_field* sf = modmask.get_sheet(); + TMask& mainmask = sf->mask(); + TSheet_field& sheet = mainmask.sfield(F_KILL); //sheet sinistro della maschera di Eliminazione + TToken_string& newrow = sheet.row(-1); //aggiunge una riga allo sheet... + newrow = modmask.get(101); //..e ci mette il nome del file + + if (modmask.is_running()) + { + modmask.stop_run(K_ESC); + do_events(); + } + sf->destroy(sf->selected()); + sheet.force_update(); //update dello sheet sinistro della maschera di eliminazione (files condannati) + sf->force_update(); + } + return TRUE; +} + + bool TMod_composition_msk::deselect_handler(TMask_field& f, KEY k) { if (k == K_SPACE) @@ -727,12 +944,13 @@ void TMod_composition_msk::load(const TString& module) TWait_cursor hourglass; set(F_MODULE, module); - TInstall_ini ini; - TSheet_field& s = sfield(F_SHEET); + TInstall_ini ini; //install.ini + + TSheet_field& s = sfield(F_SHEET); //legge da install.ini la lista dei files del modulo ini.build_list(module, s.rows_array()); s.rows_array().TArray::sort(file_compare); - TSheet_field& p = sfield(F_PROGRAMS); + TSheet_field& p = sfield(F_PROGRAMS); //la lista dei programmi tipo quelli x l'editing ini.build_app_list(module, p.rows_array()); TFilename mask; @@ -742,6 +960,9 @@ void TMod_composition_msk::load(const TString& module) TString_array& arr = miss.rows_array(); list_files(mask, arr); + TSheet_field& kill = sfield(F_KILL); //legge da install.ini la lista dei files da uccidere + ini.build_kill_list(module, kill.rows_array()); + const char* bad_ext[] = { "bsc", "mak", "obj", "pdb", "rc", "res", "sbr", "vcw", "wsp", NULL }; @@ -847,6 +1068,15 @@ void TMod_composition_msk::save() n = prow->get(2); ini.set(var, n, sub); } + + TSheet_field& kp = sfield(F_KILL); + TString16 sub = module; + sub << 99; + FOR_EACH_SHEET_ROW(kp, kr, krow) + { + ini.set("Kill", *krow, sub, TRUE, kr); + } + } TMod_composition_msk::TMod_composition_msk(const bool modify_mode) @@ -855,6 +1085,8 @@ TMod_composition_msk::TMod_composition_msk(const bool modify_mode) TSheet_field& s = sfield(F_SHEET); TSheet_field& miss = sfield(F_MISSING); TSheet_field& prog = sfield(F_PROGRAMS); + TSheet_field& kill = sfield(F_KILL); + TSheet_field& obs = sfield(F_OBSOLETE); set_handler(F_DESELECT, deselect_handler); if (modify_mode) { @@ -865,13 +1097,17 @@ TMod_composition_msk::TMod_composition_msk(const bool modify_mode) miss.set_notify(missing_notify); miss.sheet_mask().set_handler(100, link_handler); prog.sheet_mask().set_handler(102, isam_handler); + + obs.set_notify(obsolete_notify); + obs.sheet_mask().set_handler(100, obs_handler); + + kill.set_notify(kill_notify); + kill.sheet_mask().set_handler(101, kill_handler); } else { s.disable(); // Read-only sheet - //hide(DLG_OK); - // hide(F_DESELECT); - //hide(DLG_CANCEL); + miss.hide(); disable_page(1); } @@ -1403,22 +1639,12 @@ bool TCreadischi_mask::import_export_handler(TMask_field& f, KEY k) if (is_export) { TInstall_ini inst; - inst.export_module_paragraphs(module, path,TRUE); - - /*TFconv_ini fconv; - path = path.path(); - path.add(module); path << "fconv.ini"; - fconv.export_module(module, path);*/ + inst.export_module_paragraphs(module, path, TRUE); } else { TInstall_ini ini(path); - ini.export_module_paragraphs(module, ini.default_name(),TRUE); - - /*path = path.path(); - path.add(module); path << "fconv.ini"; - TFconv_ini fconv(path); - fconv.export_module(module, "fconv.ini");*/ + ini.export_module_paragraphs(module, ini.default_name(), TRUE); } } } diff --git a/ba/ba1600.h b/ba/ba1600.h index a13a4ac14..d8c7dabf7 100755 --- a/ba/ba1600.h +++ b/ba/ba1600.h @@ -13,7 +13,8 @@ public: int build_complete_list(const TString& m, TString_array& a, const char* s = NULL, bool agg = FALSE); int build_app_list(const TString& m, TString_array& a); - + int build_kill_list(const TString& m, TString_array& a, + const char* s = NULL, bool agg = FALSE); void export_paragraph(const char* module, const char* summary,const bool remove); void export_module_paragraphs(const char* module, const char* summary,const bool remove); diff --git a/ba/ba1600a.h b/ba/ba1600a.h index ecc68289d..6973c08cc 100755 --- a/ba/ba1600a.h +++ b/ba/ba1600a.h @@ -1,3 +1,4 @@ +//campi maschere ba1600a ba1600b #ifndef __BA1600A_H #define __BA1600A_H @@ -7,6 +8,8 @@ #define F_MISSING 204 #define F_MODULE 205 #define F_PROGRAMS 206 +#define F_KILL 210 +#define F_OBSOLETE 211 #define F_DESELECT 251 #define S_FILE 101 diff --git a/ba/ba1600b.uml b/ba/ba1600b.uml index fe2d38655..c7a2de1ab 100755 --- a/ba/ba1600b.uml +++ b/ba/ba1600b.uml @@ -19,6 +19,7 @@ END ENDPAGE +//_______________________________________lista files del modulo____________________________________________________// PAGE "Lista" -1 -1 78 20 STRING F_MODULE 2 @@ -27,7 +28,8 @@ BEGIN FLAGS "D" END -SPREADSHEET F_SHEET 47 +//elenco files gia' presenti nella lista del modulo +SPREADSHEET F_SHEET 47 BEGIN PROMPT 1 1 "" ITEM "File@27" @@ -35,6 +37,7 @@ BEGIN ITEM "Mod." END +//elenco files non presenti nella lista del modulo (che si consiglia di aggiungere) SPREADSHEET F_MISSING 20 BEGIN PROMPT 50 1 "" @@ -44,6 +47,7 @@ END ENDPAGE +//_________________________lista programmi da eseguire per cose tipo l'editing dei files di dati_________________// PAGE "Programmi" -1 -1 78 20 SPREADSHEET F_PROGRAMS 78 @@ -56,8 +60,28 @@ END ENDPAGE +//_______________________lista files da rimuovere dal programma__________________________________________________// +PAGE "Eliminazione" -1 -1 78 20 + +SPREADSHEET F_KILL 44 +BEGIN + PROMPT 1 1 "" + ITEM "File@27" + ITEM "Agg." +END + +SPREADSHEET F_OBSOLETE 20 +BEGIN + PROMPT 50 1 "" + ITEM "File@20" + FLAGS "D" +END + +ENDPAGE + ENDMASK +//___________________________maschera di riga dello spreadsheet dei files da aggiungere all'aggiornamento___________________// PAGE "File" -1 -1 52 5 STRING 101 35 @@ -102,6 +126,7 @@ ENDPAGE ENDMASK +//______________________________maschera di riga dello spreadsheet dei files da aggiungere alla lista del modulo_________// PAGE "File" -1 -1 42 5 STRING 101 30 @@ -124,6 +149,7 @@ ENDPAGE ENDMASK +//__________________________________maschera di riga dello spreadsheet dei prgrammi per l'editing dei dati___________________// PAGE "Programmi" -1 -1 64 5 LIST 101 4 10 @@ -165,4 +191,60 @@ END ENDPAGE ENDMASK + +//__________________________________maschera di riga dello spreadsheet dei files da eliminare____________________________// +PAGE "Eliminazione file" -1 -1 52 5 + +STRING 101 35 +BEGIN + PROMPT 1 1 "File " + FLAGS "B" +END + +BOOLEAN 102 +BEGIN + PROMPT 1 2 "Includi nell'aggiornamento" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "~Elimina" + PICTURE BMP_DELREC +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK + +//____________________maschera di riga dello spreadsheet dei files da aggiungere alla lista di quelli da eliminare_________// +PAGE "File" -1 -1 42 5 + +STRING 101 30 +BEGIN + PROMPT 1 1 "File " +END + +BUTTON 100 10 2 +BEGIN + PROMPT -12 -1 "~Elimina" + PICTURE BMP_DELREC +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE +ENDMASK \ No newline at end of file diff --git a/ba/ba1700.cpp b/ba/ba1700.cpp index 390a827e7..df77ba367 100755 --- a/ba/ba1700.cpp +++ b/ba/ba1700.cpp @@ -557,6 +557,7 @@ bool TInstaller_mask::move_file(const TFilename& from, const TFilename& file, co bool space_ok = FALSE; while (!space_ok) { + space_ok = os_test_disk_free_space(dest, filesize); if (!space_ok) { @@ -614,7 +615,7 @@ bool TInstaller_mask::move_module(const TString& module, TInstall_ini& ini, bool if (!update) ::remove(src); } - + return ok; } @@ -836,6 +837,24 @@ bool TInstaller_mask::install(const TString& module, int patchlevel) } } } + if (ok) //rimozione files da eliminare indicati nel .ini + { + TString killmod; + killmod << module << 99; + if (ini->set_paragraph(killmod)) + { + TToken_string rigaini; + TFilename filetokill; + for (int k=0; ;k++) + { + rigaini = ini->get("Kill", NULL, k, ""); + if (rigaini.empty()) + break; + filetokill = rigaini.get(0); + ::remove(filetokill); + } + } + } } } if (ok) // marca sull'install.ini di destinazione l'avvenuta installazione del modulo diff --git a/ba/ba7100.cpp b/ba/ba7100.cpp index 85b3042e5..5baac9de7 100755 --- a/ba/ba7100.cpp +++ b/ba/ba7100.cpp @@ -433,7 +433,7 @@ TFilter_expr::TFilter_expr(TAutomask& m, int logicnum, const char* expr) if (ok) { if (logicnum < LF_USER || logicnum >= prefix().items()) - logicnum = LF_TABCOM; + logicnum = LF_TABCOM; // Niente errori fatali, se possibile TLocalisamfile isf(logicnum); TRectype& rec = isf.curr(); @@ -462,7 +462,8 @@ class TMailer_mask : public TAutomask TMail_messages _box; bool _sequential; - TString _last_file, _last_app; // Used by file2app + TString_array _key1; // Elenco dei campi della chiave principale dei files + TAssoc_array _apps; // Elenco delle applicazioni per processare i files protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); @@ -475,6 +476,10 @@ protected: void save_sheet(TConfig& ini, short dlg, const char* var) const; void load_sheet(TConfig& ini, short dlg, const char* var); + TToken_string& get_key1(int lf) const; + bool build_key1(int lf, const TString& body, TToken_string& key) const; + void find_redundant_messages(); + public: void test_delete(); int fill_messages(); @@ -515,7 +520,7 @@ void TMailer_mask::test_delete() break; } if (!mailbox.remove(id)) - error_box("Impossibile cancellare il messagio POP3 %s", (const char*)id); + error_box("Impossibile cancellare il messaggio POP3 %s", (const char*)id); } else { @@ -646,15 +651,16 @@ int TMailer_mask::fill_messages() bool TMailer_mask::file2app(const TString& file, TString& app) const { - bool ok = FALSE; - if (file != _last_file) + bool ok = FALSE; + + const TString* run = (const TString*)_apps.objptr(file); + if (run == NULL) { TConfig d(CONFIG_DITTA, "ba7"); TString16 appname; appname << "Edit_" << file; app = d.get(appname); if (app.empty()) { - if (isdigit(file[0])) { const int filenum = atoi(file); @@ -676,14 +682,13 @@ bool TMailer_mask::file2app(const TString& file, TString& app) const } else ok = TRUE; - // Fool const directive - (TString&)_last_file = file; - (TString&)_last_app = app; + + ((TMailer_mask*)this)->_apps.add(file, app); // Fool const } else { - app = _last_app; - ok = TRUE; + app = *run; + ok = app.not_empty(); } return ok; } @@ -854,6 +859,96 @@ bool TMailer_mask::save_sheet_line(int& err, int nrow) return ok; } +TToken_string& TMailer_mask::get_key1(int lf) const +{ + TString_array& k1 = (TString_array&)_key1; // fool const; + if (k1.objptr(lf) == NULL) + { + TLocalisamfile file(lf); + const RecDes* recd = file.curr().rec_des(); // Descrizione del record della testata + const KeyDes& kd = recd->Ky[0]; // Elenco dei campi della chiave 1 + TToken_string key; + for (int i = 0; i < kd.NkFields; i++) + { + const int nf = kd.FieldSeq[i] % MaxFields; + const RecFieldDes& rf = recd->Fd[nf]; + key.add(rf.Name); + } + k1.add(key, lf); + } + return k1.row(lf); +} + +bool TMailer_mask::build_key1(int lf, const TString& body, TToken_string& key) const +{ + key.format("%d", lf); + + TString16 field; // Nome del campo chiave + TString value; // Valore del campo chiave + + TToken_string& key1 = get_key1(lf); // Elenco dei campi chiave + FOR_EACH_TOKEN(key1, fld) + { + field = fld; field.insert("\n"); + const int start = body.find(field); + if (start < 0) + return FALSE; + const int equal = body.find('=', start); + if (equal < 0) + return FALSE; + const int stop = body.find('\n', equal); + if (stop < 0) + return FALSE; + value = body.sub(equal+1, stop); + value.trim(); + if (value[0] == '"' && value.right(1) == "\"") // Toglie eventuali virgolette + { + value.rtrim(1); + value.ltrim(1); + } + key.add(value); + } + return TRUE; +} + +void TMailer_mask::find_redundant_messages() +{ + // Elenco dei records (chiavi primarie) già processati (virtualmente) + TAssoc_array andreotti; + + TSheet_field& sf = sfield(F_MESSAGES); + TString subj, body; + TToken_string key1; + + // Scorro tutti i messaggi non ancora elaborati + FOR_EACH_SHEET_ROW_BACK(sf, nrow, row) if (*row->get(0) != 'X') + { + row->get(sf.cid2index(F_BODY), body); + if (body.find("[Transaction]") < 0) // Scarto i messaggi che non siano transazioni + continue; + + row->get(sf.cid2index(F_SUBJECT), subj); + + int lfile = LF_TAB; // Numero logico del file + if (isalpha(subj[0])) // Controlla se la tabella in realtà è comune ed aggiunge il simbolino % + { + TString8 para; para << '[' << LF_TABCOM << ']'; + if (body.find(para) > 0) + lfile = LF_TABCOM; + } + else + lfile = atoi(subj); + + if (build_key1(lfile, body, key1)) + { + if (andreotti.is_key(key1)) + row->add("R", 0); // Messaggio ridondante! + else + andreotti.add(key1); // Messaggio da processare! + } + } +} + void TMailer_mask::save_all_lines() { TBrowsefile_field& bf = (TBrowsefile_field&)field(F_LOG); @@ -869,12 +964,25 @@ void TMailer_mask::save_all_lines() d->tm_mday, d->tm_mon+1, 1900+d->tm_year, d->tm_hour, d->tm_min, d->tm_sec); vv.add_line(msg); + + find_redundant_messages(); bool one_saved = FALSE; FOR_EACH_SHEET_ROW(sf, nrow, row) { msg.format("Messaggio %d ", nrow+1); - if (*row->get(0) != 'X') + const char mark = *row->get(0); + + if (mark == 'X') + msg << "ignorato in quanto già elaborato"; + + if (mark == 'R') + { + msg << "ignorato in quanto ridondante"; + row->add("X", 0); // Marcalo come elaborato comunque + } + + if (mark <= ' ') { row->get(sf.cid2index(F_BODY), body); if (body.find("[Transaction]") >= 0) @@ -889,8 +997,7 @@ void TMailer_mask::save_all_lines() else if (err == NOT_GEST) { - TSheet_field& sf = sfield(F_MESSAGES); - TMask& m = sf.sheet_mask(); + const TMask& m = sf.sheet_mask(); msg << " definire il programma gestore del file " << m.get(F_SUBJECT); } else @@ -903,8 +1010,6 @@ void TMailer_mask::save_all_lines() else msg << "ignorato in quanto transazione non riconosciuta"; } - else - msg << "ignorato in quanto già elaborato"; vv.add_line(msg); } @@ -917,6 +1022,8 @@ void TMailer_mask::save_all_lines() vv.add_line(""); vv.goto_end(); + sf.force_update(); // Fai apparire tutte le X + #ifdef DBG if (one_saved && yesno_box("Si desidera eliminare i messaggi processati?")) #else @@ -1088,14 +1195,14 @@ void TMailer_mask::auto_save_all() { if (_mail_semaphore == 0) { + TSheet_field& sf = sfield(F_MESSAGES); #ifdef DBG - if (yesno_box("Si desidera eliminare i messaggi processati?")) + if (sf.items() > 0 && yesno_box("Si desidera eliminare i messaggi processati?")) #endif test_delete(); fill_messages(); if (!field(F_TIMER).empty()) { - TSheet_field& sf = sfield(F_MESSAGES); if (sf.items() > 0) save_all_lines(); } diff --git a/ba/baeur0a.cpp b/ba/baeur0a.cpp deleted file mode 100755 index 18ef9748e..000000000 --- a/ba/baeur0a.cpp +++ /dev/null @@ -1,535 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "baeur.h" -#include "baeura0.h" - -#include "../cg/cg2103.h" -#include "../cg/cglib01.h" - -#include "mov.h" -#include "partite.h" -#include "rmov.h" -#include "rmoviva.h" -#include "saldi.h" -#include "scadenze.h" - -class TPirogano_mask : public TAutomask -{ - TViswin* _log_win; - -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - -public: - void convert_movs(long fr, long to); - TViswin& log_win() { return *_log_win; } - - TPirogano_mask(); -}; - -bool TPirogano_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - switch (o.dlg()) - { - case DLG_PRINT: - if (e == fe_button) - { - _log_win->text().print(); - return FALSE; // Don't close - } - break; - default: - break; - } - - return TRUE; -} - -TPirogano_mask::TPirogano_mask() : TAutomask("baeura0") -{ - TBrowsefile_field& bf = (TBrowsefile_field&)field(F_LOG); - _log_win = &bf.vis_win(); -} - -class TPirogano_app : public TEuro_app -{ - TPirogano_mask* _msk; - -protected: - virtual void main_loop(); - -public: - void log_msg(TString& str); - void log_war(TString& str); - void log_err(TString& str); - - void scadenze_handler(TRectype& rec, const TRectype& part, real& totrate); - void convert_scad(const TRectype& part); - bool partite_handler(TRectype& rec); - void convert_part(long num_reg); - - void update_saldo(const TRectype& rmov, int segno); - void save_row(TEuroisamfile& rmov); - void convert_rmovs(long num_reg, long num_rege); - void convert_movs(long fr, long to); -}; - -void TPirogano_app::log_msg(TString& str) -{ - str.insert("- "); - _msk->log_win().add_line(str); -} - -void TPirogano_app::log_war(TString& str) -{ - str.insert("$[b,w]! "); - _msk->log_win().add_line(str); -} - -void TPirogano_app::log_err(TString& str) -{ - str.insert("$[r,w]* "); - _msk->log_win().add_line(str); -} - -void TPirogano_app::update_saldo(const TRectype& rmov, int segno) -{ - // File saldi in euro - TEuroisamfile saldi(LF_SALDI, TRUE); - TRectype& curr = saldi.curr(); - - TBill zio; zio.get(rmov); - curr.zero(); - curr.put(SLD_ANNOES, rmov.get(RMV_ANNOES)); - curr.put(SLD_GRUPPO, zio.gruppo()); - curr.put(SLD_CONTO, zio.conto()); - curr.put(SLD_SOTTOCONTO, zio.sottoconto()); - curr.put(SLD_FLSCA, ""); - - const bool found = saldi.read(_isequal, _lock) == NOERR; - if (!found) - { - curr.zero(); - curr.put(SLD_ANNOES, rmov.get(RMV_ANNOES)); - curr.put(SLD_GRUPPO, zio.gruppo()); - curr.put(SLD_CONTO, zio.conto()); - curr.put(SLD_SOTTOCONTO, zio.sottoconto()); - curr.put(SLD_FLSCA, ""); - } - - const TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO)); - const char* field = importo.sezione() == 'D' ? SLD_PDARE : SLD_PAVERE; - real saldo = curr.get(field); - if (segno < 0) - saldo -= importo.valore(); - else - saldo += importo.valore(); - curr.put(field, saldo); - - const int err = found ? saldi.rewrite() : saldi.write(); - if (err != NOERR) - { - TString str; - str << "Errore " << err << " durante l'aggiornamento dei saldi"; - log_err(str); - } -} - -void TPirogano_app::save_row(TEuroisamfile& rmov) -{ - const TRectype newrow = rmov.curr(); - TRectype oldrow(LF_RMOV); - const bool found = rmov.read() == NOERR; - if (found) - oldrow = rmov.curr(); - rmov.curr() = newrow; - const int err = found ? rmov.rewrite() : rmov.write(); - if (err != NOERR) - { - TString str; - str << "Errore " << err << " durante la scrittura della riga " << rmov.get(RMV_NUMRIG); - log_err(str); - } - else - { - if (found) - update_saldo(oldrow, -1); - update_saldo(newrow, +1); - } -} - -void TPirogano_app::convert_rmovs(long numreg, long numrege) -{ - // File righe movimento in euro - TEuroisamfile fileur(LF_RMOV, TRUE); - TRectype& receur = fileur.curr(); - - TRelation rel(LF_RMOV); - TRectype& curr = rel.curr(); - curr.put(MOV_NUMREG, numreg); - TCursor cur(&rel, "", 1, &curr, &curr); - const long items = cur.items(); - cur.freeze(); - - TImporto saldo; - int last_rowe = 0; - - for (cur = 0L; cur.pos() < items; ++cur) - { - receur = curr; - convert_import(receur, RMV_IMPORTO); - saldo += TImporto(receur.get_char(RMV_SEZIONE), receur.get_real(RMV_IMPORTO)); - - last_rowe = receur.get_int(RMV_NUMRIG); - receur.put(RMV_NUMREG, numrege); - save_row(fileur); - } - - if (!saldo.is_zero()) - { - receur.zero(); - receur.put(RMV_NUMREG, numrege); - receur.put(RMV_NUMRIG, ++last_rowe); - - TBill billy; load_round_bill(billy); - billy.put(receur, FALSE); - - saldo.swap_section(); - saldo.normalize(); - receur.put(RMV_SEZIONE, saldo.sezione()); - receur.put(RMV_IMPORTO, saldo.valore()); - - save_row(fileur); - } -} - -void TPirogano_app::scadenze_handler(TRectype& rec, const TRectype& parte, real& totrate) -{ - convert_import(rec, SCAD_IMPORTO); - - if (!rec.get_real(SCAD_IMPORTOVAL).is_zero()) - { - const TString& codval = parte.get(PART_CODVAL); - if (codval.empty()) - rec.zero(SCAD_IMPORTOVAL); - } - - const int nrata = rec.get_int(SCAD_NRATA); - if (nrata == 1) - totrate = ZERO; - totrate += rec.get_real(SCAD_IMPORTO); - - // I problemi di arrotondamento dovrei averli solo con tante rate - if (nrata > 1) - { - TLocalisamfile scad(LF_SCADENZE); - scad.curr() = rec; - scad.curr().put(SCAD_NRATA, nrata+1); - if (scad.read() != NOERR) // Sono l'ultima rata - { - const real toteur = parte.get(PART_IMPTOTDOC); - const real diff = toteur - totrate; - if (diff != ZERO) - { - real rata = rec.get(SCAD_IMPORTO); - rata += diff; - rec.put(SCAD_IMPORTO, rata); - } - } - } -} - -void TPirogano_app::convert_scad(const TRectype& part) -{ - // File destinazione in euro - TEuroisamfile fileur(LF_SCADENZE, TRUE); - TRectype& receur = fileur.curr(); - - TRelation rel(LF_SCADENZE); - TRectype& curr = rel.curr(); - curr.put(SCAD_TIPOCF, part.get(PART_TIPOCF)); - curr.put(SCAD_GRUPPO, part.get(PART_GRUPPO)); - curr.put(SCAD_CONTO, part.get(PART_CONTO)); - curr.put(SCAD_SOTTOCONTO, part.get(PART_SOTTOCONTO)); - curr.put(SCAD_ANNO, part.get(PART_ANNO)); - curr.put(SCAD_NUMPART, part.get(PART_NUMPART)); - curr.put(SCAD_NRIGA, part.get(PART_NRIGA)); - - TCursor cur(&rel, "", 1, &curr, &curr); // Seleziona solo le rate interessate - - const long items = cur.items(); - cur.freeze(); - real totrate; - for (cur = 0L; cur.pos() < items; ++cur) - { - receur = curr; - scadenze_handler(receur, part, totrate); - int err = fileur.write(); - if (err != NOERR) - err = fileur.rewrite(); - if (err != NOERR) - { - TString str; - str << "Errore " << err << " durante la scrittura della rata " << receur.get(SCAD_NRIGA); - log_err(str); - } - } -} - -bool TPirogano_app::partite_handler(TRectype& rec) -{ - if (rec.get_bool(PART_CHIUSA) || rec.get_int(PART_NRIGA) == 9999) - return FALSE; - - zero_import(rec, PART_NREG); // Creo solo partite extra-contabili - convert_import(rec, "IMPTOTDOC|IMPORTO|IMPOSTA|SPESE|RITENUTE|DIFFCAM"); - - const TString16 codval = rec.get(PART_CODVAL); - if (::is_firm_value(codval)) - { - convert_import(rec, PART_ABBUONI); - zero_import(rec, "CODVAL|IMPORTOVAL|DIFFCAM"); - } else - if (::is_euro_value(codval)) - { - zero_import(rec, "CODVAL|IMPORTOVAL|DIFFCAM"); - } else - if (::is_true_value(codval)) - { - const real impval = rec.get(PART_IMPORTOVAL); - if (impval != ZERO) - { - const real impeur = rec.get(PART_IMPORTO); - const real old_cambio = rec.get(PART_CAMBIO); - real new_cambio = impval / impeur; - new_cambio.round(5); - if (abs(old_cambio - new_cambio) > 0.001) // Non era già contro euro - rec.put(PART_CAMBIO, new_cambio); - } - } - - if (rec.get_int(PART_TIPOMOV) > 1) - { - // Riempe il campo totale documento per i pagamenti (In contabilità viene lasciato vuoto) - rec.put(PART_IMPTOTDOC, rec.get(PART_IMPORTO)); - } - - rec.put(PART_INVIATA, "X"); - - return TRUE; -} - -void TPirogano_app::convert_part(long num_reg) -{ - // File destinazione in euro - TEuroisamfile fileur(LF_PARTITE, TRUE); - TRectype& receur = fileur.curr(); - - TRelation rel(LF_PARTITE); - TRectype& curr = rel.curr(); - curr.put(PART_NREG, num_reg); - TCursor cur(&rel, "", 2, &curr, &curr); // Seleziona solo le partite interessate - - const long items = cur.items(); - cur.freeze(); - TString str; - - bool one_saved = FALSE; - if (items > 0) - { - str << "Conversione della partita extracontabile " << curr.get(PART_ANNO); - str << '/' << curr.get(PART_NUMPART); - log_msg(str); - for (cur = 0L; cur.pos() < items; ++cur) - { - receur = curr; - if (partite_handler(receur)) - { - int err = fileur.write(); - if (err != NOERR) - err = fileur.rewrite(); - if (err != NOERR) - { - str.cut(0) << "Errore " << err << " durante la scrittura della riga " << receur.get(PART_NRIGA); - log_err(str); - } - else - { - convert_scad(receur); - one_saved = TRUE; - } - } - } - } - if (!one_saved) - { - str = "Non sono state rilevate scadenze aperte"; - log_war(str); - } -} - -void TPirogano_app::convert_movs(long fr, long to) -{ - _msk->log_win().destroy_lines(); - - // File destinazione in euro - TEuroisamfile fileur(LF_MOV, TRUE); - TRectype& receur = fileur.curr(); - - long next_rege = 1; - if (fileur.last() == NOERR) - next_rege = receur.get_long(MOV_NUMREG)+1; - - TRelation rel(LF_MOV); - TRectype& curr = rel.curr(); - - TRectype fr_mov(curr); if (fr > 0) fr_mov.put(MOV_NUMREG, fr); - TRectype to_mov(curr); if (to > 0) to_mov.put(MOV_NUMREG, to); - TCursor cur(&rel, "", 1, &fr_mov, &to_mov); - - TString str; - str << "Conversione " << rel.lfile().description() << " ..."; - - const long items = cur.items(); - cur.freeze(); - TProgind pi(items, str, FALSE, TRUE); - for (cur = 0L; cur.pos() < items; ++cur) - { - pi.addstatus(1); - - const long num_reg = curr.get_long(MOV_NUMREG); - const TDate datareg = curr.get(MOV_DATAREG); - const int yearreg = datareg.year(); - const long clifo = curr.get_long(MOV_CODCF); - - const TString8 caus = curr.get(MOV_CODCAUS); - TipoIVA iva = nessuna_iva; - int tipomov = 0; - if (caus.not_empty()) - { - TCausale causale(caus, yearreg); - iva = causale.iva(); - tipomov = causale.tipomov(); - } - - bool converted = FALSE; - if (yearreg == 2002 && iva == nessuna_iva && tipomov == 0) - { - receur = curr; - convert_import(receur, MOV_TOTDOC); // Forse inutile - - int err = 0; - long num_rege = curr.get_long("TNUMREG"); - if (num_rege <= 0) - { - num_rege = next_rege++; - curr.put("TNUMREG", num_rege); - rel.rewrite(); - } - receur.put(MOV_NUMREG, num_rege); - - str.cut(0) << "Conversione del movimento " << num_reg << " -> " << num_rege; - log_msg(str); - - err = fileur.write(); - if (err != NOERR) - err = fileur.rewrite(); - - if (err != NOERR) - { - str.cut(0) << "Errore " << err << " durante la scrittura della testata"; - log_err(str); - } - convert_rmovs(num_reg, num_rege); - converted = TRUE; - } - if (yearreg == 2001 && iva != nessuna_iva && tipomov == 1) - { - str.cut(0) << "Elaborazione della partita del movimento " << num_reg; - log_msg(str); - convert_part(num_reg); - converted = TRUE; - } - - if (!converted) - { - str.cut(0) << "Ignorato movimento " << num_reg << " del " << datareg; - if (caus.not_empty()) str << " con causale " << caus; - log_war(str); - continue; - } - } - - _msk->log_win().goto_end(); -} - -void TPirogano_app::main_loop() -{ - open_files(LF_TABCOM, LF_TAB, LF_MOV, LF_RMOV, LF_CAUSALI, LF_SALDI, LF_PARTITE, LF_SCADENZE, 0); - - TFilename dati, datie; - get_aree_dati(dati, datie); - - _msk = new TPirogano_mask; - TMask& m = *_msk; - m.set(F_DATI, dati); - m.set(F_DATIE, datie); - - const long firm = get_firm(); - TString8 ditta; - ditta.format("%05ldA", firm); - TFilename inie = datie; - inie.add(ditta); - inie.add("prassid.ini"); - - KEY k = K_ENTER; - while (k == K_ENTER) - { - if (inie.exist()) - { - TConfig config(inie, "Euro"); - m.set(F_ADOZIONE, config.get("Adozione")); - m.set(F_LAST_DATE, config.get("InvDate")); - m.set(F_LAST_FROM, config.get("InvFirst")); - m.set(F_LAST_TO, config.get("InvLast")); - } - else - { - error_box("Non esiste la ditta %ld nell'area dati in Euro %s", firm, (const char*)datie); - m.disable(DLG_OK); - } - - k = m.run(); - if (k == K_ENTER) - { - const long fr_mov = m.get_long(F_MOV_FROM); - const long to_mov = m.get_long(F_MOV_TO); - - convert_movs(fr_mov, to_mov); - - TConfig config(inie, "Euro"); - config.set("InvDate", TDate(TODAY)); - config.set("InvFirst", fr_mov); - config.set("InvLast", to_mov); - } - } - - delete _msk; - _msk = NULL; -} - -/////////////////////////////////////////////////////////// -// main -/////////////////////////////////////////////////////////// - -int baeur0A(int argc, char* argv[]) -{ - TPirogano_app app; - app.run(argc, argv, "Trasferimento movimenti 2002"); - return 0; -} diff --git a/ba/baeura0.h b/ba/baeura0.h deleted file mode 100755 index 9ff964630..000000000 --- a/ba/baeura0.h +++ /dev/null @@ -1,16 +0,0 @@ -#define F_DITTA 101 -#define F_RAGSOC 102 -#define F_DATI 103 -#define F_DATIE 104 -#define F_ADOZIONE 105 - -#define F_LAST_DATE 111 -#define F_LAST_FROM 112 -#define F_LAST_TO 113 - -#define F_MOV_FROM 121 -#define F_DES_FROM 122 -#define F_MOV_TO 123 -#define F_DES_TO 124 - -#define F_LOG 130 diff --git a/ba/baeura0.uml b/ba/baeura0.uml deleted file mode 100755 index c2f49cab4..000000000 --- a/ba/baeura0.uml +++ /dev/null @@ -1,131 +0,0 @@ -#include "baeura0.h" - -TOOLBAR "" 0 -2 0 2 - -BUTTON DLG_OK 10 2 -BEGIN - PROMPT -13 -11 "" -END - -BUTTON DLG_PRINT 10 2 -BEGIN - PROMPT -23 -11 "" - PICTURE BMP_PRINT -END - -BUTTON DLG_QUIT 10 2 -BEGIN - PROMPT -33 -11 "" -END - -ENDPAGE - -PAGE "Trasferimento movimenti 2002" 0 0 80 18 - -GROUPBOX DLG_NULL 78 6 -BEGIN - PROMPT 1 1 "@bDitta da convertire" -END - -NUMBER F_DITTA 5 -BEGIN - PROMPT 2 2 "Ditta " - USE LF_NDITTE - INPUT CODDITTA F_DITTA - OUTPUT F_RAGSOC RAGSOC - CHECKTYPE NORMAL - FLAGS "DF" -END - -STRING F_RAGSOC 50 -BEGIN - PROMPT 21 2 "" - FLAGS "D" -END - -STRING F_DATI 50 -BEGIN - PROMPT 2 3 "Area dati in Lire " - FLAGS "D" -END - -STRING F_DATIE 50 -BEGIN - PROMPT 2 4 "Area dati in Euro " - FLAGS "D" -END - -DATE F_ADOZIONE -BEGIN - PROMPT 2 5 "Data adozione Euro " - FLAGS "D" -END - -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 7 "@bUltimo trasferimento " -END - -DATE F_LAST_DATE -BEGIN - PROMPT 2 8 "Data " - FLAGS "D" -END - -NUMBER F_LAST_FROM 5 -BEGIN - PROMPT 25 8 "Dal " - FLAGS "D" -END - -NUMBER F_LAST_TO 5 -BEGIN - PROMPT 50 8 "al " - FLAGS "D" -END - -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 10 "@bProssimo trasferimento" -END - -DATE DLG_NULL -BEGIN - PROMPT 2 11 "Data " - FLAGS "AD" -END - -NUMBER F_MOV_FROM 5 -BEGIN - PROMPT 25 11 "Dal " - USE LF_MOV - INPUT NUMREG F_MOV_FROM - DISPLAY "Num. Lire" NUMREG - DISPLAY "Num. Euro" TNUMREG - DISPLAY "Registrazione" DATAREG - DISPLAY "Causale" CODCAUS - DISPLAY "Descrizione@50" DESCR - OUTPUT F_MOV_FROM NUMREG - CHECKTYPE REQUIRED - WARNING "Inserire un movimento valido" - ADD RUN cg2 -0 -END - -NUMBER F_MOV_TO 5 -BEGIN - PROMPT 50 11 "al " - COPY USE F_MOV_FROM - INPUT NUMREG F_MOV_TO - COPY DISPLAY F_MOV_FROM - OUTPUT F_MOV_TO NUMREG - CHECKTYPE REQUIRED - WARNING "Inserire un movimento valido" - ADD RUN cg2 -0 -END - -BROWSEFILE F_LOG 75 -1 -BEGIN - PROMPT 1 12 "" -END - -ENDMASK diff --git a/ba/bainst.cpp b/ba/bainst.cpp index 0aade0687..1312b8af5 100755 --- a/ba/bainst.cpp +++ b/ba/bainst.cpp @@ -6,521 +6,6 @@ #include "bainsta.h" #include "bainst.h" -// ******************************** -// classe TSystemtempfile -// ******************************** - - -// classe provvisoria per i system file temporanei, ovvero file temporanei con -// caricamento/scaricamento -// @doc EXTERNAL - -// @mfunc Importa un file ascii -// -// @rdesc Ritorna NOERR se l'operazione di lettura e' riuscita, altrimenti il codice di -// di errore generato (vedi ). -int TSystemtempfile::load( - const char* from, // @parm Nome del file da importare - char fs, // @parm Carattere separatore di campo (default ) - char fd, // @parm Carattere delimitatore di campi (default '\\0') - char rs, // @parm Carattere separatore di record (default '\\n') - bool vis, // @parm Indica se visualizzare lo stato dell'operazione (default TRUE) - bool extended) // @parm Indica se interpretare alcune stringhe come macro (default FALSE) - -// @comm Se

e' TRUE e trova alcune stringhe col formato %stringa% (es. %frm%) -// ne sostituisce i valori (es. ditta corrente). - -// @xref - -{ - FILE* fl = fopen(from, "r"); - int err=NOERR; - if (fl == NULL) - { - error_box("Non riesco ad aprire il file %s",from); - return 2; - } - TRecnotype r = 0, e = 0, nitems = 0, nread = 0; - TString16 firm, year, attprev("00000"); - - if (extended) - { - TDate d(TODAY); - TLocalisamfile ditte(LF_NDITTE); - - firm.format("%05ld", prefix().get_codditta()); - year.format("%04d", d.year()); - ditte.zero(); - ditte.put("CODDITTA", firm); - if (ditte.read() == NOERR) - attprev = ditte.get("CODATTPREV"); - } - if (fl == NULL) - { - clearerr(fl); - setstatus(err); - return err; - } - char w[80]; - while ((fgets(w, 80, fl) != NULL)) - { - if (strncmp(w, "[Data]", 6) == 0) - { - nitems = ftell(fl); - break; - } - } - fseek(fl, 0L, SEEK_END); - nitems = ftell(fl) - nitems; - fclose(fl); - TScanner f(from); - - //open(); - - TToken_string s(1024, fs); - bool fixedlen = (fs == '\0'); - int nflds = curr().items(); - TArray fld(nflds); - int len[MaxFields]; - TString sfd(3); - TString s1(64); - //bool lcf = FALSE; - - if (f.paragraph("Header")) - { - f.equal(); - const long level = atol(f.line()); -//rimosso il controllo sul livello archivi;tanto la conversione la fa lo stesso -// if (level > get_std_level()) -// error_box("L'archivio %s e' stato generato con gli archivi di livello %ld%/%ld.\n Il livello attuale e' %ld/%ld.\n Convertire gli archivi e ripetere l' operazione.", -// from, level/100, level%100, get_std_level()/100, get_std_level()%100); - - nflds = 0; - TToken_string s2(f.line()); - int p = s2.find('='); - if (p > 0) - { - s1 = s2.left(p); - s2.ltrim(p+1); - } - else s1.cut(0); - while (s1 == "Fields") - { - for (const char * fd = s2.get(); fd != NULL; fd = s2.get()) - { - TToken_string wfd(fd, ','); - fld.add(new TString(wfd.get())); - len[nflds] = wfd.get_int(); - nflds++; - } - s2 = f.line(); - p = s2.find('='); - if (p > 0) - { - s1 = s2.left(p); - s2.ltrim(p+1); - } - else s1.cut(0); - } - } - else - { - for (int j = 0; j < nflds; j++) - { - fld.add(TString(curr().fieldname(j)), j); - const TString & wfld = (const TString & ) fld[j]; - len[j] = (curr().type(wfld) == _datefld) ? 10 : curr().length(wfld); - } - } - if (!f.paragraph("Data")) - { - error_box("Formato dei dati non valido"); - //close(); - err = 1; - setstatus(err); - return err; - } - - if (fd) sfd << fd; - int last = NOERR; - - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); - TProgind p(nitems, s1, TRUE, TRUE, 70); - s = f.line(); - while (s.not_empty() && !p.iscancelled()) - { - if (extended) - { - int p, i; - - while ((p = s.find("%yr%")) >= 0) - for (i = 0; i < 4; i++) s[p + i] = year[i]; - while ((p = s.find("%frm%")) >= 0) - for (i = 0; i < 5; i++) s[p + i] = firm[i]; - while ((p = s.find("%att%")) >= 0) - for (i = 0; i < 5; i++) s[p + i] = attprev[i]; - } - if ((r + e) % 50 == 0) - { - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); - p.set_text(s1); - } - p.setstatus(nread + 1); - nread += s.len() + 1; - zero(); - if (fixedlen) - { - int pos = 0; - for (int j = 0; j < nflds; j++) - { - s1 = s.mid(pos,len[j]); - s1.rtrim(); - put((const TString&) fld[j], s1); - pos += len[j]; - } - } - else - { - s.restart(); - for (int j = 0; j < nflds; j++) - { - char* s2 = (char*) s.get(); - if (fd) - { - s2++; - s2[strlen(s2) - 1] = '\0'; - } - put((const TString&) fld[j], s2); - } - } - if (write() == NOERR) r++; - else - { -#ifdef DBG - yesnofatal_box("Numero linea relativa all'errore: %ld",r+e+1); -#endif - e++; - last = status(); - } - s = f.line(); - } - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); - p.set_text(s1); - //close(); - setstatus(err); - return err; -} - -// @doc EXTERNAL - -// @mfunc Esporta VERSO un file ascii. -// -// @rdesc Ritorna NOERR se l'operazione di esportazione e' riuscita, altrimenti il codice di -// di errore generato (vedi ). -int TSystemtempfile::dump( - const char* to, // @parm Nome del file verso quale esportare - int nkey, // @parm Numero della chiave di ordinamento con cui scaricare i dati (defualt 1) - char fs, // @parm Carattere seperatore di campo (defualt ) - char fd, // @parm Carattere delimitatore di campo (default '\\0') - char rs, // @parm Carattere separatore di record (default '\\n') - bool vis, // @parm Indica se visualizzare lo stato dell'operazione (defualt TRUE) - bool withdeleted) // @parm Indica se scaricare anche i record cancellati (dafault FALSE) - -// @xref - -{ - FILE* f = fopen(to, "w"); - - if (f == NULL) - { - setstatus(2); - return 2; - } - - if (withdeleted) nkey = 0; - int err = ferror(f); - - //open(FALSE, nkey ? TRUE : FALSE); - TString s(512); - bool fixedlen = (fs == '\0'); - int nflds = curr().items(); - TArray fld(nflds); - TBit_array rjust(nflds); - int len[MaxFields]; - - for (int j = 0; j < nflds; j++) - { - fld.add(TString(curr().fieldname(j)), j); - const TString & wfld = (const TString&) fld[j]; - const TFieldtypes t = curr().type(wfld); - rjust.set(j, t == _intfld || t == _longfld || t == _realfld || - t == _wordfld || t == _intzerofld || t == _longzerofld); - len[j] = (t == _datefld) ? 10 : curr().length(wfld); - } - TRecnotype i = 0; - const TRecnotype nitems = items(); - s.format("Esportazione archivio %s", filename()); - TProgind p(nitems, s, TRUE, TRUE, 70); - TString s1; - - fprintf(f, "[Header]\nVersion=%ld", prefix().filelevel()); - for (int k = 0; k < nflds; k++) - { - if ((k % 10) == 0) fprintf(f, "\nFields="); - else fprintf(f, "|"); - fprintf(f, "%s,%d", (const char *) (const TString&) fld[k], len[k]); - } - fprintf(f, "\n\n[Data]\n"); - if (nkey) - { - setkey(nkey); - for ( first(); status() == NOERR && !p.iscancelled(); next(), i++) - { - p.setstatus(i + 1); - s = ""; - for (j = 0; j < nflds; j++) - { - if (fixedlen) - { - s1 = get((const TString&)fld[j]); - if (rjust[j]) s1.right_just(len[j]); - else s1.left_just(len[j]); - } - else - { - s1 = ""; - if (j && fs) s1 << fs; - if (fd) s1 << fd; - s1 << get((const TString&)fld[j]); - if (fd) s1 << fd; - } - s << s1; - } - fprintf(f, "%s%c", (const char*) s, rs); - } - } - else - { - for (i = 0; i < nitems && !p.iscancelled(); i++) - { - zero(); - p.setstatus(i + 1); - readat(i + 1); - s=""; - if (withdeleted || curr().valid()) - { - for (j = 0; j < nflds; j++) - { - if (fixedlen) - { - s1 = get((const TString&)fld[j]); - if (rjust[j]) s1.right_just(len[j]); - else s1.left_just(len[j]); - } - else - { - s1 = ""; - if (j && fs) s1 << fs; - if (fd) s1 << fd; - s1 << get((const TString&)fld[j]); - if (fd) s1 << fd; - } - s << s1; - } - fprintf(f, "%s%c", (const char*) s, rs); - } - } - } - p.setstatus(nitems); - //close(); - fclose(f); - setstatus(err); - return err; -} - -// ******************************** -// classe TStd_filename -// ******************************** - -bool TStd_filename::check(bool verbose,const char * n) -{ - if (n && *n) - set(n); - insert("STD\\"); - if (!exist()) - { - *this = name(); - if (!exist()) - { - insert("STD\\"); - insert(prefix().get_studio()); - if (!exist()) - { - if (verbose) - error_box("Non riesco a trovare il file: %s", (const char *)name()); - cut(0); - return FALSE; - } - } - } - return TRUE; -} - - -bool TInstallmodule_app::create() -{ - TScanner scanner("campo.aut"); - - bool ok = FALSE; - for (int aut = 0; aut<=module_number(); aut++) - { - scanner.line(); - } - _modcode=scanner.token().left(2); - _modname=scanner.token().mid(3); - - if (modal()) - { - TString16 maskname; - maskname.format("bainst%02d",module_number()); - _m = new TMask(maskname); - } - else - _m = NULL; - - TConfig ini("install.ini"); - TConfig praw(CONFIG_INSTALL); - _test_database = praw.get("TestDatabase","Main",-1,"Y") != "N"; - - return TSkeleton_application::create(); -} - -bool TInstallmodule_app::destroy() -{ - if (_m) delete _m; - return TSkeleton_application::destroy(); -} - -bool TInstallmodule_app::preload_mask() -{ - if (!test_database()) - { - _m->set(F_DEFAULTSDATA," "); - _m->disable(F_DEFAULTSDATA); - } - else - { - if (load_default_data()) - _m->set(F_DEFAULTSDATA,"X"); - } - return TRUE; -} - -bool TInstallmodule_app::some_to_load() -{ - return _m->get_bool(F_DEFAULTSDATA); -} - -void TInstallmodule_app::main_loop() -{ - bool ok =TRUE; - - if (modal()) - { - preload_mask(); - if (_m->run()!=K_QUIT) - { - if (some_to_load()) - { - install_firm(); - install_com(); - } - } - else - ok =FALSE; - } - if (ok) - post_installer(); -} - -bool TInstallmodule_app::install_firm() -{ - // ciclo su ogni ditta - TStd_filename txtfile(module_code()); - txtfile << "tab.txt"; - if (txtfile.check()) - { - TLocalisamfile ditte(LF_NDITTE); - for (ditte.first(); !ditte.eof() ; ditte.next()) - { - const int newditta=ditte.get_int("CODDITTA"); - if (prefix().exist(newditta)) - { - set_firm(newditta); - TSystemisamfile tab(LF_TAB); - tab.load(txtfile); - } - } - // carica le tabelle nei file di default - TLocalisamfile tampone(LF_TAB); - TSystemtempfile tabstd(LF_TAB); - TFilename stdtabname(prefix().get_studio()); - stdtabname << "STD\\lf0005.txt"; - tabstd.load(txtfile); - tabstd.load(stdtabname); - tabstd.set_autodel(); - TFilename tempfile; - tempfile.temp(); - - // riconverte le macro delle date - tabstd.dump(tempfile); - TScanner scan(tempfile); - FILE *dest=fopen((const char *)stdtabname,"w"); - while (TRUE) { - TString &line=scan.line(); - if (line.empty()) break; - - int pos=(line.find("-0000")); - while (pos >= 0 ) - { - line.overwrite("%yr%",pos+1); - pos=(line.find("-0000")); - } - line << '\n' ; - fputs((const char * )line,dest); - } - fclose(dest); - } - return TRUE; -} - -bool TInstallmodule_app::install_com() -{ - bool ok=TRUE; - TStd_filename txtfile(module_code()); - txtfile << "tabcom.txt"; - if (txtfile.check()) - { - TSystemisamfile tabcom(LF_TABCOM); - tabcom.load(txtfile); - } - return ok; -} - -void TInstallmodule_app::run(int argc, char* argv[]) -{ - TString title("Installazione "); - title << module_name(); - TSkeleton_application::run(argc, argv,(const char* )title); -} - - -void TInstallmodule_app::set_tab_app(const char * appname) -{ - TConfig ditta(CONFIG_DITTA); - ditta.set_paragraph(module_code()); - ditta.set("TabApp",appname); -} int main(int argc,char** argv) { @@ -557,4 +42,3 @@ int main(int argc,char** argv) return 0; } - diff --git a/ba/bainst.h b/ba/bainst.h index 768cd1104..def8c3484 100755 --- a/ba/bainst.h +++ b/ba/bainst.h @@ -1,8 +1,5 @@ -#include -#include -#include +#define G_PREINST 1 -#define G_PREINST 1 int bainst00(int argc, char** argv); int bainst07(int argc, char** argv); int bainst11(int argc, char** argv); @@ -15,60 +12,4 @@ int bainst34(int argc, char** argv); int bainst38(int argc, char** argv); int bainst39(int argc, char** argv); -// classe provvisoria per i system file temporanei, ovvero file temporanei con -// caricamento/scaricamento -class TSystemtempfile : public TIsamtempfile -{ -public: -//bool getlcf( long flev); // @parm livello archivi di partenza della convesione - - int load(const char* from, char fs = '|', char fd = '\0', char rs = '\n', bool vis = TRUE, bool extended = FALSE) ; - int dump(const char* to, int nkey = 1, char fs = '|', char fd = '\0', char rs = '\n', bool vis = TRUE, bool withdeleted = FALSE); - - TSystemtempfile(int logicnum) : - TIsamtempfile(logicnum,NULL) {} -}; - - - - -class TStd_filename : public TFilename -{ -public: - bool check(bool verbose=FALSE,const char * name=NULL); - ~TStd_filename () {} - TStd_filename () : TFilename(){} - TStd_filename (const char * n) : TFilename(n){} -}; - -class TInstallmodule_app: public TSkeleton_application -{ - bool _is_first_inst , _test_database ; - -protected: - TMask * _m ; - TString _modcode,_modname; - -protected: - void set_tab_app(const char * appname); - bool test_database() {return _test_database;} - const char * module_name() const {return _modname;} - const char * module_code() const {return _modcode;} - - virtual bool load_default_data() const { return TRUE;} - virtual bool modal() const {return TRUE;} - virtual int module_number() const pure; - virtual bool preload_mask(); - virtual bool post_installer() {return TRUE;} - virtual bool some_to_load(); - - virtual bool install_com() ; // setta i dati comuni - virtual bool install_firm() ; // setta i dati ditta - - virtual void main_loop() ; - virtual bool create(); - virtual bool destroy(); -public: - void run(int argc, char* argv[]); -}; \ No newline at end of file diff --git a/ba/bainst00.cpp b/ba/bainst00.cpp index 0f3cf5528..3c2ef1bdf 100755 --- a/ba/bainst00.cpp +++ b/ba/bainst00.cpp @@ -1,9 +1,6 @@ -#include -#include -#include -#include -#include #include +#include +#include #include #include "bainst.h" #include "bainst00.h" diff --git a/ba/bainst05.cpp b/ba/bainst05.cpp deleted file mode 100755 index efb6a9f62..000000000 --- a/ba/bainst05.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "bainst.h" -#include "bainst05.h" - -class TInstall_VE : public TSkeleton_application -{ - TMask * _m; -protected: - virtual void main_loop() ; - virtual bool install_firm() ; // setta i dati ditta - virtual bool install_com() ; // setta i dati comuni - -public: - virtual ~TInstall_VE () {} -}; - -// setta i dati ditta -bool TInstall_VE ::install_firm() -{ - // ciclo su ogni ditta - return TRUE; -} - -bool TInstall_VE ::install_com() -{ - bool ok=TRUE; - if (_m->get_bool(F_LOADTAB)) - { - TStd_filename txtfile("vetabcom.txt"); - TSystemisamfile tabcom(LF_TABCOM); - if (!txtfile.blank()) - tabcom.load(txtfile); - } - return ok; -} - -void TInstall_VE::main_loop() -{ - TConfig ini("install.ini","ve"); - const bool primainst=ini.get("Versione").blank(); - - _m = new TMask ("bainst05.msk"); - if (primainst) - _m->set(F_LOADTAB,"X"); - if (_m->run()!=K_QUIT) - { - install_firm(); - install_com(); - } -} - -int bainst05(int argc, char** argv) -{ - TInstall_VE app; - app.run(argc, argv, "Installazione Vendite"); - return 0; -} \ No newline at end of file diff --git a/ba/bainst05.h b/ba/bainst05.h deleted file mode 100755 index 138972796..000000000 --- a/ba/bainst05.h +++ /dev/null @@ -1,2 +0,0 @@ -#include "bainsta.h" -#define F_LOADTAB 101 diff --git a/ba/bainst06.cpp b/ba/bainst06.cpp deleted file mode 100755 index f32f6d15b..000000000 --- a/ba/bainst06.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include -#include -#include -#include "bainst06.h" - -class TInstall_MG : public TSkeleton_application -{ - TMask * _m; -protected: - virtual void main_loop() ; - virtual bool install_firm() ; // setta i dati ditta - virtual bool install_com() ; // setta i dati comuni - -public: - virtual ~TInstall_MG () {} -}; - -// setta i dati ditta -bool TInstall_MG ::install_firm() -{ - // ciclo su ogni ditta - return TRUE; -} - -bool TInstall_MG ::install_com() -{ - bool ok=TRUE; - if (_m->get_bool(F_LOADTAB)) - { - TExternal_app rice("bacnv 1 4 mgtab.txt"); - ok &= (rice.run()==0); - } - return ok; -} - -void TInstall_MG::main_loop() -{ - TConfig ini("install.ini","mg"); - const bool primainst=ini.get("Versione").blank(); - - _m = new TMask ("bainst06.msk"); - if (primainst) - _m->set(F_LOADTAB,"X"); - if (_m->run()!=K_QUIT) - { - install_firm(); - install_com(); - } -} - -int bainst06(int argc, char** argv) -{ - TInstall_MG app; - app.run(argc, argv, "Installazione Magazzino"); - return 0; -} \ No newline at end of file diff --git a/ba/bainst06.h b/ba/bainst06.h deleted file mode 100755 index f11fb479c..000000000 --- a/ba/bainst06.h +++ /dev/null @@ -1,2 +0,0 @@ -///#include "bainst.h" -#define F_LOADTAB 101 diff --git a/ba/bainst07.cpp b/ba/bainst07.cpp index e768018fd..93d01dc22 100755 --- a/ba/bainst07.cpp +++ b/ba/bainst07.cpp @@ -1,9 +1,7 @@ -#include -#include -#include -#include -#include #include +#include +#include +#include #include "bainst.h" #include "bainst07.h" @@ -16,7 +14,7 @@ private: protected: virtual bool modal() const {return FALSE;} - virtual int module_number() const {return 7;} + virtual int module_number() const {return CGAUT;} virtual bool install_firm() {return TRUE;} // no firm installation virtual bool post_installer(); @@ -28,6 +26,7 @@ public: // crea il .ini per i files exe copiati nella directory di EASYCAMPO bool TInstall_CG ::CreaExeIni(const char * exename) { +/* VECCHIO COME IL CUCCO!!!! TFilename ininame(128); GetWindowsDirectory(ininame.get_buffer(), 128); @@ -49,6 +48,7 @@ bool TInstall_CG ::CreaExeIni(const char * exename) ini.set("Deleted","On","dBase ISAM"); ini.set("ParadoxNetStyle","3.x","Paradox ISAM" ); +*/ return TRUE; } @@ -67,5 +67,5 @@ int bainst07(int argc, char** argv) { TInstall_CG app; app.run(argc, argv); - return all_ok; + return 0; } diff --git a/ba/bainst11.cpp b/ba/bainst11.cpp index 8b2599c8d..6b7d15881 100755 --- a/ba/bainst11.cpp +++ b/ba/bainst11.cpp @@ -1,10 +1,5 @@ -#include -#include #include -#include -#include -#include - +#include #include "bainst.h" #include "bainst11.h" @@ -12,7 +7,7 @@ class TInstall_CE : public TSkeleton_application { protected: virtual void main_loop() ; - virtual bool install_com(bool in_lire) ; // setta i dati comuni + bool install_com(bool in_lire) ; // setta i dati comuni public: virtual ~TInstall_CE () {} diff --git a/ba/bainst17.cpp b/ba/bainst17.cpp index 294a3d82e..bf6afc1fa 100755 --- a/ba/bainst17.cpp +++ b/ba/bainst17.cpp @@ -1,7 +1,8 @@ -#include +#include #include -#include +#include #include + #include #include "bainst.h" #include "bainst17.h" @@ -10,7 +11,7 @@ class TInstall_AT : public TInstallmodule_app { protected: virtual bool load_default_data() const ; - virtual int module_number() const {return 17;} + virtual int module_number() const {return ATAUT;} virtual bool preload_mask() ; bool post_installer() ; @@ -19,6 +20,7 @@ public: virtual ~TInstall_AT () {} }; +//controlla la tabella idoneita': se risulta vuota -> deve caricare i dati di default bool TInstall_AT ::load_default_data() const { if (prefix().get_codditta() <= 0) @@ -38,7 +40,13 @@ bool TInstall_AT ::post_installer() #endif bool ok=TRUE; if (_m->get_bool(F_USAMENUAVIS)) - ok=fcopy("agaat.men",menuname); + { + ok=fcopy("agaat.men","baprassi.men"); + TConfig config (CONFIG_STUDIO, "at"); + config.set("EdMask", "at0500a.msk"); + config.set("EdApp", "at0 -4"); + } + return ok; } diff --git a/ba/bainst18.cpp b/ba/bainst18.cpp index 16828d6ca..26b695a8a 100755 --- a/ba/bainst18.cpp +++ b/ba/bainst18.cpp @@ -1,19 +1,15 @@ -#include -#include #include -#include -#include +#include +#include #include - #include "bainst.h" #include "bainst18.h" class TInstall_IN : public TInstallmodule_app { - TMask * _m; protected: virtual bool load_default_data() const ; - virtual int module_number() const {return 18;} + virtual int module_number() const {return INAUT;} virtual bool post_installer() { return TRUE; } public: diff --git a/ba/bainst18.uml b/ba/bainst18.uml index da3d7a81d..eee488931 100755 --- a/ba/bainst18.uml +++ b/ba/bainst18.uml @@ -1,6 +1,6 @@ #include "bainst18.h" -PAGE "Installazione MG" -1 -1 78 8 +PAGE "Installazione IN" -1 -1 78 8 // GROUP 1 = PRE-INSTALLATION // GROUP 2 = POST-INSTALLATION diff --git a/ba/bainst31.cpp b/ba/bainst31.cpp index a3650779f..2e24d2b0e 100755 --- a/ba/bainst31.cpp +++ b/ba/bainst31.cpp @@ -1,18 +1,17 @@ -#include + #include -#include +#include +#include #include -#include #include "bainst.h" #include "bainst31.h" class TInstall_VE : public TInstallmodule_app { - TMask * _m; -protected: + protected: virtual bool load_default_data() const ; - virtual int module_number() const {return 31;} + virtual int module_number() const {return VEAUT;} virtual bool install_firm() {return TRUE;} // no firm installation public: diff --git a/ba/bainst31.uml b/ba/bainst31.uml index 834038a52..8a40a7402 100755 --- a/ba/bainst31.uml +++ b/ba/bainst31.uml @@ -9,14 +9,6 @@ BEGIN PROMPT 2 2 "Carica le tabelle con i tipi documento" END -/*GROUPBOX DLG_NULL 60 4 -BEGIN - FLAG "H" - PROMPT 2 4 " Installazione dati ditta" - GROUP G_POSTINST -END -*/ - BUTTON DLG_OK 10 2 BEGIN PROMPT -11 -1 "~Conferma" diff --git a/ba/bainst32.cpp b/ba/bainst32.cpp index 8240ed41c..8deb3f536 100755 --- a/ba/bainst32.cpp +++ b/ba/bainst32.cpp @@ -1,19 +1,18 @@ -#include + #include -#include -#include +#include +#include + #include -#include #include "bainst.h" #include "bainst32.h" class TInstall_MG : public TInstallmodule_app { - TMask * _m; protected: virtual bool load_default_data() const ; - virtual int module_number() const {return 32;} + virtual int module_number() const {return MGAUT;} virtual bool post_installer(); public: @@ -22,8 +21,8 @@ public: bool TInstall_MG::post_installer() { - set_tab_app("mg0 -0"); - return TRUE; + set_tab_app("mg0 -0"); + return TRUE; } bool TInstall_MG::load_default_data() const { diff --git a/ba/bainst34.cpp b/ba/bainst34.cpp index 523be8a2c..bc1e0ce82 100755 --- a/ba/bainst34.cpp +++ b/ba/bainst34.cpp @@ -1,10 +1,6 @@ -#include -#include #include -#include -#include -#include - +#include +#include #include "bainst.h" #include "bainst34.h" @@ -12,7 +8,7 @@ class TInstall_EF : public TInstallmodule_app { protected: // virtual bool load_type() const ; - virtual int module_number() const {return 34;} + virtual int module_number() const {return EFAUT;} virtual bool post_installer(); virtual bool modal() const {return FALSE;} diff --git a/ba/bainst35.cpp b/ba/bainst35.cpp index c8a7e4386..a3de191d3 100755 --- a/ba/bainst35.cpp +++ b/ba/bainst35.cpp @@ -1,12 +1,13 @@ #include - +#include +#include #include "bainst.h" class TInstall_DB : public TInstallmodule_app { protected: virtual bool modal() const {return FALSE;} - virtual int module_number() const {return 35;} + virtual int module_number() const {return DBAUT;} virtual bool post_installer(); public: diff --git a/ba/bainst38.cpp b/ba/bainst38.cpp index e0293aec5..3939de9cd 100755 --- a/ba/bainst38.cpp +++ b/ba/bainst38.cpp @@ -1,16 +1,13 @@ -#include -#include -#include #include -#include -#include +#include +#include #include "bainst.h" #include "bainst38.h" class TInstall_SV : public TInstallmodule_app { protected: - virtual int module_number() const {return 38;} + virtual int module_number() const {return SVAUT;} virtual bool install_firm() {return TRUE;} virtual bool install_com(); diff --git a/ba/bainst39.cpp b/ba/bainst39.cpp index cf04d8d7a..43517dbcc 100755 --- a/ba/bainst39.cpp +++ b/ba/bainst39.cpp @@ -1,12 +1,13 @@ #include - +#include +#include #include "bainst.h" class TInstall_MR : public TInstallmodule_app { protected: virtual bool modal() const {return FALSE;} - virtual int module_number() const {return 39;} + virtual int module_number() const {return MRAUT;} virtual bool post_installer(); public: diff --git a/ce/ce0.cpp b/ce/ce0.cpp index ad37f3a96..ed62d79ec 100755 --- a/ce/ce0.cpp +++ b/ce/ce0.cpp @@ -7,10 +7,10 @@ int main(int argc,char** argv) const int r = (argc > 1) ? (argv[1][1]-'0') : 0; switch (r) { - case 3: ce0400(argc,argv); break; - case 4: ce0500(argc,argv); break; - case 8: ce0900(argc,argv); break; - default: ce0100(argc,argv); break; + case 3: ce0400(argc,argv); break; // Parametri ditta + case 4: ce0500(argc,argv); break; // Anagrafica cespiti + case 8: ce0900(argc,argv); break; // Conversione cespiti + default: ce0100(argc,argv); break; // Tabelle cespiti } return 0; } diff --git a/ce/ce0900.cpp b/ce/ce0900.cpp index 932bdfc9a..868eb4022 100755 --- a/ce/ce0900.cpp +++ b/ce/ce0900.cpp @@ -82,6 +82,7 @@ bool TConversione_ce_mask::already_converted(long ditta) TFilename ditce = prefix().get_studio(); ditce.add("cesp/ditce"); TExternisamfile oldfile(ditce,(bool) FALSE,(bool) FALSE); + for (err = oldfile.first(); err == NOERR; err = oldfile.next()) { long d = oldfile.get_long("CACDD"); @@ -290,6 +291,7 @@ int TConversione_cespiti::conv_file(const TFilename& ofname, int nflogicnum) d.put(nflogicnum); TExternisamfile oldfile(ofname,(bool) FALSE,(bool) FALSE); + TLocalisamfile* newfile = NULL; const TRectype& oldrec = oldfile.curr(); TString s; @@ -422,6 +424,7 @@ int TConversione_cespiti::conv_tab(const TFilename& ofname, const char* tab) long oldditta = -1, ditta = -1; TExternisamfile oldfile(ofname,(bool)FALSE,(bool)FALSE); + TTable* newfile = NULL; TConfig config("ce0900.ini", tab); TAssoc_array& fieldlist = config.list_variables(); @@ -673,6 +676,7 @@ int TConversione_cespiti::conv_inifile(const TFilename& ofname, const char* ofpa if (err == NOERR) { TExternisamfile oldfile(ofname,(bool)FALSE,(bool)FALSE); + TLocalisamfile* newfile = new TLocalisamfile(nflogicnum); TConfig config("ce0900.ini", (const char*) ofpar); TAssoc_array& fieldlist = config.list_variables(); @@ -748,6 +752,7 @@ int TConversione_cespiti::conv_par(const TFilename& ofname, const char* ofpar, i long oldditta = -1; long ditta; TExternisamfile oldfile(ofname,(bool)FALSE,(bool)FALSE); + TConfig newconfig(which_config, "ce"); TConfig config("ce0900.ini", (const char*) ofpar); TAssoc_array& fieldlist = config.list_variables(); @@ -886,4 +891,4 @@ int ce0900(int argc, char* argv[]) TConversione_cespiti a ; a.run(argc, argv, "Conversione cespiti"); return 0; -} +} \ No newline at end of file diff --git a/ce/ce1500.cpp b/ce/ce1500.cpp index 4f16b9e24..7503b80a9 100755 --- a/ce/ce1500.cpp +++ b/ce/ce1500.cpp @@ -545,7 +545,7 @@ void TMov_emask::calc_plus_minus(int tipo, real& plus, real& minus) const TRectype& movsem = rel.curr(); TRectype& ammmv = rel.curr(LF_AMMMV); - const TString idcespite = get(F_IDCESPITE); + const TString& idcespite = get(F_IDCESPITE); movsem.put(MOVCE_IDCESPITE, idcespite); TString filtro; filtro << "(ANSI(DTMOV)>=\"" << inies.string(ANSI) << "\")"; diff --git a/ce/ce2.cpp b/ce/ce2.cpp index bc81d96e3..4ab5c1288 100755 --- a/ce/ce2.cpp +++ b/ce/ce2.cpp @@ -9,7 +9,8 @@ int main(int argc,char** argv) switch(n) { case 1: ce2200(argc, argv); break; // Apertura nuovo esercizio - case 2: ce2300(argc, argv); break; // Generazione movimenti contabili + case 2: ce2300(argc, argv); break; // Collegamenti contabili + case 3: ce2400(argc, argv); break; // Generazione movimenti contabili default: ce2100(argc, argv); break; // Calcolo ammortamenti } exit(0); diff --git a/ce/ce2.h b/ce/ce2.h index af18c4714..380e297e4 100755 --- a/ce/ce2.h +++ b/ce/ce2.h @@ -1,3 +1,4 @@ int ce2100(int argc, char* argv[]); int ce2200(int argc, char* argv[]); int ce2300(int argc, char* argv[]); +int ce2400(int argc, char* argv[]); diff --git a/ce/ce2100a.uml b/ce/ce2100a.uml index 67b717b58..21c797985 100755 --- a/ce/ce2100a.uml +++ b/ce/ce2100a.uml @@ -68,14 +68,14 @@ END NUMBER F_GRUPPO 2 BEGIN - PROMPT 1 4 "Gruppo " + PROMPT 1 4 "Gruppo " FLAGS "Z" FIELD CODTAB[5,6] END STRING F_SPECIE 4 BEGIN - PROMPT 16 4 "Specie " + PROMPT 12 4 "Specie " FLAGS "_" USE CCB JOIN %CAT ALIAS 400 INTO CODTAB=CODTAB[5,10] @@ -97,9 +97,9 @@ BEGIN FIELD CODTAB[7,10] END -STRING F_DESC_GRSP 60 45 +STRING F_DESC_GRSP 60 50 BEGIN - PROMPT 31 4 "" + PROMPT 26 4 "" FLAGS "D" END diff --git a/ce/ce2101.cpp b/ce/ce2101.cpp index 8a419e024..3425dbb25 100755 --- a/ce/ce2101.cpp +++ b/ce/ce2101.cpp @@ -1620,7 +1620,7 @@ void TCespite::calc_amm_residui(bool is_valid) { _ammpro.put(AMMCE_PNOR, "100"); _ammpro.zero(AMMCE_PANT); _ammpro.zero(AMMCE_PACC); - _ammpro.put(AMMCE_MSG04, "X"); + _ammpro.put(AMMCE_MSG04, "X"); // Ammortamento totale } else { @@ -1802,7 +1802,11 @@ void TCespite::agg_spe_man(bool is_valid) } real speman = ccb.get(field); - speman += vspmanu; + if (tpspeman == 3) + speman += vspmanu * 0.25; // 25% + else + speman += vspmanu * 0.05; // 5% + ccb.put(field, speman); ccb.put("D0", TDate(TODAY)); @@ -1820,7 +1824,7 @@ bool TCespite::calc_amm(int tipo_sit, const TDate& data_limite, bool recalc_spe_ log("* Inizio calcolo situazione %d cespite %s", tipo_sit, (const char*)idcespite); #ifdef DBG - if (tipo_sit == 1 && atol(idcespite) == 146L) + if (tipo_sit == 1 && atol(idcespite) == 445L) { tipo_sit = 1; // Put your breakpoint here } diff --git a/ce/ce2300.cpp b/ce/ce2300.cpp index 8330d9de4..fef875f82 100755 --- a/ce/ce2300.cpp +++ b/ce/ce2300.cpp @@ -1,35 +1,364 @@ -#include #include +#include +#include +#include +#include -class TCesp2cg_mask : public TAutomask +#include "cespi.h" + +#include "celib.h" +#include "collces.h" + +#include "ce2300a.h" + +///////////////////////////////////////////////// +// Ricerca per categoria su collces +///////////////////////////////////////////////// + +class TCollces_sheet : public TBrowse_sheet { +protected: + virtual void get_row(long n, TToken_string& row); + +public: + TCollces_sheet(TCursor* cursor, TEdit_field* ef, TToken_string& sibling); +}; + +void TCollces_sheet::get_row(long n, TToken_string& row) +{ + TBrowse_sheet::get_row(n, row); + const int gru = row.get_int(0); + TString8 spe = row.get(); + switch(spe.len()) + { + case 1: spe.right_just(2); break; + case 3: spe.insert(" "); break; + default: break; + } + const int cat = row.get_int(); + const TString& desc = ditta_cespiti().categoria(gru, spe, cat).get("S0"); + row.add(desc, 3); +} + +TCollces_sheet::TCollces_sheet(TCursor* cursor, TEdit_field* ef, TToken_string& sibling) + : TBrowse_sheet(cursor, "CODGRUPPO|CODSPECIE|CODCAT|CODCAT", "Categorie", + "Gruppo|Specie|Categoria|Descrizione@70", 0, ef, sibling) +{ +} + +///////////////////////////////////////////////// +// Maschera query +///////////////////////////////////////////////// + +class TCesp2cg_qmask : public TAutomask +{ + TCursor* _curcoll; + protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: - TCesp2cg_mask() : TAutomask("ce2300a") { } + TCesp2cg_qmask(TRelation* rel); + virtual ~TCesp2cg_qmask(); }; -bool TCesp2cg_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +bool TCesp2cg_qmask::on_field_event(TOperable_field& o, TField_event e, long jolly) { + switch (o.dlg()) + { + case F_CODCAT: + if (e == fe_button) + { + TEdit_field& ef = (TEdit_field&)o; + TToken_string sibling; + TCollces_sheet sht(_curcoll, &ef, sibling); + if (!o.empty()) + { + TRectype& rec = _curcoll->curr(); + rec.zero(); + rec.put(COLLCES_CODGRUPPO, get(F_GRUPPO)); + rec.put(COLLCES_CODSPECIE, get(F_SPECIE)); + rec.put(COLLCES_CODCAT, o.get()); + long sel = _curcoll->read(); + sht.select(sel); + } + if (sht.run() == K_ENTER) + { + TToken_string row = sht.row(); + o.set(row.get(2)); + set(F_DESCAT, row.get(3)); + send_key(K_ENTER, 0); + } + } + break; + case F_CODCAT2: + return ditta_cespiti().on_category_event(o, e, jolly); + case F_IDCESPITE: + if (e == fe_close) + { + const TRectype& cesp = cache().get(LF_CESPI, o.get()); + if (cesp.empty()) + return error_box("Inserire un cespite valido"); + } + break; + default: + break; + } + return TRUE; } -class TCesp2cg : public TSkeleton_application +TCesp2cg_qmask::TCesp2cg_qmask(TRelation* rel) : TAutomask("ce2300a") +{ + _curcoll = new TCursor(rel, "IDCESPITE=\"\""); +} + +TCesp2cg_qmask::~TCesp2cg_qmask() { + delete _curcoll; +} + +///////////////////////////////////////////////// +// Maschera principale +///////////////////////////////////////////////// + +class TCesp2cg_emask : public TAutomask +{ protected: - virtual void main_loop(); + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + void test_duplication(short g1, short g2); + +public: + TCesp2cg_emask() : TAutomask("ce2300b") { } }; -void TCesp2cg::main_loop() +// Se i due gruppi-conti-sottoconti sono uguali azzera il primo +void TCesp2cg_emask::test_duplication(short g1, short g2) +{ + TString16 s1, s2; + for (int i = 0; i < 3; i++) + { + s1 << get(g1+i) << ' '; + s2 << get(g2+i) << ' '; + } + if (!s1.blank() && s1 == s2) + { + warning_box("Non si deve specificare lo stesso conto della riga precedente"); + for (int i = 0; i < 4; i++) + reset(g1+i); + } +} + +bool TCesp2cg_emask::on_field_event(TOperable_field& o, TField_event e, long jolly) { - TCesp2cg_mask m; - m.run(); + switch (o.dlg()) + { + case F_CODCAT: + case F_CODCAT2: + if (e == fe_init) + return ditta_cespiti().on_category_event(o, e, jolly); + break; + case F_TIPO: + if (e == fe_modify || e == fe_close) + { + const int tipo = field(F_IDCESPITE).empty() ? 1 : 2; + set(F_COMPL, tipo == get_int(F_TIPO) ? "X" : ""); + } + break; + case F_QANT_S: + if (e == fe_modify || e == fe_close) + test_duplication(F_QANT_G, F_QNOR_G); + break; + case F_QACC_S: + if (e == fe_modify || e == fe_close) + { + test_duplication(F_QACC_G, F_QANT_G); + test_duplication(F_QACC_G, F_QNOR_G); + } + break; + case F_FANT_S: + if (e == fe_modify || e == fe_close) + test_duplication(F_FANT_G, F_FNOR_G); + break; + case F_FACC_S: + if (e == fe_modify || e == fe_close) + { + test_duplication(F_FACC_G, F_FANT_G); + test_duplication(F_FACC_G, F_FNOR_G); + } + break; + default: + break; + } + return TRUE; +} + +///////////////////////////////////////////////// +// Programma principale +///////////////////////////////////////////////// + +class TCesp2cg : public TRelation_application +{ + TRelation* _rel; + TMask* _qmsk; + TMask* _emsk; + +protected: + virtual bool changing_mask(int mode) { return TRUE; } + virtual TMask* get_mask(int mode); + virtual TRelation* get_relation() const { return _rel; } + + virtual void init_query_mode(TMask& m); + virtual void init_query_insert_mode(TMask& m); + virtual void init_insert_mode(TMask& m); + virtual void init_modify_mode(TMask& m); + + virtual bool user_create(); + virtual bool user_destroy(); + +public: + const TRectype& curr_cat(const TMask& m) const; + void init_mask(TMask& m) const; + void copy_cat(TMask& m, const TRectype& cat) const; + + TCesp2cg() : _rel(NULL), _qmsk(NULL), _emsk(NULL) { } +}; + +bool TCesp2cg::user_create() +{ + if (!has_module(CGAUT)) + { + error_box("È necessario attivare il modulo contabilità"); + return FALSE; + } + _rel = new TRelation(LF_COLLCES); + _qmsk = new TCesp2cg_qmask(_rel); + _emsk = new TCesp2cg_emask; + + return TRUE; +} + +TMask* TCesp2cg::get_mask(int mode) +{ + return (mode == MODE_QUERY || mode == MODE_QUERYINS) ? _qmsk : _emsk; +} + +void TCesp2cg::init_query_mode(TMask& m) +{ + ditta_cespiti().init_mask(m); + m.show(-1); + m.hide(-2); +} + +void TCesp2cg::init_query_insert_mode(TMask& m) +{ + m.hide(-1); + m.show(-2); +} + +// Compia nella maschera corrente i dati prelevati dalla categoria +// sovrascrivendo quelli del cespite. +void TCesp2cg::copy_cat(TMask& m, const TRectype& cat) const +{ + const TRectype saverec = _rel->curr(); // Salvo record principale e ... + _rel->curr() = cat; // ... gli scrivo sopra i dati della categoria + // Carico tutti i campi a partire dalla quota normale in poi + for (int i = m.id2pos(F_QNOR_G); i < m.fields(); i++) + { + TMask_field& f = m.fld(i); + if (f.is_edit()) + ((TLoadable_field&)f).autoload(*_rel); + } + _rel->curr() = saverec; // Ripristino record principale +} + +const TRectype& TCesp2cg::curr_cat(const TMask& m) const +{ + const int gru = m.get_int(F_GRUPPO); + const char* spe = m.get(F_SPECIE); + int cat = m.get_int(F_CODCAT); + if (cat == 0) + cat = cache().get(LF_CESPI, m.get(F_IDCESPITE)).get_int(CESPI_CODCAT); + return ditta_cespiti().categoria(gru, spe, cat); +} + +void TCesp2cg::init_mask(TMask& m) const +{ + const int ese = m.get_int(F_ESERCIZIO); + const int gru = m.get_int(F_GRUPPO); + const char* spe = m.get(F_SPECIE); + ditta_cespiti().set_attivita(ese, gru, spe); + + const TRectype& cac = curr_cat(m); + const bool materiali = cac.get_int("I0") == 0; + m.field(F_FNOR_S).check_type(materiali ? CHECK_REQUIRED : CHECK_NORMAL); + m.field(F_FNOR_D).check_type(materiali ? CHECK_REQUIRED : CHECK_NORMAL); + m.enable(-3, materiali); +} + + +void TCesp2cg::init_insert_mode(TMask& m) +{ + init_mask(m); + + // Valori preimpostati "quasi" sempre buoni :-) + m.set(F_TIPO, 1); m.set(F_TIPOTRAS, "T"); + + const TString& idcespite = m.get(F_IDCESPITE); + if (!idcespite.blank()) + { + const int gru = m.get_int(F_GRUPPO); + const char* spe = m.get(F_SPECIE); + const int cat = cache().get(LF_CESPI, idcespite).get_int(CESPI_CODCAT); + TToken_string key; key.add(gru); key.add(spe); key.add(cat); + const TRectype& coll = cache().get(LF_COLLCES, key); + if (coll.get_bool(COLLCES_COMPL)) + { + m.set(F_TIPO, 1); + copy_cat(m, coll); + } + else + m.set(F_TIPO, 2); + } +} + +void TCesp2cg::init_modify_mode(TMask& m) +{ + init_mask(m); + + const TString& idcespite = m.get(F_IDCESPITE); + if (!idcespite.blank()) + { + if (!m.get_bool(F_COMPL)) + { + const int gru = m.get_int(F_GRUPPO); + const char* spe = m.get(F_SPECIE); + const int cat = cache().get(LF_CESPI, idcespite).get_int(CESPI_CODCAT); + TToken_string key; key.add(gru); key.add(spe); key.add(cat); + const TRectype& coll = cache().get(LF_COLLCES, key); + if (coll.get_bool(COLLCES_COMPL)) + { + m.set(F_TIPO, 1); + copy_cat(m, coll); + } + else + m.set(F_TIPO, 2); + } + } +} + +bool TCesp2cg::user_destroy() +{ + delete _emsk; + delete _qmsk; + delete _rel; + return TRUE; } int ce2300(int argc, char* argv[]) { TCesp2cg a; - a.run(argc, argv, "Trasferimento movimenti contabili"); + a.run(argc, argv, "Collegamenti contabili"); return 0; } diff --git a/ce/ce2300a.h b/ce/ce2300a.h index af9a4ff92..e55b82b48 100755 --- a/ce/ce2300a.h +++ b/ce/ce2300a.h @@ -1 +1,56 @@ -#define F_DITTA 101 \ No newline at end of file +#define F_DITTA 101 +#define F_RAGSOC 102 +#define F_ESERCIZIO 103 +#define F_INIZIO_ES 104 +#define F_FINE_ES 105 +#define F_GRUPPO 106 +#define F_SPECIE 107 +#define F_DESC_GRSP 108 + +#define F_TIPO 110 +#define F_CODCAT 111 +#define F_DESCAT 112 +#define F_IDCESPITE 113 +#define F_DESCES 114 +#define F_TIPO2 115 +#define F_CODCAT2 116 +#define F_DESCAT2 117 +#define F_IDCESPITE2 118 +#define F_TIPOTRAS 119 +#define F_CENTRO_COS 120 +#define F_COMPL 121 + +#define F_IMM_G 201 +#define F_IMM_C 202 +#define F_IMM_S 203 +#define F_IMM_D 204 + +#define F_QNOR_G 205 +#define F_QNOR_C 206 +#define F_QNOR_S 207 +#define F_QNOR_D 208 + +#define F_QANT_G 209 +#define F_QANT_C 210 +#define F_QANT_S 211 +#define F_QANT_D 212 + +#define F_QACC_G 213 +#define F_QACC_C 214 +#define F_QACC_S 215 +#define F_QACC_D 216 + +#define F_FNOR_G 217 +#define F_FNOR_C 218 +#define F_FNOR_S 219 +#define F_FNOR_D 220 + +#define F_FANT_G 221 +#define F_FANT_C 222 +#define F_FANT_S 223 +#define F_FANT_D 224 + +#define F_FACC_G 225 +#define F_FACC_C 226 +#define F_FACC_S 227 +#define F_FACC_D 228 diff --git a/ce/ce2300a.uml b/ce/ce2300a.uml index 8cb3dce77..ae0702d38 100755 --- a/ce/ce2300a.uml +++ b/ce/ce2300a.uml @@ -2,19 +2,233 @@ TOOLBAR "Toolbar" 0 -3 0 3 -BUTTON DLG_OK 10 2 +BUTTON DLG_SAVEREC 10 2 BEGIN - PROMPT -12 -11 "" + PROMPT -16 -11 "~Registra" + MESSAGE EXIT,K_SAVE + PICTURE BMP_SAVEREC + PICTURE BMP_SAVERECDN +END + +BUTTON DLG_NEWREC 10 2 +BEGIN + PROMPT -26 -11 "~Nuovo" + MESSAGE EXIT,K_INS + PICTURE BMP_NEWREC + PICTURE BMP_NEWRECDN +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -36 -11 "~Elimina" + MESSAGE EXIT,K_DEL + PICTURE BMP_DELREC + PICTURE BMP_DELRECDN +END + +BUTTON DLG_FINDREC 10 2 +BEGIN + PROMPT -46 -11 "Ri~cerca" + MESSAGE EXIT,K_F9 + PICTURE 126 +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -56 -11 "~Annulla" + MESSAGE EXIT,K_ESC + PICTURE 102 END BUTTON DLG_QUIT 10 2 BEGIN - PROMPT -22 -11 "" + PROMPT -66 -11 "~Fine" + MESSAGE EXIT,K_QUIT + PICTURE BMP_QUIT + PICTURE BMP_QUITDN END ENDPAGE -PAGE "Trasferimento a contabilità" -1 -1 78 18 +PAGE "Collegamenti contabili" -1 -1 78 18 + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 0 1 "@bParametri ditta" +END + +NUMBER F_DITTA 5 +BEGIN + PROMPT 1 2 "Ditta " + FLAGS "DF" +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 26 2 "" + USE LF_NDITTE + INPUT CODDITTA F_DITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE NORMAL + FLAGS "D" +END + +NUMBER F_ESERCIZIO 4 +BEGIN + PROMPT 1 3 "Esercizio " + FLAGS "AZ" + USE CCE + JOIN ESC ALIAS 104 INTO CODTAB==CODTAB + INPUT CODTAB F_ESERCIZIO + DISPLAY "Codice esercizio" CODTAB + DISPLAY "Inizio esercizio" 104@->D0 + DISPLAY "Fine esercizio" 104@->D1 + OUTPUT F_ESERCIZIO CODTAB + OUTPUT F_INIZIO_ES 104@->D0 + OUTPUT F_FINE_ES 104@->D1 + CHECKTYPE REQUIRED +END + +DATE F_INIZIO_ES +BEGIN + PROMPT 26 3 "Inizio " + FLAGS "D" +END + +DATE F_FINE_ES +BEGIN + PROMPT 50 3 "Fine " + FLAGS "D" +END + +NUMBER F_GRUPPO 2 +BEGIN + PROMPT 1 4 "Gruppo " + FLAGS "PZ" + FIELD CODGRUPPO + KEY 1 +END + +STRING F_SPECIE 4 +BEGIN + PROMPT 16 4 "Specie " + FLAGS "_P" + USE CCB + JOIN %CAT ALIAS 400 INTO CODTAB=CODTAB[5,10] + INPUT CODTAB[1,4] F_ESERCIZIO SELECT + INPUT CODTAB[5,6] F_GRUPPO + INPUT CODTAB[7,10] F_SPECIE + DISPLAY "Gruppo" CODTAB[5,6] + DISPLAY "Specie" CODTAB[7,10] + DISPLAY "Descrizione@50" 400@->S0 + OUTPUT F_GRUPPO CODTAB[5,6] + OUTPUT F_SPECIE CODTAB[7,10] + OUTPUT F_DESC_GRSP 400@->S0 + CHECKTYPE FORCED + FIELD CODSPECIE + KEY 1 +END + +STRING F_DESC_GRSP 60 45 +BEGIN + PROMPT 31 4 "" + FLAGS "D" +END + +RADIOBUTTON F_TIPO 1 14 +BEGIN + PROMPT 0 6 "Selezione" + ITEM "1|Categorie" + MESSAGE ENABLE,F_CODCAT|CLEAR,F_IDCESPITE|REQUIRED,F_CODCAT|NORMAL,F_IDCESPITE|"1",F_TIPO2 + ITEM "2|Cespiti" + MESSAGE ENABLE,F_IDCESPITE|CLEAR,F_CODCAT|NORMAL,F_CODCAT|REQUIRED,F_IDCESPITE|"2",F_TIPO2 + GROUP 1 +END + +RADIOBUTTON F_TIPO2 1 14 +BEGIN + PROMPT 0 6 "Selezione" + FLAGS "P" + ITEM "1|Categorie" + MESSAGE ENABLE,F_CODCAT2|CLEAR,F_IDCESPITE2|REQUIRED,F_CODCAT2,NORMAL,F_IDCESPITE2 + ITEM "2|Cespiti" + MESSAGE ENABLE,F_IDCESPITE2|CLEAR,F_CODCAT2|NORMAL,F_CODCAT2,REQUIRED,F_IDCESPITE2 + GROUP 2 +END + + +NUMBER F_CODCAT 2 +BEGIN + PROMPT 16 7 "" + FLAGS "BZ" + CHECKTYPE REQUIRED + FIELD CODCAT + KEY 1 + MESSAGE COPY,F_CODCAT2 + GROUP 1 +END + +NUMBER F_CODCAT2 2 +BEGIN + PROMPT 16 7 "" + FLAGS "BHZ" + DRIVENBY F_GRUPPO + DRIVENBY F_SPECIE + CHECKTYPE REQUIRED + FIELD CODCAT + MESSAGE COPY,F_CODCAT + KEY 1 + GROUP 2 +END + +STRING F_DESCAT 70 54 +BEGIN + PROMPT 22 7 "" + FLAGS "D" +END + +NUMBER F_IDCESPITE 10 +BEGIN + PROMPT 16 8 "" + FLAGS "Z" + USE LF_COLLCES SELECT IDCESPITE!="" + JOIN LF_CESPI INTO IDCESPITE==IDCESPITE + INPUT CODGRUPPO F_GRUPPO SELECT + INPUT CODSPECIE F_SPECIE SELECT + INPUT IDCESPITE F_IDCESPITE + DISPLAY "Cespite@10" IDCESPITE + DISPLAY "Categoria" LF_CESPI->CODCAT + DISPLAY "Descrizione@50" LF_CESPI->DESC + OUTPUT F_IDCESPITE IDCESPITE + OUTPUT F_DESCES LF_CESPI->DESC + CHECKTYPE REQUIRED + MESSAGE COPY,F_IDCESPITE2 + FIELD IDCESPITE + KEY 1 + GROUP 1 +END + +NUMBER F_IDCESPITE2 10 +BEGIN + PROMPT 16 8 "" + FLAGS "HZ" + USE LF_CESPI + INPUT IDCESPITE F_IDCESPITE2 + COPY DISPLAY F_IDCESPITE + COPY OUTPUT F_IDCESPITE + CHECKTYPE REQUIRED + FIELD IDCESPITE + MESSAGE COPY,F_IDCESPITE + KEY 1 + GROUP 2 + WARNING "Inserire un cespite valido" +END + +STRING F_DESCES 50 47 +BEGIN + PROMPT 29 8 "" + FLAGS "D" +END ENDPAGE diff --git a/ce/ce2400.cpp b/ce/ce2400.cpp new file mode 100755 index 000000000..15a7d9249 --- /dev/null +++ b/ce/ce2400.cpp @@ -0,0 +1,232 @@ +#include +#include +#include +#include +#include + +#include "celib.h" +#include "ce2101.h" +#include "ce2400a.h" + +#include "cespi.h" +#include "movce.h" + +class TCesp_tras_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +protected: + void fill_dates(); + +public: + TCesp_tras_mask() : TAutomask("ce2400a") { } +}; + +void TCesp_tras_mask::fill_dates() +{ + TSheet_field& s = sfield(F_DATE_CALC); + TRelation rel("CCB"); + rel.add("%CAT", "CODTAB=CODTAB[5,10]"); + + TString expr; + expr << "CODTAB[1,4]==" << get(F_ESERCIZIO); + TCursor cur(&rel, expr); + const long items = cur.items(); + cur.freeze(); + s.destroy(); + const TRectype& curr = rel.curr(); + const TRectype& cat = rel.curr(LF_TABCOM); + bool some_empty = FALSE; + for (cur = 0; cur.pos() < items; ++cur) + { + TToken_string& row = s.row(-1); + const TString& data = curr.get("D0"); + some_empty |= data.blank(); + row.add(data); + row.add(curr.get("CODTAB").mid(4,2)); + row.add(curr.get("CODTAB").mid(6,4)); + row.add(cat.get("S0")); + } + s.force_update(); + if (some_empty) + { + disable(F_CALC); + set(F_CALC, "X"); + } + else + enable(F_CALC); +} + +bool TCesp_tras_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch(o.dlg()) + { + case F_ESERCIZIO: + if (e == fe_init || e == fe_modify) + fill_dates(); + break; + case F_DATE_CALC: + if (e == se_query_add || e == se_query_del) + return FALSE; + break; + default: break; + } + return TRUE; +} + +/////////////////////////////////////////////////////////// +// Iteratori +/////////////////////////////////////////////////////////// + +typedef bool (*RecordHandler)(TRelation& rel, void* jolly); + +unsigned long scan_cursor(TCursor& cur, RecordHandler rh, void* jolly) +{ + unsigned long processed = 0; + const long items = cur.items(); + if (items > 0) + { + TProgind* pi = items < 16 ? NULL : new TProgind(items, "Elaborazione in corso..."); + + TRelation& rel = *cur.relation(); + cur.freeze(); + for (cur = 0; cur.pos() < items; ++cur) + { + if (pi) + pi->addstatus(1); + if (rh(rel, jolly)) + processed++; + } + + if (pi) + delete pi; + } + return processed; +} + +unsigned long scan_file(int lf, RecordHandler rh, void* jolly) +{ + TRelation rel(lf); + TCursor cur(&rel); + return scan_cursor(cur, rh, jolly); +} + +/////////////////////////////////////////////////////////// +// Applicazione principale +/////////////////////////////////////////////////////////// + +class TCesp_tras : public TSkeleton_application +{ +protected: + virtual void main_loop(); + +public: + void calcolo(const TMask& m); + void trasferimento(const TMask& m); +}; + +void TCesp_tras::calcolo(const TMask& m) +{ + TExternal_app a("ce2 -0 A"); + + TSheet_field& s = m.sfield(F_DATE_CALC); + for (int i = 0; i < s.items(); i++) + { + TToken_string& row = s.row(i); + const int anno = m.get_int(F_ESERCIZIO); + const int gruppo = row.get_int(1); + const TString4 specie = row.get(); + ditta_cespiti().set_attivita(anno, gruppo, specie); + a.run(); + } +} + +struct TTras_data +{ + int _anno; + TDate _inizio, _fine; + const TCespite* _cespite; +}; + +static bool MovHandler(TRelation& rel, void* jolly) +{ + const TTras_data& data = *(const TTras_data*)jolly; + const TRectype& movce = rel.curr(); + + if (movce.get_bool(MOVCE_STAMPATO)) // Salta i movimenti già stampati su bollato + return FALSE; + + const TDate dtmov = movce.get(MOVCE_DTMOV); + const TDate dtacq = data._cespite->get(CESPI_DTCOMP); + if (dtmov < dtacq) // Ignora movimenti precedenti l'acquisizione del cespite + return FALSE; + + return TRUE; +} + +static bool CespHandler(TRelation& rel, void* jolly) +{ + const TCespite cespite(rel.curr()); + + TTras_data& data = *(TTras_data*)jolly; + data._cespite = &cespite; // Inizializza cespite corrente + + const TDate dtalien = cespite.get(CESPI_DTALIEN); + if (dtalien.ok() && dtalien < data._inizio) // Escludi cespiti alienati + return FALSE; + + const TDate dtcomp = cespite.get(CESPI_DTCOMP); + if (!dtcomp.ok() || dtcomp > data._fine) // Escludi cespiti non in funzione + return FALSE; + + const TRectype& cat = cespite.categoria(); + if (cat.get_bool("B0")) // Categoria non ammortizzabile + return FALSE; + + // Scansione di tutti i movimenti dell'anno relativi al cespite corrente + TRelation rel_movce(LF_MOVCE); + rel_movce.add(LF_MOVAM, "IDCESPITE==IDCESPITE|IDMOV==IDMOV|TPAMM==1"); // Solo situazione fiscale + rel_movce.add(LF_AMMMV, "IDCESPITE==IDCESPITE|IDMOV==IDMOV|TPAMM==1"); + TRectype& movce = rel_movce.curr(); + movce.put(MOVCE_IDCESPITE, cespite.get(CESPI_IDCESPITE)); + TString expr; + expr << "(ANSI(DTMOV)>=" << data._inizio.string(ANSI) << ")&&"; + expr << "(ANSI(DTMOV)<=" << data._fine.string(ANSI) << ")"; + TCursor cur_movce(&rel_movce, expr, 1, &movce, &movce); + scan_cursor(cur_movce, MovHandler, jolly); + + return TRUE; +} + +void TCesp_tras::trasferimento(const TMask& m) +{ + TTras_data data; + data._anno = m.get_int(F_ESERCIZIO); + data._inizio = m.get(F_INIZIO_ES); + data._fine = m.get(F_FINE_ES); + + scan_file(LF_CESPI, CespHandler, &data); +} + +void TCesp_tras::main_loop() +{ + TDitta_cespiti& dc = ditta_cespiti(); + TCesp_tras_mask m; + dc.init_mask(m); + + if (m.run() == K_ENTER) + { + if (m.get_bool(F_CALC)) + calcolo(m); + trasferimento(m); + } +} + + +int ce2400(int argc, char* argv[]) +{ + TCesp_tras a; + a.run(argc, argv, "Trasferimento movimenti"); + return 0; +} diff --git a/ce/ce2400a.h b/ce/ce2400a.h new file mode 100755 index 000000000..2982d36b5 --- /dev/null +++ b/ce/ce2400a.h @@ -0,0 +1,17 @@ +#define F_DITTA 201 +#define F_RAGSOC 202 +#define F_ESERCIZIO 203 +#define F_INIZIO_ES 204 +#define F_FINE_ES 205 + +#define F_DATAREG 206 +#define F_DATACOM 207 +#define F_DATATRA 208 +#define F_CALC 209 + +#define F_DATE_CALC 200 + +#define F_DATA_CALC 101 +#define F_GRUPPO 102 +#define F_SPECIE 103 +#define F_DESC_GRSP 104 diff --git a/ce/ce2400a.uml b/ce/ce2400a.uml new file mode 100755 index 000000000..2018756c7 --- /dev/null +++ b/ce/ce2400a.uml @@ -0,0 +1,157 @@ +#include "ce2400a.h" + +TOOLBAR "Toolbar" 0 -3 0 3 + +BUTTON DLG_ELABORA 10 2 +BEGIN + PROMPT -12 -11 "~Elabora" + MESSAGE EXIT,K_ENTER + PICTURE BMP_ELABORA +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Trasferimento movimenti" -1 -1 78 18 + +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 0 1 "@bParametri ditta" +END + +NUMBER F_DITTA 5 +BEGIN + PROMPT 1 2 "Ditta " + FLAGS "DF" +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 26 2 "" + USE LF_NDITTE + INPUT CODDITTA F_DITTA + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE NORMAL + FLAGS "D" +END + +NUMBER F_ESERCIZIO 4 +BEGIN + PROMPT 1 3 "Esercizio " + FLAGS "Z" + USE CCE + JOIN ESC ALIAS 104 INTO CODTAB==CODTAB + INPUT CODTAB F_ESERCIZIO + DISPLAY "Codice esercizio" CODTAB + DISPLAY "Inizio esercizio" 104@->D0 + DISPLAY "Fine esercizio" 104@->D1 + OUTPUT F_ESERCIZIO CODTAB + OUTPUT F_INIZIO_ES 104@->D0 + OUTPUT F_FINE_ES 104@->D1 + OUTPUT F_DATATRA D0 + CHECKTYPE REQUIRED +END + +DATE F_INIZIO_ES +BEGIN + PROMPT 26 3 "Inizio " + FLAGS "D" +END + +DATE F_FINE_ES +BEGIN + PROMPT 50 3 "Fine " + FLAGS "D" +END + +DATE F_DATATRA +BEGIN + PROMPT 1 4 "Data ultimo trasferimento movimenti " + FLAGS "DG" + MESSAGE EMPTY ENABLE,DLG_ELABORA + MESSAGE DISABLE,DLG_ELABORA +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 0 7 "@bDate da assegnare ai movimenti" +END + +DATE F_DATAREG +BEGIN + PROMPT 1 8 "Data di registrazione " + FLAGS "A" +END + +DATE F_DATACOM +BEGIN + PROMPT 41 8 "Data di competenza " + FLAGS "A" +END + +BOOLEAN F_CALC +BEGIN + PROMPT 1 13 "Esegui calcolo ammortamenti prima di trasferire i movimenti" +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 14 "@bData esecuzione ultimo calcolo ammortamenti" +END + +SPREADSHEET F_DATE_CALC 78 +BEGIN + PROMPT 1 15 "" + FLAGS "D" + ITEM "Data calcolo" + ITEM "Gruppo" + ITEM "Specie" + ITEM "Descrizione@70" +END + +ENDPAGE + +ENDMASK + +PAGE "Attività" -1 -1 60 5 + +DATE F_DATA_CALC +BEGIN + PROMPT 1 1 "Data esecuzione ultimo calcolo ammortamenti " +END + +NUMBER F_GRUPPO 2 +BEGIN + PROMPT 1 2 "Gruppo " + FLAGS "PZ" +END + +STRING F_SPECIE 4 +BEGIN + PROMPT 16 2 "Specie " + FLAGS "_" +END + +STRING F_DESC_GRSP 70 54 +BEGIN + PROMPT 1 3 "" + FLAGS "" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK \ No newline at end of file diff --git a/ce/ce3100.cpp b/ce/ce3100.cpp index 324d6c507..09d0bcee8 100755 --- a/ce/ce3100.cpp +++ b/ce/ce3100.cpp @@ -155,7 +155,7 @@ bool TRegistro_cespiti::attivita_handler(TMask_field& f, KEY k) { calc_on = reg_on = FALSE; m.reset(F_CALCOLO); - xvt_statbar_set("L'esercizio é stato chiuso"); + xvt_statbar_set("L'esercizio è stato chiuso"); } else if (ccb.get_bool("B1")) @@ -452,7 +452,7 @@ void TRegistro_cespiti::aggiorna_bollato() cursor.freeze(); for (cursor = 0; cursor.pos() < items; ++cursor) { - const TString16 idcespite = curr.get(MOVCE_IDCESPITE); //controlla che il cespite appartenga all'attivitá selezionata + const TString16 idcespite = curr.get(MOVCE_IDCESPITE); //controlla che il cespite appartenga all'attività selezionata const TRectype& ces = cache().get(LF_CESPI, idcespite); if (ces.get_int(CESPI_CODCGRA) != _mask->get_int(F_GRUPPO)) continue; diff --git a/ce/ce3500.cpp b/ce/ce3500.cpp index 85f00036e..304bde88c 100755 --- a/ce/ce3500.cpp +++ b/ce/ce3500.cpp @@ -45,7 +45,11 @@ const TString& TLC_form::decode_group(const char* codtab, int mode) { const int order = mode > 0 ? mode : _order; _str = "@b"; - _str << (order==1 ? "Categoria" : "Impianto") << "@r " << codtab << ' '; + if (mode > 0) // Riga + _str << "@r" << (order==1 ? "Cat." : "Imp.") << codtab << ' '; + else // Testata + _str << (order==1 ? "Categoria" : "Impianto") << "@r " << codtab << ' '; + if (order == 1) { const TRectype& cat = ditta_cespiti().categoria(0, NULL, atoi(codtab)); @@ -226,12 +230,12 @@ void TLC_app::main_loop() if (!fi.blank()) { if (filter.not_empty()) filter << "&&"; - filter << '(' << CESPI_CODIMP << ">=" << fi << ')'; + filter << '(' << CESPI_CODIMP << ">=\"" << fi << "\")"; } - if (!fi.blank()) + if (!ti.blank()) { if (filter.not_empty()) filter << "&&"; - filter << '(' << CESPI_CODIMP << "<=" << ti << ')'; + filter << '(' << CESPI_CODIMP << "<=\"" << ti << "\")"; } } diff --git a/ce/ce3500a.frm b/ce/ce3500a.frm index f57b5cddb..45dffbef0 100755 --- a/ce/ce3500a.frm +++ b/ce/ce3500a.frm @@ -38,7 +38,7 @@ SECTION HEADER ODD 10 STRINGA F_CODDITTA BEGIN KEY "Codice ditta" - PROMPT 1 2 "@bDitta@r " + PROMPT 1 2 "@bDitta@r " PICTURE "#####" END @@ -166,15 +166,15 @@ BEGIN FIELD IDCESPITE END -STRING -1 +STRING -1 54 BEGIN PROMPT 17 1 "" FIELD DESC END -STRINGA -1 65 +STRINGA -1 60 BEGIN - PROMPT 65 1 "" + PROMPT 72 1 "" MESSAGE _INVCODTAB END diff --git a/ce/ce3500b.frm b/ce/ce3500b.frm index 5a3579ef5..f1761eddb 100755 --- a/ce/ce3500b.frm +++ b/ce/ce3500b.frm @@ -41,7 +41,7 @@ SECTION HEADER ODD 12 STRINGA F_CODDITTA BEGIN KEY "Codice ditta" - PROMPT 1 2 "@bDitta@r " + PROMPT 1 2 "@bDitta@r " PICTURE "#####" END @@ -233,15 +233,15 @@ BEGIN FIELD IDCESPITE END -STRING -1 +STRING -1 54 BEGIN PROMPT 17 1 "" FIELD DESC END -STRINGA -1 65 +STRINGA -1 60 BEGIN - PROMPT 65 1 "" + PROMPT 72 1 "" MESSAGE _INVCODTAB END diff --git a/cg/cg1500.cpp b/cg/cg1500.cpp index 14ce3eb0e..0b93ed8f4 100755 --- a/cg/cg1500.cpp +++ b/cg/cg1500.cpp @@ -92,7 +92,6 @@ class TStampa_bilanci : public TPrintapp TDate udata; }; - cli_for* _cf; TSort * _sort; TRelation* _rel; @@ -102,7 +101,6 @@ class TStampa_bilanci : public TPrintapp TLocalisamfile* _com, * _pcn, * _mov, * _rmov, * _clifo, * _saldi, * _nditte,* _anag,* _caus; TIsamtempfile * _tmp_saldi_att, * _tmp_saldi_pass, * _tmp_saldi_conti_uno; TIsamtempfile * _tmp_saldi_costi, * _tmp_saldi_ricavi,* _tmp_saldi_conti_due; - TTable* _esc; TParagraph_string* _d; const char* _buff; bool _noseparator; // Usa separatore delle migliaia o no? @@ -139,7 +137,7 @@ class TStampa_bilanci : public TPrintapp bool _add_dare, _add_avere, _controlla, _salto_pagina, _flag, _stampato; bool _sottoc_dare, _sottoc_avere, _salto_pagina1, _livello_conto; bool _mov_ap,_quadratura; - bool _print_exercise; + bool _print_exercise, _hide_clifo; int _stampa_mov_prov; TString _cdc, _fsc; @@ -944,8 +942,8 @@ bool TStampa_bilanci::bil_sez_contr() { compensa = _pcn->get_bool(PCN_COMPENS); dettaglio = !_pcn->get_bool(PCN_STSOTTBIL); - tipo_conto = _pcn->get(PCN_TMCF)[0]; - indbil_conto = _pcn->get_int (PCN_INDBIL); + tipo_conto = _pcn->get_char(PCN_TMCF); + indbil_conto = _pcn->get_int(PCN_INDBIL); if (indbil_conto <= 0) // Warning per Roberto! { @@ -957,8 +955,7 @@ bool TStampa_bilanci::bil_sez_contr() if ( (tipo_conto == 'C') || (tipo_conto == 'F') ) { saldo = ZERO; - esiste_sc = ricerca_sottoc_clifo(g, c, compensa, - indbil_conto, saldo); + esiste_sc = ricerca_sottoc_clifo(g, c, compensa, indbil_conto, saldo); if (esiste_sc) { _gp = g; @@ -1402,7 +1399,7 @@ bool TStampa_bilanci::bil_verifica() } if ( (s == 0) && (c != 0) ) //si tratta di un conto { - tipo_conto = _pcn->get(PCN_TMCF)[0]; + tipo_conto = _pcn->get_char(PCN_TMCF); indbil_conto = _pcn->get_int(PCN_INDBIL); if ( (tipo_conto == 'C') || (tipo_conto == 'F') ) { @@ -2004,7 +2001,7 @@ bool TStampa_bilanci::ricerca_cf(int g,int c,char tipocf,int ib, real& saldo_fin //se saldo_finale < 0 verra' stampato con una A, se no con una D } - else + else // Bilancio di verifica all'ultima immissione { //Attenzione! Nel caso di "tutti i conti" devono scendere solo i cli/for movimentati!!! @@ -2084,7 +2081,7 @@ bool TStampa_bilanci::ricerca_cf(int g,int c,char tipocf,int ib, real& saldo_fin saldo_conto += saldo_finale; // somma algebrica!!! //scrivo il record relat. al sottoconto se non e' richiesto saldi di mastro - if (_verifica != 2) + if (_verifica != 2 && !_hide_clifo) { _tmp_saldi_att->zero(); _tmp_saldi_att->put(SLD_GRUPPO,g); @@ -2124,7 +2121,8 @@ bool TStampa_bilanci::ricerca_cf(int g,int c,char tipocf,int ib, real& saldo_fin _tmp_saldi_att->put(SLD_PDARE,_mov_periodo_dare); _tmp_saldi_att->put(SLD_PAVERE,_mov_periodo_avere); _tmp_saldi_att->put(SLD_SALDO,saldo_finale); - _tmp_saldi_att->put(SLD_DATAULMOV, _u_max); + _tmp_saldi_att->put(SLD_DATAULMOV, _u_max); + _tmp_saldi_att->write(); } } @@ -2210,23 +2208,16 @@ void TStampa_bilanci::scrivi_record_conto(const real& prg_da, const real& prg_a, void TStampa_bilanci::init_sort() { - _cf = new cli_for; - _sort = new TSort(sizeof(cli_for)); + cli_for cf; + _sort = new TSort(sizeof(cli_for)); + _sort->addsortkey ((char*)&(cf.tipocf)-(char*)&(cf.tipocf),1); + _sort->addsortkey ((char*)&(cf.gruppo)-(char*)&(cf.tipocf),3); + _sort->addsortkey ((char*)&(cf.conto)-(char*)&(cf.tipocf),3); if (_ordinamento == 1) - { - _sort->addsortkey ((char*)&(_cf->tipocf)-(char*)&(_cf->tipocf),1); - _sort->addsortkey ((char*)&(_cf->gruppo)-(char*)&(_cf->tipocf),3); - _sort->addsortkey ((char*)&(_cf->conto)-(char*)&(_cf->tipocf),3); - _sort->addsortkey ((char*)&(_cf->codcf)-(char*)&(_cf->tipocf),6); - } + _sort->addsortkey ((char*)&(cf.codcf)-(char*)&(cf.tipocf),6); else if (_ordinamento == 2) - { - _sort->addsortkey ((char*)&(_cf->tipocf)-(char*)&(_cf->tipocf),1); - _sort->addsortkey ((char*)&(_cf->gruppo)-(char*)&(_cf->tipocf),3); - _sort->addsortkey ((char*)&(_cf->conto)-(char*)&(_cf->tipocf),3); - _sort->addsortkey ((char*)&(_cf->ragsoc)-(char*)&(_cf->tipocf),50); - } + _sort->addsortkey ((char*)&(cf.ragsoc)-(char*)&(cf.tipocf),50); _sort->init(); } @@ -2234,12 +2225,13 @@ void TStampa_bilanci::init_sort() void TStampa_bilanci::riempi_record(char t,int g,int c,long s, const char* rs,const real& sd,const real& sa, const real& md,const real& ma,const real& sf) -{ - _cf->tipocf = t; - sprintf(_cf->gruppo, "%03d", g); - sprintf(_cf->conto, "%03d", c); - sprintf(_cf->codcf, "%06ld", s); - sprintf(_cf->ragsoc, "%s", rs); +{ + cli_for cf; + cf.tipocf = t; + sprintf(cf.gruppo, "%03d", g); + sprintf(cf.conto, "%03d", c); + sprintf(cf.codcf, "%06ld", s); + sprintf(cf.ragsoc, "%s", rs); if ( s == 999999L ) { if ( (_datada == _dataini)||(_tipo_stampa1 != 1) ) @@ -2247,8 +2239,8 @@ void TStampa_bilanci::riempi_record(char t,int g,int c,long s, //modifica del 21/11/1995 if (_tipo_stampa1 == 1 && _datada == _dataini) { - _cf->saldodare = _saldo_ini_conto_dare; - _cf->saldoavere = _saldo_ini_conto_avere; + cf.saldodare = _saldo_ini_conto_dare; + cf.saldoavere = _saldo_ini_conto_avere; } else //fine @@ -2256,33 +2248,33 @@ void TStampa_bilanci::riempi_record(char t,int g,int c,long s, real app = _saldo_ini_conto_dare + _saldo_ini_conto_avere; if (app > ZERO) //va stampato in Dare { - _cf->saldoavere = ZERO; - _cf->saldodare = app; + cf.saldoavere = ZERO; + cf.saldodare = app; } else if (app < ZERO) { app = -app; - _cf->saldodare = ZERO; - _cf->saldoavere = app; + cf.saldodare = ZERO; + cf.saldoavere = app; } } } else if (_datada > _dataini) { - _cf->saldodare = sd; - _cf->saldoavere = sa; + cf.saldodare = sd; + cf.saldoavere = sa; } } else { - _cf->saldodare = sd; - _cf->saldoavere = sa; + cf.saldodare = sd; + cf.saldoavere = sa; } - _cf->movdare = md; - _cf->movavere = ma; - _cf->saldofinale = sf; - _cf->udata = _u_max; - _sort->sort((const char*)_cf); + cf.movdare = md; + cf.movavere = ma; + cf.saldofinale = sf; + cf.udata = _u_max; + _sort->sort((const char*)&cf); } void TStampa_bilanci::leggi_clifo(const TArray& gccf) @@ -2333,7 +2325,7 @@ void TStampa_bilanci::leggi_clifo(const TArray& gccf) nome = ragsoc.mid(30,20); cognome.trim(); nome.trim(); ragsoc = cognome; - ragsoc << " " << nome; + ragsoc << ' ' << nome; } TEsercizi_contabili ese; @@ -2548,7 +2540,7 @@ void TStampa_bilanci::leggi_clifo(const TArray& gccf) movdare = _mov_periodo_dare; movavere = _mov_periodo_avere; - + riempi_record(tipocf,g,c,codcf,ragsoc,saldodare,saldoavere,movdare, movavere,saldo_finale); tipocfp = tipocf; @@ -2843,7 +2835,8 @@ bool TStampa_bilanci::preprocess_page(int file, int counter) _eof1 = _tmp_saldi_att->first(); if (_eof1) return FALSE; - else leggi_file_tmp(); + else + leggi_file_tmp(); } } } @@ -2933,7 +2926,9 @@ void TStampa_bilanci::postclose_print() else { if (_verifica == 3) - delete _sort; + { + delete _sort; _sort = NULL; + } else { delete _tmp_saldi_att; _tmp_saldi_att = NULL; @@ -3072,9 +3067,9 @@ void TStampa_bilanci::set_page(int file, int counter) { if (!_eof1) { - if (_saldofinale_succ > 0) + if (_saldofinale_succ >= ZERO) app = 'D'; - else if (_saldofinale_succ < 0) + else { _saldofinale_succ = -_saldofinale_succ; app = 'A'; @@ -3132,29 +3127,25 @@ void TStampa_bilanci::set_page(int file, int counter) if (_descr_succ.len() > 30) set_row(++r, "@46g!@80g!@114g!"); } - else if (app == 'D') - { + else // Stampa estesa + { set_row(r,"@1g%6ld",(const char*)_sottoconto_succ); if ((_saldoini_dare_succ != ZERO) || (_saldoini_avere_succ != ZERO) || (_mov_dare_succ != ZERO) || (_mov_avere_succ != ZERO) || (_saldofinale_succ != ZERO)) set_row(r," %s",(const char*)udata); - set_row(r,"@17g#a@46g!%r@64g%r@80g!%r@98g%r@114g!%r@148g!", - _d,&_saldoini_dare_succ,&_saldoini_avere_succ, - &_mov_dare_succ,&_mov_avere_succ,&_saldofinale_succ); - if (_descr_succ.len() > 30) - set_row(++r, "@46g!@80g!@114g!@148g!"); - } - else - { - set_row(r,"@1g%6ld",(const char*)_sottoconto_succ); - if ((_saldoini_dare_succ != ZERO) || (_saldoini_avere_succ != ZERO) || - (_mov_dare_succ != ZERO) || (_mov_avere_succ != ZERO) || - (_saldofinale_succ != ZERO)) - set_row(r," %s",(const char*)udata); - set_row(r,"@17g#a@46g!%r@64g%r@80g!%r@98g%r@114g!@132g%r@148g!", - _d,&_saldoini_dare_succ,&_saldoini_avere_succ, - &_mov_dare_succ,&_mov_avere_succ,&_saldofinale_succ); + if (app == 'D') + { + set_row(r,"@17g#a@46g!%r@64g%r@80g!%r@98g%r@114g!%r@148g!", + _d,&_saldoini_dare_succ,&_saldoini_avere_succ, + &_mov_dare_succ,&_mov_avere_succ,&_saldofinale_succ); + } + else + { + set_row(r,"@17g#a@46g!%r@64g%r@80g!%r@98g%r@114g!@132g%r@148g!", + _d,&_saldoini_dare_succ,&_saldoini_avere_succ, + &_mov_dare_succ,&_mov_avere_succ,&_saldofinale_succ); + } if (_descr_succ.len() > 30) set_row(++r, "@46g!@80g!@114g!@148g!"); } @@ -3163,9 +3154,9 @@ void TStampa_bilanci::set_page(int file, int counter) } else { - if (_saldofinale > 0) + if (_saldofinale >= ZERO) app = 'D'; - else if (_saldofinale < 0) + else { app = 'A'; _saldofinale = -_saldofinale; @@ -3704,6 +3695,8 @@ const char* TStampa_bilanci::DescrizioneConto(int g, int c, long s, char tipocf) bool TStampa_bilanci::user_create() { + open_files(LF_TAB, 0); + _stampa_width = 132; _rel = new TRelation(LF_CLIFO); _cur = new TCursor (_rel,"",3); @@ -3716,8 +3709,8 @@ bool TStampa_bilanci::user_create() _nditte = new TLocalisamfile(LF_NDITTE); _anag = new TLocalisamfile(LF_ANAG); _caus = new TLocalisamfile(LF_CAUSALI); - _esc = new TTable("ESC"); _d = new TParagraph_string("",29); + _sort = NULL; _tmp_saldi_att = NULL; _tmp_saldi_pass = NULL; _tmp_saldi_costi = NULL; @@ -3740,7 +3733,6 @@ bool TStampa_bilanci::user_destroy() delete _nditte; delete _anag; delete _caus; - delete _esc; delete _d; if (_tmp_saldi_att) delete _tmp_saldi_att; @@ -3788,6 +3780,7 @@ void TStampa_bilanci::leggi_pcon() void TStampa_bilanci::stampa_un_bilancio(const TMask& m) { + _prog = NULL; if (_bilancio == 1) { printer().footerlen(3); @@ -3852,12 +3845,12 @@ void TStampa_bilanci::stampa_un_bilancio(const TMask& m) _clienti.destroy(); _fornitori.destroy(); leggi_pcon(); - crea_sort_clifo(); + crea_sort_clifo(); // Crea la sua _prog _sort->endsort(); - delete _cf; } } - delete _prog; + if (_prog) + delete _prog; print(); } @@ -3882,6 +3875,7 @@ bool TStampa_bilanci::set_print(int) _data = m.get(F_DATASTAMPA); _stampa_mov_prov = m.get_int(F_STAMPAMPROV); _quadratura = m.get_bool(F_QUADRATURA); + _hide_clifo = m.get_bool(F_HIDE_CLIFO); _noseparator = m.get_bool(F_SEPARATOR); if (m.field(F_DACDC).active() && (m.get(F_DACDC).not_empty() || m.get(F_ACDC).not_empty())) @@ -4059,8 +4053,8 @@ void TStampa_bilanci::preprocess_header() //modifica del 20/04/1995 if (_print_exercise) { - TString d1(InizioEsercizio(_annoes).string()); - TString d2(FineEsercizio(_annoes).string()); + TString16 d1(InizioEsercizio(_annoes).string()); + TString16 d2(FineEsercizio(_annoes).string()); set_header(r,"@84gEsercizio %s %s", (const char*)d1, (const char*)d2); /**/ } r++; diff --git a/cg/cg1500.h b/cg/cg1500.h index 97221277a..4831c240b 100755 --- a/cg/cg1500.h +++ b/cg/cg1500.h @@ -28,6 +28,7 @@ #define F_DAFSC 127 #define F_ACDC 128 #define F_AFSC 129 +#define F_HIDE_CLIFO 130 #endif // __CG1500_H diff --git a/cg/cg1500a.uml b/cg/cg1500a.uml index 6e9b8814f..232905de5 100755 --- a/cg/cg1500a.uml +++ b/cg/cg1500a.uml @@ -1,6 +1,6 @@ #include "cg1500.h" -TOOLBAR "" 0 -2 0 2 +TOOLBAR "" 0 -3 0 3 BUTTON DLG_OK 10 2 BEGIN @@ -253,9 +253,12 @@ RADIOBUTTON F_VERIFICA 27 BEGIN PROMPT 2 1 "@bStampa bilancio di verifica " HELP "Tipo di bilancio di verifica" - ITEM "1|Bilancio" + ITEM "1|Bilancio" + MESSAGE SHOW,F_HIDE_CLIFO ITEM "2|Saldi di mastro" + MESSAGE HIDE,F_HIDE_CLIFO ITEM "3|Situazione C/F" + MESSAGE HIDE,F_HIDE_CLIFO END RADIOBUTTON F_STAMPAC 36 @@ -287,6 +290,11 @@ BEGIN FLAGS "DR" END +BOOLEAN F_HIDE_CLIFO +BEGIN + PROMPT 2 10 "Non stampare il dettaglio dei clienti/fornitori" +END + LIST F_SITUAZIONE 11 BEGIN PROMPT 2 10 "Tipo situazione " diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index 5a9506a4b..e4365feeb 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -175,9 +175,9 @@ TMask* TPrimanota_application::load_mask(int n) else { cgm.hide(CG_COMMESSA); cgm.hide(CG_FASE); + cgm.hide(CG_DESC_CDC); cgm.hide(CG_DESC_FASE); + cg.delete_column(CG_DESC_FASE); cg.delete_column(CG_DESC_CDC); cg.delete_column(CG_FASE); cg.delete_column(CG_COMMESSA); - for (short id = 155; id <= 157; id++) - cgm.hide(id); // Descrizioni commessa e fase } } break; @@ -780,9 +780,11 @@ int TPrimanota_application::read(TMask& m) riga.add(conto.string(0x3)); // Contropartita 110-114 riga.add(r.get(RMV_CODCMS)); // Commessa 115 riga.add(r.get(RMV_FASCMS)); // Fase 116 + riga.add(cache().get("CMS", r.get(RMV_CODCMS), "S0")); // Desrizione Commessa 117 + riga.add(cache().get("FSC", r.get(RMV_FASCMS), "S0")); // Desrizione Fase 118 const char tipo = r.get_char(RMV_ROWTYPE); - riga.add(tipo, CG_ROWTYPE-FIRST_FIELD); // Tipo di riga 117 + riga.add(tipo, CG_ROWTYPE-FIRST_FIELD); // Tipo di riga 119 disable_cgs_cells(i, tipo); } @@ -836,6 +838,8 @@ int TPrimanota_application::read(TMask& m) c.add_to(riga, 4, 0x7); // Conto 105-110 riga.add(r.get(RMI_CODCMS)); // Commessa 111 riga.add(r.get(RMI_FASCMS)); // Fase 112 + riga.add(cache().get("CMS", r.get(RMI_CODCMS), "S0")); // Desrizione Commessa 113 + riga.add(cache().get("FSC", r.get(RMI_FASCMS), "S0")); // Desrizione Fase 114 } calcola_imp(); // Calcola totale imponibile ed imposte @@ -925,7 +929,7 @@ void TPrimanota_application::mask2rel(const TMask& m) row.get(); // Descrizione contropartita r.put(RMV_CODCMS, row.get()); // Commessa r.put(RMV_FASCMS, row.get()); // Fase - r.put(RMV_ROWTYPE, row.get()); // Tipo riga + r.put(RMV_ROWTYPE, row.get(CG_ROWTYPE-FIRST_FIELD)); // Tipo riga } } @@ -1510,8 +1514,8 @@ void TPrimanota_application::ini2mask(TConfig& ini, TMask& msk, bool query) if (c.gruppo() > 0) c.add_to(riga, 4, 0x7); // Conto 105-110 - add_not_empty(riga, 10, ini, RMI_CODCMS); // Commessa 111 - add_not_empty(riga, 11, ini, RMI_FASCMS); // Fase 112 + add_not_empty(riga, 10, ini, RMI_CODCMS); // Commessa 111 + add_not_empty(riga, 11, ini, RMI_FASCMS); // Fase 112 iva_notify(is, i, K_ENTER); } @@ -1794,27 +1798,27 @@ bool TPrimanota_application::protected_record(TRectype& mov) bool ok = !TRelation_application::protected_record(mov); if (ok && autodeleting() == 0x3) { - if (mov.get_bool(MOV_STAMPATO)) - { - static long last_checked_numreg = 0L; - const long numreg = mov.get_long(MOV_NUMREG); - if (last_checked_numreg != numreg) - { + static long last_checked_numreg = 0L; + const long numreg = mov.get_long(MOV_NUMREG); + if (last_checked_numreg != numreg) + { + if (mov.get_bool(MOV_STAMPATO)) + { ok = yesno_box("Il movimento %ld e' gia' stato stampato sul libro giornale:\n" "si desidera eliminarlo ugualmente?", numreg); - if (ok && mov.get_bool(MOV_REGST)) - { - ok = yesno_box("Il movimento %ld e' gia' stato stampato sul bollato:\n" - "si desidera eliminarlo ugualmente?", numreg); - } - if (ok && mov.get_bool(MOV_INVIATO)) - { - ok = yesno_box("Il movimento %ld e' stato inviato ad un'altra contabilita':\n" - "si desidera eliminarlo ugualmente?", numreg); - } - if (ok) - last_checked_numreg = numreg; } + if (ok && mov.get_bool(MOV_REGST)) + { + ok = yesno_box("Il movimento %ld e' gia' stato stampato sul bollato:\n" + "si desidera eliminarlo ugualmente?", numreg); + } + if (ok && mov.get_bool(MOV_INVIATO)) + { + ok = yesno_box("Il movimento %ld e' stato inviato ad un'altra contabilita':\n" + "si desidera eliminarlo ugualmente?", numreg); + } + if (ok) + last_checked_numreg = numreg; } } return !ok; diff --git a/cg/cg2100.h b/cg/cg2100.h index d67e00cd8..38def0c38 100755 --- a/cg/cg2100.h +++ b/cg/cg2100.h @@ -70,7 +70,9 @@ #define CG_DESCR 109 #define CG_COMMESSA 115 #define CG_FASE 116 -#define CG_ROWTYPE 117 +#define CG_DESC_CDC 117 +#define CG_DESC_FASE 118 +#define CG_ROWTYPE 119 // Campi ripetuti sulla seconda pagina diff --git a/cg/cg2100b.uml b/cg/cg2100b.uml index ce5b7a93d..f22bc0ab3 100755 --- a/cg/cg2100b.uml +++ b/cg/cg2100b.uml @@ -356,6 +356,8 @@ BEGIN ITEM "Descrizione contropartita@30" ITEM "CDC / Commessa@20" ITEM "Fase@10" + ITEM "Descrizione CDC/Commessa@30" + ITEM "Descrizione Fase@30" ITEM "Tipo@4" END diff --git a/cg/cg2100c.uml b/cg/cg2100c.uml index 1de02cdd9..90f6c10a4 100755 --- a/cg/cg2100c.uml +++ b/cg/cg2100c.uml @@ -620,6 +620,8 @@ BEGIN ITEM "Descrizione Conto@30" ITEM "CDC/Commessa@20" ITEM "Fase@10" + ITEM "Descrizione CDC/Commessa@30" + ITEM "Descrizione Fase@30" END CURRENCY F_IMPONIBILI 18 @@ -653,6 +655,8 @@ BEGIN ITEM "Descrizione contropartita@30" ITEM "CDC/Commessa@20" ITEM "Fase@10" + ITEM "Descrizione CDC/Commessa@30" + ITEM "Descrizione Fase@30" ITEM "Tipo@4" END diff --git a/cg/cg2101.cpp b/cg/cg2101.cpp index a9c63ca34..664730a0f 100755 --- a/cg/cg2101.cpp +++ b/cg/cg2101.cpp @@ -194,8 +194,7 @@ int TMovimentoPN::registra(bool re, bool force) const TRectype& m = curr(); const long numreg = m.get_long(MOV_NUMREG); - if (!re) - _cg.renum_key(MOV_NUMREG, numreg); + _cg.renum_key(MOV_NUMREG, numreg); err = _cg.write(re); if (err != NOERR) return err; @@ -221,8 +220,7 @@ int TMovimentoPN::registra(bool re, bool force) r.put(RMI_TIPOATT, tipoatt); } - if (!re) - _iva.renum_key(MOV_NUMREG, numreg); + _iva.renum_key(MOV_NUMREG, numreg); err = _iva.write(re); if (err != NOERR) return err; diff --git a/cg/cg2102.cpp b/cg/cg2102.cpp index 075bf87ef..1a03b37d6 100755 --- a/cg/cg2102.cpp +++ b/cg/cg2102.cpp @@ -34,7 +34,6 @@ TClinton::TClinton(TToken_string& row, bool iva) set_fase(row.get((iva ? 112 : CG_FASE) - FIRST_FIELD)); } - /////////////////////////////////////////////////////////// // Funzioni di decodifica/calcolo /////////////////////////////////////////////////////////// @@ -261,7 +260,7 @@ TSheet_field& TPrimanota_application::cgs() const { const TMask* m = _msk[_iva == nessuna_iva ? 1 : 2]; CHECK(m, "Null cgs() mask"); - TSheet_field& s = (TSheet_field&)m->field(F_SHEETCG); + TSheet_field& s = m->sfield(F_SHEETCG); return s; } @@ -392,7 +391,9 @@ void TPrimanota_application::disable_cgs_cells(int n, char tipo) if (cg.cell_disabled(n, 5)) { cg.disable_cell(n, CG_COMMESSA); // Commessa + cg.disable_cell(n, CG_DESC_CDC); cg.disable_cell(n, CG_FASE); // Fase + cg.disable_cell(n, CG_DESC_FASE); needs_update = TRUE; } @@ -459,24 +460,34 @@ int TPrimanota_application::set_cgs_row(int n, const TImporto& imp, if (conto.default_cdc(codcms, fascms)) { row.add(codcms, CG_COMMESSA-FIRST_FIELD); + row.add(cache().get("CMS", codcms, "S0"), CG_DESC_CDC-FIRST_FIELD); row.add(fascms, CG_FASE-FIRST_FIELD); + row.add(cache().get("FSC", fascms, "S0"), CG_DESC_FASE-FIRST_FIELD); } } } else { row.add(cms, CG_COMMESSA-FIRST_FIELD); + row.add(cache().get("CMS", cms, "S0"), CG_DESC_CDC-FIRST_FIELD); row.add(fas, CG_FASE-FIRST_FIELD); + row.add(cache().get("FSC", fas, "S0"), CG_DESC_FASE-FIRST_FIELD); } cg.enable_cell(n, CG_COMMESSA); // Commessa + cg.enable_cell(n, CG_DESC_CDC); cg.enable_cell(n, CG_FASE); // Fase + cg.enable_cell(n, CG_DESC_FASE); } else // Azzera commessa sui conti clifo { row.add("", CG_COMMESSA-FIRST_FIELD); + row.add("", CG_DESC_CDC-FIRST_FIELD); row.add("", CG_FASE-FIRST_FIELD); + row.add("", CG_DESC_FASE-FIRST_FIELD); cg.disable_cell(n, CG_COMMESSA); // Commessa + cg.disable_cell(n, CG_DESC_CDC); cg.disable_cell(n, CG_FASE); // Fase + cg.disable_cell(n, CG_DESC_FASE); } row.add(tipo, CG_ROWTYPE-FIRST_FIELD); @@ -517,7 +528,8 @@ HIDDEN bool can_remove(TToken_string& s) void TPrimanota_application::cgs_pack() { - TString_array& rows = cgs().rows_array(); + TSheet_field& s = cgs(); + TString_array& rows = s.rows_array(); const bool pagamento = is_pagamento(); const long numreg = curr_mask().get_long(F_NUMREG); @@ -531,7 +543,7 @@ void TPrimanota_application::cgs_pack() { ok = !partite().utilizzata(numreg, i+1); if (ok) - cg_notify(cgs(), i, K_DEL); + cg_notify(s, i, K_DEL); } if (ok) rows.destroy(i, TRUE); @@ -562,7 +574,7 @@ real TPrimanota_application::calcola_saldo() const const bool pag = is_pagamento() && !_as400; TString_array& rows = cgs().rows_array(); - for (int i = rows.items()-1; i >= 0; i--) + for (int i = rows.last(); i >= 0; i--) { TToken_string& r = rows.row(i); importo = r; @@ -768,7 +780,8 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k) } // La commessa è vuota: controlliamo se era obbligatoria - if (c.tipo() <= ' ' && *r.get(CG_COMMESSA-FIRST_FIELD) <= ' ') + const TString80 cms = r.get(CG_COMMESSA-FIRST_FIELD); + if (c.tipo() <= ' ' && cms.blank()) { TToken_string k = c.string(); const TRectype& pc = cache().get(LF_PCON, k); @@ -1898,10 +1911,11 @@ bool TPrimanota_application::num_handler(TMask_field& f, KEY key) a._skip_giornale_check = FALSE; a._skip_bollato_check = FALSE; - - if (!cache().get(LF_MOV, f.get()).empty()) + + const TRectype& mov = cache().get(LF_MOV, f.get()); + if (!mov.empty()) + { - const TLocalisamfile& mov = a._rel->lfile(); bool ok = TRUE; if (mov.get_bool(MOV_STAMPATO)) @@ -2993,4 +3007,3 @@ bool TPrimanota_application::solaiva_handler(TMask_field& f, KEY key) return TRUE; } - diff --git a/cg/cg2104.cpp b/cg/cg2104.cpp index 1721a44bf..7b7a13c48 100755 --- a/cg/cg2104.cpp +++ b/cg/cg2104.cpp @@ -922,11 +922,11 @@ void TPrimanota_application::write_scadenze(const TMask& m) if (anno > 0 && !numpart.blank() && m.page_enabled(2)) { const int tmov = causale().tipomov(); - const TString desc(m.get(F_DESCR)); - const TString codpag(m.get(F_CODPAG)); - const TString codcaus(causale().codice()); + const TString& desc = m.get(F_DESCR); + const TString& codpag = m.get(F_CODPAG); + const TString8 codcaus = causale().codice(); const TValuta cambio(m, SK_VALUTA, SK_DATACAMBIO, SK_CAMBIO, SK_CONTROEURO); - const TString agente(m.get(FS_AGENTE)); + const TString& agente = m.get(FS_AGENTE); const char sezione = get_cgs_imp(0).sezione(); // Dare/Avere TBill clifo; diff --git a/cg/cg21cg.uml b/cg/cg21cg.uml index df2cfdbbf..a1a5fcfd0 100755 --- a/cg/cg21cg.uml +++ b/cg/cg21cg.uml @@ -327,15 +327,15 @@ BEGIN DISPLAY "Codice@20" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT CG_COMMESSA CODTAB - OUTPUT 156 S0 + OUTPUT CG_DESC_CDC S0 CHECKTYPE NORMAL END -STRING 156 50 30 +STRING CG_DESC_CDC 50 30 BEGIN PROMPT 32 13 "" USE CMS KEY 2 - INPUT S0 156 + INPUT S0 CG_DESC_CDC DISPLAY "Descrizione@50" S0 DISPLAY "Codice@20" CODTAB COPY OUTPUT CG_COMMESSA @@ -351,15 +351,15 @@ BEGIN DISPLAY "Codice@10" CODTAB DISPLAY "Descrizione@50" S0 OUTPUT CG_FASE CODTAB - OUTPUT 157 S0 + OUTPUT CG_DESC_FASE S0 CHECKTYPE NORMAL END -STRING 157 50 30 +STRING CG_DESC_FASE 50 30 BEGIN PROMPT 32 14 "" USE FSC KEY 2 - INPUT S0 157 + INPUT S0 CG_DESC_FASE DISPLAY "Descrizione@50" S0 DISPLAY "Codice@20" CODTAB COPY OUTPUT CG_FASE @@ -369,7 +369,7 @@ END LIST CG_ROWTYPE 24 BEGIN PROMPT 28 16 "Tipo riga " - ITEM " |Sola contabilita'" + ITEM " |Sola contabilità" ITEM "A|Abbuoni attivi" ITEM "C|Differenza cambi" ITEM "D|IVA detraibile" diff --git a/cg/cg21iva.uml b/cg/cg21iva.uml index 2f58005d8..5f2ca5fea 100755 --- a/cg/cg21iva.uml +++ b/cg/cg21iva.uml @@ -249,15 +249,15 @@ BEGIN DISPLAY "Codice@20" CODTAB DISPLAY "Decrizione@50" S0 OUTPUT 111 CODTAB - OUTPUT 156 S0 + OUTPUT 113 S0 CHECKTYPE NORMAL END -STRING 156 50 40 +STRING 113 50 40 BEGIN PROMPT 32 12 "" USE CMS KEY 2 - INPUT S0 156 + INPUT S0 113 DISPLAY "Descrizione@50" S0 DISPLAY "Codice@20" CODTAB COPY OUTPUT 111 @@ -266,21 +266,22 @@ END STRING 112 10 BEGIN - PROMPT 2 13 "Fase " + PROMPT 2 13 "Fase " FLAGS "UZ" USE FSC INPUT CODTAB 112 DISPLAY "Codice@10" CODTAB DISPLAY "Decrizione@50" S0 OUTPUT 112 CODTAB + OUTPUT 114 S0 CHECKTYPE NORMAL END -STRING 157 50 40 +STRING 114 50 40 BEGIN PROMPT 32 13 "" USE FSC KEY 2 - INPUT S0 157 + INPUT S0 114 DISPLAY "Descrizione@50" S0 DISPLAY "Codice@20" CODTAB COPY OUTPUT 112 diff --git a/cg/cg3100.cpp b/cg/cg3100.cpp index 82c2a1cc1..57a8819c2 100755 --- a/cg/cg3100.cpp +++ b/cg/cg3100.cpp @@ -1158,6 +1158,10 @@ bool TListaMov_application::preprocess_page(int file,int counter) da.put(MOV_ANNOES, _annoes); a.put(MOV_ANNOES, _annoes); } + + da.put(MOV_CODCAUS, _causale_ini); + a.put(MOV_CODCAUS, _causale_fin); + if (_data_ini.ok()) da.put(MOV_DATAREG, _data_ini); da.put(MOV_TIPO, _tipo_ini); @@ -2067,10 +2071,13 @@ void TListaMov_application::imposta_parametri_stampa(const TMask& msk) { _noseparator = msk.get_bool(F_SEPARATOR); TString tipo = msk.get(F_TIPOELENCO); - //bool movprov = msk.get_bool(F_STAMPAMOVP); + _data_ini = msk.get(F_DATAINI); _data_fin = msk.get(F_DATAFIN); _annoes = msk.get_int(F_ANNO); + _causale_ini = msk.get(F_DACODCAUS); + _causale_fin = msk.get(F_ACODCAUS); + if (tipo=="C" || tipo=="F") { _codice_ini = atol(msk.get(F_CODICEINI)); @@ -2361,8 +2368,14 @@ void TListaMov_application::init_print(const TMask& msk) if (_data_ini.ok()) _flags |= ST_DATA; _data_fin = msk.get(F_DATAFIN); + _causale_ini = msk.get(F_DACODCAUS); + if (_causale_ini != "") + _flags |= ST_CAUSALE; if (_data_fin.ok()) _flags |= ST_DATA; + _causale_fin = msk.get(F_ACODCAUS); + if (_causale_fin != "") + _flags |= ST_CAUSALE; TString tipo = msk.get(F_TIPOELENCO); if ((tipo=="C")||(tipo=="F")) { diff --git a/cg/cg3100.h b/cg/cg3100.h index 3d5dcd2b8..7fc8ad689 100755 --- a/cg/cg3100.h +++ b/cg/cg3100.h @@ -39,6 +39,10 @@ #define F_DAFASE 135 #define F_AFASE 136 #define F_PRINTCDC 137 +#define F_DACODCAUS 139 +#define F_DADESCRCAUS 140 +#define F_ACODCAUS 141 +#define F_ADESCRCAUS 142 #define ST_DATA 0x0001 #define ST_NUMERO 0x0002 diff --git a/cg/cg3100b.uml b/cg/cg3100b.uml index 1245187da..baf983feb 100755 --- a/cg/cg3100b.uml +++ b/cg/cg3100b.uml @@ -220,19 +220,53 @@ BEGIN HELP "Indicare se cambiare pagina nel passaggio da cliente/fornitore a cliente/fornitore" END -/* -BOOLEAN F_STAMPAMOVP -BEGIN - PROMPT 2 13 "Stampa movimenti provvisori " - HELP "Indicare se stampare i movimenti provvisori" -END -*/ - BOOLEAN F_SEPARATOR BEGIN PROMPT 2 13 "Non stampare i separatori delle migliaia" END +STRING F_DACODCAUS 3 +BEGIN + PROMPT 2 15 "Da causale: " + FLAGS "ZU" + USE LF_CAUSALI SELECT REG!="" + INPUT CODCAUS F_DACODCAUS + DISPLAY "Cod." CODCAUS + DISPLAY "Descrizione@50" DESCR + OUTPUT F_DACODCAUS CODCAUS + OUTPUT F_DADESCRCAUS DESCR + CHECKTYPE NORMAL + ADD RUN CG0 -4 +END + +STRING F_DADESCRCAUS 50 +BEGIN + PROMPT 22 15 "" + FLAGS "D" +END + +STRING F_ACODCAUS 3 +BEGIN + PROMPT 2 16 "A causale: " + FLAGS "ZU" + USE LF_CAUSALI SELECT REG!="" + INPUT CODCAUS F_ACODCAUS + DISPLAY "Cod." CODCAUS + DISPLAY "Descrizione@50" DESCR + OUTPUT F_ACODCAUS CODCAUS + OUTPUT F_ADESCRCAUS DESCR + CHECKTYPE NORMAL + ADD RUN CG0 -4 + STR_EXPR IF(#F_ACODCAUS!="",#F_ACODCAUS>=#F_DACODCAUS,1) + WARNING "Indicare una causale valida successiva a quella iniziale" +END + +STRING F_ADESCRCAUS 50 +BEGIN + PROMPT 22 16 "" + FLAGS "D" +END + GROUPBOX DLG_NULL 71 5 BEGIN PROMPT 2 18 "@bCDC / Commesse" diff --git a/cg/cg3400.cpp b/cg/cg3400.cpp index c452a2c8b..5bc17a679 100755 --- a/cg/cg3400.cpp +++ b/cg/cg3400.cpp @@ -160,14 +160,13 @@ public: int _last_header; // prima riga di intestazione "libera" bool _stampa_stesso_registro; - bool _libro_giornale_iva_unico, _libro_cronologico, _stampa_intesta; + bool _libro_giornale_iva_unico, _libro_cronologico, _stampa_intesta, _stampa_num_pag; // bool _gia_settata_riga_mov; // per la stampa no iva TString80 _ragsoc, _paiva, _comunefis, _viafis; TString16 _provfis, _cap, _occfpi; TString80 _cofi; - TRecord_cache *_com; TLocalisamfile *_clifo,*_pconti,*_nditte,*_anag; TLocalisamfile* _attiv; // da togliere in futuro (?) @@ -266,7 +265,6 @@ bool TStampa_giornale::filter_func(const TRelation * r) recrmov.put("NUMREG", numreg); recrmov.put("NUMRIG", 1); - // Guy: non capisco bene come possano esistere movimenti senza la prima riga! if (r->lfile(LF_RMOV).read() != NOERR) { const long numreg2 = recrmov.get_long("NUMREG"); @@ -285,7 +283,7 @@ const TRectype& TStampa_giornale::look_com (const char* cod, const char* stato) { TString16 codice; codice << stato << '|' << cod; - return _com->get(codice); + return cache().get(LF_COMUNI, codice); } const char* TStampa_giornale::get_descr_caus (const char * codcaus) @@ -359,7 +357,6 @@ bool TStampa_giornale::user_create() _nditte = new TLocalisamfile(LF_NDITTE); _anag = new TLocalisamfile (LF_ANAG); - _com = new TRecord_cache(LF_COMUNI); _clifo = new TLocalisamfile(LF_CLIFO); _pconti = new TLocalisamfile(LF_PCON); _attiv = new TLocalisamfile(LF_ATTIV); // da togliere @@ -389,7 +386,6 @@ bool TStampa_giornale::user_destroy() delete _RecPartoDa; delete _RecArrivoA; - delete _com; delete _clifo; delete _pconti; delete _nditte; delete _anag; delete _tabreg; @@ -706,10 +702,7 @@ int TStampa_giornale::set_headers() if (_stampa_intesta || !_stampa_definitiva) r = stampa_intestazione_ditta(); else - { - set_header(r++, ""); - set_header(r++, ""); - } + r += 2; if (_stampa_definitiva) set_header(r++, "Codice libro: %s %s ",(const char *) _reg_cod, (const char *) _reg_descr); @@ -769,8 +762,16 @@ void TStampa_giornale::preprocess_header() { int r = _last_header + 1; int pag = printer().getcurrentpage(); - TString256 riporto; real riporto_dare, riporto_avere; + + if (_stampa_num_pag) // Stampa numero di pagina in alto a destra + { + TString16 numpag, riga; + numpag.format("%d/%d", _data_a.year(), _pagina_da+pag); + const int tab = _stampa_width - numpag.len(); + riga.format("@%dg%s", tab, (const char*)numpag); + set_header(2, riga); // Sempre quasi sulla prima riga! + } // _gia_settato_ariportare = FALSE; @@ -791,6 +792,7 @@ void TStampa_giornale::preprocess_header() TString80 dare; real2currency(dare, riporto_dare); TString80 avere; real2currency(avere, riporto_avere); + TString256 riporto; riporto.format("@b@%dgRiporto: @%dg%c %17s @%dg%c@%dg%17s", // prima erano %15s _stampa_width == 132 ? SCRITTA : DARE198-11, _stampa_width == 132 ? TOTDARE132 : DARE198-2, @@ -1574,19 +1576,15 @@ bool TStampa_giornale::controlla_mov_aep() bool TStampa_giornale::leggi_tabreg(const char * reg_cod, int reg_anno) { TString16 codtab; - -// _ae = reg_anno; - codtab.format ("%04d%-3s", reg_anno, reg_cod); - - _tabreg->zero(); _tabreg->put("CODTAB", codtab); - const bool ok = (_tabreg->read() == NOERR); - - if (!ok) _tabreg->zero(); + const bool ok = _tabreg->read() == NOERR; + if (!ok) + _tabreg->zero(); _pagine_stampate = _tabreg->get_int("I1"); _pagine_numerate = _tabreg->get_int("I2"); + _stampa_num_pag = _tabreg->get_bool("S11"); // _stampa_ok = _tabreg->get_int("I8"); _nprog_da = _tabreg->get_long ("I6"); _tot_dare = _tabreg->get_real ("R1"); diff --git a/cg/cg3600.cpp b/cg/cg3600.cpp index 1bf2c233a..7d6b23cf8 100755 --- a/cg/cg3600.cpp +++ b/cg/cg3600.cpp @@ -320,6 +320,7 @@ class TBalance : public TObject protected: bool find(const TBill& b, int esercizio, TImporto& si, TImporto& da, TImporto& av, TImporto& sf) const; + int indicatore_bilancio(const TBill& b) const; public: void read(int g, int c, long s, int esercizio, bool ignora_movap = FALSE); @@ -382,13 +383,22 @@ bool TBalance::find(const TBill& b, int esercizio, return ok; } - void TBalance::read(int gruppo, int conto, long sottoconto, int esercizio, bool ignora_movap) { const TBill zio(gruppo, conto, sottoconto); read(zio, esercizio, ignora_movap); } +int TBalance::indicatore_bilancio(const TBill& b) const +{ + TString16 str; + str.format("%d|%d", b.gruppo(), b.conto()); + const int ib = atoi(cache().get(LF_PCON, str, PCN_INDBIL)); + if (ib == 0) + NFCHECK("Impossibile stabilire l'indicatore di bilancio"); + return ib; +} + void TBalance::read(const TBill& b, int esercizio, bool ignora_movap) { TImporto si, sf, pd, pa; @@ -401,28 +411,19 @@ void TBalance::read(const TBill& b, int esercizio, bool ignora_movap) if (_saldo_ini.is_zero()) { - TLocalisamfile pcon(LF_PCON); - TRectype& curr = pcon.curr(); - curr.put(PCN_GRUPPO, b.gruppo()); - curr.put(PCN_CONTO, b.conto()); - const int err = pcon.read(); - if (err == NOERR) - { - const int indbil = curr.get_int(PCN_INDBIL); - if (indbil == 1 || indbil == 2 || indbil == 5) - { - TEsercizi_contabili esercizi; - const int precedente = esercizi.pred(esercizio); - if (precedente > 0 && find(b, precedente, si, pd, pa, sf)) - { - _saldo_ini = si; - _saldo_ini += pd; - _saldo_ini += pa; - } + const int indbil = indicatore_bilancio(b); + if (indbil == 1 || indbil == 2 || indbil == 5) + { + TEsercizi_contabili esercizi; + const int precedente = esercizi.pred(esercizio); + if (precedente > 0 && find(b, precedente, si, pd, pa, sf)) + { + _saldo_ini = si; + _saldo_ini += pd; + _saldo_ini += pa; + _saldo_ini += sf; } - } - else - NFCHECK("Impossibile stabilire indicatore di bilancio"); + } } else { diff --git a/cg/cg4100.cpp b/cg/cg4100.cpp index 550b26ebd..b372a45f8 100755 --- a/cg/cg4100.cpp +++ b/cg/cg4100.cpp @@ -70,6 +70,7 @@ bool CG4100_App::set_parms() void CG4100_App::main_loop() { + if (fexist("__sal__.sav")) warning_box("Un'operazione di riordino saldi si e' conclusa" " impropriamente. Si raccomanda di rieseguirla"); @@ -83,6 +84,7 @@ void CG4100_App::main_loop() _msk = new TMask(_optype == 'S' ? "cg4100b" : "cg4100a"); + if (_optype == 'S') sort_sal(); else @@ -307,7 +309,6 @@ bool CG4100_App::sort_sal() TSystemisamfile saldi(LF_SALDI); saldi.open(_excllock); TLocalisamfile rmov(LF_RMOV); - TLocalisamfile causali(LF_CAUSALI); TLocalisamfile mov(LF_MOV); TSaldo_agg sal; @@ -321,7 +322,6 @@ bool CG4100_App::sort_sal() "Riordino archivio saldi in corso\nLettura archivio movimenti...", FALSE,TRUE,30); - causali.zero(); mov.setkey(1); rmov.first(); sal.reset(); @@ -356,17 +356,15 @@ bool CG4100_App::sort_sal() mov.read(); CHECK(mov.good(),"Archivi movimenti e righe inconsistenti"); - causali.zero(); - const char* codcaus = mov.get(MOV_CODCAUS); - + // Tipo saldo normale per default tsal = normale; - if (*codcaus) // cerca causale per determinare il tipoo del saldo + const TString& codcaus = mov.get(MOV_CODCAUS); + if (codcaus.not_empty()) // cerca causale per determinare il tipo del saldo { - causali.put(CAU_CODCAUS, codcaus); - const int err = causali.read(); - if (err == NOERR) + const TRectype& causale = cache().get(LF_CAUSALI, codcaus); + if (!causale.empty()) { - const char ac = causali.get_char(CAU_MOVAP); + const char ac = causale.get_char(CAU_MOVAP); if (ac == 'A') tsal = apertura; else @@ -411,4 +409,3 @@ int cg4100(int argc, char* argv[]) main_app.run(argc, argv, "Ricalcolo Saldi"); return TRUE; } - diff --git a/cg/cg4303.cpp b/cg/cg4303.cpp index e05086b4c..228effc01 100755 --- a/cg/cg4303.cpp +++ b/cg/cg4303.cpp @@ -10,17 +10,10 @@ void TLiquidazione_app::add_plafond(int month, const char* codatt, int type, real& howmuch, bool intra) { look_ppa(month,codatt,type); - - TString att(codatt); - - real r0 = _ppa_r->get_real("R0"); - real r1 = _ppa_r->get_real("R1"); - real r2 = _ppa_r->get_real("R2"); - - if (intra) r1 += howmuch; - else r0 += howmuch; - _ppa_r->put("R0",r0); - _ppa_r->put("R1",r1); + const char* field = intra ? "R1" : "R0"; + real r = _ppa_r->get(field); + r += howmuch; + _ppa_r->put(field, r); _ppa->rewrite(); } @@ -36,7 +29,7 @@ void TLiquidazione_app::zero_plafond (int month, const char* codatt) } else { - long rn = _ppa->recno(); + const long rn = _ppa->recno(); // se non c'e' quello del mese prima c'e' poco da fare, // si ricalcola tutto diff --git a/cg/cg4400.cpp b/cg/cg4400.cpp index 0dcc0f497..4d348e893 100755 --- a/cg/cg4400.cpp +++ b/cg/cg4400.cpp @@ -211,28 +211,30 @@ const TRectype& TStampa_registri_app::look_comuni (const char* cod) void TStampa_registri_app::get_dati_ditta() { +/* TLocalisamfile nditte(LF_NDITTE); - TLocalisamfile anag(LF_ANAG); - TLocalisamfile unloc(LF_UNLOC); - TString codanagr; - TString tipoa; - nditte.zero(); nditte.put(NDT_CODDITTA, get_firm()); nditte.read(); - if (nditte.bad()) nditte.zero(); - - codanagr = nditte.get(NDT_CODANAGR); - tipoa = nditte.get(NDT_TIPOA); +*/ + const TRectype& nditte = cache().get(LF_NDITTE, get_firm()); _ragsoc = nditte.get(NDT_RAGSOC); + const char tipoa = nditte.get_char(NDT_TIPOA); + const long codanagr = nditte.get_long(NDT_CODANAGR); +/* + TLocalisamfile anag(LF_ANAG); + TString codanagr; + TString tipoa; anag.setkey(1); anag.zero(); anag.put (ANA_TIPOA, tipoa); anag.put (ANA_CODANAGR, codanagr); anag.read(); if (anag.bad()) anag.zero(); +*/ + const TRectype& anag = cache().get(LF_ANAG, format("%c|%ld", tipoa, codanagr)); _cofi = anag.get(ANA_COFI); _paiva = anag.get(ANA_PAIV); @@ -263,11 +265,16 @@ void TStampa_registri_app::get_dati_ditta() if (_cod_un_loc) { +/* + TLocalisamfile unloc(LF_UNLOC); unloc.zero(); unloc.put(ULC_CODDITTA, get_firm()); unloc.put(ULC_CODULC, _cod_un_loc); unloc.read(); if (unloc.read() == NOERR) +*/ + const TRectype& unloc = cache().get(LF_UNLOC, format("%ld|%d", get_firm(), _cod_un_loc)); + if (!unloc.empty()) { const TRectype& dep = look_comuni (unloc.get(ULC_COMULC)); _comunefis = dep.get(COM_DENCOM); @@ -365,6 +372,7 @@ void TStampa_registri_app::look_reg() _stampa_cred_pre = _tabreg->get_bool ("B4"); _freq_riepilogo = _tabreg->get_char ("S9"); _stampa_plafonds = _tabreg->get_char ("S10") == 'X'; + _stampa_num_pag = _tabreg->get_char ("S11") == 'X'; } bool TStampa_registri_app::compila_reg(const TMask& m) @@ -459,6 +467,7 @@ bool TStampa_registri_app::compila_reg(const TMask& m) _stampa_ind_ditta = _tabreg->get_bool("B9"); _stampa_ind_comp = _tabreg->get_bool("B5"); _stampa_plafonds = _tabreg->get_char ("S10") == 'X'; + _stampa_num_pag = _tabreg->get_char ("S11") == 'X'; _cod_un_loc = _tabreg->get_int ("I7"); _mese_credito = _tabreg->get_int ("I8"); //campo nascosto sulla tabella dei registri: mese di stampa credito anno precedente _mese_ultima_liq = _tabreg->get_int ("I4"); @@ -2533,21 +2542,20 @@ print_action TStampa_registri_app::postprocess_page (int file, int counter) int TStampa_registri_app::stampa_intestazione() { int r = 1; - TString codice_ditta; TString riga(_stampa_width); get_dati_ditta(); - codice_ditta << get_firm(); - - set_header (r, "Ditta %s %s %s %s %s %s", (const char*)codice_ditta, + riga.format("Ditta %ld %s %s %s %s %s", get_firm(), (const char*)_ragsoc, (const char*)_viafis, (const char*)_cap, (const char*)_comunefis, (const char*)_provfis); - r++; + + set_header (r++, riga); + if (_tipo_stampa == prova) { - riga = "REGISTRO DI PROVA Data @>"; - riga.right_just(_stampa_width-6); + riga.format("REGISTRO DI PROVA Data %s", TDate(TODAY).string()); + riga.right_just(_stampa_width); } TString80 tmp; @@ -2595,7 +2603,16 @@ void TStampa_registri_app::preprocess_header() else // se stampa di prova o su libro unico l'intestazione della ditta // va sempre stampata r = stampa_intestazione(); - + + if (_stampa_num_pag) // Stampa numero di pagina in alto a destra + { + TString16 numpag, riga; + numpag.format("%d/%d", _annoes, _numini+printer().getcurrentpage()); + const int tab = _stampa_width - numpag.len(); + riga.format("@%dg%s", tab, (const char*)numpag); + set_header(1, riga); // Sempre sulla prima riga! + } + if (_tipo_stampa == libro_unico && !_intesta_vidi) { ++_u_stampata; @@ -3511,6 +3528,7 @@ bool TStampa_registri_app::stampa_registri_IVA(const TMask& m) cod_lib_un = _tabreg->get("S6"); sca_vid = _tabreg->get_date("D1"); _stampa_plafonds = _tabreg->get_char ("S10") == 'X'; + _stampa_num_pag = _tabreg->get_char ("S11") == 'X'; _stampa_ind_ditta = _tabreg->get_bool("B9"); _liquidazione = _tabreg->get_bool("B7"); if (_tipo_stampa != prova) diff --git a/cg/cg4400.h b/cg/cg4400.h index 5092afdf8..bbdf9b784 100755 --- a/cg/cg4400.h +++ b/cg/cg4400.h @@ -48,7 +48,7 @@ class TStampa_registri_app : public TPrintapp bool _test; bool _mov_empty, _stampa_ind_ditta, _stampa_tutti_i_registri, _auto_intraf, _stampa, _stampa_plafonds; bool _corrispettivi, _liquidazione, _stampa_ind_comp, _esiste_riga_iva, _stampa_cred_pre; - bool _rif_vid, _intesta_vidi, _intesta_liq, _stampa_data_reg, _ok_vidi; + bool _rif_vid, _intesta_vidi, _intesta_liq, _stampa_data_reg, _ok_vidi, _stampa_num_pag; bool _sosp_imposta, _riep_liq; bool _st_tot_fin; char _frequiva, _tipo_riepilogativo, _freq_riepilogo; diff --git a/cg/cglib04.cpp b/cg/cglib04.cpp index 56e3c55cd..b586d9591 100755 --- a/cg/cglib04.cpp +++ b/cg/cglib04.cpp @@ -19,12 +19,14 @@ const int sizeH = 1024; //Lunghezza del record dell'HEADER const int RIC_SIZE = 512; -const char* tracciato_AS = "cgtrc.ini"; -const char* tracciato_PC = "cgtrcpc.ini"; +const char* const tracciato_AS = "cgtrc.ini"; +const char* const tracciato_PC = "cgtrcpc.ini"; HIDDEN TString TEMP; //ritorna falso se la causale non e' significativa +/* + bool look_causale (const char* codcaus) { const TFixed_string caus(codcaus); @@ -32,12 +34,12 @@ bool look_causale (const char* codcaus) return FALSE; return !caus.blank(); } +*/ bool format_if_zero(TString& field, int len) { if (real::is_natural(field)) field.right_just(len, '0'); - return TRUE; } @@ -1027,35 +1029,32 @@ const char* TTransfer_file::numero_civico(TString& indirizzo) return TEMP; } -const char* TTransfer_file::cerca_comune_cap(TString& field, const TString& localita) +const char* TTransfer_file::cerca_comune_cap(const TString& field, const TString& localita) { - TLocalisamfile comuni (LF_COMUNI); + const TString80 dencom = localita; TString16 cap = field; - bool trovato = FALSE; - bool prima_volta = TRUE; + + bool trovato = FALSE; + bool prima_volta = TRUE; + TEMP.cut(0); - TEMP = ""; - - if (cap.sub(2,3) == "1") + if (cap[2] == '1') { - cap = cap.sub(0,3); + cap.cut(3); cap << "00"; } - TString dencom = localita; - + TLocalisamfile comuni (LF_COMUNI); comuni.setkey(3); comuni.zero(); comuni.put(COM_CAPCOM, cap); - - TRectype com (comuni.curr()); + const TRectype com(comuni.curr()); for (comuni.read(_isgteq); !comuni.eof(); comuni.next()) { if (comuni.curr() != com) break; - TString denominazione (comuni.get(COM_DENCOM)); - + TString80 denominazione = comuni.get(COM_DENCOM); for (int i = 0; i < 3; i++) { if (dencom[i] == denominazione[i]) @@ -5344,4 +5343,3 @@ int date2esc(const TDate& d, int* prevesc) *prevesc = esc.pred(anno); return anno; } - diff --git a/cg/cglib04.h b/cg/cglib04.h index 9d4403578..53fd5d1fe 100755 --- a/cg/cglib04.h +++ b/cg/cglib04.h @@ -60,7 +60,7 @@ int pack(bool vis, int num, TString& name); int packfile(bool vis, int num, TString& name); //const char* converti(TString& data); -bool look_causale(const char* codcaus); +//bool look_causale(const char* codcaus); bool format_if_zero(TString&, int); class TRic_recfield : public TObject @@ -266,7 +266,7 @@ public: void canc_file_dir_temp(const char* dir); void temp_dir(TString& orig,TString& dest,TString& sigle); - const char* cerca_comune_cap(TString& field,const TString& localita); + const char* cerca_comune_cap(const TString& field,const TString& localita); const char* cerca_cap_comune(const TString& localita); const char* cerca_comune_den(const TString& field); void datafine_esprec(const int aep, TDate& datacomp); diff --git a/cg/cgsaldac.cpp b/cg/cgsaldac.cpp index 5187fe8f2..4802991a0 100755 --- a/cg/cgsaldac.cpp +++ b/cg/cgsaldac.cpp @@ -1780,7 +1780,6 @@ static void somma(const TRectype& vec, TRectype& nuo, const char* field) nuo.put(field, totale); } - void TPartita::sposta_riga(int from_row, TPartita& part, int to_row) { const TRiga_partite& row = riga(from_row); @@ -1790,7 +1789,7 @@ void TPartita::sposta_riga(int from_row, TPartita& part, int to_row) int* address = new int[address_size]; memset(address, 0, address_size*sizeof(int)); - TToken_string knames(64); + TToken_string knames(64); // Elenco dei campi della chiave 1 dei pagamenti knames.add(PART_TIPOCF); knames.add(PART_GRUPPO); knames.add(PART_CONTO); @@ -1963,7 +1962,7 @@ TPartita* TPartite_array::find(const TRectype& r, bool create) zio.codclifo(), zio.tipo()); } const int anno = r.get_int(PART_ANNO); - const TString num(r.get(PART_NUMPART)); + const TString8 num = r.get(PART_NUMPART); return find(zio, anno, num, create); } diff --git a/cg/f23.dir b/cg/f23.dir index 504315ba1..bbec8ab25 100755 --- a/cg/f23.dir +++ b/cg/f23.dir @@ -1,3 +1,3 @@ 23 0 -$mov|91|91|341|0|Movimenti di prima nota||| +$mov|0|0|357|0|Movimenti di prima nota||| diff --git a/cg/f23.trr b/cg/f23.trr index 6c29b566b..d066307a5 100755 --- a/cg/f23.trr +++ b/cg/f23.trr @@ -1,5 +1,5 @@ 23 -40 +44 ANNOES|9|4|0|Codice esercizio NUMREG|3|7|0|Numero di operazione DATAREG|5|8|0|Data operazione @@ -40,6 +40,10 @@ INVIVA|8|1|0|Inviata la parte IVA ad altra contabilita' SCARCON|8|1|0|Scaricata la contabilitá TNUMREG|3|7|0|Numero di registrazione temporaneo per ricezioni TOCFP|1|16|0|Codice occasionale temporaneo per ricezioni +DPROVV|1|1|0|Documento originale PROVV +DANNO|2|4|0|Documento originale ANNO +DCODNUM|1|4|0|Documento originale CODNUM +DNDOC|3|7|0|Documento originale NDOC 3 NUMREG| DATAREG+NUMREG| diff --git a/include/confapp.cpp b/include/confapp.cpp index b714a6eca..96c963b18 100755 --- a/include/confapp.cpp +++ b/include/confapp.cpp @@ -67,7 +67,7 @@ void TConfig_application::save_mask(bool tosave) for (int i = 0; i < max; i++) { TMask_field& f = mask->fld(i); - if (f.dirty() && f.field()) + if (f.field()) { const char* fname = f.field()->name(); const TString& value = f.get(); @@ -81,14 +81,14 @@ void TConfig_application::save_mask(bool tosave) if (postprocess_config_changed(_parag, fname, oldvl, value)) { - if (value[0] == ' ' || value.right(1) == " ") - { - TString val; - val << '"' << value << '"'; - _cnf->set(fname, val, NULL, TRUE, index > -1 ? index : -1); - } - else - _cnf->set(fname, value, NULL, TRUE, index > -1 ? index : -1); + if (value[0] == ' ' || value.right(1) == " ") + { + TString val; + val << '"' << value << '"'; + _cnf->set(fname, val, NULL, TRUE, index > -1 ? index : -1); + } + else + _cnf->set(fname, value, NULL, TRUE, index > -1 ? index : -1); } } } @@ -112,8 +112,8 @@ void TConfig_application::load_mask() oldvl = _cnf->get(fname,NULL, index > -1 ? index : -1); if (oldvl[0] == '"' && oldvl.right(1) == "\"") { - oldvl.rtrim(1); - oldvl.ltrim(1); + oldvl.rtrim(1); + oldvl.ltrim(1); } f.set(oldvl); } diff --git a/include/date.h b/include/date.h index 3d4d90d5a..706839b4f 100755 --- a/include/date.h +++ b/include/date.h @@ -90,7 +90,7 @@ public: // @cmember Ritorna la settimana dell'anno int week() const ; // @cmember Ritorna la settimana e l'anno considerando le settimane complete

o no - void TDate::get_week_year(int &weekd, int &yeard, bool complete); + void get_week_year(int &weekd, int &yeard, bool complete); // @cmember Aggiunge dei mesi void addmonth(int nmonth = 1); // @cmember Aggiunge degli anni diff --git a/include/doc.h b/include/doc.h index 9e6f23eac..7a826fbf8 100755 --- a/include/doc.h +++ b/include/doc.h @@ -75,6 +75,8 @@ #define DOC_CONTROEURO "CONTROEURO" #define DOC_CODCMS "CODCMS" #define DOC_FASCMS "FASCMS" +#define DOC_NUMREG "NUMREG" +#define DOC_NUMANT "NUMANT" #endif diff --git a/include/form.cpp b/include/form.cpp index 3d52bee9d..161030462 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -553,8 +553,8 @@ TForm_item& TForm_item::find_field(const TString& id) const bool TForm_item::do_message(int num) { TToken_string& messaggio = message(num); - if (messaggio.empty_items()) return FALSE; - + if (messaggio.empty_items()) + return FALSE; TToken_string msg(16, ','); for (const char* m = messaggio.get(0); m; m = messaggio.get()) { @@ -1278,16 +1278,24 @@ bool TForm_number::update() if (read()) // valuta il campo { TForm_item::update(); + + real n = get(); // Trasforma la stringa in numero reale - const real oldn(get()); - const int nm = (_message.objptr(1) != NULL && oldn.is_zero()) ? 1 : 0; + // Arrotonda intelligentemente il numero + int round_dec = decimals(); + if (round_dec == 0 && width() > 9 && form().magic_currency()) // Magic currency? + round_dec = TCurrency::get_firm_dec(); + n.round(round_dec); - do_message(nm); - real n(get()); - n.round(decimals()); + if (_message.items() > 0) + { + const int nm = (_message.objptr(1) != NULL && n.is_zero()) ? 1 : 0; + do_message(nm); + n = get(); // Il numero potrebbe essere cambiato dal messaggio! + n.round(round_dec); + } bool print = TRUE; - if (n.is_zero()) { char sep = picture().find('E') >= 0 ? '.' :','; @@ -1299,21 +1307,24 @@ bool TForm_number::update() if (print) { - TString80 s(get()); - const bool mc = form().magic_currency(); - if (mc) + TString80 print_string; + bool app_for = TRUE; // Apply format? + if (form().magic_currency()) { - const real r = s; const bool b1 = picture() == "." || (picture().len() >= 9 && picture().find(',') < 0); const bool b2 = width() >= 9 && decimals() == 0; if (b1 || b2) - real2currency(r, s); - else - apply_format(s); + { + real2currency(n, print_string); + app_for = FALSE; // La stringa è già belle che formattata! + } } - else - apply_format(s); - put_paragraph(s); + if (app_for) + { + print_string = n.string(); + apply_format(print_string); + } + put_paragraph(print_string); } } @@ -1376,7 +1387,11 @@ void TForm_number::apply_format(TString& s) const s << d; // ... aggiungilo alla fine } } -// else s = n.string(); + else + { + real n(s); + s = n.stringa(width(), decimals()); + } } void TForm_number::set_picture(const char *p) @@ -1457,11 +1472,12 @@ bool TForm_currency::update() if (read()) // valuta il campo { TForm_item::update(); - - const real oldn(get()); - const int nm = (_message.objptr(1) != NULL && oldn.is_zero()) ? 1 : 0; - - do_message(nm); + + if (_message.items() > 0) + { + const int nm = (_message.objptr(1) != NULL && real::is_null(get())) ? 1 : 0; + do_message(nm); + } if (!real::is_null(get())) { @@ -1487,8 +1503,7 @@ bool TForm_currency::update() tail << v[i]; v.cut(i); } - const TCurrency cur = get_currency(); - const int zeroes_needed = cur.decimals(); + const int zeroes_needed = curr.decimals(); if (zeroes_needed > 0) { int zeroes_missing = 0; diff --git a/include/inst.cpp b/include/inst.cpp new file mode 100755 index 000000000..974791b6d --- /dev/null +++ b/include/inst.cpp @@ -0,0 +1,522 @@ +#include +#include +#include +#include +#include "..\ba\bainsta.h" + +// ******************************** +// classe TSystemtempfile +// ******************************** + + +// classe provvisoria per i system file temporanei, ovvero file temporanei con +// caricamento/scaricamento +// @doc EXTERNAL + +// @mfunc Importa un file ascii +// +// @rdesc Ritorna NOERR se l'operazione di lettura e' riuscita, altrimenti il codice di +// di errore generato (vedi ). +int TSystemtempfile::load( + const char* from, // @parm Nome del file da importare + char fs, // @parm Carattere separatore di campo (default ) + char fd, // @parm Carattere delimitatore di campi (default '\\0') + char rs, // @parm Carattere separatore di record (default '\\n') + bool vis, // @parm Indica se visualizzare lo stato dell'operazione (default TRUE) + bool extended) // @parm Indica se interpretare alcune stringhe come macro (default FALSE) + +// @comm Se

e' TRUE e trova alcune stringhe col formato %stringa% (es. %frm%) +// ne sostituisce i valori (es. ditta corrente). + +// @xref + +{ + FILE* fl = fopen(from, "r"); + int err=NOERR; + if (fl == NULL) + { + error_box("Non riesco ad aprire il file %s",from); + return 2; + } + TRecnotype r = 0, e = 0, nitems = 0, nread = 0; + TString16 firm, year, attprev("00000"); + + if (extended) + { + TDate d(TODAY); + TLocalisamfile ditte(LF_NDITTE); + + firm.format("%05ld", prefix().get_codditta()); + year.format("%04d", d.year()); + ditte.zero(); + ditte.put("CODDITTA", firm); + if (ditte.read() == NOERR) + attprev = ditte.get("CODATTPREV"); + } + if (fl == NULL) + { + clearerr(fl); + setstatus(err); + return err; + } + char w[80]; + while ((fgets(w, 80, fl) != NULL)) + { + if (strncmp(w, "[Data]", 6) == 0) + { + nitems = ftell(fl); + break; + } + } + fseek(fl, 0L, SEEK_END); + nitems = ftell(fl) - nitems; + fclose(fl); + TScanner f(from); + + //open(); + + TToken_string s(1024, fs); + bool fixedlen = (fs == '\0'); + int nflds = curr().items(); + TArray fld(nflds); + int len[MaxFields]; + TString sfd(3); + TString s1(64); + //bool lcf = FALSE; + + if (f.paragraph("Header")) + { + f.equal(); + const long level = atol(f.line()); + if (level > get_std_level()) + error_box("L'archivio %s e' stato generato con gli archivi di livello %ld%/%ld.\n Il livello attuale e' %ld/%ld.\n Convertire gli archivi e ripetere l' operazione.", + from, level/100, level%100, get_std_level()/100, get_std_level()%100); + //lcf = getlcf(level); + nflds = 0; + TToken_string s2(f.line()); + int p = s2.find('='); + if (p > 0) + { + s1 = s2.left(p); + s2.ltrim(p+1); + } + else s1.cut(0); + while (s1 == "Fields") + { + for (const char * fd = s2.get(); fd != NULL; fd = s2.get()) + { + TToken_string wfd(fd, ','); + fld.add(new TString(wfd.get())); + len[nflds] = wfd.get_int(); + nflds++; + } + s2 = f.line(); + p = s2.find('='); + if (p > 0) + { + s1 = s2.left(p); + s2.ltrim(p+1); + } + else s1.cut(0); + } + } + else + { + for (int j = 0; j < nflds; j++) + { + fld.add(TString(curr().fieldname(j)), j); + const TString & wfld = (const TString & ) fld[j]; + len[j] = (curr().type(wfld) == _datefld) ? 10 : curr().length(wfld); + } + } + if (!f.paragraph("Data")) + { + error_box("Formato dei dati non valido"); + //close(); + err = 1; + setstatus(err); + return err; + } + + if (fd) sfd << fd; + int last = NOERR; + + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + TProgind p(nitems, s1, TRUE, TRUE, 70); + s = f.line(); + while (s.not_empty() && !p.iscancelled()) + { + if (extended) + { + int p, i; + + while ((p = s.find("%yr%")) >= 0) + for (i = 0; i < 4; i++) s[p + i] = year[i]; + while ((p = s.find("%frm%")) >= 0) + for (i = 0; i < 5; i++) s[p + i] = firm[i]; + while ((p = s.find("%att%")) >= 0) + for (i = 0; i < 5; i++) s[p + i] = attprev[i]; + } + if ((r + e) % 50 == 0) + { + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + p.set_text(s1); + } + p.setstatus(nread + 1); + nread += s.len() + 1; + zero(); + if (fixedlen) + { + int pos = 0; + for (int j = 0; j < nflds; j++) + { + s1 = s.mid(pos,len[j]); + s1.rtrim(); + put((const TString&) fld[j], s1); + pos += len[j]; + } + } + else + { + s.restart(); + for (int j = 0; j < nflds; j++) + { + char* s2 = (char*) s.get(); + if (fd) + { + s2++; + s2[strlen(s2) - 1] = '\0'; + } + put((const TString&) fld[j], s2); + } + } + if (write() == NOERR) r++; + else + { +#ifdef DBG + yesnofatal_box("Numero linea relativa all'errore: %ld",r+e+1); +#endif + e++; + last = status(); + } + s = f.line(); + } + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + p.set_text(s1); + //close(); + setstatus(err); + return err; +} + +// @mfunc Esporta VERSO un file ascii. +// +// @rdesc Ritorna NOERR se l'operazione di esportazione e' riuscita, altrimenti il codice di +// di errore generato (vedi ). +int TSystemtempfile::dump( + const char* to, // @parm Nome del file verso quale esportare + int nkey, // @parm Numero della chiave di ordinamento con cui scaricare i dati (defualt 1) + char fs, // @parm Carattere seperatore di campo (defualt ) + char fd, // @parm Carattere delimitatore di campo (default '\\0') + char rs, // @parm Carattere separatore di record (default '\\n') + bool vis, // @parm Indica se visualizzare lo stato dell'operazione (defualt TRUE) + bool withdeleted) // @parm Indica se scaricare anche i record cancellati (dafault FALSE) + +// @xref + +{ + FILE* f = fopen(to, "w"); + + if (f == NULL) + { + setstatus(2); + return 2; + } + + if (withdeleted) nkey = 0; + int err = ferror(f); + + //open(FALSE, nkey ? TRUE : FALSE); + TString s(512); + bool fixedlen = (fs == '\0'); + int nflds = curr().items(); + TArray fld(nflds); + TBit_array rjust(nflds); + int len[MaxFields]; + + for (int j = 0; j < nflds; j++) + { + fld.add(TString(curr().fieldname(j)), j); + const TString & wfld = (const TString&) fld[j]; + const TFieldtypes t = curr().type(wfld); + rjust.set(j, t == _intfld || t == _longfld || t == _realfld || + t == _wordfld || t == _intzerofld || t == _longzerofld); + len[j] = (t == _datefld) ? 10 : curr().length(wfld); + } + TRecnotype i = 0; + const TRecnotype nitems = nkey ? items() : filehnd()->d->EOD; + s.format("Esportazione archivio %s", filename()); + TProgind p(nitems, s, TRUE, TRUE, 70); + TString s1; + + fprintf(f, "[Header]\nVersion=%ld", prefix().filelevel()); + for (int k = 0; k < nflds; k++) + { + if ((k % 10) == 0) fprintf(f, "\nFields="); + else fprintf(f, "|"); + fprintf(f, "%s,%d", (const char *) (const TString&) fld[k], len[k]); + } + fprintf(f, "\n\n[Data]\n"); + if (nkey) + { + setkey(nkey); + for ( first(); status() == NOERR && !p.iscancelled(); next(), i++) + { + p.setstatus(i + 1); + s = ""; + for (j = 0; j < nflds; j++) + { + if (fixedlen) + { + s1 = get((const TString&)fld[j]); + if (rjust[j]) s1.right_just(len[j]); + else s1.left_just(len[j]); + } + else + { + s1 = ""; + if (j && fs) s1 << fs; + if (fd) s1 << fd; + s1 << get((const TString&)fld[j]); + if (fd) s1 << fd; + } + s << s1; + } + fprintf(f, "%s%c", (const char*) s, rs); + } + } + else + { + + for (i = 0; i < nitems && !p.iscancelled(); i++) + { + zero(); + p.setstatus(i + 1); + readat(i + 1); + s=""; + if (withdeleted || curr().valid()) + { + for (j = 0; j < nflds; j++) + { + if (fixedlen) + { + s1 = get((const TString&)fld[j]); + if (rjust[j]) s1.right_just(len[j]); + else s1.left_just(len[j]); + } + else + { + s1 = ""; + if (j && fs) s1 << fs; + if (fd) s1 << fd; + s1 << get((const TString&)fld[j]); + if (fd) s1 << fd; + } + s << s1; + } + fprintf(f, "%s%c", (const char*) s, rs); + } + } + } + p.setstatus(nitems); + //close(); + fclose(f); + setstatus(err); + return err; +} + +// ******************************** +// classe TStd_filename +// ******************************** + +bool TStd_filename::check(bool verbose,const char * n) +{ + if (n && *n) + set(n); + insert("STD\\"); + if (!exist()) + { + *this = name(); + if (!exist()) + { + insert("STD\\"); + insert(prefix().get_studio()); + if (!exist()) + { + if (verbose) + error_box("Non riesco a trovare il file: %s", (const char *)name()); + cut(0); + return FALSE; + } + } + } + return TRUE; +} + +// ******************************** +// classe TInstallmodule_app +// ******************************** + +bool TInstallmodule_app::create() +{ + if (modal()) + { + TString16 maskname; + maskname.format("bainst%02d",module_number()); + _m = new TMask(maskname); + } + else + _m = NULL; + + TConfig praw(CONFIG_INSTALL, "Main"); + _test_database = praw.get("TestDatabase","Main",-1,"Y") != "N"; + + return TSkeleton_application::create(); +} + +bool TInstallmodule_app::destroy() +{ + if (_m) delete _m; + return TSkeleton_application::destroy(); +} + +bool TInstallmodule_app::preload_mask() +{ + if (!test_database()) + { + _m->set(F_DEFAULTSDATA," "); + _m->disable(F_DEFAULTSDATA); + } + else + { + if (load_default_data()) + _m->set(F_DEFAULTSDATA,"X"); + } + return TRUE; +} + +bool TInstallmodule_app::some_to_load() +{ + return _m->get_bool(F_DEFAULTSDATA); +} + +void TInstallmodule_app::main_loop() +{ + bool ok =TRUE; + + if (modal()) + { + preload_mask(); + if (_m->run()!=K_QUIT) + { + if (some_to_load()) + { + install_firm(); + install_com(); + } + } + else + ok =FALSE; + } + if (ok) + post_installer(); +} + +bool TInstallmodule_app::install_firm() +{ + // ciclo su ogni ditta + TStd_filename txtfile(module_code()); + txtfile << "tab.txt"; + if (txtfile.check()) + { + TLocalisamfile ditte(LF_NDITTE); + for (ditte.first(); !ditte.eof() ; ditte.next()) + { + const int newditta=ditte.get_int("CODDITTA"); + if (prefix().exist(newditta)) + { + set_firm(newditta); + TSystemisamfile tab(LF_TAB); + tab.load(txtfile); + } + } + // carica le tabelle nei file di default + TLocalisamfile tampone(LF_TAB); + TSystemtempfile tabstd(LF_TAB); + TFilename stdtabname(prefix().get_studio()); + stdtabname << "STD\\lf0005.txt"; + tabstd.load(txtfile); + tabstd.load(stdtabname); + tabstd.set_autodel(); + TFilename tempfile; + tempfile.temp(); + + // riconverte le macro delle date + tabstd.dump(tempfile); + TScanner scan(tempfile); + FILE *dest=fopen((const char *)stdtabname,"w"); + while (TRUE) { + TString &line=scan.line(); + if (line.empty()) break; + + int pos=(line.find("-0000")); + while (pos >= 0 ) + { + line.overwrite("%yr%",pos+1); + pos=(line.find("-0000")); + } + line << '\n' ; + fputs((const char * )line,dest); + } + fclose(dest); + } + return TRUE; +} + +bool TInstallmodule_app::install_com() +{ + bool ok=TRUE; + TStd_filename txtfile(module_code()); + txtfile << "tabcom.txt"; + if (txtfile.check()) + { + TSystemisamfile tabcom(LF_TABCOM); + tabcom.load(txtfile); + } + return ok; +} + +void TInstallmodule_app::run(int argc, char* argv[]) +{ + TScanner scanner("prassi.aut"); + + const int m = module_number(); + for (int aut = 0; aut<=m; aut++) + { + scanner.line(); + } + _modcode=scanner.token().left(2); + _modname=scanner.token().mid(3); + + TString title("Installazione "); + title << module_name(); + TSkeleton_application::run(argc, argv,(const char* )title); +} + + +void TInstallmodule_app::set_tab_app(const char * appname) +{ + TConfig ditta(CONFIG_DITTA); + ditta.set_paragraph(module_code()); + ditta.set("TabApp",appname); +} + diff --git a/include/inst.h b/include/inst.h new file mode 100755 index 000000000..2cdb915e2 --- /dev/null +++ b/include/inst.h @@ -0,0 +1,71 @@ +#ifndef __INST_H +#define __INST_H + +#ifndef __APPLICAT_H +#include +#endif + +#ifndef __ISAM_H +#include +#endif + +#ifndef __MASK_H +#include +#endif + +// classe provvisoria per i system file temporanei, ovvero file temporanei con +// caricamento/scaricamento +class TSystemtempfile : public TIsamtempfile +{ +public: +//bool getlcf( long flev); // @parm livello archivi di partenza della convesione + + int load(const char* from, char fs = '|', char fd = '\0', char rs = '\n', bool vis = TRUE, bool extended = FALSE) ; + + int dump(const char* to, int nkey = 1, char fs = '|', char fd = '\0', char rs = '\n', bool vis = TRUE, bool withdeleted = FALSE); + + TSystemtempfile(int logicnum) : + TIsamtempfile(logicnum,NULL) {} +}; + +class TStd_filename : public TFilename +{ +public: + bool check(bool verbose=FALSE,const char * name=NULL); + ~TStd_filename () {} + TStd_filename () : TFilename(){} + TStd_filename (const char * n) : TFilename(n){} +}; + +class TInstallmodule_app: public TSkeleton_application +{ + bool _is_first_inst , _test_database ; + +protected: + TMask * _m ; + TString _modcode,_modname; + +protected: + void set_tab_app(const char * appname); + bool test_database() {return _test_database;} + const char * module_name() const {return _modname;} + const char * module_code() const {return _modcode;} + + virtual bool load_default_data() const { return TRUE;} + virtual bool modal() const {return TRUE;} + virtual int module_number() const pure; + virtual bool preload_mask(); + virtual bool post_installer() {return TRUE;} + virtual bool some_to_load(); + + virtual bool install_com() ; // setta i dati comuni + virtual bool install_firm() ; // setta i dati ditta + + virtual void main_loop() ; + virtual bool create(); + virtual bool destroy(); +public: + void run(int argc, char* argv[]); +}; + +#endif diff --git a/include/modaut.h b/include/modaut.h index fce123f15..aeed130a2 100755 --- a/include/modaut.h +++ b/include/modaut.h @@ -38,6 +38,7 @@ #define PRAUT 36 #define SVAUT 38 #define MRAUT 39 +#define DLAUT 40 #define ESAUT 47 #define ENDAUT 48 diff --git a/include/mov.h b/include/mov.h index 63c0d75d1..0cfcbd1e7 100755 --- a/include/mov.h +++ b/include/mov.h @@ -38,8 +38,12 @@ #define MOV_DATA74TER "DATA74TER" #define MOV_CODPAG "CODPAG" #define MOV_INVIATO "INVIATO" -#define MOV_INVIVA "INVIVA" -#define MOV_SCARCON "SCARCON" +#define MOV_INVIVA "INVIVA" +#define MOV_SCARCON "SCARCON" +#define MOV_DPROVV "DPROVV" +#define MOV_DANNO "DANNO" +#define MOV_DCODNUM "DCODNUM" +#define MOV_DNDOC "DNDOC" #define NUMREG_PROVVISORIO 999999L diff --git a/include/msksheet.cpp b/include/msksheet.cpp index f6e39cee2..e1a131bc5 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -294,6 +294,8 @@ public: void set_column_width(const int col, const int width) const; // @cmember Setta il titolo della colonna void set_column_header(const int col, const TString& header) const; + // @cmember Getta il titolo della colonna + const char* get_column_header(const int col) const; // @cmember Setta l'allineamento di una colonna void set_column_justify(int col, bool right); // @cmember Permette di abilitare/disabilitare una singola cella @@ -1441,8 +1443,12 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) case K_F9: if (_edit_field != NULL) { + const bool spork = _edit_field->dirty(); // TBT + notify_change(); copy_cell2field(); + + _edit_field->set_dirty(_cell_dirty = spork); // TBT } case K_F11: if (_check_enabled && active()) @@ -1469,6 +1475,7 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev) sheet_mask().notify_focus_field(_edit_field->dlg()); ok = _edit_field->on_key(k); + _cell_dirty = _edit_field->dirty(); // TBT if (!ok && k == K_F9) // Ricerca non completata? { @@ -2056,11 +2063,16 @@ void TSpreadsheet::set_column_header(const int col, const TString& header) cons { XI_OBJ* column = find_column(col); if (column) - { xi_set_text(column, (char *)(const char *)header ); - //RCT r; xi_get_rect(column, &r); - //xi_set_column_width(column, (r.right-r.left+1) / CHARX); // Force redraw - } +} + +const char* TSpreadsheet::get_column_header(const int col) const +{ + const char* txt = ""; + XI_OBJ* column = find_column(col); + if (column) + txt = xi_get_text(column, NULL, -1); + return txt; } void TSpreadsheet::set_column_justify(int col, bool right) @@ -2740,6 +2752,13 @@ void TSheet_field::set_column_header( const int col, const TString& header ) con s->set_column_header(col, header); } +const char* TSheet_field::get_column_header( const int col) const +{ + TSpreadsheet* s = (TSpreadsheet*)_ctl; + return s->get_column_header(col); +} + + void TSheet_field::set_column_justify(int col, bool right) { if (col < FIRST_FIELD) diff --git a/include/msksheet.h b/include/msksheet.h index 476de8468..a7fa34bea 100755 --- a/include/msksheet.h +++ b/include/msksheet.h @@ -235,6 +235,8 @@ public: void set_column_width( const int col, const int width ) const; // @cmember Setta il titolo della colonna void set_column_header( const int col, const TString& header ) const; + // @cmember Getta il titolo della colonna + const char* get_column_header(const int col) const; // @cmember Setta l'allineamento della colonna void set_column_justify(int col, bool right); // @cmember Setta il colore dello sfondo e del testo di una o tutte le righe diff --git a/include/relapp.cpp b/include/relapp.cpp index ec371b334..f9bd8e067 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -1146,16 +1146,13 @@ int TRelation_application::rewrite(const TMask& m) // // @rdesc Ritorna se il record e' stato eliminato bool TRelation_application::relation_remove() - // @comm Se la maschera e' in MODE_MOD non e' possibile cancellare il record e viene // emesso un di errore. { CHECK(_mask->edit_mode(), "You can call remove in edit mode only"); TRelation& r = *get_relation(); - r.restore_status(); - if (protected_record(r)) return message_box("Elemento non eliminabile"); @@ -1163,7 +1160,7 @@ bool TRelation_application::relation_remove() { r.restore_status(); const bool ok = remove(); - if (ok) + if (ok || is_transaction()) set_limits(); else return error_box("Errore di cancellazione %d", r.status()); @@ -1181,21 +1178,24 @@ bool TRelation_application::protected_record(TRelation &r) bool TRelation_application::remove() { - TMask &m=*_mask; int err = get_relation()->remove(); - for (int i = 0; i < m.fields(); i++) + if (err == NOERR) { - if (m.fld(i).is_sheet()) + const int maxf = _mask->fields(); + for (int i = 0; i < maxf; i++) { - TSheet_field& f = (TSheet_field& )m.fld(i); - if (f.record() && !f.external_record()) - err |= f.record()->remove(); + if (mf.is_sheet()) + { + TSheet_field& f = (TSheet_field&)mf; + if (f.record()&& !f.external_record()) + err |= f.record()->remove(); + } } } if (err == NOERR) { - m.set_mode(NO_MODE); - mask2mail(m); + _mask->set_mode(NO_MODE); + mask2mail(*_mask); } return err == NOERR; } @@ -1285,7 +1285,7 @@ void TRelation_application::main_loop() if (k <= MAX_KEYS && find(k)) modify_mode(); else - k = K_QUIT; + k = K_QUIT; // Siamo sicuri? insert_mode() } else { @@ -1325,12 +1325,13 @@ void TRelation_application::main_loop() if (trovato) { modify_mode(); - warning_box("Elemento gia' presente"); if (is_transaction()) { _curr_transaction=TRANSACTION_MODIFY; - _curr_trans_mode = TM_INTERACTIVE; // switch to interactive mode + // _curr_trans_mode = TM_INTERACTIVE; // Siamo sicuri??? } + else + warning_box("Elemento gia' presente"); } else insert_mode(); @@ -1644,7 +1645,8 @@ bool TRelation_application::load_transaction() _curr_trans_mode = toupper(cnf.get("Mode")[0]); _curr_trans_from = cnf.get("From"); long firm = cnf.get_long("Firm"); - if (firm > 0 && firm != get_firm()) + if (firm > 0) + { bool ok = set_firm(firm); if (ok) @@ -1887,4 +1889,3 @@ bool TRelation_application::mask2mail(const TMask& m) } return ok; } - diff --git a/mr/mr1100.cpp b/mr/mr1100.cpp index 0306a20b7..2f09c220a 100755 --- a/mr/mr1100.cpp +++ b/mr/mr1100.cpp @@ -309,7 +309,7 @@ bool TRepgen_mask::test_tipodoc_num(const TSheet_field &sheet_num ,const TShee } } if (!ok) - return error_box("Il tipo '%s' non appartiene a nessuna delle numerazioni scelte",(const char * )tipo); + return error_box("Il tipo '%s' non appartiene a nessuna delle numerazioni scelte",(const char*)tipo); } return TRUE; } @@ -781,29 +781,49 @@ void TMRP_repgen::set_buckets_description() TString descr; TDate fd = _m->get_date(F_DADATA); TDate td = _m->get_date(F_ADATA); - TDate wd; + + TConfig ini(CONFIG_DITTA, "mr"); + const bool week_complete = ini.get_bool("WEEKCOMPLETE"); + int bucket_size = _m->get_int(F_BUCKET) * 7; if (bucket_size < 7) bucket_size = 7; + int weekd, yeard; + const short first_id = 3; const short last_id = 15; --fd; - descr.format("\nAl %s", (const char*)fd); + descr.format("\nAl %s", (const char*)fd); + if (bucket_size == 7) + { + fd.get_week_year(weekd, yeard, week_complete); + descr << "\nSett. " << weekd << ' ' << yeard; + } _form->find_field('B', odd_page, first_id).set_col_head(descr); + TDate wd; for (;fd <= td;) { ++fd; - descr.format("Da %s\nAl ",(const char*)fd); + descr.format("Dal %s\nAl ", (const char*)fd); fd += bucket_size-1; wd = fd; - descr << (const char*) fd; + descr << (const char*)fd; const short id = first_id+_m->round_date(wd,FALSE)+1; - if (id > last_id) - continue; + if (id >= last_id) + break; + if (bucket_size == 7) + { + wd.get_week_year(weekd, yeard, week_complete); + descr << "\nSett. " << weekd << ' ' << yeard; + } _form->find_field('B', odd_page, id).set_col_head(descr); } - ++td; - descr.format("Dal %s", (const char*)td); + descr.format("Dal %s", (const char*)wd); + if (bucket_size == 7) + { + wd.get_week_year(weekd, yeard, week_complete); + descr << "\n\nSett. " << weekd << ' ' << yeard; + } _form->find_field('B', odd_page, last_id).set_col_head(descr); } @@ -994,12 +1014,12 @@ void TMRP_repgen::main_loop() const int fl = printer().formlen(); int rows[4]; // Righe orizzontali - rows[0] = hh-3; + rows[0] = hh-4; rows[1] = hh; rows[2] = fl; rows[3] = 0; - _form->genera_intestazioni(odd_page, hh-2); - _form->genera_fincatura(odd_page, hh-3, fl, rows); + _form->genera_intestazioni(odd_page, hh-3); + _form->genera_fincatura(odd_page, hh-4, fl, rows); // stampa if (_form->cursor()->items() > 0) diff --git a/mr/mr1100a.frm b/mr/mr1100a.frm index 7c39720fc..48de3e6ec 100755 --- a/mr/mr1100a.frm +++ b/mr/mr1100a.frm @@ -2,7 +2,7 @@ // ed il carico articoli nel tempo ( non richiesta ma messa per completezza ) -USE 132 +USE LF_MRPREPORT JOIN LF_ANAMAG INTO CODART==CODART JOIN IMP ALIAS 201 INTO CODTAB==IMPIANTO JOIN LNP ALIAS 202 INTO CODTAB==LINEA diff --git a/mr/mr2100.cpp b/mr/mr2100.cpp index caa134036..7a7b44d97 100755 --- a/mr/mr2100.cpp +++ b/mr/mr2100.cpp @@ -22,13 +22,13 @@ // TMRP_record /////////////////////////////////////////////////////////// -void TMRP_record::add_ref(TMRP_docref * ref, TMRP_docrefs ** refs) +void TMRP_record::add_ref(TMRP_docref * ref, TMRP_docrefs* &refs) { - if (ref) + if (ref != NULL) { - if (!*refs) - *refs = new TMRP_docrefs(); - (*refs)->add(ref); + if (refs == NULL) + refs = new TMRP_docrefs(); + refs->add(ref); } } @@ -42,21 +42,21 @@ const real& TMRP_record::add_gross_req(const real & val, TMRP_internalref * ref) const real& TMRP_record::add_gross_req(const real & val, TMRP_docref * ref) { - add_ref(ref, &_requirements); + add_ref(ref, _requirements); _gross_requirement += val; return _gross_requirement; } const real& TMRP_record::add_sched_rec(const real & val, TMRP_docref * ref) { - add_ref(ref, &_scheduls); + add_ref(ref, _scheduls); _sched_receipts += val; return _sched_receipts; } const real& TMRP_record::add_planned_ord(const real & val, TMRP_docref * ref) { - add_ref(ref, &_plans); + add_ref(ref, _plans); _planned_orders += val; return _planned_orders; } @@ -613,18 +613,31 @@ TRiga_ordine& TRiga_ordine::operator=(TToken_string& r) TRiga_ordine& TRiga_ordine::operator+=(TRiga_ordine& r) { CHECK(compare(r) == 0, "Can't add incompatible order line"); - real qta = get(F_QUANTITA - FIRST_FIELD); - qta += real(r.get(F_QUANTITA - FIRST_FIELD)); - qta.round(5); - add(qta.is_zero() ? " " : qta.string(), F_QUANTITA - FIRST_FIELD); + + const real q = r.get(F_QUANTITA - FIRST_FIELD); + if (!q.is_zero()) + { + real qta = get(F_QUANTITA - FIRST_FIELD); + qta += q; qta.round(5); + add(qta.is_zero() ? " " : qta.string(), F_QUANTITA - FIRST_FIELD); + } return *this; } -TRiga_ordine::TRiga_ordine(const TDate& datadoc, const TDate& datacons, long forn, const TMRP_line& line, int bucket, const real & price) +TRiga_ordine::TRiga_ordine(const TDate& datadoc, const TDate& datacons, long forn, const TMRP_line& line, int bucket, const real& price) : TToken_string(128) { + // Determino il tipo di ordine (PROD/ACQ) + bool art_prod = FALSE; + const TCodice_articolo& codart = line.articolo(); + const TRectype& rec=cache().get(LF_DIST, codart); + if (rec.empty()) + art_prod = cache().get(LF_ANAMAG, codart).get_bool(ANAMAG_ARTPROD); + else + art_prod = rec.get_bool("ARTPROD"); + add(" ",F_SELECTED - FIRST_FIELD); - add("F",F_ORD_TYPE - FIRST_FIELD); + add(art_prod ? "P" : "F", F_ORD_TYPE - FIRST_FIELD); add(datadoc.string(),F_DATADOC - FIRST_FIELD); add(datacons.string(),F_DATACONS - FIRST_FIELD); add(line.codclifor() ? line.codclifor() : forn, F_FORNITORE - FIRST_FIELD); @@ -1210,50 +1223,47 @@ int TMatResMask::add_order_line(long forn, const TMRP_line& line, int bucket) TSheet_field& s = sfield(F_ORDINI); TString_array& a = s.rows_array(); - real q(line.net_requirement(bucket)); + real q = line.net_requirement(bucket); // Fabbisogno netto TMRP_docrefs * pl_orders=NULL,*sc_orders=NULL; if (get_bool(F_RESCHEDULING)) sc_orders = line.record(bucket).scheduls_refs(); pl_orders = line.record(bucket).plans_refs(); // le proposte di rescheduling sono da mettere su uno sheet a parte... - int nref = pl_orders ? nref = pl_orders->items() : 0; - real qtaplan; - do { + int nref = pl_orders != NULL ? pl_orders->items() : 0; + real qtaplan; // Quantità da pianificare + do + { TRiga_ordine* r = new TRiga_ordine(datadoc, datacons, forn, line, bucket, ZERO); + // Setta un codice numerazione (provvisorio) in base al tipo di ordine + const char ot = *r->get(F_ORD_TYPE - FIRST_FIELD); + r->add(get(ot == 'F' ? F_NUM_FORN : F_NUM_PROD) , F_DOCCODNUM - FIRST_FIELD); + nref--; if (nref >= 0) - { - const TString & codnum = pl_orders->get_ref(nref).codnumdoc(); - if (codnum == get(F_NUM_PROD) - || codnum == get(F_NUM_FORN)) + { + const TString& codnum = pl_orders->get_ref(nref).codnumdoc(); + if (codnum == get(F_NUM_PROD) || codnum == get(F_NUM_FORN)) { qtaplan = pl_orders->get_ref(nref).qta_residua(); qtaplan.round(5); q.round(5); -// if (qtaplan > q ) -// { - qtaplan = q - qtaplan; // tengo solo in parte questo ordine ... - r->add(pl_orders->get_ref(nref).annodoc() , F_DOCANNODOC - FIRST_FIELD); - r->add(pl_orders->get_ref(nref).codnumdoc() , F_DOCCODNUM - FIRST_FIELD); - r->add(pl_orders->get_ref(nref).numdoc() , F_DOCNUM - FIRST_FIELD); - r->add(pl_orders->get_ref(nref).numrig() , F_DOCNRIGA - FIRST_FIELD); - r->add(qtaplan.is_zero() ? " " : qtaplan.string(), F_QUANTITA - FIRST_FIELD); - r->add(pl_orders->get_ref(nref).datacons().string() , F_DATACONS - FIRST_FIELD); - r->add(pl_orders->get_ref(nref).datadoc().string(), F_DATADOC - FIRST_FIELD); -// } else { -// q = q - qtaplan; // genero solo una parte del nuovo ordine... -// r->add(q.string() , F_QUANTITA - FIRST_FIELD); -// qtaplan = ZERO; -// } + qtaplan = q - qtaplan; // tengo solo in parte questo ordine ... + r->add(pl_orders->get_ref(nref).annodoc() , F_DOCANNODOC - FIRST_FIELD); + r->add(pl_orders->get_ref(nref).codnumdoc() , F_DOCCODNUM - FIRST_FIELD); + r->add(pl_orders->get_ref(nref).numdoc() , F_DOCNUM - FIRST_FIELD); + r->add(pl_orders->get_ref(nref).numrig() , F_DOCNRIGA - FIRST_FIELD); + r->add(qtaplan.is_zero() ? " " : qtaplan.string(), F_QUANTITA - FIRST_FIELD); + r->add(pl_orders->get_ref(nref).datacons().string() , F_DATACONS - FIRST_FIELD); + r->add(pl_orders->get_ref(nref).datadoc().string(), F_DATADOC - FIRST_FIELD); q = ZERO; } else r->add(" " , F_QUANTITA - FIRST_FIELD); - } else { + } + else + { r->add(q.is_zero() ? " " : q.string() , F_QUANTITA - FIRST_FIELD); qtaplan = ZERO; } -// if ((nref >= 0 && (!qtaplan.is_zero() || get_bool(F_ALLORDERS))) || // correggo un vecchio ordine ... -// (nref < 0 && !q.is_zero())) // ... o ne genero uno nuovo if ((nref >= 0 && (!qtaplan.is_zero() || get_bool(F_ALL_ORDERSCHANGES))) || // correggo un vecchio ordine ... (nref < 0 && !q.is_zero()) || // ... o ne genero uno nuovo get_bool(F_ALL_MRPLINES)) // ...o voglio tutte le righe @@ -1269,7 +1279,8 @@ int TMatResMask::add_order_line(long forn, const TMRP_line& line, int bucket) // RIGA GIA' PRESENTE TRiga_ordine& riga = (TRiga_ordine&)a[pos]; const TString & codnum = riga.get(F_DOCCODNUM - FIRST_FIELD); - if (!(codnum != get(F_NUM_PROD) && codnum != get(F_NUM_FORN))) +// if (!(codnum != get(F_NUM_PROD) && codnum != get(F_NUM_FORN))) + if (codnum == get(F_NUM_PROD) || codnum == get(F_NUM_FORN)) // Guy was here! riga += *r; delete r; const TString & qta2or = riga.get(F_QUANTITA - FIRST_FIELD); @@ -1459,6 +1470,7 @@ TMatResMask::TMatResMask() : TCalendar_mask("mr2100a"), _sel_color(sfield(F_ORDI { _condv = NULL; TSheet_field& sf = sfield(F_ORDINI); + livelli_giacenza().set_sheet_columns(sf, F_LIV1); TConfig ini(CONFIG_DITTA, "mg"); @@ -1860,7 +1872,7 @@ bool TMatResPlanning::load_gross_requirements() const int year_fr = date_fr.year() - (m.get_bool(F_DOC_YEAR_PREC) ? 1 : 0); const int year_to = date_to.year(); - const bool master = m.get(F_ORC_MASTER)[0] == 'M'; + const bool master = m.get(F_ORC_MASTER)[0] == 'M'; // Master Plan o Ordine Cliente // azzera l'array _requirements const bool nomag = m.get_bool(F_NOMAG); const bool nodep = m.get_bool(F_NODEP); @@ -2389,6 +2401,7 @@ bool TMatResPlanning::build_orders() } for (int b = line.last_bucket(); b >= 0; b--) { +/* const TMRP_record & rrr = line.record(b); const real r0 = line.gross_requirement(b); const real r1 = line.planned_orders(b); @@ -2400,7 +2413,8 @@ bool TMatResPlanning::build_orders() line.planned_orders(b)>0 || line.sched_receipts(b)>line.gross_requirement(b)) m.add_order_line(forn, line, b); - else + else +*/ m.add_order_line(forn, line, b); } } @@ -3040,6 +3054,16 @@ bool TMatResPlanning::emit_orders() rdoc.put(RDOC_DESCR, riga.get(sf.cid2index(F_DESCART))); if (!divide_by_date) rdoc.put(RDOC_DATACONS,datacon.string()); + + TString16 cod; + if (forn > 0) + { + cod.format("F|%ld", forn); + cod = cache().get(LF_CFVEN, cod, CFV_ASSFIS); + } + if (cod.empty()) + cod = cache().get(LF_ANAMAG, riga.get(sf.cid2index(F_ARTICOLO)), ANAMAG_CODIVA); + rdoc.put(RDOC_CODIVA, cod); riga.add("X",sf.cid2index(F_OK)); } @@ -3246,6 +3270,7 @@ void print_header(TPrinter& pr) row.put(format); pr.setheaderline(0,row); } + void print_footer(TPrinter& pr) { TPrintrow row; diff --git a/mr/mr2100.h b/mr/mr2100.h index dd0b5b0c0..466064ff1 100755 --- a/mr/mr2100.h +++ b/mr/mr2100.h @@ -26,7 +26,7 @@ class TMRP_record : public TObject TMRP_docrefs *_requirements; // gross.req. da documenti esterni TMRP_internalrefs *_internal_req; // gross.req. da esplosioni interne - void add_ref(TMRP_docref * ref, TMRP_docrefs ** refs); + void add_ref(TMRP_docref * ref, TMRP_docrefs* &refs); public: const real& on_hand() const { return /*_on_hand <= ZERO ? ZERO :*/_on_hand ; } const real& net_requirement() const { return _net_requirement; } diff --git a/mr/mr2200.cpp b/mr/mr2200.cpp index 605abc64a..a736cd8b5 100755 --- a/mr/mr2200.cpp +++ b/mr/mr2200.cpp @@ -217,6 +217,7 @@ bool TSave_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) else message_box("Controllare il tabulato eccezioni."); } + break; default: TPlann_sub_mask::on_field_event(o,e,jolly); } @@ -457,10 +458,10 @@ static long table_items(const char* tab) bool TPlanning_mask::elabora() { - TSheet_field& s = sfield(F_ARTICOLI); clear_sheets(); if (carica_documenti()) { + TSheet_field& s = sfield(F_ARTICOLI); fill_sheet(); const bool some_lines=s.items() > 0; enable(-G_PREPROCESS, !some_lines); @@ -970,7 +971,7 @@ int TPlanning_mask::insert_propose(bool verbose) { add_or_sub_propose(+1); const long new_rows=_proposed_articles.items(); - TSheet_field& sf = sfield(F_ARTICOLI); + TDate firstdate(get_date(F_ADATA)); for (long new_row=0; new_row < new_rows; new_row++) { @@ -1097,7 +1098,7 @@ void TPlanning_mask::add_or_sub_propose(char sign, bool scheduled) } TToken_string& artrow = sf.row(art_row); const int lastbuck = _proposed_articles[new_row].last_bucket(); - //TDate data_buck; + for (int nbucket=0; nbucket<=lastbuck ; nbucket++) { int b = bucket( _proposed_articles[new_row].time(nbucket).date() ); @@ -1224,21 +1225,22 @@ void TPlanning_mask::propose(int row) const bool useextrahours=get_bool(F_USEEXTRAHRS_MSP) ; set(F_USENONSTDLIN_CRP ,useextralines ? "X" : ""); set(F_USEEXTRAHRS_CRP ,useextrahours ? "X" : ""); - if (get(F_RECALC_TYPE)=="1") + const TString& rt = get(F_RECALC_TYPE); + if (rt=="1") propose_1stJIT(_first_fit_logic,TRUE,TRUE, row); - else if (get(F_RECALC_TYPE)=="1_INFH") + else if (rt=="1_INFH") propose_1stJIT(_first_fit_logic,TRUE,FALSE, row); - else if (get(F_RECALC_TYPE)=="1_INF") + else if (rt=="1_INF") propose_1stJIT(_first_fit_logic,FALSE,FALSE, row); - else if (get(F_RECALC_TYPE)=="JIT") + else if (rt=="JIT") propose_1stJIT(_JIT_logic,TRUE,TRUE, row); - else if (get(F_RECALC_TYPE)=="JIT_INFH") + else if (rt=="JIT_INFH") propose_1stJIT(_JIT_logic,TRUE,FALSE, row); - else if (get(F_RECALC_TYPE)=="JIT_INF") + else if (rt=="JIT_INF") propose_1stJIT(_JIT_logic,FALSE,FALSE, row); - else if (get(F_RECALC_TYPE)=="UNIL") + else if (rt=="UNIL") propose_1stJIT(_uniform_logic,TRUE,FALSE, row); - else if (get(F_RECALC_TYPE)=="UNI") + else if (rt=="UNI") propose_1stJIT(_uniform_logic,FALSE,FALSE, row); // aggiorna lo sheet delle capacita' } @@ -1655,7 +1657,7 @@ TCRP_line *TPlanning_mask::compute_capacity(TLinea_prod &lineaprod, bool useextr TMRP_calendar & cal = TMRP_time::get_calendar("", codlin); TMRP_calendar & cal_imp = TMRP_time::get_calendar(codimp); TMRP_calendar & cal_firm = TMRP_time::get_calendar(); - CHECK(_capacities.find(lineaprod,FALSE)==NULL,"Errore: impossibile ricalcolare la capacita' di una linea produttiva"); + CHECK(_capacities.find(lineaprod,FALSE)==NULL,"Errore: impossibile ricalcolare la capacità di una linea produttiva"); TCRP_line *crpline_lin,*crpline_imp,*crpline_firm; crpline_lin =_capacities.find(lineaprod, "", 0L,TRUE); @@ -1691,13 +1693,13 @@ TCRP_line *TPlanning_mask::compute_capacity(TLinea_prod &lineaprod, bool useextr if (human > ZERO) { crpline_lin->capacity(b).set_human(human); - crpline_imp->capacity(b).set_human(human+crpline_imp->capacity(b).human()); - crpline_firm->capacity(b).set_human(human+crpline_firm->capacity(b).human()); +// crpline_imp->capacity(b).set_human(human+crpline_imp->capacity(b).human()); +// crpline_firm->capacity(b).set_human(human+crpline_firm->capacity(b).human()); } if (human_imp > ZERO) { crpline_imp->capacity(b).set_human(human_imp+crpline_imp->capacity(b).human()); - crpline_firm->capacity(b).set_human(human_imp+crpline_firm->capacity(b).human()); +// crpline_firm->capacity(b).set_human(human_imp+crpline_firm->capacity(b).human()); } if (human_firm > ZERO) crpline_firm->capacity(b).set_human(human_firm+crpline_firm->capacity(b).human()); @@ -2058,6 +2060,16 @@ bool TPlanning_mask::do_test_art_row(int r, int first, int last, bool signal) // ********** // calcola la giacenza proiettata TCodice_articolo codart(curr_row.get(sf.cid2index(F_ARTICOLO))); + if (codart.blank()) // Controllo di DEBUG + { + if (signal) + { + error_box("Articolo nullo nella riga %d", r+1); + signal = FALSE; + } + return signal; + } + TArticolo_giacenza art(codart); TString16 liv; TString8 mag,imp,lin; @@ -2328,7 +2340,7 @@ bool TPlanning_mask::test_load_row(int r, bool signal) TString err; TDate d = starting_date() + long(days_per_bucket() * (b-1)); round_date(d); - err << "Riga " << c+1 << ": capacita' superata al " << d; + err << "Riga " << c+1 << ": capacità superata al " << d; beep(); signal =FALSE; xvt_statbar_set(err); @@ -2775,7 +2787,7 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol } break; case se_leave: - if (nriga < righe) + if (nriga >= 0 && nriga < righe) { const TToken_string &art_row= s.row(nriga); if (_curr_art_row != s.row(nriga)) @@ -2804,7 +2816,6 @@ bool TPlanning_mask::on_field_event(TOperable_field& o, TField_event e, long jol break; case F_LINEE: { - TSheet_field& s = (TSheet_field&)o; switch(e) { case se_query_add: @@ -3216,7 +3227,7 @@ void TPlanning_mask::init() sf.sheet_mask().hide(F_CODIMP); sf.sheet_mask().hide(F_DESCIMP); } - _week_complete = ini.get_bool("WEEKCOMPLETE", "mr", -1, TRUE); + _week_complete = ini.get_bool("WEEKCOMPLETE", "mr"); _standard_for = ini.get_long("CODFOR", "mr"); sfield(F_LINEE).disable(); // sfield(F_TESTE).disable(); @@ -3759,7 +3770,7 @@ void TPlanning_app::main_loop() mask().disable(F_TIPOCV); mask().disable(F_CATVEN_CV); } - while (mask().run()!=K_QUIT) ; + while (mask().run()!=K_QUIT) ; } int mr2200(int argc, char* argv[]) diff --git a/mr/mr2200b.frm b/mr/mr2200b.frm index 5724096a8..4de64bade 100755 --- a/mr/mr2200b.frm +++ b/mr/mr2200b.frm @@ -2,7 +2,7 @@ // e la stampa scheduling del bucket suddiviso per linee -USE 132 KEY 3 +USE LF_MRPREPORT KEY 3 JOIN LF_ANAMAG INTO CODART==CODART JOIN IMP ALIAS 201 INTO CODTAB==IMPIANTO JOIN LNP ALIAS 202 INTO CODTAB==LINEA @@ -73,103 +73,113 @@ SECTION BODY ODD 1 COLUMNWISE FIELD UM END - NUMERO 3 14 3 + NUMERO 3 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.0" "Bucket.0" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket Iniziale" PROMPT 10 1 "" + PICTURE ".2" FIELD QTAFIRST END - NUMERO 4 14 3 + NUMERO 4 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.1" "Bucket.1" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 1" PROMPT 11 1 "" + PICTURE ".2" FIELD QTA1 END - NUMERO 5 14 3 + NUMERO 5 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.2" "Bucket.2" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 2" PROMPT 12 1 "" + PICTURE ".2" FIELD QTA2 END - NUMERO 6 14 3 + NUMERO 6 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.3" "Bucket.3" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 3" PROMPT 13 1 "" + PICTURE ".2" FIELD QTA3 END - NUMERO 7 14 3 + NUMERO 7 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.4" "Bucket.4" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 4" PROMPT 14 1 "" + PICTURE ".2" FIELD QTA4 END - NUMERO 8 14 3 + NUMERO 8 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.5" "Bucket.5" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 5" PROMPT 15 1 "" + PICTURE ".2" FIELD QTA5 END - NUMERO 9 14 3 + NUMERO 9 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.6" "Bucket.6" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 6" PROMPT 16 1 "" + PICTURE ".2" FIELD QTA6 END - NUMERO 10 14 3 + NUMERO 10 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.7" "Bucket.7" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 7" PROMPT 17 1 "" + PICTURE ".2" FIELD QTA7 END - NUMERO 11 14 3 + NUMERO 11 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.8" "Bucket.8" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 8" PROMPT 18 1 "" + PICTURE ".2" FIELD QTA8 END - NUMERO 12 14 3 + NUMERO 12 14 2 BEGIN SPECIAL STRINGA INTESTAZIONE "Bucket.9" "Bucket.9" SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Bucket 9" PROMPT 19 1 "" + PICTURE ".2" FIELD QTA9 END END diff --git a/mr/mr2201.cpp b/mr/mr2201.cpp index 519c214f4..57395573f 100755 --- a/mr/mr2201.cpp +++ b/mr/mr2201.cpp @@ -11,6 +11,7 @@ // albero per le ricerche sulle dist static TDistinta_tree *_dist_tree=NULL; + TDistinta_tree &dist_tree() { if (!_dist_tree) @@ -66,10 +67,19 @@ bool TMSP_form::validate(TForm_item &cf, TToken_string &cmd) return TForm::validate(cf,cmd); } -TCRP_form::TCRP_form(TIsamtempfile * report) :TForm("mr2200b") +TCRP_form::TCRP_form(TIsamtempfile* report, TSheet_field& sf) + : TForm("mr2200b") { TRelation* rel = relation(); rel->replace(report); + + // Modifica oppportunamente le intestazioni dei bucket + TPrint_section& body = section('B', odd_page); + for (word i = 2; i < body.fields(); i++) + { + TForm_item& fi = body.field(i); + fi.set_col_head(sf.get_column_header(i+2)); + } const int hh = 7; const int fl = printer().formlen(); @@ -81,48 +91,31 @@ TCRP_form::TCRP_form(TIsamtempfile * report) :TForm("mr2200b") rows[3] = 0; genera_intestazioni(odd_page, hh-2); genera_fincatura(odd_page, hh-3, fl, rows); - } bool TCRP_form::validate(TForm_item &cf, TToken_string &cmd) { - TString s; - cmd.get(0,s); - if (s=="_USER") + TString val; + cmd.get(0,val); + if (val=="_USER") { - TRelation* rel = relation(); - cmd.get(1,s); - if (s=="CODART") + cmd.get(1,val); + if (val=="CODART") { - TString val; - const char type = rel->lfile().get("TIPO")[0]; - switch (toupper(type)) + const TRectype& curr = relation()->curr(); + const char type = curr.get_char("TIPO"); + switch (type) { - case 'D': - if (isupper(type)) - val << "Totale capacita'"; - else - val << " Totale carico "; - break; - case 'I': - if (isupper(type)) - val << " Capacita'"; - else - val << " Carico"; - val << " impianto " << rel->lfile().get("IMPIANTO"); - break; - case 'L': - if (isupper(type)) - val << " Capacita'"; - else - val << " Carico"; - val << " linea " << rel->lfile().get("LINEA"); - break; - default: - val << " Articolo "; - val << rel->lfile().get("CODART"); - val << " " << rel->lfile(LF_ANAMAG).get("DESCR"); - break; + case 'D': val = " Capacità totale"; break; + case 'd': val = " Carico totale"; break; + case 'I': val = " Capacità impianto "; val << curr.get("IMPIANTO"); break; + case 'i': val = " Carico impianto "; val << curr.get("IMPIANTO"); break; + case 'L': val = " Capacità linea "; val << curr.get("LINEA"); break; + case 'l': val = " Carico linea "; val << curr.get("LINEA"); break; + default: + val = curr.get("CODART"); + val << " " << relation()->curr(LF_ANAMAG).get("DESCR"); + break; } cf.set(val); } @@ -596,7 +589,7 @@ void TCRP_line::fill_capacity_row(TToken_string& row, char load_type, bool perce { row.add(codimp(),F_CODIMPCRP -FIRST_FIELD); row.add(codlin(),F_CODLINCRP -FIRST_FIELD); - row.add("Capacita'",F_CODARTCRP -FIRST_FIELD); + row.add("Capacità",F_CODARTCRP -FIRST_FIELD); row.add(percent ? "%" : (load_type == '$' ? " $ " :( load_type == 'P' ? "Pz." : "ore")),F_LUM -FIRST_FIELD); diff --git a/mr/mr2201.h b/mr/mr2201.h index bddbb8f59..024039425 100755 --- a/mr/mr2201.h +++ b/mr/mr2201.h @@ -88,7 +88,7 @@ class TCRP_form : public TForm protected: bool validate(TForm_item &cf, TToken_string &s); public: - TCRP_form (TIsamtempfile * rep); + TCRP_form (TIsamtempfile* rep, TSheet_field& sf); }; class TMSP_constraints : public TMRP_array diff --git a/mr/mr2202.cpp b/mr/mr2202.cpp index 05af62563..204fd81ea 100755 --- a/mr/mr2202.cpp +++ b/mr/mr2202.cpp @@ -43,7 +43,6 @@ void TPlanning_mask::print_exceptions(TExceptions_array &excepts) void TPlanning_mask::print_except_header(TPrinter& pr) { - TString format; TPrintrow row; print_header(pr); row.put("@48G@BSTAMPA TABULATO ECCEZIONI DA M.S.P."); @@ -55,7 +54,7 @@ void TPlanning_mask::print_except_header(TPrinter& pr) void TPlanning_mask::print_articles(int from_col, int num_cols, const char * row_filter) { - TString repname("mr2200"); + const char* repname = "mr2200"; TSheet_field& sf = sfield(F_ARTICOLI); const int nrows=sf.items(); @@ -63,7 +62,7 @@ void TPlanning_mask::print_articles(int from_col, int num_cols, const char * row TString8 codimp,codlin; TProgind pi(nrows, format("Stampa %s...",get_bool(F_MSCHEDULEPLAN)? "Master Schedule Plan":"pianificazione ordini")); - char block='\0'; + const int a_buck0 = sf.cid2index(F_BUCKET0); for (int r=0; rcurr(); + TString8 codimp,codlin; TString codart; + + TSheet_field& sf = sfield(F_LINEE); + const int nrows=sf.items(); TProgind pi(nrows, format("Stampa %s...",(*get(F_LOADTYPE)=='M')? "carico macchina":"carico uomo")); const int a_buck0 = sf.cid2index(F_LBUCKET0); - char block='\0'; for (int r=0; r curr(); record.zero(' '); codimp=row.get(sf.cid2index(F_CODIMPCRP)); codlin=row.get(sf.cid2index(F_CODLINCRP)); @@ -213,8 +212,8 @@ void TPlanning_mask::print_capacities() record.put("IMPIANTO", codimp); record.put("LINEA", codlin); record.put("CODART", codart); - char type('D'); - if (!codart.blank()) + char type = 'D'; + if (!codart.blank() && codart != "Capacità" && codart != "Carico") type = 'A'; else if (!codlin.blank()) type = 'L'; @@ -230,34 +229,29 @@ void TPlanning_mask::print_capacities() TString16 campo; for (int b = LAST_BUCKET; b >= 0; b--) { - switch(b) - { - case 0: - campo = "QTAFIRST"; break; - case LAST_BUCKET: - campo = "QTALAST"; break; - default: - campo.format("QTA%d", b); - } - record.put(campo, row.get(sf.cid2index(F_LBUCKET0+b*2))); + switch(b) + { + case 0: campo = "QTAFIRST"; break; + case LAST_BUCKET: campo = "QTALAST"; break; + default: campo.format("QTA%d", b); break; + } + record.put(campo, row.get(a_buck0+b)); } report->write(); pi.addstatus(1); } -// delete report; -// TIsamtempfile * report = new TIsamtempfile(LF_MRPREPORT,repname, FALSE, FALSE ); - TCRP_form form(report); // stampa + TCRP_form form(report, sf); + if (form.cursor()->items() > 0) - form.print(); + form.print(); // report non va cancellato, poiche' ne viene fatta la sostituzione nella relazione del form // quindi la delete viene gia' fatta alla distruzione di _form } - -bool TPlanning_mask::find_exceptions(TExceptions_array &e, bool anticipi, bool posticipi, bool extra, bool stockbreak, bool codemiss, bool verbose) +bool TPlanning_mask::find_exceptions(TExceptions_array &e, bool anticipi, bool posticipi, bool extra, + bool stockbreak, bool codemiss, bool verbose) { - e.destroy(); if (!get_bool(F_RESCHEDULING)) { @@ -338,34 +332,34 @@ void TMRP_line::reset_excepts() bool TMRP_line::find_ad_excepts(bool anticipi, bool posticipi, TExceptions_array &e) { bool some=FALSE; - real totplan,movable,diff; // PER OGNI BUCKET ... - int last(last_bucket()), first=0; + const int last = last_bucket(); + int first = 0; for (int nbucket = 0; nbucket <= last; nbucket++) { - const real & sr=sched_receipts(nbucket); - const real & ro=resched_orders(nbucket); - const real & uo=unsched_orders(nbucket); - const real & pl=planned_orders(nbucket); - totplan = planned_orders(nbucket) - sched_receipts(nbucket) - resched_orders(nbucket) + unsched_orders(nbucket); - if (totplan.sign() > 0) + const real& sr=sched_receipts(nbucket); + const real& ro=resched_orders(nbucket); + const real& uo=unsched_orders(nbucket); + const real& pl=planned_orders(nbucket); + real totplan = pl - sr - ro + uo; + if (totplan > ZERO) { for (int pivot = first; totplan.sign() > 0 && pivot <= last; pivot++) if (nbucket != pivot) { - const real & sr=sched_receipts(pivot); - const real & ro=resched_orders(pivot); - const real & uo=unsched_orders(pivot); - const real & pl=planned_orders(pivot); - movable = sched_receipts(pivot); + const real& srp=sched_receipts(pivot); + const real& rop=resched_orders(pivot); + const real& uop=unsched_orders(pivot); + const real& plp=planned_orders(pivot); + real movable = srp; // vecchia logica : posticipo solo se non devo poi ripianificare il pivot //if (nbucket > pivot) // nuova logica: posticipo o anticipo solo se non devo poi ripianificare il pivot - movable -= planned_orders(pivot); - movable -= unsched_orders(pivot); - if (movable.sign() > 0) // + movable -= plp; + movable -= uop; + if (movable > ZERO) // { first = pivot; - diff = fnc_min(movable, totplan); + const real diff = fnc_min(movable, totplan); add_unsched_ord(pivot, diff); add_resched_ord(nbucket, diff); totplan -= diff; @@ -376,7 +370,7 @@ bool TMRP_line::find_ad_excepts(bool anticipi, bool posticipi, TExceptions_array some = TRUE; } } - if (movable.sign() <= 0) // + if (movable <= ZERO) // first++; } // ..look for available sched. receipts to move } @@ -442,7 +436,7 @@ void TMRP_line::print_exception(int from, int to, const real &diff, int header) } if (header <= 1) { - prow.put(format("Ordini emessi con scadenza entro il @41g%s", (const char *)fromdate.string())); + prow.put(format("Ordini emessi con scadenza entro il @41g%s", (const char*)fromdate.string())); pr.print(prow); prow.reset(); // stampa dettaglio ordini @@ -453,22 +447,22 @@ void TMRP_line::print_exception(int from, int to, const real &diff, int header) { TMRP_docref & docref = docrefs->get_ref(nref); prow.put(format("@2gDocumento %s %4d n.%8ld riga %d %s %s", - (const char *)docref.codnumdoc(),docref.annodoc(),docref.numdoc(),docref.numrig(), - (const char *)docref.qta_residua().string(18,3),(const char *)docref.um())); + (const char*)docref.codnumdoc(),docref.annodoc(),docref.numdoc(),docref.numrig(), + (const char*)docref.qta_residua().stringa(18,3),(const char*)docref.um())); pr.print(prow); prow.reset(); } } code.add("1"); - TString um =cache().get(LF_UMART,code).get("UM"); - real v = abs(diff); + const TString16 um =cache().get(LF_UMART,code).get("UM"); + const real v = abs(diff); prow.put(format("@2g%s %s %s", (from == to) ? (diff.sign()>0 ? "Eliminare " : "Aggiungere " ): (from < to ? "Posticipare" : "Anticipare "), - (const char *)v.string(18,3), (const char *)um)); + (const char*)v.stringa(18,3), (const char *)um)); if (from != to) { - prow.put(format("@38gal %s", (const char *)todate.string())); + prow.put(format("@38gal %s", (const char*)todate.string())); } pr.print(prow); } diff --git a/mr/mr2300.cpp b/mr/mr2300.cpp index 641f57b75..966e2ff45 100755 --- a/mr/mr2300.cpp +++ b/mr/mr2300.cpp @@ -23,14 +23,10 @@ protected: bool TMSP_app::create() { - if (TSkeleton_application::create()) - { - openfiles(); - _m = new TMSP_mask(); - _m->field(F_MSCHEDULEPLAN).set("X"); - return TRUE; - } - return FALSE; + openfiles(); + _m = new TMSP_mask(); + _m->field(F_MSCHEDULEPLAN).set("X"); + return TSkeleton_application::create(); } int mr2300(int argc, char* argv[]) diff --git a/mr/mrplib.cpp b/mr/mrplib.cpp index cbef5d859..dddea6039 100755 --- a/mr/mrplib.cpp +++ b/mr/mrplib.cpp @@ -506,12 +506,13 @@ int TMRP_calendar::set_turni(const TDate& data, int mini, int maxi) int TMRP_calendar::add_oreuomo(real & var,const TDate& date, bool max) { - int minuti = 0L; + long minuti = 0L; const int tm = max ? turni_max(date) : turni_min(date); for (int t = tm-1; t >= 0; t--) - minuti += _lungturno[t] * _persturno[t] ; - var +=(minuti / 60 ); - return minuti / 60 ; + minuti += _lungturno[t] * _persturno[t]; + const int ore = int(minuti / 60L); + var += ore; + return ore; } int TMRP_calendar::add_oreuomo_max(real & var,const TDate& date) diff --git a/or/or1100.cpp b/or/or1100.cpp index 6df645d94..587970611 100755 --- a/or/or1100.cpp +++ b/or/or1100.cpp @@ -203,7 +203,7 @@ void TStampa_ordini::filter_for_number() t.put(DOC_DATADOC, _to_date); filter_expr << " && (PROVV==\"" << _provv << "\")"; if (_anno != 0) - filter_expr << " && (ANNO==\"" << _anno << "\")"; + filter_expr << " && (ANNO==\"" << _anno << "\")"; filter_expr << " && (CODNUM==\"" << _codnum << "\")"; } cur->setregion(f,t); @@ -464,15 +464,15 @@ void TStampa_ordini::filter_for_clifo_agent() f.put(DOC_CODNUM, _codnum); if (_anno != 0) { - f.put(DOC_PROVV, _provv); - f.put(DOC_ANNO, _anno); - } - else - { - s.format("(PROVV==\"%c\")&&", _provv); + f.put(DOC_PROVV, _provv); + f.put(DOC_ANNO, _anno); + } + else + { + s.format("(PROVV==\"%c\")&&", _provv); filter_expr << s; } - + t = f; cur->setregion(f,t); // This is the region... @@ -512,7 +512,6 @@ void TStampa_ordini::filter_for_clifo_agent() } } - // Filtro sulla data ordine... if (_from_date.ok()) { @@ -756,15 +755,15 @@ void TStampa_ordini::filter_for_articolo() f.put(RDOC_CODART, _from_art); if (_anno != 0) { - f.put(DOC_PROVV, _provv); - f.put(DOC_ANNO, _anno); - } - else - { - s.format("(PROVV==\"%c\") &&", _provv); + f.put(DOC_PROVV, _provv); + f.put(DOC_ANNO, _anno); + } + else + { + s.format("(PROVV==\"%c\") &&", _provv); filter_expr << s; } - + t = f; t.put(RDOC_CODART, _to_art); cur->setkey(2); // Questa chiave rende piu' veloce la costruzione se indicato un range di articoli @@ -974,18 +973,18 @@ void TStampa_ordini::main_loop() switch (_tipo) { - case clifo: - form_name = "or1100b"; - break; - case agente: - form_name = "or1100c"; - break; - case articolo: - form_name = "or1100d"; - break; - default: - form_name = "or1100a"; - break; + case clifo: + form_name = "or1100b"; + break; + case agente: + form_name = "or1100c"; + break; + case articolo: + form_name = "or1100d"; + break; + default: + form_name = "or1100a"; + break; } _frm = new TOrdine_form(form_name); @@ -993,19 +992,18 @@ void TStampa_ordini::main_loop() // Selezione cursore & filtro switch (_tipo) { - case clifo: - case agente: - filter_for_clifo_agent(); - break; - case articolo: - filter_for_articolo(); - break; - default: - filter_for_number(); - break; + case clifo: + case agente: + filter_for_clifo_agent(); + break; + case articolo: + filter_for_articolo(); + break; + default: + filter_for_number(); + break; } - const int hh = 6; const int fl = printer().formlen(); diff --git a/or/or1100a.frm b/or/or1100a.frm index a597ebe33..d376dda3b 100755 --- a/or/or1100a.frm +++ b/or/or1100a.frm @@ -44,7 +44,7 @@ END NUMERO 4 32 BEGIN KEY "Intestazione stampa" - PROMPT 40 2 "Stampa ordini per numero/data" + PROMPT 40 2 "@bStampa ordini per numero/data" END END //HEADER @@ -58,7 +58,7 @@ BEGIN SPECIAL NUMERO OFFSET "0" "Offset iniziale campo" SPECIAL STRINGA FINCATURA "XX" "Fincatura sinistra e destra" KEY "Descrizione documento" - PROMPT 1 1 "@B" + PROMPT 1 1 "" MESSAGE _STREXPR,CODNUM+"/"+NDOC+" del "+DATADOC END @@ -216,8 +216,7 @@ SECTION DET 2 0 0 FILE LF_RIGHEDOC VALUTA 105 15 BEGIN PROMPT 5 1 "" // valore - FIELD LF_RIGHEDOC->RIGAVALORE - MESSAGE ADD, FL->205 + MESSAGE _ORDINE,VALORE|ADD,FL->205 DRIVENBY 103 // PICTURE "." END @@ -225,8 +224,7 @@ SECTION DET 2 0 0 FILE LF_RIGHEDOC VALUTA 106 15 BEGIN PROMPT 6 1 "" // Val residuo riga - FIELD LF_RIGHEDOC->RIGAVALRES - MESSAGE ADD, FL->206 + MESSAGE _ORDINE,VALRES|ADD,FL->206 DRIVENBY 103 // PICTURE "." END @@ -240,14 +238,14 @@ SECTION DET 2 0 0 FILE LF_RIGHEDOC NUMBER 108 15 BEGIN PROMPT 8 1 "" // Q.ta Ordinata - FIELD LF_RIGHEDOC->QTA + MESSAGE _ORDINE,QTA PICTURE "########@,@@@@@" END NUMBER 109 15 BEGIN PROMPT 9 1 "" // Q.ta Evasa - FIELD LF_RIGHEDOC->QTAEVASA + MESSAGE _ORDINE,QTAEVASA PICTURE "########@,@@@@@" END @@ -309,7 +307,7 @@ SECTION DET 2 0 0 FILE LF_RIGHEDOC BEGIN KEY "Valore Ordinato" PROMPT 5 1 "" - FIELD LF_RIGHEDOC->RIGAVALORE + MESSAGE _ORDINE,VALORE // PICTURE "." DRIVENBY 303 FLAGS "H" @@ -318,7 +316,7 @@ SECTION DET 2 0 0 FILE LF_RIGHEDOC BEGIN KEY "Valore Residuo" PROMPT 6 1 "" - FIELD LF_RIGHEDOC->RIGAVALRES + MESSAGE _ORDINE,VALRES // PICTURE "." DRIVENBY 303 FLAGS "H" @@ -335,16 +333,14 @@ SECTION DET 2 0 0 FILE LF_RIGHEDOC BEGIN KEY "Q.ta Ordinata" PROMPT 8 1 "" - FIELD LF_RIGHEDOC->QTA - MESSAGE _ORDINE,CONVUM|ADD,408 + MESSAGE _ORDINE,QTA|_ORDINE,CONVUM|ADD,408 FLAGS "H" END NUMBER 309 15 BEGIN KEY "Q.ta Evasa" PROMPT 9 1 "" - FIELD LF_RIGHEDOC->QTAEVASA - MESSAGE _ORDINE,CONVUM|ADD,409 + MESSAGE _ORDINE,QTAEVASA|_ORDINE,CONVUM|ADD,409 FLAGS "H" END VALUTA 310 13 diff --git a/or/or1100b.frm b/or/or1100b.frm index d11f8d6d8..02922cbd0 100755 --- a/or/or1100b.frm +++ b/or/or1100b.frm @@ -46,7 +46,7 @@ END NUMERO 4 40 BEGIN KEY "Intestazione stampa" - PROMPT 40 2 "Stampa ordini per cliente/fornitore" + PROMPT 40 2 "@bStampa ordini per cliente/fornitore" END END //HEADER @@ -248,14 +248,14 @@ SECTION DOCUMENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_CLIFO->TIPOCF+LF_CLIFO->CODCF+ BEGIN KEY "Valore Ordinato" PROMPT 5 1 "" - FIELD LF_RIGHEDOC->RIGAVALORE + MESSAGE _ORDINE,VALORE DRIVENBY 203 END VALUTA 206 15 BEGIN KEY "Valore Residuo" PROMPT 6 1 "" - FIELD LF_RIGHEDOC->RIGAVALRES + MESSAGE _ORDINE,VALRES DRIVENBY 203 END STRINGA 207 4 @@ -270,12 +270,13 @@ SECTION DOCUMENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_CLIFO->TIPOCF+LF_CLIFO->CODCF+ PROMPT 8 1 "" FIELD LF_RIGHEDOC->QTA PICTURE "#@,@@@" + END NUMBER 209 13 BEGIN KEY "Q.ta Evasa" PROMPT 9 1 "" - FIELD LF_RIGHEDOC->QTAEVASA + MESSAGE _ORDINE,QTAEVASA PICTURE "########@,@@@@@" END VALUTA 210 13 @@ -348,7 +349,7 @@ SECTION DOCUMENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_CLIFO->TIPOCF+LF_CLIFO->CODCF+ FIELD LF_RIGHEDOC->RIGAVALRES DRIVENBY 303 FLAGS "H" - MESSAGE _ORDINE,VALTABLE,VALRES|ADD,406 + MESSAGE _ORDINE,VALRES|_ORDINE,VALTABLE,VALRES|ADD,406 END STRINGA 307 4 BEGIN @@ -362,16 +363,14 @@ SECTION DOCUMENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_CLIFO->TIPOCF+LF_CLIFO->CODCF+ BEGIN KEY "Q.ta Ordinata" PROMPT 8 1 "" - FIELD LF_RIGHEDOC->QTA - MESSAGE _ORDINE,CONVUM|ADD,408 + MESSAGE _ORDINE,QTA|_ORDINE,CONVUM|ADD,408 FLAGS "H" END NUMBER 309 13 BEGIN KEY "Q.ta Evasa" PROMPT 9 1 "" - FIELD LF_RIGHEDOC->QTAEVASA - MESSAGE _ORDINE,CONVUM|ADD,409 + MESSAGE _ORDINE,QTAEVASA|_ORDINE,CONVUM|ADD,409 FLAGS "H" END VALUTA 310 13 @@ -646,4 +645,3 @@ END // Fine sezione totale in valuta #4 END // End of Body - diff --git a/or/or1100c.frm b/or/or1100c.frm index 1d3b9ea59..b6196793a 100755 --- a/or/or1100c.frm +++ b/or/or1100c.frm @@ -47,7 +47,7 @@ END NUMERO 4 40 BEGIN KEY "Intestazione stampa" - PROMPT 40 2 "Stampa ordini per agente" + PROMPT 40 2 "@bStampa ordini per agente" END END //HEADER @@ -248,7 +248,7 @@ SECTION AGENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_DOC->CODAG BEGIN KEY "Valore Ordinato" PROMPT 5 1 "" - FIELD LF_RIGHEDOC->RIGAVALORE + MESSAGE _ORDINE,VALORE DRIVENBY 203 // PICTURE "." END @@ -256,7 +256,7 @@ SECTION AGENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_DOC->CODAG BEGIN KEY "Valore Residuo" PROMPT 6 1 "" - FIELD LF_RIGHEDOC->RIGAVALRES + MESSAGE _ORDINE,VALRES DRIVENBY 203 // PICTURE "." END @@ -272,12 +272,13 @@ SECTION AGENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_DOC->CODAG PROMPT 8 1 "" FIELD LF_RIGHEDOC->QTA PICTURE "#@,@@@" + END NUMBER 209 13 BEGIN KEY "Q.ta Evasa" PROMPT 9 1 "" - FIELD LF_RIGHEDOC->QTAEVASA + MESSAGE _ORDINE,QTAEVASA PICTURE "########@,@@@@@" END VALUTA 210 13 @@ -358,7 +359,7 @@ SECTION AGENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_DOC->CODAG FIELD LF_RIGHEDOC->RIGAVALRES DRIVENBY 303 FLAGS "H" - MESSAGE _ORDINE,VALTABLE,VALRES|ADD,406 + MESSAGE _ORDINE,VALRES|_ORDINE,VALTABLE,VALRES|ADD,406 END STRINGA 307 4 BEGIN @@ -372,8 +373,7 @@ SECTION AGENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_DOC->CODAG BEGIN KEY "Q.ta Ordinata" PROMPT 8 1 "" - FIELD LF_RIGHEDOC->QTA - MESSAGE _ORDINE,CONVUM|ADD,408 + MESSAGE _ORDINE,QTA|_ORDINE,CONVUM|ADD,408 FLAGS "H" END NUMBER 309 13 @@ -381,7 +381,7 @@ SECTION AGENTI 2 1 1 FILE LF_RIGHEDOC GROUP LF_DOC->CODAG KEY "Q.ta Evasa" PROMPT 9 1 "" FIELD LF_RIGHEDOC->QTAEVASA - MESSAGE _ORDINE,CONVUM|ADD,409 + MESSAGE _ORDINE,QTAEVASA|_ORDINE,CONVUM|ADD,409 FLAGS "H" END VALUTA 310 13 @@ -665,4 +665,3 @@ END // Fine sezione totale in valuta #4 END // End of Body - diff --git a/or/or1100d.frm b/or/or1100d.frm index 5bda62345..e3d0bc9f6 100755 --- a/or/or1100d.frm +++ b/or/or1100d.frm @@ -45,7 +45,7 @@ END NUMERO 4 40 BEGIN KEY "Intestazione stampa" - PROMPT 40 2 "Stampa ordini per articolo" + PROMPT 40 2 "@bStampa ordini per articolo" END END //HEADER @@ -188,8 +188,7 @@ SECTION ARTICOLI 1 0 0 FILE LF_RIGHEDOC GROUP ANNO+NDOC+CODVAL+DATACONS BEGIN KEY "Valore Ordinato" PROMPT 5 1 "" - FIELD LF_RIGHEDOC->RIGAVALORE - MESSAGE _ORDINE,VALTABLE,VALORD|ADD,405 + MESSAGE _ORDINE,VALORE|_ORDINE,VALTABLE,VALORD|ADD,405 DRIVENBY 303 // PICTURE "." FLAGS "H" @@ -198,11 +197,10 @@ SECTION ARTICOLI 1 0 0 FILE LF_RIGHEDOC GROUP ANNO+NDOC+CODVAL+DATACONS BEGIN KEY "Valore Residuo" PROMPT 6 1 "" - FIELD LF_RIGHEDOC->RIGAVALRES // PICTURE "." DRIVENBY 303 FLAGS "H" - MESSAGE _ORDINE,VALTABLE,VALRES|ADD,406 + MESSAGE _ORDINE,VALRES|_ORDINE,VALTABLE,VALRES|ADD,406 END STRINGA 307 4 BEGIN @@ -216,16 +214,14 @@ SECTION ARTICOLI 1 0 0 FILE LF_RIGHEDOC GROUP ANNO+NDOC+CODVAL+DATACONS BEGIN KEY "Q.ta Ordinata" PROMPT 8 1 "" - FIELD LF_RIGHEDOC->QTA - MESSAGE _ORDINE,CONVUM|ADD,408 + MESSAGE _ORDINE,QTA|_ORDINE,CONVUM|ADD,408 FLAGS "H" END NUMBER 309 13 BEGIN KEY "Q.ta Evasa" PROMPT 9 1 "" - FIELD LF_RIGHEDOC->QTAEVASA - MESSAGE _ORDINE,CONVUM|ADD,409 + MESSAGE _ORDINE,QTAEVASA|_ORDINE,CONVUM|ADD,409 FLAGS "H" END VALUTA 310 13 @@ -391,7 +387,7 @@ FLAGS "D" KEY "Unitá di misura" PROMPT 7 1 "" END - + NUMERO 508 15 5 BEGIN KEY "Tot Q.ta ordinata" diff --git a/or/orlib01.cpp b/or/orlib01.cpp index a51e2db79..0458b58dd 100755 --- a/or/orlib01.cpp +++ b/or/orlib01.cpp @@ -67,13 +67,12 @@ bool TOrdine_form::genera_intestazione_supplementare(pagetype p, short y) bool TOrdine_form::validate(TForm_item &cf, TToken_string &s) { - const TString code(s.get(0)); - - if (code == "_ORDINE") + if (strcmp(s.get(0), "_ORDINE") == 0) { - TLocalisamfile& doc = cf.form().cursor()->file(LF_DOC); + // TLocalisamfile& doc = cf.form().cursor()->file(LF_DOC); + TDocumento& doc = (TDocumento&)cf.form().cursor()->curr(LF_DOC); //TLocalisamfile& rdoc = cf.form().cursor()->file(LF_RIGHEDOC); - TRiga_documento& rdoc = (TRiga_documento&) cf.form().cursor()->file(LF_RIGHEDOC).curr(); + TRiga_documento& rdoc = (TRiga_documento&)cf.form().cursor()->curr(LF_RIGHEDOC); // Add custom messages here // All the following messages takes 1 parameter: the field number to set TString action(s.get(1)); @@ -217,7 +216,7 @@ bool TOrdine_form::validate(TForm_item &cf, TToken_string &s) { i_id--; s_id.format("%d",i_id); - cf.find_field(s_id).set("Totali"); + cf.find_field(s_id).set("@bTotali"); } } const int sn = tv.secnum(); @@ -338,12 +337,28 @@ bool TOrdine_form::validate(TForm_item &cf, TToken_string &s) } // Ignore any other command } - } - else - if (action == "PREZZONS") + } else + if (action == "PREZZONS") + { + real pns = rdoc.prezzo(TRUE,FALSE); // Prezzo netto scontato + cf.set(pns.string()); + } else + if (action == "RAGSOC") + { + // Compone la ragione sociale (considera gli occasionali) + // Il formato è il seguente: CODICE (OCFPI) RAGIONE_SOCIALE + TString ws; + const bool print_cod = s.get_int(2); + TDocumento& documento = (TDocumento&)cf.form().cursor()->curr(LF_DOC); + TCli_for& cli_for = documento.clifor(); + TOccasionale& cli_occ = documento.occas(); + const bool occasionale = cli_for.occasionale(); + if (print_cod) + ws << cli_for.get("CODCF") << " "; + if (occasionale) { - real pns = rdoc.prezzo(TRUE,FALSE); // Prezzo netto scontato - cf.set(pns.string()); + ws << "(" << cli_occ.get("CFPI") << ") " ; + ws << cli_occ.get("RAGSOC"); } else if (action == "RAGSOC") @@ -368,27 +383,43 @@ bool TOrdine_form::validate(TForm_item &cf, TToken_string &s) cf.set(ws); } else - if (action == "RESIDUO") - { - real qres = rdoc.qtaresidua(); // Quantita' residua - cf.set(qres.string()); + if (action == "QTA") + { + cf.set(rdoc.quantita().string()); + } else + if (action == "QTAEVASA") + { + cf.set(rdoc.qtaevasa().string()); + } else + if (action == "RESIDUO") + { + cf.set(rdoc.qtaresidua().string()); + } else + if (action == "VALORE") + { + cf.set(rdoc.valore(TRUE, AUTO_DECIMALS).string()); + } else + if (action == "VALRES") + { + cf.set(rdoc.valore(FALSE, AUTO_DECIMALS).string()); + } else + if (action == "GIACENZA") + { + real g = ZERO; + const TString& codart = rdoc.get(RDOC_CODARTMAG); + if (codart.not_empty() && _art_giac->read(codart) == NOERR) + { + const TDate oggi(TODAY); + TString16 annoes; annoes.format("%04d", _esercizi->date2esc(oggi)); + const TString16 codmag(rdoc.get("CODMAG")); // Riferito al magazzino indicato sulla riga... + const TString16 livello(_level > 0 ? rdoc.get(RDOC_LIVELLO) : ""); + g = _art_giac->disponibilita(annoes, codmag, livello, TRUE); // Giacenza attuale } - else - if (action == "GIACENZA") - { - real g = ZERO; - const TString& codart = rdoc.get(RDOC_CODARTMAG); - if (codart.not_empty() && _art_giac->read(codart) == NOERR) - { - const TDate oggi(TODAY); - TString16 annoes; annoes.format("%04d", _esercizi->date2esc(oggi)); - const TString16 codmag(rdoc.get("CODMAG")); // Riferito al magazzino indicato sulla riga... - const TString16 livello(_level > 0 ? rdoc.get(RDOC_LIVELLO) : ""); - g = _art_giac->disponibilita(annoes, codmag, livello, TRUE); // Giacenza attuale - } - cf.set(g.string()); - } + cf.set(g.string()); + } + //Ignore any other command + return TRUE; } return TForm::validate(cf, s); -} +} \ No newline at end of file diff --git a/ve/f33.dir b/ve/f33.dir index b4282d5cb..15638e1fe 100755 --- a/ve/f33.dir +++ b/ve/f33.dir @@ -1,3 +1,3 @@ 33 0 -$doc|0|0|448|0|Documenti di vendita|NDOC*3|| +$doc|0|0|462|0|Documenti di vendita|NDOC*3|| diff --git a/ve/f33.trr b/ve/f33.trr index 031a466b3..e01142c6f 100755 --- a/ve/f33.trr +++ b/ve/f33.trr @@ -1,5 +1,5 @@ 33 -74 +76 CODNUM|1|4|0|Codice della numerazione ANNO|2|4|0|Anno PROVV|1|1|0|Tipo numerazione

rovvisorio efinitivo @@ -74,6 +74,8 @@ COLL_GOLEM|11|10|0|Collegamento lista di GOLEM DOCEVASO|8|1|0|Ordine evaso CODCMS|1|20|0|Codice Commessa FASCMS|1|10|0|Fase Commessa +NUMREG|3|7|0|Numero movimento contabilizzato +NUMANT|3|7|0|Numero movimento anticipo contabilizzato 3 PROVV+ANNO+CODNUM+NDOC| TIPOCF+CODCF+PROVV+ANNO+DATADOC+CODNUM+NDOC|X diff --git a/ve/f47.dir b/ve/f47.dir index a849fca78..94ad96436 100755 --- a/ve/f47.dir +++ b/ve/f47.dir @@ -1,3 +1,3 @@ 47 0 -$anamag|0|0|775|0|Anagrafica di magazzino|NART|| +$anamag|0|0|801|0|Anagrafica di magazzino|NART|| diff --git a/ve/f47.trr b/ve/f47.trr index d2fae4d09..d75e533e7 100755 --- a/ve/f47.trr +++ b/ve/f47.trr @@ -1,5 +1,5 @@ 47 -67 +69 CODART|1|20|0|Codice Articolo DESCR|1|50|0|Descrizione DESCRAGG|11|10|0|Descrizione aggiuntiva @@ -57,6 +57,8 @@ CONLEG|4|15|5|Peso Legno (Kg) per CONAI CONVET|4|15|5|Peso Vetro (Kg) per CONAI CONTOINDA|1|12|0|Codice piano dei conti industriale (GrCoSo) Acquisti CONTOINDV|1|12|0|Codice piano dei conti industriale (GrCoSo) Vendite +COLLTYPE|1|1|0|Tipo collegamento DB +CODMAG|1|5|0|Codice magazzino USER1|1|40|0|Campo libero 1 USER2|1|20|0|Campo libero 2 USER3|1|20|0|Campo libero 3 @@ -70,4 +72,4 @@ USER10|1|20|0|Campo libero 10 3 CODART| UPPER(DESCR)|X -GRMERC+CODART| \ No newline at end of file +GRMERC+CODART| diff --git a/ve/f53.dir b/ve/f53.dir index e177aeb06..771265b81 100755 --- a/ve/f53.dir +++ b/ve/f53.dir @@ -1,3 +1,3 @@ 53 0 -$rcondv|0|0|183|0|Righe condizioni di vendita||| +$rcondv|0|0|191|0|Righe condizioni di vendita||| diff --git a/ve/f53.trr b/ve/f53.trr index 796f08534..ba982d978 100755 --- a/ve/f53.trr +++ b/ve/f53.trr @@ -1,5 +1,5 @@ 53 -22 +23 TIPO|1|1|0|Tipo (istino,ontratto,fferta) CATVEN|1|2|0|Categoria di vendita (L) TIPOCF|1|1|0|liente o ornitore (C) @@ -22,5 +22,6 @@ PROMAGGIO|4|18|5|Prezzo omaggio UMOM|1|2|0|Unitá di misura articolo omaggio CODLOTTO|1|6|0|Codice lotto (CO) ARTES|8|1|0|Articolo in esaurimento (O) +DATAULTAUM|5|8|0|Data ultimo aumento 1 TIPO+CATVEN+TIPOCF+CODCF+COD+TIPORIGA+CODRIGA+UM+NSCAGL| diff --git a/ve/rcondv.h b/ve/rcondv.h index 243f818d7..11b7f112a 100755 --- a/ve/rcondv.h +++ b/ve/rcondv.h @@ -23,5 +23,6 @@ #define RCONDV_UMOM "UMOM" #define RCONDV_CODLOTTO "CODLOTTO" #define RCONDV_ARTES "ARTES" +#define RCONDV_DATAULTAUM "DATAULTAUM" #endif diff --git a/ve/sconti.cpp b/ve/sconti.cpp index 0a4f714a6..8df969d0e 100755 --- a/ve/sconti.cpp +++ b/ve/sconti.cpp @@ -406,6 +406,7 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) set_prezzo(_umart.get_real("PREZZO")); else set_prezzo(_anamag.get_real(field_prezzo)); + } @@ -679,4 +680,4 @@ TCond_vendita::TCond_vendita(TDocumento_mask * testa, TMask * riga) _ivarid(FALSE), _load_mask(FALSE) { } - + \ No newline at end of file diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index d9097637c..fac677f00 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -284,9 +284,10 @@ void TMotore_application::on_firm_change() bool TMotore_application::user_create( ) { open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_DESLIN, LF_CODCORR, - LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, - LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0); + LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, LF_MOV, + LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0); + _config_ditta = new TConfig(CONFIG_DITTA); // Metto in relazione testata e righe diff --git a/ve/ve1.cpp b/ve/ve1.cpp index 75e2092fa..c12981513 100755 --- a/ve/ve1.cpp +++ b/ve/ve1.cpp @@ -1,18 +1,19 @@ #include #include -extern int ve1100(int argc, char* argv[]); // stampa documenti di vendita tramite form derivati +#include "ve1.h" int main(int argc, char **argv) { - const int r= (argc>1)? argv[1][1]-'0' : -1; - + const int r = (argc>1) ? argv[1][1]-'0' : -1; switch (r) { case 0: ve1100(argc, argv); break; + case 1: + ve1200(argc, argv); break; default: - error_box("Sintassi: %s [-0 {[params]|[L]}]", argv[0]); break; + error_box("Sintassi: %s [-0 {[params]|[L]}, 1]", argv[0]); break; } exit(0); return 0; diff --git a/ve/ve1.h b/ve/ve1.h index 1f50b04e5..7ae5d9e1d 100755 --- a/ve/ve1.h +++ b/ve/ve1.h @@ -1,22 +1,8 @@ #ifndef __VE1_H #define __VE1_H -#ifndef __STRINGS_H -#include -#endif - int ve1100(int argc, char* argv[]); - -#ifdef __MAIN__ -#define extern -#endif - -extern TString80 tmp; - -#ifdef __MAIN__ -#undef extern -#endif - +int ve1200(int argc, char* argv[]); #endif // __VE1_H diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 0ba90d5d7..9f00cff48 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -1200,6 +1200,7 @@ protected: static bool to_cod_handler (TMask_field& f, KEY k); static bool select_button (TMask_field& f, KEY k); static bool reset_button (TMask_field& f, KEY k); + static bool tipodoc_handler (TMask_field& f, KEY k); static bool filter_clifo(const TRelation* r); long select_cod_range(long from, long to); void reset_choices(TMask& m); @@ -1489,16 +1490,23 @@ void TStampaDoc_application::set_filter() break; // Interrompe alla prima riga vuota... - e1.format("(CODNUM==\"%s\"", (const char*)sw); + e1.format("((CODNUM==\"%s\")", (const char*)sw); + + TString4 td = riga.get(1);td.trim(); + if (td.not_empty()) + { + e1 << "&&(TIPODOC==\"" << td <<"\")"; + } + e2 = ""; - for (int k=1; k<=6; k++) // Famme vede' li stati generali... Aho' A BURINO! Che e' la Rivoluzione Francese? + for (int k=2; k<=7; k++) // Famme vede' li stati generali... Aho' A BURINO! Che e' la Rivoluzione Francese? { const char c = riga.get(k)[0]; if (c == '\0' || c == ' ') break; // Interrompe al primo blank... e2.format("(STATO==\"%c\")",c); - // Se k vale 2 o piu' significa ke gli stati prec erano != "" no!? - if (k == 1) + // Se k vale 3 o piu' significa ke gli stati prec erano != "" no!? + if (k == 2) e1 << "&&("; else e1 << "||"; @@ -1715,6 +1723,57 @@ bool TStampaDoc_application::range_handler(TMask_field& f, KEY key) return rt; } +bool TStampaDoc_application::tipodoc_handler(TMask_field& f, KEY key) +{ + TMask& m = f.mask(); + switch (key) + { + case K_F9: //caso del bottone di selezione + { + TArray_sheet as(-1,-1,70,20,"Tipi documento","Codice|Descrizione@50"); //costruisce uno sheet di selezione dei tipi doc + const TRectype& recnum = cache().get("%NUM",m.get(101)); //cache sulla tabella numerazione documento con il numero doc immesso nella maschera + const TString80 s2 = recnum.get("S2"); //prende tutto il contenuto del campo S2 della tabella %NUM (numerazione docs) + for (int i = 0; i < s2.len(); i+=4) + { + const TString4 tipodoc = s2.mid(i,4); //si va di 4 in 4, x' cosi' sono ordinati i tipidoc nel campo S2 + if (!tipodoc.blank()) //ovviamente si procede solo se il tipodoc esiste + { + TToken_string row; //classica token_string con codice e descrizione del tipodoc: questa viene scelta nella tabella + row.add(tipodoc); //dei tipi docs %TIP + row.add(cache().get("%TIP", tipodoc, "S0")); + as.add(row); //..e viene aggiunta allo sheet di selezione + } + } + if (as.run() != K_ESC) + { + TToken_string& riga = as.row(-1); //setta sul campo a maschera il codice della riga selezionata di as + f.set(riga.get(0)); + } + } + break; + case K_ENTER: //caso del bottone invio; + o - come sopra; deve xo' verificare che l'eventuale codice di tipodoc digitato + if (!f.empty()) //sia valido (esista nel campo S2 della tabella NUM) + { + const TRectype& recnum = cache().get("%NUM",m.get(101)); + const TString80 s2 = recnum.get("S2"); + for (int i = 0; i < s2.len(); i+=4) + { + TString4 tipodoc = s2.mid(i,4); + tipodoc.trim(); + if (tipodoc == f.get()) + return TRUE; + } + return f.error_box("Tipo documento non valido per la numerazione %s", (const char*)m.get(101)); + } + break; + + default: + break; + } + return TRUE; +} + + //////////////////////////////////////////////////////////////// // Filtro per cli/fo sul cursore della lista documenti //////////////////////////////////////////////////////////////// @@ -1744,6 +1803,7 @@ bool TStampaDoc_application::create() _is_lista = argc == 3 && argv(2)[0] == 'L'; on_firm_change(); _selection_mask = new TMask(_is_lista ? "ve1100b" : "ve1100a"); + if (!_is_lista) { _clifo_sheet = NULL; @@ -1763,6 +1823,7 @@ bool TStampaDoc_application::create() _selection_mask->set_handler(F_CODTO, to_cod_handler); _selection_mask->set_handler(BUT_SEL, select_button); _selection_mask->set_handler(BUT_ANN, reset_button); + _selection_mask->sfield(F_SHEETNUMS).sheet_mask().set_handler(102, tipodoc_handler); } if (argc>3) @@ -1877,4 +1938,3 @@ int ve1100(int argc, char* argv[]) a.run(argc, argv, cond ? "Lista documenti" : "Stampa documenti di vendita"); return (0); } - diff --git a/ve/ve1100b.uml b/ve/ve1100b.uml index 56dac6cba..d0e7e1540 100755 --- a/ve/ve1100b.uml +++ b/ve/ve1100b.uml @@ -21,6 +21,7 @@ SPREADSHEET F_SHEETNUMS 55 9 BEGIN PROMPT 1 2 "" ITEM "Cod. num." + ITEM "Tipo doc." ITEM "Stato 1" ITEM "Stato 2" ITEM "Stato 3" @@ -136,7 +137,7 @@ PAGE "" -1 -1 75 10 STRING 101 4 BEGIN PROMPT 1 1 "Codice numerazione " - FLAG "U" + FLAGS "U" USE %NUM INPUT CODTAB 101 DISPLAY "Cod. Num." CODTAB @@ -145,20 +146,15 @@ BEGIN CHECKTYPE NORMAL END -STRING 102 1 +STRING 102 4 BEGIN - PROMPT 1 3 "Stato 1 " - USE %STD - INPUT CODTAB 102 - DISPLAY "Stato" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT 102 CODTAB - CHECKTYPE NORMAL + PROMPT 1 2 "Tipo documento " + FLAGS "UB" END STRING 103 1 BEGIN - PROMPT 1 4 "Stato 2 " + PROMPT 1 3 "Stato 1 " USE %STD INPUT CODTAB 103 DISPLAY "Stato" CODTAB @@ -169,7 +165,7 @@ END STRING 104 1 BEGIN - PROMPT 1 5 "Stato 3 " + PROMPT 1 4 "Stato 2 " USE %STD INPUT CODTAB 104 DISPLAY "Stato" CODTAB @@ -180,7 +176,7 @@ END STRING 105 1 BEGIN - PROMPT 1 6 "Stato 4 " + PROMPT 1 5 "Stato 3 " USE %STD INPUT CODTAB 105 DISPLAY "Stato" CODTAB @@ -191,7 +187,7 @@ END STRING 106 1 BEGIN - PROMPT 1 7 "Stato 5 " + PROMPT 1 6 "Stato 4 " USE %STD INPUT CODTAB 106 DISPLAY "Stato" CODTAB @@ -202,7 +198,7 @@ END STRING 107 1 BEGIN - PROMPT 1 8 "Stato 6 " + PROMPT 1 7 "Stato 5 " USE %STD INPUT CODTAB 107 DISPLAY "Stato" CODTAB @@ -211,6 +207,17 @@ BEGIN CHECKTYPE NORMAL END +STRING 108 1 +BEGIN + PROMPT 1 8 "Stato 6 " + USE %STD + INPUT CODTAB 108 + DISPLAY "Stato" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT 108 CODTAB + CHECKTYPE NORMAL +END + BUTTON DLG_OK 9 2 BEGIN PROMPT -12 -1 "" diff --git a/ve/ve1200.cpp b/ve/ve1200.cpp new file mode 100755 index 000000000..dda443568 --- /dev/null +++ b/ve/ve1200.cpp @@ -0,0 +1,667 @@ +#include +#include +#include +#include +#include +#include + +#include "velib.h" +#include "ve1200a.h" + +#include + +/////////////////////////////////////////////////////////// +// TScoperto_msk +/////////////////////////////////////////////////////////// + +class TScoperto_msk : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& f, TField_event e, long jolly); + + bool fill_sheet(); + +public: + TScoperto_msk(); +}; + +bool TScoperto_msk::on_field_event(TOperable_field& f, TField_event e, long jolly) +{ + switch (f.dlg()) + { + case F_CONSORD: + if (e == fe_modify) + fill_sheet(); + break; + case F_BOLLE: + if (e == se_query_add || e == se_query_del) + return FALSE; + if (e == fe_close) + { + TSheet_field& s = sfield(F_BOLLE); + FOR_EACH_SHEET_ROW(s, r, row) + { + if (*row->get(0) == 'X') + return TRUE; + } + return error_box("Selezionare almeno una numerazione"); + } + break; + case 100: + if (e == fe_button) + { + TMask& m = f.mask(); // Sheet mask + m.set(F_SELECTED, m.get_bool(F_SELECTED) ? "" : "X"); + if (!m.is_open()) + sfield(F_BOLLE).force_update(); + } + break; + default: + break; + } + return TRUE; +} + +bool TScoperto_msk::fill_sheet() +{ + TSheet_field& sheet = sfield(F_BOLLE); + sheet.destroy(); + + const TTipo_elaborazione tipo_elab_bolle = get_bool(F_CONSORD) ? _consegna_ordini : _fatturazione_bolle; + const TTipo_elaborazione tipo_elab_fatt = _contabilizzazione; + + TWait_cursor hourglass; + TTable num("%NUM"); + for (int err = num.first(); err == NOERR; err = num.next()) if (num.get_int("I1") == 1) // bolle + { + TToken_string tipi(50, ','); + const TCodice_numerazione codnum(num.curr()); + for (int t = codnum.ntipi_doc()-1; t >= 0; t--) + { + const TString8 td = codnum.tipo_doc(t); + const TTipo_documento& tpd = TDocumento::tipo(td); + TFilename prof = tpd.profile_name(); prof.ext("ini"); + TConfig ini(prof, "MAIN"); + if (ini.get("TIPOCF") == "F") + tipi.add(td); + } + if (tipi.not_empty()) + { + TTable eld("%ELD"); + + TToken_string fatture(50, ','); + TString8 stato_bolla, stato_fatt; + + for (int err = eld.first(); err == NOERR; err = eld.next()) + { + const TTipo_elaborazione te = (TTipo_elaborazione)eld.get_int("I0"); + if (te == tipo_elab_bolle) + { + TElaborazione_esterna elab(eld.curr()); // Una vale l'altra :-) + TString8 ti; + for (int i = 0; ; i++) + { + ti = elab.tipo_iniziale(i); // Tipo iniziale + if (ti.empty()) + break; + if (tipi.get_pos(ti) >= 0) + { + if (stato_bolla.empty()) + stato_bolla << elab.stato_iniziale(i); + const TString8 codfatt = elab.codice_numerazione_finale(); + if (fatture.get_pos(codfatt) < 0) // Non e' già presente in lista + { + const TRectype& numfatt = cache().get("%NUM", codfatt); + if (numfatt.get_int("I1") == 2) // Fattura vera! + fatture.add(codfatt); + } + } + } + } + if (te == tipo_elab_fatt && stato_fatt.empty()) + { + TElaborazione_esterna elab(eld.curr()); // Una vale l'altra :-) + const TString8 codfatt = elab.codice_numerazione_finale(); + bool is_fatt = fatture.get_pos(codfatt) >= 0; + if (!is_fatt) + { + const TRectype& numfatt = cache().get("%NUM", codfatt); + is_fatt = numfatt.get_int("I1") == 2; + } + if (is_fatt) + stato_fatt << elab.stato_finale_doc_iniziale(); + } + } + + if (fatture.not_empty()) + { + TToken_string& row = sheet.row(-1); + row = " "; + row.add(codnum.codice()); + row.add(codnum.descrizione()); + row.add(tipi); + row.add(stato_bolla); // Stato bolle non fatturate + row.add(fatture); + row.add(stato_fatt); // Stato fatture contabilizzate + } + } + } + sheet.force_update(); + return sheet.items() > 0; +} + +TScoperto_msk::TScoperto_msk() : TAutomask("ve1200a") +{ + if (!fill_sheet()) + { + set(F_CONSORD, "X"); + fill_sheet(); + } +} + +/////////////////////////////////////////////////////////// +// TScoperto_form +/////////////////////////////////////////////////////////// + +class TScoperto_form : public TForm +{ + TDate _data_rif; + bool _work_on_residual; + char _stato_bolle; + char _stato_fatture; + +private: + static TScoperto_form* _curr_form; + static void header_handler(TPrinter& p); + +protected: + virtual bool validate(TForm_item& f, TToken_string& msg); + + const TRectype& head_of(const TRectype& row) const; + +public: + void print_header(); + int print_bolla(const TRectype& doc, TArray* fatt); + void print_total(); + + TScoperto_form(const TDate& dr, bool wor, char sb, char sf); + virtual ~TScoperto_form(); +}; + +TScoperto_form* TScoperto_form::_curr_form = NULL; + +bool TScoperto_form::validate(TForm_item& f, TToken_string& msg) +{ + if (msg == "_CLIFO") + { + const TRectype& r = cursor()->curr(LF_DOC); + TToken_string key; + key.add(r.get(DOC_TIPOCF)); + key.add(r.get(DOC_CODCF)); + const TRectype& rec = cache().get(LF_CLIFO, key); + key = rec.get("RAGSOC"); + if (key.len() > 30 && key[29] == ' ') + { + const TString nome = key.mid(30); + key.cut(30); key.rtrim(); + key << ' ' << nome; + } + f.set(key); + return TRUE; + } + if (msg == "_DESCART") + { + const TRectype& r = cursor()->curr(LF_RIGHEDOC); + TToken_string key; + key.add(r.get(RDOC_CODARTMAG)); + const TRectype& rec = cache().get(LF_ANAMAG, key); + f.set(rec.get("DESCR")); + return TRUE; + } + return TForm::validate(f, msg); +} + +void TScoperto_form::print_header() +{ + TPrint_section& head = section('H'); + head.find_field(H_DATARIF).set(_data_rif.string()); + set_header(1, FALSE); + set_header(1, TRUE); +} + +const TRectype& TScoperto_form::head_of(const TRectype& row) const +{ + TToken_string key; + key.add(row.get(RDOC_PROVV)); + key.add(row.get(RDOC_ANNO)); + key.add(row.get(RDOC_CODNUM)); + key.add(row.get(RDOC_NDOC)); + return cache().get(LF_DOC, key); +} + +int TScoperto_form::print_bolla(const TRectype& dochead, TArray* fatt) +{ + TDocumento& doc =(TDocumento& )cursor()->curr(LF_DOC); + doc.read(dochead); + + TPrint_section& body = section('B', odd_page); + + TString_array note; + + bool testata_stampata = FALSE; + for (int r = 1; r <= doc.physical_rows(); r++) + { + TRiga_documento& riga = doc[r]; + if (riga.is_merce()) + { + real quant, valore; + TString16 docrif, datarif, codnum, ndoc, postilla; + if (_work_on_residual) + { + // Cerco le righe di fattura generate da questa riga di bolla + if (fatt != NULL) + { + real qtafatt; // Quantità fatturata + int fatture = 0; + + TToken_string key_bol, key_fat; + key_bol = riga.get(RDOC_PROVV); + key_bol.add(riga.get(RDOC_ANNO)); + key_bol.add(riga.get(RDOC_CODNUM)); + key_bol.add(riga.get(RDOC_NDOC)); + key_bol.add(riga.get(RDOC_IDRIGA)); + for (int r = fatt->last(); r >= 0; r--) + { + const TRectype& rfatt = (const TRectype&)(*fatt)[r]; + const TRectype& fatt_head = head_of(rfatt); + const TDate data_fatt = fatt_head.get(DOC_DATADOC); + const char stato_fatt = fatt_head.get_char(DOC_STATO); + if (stato_fatt < _stato_fatture || data_fatt > _data_rif) + { + key_fat = rfatt.get(RDOC_DAPROVV); + key_fat.add(rfatt.get(RDOC_DAANNO)); + key_fat.add(rfatt.get(RDOC_DACODNUM)); + key_fat.add(rfatt.get(RDOC_DANDOC)); + key_fat.add(rfatt.get(RDOC_DAIDRIGA)); + if (key_fat == key_bol) + { + qtafatt += rfatt.get_real(RDOC_QTA); + fatture++; + if (docrif.empty()) + { + docrif = fatt_head.get(DOC_NUMDOCRIF); + datarif = fatt_head.get(DOC_DATADOCRIF); + codnum = fatt_head.get(DOC_CODNUM); + ndoc = fatt_head.get(DOC_NDOC); + } + else + { + TToken_string n(50, ','); + n = fatt_head.get(DOC_NUMDOCRIF); + if (n != docrif) // Non annotare il documento principale! + { + TToken_string* nota = (TToken_string*)note.objptr(r); + if (nota == NULL) + { + nota = new TToken_string; + note.add(nota, r); + postilla.format("(%d)", note.items()); + } + n.add(fatt_head.get(DOC_DATADOCRIF)); + n.add(fatt_head.get(DOC_CODNUM)); + n.add(fatt_head.get(DOC_NDOC)); + if (nota->get_pos(n) < 0) // Non annotare due volte lo stesso documento! + nota->add(n); + } + } + } + } + } + if (!qtafatt.is_zero()) + { + // Calcolo nuova quantita evasa sulla riga della bolla + // Se la riga è completamente evasa da una sola fattura devo azzerara la quantità evasa + // altrimenti devo scalare da questa la quantità specificata sulla fattura + real qtaevasa; + if (fatture > 1 || !riga.get_bool(RDOC_RIGAEVASA)) + { + qtaevasa = riga.get_real(riga.field_qtaevasa()); + qtaevasa -= qtafatt; + } + riga.put(riga.field_qtaevasa(), qtaevasa); + riga.put(RDOC_RIGAEVASA, ""); // La riga non può essere evasa completamente + } + } + quant = riga.qtaresidua(); + valore = riga.valore(FALSE, AUTO_DECIMALS); + } + else + { + quant = riga.quantita(); + valore = riga.valore(TRUE, AUTO_DECIMALS); + } + + if (valore > ZERO) // Devo stampare la riga + { + if (!testata_stampata) // Controllo se devo stampare la testata relativa + { + set_body(1, FALSE); // Inizializza BODY FIRST + set_body(1, TRUE); // Stampa testata bolla + testata_stampata = TRUE; + } + cursor()->curr(LF_RIGHEDOC) = riga; + + body.find_field(R_QUANT).set(quant.string()); + body.find_field(R_VALORE).set(valore.string()); + body.find_field(R_DOCRIF).set(docrif); + body.find_field(R_DATARIF).set(datarif); + body.find_field(R_CODNUM_FAT).set(codnum); + body.find_field(R_NDOC_FAT).set(ndoc); + body.find_field(R_NOTA).set(postilla); + set_body(3, FALSE); // Inizializza BODY ODD + set_body(3, TRUE); // Stampa riga bolla + } + } + } + if (testata_stampata) + { + set_body(2, FALSE); // Inizializza BODY EVEN + set_body(2, TRUE); // Stampa totale bolla + + if (note.items() > 0) + { + TPrinter& pr = printer(); + TPrintrow prow; + pr.print(prow); + + int progr = 0; + FOR_EACH_ARRAY_ROW(note, n, nota) + { + TString r; + r.format("@b(%d) ATTENZIONE!@r ", ++progr); + r << "La riga della bolla ha generato righe di merce anche sulle seguenti fatture: "; + prow.reset(); + prow.put(r); + pr.print(prow); + FOR_EACH_TOKEN((*nota), tok) + { + TToken_string t(tok, ','); + prow.reset(); + prow.put("Fattura di riferimento: "); prow.put(t.get(0)); + prow.put(" "); prow.put(t.get()); + prow.put(" Fattura: "); prow.put(t.get()); + prow.put(" "); prow.put(t.get()); + pr.print(prow); + } + } + } + } + + return testata_stampata ? 1 : 0; +} + +void TScoperto_form::print_total() +{ + set_body(0, FALSE); // Inizializza BODY LAST + set_body(0, TRUE); // Stampa totale generale + printer().formfeed(); +} + +void TScoperto_form::header_handler(TPrinter&) +{ + _curr_form->print_header(); +} + +TScoperto_form::TScoperto_form(const TDate& dr, bool wor, char sb, char sf) + : TForm("ve1200a"), _data_rif(dr), _work_on_residual(wor), _stato_bolle(sb), _stato_fatture(sf) +{ + TCursor* cur = cursor(); + TDocumento *doc = new TDocumento; // Don't delete! + + cur->file(LF_DOC).set_curr(doc); + cur->file(LF_RIGHEDOC).set_curr(new TRiga_documento(doc));// Don't delete! + + _curr_form = this; + printer().setheaderhandler(header_handler); // Setta handler testata +} + +TScoperto_form::~TScoperto_form() +{ + _curr_form = NULL; +} + +/////////////////////////////////////////////////////////// +// TLista_bolle +/////////////////////////////////////////////////////////// + +class TLista_bolle : public TObject +{ + TAssoc_array _bolle; + TToken_string _key; + +protected: + const TString& key(const TRectype& rec); + +public: + void add_riga_fatt(const TRectype& rdoc_fatt); + TArray* find_bolla(const TRectype& doc_bolla); + void destroy() { _bolle.destroy(); } +}; + +const TString& TLista_bolle::key(const TRectype& rec) +{ + if (rec.num() == LF_RIGHEDOC) + { + _key = rec.get(RDOC_DAPROVV); + _key.add(rec.get(RDOC_DAANNO)); + _key.add(rec.get(RDOC_DACODNUM)); + _key.add(rec.get(RDOC_DANDOC)); + } + else + { + _key = rec.get(DOC_PROVV); + _key.add(rec.get(DOC_ANNO)); + _key.add(rec.get(DOC_CODNUM)); + _key.add(rec.get(DOC_NDOC)); + } + return _key; +} + +void TLista_bolle::add_riga_fatt(const TRectype& riga_fatt) +{ + const TString& k = key(riga_fatt); + TArray* fatture = (TArray*)_bolle.objptr(k); + if (fatture == NULL) + { + fatture = new TArray; + _bolle.add(k, fatture); + } + fatture->add(riga_fatt); +} + +TArray* TLista_bolle::find_bolla(const TRectype& doc_bolla) +{ + const TString& k = key(doc_bolla); + return (TArray*)_bolle.objptr(k); +} + +/////////////////////////////////////////////////////////// +// TScoperto_app +/////////////////////////////////////////////////////////// + +class TScoperto_app : public TSkeleton_application +{ + TLista_bolle _bolle_fatturate; + +protected: + virtual void main_loop(); + +public: + bool trova_bolle_fatturate_dal(TString_array& bolle, TString_array& fatture, char stato_fatt, const TDate& datarif); + void print_bolle(TString_array& bolle, char stato_bolle, char stato_fatture, const TDate& datarif, bool work_on_res); +}; + +bool TScoperto_app::trova_bolle_fatturate_dal(TString_array& bolle, TString_array& fatture, char stato_fatt, const TDate& datarif) +{ + TEsercizi_contabili esc; + const int codes = esc.date2esc(datarif); + const TDate inies = esc[codes].inizio(); + + TRelation rel(LF_DOC); + TRectype& curr = rel.curr(); + + TString str; + str << "Ricerca bolle fatturate dopo il " << datarif; + + _bolle_fatturate.destroy(); + + curr.put(DOC_DATADOC, inies); + if (fatture.items() == 1) // Ottimizziamo un po' il filtro, se c'é una sola fattura + { + curr.put(DOC_PROVV, "D"); + curr.put(DOC_ANNO, inies.year()); + curr.put(DOC_CODNUM, fatture.row(0)); + } + + TCursor cur(&rel, "", 3, &curr); + const long items = cur.items(); + cur.freeze(); + + TProgind pi(items, str, TRUE, TRUE); + + TRecord_array righe(LF_RIGHEDOC, RDOC_NRIGA); + + for (cur = 0; cur.pos() < items; ++cur) + { + pi.addstatus(1); + if (pi.iscancelled()) + return FALSE; + + const TString& codnumfat = curr.get(DOC_CODNUM); + if (fatture.find(codnumfat) >= 0) // E' proprio una fattura! + { + const TDate data = curr.get(DOC_DATADOC); + const char stato = curr.get_char(DOC_STATO); + + // Devo considerare le fatture dopo la datarif + // oppure quelle non ancora contabilizzate prima della datarif + if (data > datarif || stato < stato_fatt) + { + TRectype* chiave = new TRectype(LF_RIGHEDOC); + chiave->put(RDOC_PROVV, curr.get(DOC_PROVV)); + chiave->put(RDOC_ANNO, curr.get(DOC_ANNO)); + chiave->put(RDOC_CODNUM, curr.get(DOC_CODNUM)); + chiave->put(RDOC_NDOC, curr.get(DOC_NDOC)); + righe.read(chiave); + for (int r = righe.rows(); r > 0; r--) + { + const TRectype& riga = righe.row(r); + const TString& codnumbol = riga.get(RDOC_DACODNUM); + if (codnumbol.not_empty() && bolle.find(codnumbol) >= 0) // Riga generata da fattura! + _bolle_fatturate.add_riga_fatt(riga); + } + } + } + } + + return TRUE; +} + +void TScoperto_app::print_bolle(TString_array& bolle, char stato_bolle, char stato_fatture, const TDate& datarif, bool work_on_res) +{ + TEsercizi_contabili esc; + const int codes = esc.date2esc(datarif); + const TDate inies = esc[codes].inizio(); + + TRelation rel(LF_DOC); + TRectype& curr = rel.curr(); + curr.put(DOC_DATADOC, inies); + + TRectype recfin = curr; + recfin.put(DOC_DATADOC, datarif); + + // Elenco di tutte le bolle comprese tra inizio esercizio e datarif + TString filter; + for (int i = 0; i < bolle.items(); i++) + { + if (i > 0) filter << "||"; + filter << "(" << DOC_CODNUM << "==\"" << bolle.row(i) << "\")"; + } + TCursor cur(&rel, filter, 3, &curr, &recfin); + const long items = cur.items(); + + if (items > 0) + { + cur.freeze(); + + TScoperto_form form(datarif, work_on_res, stato_bolle, stato_fatture); + printer().open(); + + long printed = 0; + for (cur = 0L; cur.pos() < items; ++cur) + { + if (printer().frozen()) + break; + const char stato = curr.get_char(DOC_STATO); + if (stato == stato_bolle) // Bolla da fatturare + { + printed += form.print_bolla(curr, NULL); + } + else + { + TArray* fatt = _bolle_fatturate.find_bolla(curr); + if (fatt != NULL) // Bolla fatturata + printed += form.print_bolla(curr, fatt); + } + } + if (printed > 0) + form.print_total(); + + printer().close(); + } +} + +void TScoperto_app::main_loop() +{ + open_files(LF_TABCOM, LF_DOC, LF_RIGHEDOC, LF_CLIFO, LF_CFVEN, 0); + + TScoperto_msk msk; + while (msk.run() != K_QUIT) + { + const TDate datarif = msk.get(F_DATA); + const bool work_on_res = msk.get_bool(F_CONSORD); + + TSheet_field& s = msk.sfield(F_BOLLE); + char stato_bolle = ' ', stato_fatt = ' '; + + // Costruisco la lista delle bolle e delle fatture da leggere + TString_array bolle, fatture; + FOR_EACH_SHEET_ROW(s, r, row) if (*row->get(0) == 'X') + { + bolle.add(row->get(F_CODNUM-FIRST_FIELD)); + if (stato_bolle <= ' ') + stato_bolle = row->get(F_STATOBOLL-FIRST_FIELD)[0]; + + TToken_string f(row->get(F_FATTURE-FIRST_FIELD), ','); + FOR_EACH_TOKEN(f, t) + { + if (fatture.find(t) < 0) + fatture.add(t); + } + + if (stato_fatt <= ' ') + stato_fatt = row->get(F_STATOFATT-FIRST_FIELD)[0]; + } + + bool ok = trova_bolle_fatturate_dal(bolle, fatture, stato_fatt, datarif); + if (ok) + print_bolle(bolle, stato_bolle, stato_fatt, datarif, work_on_res); + } +} + +int ve1200(int argc, char* argv[]) +{ + TScoperto_app a; + a.run(argc, argv, "Scoperto da fattura"); + return (0); +} diff --git a/ve/ve1200a.frm b/ve/ve1200a.frm new file mode 100755 index 000000000..381ca3b78 --- /dev/null +++ b/ve/ve1200a.frm @@ -0,0 +1,311 @@ +#include "ve1200a.h" + +USE LF_DOC +JOIN LF_RIGHEDOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC + +END + +// Testata +SECTION HEADER ODD 3 + +DATA H_DATARIF +BEGIN + PROMPT 50 1 "@bSCOPERTO DA FATTURA AL " +END + +DATA B_NULL +BEGIN + PROMPT 1 2 "Data di stampa " + MESSAGE _TODAY +END + +NUMERO B_NULL 4 +BEGIN + PROMPT 118 2 "Pag." + MESSAGE _PAGENO +END + +END + +// Testata bolle +SECTION BODY FIRST 5 + +STRINGA B_NULL +BEGIN + PROMPT 1 1 "__________________________________________________________________________________________________________________________________" +END + +STRINGA B_NULL +BEGIN + PROMPT 1 2 "@bData Bolla" +END + +DATA B_NULL 10 +BEGIN + PROMPT 1 3 "" + FIELD LF_DOC->DATADOC +END + +STRINGA B_NULL +BEGIN + PROMPT 12 2 "Numeraz." +END + +STRINGA B_NULL 4 +BEGIN + PROMPT 12 3 "" + FIELD LF_DOC->CODNUM +END + +STRINGA B_NULL +BEGIN + PROMPT 22 2 "N." +END + +NUMERO B_NULL 7 +BEGIN + PROMPT 17 3 "" + FIELD LF_DOC->NDOC +END + +STRINGA B_NULL +BEGIN + PROMPT 25 2 "Stato" +END + +STRINGA B_NULL +BEGIN + PROMPT 25 3 "" + FIELD LF_DOC->STATO +END + +NUMERO B_NULL 6 +BEGIN + PROMPT 28 3 "" + FIELD LF_DOC->CODCF +END + +STRINGA B_NULL +BEGIN + PROMPT 35 2 "Fornitore" +END + +STRINGA B_NULL 40 +BEGIN + PROMPT 35 3 "" + MESSAGE _CLIFO +END + +STRINGA B_NULL +BEGIN + PROMPT 94 2 "Doc. rif." +END + +STRINGA B_NULL +BEGIN + PROMPT 94 3 "" + FIELD NUMDOCRIF +END + +STRINGA B_NULL +BEGIN + PROMPT 104 2 "Data rif." +END + +STRINGA B_NULL +BEGIN + PROMPT 103 3 "" + FIELD DATADOCRIF +END + +STRINGA B_NULL +BEGIN + PROMPT 76 2 "Valuta" +END + +STRINGA T_CODVAL +BEGIN + PROMPT 76 3 "" + FIELD CODVAL +END + +STRINGA B_NULL +BEGIN + PROMPT 87 2 "Cambio" +END + +NUMERO B_NULL 13 5 +BEGIN + PROMPT 80 3 "" + FIELD CAMBIO + PICTURE "###.###,@@@@@" +END + +STRINGA B_NULL +BEGIN + PROMPT 1 5 "@bCodice Articolo" +END + +STRINGA B_NULL +BEGIN + PROMPT 43 5 "UM" +END + +STRINGA B_NULL +BEGIN + PROMPT 51 5 "Quantità" +END + +STRINGA B_NULL +BEGIN + PROMPT 69 5 "Prezzo" +END + +STRINGA B_NULL +BEGIN + KEY "Intestazione valore (azzera totale)" + PROMPT 85 5 "Valore" + MESSAGE RESET,BE->R_VALORE +END + +STRINGA B_NULL +BEGIN + PROMPT 93 5 "Fatt. Rif." +END + +STRINGA B_NULL +BEGIN + PROMPT 104 5 "Data Rif." +END + +STRINGA B_NULL +BEGIN + PROMPT 114 5 "Fattura N." +END + +STRINGA B_NULL +BEGIN + PROMPT 126 5 "Note" +END + +END + +// Righe bolle +SECTION BODY ODD 1 + +STRINGA B_NULL +BEGIN + PROMPT 1 1 "" + FIELD LF_RIGHEDOC->CODARTMAG +END + +STRINGA B_NULL 20 +BEGIN + PROMPT 22 1 "" + MESSAGE _DESCART +END + +STRINGA B_NULL +BEGIN + PROMPT 43 1 "" + FIELD LF_RIGHEDOC->UMQTA +END + +NUMERO R_QUANT 13 3 +BEGIN + KEY "Quantità o residuo (riempito da programma)" + PROMPT 46 1 "" + PICTURE "#.###.###,@@@" +END + +VALUTA B_NULL 15 +BEGIN + KEY "Prezzo Unitario" + PROMPT 60 1 "" + FIELD LF_RIGHEDOC->PREZZO + DRIVENBY BF->T_CODVAL + FLAGS "U" +END + +VALUTA R_VALORE 15 +BEGIN + KEY "Valore della riga (impostato da programma)" + PROMPT 76 1 "" + DRIVENBY BF->T_CODVAL + MESSAGE ADD,BE->R_VALORE +END + +STRINGA R_DOCRIF +BEGIN + KEY "Documento di riferimento (impostato da programma)" + PROMPT 93 1 "" +END + +STRINGA R_DATARIF +BEGIN + KEY "Data di riferimento (impostato da programma)" + PROMPT 103 1 "" +END + +STRINGA R_CODNUM_FAT +BEGIN + KEY "Numerazione fattura (impostato da programma)" + PROMPT 114 1 "" +END + +NUMERO R_NDOC_FAT 7 +BEGIN + KEY "Numero fattura (impostato da programma)" + PROMPT 118 1 "" +END + +STRINGA R_NOTA +BEGIN + KEY "Nota in calce (impostato da programma)" + PROMPT 126 1 "" +END + +END + +// Riga Totale bolla +SECTION BODY EVEN 1 + +STRINGA B_NULL +BEGIN + PROMPT 22 1 "@bTOTALE BOLLA" +END + + +VALUTA R_VALORE 15 +BEGIN + KEY "Totale documento" + PROMPT 76 1 "" + DRIVENBY BF->T_CODVAL + MESSAGE ADD,BL->R_VALORE +END + +END + +// Riga Totale Generale +SECTION BODY LAST 2 + +STRINGA B_NULL +BEGIN + PROMPT 1 1 "__________________________________________________________________________________________________________________________________" +END + +STRINGA B_NULL +BEGIN + PROMPT 22 2 "@bTOTALE SCOPERTO" +END + +VALUTA R_VALORE 15 +BEGIN + KEY "Totale Generale" + PROMPT 76 2 "" + DRIVENBY BF->T_CODVAL +END + +END + + \ No newline at end of file diff --git a/ve/ve1200a.h b/ve/ve1200a.h new file mode 100755 index 000000000..868697424 --- /dev/null +++ b/ve/ve1200a.h @@ -0,0 +1,29 @@ +// Campi maschera selezione +#define F_DATA 201 +#define F_CONSORD 202 +#define F_BOLLE 210 + +// Campi spreadsheet +#define F_SELECTED 101 +#define F_CODNUM 102 +#define F_DESCR 103 +#define F_TIPIDOC 104 +#define F_STATOBOLL 105 +#define F_FATTURE 106 +#define F_STATOFATT 107 + +// Stampa su form +#define B_NULL -1 + +#define H_DATARIF 101 + +#define T_CODVAL 101 + +#define R_QUANT 101 +#define R_VALORE 102 +#define R_DOCRIF 103 +#define R_DATARIF 104 +#define R_CODNUM_FAT 105 +#define R_NDOC_FAT 106 +#define R_NOTA 107 + \ No newline at end of file diff --git a/ve/ve1200a.uml b/ve/ve1200a.uml new file mode 100755 index 000000000..788b8e69e --- /dev/null +++ b/ve/ve1200a.uml @@ -0,0 +1,109 @@ +#include "ve1200a.h" + +TOOLBAR "ToolBar" 0 -3 0 3 + +BUTTON DLG_PRINT 10 2 +BEGIN + PROMPT -12 -11 "~Stampa" + PICTURE BMP_PRINT + MESSAGE EXIT,K_ENTER +END + +BUTTON DLG_QUIT 10 2 +BEGIN + PROMPT -22 -11 "" +END + +ENDPAGE + +PAGE "Scoperto da fattura" -1 -1 80 20 + +DATA F_DATA +BEGIN + PROMPT 1 1 "Data di riferimento " + CHECKTYPE REQUIRED +END + +BOOLEAN F_CONSORD +BEGIN + PROMPT 35 1 "Valorizzazione bolle a residuo" +END + +SPREADSHEET F_BOLLE -1 +BEGIN + PROMPT 0 4 "" + ITEM "Sel." + ITEM "Bolla" + ITEM "Descrizione@30" + ITEM "Tipi Documento@20" + ITEM "Stato" + ITEM "Fatture@30" + ITEM "Stato" +END + +ENDPAGE + +ENDMASK + +PAGE "Bolla" -1 -1 66 8 + +BOOLEAN F_SELECTED +BEGIN + PROMPT 36 1 "Selezionata" +END + +BUTTON DLG_USER 10 2 +BEGIN + PROMPT 52 0 "~Selezione" + PICTURE BMP_SELECT +END + +STRING F_CODNUM 4 +BEGIN + PROMPT 1 1 "Numerazione " + FLAGS "D" +END + +STRING F_DESCR 50 +BEGIN + PROMPT 1 2 "Descrizione " + FLAGS "D" +END + +STRING F_TIPIDOC 50 +BEGIN + PROMPT 1 3 "Tipi doc. " + FLAGS "D" +END + +STRING F_STATOBOLL 1 +BEGIN + PROMPT 1 4 "Stato bolle da fatturare " + FLAGS "D" +END + +STRING F_FATTURE 50 +BEGIN + PROMPT 1 5 "Fatture " + FLAGS "D" +END + +STRING F_STATOFATT 1 +BEGIN + PROMPT 1 6 "Stato fatture contabilizzate " + FLAGS "D" +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -12 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ve/ve2300x.h b/ve/ve2300x.h index e08dd3310..5de774ec2 100755 --- a/ve/ve2300x.h +++ b/ve/ve2300x.h @@ -23,7 +23,8 @@ #define F_R_PROMAGGIO 132 #define F_R_UMOM 133 #define F_R_PREZZO_LORDO 134 -#define F_CODVAL_R 135 +#define F_CODVAL_R 135 +#define F_R_DATALAST 136 // campi riservati ai listini #define F_R_L_CATVEN 141 diff --git a/ve/ve2300x.uml b/ve/ve2300x.uml index d079afa87..e90f37b46 100755 --- a/ve/ve2300x.uml +++ b/ve/ve2300x.uml @@ -413,6 +413,12 @@ BEGIN FLAG "U" END +DATE F_R_DATALAST +BEGIN + PROMPT 49 12 "Data ultimo aumento " + FIELD LF_RCONDV->DATAULTAUM +END + NUMBER F_R_PERCPROVV 5 2 BEGIN PROMPT 2 13 "Provvigione % " @@ -509,4 +515,3 @@ END ENDPAGE ENDMASK - diff --git a/ve/ve3200.cpp b/ve/ve3200.cpp index edb2d3ad6..041028c1d 100755 --- a/ve/ve3200.cpp +++ b/ve/ve3200.cpp @@ -223,7 +223,7 @@ bool TStampa_condizioni_vendita::set_print(int) { _listval= mask.get_bool(F_L_LISTVALUTA); // legge lo stato del checkbox di abilitazione dei listini in valuta _testacomp= mask.get_bool(F_TESTACOMP); // legge l'abilitazione della stampa completa della testata _righecomp= mask.get_bool(F_RIGHECOMP); // legge l'abilitazione della stampa completa delle righe - _printdesagg = mask.get_bool(F_PRINTDESAGG); + _printdesagg = mask.get_bool(F_PRINTDESAGG); //legge l'abilitazione della stampa della descrizione aggiuntiva TLocalisamfile &rcondv= _rel->lfile(); // prende il file principale TRectype da(rcondv.curr()); // prepara il record di inizio regione da.zero(); @@ -375,7 +375,7 @@ void TStampa_condizioni_vendita::preprocess_header() { i++; if (_filter_by_grm) set_header(i,"@3gGr.Merc."); - set_header(i, "@27gSconto @53gA @55gIVA @60gProvvig."); // setta l'header della chiave, della quantità limite e del prezzo + set_header(i, "@27gSconto @53gA @55gIVA @60gProvvig. @109gUlt. Aum."); // setta l'header della chiave, della quantità limite e del prezzo if ((_condven=="C") || (_condven=="O")) set_header(i, "@69gLotto"); // setta l'header del lotto set_header(++i, "@1gUMO @5gQuantita' omaggio @27gQuantita' base @49gCod. art. omagg. @70gPrezzo omaggio"); // setta l'header dello sconto/omaggio if (_condven=="O") set_header(i, "@73gEsaur."); // setta l'header dell'articolo in esaurimento @@ -463,7 +463,8 @@ void TStampa_condizioni_vendita::set_page(int file, int) { set_row(++i, ""); _testastamp= TRUE; } - if (_righecomp) { // stampa della riga in forma completa + if (_righecomp) + { // stampa della riga in forma completa TLocalisamfile &rcondv= current_cursor()->file(); TLocalisamfile &condv= current_cursor()->file(LF_CONDV); TString tiporiga= rcondv.get("TIPORIGA"); @@ -500,6 +501,7 @@ void TStampa_condizioni_vendita::set_page(int file, int) { set_row(++i, "Prezzo: #t", &_strprezzo); set_row(++i, "Pz per conf.: @pn", FLD(-ART1, "PPCONF","###.###.###,@@")); + set_row(++i, "Data ultimo aumento: @d", FLD(LF_RCONDV, "DATAULTAUM")); set_row(++i, "Sconto: @25s", FLD(LF_RCONDV, "SCONTO")); set_row(++i, "Addebito IVA: @f", FLD(LF_RCONDV, "ADDIVA")); //set_row(++i, "Codice IVA: @4s", FLD(LF_RCONDV, "CODIVA")); @@ -516,7 +518,9 @@ void TStampa_condizioni_vendita::set_page(int file, int) { // if ((_condven=="C") || (_condven=="O")) set_row(++i, "Codice lotto: @6s", FLD(LF_RCONDV, "CODLOTTO")); if (_condven=="O") set_row(++i, "Articolo in esaurimento: @f", FLD(LF_RCONDV, "ARTES")); set_row(++i, ""); // salta una riga - } else { // stampa della riga in forma abbreviata + } + else + { // stampa della riga in forma abbreviata TLocalisamfile &rcondv= current_cursor()->file(); TLocalisamfile &condv= current_cursor()->file(LF_CONDV); TString8 tiporiga= rcondv.get("TIPORIGA"); @@ -541,13 +545,12 @@ void TStampa_condizioni_vendita::set_page(int file, int) { set_row(i, "@27g@50s", FLD(-RFA, "S0")); // break; } - //if ((_condven=="L") || (_condven=="O")) - set_row(i, "@24g#t", &_um /*FLD(LF_RCONDV, "UM")*/); // unità di misura + + set_row(i, "@24g#t", &_um); // unità di misura if (tiporiga[0] == 'A' && _printdesagg) { - i++; - set_row(i, "@27g#-100t", &_descragg); + set_row(++i, "@27g#-82t@109g@10s", &_descragg, FLD(LF_RCONDV, "DATAULTAUM")); } // seconda riga: info accessorie diff --git a/ve/ve7100.cpp b/ve/ve7100.cpp index 4da6a6666..96b58042a 100755 --- a/ve/ve7100.cpp +++ b/ve/ve7100.cpp @@ -331,13 +331,14 @@ error_type TContabil_tsys::write_all(TDocumento& doc, TMovimentoPN_VE & moviment pag.set_inizio(data_inizio); pag.set_total(head.get_real(MOV_TOTDOC), ZERO, ZERO); + pag.set_rate_auto(); for (i = 0 ; i < 12 ; i++) { if (i < nrate) { - format_num(i, 2, work); + format_num(i + 1, 2, work); row << work; TDate dsc = pag.data_rata(i); work = dsc.string(brief); diff --git a/ve/velib.h b/ve/velib.h index 6801d4344..e7323bc7b 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -249,9 +249,12 @@ class TTipo_documento : public TRectype // velib03 TString _str_desc_doc, _str_desc_rdoc; char _tipocf; + char _check_qta; bool _cnt_prezzi, _show_evaded_lines; + protected: + void add_formula_if_needed(TConfig& profile, TString& variable, const char* varname, const char* formula); void read_formule(); int read(const char* tipodoc); @@ -278,12 +281,15 @@ public: bool is_bolla() const { return tipo() == _bolla; } bool is_ordine() const { return tipo() == _ordine; } bool controllo_prezzi() const { return _cnt_prezzi; } - const TString& field_prezzo() const { return _field_prezzo; } + const char * field_prezzo() const { return _field_prezzo; } const TString& field_qta() const { return _field_qta; } const TString& field_qtaevasa() const { return _field_qtaevasa; } + bool check_giac() const { return _check_qta == 'G'; } + bool check_disp() const { return _check_qta == 'D'; } + const TString & descrizione() const { return get("S0"); } - const TString & riferimento(const TDocumento & doc) const ; + const TString & riferimento(const TDocumento& doc, TString& rif) const; const TString & imponibile() const { return _imponibile;} const TString & imposta() const { return _imposta;} const TString & totale_doc() const { return _totale;} @@ -341,7 +347,7 @@ public: TObject* dup() const { return new TCodice_numerazione(*this); } public: - int read(const char * cod); + int read(const char* cod); const TString& codice() const { return get("CODTAB"); } const TString& descrizione() const { return get("S0"); } const TString& prefisso() const { return get("S6"); } @@ -352,8 +358,8 @@ public: const TString & tipo_doc(int i) const { CHECK(i < MAX_TIPI_DOC, "Impossibbile tipo documento"); return ((TString& ) get("S2").mid(i << 2, 4)).trim();} int ntipi_doc() const {const int l = get("S2").len(); return l ? (((l - 1) >> 2) + 1) : 0;} - const char * complete_num (long num); - int status() { return _status; } + void complete_num(long num, TString& codnum) const; + bool ok() const { return !empty(); } TCodice_numerazione(const char* codnum = NULL); TCodice_numerazione(const TRectype& rec); virtual ~TCodice_numerazione(); @@ -364,16 +370,24 @@ class TTipo_riga_documento : public TRectype // velib02 static TAssoc_array _formule_riga; TToken_string _formule; TString16 _name; + TString16 _imponibile; - TString16 _provv; + TString16 _quant; + TString16 _quantevasa; TString16 _qtares; - TString16 _rigavalore; - TString16 _rigavalres; + TString16 _valore; + TString16 _valres; + + TString16 _field_provv; + TString16 _field_qta, _field_qtaevasa; // Veri campi Quantità e Quantità Evasa + int _decrp; int _incrp; protected: void read_formule(); + void add_formula_if_needed(TConfig& profile, TString& variable, + const char* varname, const char* formula); public: TObject* dup() const { return new TTipo_riga_documento(codice()); } @@ -385,19 +399,24 @@ public: const TString& descrizione() const { return get("S0"); } char tipo() const { return get_char("S7"); } + const TString& imponibile() const { return _imponibile;} - const TString& provv() const { return _provv;} - const TString& qtares() const { return _qtares;} - const TString& rigavalore() const { return _rigavalore;} - const TString& rigavalres() const { return _rigavalres;} + const TString& quant() const { return _quant;} + const TString& quantevasa() const { return _quantevasa;} + const TString& field_qta() const { return _field_qta;} + const TString& field_qtaevasa() const { return _field_qtaevasa;} + + const TString& provv() const { return _field_provv;} const int incr_perc_prezzo() const { return _incrp;} const int decr_perc_prezzo() const { return _decrp;} + bool formfeed() const { return get_bool("B0"); } int detraibilita() const { return get_int("I0"); } real perc_indetraibilita() const { return get_real("R0"); } TFormula_documento* first_formula() { return succ_formula(TRUE); } TFormula_documento* succ_formula(bool restart = FALSE); + int read(const char* tiporig); TTipo_riga_documento(const char* tiporig = NULL); @@ -491,7 +510,10 @@ public: real imposta(bool round = TRUE) const; real provvigione(int ndec = AUTO_DECIMALS) const; - real quantita() const { return get_real(RDOC_QTA); } + const TString& field_qta() const; + const TString& field_qtaevasa() const; + real quantita() const; + real qtaevasa() const; real qtaresidua() const; real valore(bool totale, int ndec) const; const TString & codice_commessa() const; @@ -518,7 +540,7 @@ class TRiepilogo_iva : public TObject real _sconto_perc; real _sconto_imp; real _iva_sconto; - byte _tipo; + byte _tipo; protected: virtual TObject* dup() const { return new TRiepilogo_iva(*this); } @@ -599,8 +621,6 @@ protected: void dirty_tabella_iva() { _tabella_iva.destroy();} static void test_firm(); - - void init(); void check_modules(); virtual void set_variables(TExpression * e) const ; @@ -617,7 +637,7 @@ public: TCli_for & clifor() const; TOccasionale & occas() const; const TAgente & agente() const; - const TString & riferimento() const { return tipo().riferimento(*this); } + const TString & riferimento(TString& rif) const { return tipo().riferimento(*this, rif); } virtual TRecord_array& body(int logicnum = 0) const; virtual TDocumento & operator =(const TDocumento & d) {return copy(d);} @@ -1054,50 +1074,9 @@ enum error_type { }; class TBill; +class TMovimentoPN_VE; +class TSaldo_agg; -// TMovimentoPN_VE -// Classe derivata da TMovimentoPN per calcolare automaticamente le righe conabili -// una volta settate le righe iva e la riga di totale documento -// Sostanzialmente di tratta di aggiungere un metodo in piu' : -// recalc_cg_rows(), liberamente ispirato alla notify_iva() in cg2102.cpp - -class TMovimentoPN_VE : public TMovimentoPN -{ - TCausale * _caus; - bool _valuta; - -protected: - // simula il K_SPACE di iva_notify - void create_row(int i, const TString & descr_cr); - // simula il K_ENTER di iva_notify - void enter_row(int i, const TString & descr_cr); - // verifica se si tratta di iva indetraibile - bool detraibile(TRectype& rec) const ; - // cerca la prima tra quelle di contabilita' che corrisponde al tipo indicato - int type2pos(char tipo); - // Trova nelle righe contabili un conto nelle righe di tipo prescelto - int bill2pos(const TBill& conto, const TString & codcms, const TString & fascms, char tipo); - // trasforma un real in TImporto, in base al tipo riga - TImporto real2imp(const real& r, char row_type); - // setta il record delle righe di contabilita' - int set_cg_rec(int n, const TImporto& imp, TBill& conto, const char * codcms, const char * fascms, const char* desc, char tipo); - // aggiunge l'importo indicato alla n-esima riga di contabilita' - bool add_cg_rec(int n, const TImporto& imp); - // Legge l'importo della riga n e lo ritorna col segno dovuto - TImporto get_cg_imp(int n); - // Setta l'importo della riga n - void set_cg_imp(int n, const TImporto& imp); - // verifica se il movimento e' quadrato oppure ha qualche maledetto sbilancio - // ritorna TRUE, ovviamente, se everything's alright. -public: - // ricalcola le righe di contabilita' dalle righe iva presenti - // e verifica la quadratura del movimento. Ritorna TRUE se il movimento e' scrivibile - bool movement_ok() ; - int recalc_cg_rows(const TString & descr_cr, TCausale & caus); - TMovimentoPN_VE(bool valuta) : _valuta(valuta), _caus(NULL) {}; - virtual ~TMovimentoPN_VE() {} -}; - class TContabilizzazione : public TElaborazione // velib04b { @@ -1194,8 +1173,8 @@ protected: error_type write_anticipo(TDocumento&); // scrive il movimento INTRA error_type write_intra(TDocumento&); - // Aggiorna i saldi: TRUE per il movimento normale, FALSE per quello di anticipo pagamento - void aggiorna_saldi(bool n); + // Aggiorna i saldi + void aggiorna_saldi(TSaldo_agg& saldo, TMovimentoPN& mv, bool save); // Visualizza l'ultimo errore rilevato void display_error(TDocumento&); // Verifica se non ci sono stati errori @@ -1214,7 +1193,10 @@ public: void set_writeable(const bool b) { _can_write = b; } const long processed_docs() const { return _total_docs; } void inc_processed_docs() { _total_docs++; } - + + // Ritorna il numero dell'eventuale movimento con cui il documento stato contabilizzato + long doc_contabilized(const TDocumento& doc, bool anticipo) const; + // Ritorna TRUE se il documento precedente a doc e' gia' stato contabilizzato bool prev_contabilized(const TDocumento& doc) const; @@ -1370,5 +1352,4 @@ public: virtual ~TDocumentoEsteso(); }; - #endif \ No newline at end of file diff --git a/ve/velib01.cpp b/ve/velib01.cpp index f0bf481de..7161bdc0d 100755 --- a/ve/velib01.cpp +++ b/ve/velib01.cpp @@ -2,6 +2,50 @@ #include "velib.h" +///////////////////////////////////////////////////////////// +// TCodice_numerazione +///////////////////////////////////////////////////////////// + +TCodice_numerazione::TCodice_numerazione(const char* codnum) + : TRectype(LF_TABCOM) +{ + settab("NUM"); + if (codnum && *codnum) + read(codnum); + else + setempty(TRUE); +} + +TCodice_numerazione::TCodice_numerazione(const TRectype& rec) + : TRectype(rec) +{ } + +TCodice_numerazione::~TCodice_numerazione() +{ +} + +void TCodice_numerazione::complete_num(long num, TString& codnum) const +{ + codnum = prefisso(); + codnum << num; + codnum << postfisso(); +} + +int TCodice_numerazione::read(const char* codnum) +{ + *this = cache().get("%NUM", codnum); + int err = empty() ? _iskeynotfound : NOERR; +#ifdef DBG + if (err != NOERR) + NFCHECK("Codice numerazione errato: %s", codnum); +#endif + return err; +} + +///////////////////////////////////////////////////////////// +// TSpesa_prest +///////////////////////////////////////////////////////////// + HIDDEN const real CENTO(100.0); // costante per evitare la chiamata dei costruttori real tante volte TSpesa_prest::TSpesa_prest(const char* codice, char tipo) @@ -113,11 +157,11 @@ real netto2lordo(const real& netto, const real& iva, int ndec) imposta = (netto * iva) / 100.0; // Calcola l'imposta if (ndec < 20) { - if(imposta < ZERO) - imposta.floor(ndec); - else - imposta.ceil(ndec); - } + if(imposta < ZERO) + imposta.floor(ndec); + else + imposta.ceil(ndec); + } } const real lordo = imposta + netto; // prezzo lordo return lordo; diff --git a/ve/velib02.cpp b/ve/velib02.cpp index b63f290db..949fdb268 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -81,76 +81,50 @@ int TTipo_riga_documento::read(const char* tiporig) return err; } +void TTipo_riga_documento::add_formula_if_needed(TConfig& profile, TString& variable, + const char* varname, const char* formula) +{ + variable = profile.get(varname, "MAIN"); + if (variable.empty()) + variable = varname; + const TRectype& trr = cache().get("%TRR", variable); + if (trr.empty()) + _formule_riga.add(variable, new TFormula_documento(_riga, variable, formula), TRUE); + if (_formule.find(variable) < 0) + _formule.add(variable); +} + void TTipo_riga_documento::read_formule() - { - TFilename prof(profile_name()); + TFilename prof(profile_name()); prof.ext("ini"); + TConfig profile(prof, "MAIN"); - prof.ext("ini"); - - TConfig profile(prof); - - _formule = profile.get("CAMPICALC", "MAIN"); - const TString & calcoli = profile.get("CALCOLI", "MAIN"); + _formule = profile.get("CAMPICALC"); + const TString & calcoli = profile.get("CALCOLI"); if (calcoli == "*") { - TTable frd("%FRR"); - - for (int err = frd.first(); err == NOERR; err = frd.next()) + TTable frr("%FRR"); + for (int err = frr.first(); err == NOERR; err = frr.next()) { - const TString & formula = frd.get("CODTAB"); + const TString& formula = frr.get("CODTAB"); if (_formule.find(formula) < 0) _formule.add(formula); } } else _formule.add(calcoli); - _imponibile = profile.get("IMPONIBILE", "MAIN"); - if (_imponibile.empty()) - _imponibile = "IMPONIBILE"; - TTable frr("%FRR"); - - frr.put("CODTAB", _imponibile); - if (frr.read() != NOERR) - _formule_riga.add(_imponibile, new TFormula_documento(_riga, _imponibile, "IMPORTO(1)"), TRUE); - if (_formule.find(_imponibile) < 0) - _formule.add(_imponibile); + _field_provv = profile.get("PROVV"); + _field_qta = profile.get("QTA"); // Non dare un default: ingannerebbe il tipo documento + _field_qtaevasa = profile.get("QTAEVASA"); // Non dare un default: ingannerebbe il tipo documento + _incrp = profile.get_int("VARP+"); + _decrp = profile.get_int("VARP-"); - _provv = profile.get("PROVV", "MAIN"); - - _qtares = profile.get("QTARES", "MAIN"); - if (_qtares.empty()) - _qtares = "QTARES"; - - frr.put("CODTAB", _qtares); - if (frr.read() != NOERR) - _formule_riga.add(_qtares, new TFormula_documento(_riga, _qtares, "QTARES()"), TRUE); - if (_formule.find(_qtares) < 0) - _formule.add(_qtares); - - _rigavalres = profile.get("RIGAVALRES", "MAIN"); - if (_rigavalres.empty()) - _rigavalres = "RIGAVALRES"; - - _rigavalore = profile.get("RIGAVALORE", "MAIN"); - if (_rigavalore.empty()) - _rigavalore = "RIGAVALORE"; - - frr.put("CODTAB", _rigavalres); - if (frr.read() != NOERR) - _formule_riga.add(_rigavalres, new TFormula_documento(_riga, _rigavalres, "QTARES()*PREZZO(1,0)"), TRUE); - if (_formule.find(_rigavalres) < 0) - _formule.add(_rigavalres); - - frr.put("CODTAB", _rigavalore); - if (frr.read() != NOERR) - _formule_riga.add(_rigavalore, new TFormula_documento(_riga, _rigavalore, "QTA*PREZZO(1,0)"), TRUE); - if (_formule.find(_rigavalore) < 0) - _formule.add(_rigavalore); - _incrp = profile.get_int("VARP+", "MAIN"); - _decrp = profile.get_int("VARP-", "MAIN"); + add_formula_if_needed(profile, _imponibile, "IMPONIBILE", "IMPORTO(1)"); + add_formula_if_needed(profile, _quant, "QUANT", "QUANT()"); + add_formula_if_needed(profile, _quantevasa, "QUANTEVASA", "QUANTEVASA()"); + add_formula_if_needed(profile, _qtares, "QTARES", "QTARES()"); } TFormula_documento * TTipo_riga_documento::succ_formula(bool restart) @@ -397,7 +371,7 @@ TRiga_documento& TRiga_documento::operator +=(const TRiga_documento& r) } if (!get_bool("RIGAEVASA")) { - if (qtaresidua().is_zero()) + if (qtaresidua().is_zero()) // same as is_evasa() put("RIGAEVASA", "X"); } @@ -459,7 +433,7 @@ real TRiga_documento::importo(bool scontato, bool lordo, int ndec) const const bool doc_al_lordo = doc().tipo().calcolo_lordo(); TTipo_calcolo c = _nessun_calcolo; const char tipor = tipo().tipo(); - const real qta = get_real("QTA"); + const real qta = get_real(RDOC_QTA); real r1; switch (tipor) @@ -626,19 +600,43 @@ real TRiga_documento::provvigione(int ndec) const return val; } +const TString& TRiga_documento::field_qta() const +{ + const TString& rowtype_field = tipo().field_qta(); + if (rowtype_field.not_empty()) + return rowtype_field; + const TString& doctype_field = doc().tipo().field_qta(); + return doctype_field; +} + +const TString& TRiga_documento::field_qtaevasa() const +{ + const TString& rowtype_field = tipo().field_qtaevasa(); + if (rowtype_field.not_empty()) + return rowtype_field; + const TString& doctype_field = doc().tipo().field_qtaevasa(); + return doctype_field; +} + +real TRiga_documento::quantita() const +{ + return get_real(field_qta()); +} + +real TRiga_documento::qtaevasa() const +{ + return get_real(field_qtaevasa()); +} + real TRiga_documento::qtaresidua() const { - real val; if (!get_bool(RDOC_RIGAEVASA)) { - const TTipo_documento& tipo = doc().tipo(); - const real qta = get_real(tipo.field_qta()); - const real qtaeva = get_real(tipo.field_qtaevasa()); - val = qta - qtaeva; - if (val < ZERO) - val = ZERO; + real val = quantita() - qtaevasa(); + if (val > ZERO) + return val; } - return val; + return ZERO; } bool TRiga_documento::is_evasa() const @@ -650,14 +648,32 @@ real TRiga_documento::valore(bool totale, int ndec) const { real val; + TString16 field_qta = tipo().field_qta(); + if (field_qta.empty()) + field_qta = doc().tipo().field_qta(); + const bool qta_is_price = field_qta == RDOC_PREZZO; + + if (totale) + { + TString16 field_qta = tipo().field_qta(); + if (field_qta.empty()) + field_qta = doc().tipo().field_qta(); + if (qta_is_price) + field_qta = RDOC_QTA; + val = get_real(field_qta); + val *= prezzo(TRUE, FALSE, ALL_DECIMALS); + } + else + { + val = qtaresidua(); + if (!qta_is_price) + val *= prezzo(TRUE, FALSE, ALL_DECIMALS); + } + if (ndec == AUTO_DECIMALS) ndec = doc().decimals(); - - const TString16 field(totale ? tipo().rigavalore() : tipo().rigavalres()); - - if (field.not_empty()) - val = get_real(field); val.round(ndec); + return val; } diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 0ec8767dc..aeb6756f1 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -347,8 +347,6 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const static real bolli_es; static real impmin_bolli; static int nscagl; - TLocalisamfile clifo(LF_CLIFO); - short estero = 2; if (get_bool("ADDBOLLI")) { @@ -388,7 +386,8 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const TCurrency_documento spese_val(spese()); spese_val.change_to_firm_val(); const real sp_orig = spese_val.get_num(); - + bool estero = FALSE; // Assumiamo per ora non estero + for (int j = 0; j < 5 && tot_bolli+iva_bolli != old_bolli; j++) { old_bolli = tot_bolli + iva_bolli; @@ -432,29 +431,28 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const case _tratta: case _tratta_acc: { - if (estero == 2) - { - clifo.put("TIPOCF", get("TIPOCF")); - clifo.put("CODCF", get("CODCF")); - - if (clifo.read() != NOERR) - clifo.zero(); - - const TString16 stato(clifo.get("STATOPAIV")); - - estero = stato.not_empty() && stato != "IT"; + if (j == 0) // Dobbiamo inizializzare la variabile 'estero' + { + TString16 key; + key.format("%c|%ld", get_char(DOC_TIPOCF), get_long(DOC_CODCF)); + const TRectype& clifo = cache().get(LF_CLIFO, key); + + const TString& stato_iva = clifo.get(CLI_STATOPAIV); + estero = stato_iva.not_empty() && stato_iva != "IT"; if (!estero) - estero = clifo.get("STATOCF").not_empty() || clifo.get("COMCF")[0] == 'Z'; + { + const TString& stato_cf = clifo.get(CLI_STATOCF); + estero = (stato_cf.not_empty() && stato_cf != "IT") || clifo.get_char(CLI_COMCF) == 'Z'; + } } real r(imp); - int ndec = decimals(); - - r.ceil(ndec - 3); + const int ndec = decimals(); + r.ceil(ndec == 0 ? -3 : 0); if (estero) r *= 0.009; else r *= 0.012; - r.round(ndec - 2); + r.round(ndec == 0 ? -2 : ndec); tot_bolli += r; } break; @@ -477,9 +475,9 @@ real TDocumento::bolli(real & imp, int ndec, TTipo_importo t) const if (t == _imposta) tot_bolli = iva_bolli; - const real cambio = get_real("CAMBIO"); - if (!cambio.is_zero()) + if (in_valuta()) { + const real cambio = get_real("CAMBIO"); const exchange_type ce = get_bool(DOC_CONTROEURO) ? _exchange_contro : _exchange_base; tot_bolli = change_currency(tot_bolli, "", ZERO, _exchange_undefined, get(DOC_CODVAL), cambio, ce, -1); @@ -1338,7 +1336,7 @@ TProvvigioni_agente& TDocumento::calc_provvigioni(const bool generata) // Rimuove eventuali righe in eccesso const int rd_items = rd.items(); // Rate precedenti - for (i = nrate+1; i < rd_items; i++) + for (i = first_rata_ok ? nrate+1 : nrate; i < rd_items; i++) rd.remove_rata(i); delete pag2; return *_provv_agente; @@ -1462,40 +1460,53 @@ void TDocumento::set_fields(TAuto_variable_rectype & rec) if (tipo_valido()) { TTipo_documento & tipo_doc = (TTipo_documento &) tipo(); - const TString16 tot_doc(tipo_doc.totale_doc()); + const TString& tot_doc = tipo_doc.totale_doc(); + const TString& tot_provv = tipo_doc.totprovv(); for (const TFormula_documento* f = tipo_doc.first_formula(); f; f = tipo_doc.succ_formula()) { TExpr_documento * exp = f->expr(); - - if (tot_doc == f->name()) + if (f->name() == tot_doc) { - TString16 work_tot_doc(tot_doc); - - work_tot_doc.insert("_"); - const TString80 netto_def(exp->string()); + TString16 tot_doc_netto(tot_doc); + tot_doc_netto.insert("_"); + + const TFixed_string netto_def(exp->string()); TExpr_documento netto_exp(netto_def, _numexpr, this); - add_field(new TDocumento_variable_field(work_tot_doc, netto_exp)); + add_field(new TDocumento_variable_field(tot_doc_netto, netto_exp)); if (netto_def == "IMPONIBILI()+IMPOSTE()") { TExpr_documento tot_exp("IMPONIBILI(1)+IMPOSTE(1)", _numexpr, this); - add_field(new TDocumento_variable_field(f->name(), tot_exp)); + add_field(new TDocumento_variable_field(tot_doc, tot_exp)); } else { - TExpr_documento tot_exp(format("%s + _BOLLI(%s)", (const char *) work_tot_doc, - (const char *) work_tot_doc), _numexpr, this); - add_field(new TDocumento_variable_field(f->name(), tot_exp)); + TExpr_documento tot_exp(format("%s + _BOLLI(%s)", (const char *) tot_doc_netto, + (const char *) tot_doc_netto), _numexpr, this); + add_field(new TDocumento_variable_field(tot_doc, tot_exp)); } } else - if (exp) - { - exp->set_doc(this); - add_field(new TDocumento_variable_field(f->name(), *exp)); + if (f->name() == tot_provv) + { + TString16 tot_provv_netto(tot_provv); + tot_provv_netto.insert("_"); + + const TFixed_string netto_def(exp->string()); + TExpr_documento netto_exp(netto_def, _numexpr, this); + add_field(new TDocumento_variable_field(tot_provv_netto, netto_exp)); + + TExpr_documento tot_exp("TOTPROVV()", _numexpr, this); + add_field(new TDocumento_variable_field(tot_provv, "")); } + else + if (exp) + { + exp->set_doc(this); + add_field(new TDocumento_variable_field(f->name(), *exp)); + } } } } @@ -1503,17 +1514,15 @@ void TDocumento::set_fields(TAuto_variable_rectype & rec) real TDocumento::imponibile(bool spese, int ndec) const { real val; - if (physical_rows() > 0) { TAssoc_array & table = ((TDocumento *)this)->tabella_iva(); - - if (ndec == AUTO_DECIMALS) - ndec = decimals(); - for (TRiepilogo_iva * ri = (TRiepilogo_iva *) table.get(); ri != NULL; ri = (TRiepilogo_iva *) table.get()) val += ri->imponibile(spese); + + if (ndec == AUTO_DECIMALS) + ndec = decimals(); val.round(ndec); } return val; @@ -1533,12 +1542,12 @@ void TDocumento::calc_iva_fattura_commerciale() if (tabella_ripartizione.items() == 0) { - TConfig cnf(CONFIG_STUDIO); + TConfig cnf(CONFIG_STUDIO, "ve"); for (int k = 1; k <= MAX_IVA_SLICES; k++) { TToken_string* tt = new TToken_string(); - tt->add(cnf.get("EXCLUDE_PERC", "ve", k)); - tt->add(cnf.get("EXCLUDE_IVA", "ve", k)); + tt->add(cnf.get("EXCLUDE_PERC", NULL, k)); + tt->add(cnf.get("EXCLUDE_IVA", NULL, k)); tabella_ripartizione.add(tt); } } @@ -1647,7 +1656,7 @@ void TDocumento::update_tabella_iva() real tot_sconti_perc; const bool doc_al_lordo = tipo().calcolo_lordo(); const int ndec = decimals(); - const bool fatt_comm = tipo().fattura_commerciale(); + const bool fatt_comm = tipo().fattura_commerciale(); TString16 codiva_es; iva_esente(codiva_es); @@ -1856,8 +1865,7 @@ real TDocumento::totale_doc() const real TDocumento::totale_netto() const { - const TString16 field(tipo().totale_netto()); - + const TString& field = tipo().totale_netto(); if (field.not_empty()) return get_real(field); else @@ -1866,7 +1874,7 @@ real TDocumento::totale_netto() const real TDocumento::basesconto() const { - const TString16 field(tipo().basesconto()); + const TString& field = tipo().basesconto(); if (field.not_empty()) return get_real(field); @@ -1876,8 +1884,7 @@ real TDocumento::basesconto() const real TDocumento::spese() const { - const TString16 field(tipo().spese()); - + const TString& field = tipo().spese(); if (field.not_empty()) return get_real(field); else @@ -2081,10 +2088,8 @@ TRecord_array& TDocumento::body(int logicnum) const } void TDocumento::update_spese_aut(TString_array & spese_aut, bool preserve_old, TSheet_field * sh) - { const bool updated = get_bool("SPESEUPD"); - if (updated) return; @@ -2136,7 +2141,6 @@ void TDocumento::update_spese_aut(TString_array & spese_aut, bool preserve_old, case 'Q': { real qta = sp.qta(); - if (qta == ZERO) qta = 1.0; riga.put("QTA", qta); @@ -2171,7 +2175,6 @@ void TDocumento::update_spese_aut(TString_array & spese_aut, bool preserve_old, } } } - } put("SPESEUPD", TRUE); } @@ -2192,8 +2195,7 @@ real TDocumento::calc_conai_qta(int type) TArticolo_giacenza * art = r.articolo(); if (art != NULL) { - const real row_qta = r.get("QTA"); - + const real row_qta = r.get(RDOC_QTA); qta += row_qta*art->get_real(__conai_art_names[type]); } } diff --git a/ve/velib03a.cpp b/ve/velib03a.cpp index b3529b498..57ef87da1 100755 --- a/ve/velib03a.cpp +++ b/ve/velib03a.cpp @@ -53,28 +53,27 @@ const char TTipo_documento::tipocf() return _tipocf; } -const TString & TTipo_documento::riferimento(const TDocumento & doc) const +const TString& TTipo_documento::riferimento(const TDocumento & doc, TString& rif) const { - static TString __rif; - __rif = get("S1"); - int p = __rif.find('{'); + rif = get("S1"); + int p = rif.find('{'); while (p >= 0) { - const int last = __rif.find('}'); - const TString16 field_name(__rif.sub(p + 1, last)); + const int last = rif.find('}'); + const TString16 field_name(rif.sub(p + 1, last)); const TFieldref field(field_name, LF_DOC); if (last < 0) - __rif.cut(p); + rif.cut(p); else { - const int len = __rif.len() - last; + const int len = rif.len() - last; for (int i = 0; i <= len; i++) - __rif[p + i] = __rif[last + i + 1]; + rif[p + i] = rif[last + i + 1]; } if (field.file() == LF_DOC) - __rif.insert(field.read(doc), p); + rif.insert(field.read(doc), p); else { TString16 key(doc.get(DOC_TIPOCF)); @@ -82,12 +81,12 @@ const TString & TTipo_documento::riferimento(const TDocumento & doc) const const TRectype rec = cache().get(field.file(), key); - __rif.insert(field.read(rec), p); + rif.insert(field.read(rec), p); } - p = __rif.find('{'); + p = rif.find('{'); } - return __rif; + return rif; } const TString_array& TTipo_documento::keys_descrs() @@ -161,7 +160,7 @@ const TString_array& TTipo_documento::handlers() int numhandler = prof.get_int( "NHANDLER", "HANDLERS" ); // prof - for (int i = 1; i <= numhandler; i ++ ) + for (int i = 1; i <= numhandler; i++) { chiave.format("%d", i); _handlers.add(prof.get(chiave, "HANDLERS")); @@ -196,6 +195,19 @@ void TTipo_documento::set_defaults(TMask& m) } } +void TTipo_documento::add_formula_if_needed(TConfig& profile, TString& variable, + const char* varname, const char* formula) +{ + variable = profile.get(varname, "MAIN"); + if (variable.empty()) + variable = varname; + const TRectype& trr = cache().get("%FRD", variable); + if (trr.empty() || trr.get("S1").empty()) + _formule_documento.add(variable, new TFormula_documento(_documento, variable, formula), TRUE); + if (_formule.find(variable) < 0) + _formule.add(variable); +} + void TTipo_documento::read_formule() { TFilename profile(profile_name()); @@ -203,13 +215,11 @@ void TTipo_documento::read_formule() TConfig prof(profile, "MAIN"); prof.write_protect(); // Altrimenti non si distrugge!!! - _formule = prof.get("CAMPICALC", "MAIN"); - const TString & calcoli = prof.get("CALCOLI", "MAIN"); - + _formule = prof.get("CAMPICALC"); + const TString& calcoli = prof.get("CALCOLI"); if (calcoli == "*") { TTable frd("%FRD"); - for (int err = frd.first(); err == NOERR; err = frd.next()) { const TString & formula = frd.get("CODTAB"); @@ -219,90 +229,30 @@ void TTipo_documento::read_formule() } else _formule.add(calcoli); - _totale = prof.get("TOTALE", "MAIN"); - if (_totale.empty()) - _totale = "TOTDOC"; - const TRectype& for_tot = cache().get("%FRD", _totale); - if (for_tot.empty()) - _formule_documento.add(_totale, new TFormula_documento(_documento, _totale, "IMPONIBILI()+IMPOSTE()"), TRUE); - if (_formule.find(_totale) < 0) - _formule.add(_totale); - _totale_netto = "_"; - _totale_netto << _totale; - - _basesconto = prof.get("BASESCONTO"); - if (_basesconto.empty()) - _basesconto = "BASESCONTO"; - - const TRectype& for_bas = cache().get("%FRD", _basesconto); - if (for_bas.empty()) - _formule_documento.add(_basesconto, new TFormula_documento(_documento, _basesconto, "SOMMA(\"IMPONIBILE()\", \"(TIPO() != 'S') && (TIPO() != 'C')\")"), TRUE); + add_formula_if_needed(prof, _totale, "TOTALE", "IMPONIBILI()+IMPOSTE()"); - if (_formule.find(_basesconto) < 0) - _formule.add(_basesconto); - - _spese = prof.get("SPESE"); - if (_spese.empty()) - _spese = "SPESE"; + _totale_netto = "_"; _totale_netto << _totale; - const TRectype& for_spe = cache().get("%FRD", _spese); - if (for_spe.empty()) - _formule_documento.add(_spese, new TFormula_documento(_documento, _spese, "SOMMA(\"IMPONIBILE()\", \"TIPO() == 'S'\")"), TRUE); - - if (_formule.find(_spese) < 0) - _formule.add(_spese); - - _totvalres = prof.get("TOTVALRES"); - if (_totvalres.empty()) - _totvalres = "TOTVALRES"; - - _totvalore = prof.get("TOTVALORE"); - if (_totvalore.empty()) - _totvalore = "TOTVALORE"; - - const TRectype& for_tvr = cache().get("%FRD", _totvalres); - if (for_tvr.empty()) - _formule_documento.add(_totvalres, new TFormula_documento(_documento, _totvalres, "VALDOC(0)"), TRUE); - - if (_formule.find(_totvalres) < 0) - _formule.add(_totvalres); - - const TRectype& for_tva = cache().get("%FRD", _totvalore); - if (for_tva.empty()) - _formule_documento.add(_totvalore, new TFormula_documento(_documento, _totvalore, "VALDOC(1)"), TRUE); - - if (_formule.find(_totvalore) < 0) - _formule.add(_totvalore); + add_formula_if_needed(prof, _basesconto, "BASESCONTO", "SOMMA(\"IMPONIBILE()\", \"(TIPO()!='S') && (TIPO()!='C')\")"); + add_formula_if_needed(prof, _spese, "SPESE", "SOMMA(\"IMPONIBILE()\", \"TIPO() == 'S'\")"); + add_formula_if_needed(prof, _totvalres, "TOTVALRES", "VALDOC(0)"); + add_formula_if_needed(prof, _totvalore, "TOTVALORE", "VALDOC(1)"); if (provvigioni()) - { - TString80 campo(prof.get("TOTPROVV")); - if (campo.empty()) - campo = "TOTPROVV"; - const TRectype& frd = cache().get("%FRD", campo); + add_formula_if_needed(prof, _totprovv, "TOTPROVV", "SOMMA(\"PROVV()\")"); - _totprovv = "_"; - _totprovv << campo; - - TString80 expr(frd.get("S1")); - if (expr.empty()) - expr = "SOMMA(\"PROVV()\")"; - _formule_documento.add(_totprovv, new TFormula_documento(_documento, _totprovv, expr, TRUE)); - if (_formule.find(campo) < 0) - _formule.add(campo); - _formule.add(_totprovv); - _formule_documento.add(campo, new TFormula_documento(_documento, campo, "TOTPROVV()"), TRUE); - } - _totale_cont = prof.get("TOTALECONT", "MAIN"); + _totale_cont = prof.get("TOTALECONT"); _cnt_prezzi = prof.get_bool("CONTROLLO_PREZZI"); - _field_prezzo = prof.get(RDOC_PREZZO, "MAIN"); - _field_qta = prof.get(RDOC_QTA, "MAIN", -1, RDOC_QTA); - _field_qtaevasa = prof.get(RDOC_QTAEVASA, "MAIN", -1, RDOC_QTAEVASA); + _field_prezzo = prof.get(RDOC_PREZZO); + _field_qta = prof.get(RDOC_QTA, NULL, -1, RDOC_QTA); + _field_qtaevasa = prof.get(RDOC_QTAEVASA, NULL, -1, RDOC_QTAEVASA); + _check_qta = prof.get_char("CHECK_QTA", "MAIN"); _str_desc_doc = prof.get("DESCRIZIONE_DOC"); _str_desc_rdoc = prof.get("DESCRIZIONE_RDOC"); _show_evaded_lines = !prof.get_bool("NASCONDI_RIGHE_EVASE"); // Normalmente mostra anche evase + } bool TTipo_documento::stato_with_mov_mag(const char stato) const @@ -316,7 +266,7 @@ bool TTipo_documento::stato_with_mov_mag(const char stato) const return stato >= stato_iniziale; } -TFormula_documento * TTipo_documento::succ_formula(bool restart) +TFormula_documento* TTipo_documento::succ_formula(bool restart) { if (restart) _formule.restart(); @@ -339,7 +289,7 @@ TFormula_documento * TTipo_documento::succ_formula(bool restart) expr = (char *) (const char *) formula + p; *expr = '\0'; expr++; } - TFormula_documento * o = (TFormula_documento*)_formule_documento.objptr(formula); + TFormula_documento* o = (TFormula_documento*)_formule_documento.objptr(formula); if (o == NULL) { o = new TFormula_documento(_documento, formula, expr); @@ -392,6 +342,10 @@ int TExpr_documento::parse_user_func(const char * name, int nparms) const return nparms == 0 ? _iva : -1; if (strcmp(name, "PROVV") == 0) return nparms < 2 ? _provv : -1; + if (strcmp(name, "QUANT") == 0) + return nparms < 2 ? _quant : -1; + if (strcmp(name, "QUANTEVASA") == 0) + return nparms < 2 ? _quantevasa : -1; if (strcmp(name, "QTARES") == 0) return nparms < 2 ? _qtares : -1; if (strcmp(name, "VALDOC") == 0) @@ -618,10 +572,37 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st val = ZERO; } break; + case _quant: + { + int ndec = AUTO_DECIMALS; + if (nparms > 0) + ndec = (int)stack.peek_real().integer(); + else + stack.push(ZERO); + real& val = stack.peek_real(); + if (_row) + val = _row->quantita(); + else + val = ZERO; + } + break; + case _quantevasa: + { + int ndec = AUTO_DECIMALS; + if (nparms > 0) + ndec = (int)stack.peek_real().integer(); + else + stack.push(ZERO); + real& val = stack.peek_real(); + if (_row) + val = _row->qtaevasa(); + else + val = ZERO; + } + break; case _qtares: { int ndec = AUTO_DECIMALS; - if (nparms > 0) ndec = (int) stack.peek_real().integer(); else @@ -833,4 +814,3 @@ int TFormula_documento::read(const char* codice, const char * expr, bool numexpr } return err; } - diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 0d75028dd..79bff69fd 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -474,91 +474,3 @@ bool TCopia_documento::elabora(TLista_documenti& doc_in, TLista_documenti& doc_o return TRUE; } -/////////////////////////////////////////////////////////// -// TLista_elaborazioni -/////////////////////////////////////////////////////////// - -void TLista_elaborazioni::read() -{ - if (_elab == NULL) - { - _elab = new TAssoc_array(); - - TTable eld("%ELD"); - - for (int err = eld.first(); err == NOERR; err = eld.next()) - { - TElaborazione * el = NULL; - switch (eld.curr().get_int("I0")) - { - case _esterna : - el = new TElaborazione_esterna(eld.curr()); - break; - case _consegna_ordini: - el = new TConsegna_ordini(eld.curr()); - break; - case _fatturazione_bolle : - el = new TFatturazione_bolle(eld.curr()); - break; - case _contabilizzazione : - el = new TContabilizzazione(eld.curr()); - break; - case _copia_documento : - el = new TCopia_documento(eld.curr()); - break; - case _generazione_effetti : - el = new TGenerazione_effetti(eld.curr()); - break; - default : - break; - } - _elab->add(el->codice(), el); - } - } -} - -int TLista_elaborazioni::select(TString_array & result, const char * tipo_iniziale, const char * stato_iniziale, const char * tipo_finale, const char * stato_finale) -{ - read(); - _elab->restart(); - result.destroy(); - for (TElaborazione * el = (TElaborazione *)_elab->get(); el ; el = (TElaborazione *) _elab->get()) - { - bool ok = FALSE; - TString ti; - if ((tipo_iniziale && *tipo_iniziale) && (stato_iniziale && *stato_iniziale)) - for (int i = 0; !ok && i < TElaborazione::_max_tipi_doc_elab; i++) - { - ti = el->tipo_iniziale(i); - const char si = el->stato_iniziale(i); - ok |= ti == tipo_iniziale && - si == *stato_iniziale; - } - else - ok = TRUE; - if ((tipo_finale && *tipo_finale) && (stato_finale && *stato_finale)) - ok &= el->tipo_finale() == tipo_finale && - el->stato_finale() == stato_finale; - if (ok) - result.add(el->codice()); - } - return result.items(); -} - -TElaborazione & TLista_elaborazioni::operator [](const char * key) const -{ - ((TLista_elaborazioni *)this)->read(); - return (TElaborazione &) (*_elab)[key]; -} - -void TLista_elaborazioni::update() -{ - delete _elab; _elab = NULL; - read(); -} - -TLista_elaborazioni::~TLista_elaborazioni() -{ - if (_elab) - delete _elab; -} \ No newline at end of file diff --git a/ve/velib04a.cpp b/ve/velib04a.cpp index 5f4c7a8a9..ced8dfcd9 100755 --- a/ve/velib04a.cpp +++ b/ve/velib04a.cpp @@ -70,8 +70,8 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) TRiga_documento& rout = doc_out[riga_rif]; // Costruisce la stringa di riferimento - TString riferimento(80); - riferimento = doc_in.riferimento(); + TString riferimento; + doc_in.riferimento(riferimento); if (riferimento.empty()) riferimento = doc_in.tipo().descrizione(); if (usa_doc_rif() && doc_in.get(DOC_NUMDOCRIF).not_empty()) diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index 341dcf69d..fd3f2accf 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -29,6 +29,49 @@ // TContabilizzazione /////////////////////////////////////////////////////////// +// TMovimentoPN_VE +// Classe derivata da TMovimentoPN per calcolare automaticamente le righe conabili +// una volta settate le righe iva e la riga di totale documento +// Sostanzialmente di tratta di aggiungere un metodo in piu' : +// recalc_cg_rows(), liberamente ispirato alla notify_iva() in cg2102.cpp + +class TMovimentoPN_VE : public TMovimentoPN +{ + TCausale * _caus; + bool _valuta; + +protected: + // simula il K_SPACE di iva_notify + void create_row(int i, const TString & descr_cr); + // simula il K_ENTER di iva_notify + void enter_row(int i, const TString & descr_cr); + // verifica se si tratta di iva indetraibile + bool detraibile(TRectype& rec) const ; + // cerca la prima tra quelle di contabilita' che corrisponde al tipo indicato + int type2pos(char tipo); + // Trova nelle righe contabili un conto nelle righe di tipo prescelto + int bill2pos(const TBill& conto, const TString & codcms, const TString & fascms, char tipo); + // trasforma un real in TImporto, in base al tipo riga + TImporto real2imp(const real& r, char row_type); + // setta il record delle righe di contabilita' + int set_cg_rec(int n, const TImporto& imp, TBill& conto, const char * codcms, const char * fascms, const char* desc, char tipo); + // aggiunge l'importo indicato alla n-esima riga di contabilita' + bool add_cg_rec(int n, const TImporto& imp); + // Legge l'importo della riga n e lo ritorna col segno dovuto + TImporto get_cg_imp(int n); + // Setta l'importo della riga n + void set_cg_imp(int n, const TImporto& imp); + // verifica se il movimento e' quadrato oppure ha qualche maledetto sbilancio + // ritorna TRUE, ovviamente, se everything's alright. +public: + // ricalcola le righe di contabilita' dalle righe iva presenti + // e verifica la quadratura del movimento. Ritorna TRUE se il movimento e' scrivibile + bool movement_ok() ; + int recalc_cg_rows(const TString & descr_cr, TCausale & caus); + TMovimentoPN_VE(bool valuta) : _valuta(valuta), _caus(NULL) {}; + virtual ~TMovimentoPN_VE() {} +}; + TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type) { CHECK(_caus,"Orgggssbb..._caus pointer is NULL!"); @@ -873,7 +916,6 @@ bool TContabilizzazione::test_swap() return s; } - error_type TContabilizzazione::get_next_reg_num(long& nr) { // reperisce l'ultimo numero di registrazione disponibile @@ -889,14 +931,39 @@ error_type TContabilizzazione::get_next_reg_num(long& nr) return _error; } +long TContabilizzazione::doc_contabilized(const TDocumento& doc, bool anticipo) const +{ + long nreg = doc.get_long(anticipo ? DOC_NUMANT : DOC_NUMREG); + if (nreg > 0) + { + const TRectype& mov = cache().get(LF_MOV, nreg); + if (!mov.empty()) // Il movimento esiste! + { + // Controlla che il movimento abbia ancora il riferimento esatto al documento + const char* const key[4] = { DOC_PROVV, DOC_ANNO, DOC_CODNUM, DOC_NDOC }; + TString8 dkey, dval; + for (int k = 0; k < 4; k++) + { + dkey = "D"; dkey << key[k]; + dval = mov.get(dkey); + if (dval != doc.get(key[k])) + { + nreg = 0; // La chiave non corrisponde più: forse l'hanno cancellato e reinserito + break; + } + } + } + else + nreg = 0; // Il movimento non esiste più: l'hanno cancellato! + } + return nreg; +} + error_type TContabilizzazione::compile_head_mov(TDocumento& doc) // Compila la testata { - TLocalisamfile& mov = _movimento->lfile(); - TRectype& mov_rec = mov.curr(); + TRectype& mov_rec = _movimento->curr(); - // Reperisce la data documento - TDate datadoc(doc.data()); const bool acquisto = doc.get_char(DOC_TIPOCF) == 'F'; /* Richiesta ritirata il 13-01-2000 if (acquisto) @@ -906,6 +973,8 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) datadoc = datarif; } */ + // Reperisce la data documento + const TDate datadoc(doc.data()); if (!datadoc.ok()) { _error = datadoc_error; @@ -916,10 +985,10 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) // eventualmente la data74ter se nel registro della causale vi e' scritta l'informazione // sulle agenzie di viaggio. // se si e' specificata la data automatica prende invece la data del documento - TDate data_reg(_auto_data ? datadoc : _data_reg); + const TDate data_reg(_auto_data ? datadoc : _data_reg); // reperisce il codice anno esercizio, - int cod_es = _esc.date2esc(data_reg); + const int cod_es = _esc.date2esc(data_reg); if (cod_es <= 0) { _error = nr_es_error; @@ -927,14 +996,44 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) } // reperisce l'ultimo numero di registrazione disponibile - long numreg; - _error = get_next_reg_num(numreg); - if (_error != no_error) - return _error; + long numreg = doc_contabilized(doc, FALSE); + const bool recontabilizing = numreg > 0; + if (recontabilizing) + { + const TRectype& mov = cache().get(LF_MOV, numreg); + TString msg; msg.format("*** Il movimento %ld è già stato ", numreg); + if (mov.get_bool(MOV_REGST)) + { + msg << "stampato su bollato"; + _viswin->add_line(msg); + return no_error; + } + if (mov.get_bool(MOV_STAMPATO)) + { + msg << "stampato sul giornale"; + _viswin->add_line(msg); + return no_error; + } + if (mov.get_bool(MOV_INVIATO)) + { + msg << "inviato ad altra contabilità"; + _viswin->add_line(msg); + return no_error; + } + msg.format("--- Il documento verrà ricontabilizzato nel movimento %ld", numreg); + _viswin->add_line(msg); + } + else + { + _error = get_next_reg_num(numreg); + if (_error != no_error) + return _error; + } - TCodice_numerazione cod_num(doc.numerazione()); + const TCodice_numerazione cod_num(doc.numerazione()); // calcola il numero documento aggiungendo l'eventuale prefisso/postfisso. - TString16 numdoc(cod_num.complete_num(doc.numero())); + TString numdoc; + cod_num.complete_num(doc.numero(), numdoc); if (acquisto) { TString16 numdocrif(doc.get(DOC_NUMDOCRIF)); @@ -942,7 +1041,7 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) numdoc = numdocrif; } - if (numdoc.empty() || cod_num.status() != NOERR) + if (numdoc.empty() || !cod_num.ok()) { _error = nr_doc_error; return _error; @@ -980,7 +1079,7 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) // per reperire il tipo documento ed il tipo movimento // reperisce la descrizione dal tipo documento e la completa con la data documento ed il // numero documento - TString80 descr(doc.riferimento()); + TString descr; doc.riferimento(descr); if (descr.empty()) descr = tipo.descrizione(); const TString16 rif = doc.get(DOC_NUMDOCRIF); @@ -1005,22 +1104,31 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) return _error; } - long ult_prot; - if (_nump_iva == 1) // Reperisce l'ultimo numero di protocollo dal registro IVA + long ult_prot = 0; + if (recontabilizing) { - ult_prot = registro.protocol() + 1; - if (ult_prot <= 0) - { - _error = ultprot_error; - return _error; - } + const TRectype& mov = cache().get(LF_MOV, numreg); + ult_prot = mov.get_long(MOV_PROTIVA); } - else // oppure dal numero di documento - ult_prot = doc.numero(); + else + { + if (_nump_iva == 1) // Reperisce l'ultimo numero di protocollo dal registro IVA + { + ult_prot = registro.protocol() + 1; + if (ult_prot <= 0) + { + _error = ultprot_error; + return _error; + } + } + else // oppure dal numero di documento + ult_prot = doc.numero(); + } + // Reperisce la valuta TDate datacam(doc.get_date(DOC_DATACAMBIO)); - TString16 codval(doc.valuta()); real cambio(doc.cambio()); + TString16 codval(doc.valuta()); codval.trim(); if (!doc.in_valuta()) { @@ -1083,7 +1191,6 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) return _error; } } - // Mo' riempie il record della incornata (testata) mov_rec.zero(); mov_rec.put(MOV_ANNOES,cod_es); mov_rec.put(MOV_NUMREG,numreg); @@ -1100,11 +1207,13 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) mov_rec.put(MOV_NUMDOC,numdoc); } mov_rec.put(MOV_TIPODOC,_caus->tipo_doc()); - if (registro.agenzia_viaggi()) mov_rec.put(MOV_DATA74TER,data_reg); + if (registro.agenzia_viaggi()) + mov_rec.put(MOV_DATA74TER,data_reg); mov_rec.put(MOV_CODCAUS,_caus->codice()); mov_rec.put(MOV_DESCR,descr); mov_rec.put(MOV_TIPOMOV,char(_caus->tipomov()+'0')); mov_rec.put(MOV_ANNOIVA,data_reg.year()); mov_rec.put(MOV_REG,registro.name()); - mov_rec.put(MOV_PROTIVA,ult_prot); mov_rec.put(MOV_CODVAL,codval); + mov_rec.put(MOV_PROTIVA,ult_prot); + mov_rec.put(MOV_CODVAL,codval); mov_rec.put(MOV_CAMBIO,cambio); mov_rec.put(MOV_TIPO,tipocf); mov_rec.put(MOV_DATACAM,datacam); mov_rec.put(MOV_CODCF,codcf); mov_rec.put(MOV_OCFPI,occas); @@ -1180,6 +1289,15 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) } else mov_rec.put(MOV_TOTDOC,totdocval.get_num()); + + // Memorizza il movimento contabile di destinazione! + doc.put(DOC_NUMREG, numreg); + // Scrive sulla testata del movimento il numero di documento originale + mov_rec.put(MOV_DPROVV, doc.get(DOC_PROVV)); + mov_rec.put(MOV_DANNO, doc.get(DOC_ANNO)); + mov_rec.put(MOV_DCODNUM, doc.get(DOC_CODNUM)); + mov_rec.put(MOV_DNDOC, doc.get(DOC_NDOC)); + return _error; } @@ -1933,15 +2051,15 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) // put data on partita partita.put(PART_TIPOMOV, tmov); - partita.put(PART_NREG, nreg); - partita.put(PART_NUMRIG, 1); - partita.put(PART_DATAREG, head.get_date(MOV_DATAREG)); - partita.put(PART_DATADOC, head.get_date(MOV_DATADOC)); + partita.put(PART_NREG, nreg); // Riferimento alla registrazione contabile + partita.put(PART_NUMRIG, 1); // Riferimento alla riga contabile del totale + partita.put(PART_DATAREG, head.get(MOV_DATAREG)); + partita.put(PART_DATADOC, head.get(MOV_DATADOC)); partita.put(PART_NUMDOC, head.get(MOV_NUMDOC)); partita.put(PART_DESCR, desc); partita.put(PART_CODCAUS, codcaus); partita.put(PART_REG, _caus->reg().name()); - partita.put(PART_PROTIVA, head.get_long(MOV_PROTIVA)); + partita.put(PART_PROTIVA, head.get(MOV_PROTIVA)); partita.put(PART_SEZ, sezione); const real totdoc(head.get(MOV_TOTDOC)); @@ -2053,7 +2171,9 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) partita.put(PART_IMPOSTA, imposte); partita.put(PART_SPESE, totspese.get_num()); - partita.elimina_rata(-1); // Elimina tutte le rate eventuali + newgame->scollega_pagamenti(nuova_riga); // Sempre meglio che perderli, ma andrebbero ricollegati + partita.elimina_rata(-1); // Elimina tutte le rate eventuali + const TString8 abipr(doc.get(DOC_CODABIP)), cabpr(doc.get(DOC_CODCABP)), abi(doc.get(DOC_CODABIA)), cab(doc.get(DOC_CODCABA)); @@ -2198,7 +2318,6 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc) if (newgame != NULL) // Se non ho cancellato il numero partita ... { if (!newgame->write()) // Salva nuova partita - //error_box("Si e' verificato un errore scrivendo le scadenze del documento."); _error = write_part_error; delete newgame; } @@ -2212,7 +2331,7 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi // N.B: _error non viene settato, per non stampare il messaggio di errore 2 volte. // basta solo ritornare qualcosa di != da no_error, per evitare le operazioni successive // a write_all - TRectype& head = movimento.lfile().curr(); + TRectype& head = movimento.curr(); long numreg = head.get_long(MOV_NUMREG); if (test_swap()) { @@ -2223,7 +2342,6 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi // head.put(MOV_TOTDOCVAL, totdocval); // Non cambio segno! :-( LL700285 const int items = movimento.iva_items(); - for (int i = items - 1 ; i >= 0; i--) { TRectype & rec_iva = movimento.iva(i); @@ -2235,13 +2353,28 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi rec_iva.put(RMI_IMPOSTA, imposta); } } - while (movimento.write() == _isreinsert) - head.put(MOV_NUMREG,++numreg); - if (movimento.status() != NOERR) + + TSaldo_agg saldo; + int err = NOERR; + const long old_numreg = doc_contabilized(doc, FALSE); + if (old_numreg > 0) { - error_box("Errore %d scrivendo il movimento %ld.",_movimento->status(),numreg); + TMovimentoPN oldmov; + oldmov.curr().put(MOV_NUMREG, old_numreg); + if (oldmov.read() == NOERR) + aggiorna_saldi(saldo, oldmov, FALSE); // Leggo i vecchi saldi + err = movimento.rewrite(); + } + else + err = movimento.write(); + if (err != NOERR) + { + error_box("Errore %d scrivendo il movimento %ld.", err, numreg); return generic_error; } + // Aggiorno subito i saldi + aggiorna_saldi(saldo, movimento, TRUE); + if (sc_enabled()) write_scadenze(doc); @@ -2255,7 +2388,6 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi if (good()) { _total_docs++; - aggiorna_saldi(TRUE); change_doc_status(doc); TString msg("Generazione Movimento "); @@ -2272,18 +2404,21 @@ error_type TContabilizzazione::compile_head_anticipo(TDocumento& doc) { TString descr; TString16 codcaus = doc.tipo().caus_anticipo(); - long nr = 1L; TDate datareg(_movimento->lfile().get_date(MOV_DATAREG)); - if (get_next_reg_num(nr) != no_error) - return nr_reg_error; - if (!_caus->read(codcaus,datareg.year())) return caus_ant_error; - + + long nr = doc_contabilized(doc, TRUE); + if (nr <= 0) + { + if (get_next_reg_num(nr) != no_error) + return nr_reg_error; + } + _anticipo = new TMovimentoPN; - TRectype& head = _anticipo->lfile().curr(); - head = _movimento->lfile().curr(); // Copia tutti i campi... + TRectype& head = _anticipo->curr(); + head = _movimento->curr(); // Copia tutti i campi... head.put(MOV_NUMREG,nr); head.zero(MOV_DATA74TER); head.put(MOV_TIPODOC,_caus->tipo_doc()); @@ -2322,6 +2457,15 @@ error_type TContabilizzazione::compile_head_anticipo(TDocumento& doc) head.zero(MOV_TOTDOC); head.zero(MOV_TOTDOCVAL); } + + // Memorizza il movimento contabile di destinazione! + doc.put(DOC_NUMANT, nr); + // Scrive sulla testata dell'anticipo il numero di documento originale + head.put(MOV_DPROVV, doc.get(DOC_PROVV)); + head.put(MOV_DANNO, doc.get(DOC_ANNO)); + head.put(MOV_DCODNUM, doc.get(DOC_CODNUM)); + head.put(MOV_DNDOC, doc.get(DOC_NDOC)); + return no_error; } @@ -2645,18 +2789,27 @@ error_type TContabilizzazione::write_anticipo(TDocumento& doc) // ... il pagamento vero e proprio, scrivendo la partita e modificando // il movimento se vi sono abbuoni write_pagamento_anticipo(doc); - - TLocalisamfile& head = _anticipo->lfile(); - long numreg = head.get_long(MOV_NUMREG); - while (_anticipo->write() == _isreinsert) - head.put(MOV_NUMREG,++numreg); - - if (_anticipo->status() != NOERR) + + TSaldo_agg saldo; + + int err = NOERR; + if (doc_contabilized(doc, TRUE)) { - error_box("Errore %d scrivendo il movimento di anticipo pagamento %ld.",_anticipo->status(),numreg); + TMovimentoPN oldant; + oldant.curr().put(MOV_NUMREG, doc.get(DOC_NUMANT)); + if (oldant.read() == NOERR) + aggiorna_saldi(saldo, oldant, FALSE); + err = _anticipo->rewrite(); + } + else + err = _anticipo->write(); + if (err != NOERR) + { + error_box("Errore %d scrivendo il movimento di anticipo pagamento %ld.", + err, _anticipo->curr().get_long(MOV_NUMREG)); return generic_error; } - aggiorna_saldi(FALSE); + aggiorna_saldi(saldo, *_anticipo, TRUE); } delete _anticipo; _anticipo = NULL; @@ -2744,7 +2897,7 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) rc->put("PROV", provincia); righe.add(key, rc); } - const real qta = rr.quantita(); + const real qta = rr.get(RDOC_QTA); TCurrency_documento imp_val(rr.exist("VALINTRA") ? rr.get_real("VALINTRA") :rr.importo(TRUE, FALSE), doc); TCurrency_documento imp(imp_val); imp.change_to_firm_val(); imp_val.change_value(codvali, cambioi); @@ -2797,8 +2950,8 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) intra.put("TOTDOCIMM", totale_righe); intra.put("CODVAL", codvali); intra.put("CAMBIO", cambioi); - if (intra.write() == _isdupkey) // Sebbene non debba succedere, si effettua una riscrittura - intra.rewrite(); + if (intra.write() == _isdupkey) // Succede con le ricontabilizzazioni + intra.rewrite(); // si effettua una riscrittura if (intra.status() == NOERR) { @@ -2813,44 +2966,34 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) return _error; } -void TContabilizzazione::aggiorna_saldi(bool n) +void TContabilizzazione::aggiorna_saldi(TSaldo_agg& saldo, TMovimentoPN& mv, bool save) { - TMovimentoPN* mv = n ? (TMovimentoPN*) _movimento : _anticipo; - - CHECK(mv, "Movimento non valido passato ad aggiorna_saldi()"); - - TLocalisamfile& mov = mv->lfile(); - + const TRectype& mov = mv.curr(); const TDate datareg(mov.get_date(MOV_DATAREG)); tiposal tsal = normale; if (_caus->read(mov.get(MOV_CODCAUS),datareg.year())) - tsal = _caus->apertura() ? apertura : - (_caus->chiusura() ? chiusura : normale); + tsal = _caus->apertura() ? apertura : (_caus->chiusura() ? chiusura : normale); - TSaldo_agg _saldo; + if (save) + saldo.reset(); // Inizializza saldi + saldo.set_movprovv(FALSE); + saldo.set_tipo_saldo(tsal); + saldo.set_anno_es(mov.get_int(MOV_ANNOES)); + saldo.set_num_ulmov(mov.get_long(MOV_NUMREG)); + saldo.set_data_ulmov(datareg); + saldo.set_movimentato(TRUE); - _saldo.reset(); // Inizializza saldi - _saldo.set_movprovv(FALSE); - _saldo.set_tipo_saldo(tsal); - _saldo.set_anno_es(mov.get_int(MOV_ANNOES)); - _saldo.set_num_ulmov(mov.get_long(MOV_NUMREG)); - _saldo.set_data_ulmov(datareg); - _saldo.set_movimentato(TRUE); - - const int cgitems = mv->cg_items(); + const int cgitems = mv.cg_items(); for (int i = 0; i < cgitems; i++) { - const TRectype& r = mv->cg(i); + const TRectype& r = mv.cg(i); + TBill conto; conto.get(r); TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO")); - if (!import.is_zero()) - { - TBill conto; conto.get(r); - _saldo.aggiorna(conto, import, TRUE); - } + saldo.aggiorna(conto, import, save); } - - _saldo.registra(); + if (save) + saldo.registra(); } void TContabilizzazione::display_error(TDocumento& doc) diff --git a/ve/velib04c.cpp b/ve/velib04c.cpp index bd23ad78f..c8b373b63 100755 --- a/ve/velib04c.cpp +++ b/ve/velib04c.cpp @@ -572,7 +572,7 @@ void TGenerazione_effetti::generate_bill(TDocumento& doc) // bill in inglese sig TPagamento & pag = doc.pagamento(); // CHECK(pag,"Failed to create a TPagamento"); const int numrate = pag.n_rate( ); - if (numrate < 1) + if (numrate <= 0) { _error = scadenze_error; return; diff --git a/ve/velib05.cpp b/ve/velib05.cpp index 1aa497353..d16e9c217 100755 --- a/ve/velib05.cpp +++ b/ve/velib05.cpp @@ -1,49 +1,6 @@ #include #include "velib.h" -///////////////////////////////////////////////////////////// -// TCodice_numerazione -///////////////////////////////////////////////////////////// -TCodice_numerazione::TCodice_numerazione(const char* codnum) - : TRectype(LF_TABCOM), _status(NOERR) -{ - settab("NUM"); - if (codnum && *codnum) - _status = read(codnum); -} - -TCodice_numerazione::TCodice_numerazione(const TRectype& rec) - : TRectype(rec), _status(NOERR) -{ } - -TCodice_numerazione::~TCodice_numerazione() -{ -} - -const char * TCodice_numerazione::complete_num(long num) -{ - static TString codnum; - codnum = prefisso(); - codnum << num; - codnum << postfisso(); - return codnum; -} - -int TCodice_numerazione::read(const char* codnum) -{ -/* - TTable t("%NUM"); - put("CODTAB", codnum); - int err = TRectype::read(t); -*/ - *this = cache().get("%NUM", codnum); - int err = empty() ? _iskeynotfound : NOERR; - - if (err != NOERR) - NFCHECK("Codice numerazione errato: %s", codnum); - return err; -} - ///////////////////////////////////////////////////////////// //TDocumentoEsteso ///////////////////////////////////////////////////////////// diff --git a/ve/velib06.cpp b/ve/velib06.cpp index a82c3c1de..cc93572c4 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -891,13 +891,14 @@ void TDocumento_mask::update_giacenza() } set(F_CURGIAC, giac.string()); - set(F_CURDISP, disp.string()); + set(F_CURDISP, disp.string()); + } /////////////////////////////////////////////////////////// // Handlers and notifiers /////////////////////////////////////////////////////////// - + bool TDocumento_mask::ss_handler(TMask_field& f, KEY key) { bool ok = TRUE; @@ -1114,6 +1115,95 @@ void TDocumento_mask::highlight(COLOR high_back_color, COLOR high_color) } } +/////////////////////////////////////////////////////////// +// TLista_elaborazioni +/////////////////////////////////////////////////////////// + +void TLista_elaborazioni::read() +{ + if (_elab == NULL) + { + _elab = new TAssoc_array(); + + TTable eld("%ELD"); + + for (int err = eld.first(); err == NOERR; err = eld.next()) + { + TElaborazione * el = NULL; + switch (eld.curr().get_int("I0")) + { + case _esterna : + el = new TElaborazione_esterna(eld.curr()); + break; + case _consegna_ordini: + el = new TConsegna_ordini(eld.curr()); + break; + case _fatturazione_bolle : + el = new TFatturazione_bolle(eld.curr()); + break; + case _contabilizzazione : + el = new TContabilizzazione(eld.curr()); + break; + case _copia_documento : + el = new TCopia_documento(eld.curr()); + break; + case _generazione_effetti : + el = new TGenerazione_effetti(eld.curr()); + break; + default : + break; + } + _elab->add(el->codice(), el); + } + } +} + +int TLista_elaborazioni::select(TString_array & result, const char * tipo_iniziale, const char * stato_iniziale, const char * tipo_finale, const char * stato_finale) +{ + read(); + _elab->restart(); + result.destroy(); + for (TElaborazione * el = (TElaborazione *)_elab->get(); el ; el = (TElaborazione *) _elab->get()) + { + bool ok = FALSE; + TString ti; + if ((tipo_iniziale && *tipo_iniziale) && (stato_iniziale && *stato_iniziale)) + for (int i = 0; !ok && i < TElaborazione::_max_tipi_doc_elab; i++) + { + ti = el->tipo_iniziale(i); + const char si = el->stato_iniziale(i); + ok |= ti == tipo_iniziale && + si == *stato_iniziale; + } + else + ok = TRUE; + if ((tipo_finale && *tipo_finale) && (stato_finale && *stato_finale)) + ok &= el->tipo_finale() == tipo_finale && + el->stato_finale() == stato_finale; + if (ok) + result.add(el->codice()); + } + return result.items(); +} + +TElaborazione & TLista_elaborazioni::operator [](const char * key) const +{ + ((TLista_elaborazioni *)this)->read(); + return (TElaborazione &) (*_elab)[key]; +} + +void TLista_elaborazioni::update() +{ + delete _elab; _elab = NULL; + read(); +} + +TLista_elaborazioni::~TLista_elaborazioni() +{ + if (_elab) + delete _elab; +} + /////////////////////////////////////////////////////////// // TDocument_tree /////////////////////////////////////////////////////////// diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index 69c25eea0..2905b4b3c 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -947,7 +947,6 @@ bool descr_handler( TMask_field& f, KEY key ) const TString s(f.get()); if (s.find('\n') < 0) { -// TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file(); TLocalisamfile anamag(LF_ANAMAG); anamag.zero(); @@ -973,14 +972,10 @@ bool qtaart_handler( TMask_field& f, KEY key ) TDocumento_mask & mask = (TDocumento_mask &) row_mask.get_sheet()->mask(); TSheet_field& sh = (TSheet_field &)mask.field(F_SHEET); const int current_doc_row = sh.selected() + 1; -// TLocalisamfile & anamag = ((TEdit_field &) row_mask.field(FR_CODART)).browse()->cursor()->file(); -// TLocalisamfile & umart = ((TEdit_field &) row_mask.field(FR_UMQTA)).browse()->cursor()->file(); + TCond_vendita & condv = mask.condv(); -// condv.set_testa(&mask); condv.set_riga(&row_mask); -// condv.set_anamag(anamag); -// condv.set_umart(umart); condv.ricerca(FALSE, TRUE); mask.doc()[current_doc_row].put(RDOC_PREZZO, row_mask.get(FR_PREZZO)); const TString & codart = row_mask.get(FR_CODARTMAG); @@ -994,10 +989,71 @@ bool qtaart_handler( TMask_field& f, KEY key ) upd_colli_peso_tara(row_mask, anamag.curr()); } - return qta_handler(f, key); } - return TRUE; -} + else + if (key == K_ENTER && f.dirty()) + { + TDocumento_mask& mask=(TDocumento_mask&)f.mask().get_sheet()->mask(); + TDocumento & doc = mask.doc(); + + if ((doc.tipo().check_giac() || doc.tipo().check_disp()) && + main_app().has_module(MGAUT, CHK_DONGLE) && doc.tipo().mov_mag()) + { + TSheet_field& sf = mask.sfield(F_SHEET); + TToken_string& row = sf.row(sf.selected()); + const TString codart = row.get(sf.cid2index(FR_CODARTMAG)); + + if (codart.not_empty()) + { + TString16 codmag = row.get(sf.cid2index(FR_CODMAG)); + const TString16 coddep = row.get(sf.cid2index(FR_CODDEP)); + if (!coddep.blank()) + codmag << coddep; + + TString16 livello; + for (int i = 0; i < 4; i++) + { + const char* liv = row.get(sf.cid2index(FR_LIV1+i)); + if (*liv > ' ') + livello << liv; + else + break; + } + + real qta(row.get(sf.cid2index(FR_QTA))); + const TString16 caus(mask.get(F_CAUSMAG)); + TCausale_magazzino c(caus); + const long nmovmag = doc.get_long(DOC_MOVMAG); + + if (nmovmag != 0) + { + TLocalisamfile rmovmag(LF_RMOVMAG); rmovmag.setkey(2); + rmovmag.put(RMOVMAG_CODART, codart); + rmovmag.put(RMOVMAG_LIVGIAC, livello); + rmovmag.put(RMOVMAG_CODMAG, codmag); + rmovmag.put(RMOVMAG_NUMREG, nmovmag); + if (rmovmag.read() == NOERR) + qta -= rmovmag.get_real(RMOVMAG_QUANT); + } + if (doc.tipo().check_giac()) + { + real giac(mask.get(F_CURGIAC)); + if (giac < -(c.sgn(s_giac) * qta)) + warning_box("Attenzione giacenza negativa"); + } + else + if (doc.tipo().check_disp()) + { + real disp(mask.get(F_CURDISP)); + if (disp < -(c.sgn(s_giac) * qta)) + warning_box("Attenzione disponibilita' negativa"); + } + } + } + } + + return qta_handler(f, key); + } bool qta_handler( TMask_field& f, KEY key ) { @@ -1016,6 +1072,7 @@ bool qta_handler( TMask_field& f, KEY key ) else row_mask.enable(FR_RIGAEVASA); } + return TRUE; } @@ -1221,4 +1278,3 @@ bool link_handler( TMask_field& f, KEY key ) } return TRUE; } - diff --git a/ve/vepriv.h b/ve/vepriv.h index 22d87c8a5..e28d68af7 100755 --- a/ve/vepriv.h +++ b/ve/vepriv.h @@ -3,7 +3,7 @@ enum _formule {_somma, _bolli, _bolli_int, _spinc, _prezzo, _importo, _imponibile, _sconto, _iva, _provv, _qtares, _valdoc, _tipo, _imponibili, _imposte, _totprovv, _pscontot, _ritenuta, - _tipo_ritenuta}; + _tipo_ritenuta, _quant, _quantevasa }; enum TTipo_calcolo { _nessun_calcolo, _qtaprezzo, _valore, _percentuale, _scontoimp, _scontoperc}; void row_set_handler( TMask& m, const int field, const int index );