Patch level : 12.0 964

Files correlati     : ba0.exe f90.exe f90100d.msk f90200a.msk f90300a.msk f90300b.msk f181.dir f181.trr f181.des f183.dir f183.trr f183.des
Commento            :
- Aumentato campo FILENAME nelle tabelle.
- Aggiunto alle cat. annessi se obbligatorio.
- Aggiunto controllo annessi obbligatori in diagnostica.
- Corretta esportazione IVA per categorie annessi: ora prende il nome della cat.
- Implementati nuovi metodi per le categorie doc.
- Modificati sheet categorie e annessi
- Dopo la conferma del nuovo annesso la maschera non usciva.
- Ora gli annessi sono univoci per ogni categoria "padre"
- Aggiunto controllo univocita' annesso in inserimento
- Modificata finestra nuovo annesso utilizzata anche per modificare una cat. annesso esistente
- Semplificato notevolmente riempimento sheet annessi
- Tolta colonna inutilizzata nelle categorie documentali
- Aggiunta possibilita' di modificare i file e annessi (solo alcuni campi)
- Durante l'inserimento di un file annesso non viene piu' richiesta la cat. padre poiche' non avrebbe senso, visto che e' il programma che deve riconoscere a quale cat. appartiene, quindi viene presa in automatico, e caricati autom. le cat annessi.
- Aggiunto controllo esistenza file annessi come per i doc.
- Aggiunti test sulle classi per le categorie documentali.
This commit is contained in:
Simone Palacino 2020-05-28 16:33:29 +02:00
parent fdf4bd821f
commit d6bef9b4e2
20 changed files with 750 additions and 307 deletions

View File

@ -233,10 +233,6 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</SqlCompiler>
</ItemGroup>
<ItemGroup>
<DesCompiler Include="..\src\f9\d181.des" />
<DesCompiler Include="..\src\f9\d183.des" />
</ItemGroup>
<ItemGroup>
<DirCompiler Include="..\src\f9\f181.dir" />
<DirCompiler Include="..\src\f9\f183.dir" />

View File

@ -118,14 +118,6 @@
<Filter>SQL</Filter>
</SqlCompiler>
</ItemGroup>
<ItemGroup>
<DesCompiler Include="..\src\f9\d181.des">
<Filter>Recdesc</Filter>
</DesCompiler>
<DesCompiler Include="..\src\f9\d183.des">
<Filter>Recdesc</Filter>
</DesCompiler>
</ItemGroup>
<ItemGroup>
<DirCompiler Include="..\src\f9\f181.dir">
<Filter>Recdesc</Filter>

View File

@ -1,3 +1,3 @@
181
0
$docf9|3|3|96|0|Associazione doc cartacei / mov per f9|||
$docf9|3|6|132|0|Associazione doc cartacei / mov per f9|||

View File

@ -1,7 +1,7 @@
181
4
NUMREG|3|7|0|Numero di registrazione associato
FILENAME|1|64|0|Nome del file (senza indirizzo)
FILENAME|1|100|0|Nome del file (senza indirizzo)
LOADDATE|5|8|0|Data caricamento
USER|1|16|0|Utente che ha caricato il file
3

View File

@ -1,3 +1,3 @@
183
0
$annessif9|9|9|116|0|Tabella file annessi F9|||
$annessif9|1|1|152|0|Tabella file annessi F9|||

View File

@ -1,7 +1,7 @@
183
6
NUMREG|3|7|0|Numero di registrazione associato
FILENAME|1|64|0|Nome del file (senza indirizzo)
FILENAME|1|100|0|Nome del file (senza indirizzo)
CATDOCPAD|1|10|0|Categoria documentale padre (appartenenza annesso)
CATDOCANN|1|10|0|Categoria documentale annesso
LOADDATE|5|8|0|Data caricamento

View File

@ -1,3 +1,3 @@
181
0
$docf9|3|3|96|0|Associazione doc cartacei / mov per f9|||
$docf9|3|6|132|0|Associazione doc cartacei / mov per f9|||

View File

@ -1,7 +1,7 @@
181
4
NUMREG|3|7|0|Numero di registrazione associato
FILENAME|1|64|0|Nome del file (senza indirizzo)
FILENAME|1|100|0|Nome del file (senza indirizzo)
LOADDATE|5|8|0|Data caricamento
USER|1|16|0|Utente che ha caricato il file
3

View File

@ -1,3 +1,3 @@
183
0
$annessif9|9|9|116|0|Tabella file annessi F9|||
$annessif9|1|1|152|0|Tabella file annessi F9|||

View File

@ -1,7 +1,7 @@
183
6
NUMREG|3|7|0|Numero di registrazione associato
FILENAME|1|64|0|Nome del file (senza indirizzo)
FILENAME|1|100|0|Nome del file (senza indirizzo)
CATDOCPAD|1|10|0|Categoria documentale padre (appartenenza annesso)
CATDOCANN|1|10|0|Categoria documentale annesso
LOADDATE|5|8|0|Data caricamento

View File

@ -6,6 +6,7 @@
#include "../fp/fplib.h"
#include "f901tab.h"
#include "f90100.h"
#include "urldefid.h"
TString escape(const char* str);
@ -15,7 +16,34 @@ TString escape(const char* str);
class TF9_categorie_doc_msk : public TAutomask
{
std::unique_ptr<TArray_sheet> _annessi_sheet;
class TNew_annesso_msk : public TMask
{
public:
void edit_mode(const bool edit = true)
{
enable(101, !edit);
}
void fill_field(const TString& nome_ann, const TString& descr, const TString& tipo_ann, const bool obblig)
{
set(101, nome_ann);
set(102, descr);
set(103, tipo_ann);
set(104, obblig);
}
TNew_annesso_msk(const char* title) : TMask(title, 1, 78, 13)
{
add_button_tool(DLG_OK, "~Conferma", TOOL_OK);
add_button_tool(DLG_NULL, "", 0);
add_button_tool(DLG_CANCEL, "~Annulla", TOOL_CANCEL);
add_string (101, 0, "Nome tipo annesso:", 1, 1, 10);
add_string (102, 0, "Descrizione: ", 1, 2, 30);
add_list (103, 0, "Tipologia annesso:", 1, 3, 21, "", "DC|RC", "Annesso Cartaceo|Prospetto Rev. Charge");
add_boolean (104, 0, "Obbligatorio: ", 1, 4);
}
};
std::shared_ptr<TArray_sheet> _annessi_sheet;
TRecord_categorie _categorie_doc;
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
@ -23,11 +51,12 @@ class TF9_categorie_doc_msk : public TAutomask
void check_spell() const;
void fill_annessi(const TString& catdoc);
void fill_annessi(const TString_array& annessi);
void load_table() const;
void salva_tabella() const;
public:
static void correct_spell_catdoc(TString& catdoc);
TF9_categorie_doc_msk() : TAutomask("f90200a") { load_table(); }
};
@ -55,44 +84,80 @@ bool TF9_categorie_doc_msk::on_field_event(TOperable_field& o, TField_event e, l
sf.show();
}
break;
case DLG_USER:
if (e == fe_button)
case DLG_USER:
if (e == fe_button)
{
TSheet_field& sf = sfield(S_CLASSDOC);
const TString catdoc_padre(sf.row(sf.selected()).get(1));
fill_annessi(catdoc_padre);
int key;
while ((key = _annessi_sheet->run()) != K_ESC)
{
TSheet_field& sf = sfield(S_CLASSDOC);
const TString catdoc_padre(sf.row(sf.selected()).get(1));
const TString tipoann = sf.row(sf.selected()).get(cid2index(F_OPERCEE));
if (!tipoann.empty())
if (key == K_INS) // Voglio inserire un nuovo annesso
{
warning_box("Impossibile visualizzare gli annessi di una categoria annesso.");
break;
}
fill_annessi(catdoc_padre);
int key;
while ((key = _annessi_sheet->run()) != K_ESC)
{
if (key == K_INS)
_categorie_doc.reload();
TString title; title << "Nuovo annesso per " << catdoc_padre;
TNew_annesso_msk new_ann(title);
while(new_ann.run() == K_ENTER)
{
TArray_sheet* catd = _categorie_doc.get_sheet_catdocs().get();
if (catd->run() == K_ENTER)
TString catann = new_ann.get(101);
if (catann.empty())
{
_categorie_doc.add_annesso(catdoc_padre, catd->row(catd->selected()).get(0));
warning_box("Inserire il nome tipo annesso");
continue;
}
TCategorie_doc::annesso ann;
if (!_categorie_doc.get_ann(catann, ann))
{
const TString& descr = new_ann.get(102);
const TString& tipo = new_ann.get(103);
const bool obblig = new_ann.get_bool(104);
correct_spell_catdoc(catann);
_categorie_doc.add_annesso(catdoc_padre, catann, descr, tipo, obblig);
fill_annessi(catdoc_padre);
}
else
warning_box("E' gia' presente un annesso con lo stesso nome per la categoria %s", (const char*)catdoc_padre);
break;
}
else if (key == K_DEL)
}
else if (key == K_DEL)
{
const int r = _annessi_sheet->selected();
if (yesno_box("Eliminare l'annesso N. %d?", r + 1))
{
const int r = _annessi_sheet->selected();
if (yesno_box("Eliminare l'annesso N. %d?", r + 1))
{
_categorie_doc.del_annesso(catdoc_padre, _annessi_sheet->row(r).get(0));
fill_annessi(catdoc_padre);
}
_categorie_doc.del_annesso(catdoc_padre, _annessi_sheet->row(r).get(0));
fill_annessi(catdoc_padre);
}
}
else if(key == K_CTRL+'F' || key == K_ENTER) // EDIT
{
//_categorie_doc.reload();
TString title; title << "Modifica annesso per " << catdoc_padre;
TNew_annesso_msk new_ann(title);
new_ann.edit_mode();
TToken_string& r = _annessi_sheet->row(_annessi_sheet->selected());
new_ann.fill_field(r.get(0), r.get(1), r.get(2), r.get_bool(3));
if (new_ann.run() == K_ENTER)
{
const TString catann = new_ann.get(101);
//TCategorie_doc::annesso ann;
/*if (!_categorie_doc.get_ann(catann, ann))
{*/
const TString& descr = new_ann.get(102);
const TString& tipo = new_ann.get(103);
const bool obblig = new_ann.get_bool(104);
//correct_spell_catdoc(catann);
_categorie_doc.del_annesso(catdoc_padre, catann);
_categorie_doc.add_annesso(catdoc_padre, catann, descr, tipo, obblig);
fill_annessi(catdoc_padre);
//}
}
}
}
}
default: break;
}
return true;
}
@ -102,9 +167,8 @@ bool TF9_categorie_doc_msk::on_key(KEY key)
{
TSheet_field& sf = sfield(S_CLASSDOC);
sf.hide();
int row = sf.selected();
TString_array& arr = sf.rows_array();
arr.destroy(row, true);
arr.destroy(sf.selected(), true);
sf.force_update();
sf.show();
}
@ -114,59 +178,23 @@ bool TF9_categorie_doc_msk::on_key(KEY key)
void TF9_categorie_doc_msk::check_spell() const
{
TSheet_field& sf = sfield(S_CLASSDOC);
sf.hide();
FOR_EACH_SHEET_ROW(sf, nr, row)
{
TString start;
TString catdoc = start = row->get(F_CATDOC - 101);
catdoc.trim();
catdoc.upper();
std::string ss = (const char*)catdoc;
for (size_t i = 0; i < ss.size(); ++i)
{
if (!(ss[i] >= 'A' && ss[i] <= 'Z' || ss[i] >= '0' && ss[i] <= '9' || ss[i] == '_'))
ss.erase(i--, 1);
}
catdoc = ss.c_str();
TString catdoc = row->get(F_CATDOC - 101);
correct_spell_catdoc(catdoc);
row->add(catdoc, 1);
if (catdoc != start)
sf.force_update();
}
sf.force_update();
sf.show();
}
void TF9_categorie_doc_msk::fill_annessi(const TString& catdoc)
{
TRecord_categorie annessi(TRecord_categorie::annessi);
TToken_string r;
if (_annessi_sheet == nullptr)
_annessi_sheet = make_unique<TArray_sheet>(-1, -1, 78, 13, "Annessi", "Categoria\nDocumento (Codice)@15|Descrizione@26", 6);
_annessi_sheet->destroy();
annessi.put("CATDOC", catdoc);
for(bool ok = annessi.read(); ok; ok = annessi.next())
{
_categorie_doc.put("NAME", annessi.get("NAME"));
_categorie_doc.read(true);
r.cut(0);
r.add(annessi.get("NAME"), 0);
r.add(_categorie_doc.get("DESCR"));
_annessi_sheet->add(r);
}
}
void TF9_categorie_doc_msk::fill_annessi(const TString_array& annessi)
{
TToken_string r;
if (_annessi_sheet == nullptr)
_annessi_sheet = make_unique<TArray_sheet>(-1, -1, 78, 13, "Annessi", "Categoria\nDocumento (Codice)@15|Descrizione@26", 6);
_annessi_sheet->destroy();
FOR_EACH_ARRAY_ITEM(annessi, nr, row)
{
_categorie_doc.put("NAME", ((TToken_string*)row)->get(0));
_categorie_doc.read();
r.cut(0);
r.add(((TToken_string*)row)->get(0), 0);
r.add(_categorie_doc.get("DESCR"));
_annessi_sheet->add(r);
}
TCategorie_doc d;
d.set_mode_sheet(6);
_annessi_sheet = d.get_sheet_ann(catdoc);
_annessi_sheet->add_button(DLG_EDIT, TR("~Modifica"), K_CTRL + 'F', TOOL_EDIT);
}
void TF9_categorie_doc_msk::load_table() const
@ -178,13 +206,12 @@ void TF9_categorie_doc_msk::load_table() const
int idx = 0;
while (true)
{
const TString& appo = ini_get_string(CONFIG_DITTA, "F9", "CATDOC", "", idx++);
TToken_string appo(ini_get_string(CONFIG_DITTA, "F9", "CATDOC", "", idx++));
if (appo == "STOP" || appo.empty()) /* STOP: Riga terminatrice */
break;
TToken_string& row = sf.row(-1);
row = appo;
}
sf.show();
sf.force_update();
}
@ -213,6 +240,21 @@ void TF9_categorie_doc_msk::salva_tabella() const
load_table();
}
void TF9_categorie_doc_msk::correct_spell_catdoc(TString& catdoc)
{
catdoc.trim();
catdoc.upper();
std::string ss = (const char*)catdoc;
for (size_t i = 0; i < ss.size(); ++i)
{
if (!(ss[i] >= 'A' && ss[i] <= 'Z' || ss[i] >= '0' && ss[i] <= '9' || ss[i] == '_'))
ss.erase(i--, 1);
}
catdoc = ss.c_str();
}
///////////////////////////////////////////////////////////////
// TF9_categorie_doc
@ -256,7 +298,6 @@ void TF9_categorie_doc::main_loop()
DRT_CAUSSO ", "
DRT_CAUSCON ", "
DRT_TIPOCAU ", "
DRT_TIPOMOV ", "
DRT_OPCEE ")\nVALUES('" <<
F9CONF.get_ambiente() << "', '" <<
row->get(1) << "', '" << // Catdoc
@ -265,7 +306,6 @@ void TF9_categorie_doc::main_loop()
row->get(4) << "', '" << // Causale sost.
escape(row->get(5)) << "', '" << // Causale cont
escape(row->get(6)) << "', '" << // Tipo caus. cont
escape(row->get(7)) << "', '" << // Tipo mov.
row->get(8) << "');\n"; // "Operat. CEE"
ok &= fp_db().sq_set_exec(query, false) && fp_db().sq_commit();
if (!ok)

View File

@ -8,5 +8,4 @@
#define F_CLASDOCSOS 104
#define F_CAUSSOS 105
#define F_CAUSCONT 106
#define F_TIPOCAUSCONT 107
#define F_OPERCEE 108
#define F_TIPOCAUSCONT 107

View File

@ -62,14 +62,13 @@ BEGIN
ITEM "Causale per\nSostitutiva (TD01...)@25"
ITEM "Causale\nContabile@8"
ITEM "Tipo\nDocumento@6"
ITEM "Classificazione\nAnnesso@14"
END
ENDPAGE
ENDMASK
PAGE "Righe doc" -1 -1 78 13
PAGE "class doc" -1 -1 78 13
BOOLEAN F_SELCLASS
BEGIN
@ -133,14 +132,6 @@ BEGIN
FLAG "U"
END
LIST F_OPERCEE 2 14
BEGIN
PROMPT 1 8 "Operatore CEE"
ITEM "|"
ITEM "DC|Doc. cartaceo"
ITEM "RC|Reverse Charge"
END
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
@ -159,4 +150,4 @@ BEGIN
END
ENPAGE
ENDMASK
ENDMASK

View File

@ -39,6 +39,9 @@ class TImport_msk : public TAutomask
const char* select_catdoc();
public:
void set_fields(const TString& impaddress, const TString& impnumreg, bool isannesso = false, const TString& catannpadre = "",
const TString& catdocann = "");
TImport_msk();
};
@ -50,9 +53,25 @@ bool TImport_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
if (e == fe_modify)
{
const bool on = o.mask().get_bool(F_ISANNESSO);
o.mask().enable(F_CATANNPADRE, on);
o.mask().enable(F_CATDOCANN, on);
}
break;
case F_IMPNUMREG:
if(e == fe_modify)
{
const std::shared_ptr<TCategorie_doc::classe_doc> c = categorie_doc().mov2cat(o.get_int());
if (c != nullptr)
{
set(F_CATANNPADRE, c->catdoc);
set(F_CATDOCANN, "");
}
else
{
message_box("Questo tipo di registrazione non corrisponde a nessuna delle categorie documentali inserite.");
set(F_CATANNPADRE, "");
set(F_CATDOCANN, "");
}
}
default: break;
}
return true;
@ -61,7 +80,8 @@ bool TImport_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
bool TImport_msk::catdocann_handler(TMask_field& field, KEY key)
{
static const char* msg_notexist = "Non esistono tipologie di annessi per questa categoria documentale.";
static const char* msg_inspadre = "Inserire prima la cat. doc. padre.";
static const char* msg_inspadre = "Questa registrazione non e' riconosciuta in nessuna categoria documentale.\nImpossible inserire un annesso.\n"
"Si prega di inserire prima una cat. documentale che comprenda questo tipo di registrazione\naggiungendo anche eventuali tipologie di annessi.";
TImport_msk& msk = (TImport_msk&)field.mask();
if (key == K_TAB && field.dirty() && field.full())
{
@ -149,6 +169,16 @@ const char* TImport_msk::select_catdoc()
return "";
}
void TImport_msk::set_fields(const TString& impaddress, const TString& impnumreg, const bool isannesso,
const TString& catannpadre, const TString& catdocann)
{
set(F_IMPADDRESS, impaddress);
set(F_IMPNUMREG, impnumreg);
set(F_ISANNESSO, isannesso);
set(F_CATANNPADRE, catannpadre);
set(F_CATDOCANN, catdocann);
}
TImport_msk::TImport_msk(): TAutomask("f90300b")
{
TMask::set_handler(F_CATANNPADRE, catannpadre_handler);
@ -171,10 +201,20 @@ class TGestione_doc_cartacei_f9_msk : public TAutomask
TString numreg;
TString user;
};
struct ann_cart_t
{
TString numreg;
TString filename;
TString catdocpad;
TString catdocann;
TString loaddate;
TString user;
};
const TString& _addr_cart; // Indirizzo cartella doc. cartacei F9
std::unique_ptr<std::set<TString>> _extensions; // todo: controllare che con TString funzioni l'ordinamento, quindi la find
std::unique_ptr<TImport_msk> _import_msk;
std::map<TString, doc_cart_t> _list_file;
std::map<TString, ann_cart_t> _list_ann;
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
@ -182,8 +222,10 @@ class TGestione_doc_cartacei_f9_msk : public TAutomask
static void check_deleted();
bool check_file_exist(const TString& file) const;
void delete_file();
void edit_ann();
void edit_file();
void fill();
void fill_annessi() const;
void fill_annessi();
void fill_docs();
static TToken_string& get_valid_extensions();
void load_extensions();
@ -215,6 +257,16 @@ bool TGestione_doc_cartacei_f9_msk::on_field_event(TOperable_field& o, TField_ev
case B_CONFIG:
if (e == fe_button)
open_config_win();
break;
case DLG_USER:
if (e == fe_button)
{
int page = curr_page();
if (!page)
edit_file();
else
edit_ann();
}
default: break;
}
return true;
@ -322,17 +374,88 @@ void TGestione_doc_cartacei_f9_msk::delete_file()
fill();
}
void TGestione_doc_cartacei_f9_msk::edit_ann()
{
TToken_string& row = sfield(S_ANNESSI).row(sfield(S_ANNESSI).selected());
TImport_msk win;
win.set_caption("Modifica annesso");
TLocalisamfile f9ann(LF_F9ANNESSI);
const char* numreg = row.get(4);
const char* filename = row.get(1);
f9ann.put(F9A_NUMREG, numreg);
f9ann.put(F9A_FILENAME, filename);
f9ann.read();
win.set_fields(TF9_doccart::get_full_path_file_cartaceo(filename), numreg, true, f9ann.get(F9A_CATDOCPAD), f9ann.get(F9A_CATDOCANN));
win.disable(F_IMPADDRESS);
win.disable(F_ISANNESSO);
win.enable(F_CATDOCANN);
if(win.run() == K_ENTER)
{
if (win.get(F_IMPNUMREG) == numreg)
{
f9ann.put(F9A_CATDOCPAD, win.get(F_CATANNPADRE));
f9ann.put(F9A_CATDOCANN, win.get(F_CATDOCANN));
f9ann.write();
f9ann.rewrite();
}
else
{
f9ann.remove();
f9ann.put(F9A_NUMREG, win.get(F_IMPNUMREG));
f9ann.put(F9A_CATDOCPAD, win.get(F_CATANNPADRE));
f9ann.put(F9A_CATDOCANN, win.get(F_CATDOCANN));
f9ann.write();
f9ann.rewrite();
}
message_box("Annesso modificato!");
}
fill_annessi();
}
void TGestione_doc_cartacei_f9_msk::edit_file()
{
TToken_string& row = sfield(S_IMPORTED).row(sfield(S_IMPORTED).selected());
TImport_msk win;
win.set_caption("Modifica documento cartaceo");
TLocalisamfile f9docs(LF_F9DOCS);
const char* numreg = row.get(2);
const char* filename = row.get(1);
f9docs.put(F9C_NUMREG, numreg);
f9docs.read();
win.set_fields(TF9_doccart::get_full_path_file_cartaceo(filename), numreg);
win.disable(F_IMPADDRESS);
win.disable(F_ISANNESSO);
if (win.run() == K_ENTER && win.get(F_IMPNUMREG) != numreg)
{
f9docs.remove();
f9docs.put(F9C_NUMREG, win.get(F_IMPNUMREG));
f9docs.write();
f9docs.rewrite();
message_box("Documento modificato!");
}
fill_docs();
}
void TGestione_doc_cartacei_f9_msk::fill()
{
fill_docs();
fill_annessi();
}
void TGestione_doc_cartacei_f9_msk::fill_annessi() const
void TGestione_doc_cartacei_f9_msk::fill_annessi()
{
std::set<TString> file_err;
TLocalisamfile ann(LF_F9ANNESSI);
if(ann.first() == NOERR)
{
const TString& namefile = ann.get(F9A_FILENAME);
const bool not_exist = !check_file_exist(namefile);
if (not_exist)
file_err.insert(namefile);
TLocalisamfile mov(LF_MOV);
TSheet_field& sf = sfield(S_ANNESSI);
sf.hide();
@ -345,21 +468,43 @@ void TGestione_doc_cartacei_f9_msk::fill_annessi() const
mov.put(MOV_NUMREG, numreg);
mov.read();
row.add(ann.get(F9A_FILENAME), 1); // ITEM "Nome File@25"
row.add(ann.get(F9A_CATDOCPAD)); // ITEM "Categoria di\nappartenenza@7"
row.add(ann.get(F9A_CATDOCANN)); // ITEM "Classe doc.\nannesso@7"
row.add(numreg); // ITEM "Movimento\nContabile N.@7"
row.add(mov.get(MOV_DATAREG)); // ITEM "Data\nMovimento@10"
row.add(mov.get(MOV_CODCAUS)); // ITEM "Causale@7"
row.add(mov.get(MOV_NUMDOC)); // ITEM "Num. Doc.@7"
row.add(ann.get(F9A_FILENAME), 1); // ITEM "Nome File@25"
row.add(ann.get(F9A_CATDOCPAD)); // ITEM "Categoria di\nappartenenza@7"
row.add(ann.get(F9A_CATDOCANN)); // ITEM "Classe doc.\nannesso@7"
row.add(numreg); // ITEM "Movimento\nContabile N.@7"
row.add(mov.get(MOV_DATAREG)); // ITEM "Data\nMovimento@10"
row.add(mov.get(MOV_CODCAUS)); // ITEM "Causale@7"
row.add(mov.get(MOV_NUMDOC)); // ITEM "Num. Doc.@7"
row.add(TString(mov.get(MOV_REG)) << "/" << mov.get(MOV_PROTIVA)); // ITEM "Reg./Prot. IVA@10"
row.add(mov.get(MOV_DESCR)); // ITEM "Descrizione@20"
row.add(ann.get(F9A_LOADDATE)); // ITEM "Data\nCaricamento@10"
// todo: row.add("") // ITEM "Info (Errori)@25"
row.add(mov.get(MOV_DESCR)); // ITEM "Descrizione@20"
row.add(ann.get(F9A_LOADDATE)); // ITEM "Data\nCaricamento@10"
row.add(not_exist ? "IL FILE NON E' PRESENTE IN ARCHIVIO." : ""); // ITEM "Info (Errori)@25"
_list_ann.insert({ namefile, { numreg, namefile, ann.get(F9A_CATDOCPAD), ann.get(F9A_CATDOCANN), ann.get(F9C_LOADDATE), ann.get(F9C_USER) } });
} while (ann.next() == NOERR);
sf.force_update();
sf.show();
}
if (!file_err.empty())
{
int count = 0;
const bool m = (int)file_err.size() == 1;
const char p = m ? 'o' : 'i';
TString msg; msg << (int)file_err.size() << " file non " << (m ? "e'" : "sono") << " stat" << p <<
" trovat" << p << ".\nSi prega di rimuoverl" << p << " dall'elenco\n\nFile non trovat" << p << ":";
for (auto it = file_err.begin(); it != file_err.end(); ++it)
{
if (count++ == 10)
{
msg << "\n" << "...";
break;
}
msg << "\n" << *it << " [Num. Reg.: " << _list_ann.find(*it)->second.numreg << "]";
}
const bool del = warning_box(msg);
}
}
void TGestione_doc_cartacei_f9_msk::fill_docs()
@ -427,13 +572,13 @@ void TGestione_doc_cartacei_f9_msk::fill_docs()
msg << "\n" << *it << " [Num. Reg.: " << _list_file.find(*it)->second.numreg << "]";
}
#ifndef DBG
const bool del = warning_box(msg);
const bool del = warning_box(msg);
#else
if (yesno_box(msg))
{
remove_file_from_f9cart(file_err);
fill();
}
if (yesno_box(msg))
{
remove_file_from_f9cart(file_err);
fill();
}
#endif
}
}

View File

@ -172,8 +172,27 @@ END
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_USER 2 2
BEGIN
PROMPT 1 1 "Annessi"
PICTURE TOOL_LINK
END
BUTTON DLG_QUIT 2 2
BEGIN
PROMPT 2 1 "Fine"
MESSAGE EXIT,K_QUIT
PICTURE TOOL_QUIT
END
ENPAGE
ENDMASK
PAGE "ANNESSO" -1 -1 78 13
BOOLEAN F_ASEL
@ -250,4 +269,21 @@ END
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_USER 2 2
BEGIN
PROMPT 1 1 "Annessi"
PICTURE TOOL_LINK
END
BUTTON DLG_QUIT 2 2
BEGIN
PROMPT 2 1 "Fine"
MESSAGE EXIT,K_QUIT
PICTURE TOOL_QUIT
END
ENPAGE
ENDMASK

View File

@ -44,7 +44,7 @@ END
STRING F_CATANNPADRE 10
BEGIN
PROMPT 2 5 "Cat.doc. padre"
FLAGS "BD"
FLAGS "D"
END
STRING F_CATDOCANN 10

View File

@ -1,8 +1,14 @@
#include "f90.h"
#include "annessif9.h"
#include "applicat.h"
#include "f90.h"
#include "f9lib01.h"
/**
* \brief Some test for F9 classes
*/
class TF9_test_app : public TSkeleton_application
{
public:
@ -17,38 +23,18 @@ void TF9_test_app::main_loop()
f.zero();
f.setkey(1);
f.put(F9A_NUMREG, search_numreg);
TString filename = f.get(F9A_FILENAME);
TString numreg;
for(f.read(_isgteq); (numreg = f.get(F9A_NUMREG)) == search_numreg; f.next())
for (f.read(_isgteq); (numreg = f.get(F9A_NUMREG)) == search_numreg; f.next())
{
filename = f.get(F9A_FILENAME);
numreg = f.get(F9A_NUMREG);
filename = f.get(F9A_FILENAME);
numreg = f.get(F9A_NUMREG);
//message_box("Filename: %s\nNumreg: %s", (const char*)filename, (const char*)numreg);
CHECK(numreg == search_numreg, "This shit sucks.");
CHECK(filename == "annmid.pdf" || filename == "annmid2.pdf", "YOU'RE WRONG");
}
// TISAM_recordset FAILS. A sto punto uso il primo.
//TISAM_recordset sta(R"(USE ANNESSIF9 FROM NUMREG=="95223" TO NUMREG=="95223")");
//for (bool ok = sta.move_first(); ok; ok = sta.move_next())
//{
// TString filename = sta.get(F9A_FILENAME).as_string();
// TString numreg = sta.get(F9A_NUMREG).as_string();
// CHECK(numreg == "95223", "isam recordset failed. (EOF)"); // FAILS!
// bool simo = true;
//}
// FAILS
//TF9_doccart doccart;
////const TDate domani("23-05-2020");
//doccart.put_in_doc(F9C_NUMREG, "95755");
//bool ok = doccart.read_doc();
//filename = doccart.get_in_doc(F9C_FILENAME);
//numreg = doccart.get_in_doc(F9C_NUMREG);
//CHECK(numreg == "95755", "Error in line");
//TDate loaddate(doccart.get_in_doc(F9F_LOADDATE));
TF9_doccart d;
TString_array sa;
CHECK(d.mov2listann(search_numreg, sa) && sa.items() == 2, "COSA STAI LEGGENDO??");
@ -60,16 +46,115 @@ void TF9_test_app::main_loop()
ann.put(F9A_FILENAME, namefile);
CHECK(ann.read() == NOERR, "Non esiste questo numreg??");
filename = ann.get(F9A_FILENAME);
TString rec; rec <<
filename << "\n" <<
ann.get(F9A_NUMREG) << "\n" <<
TString rec; rec <<
filename << "\n" <<
ann.get(F9A_NUMREG) << "\n" <<
ann.get(F9A_CATDOCPAD) << "\n" <<
ann.get(F9A_CATDOCANN) << "\n" <<
ann.get(F9A_LOADDATE) << "\n" <<
ann.get(F9A_LOADDATE) << "\n" <<
ann.get(F9A_USER);
CHECK(filename == "annmid.pdf" || filename == "annmid2.pdf", "YOU'RE WRONG");
//message_box(rec);
}
/////////////////////////
// Preload some cat doc.
if (noyes_box("Attenzione: procedere all'eliminazione e caricamento di categorie documentali e annessi di prova?"))
{
TCategorie_doc preload;
preload.remove_all();
preload.reload();
preload.add_categoria("FATTACQ", "FATTURE DI ACQUISTI", "FTA", "TD01", "", "FA");
preload.add_categoria("FATTVEN", "FATTURE DI VENDITA", "FTV", "TD01", "", "FV");
preload.add_categoria("NOTCREDACQ", "Nota credito di acquisto", "FTA", "TD04", "", "NC");
preload.add_categoria("NOTDEBVEN", "Nota debito di vendita", "FTV", "TD05", "", "ND");
preload.add_categoria("FATTCORR", "Fattura corrispettivi", "FTA", "TD01", "", "CR");
preload.add_categoria("ACQREV", "Fattura acq. con rev. charge", "FTA", "TD01", "052", "FA");
preload.add_annesso("FATTACQ", "GENACQ", "Annesso generico acq", "DC");
preload.add_annesso("FATTVEN", "GENVEN", "Annesso gen. ven.", "DC");
preload.add_annesso("ACQREV", "INTREVC", "Prosp. integr. rev.ch.", "RC", true);
preload.add_annesso("FATTACQ", "LEASING", "Annesso leasing", "DC");
CHECK(preload.get_array_rows().items() > 0, "Errore aggiunta o caricamento categorie documentali.");
TCategorie_doc::annesso annesso;
bool get_ann = preload.get_ann("GENACQ", annesso);
TCategorie_doc::classe_doc get_classe_doc_right{ "ACQREV", "Fattura acq. con rev. charge", "FTA", "TD01", "052", "FA" };
std::shared_ptr<TCategorie_doc::classe_doc> get_classe_doc = preload.get_classe_doc("ACQREV");
CHECK(get_classe_doc->catdoc == get_classe_doc_right.catdoc &&
get_classe_doc->descr == get_classe_doc_right.descr &&
get_classe_doc->class_sost == get_classe_doc_right.class_sost &&
get_classe_doc->caus_sost == get_classe_doc_right.caus_sost &&
get_classe_doc->causcont == get_classe_doc_right.causcont &&
get_classe_doc->tipocaus == get_classe_doc_right.tipocaus, "get_classe_doc failed"
);
std::set<TString> get_name_catdocs = preload.get_name_catdocs();
CHECK(get_name_catdocs.find("FATTACQ") != get_name_catdocs.end() &&
get_name_catdocs.find("FATTVEN") != get_name_catdocs.end() &&
get_name_catdocs.find("NOTCREDACQ") != get_name_catdocs.end() &&
get_name_catdocs.find("NOTDEBVEN") != get_name_catdocs.end() &&
get_name_catdocs.find("FATTCORR") != get_name_catdocs.end() &&
get_name_catdocs.find("ACQREV") != get_name_catdocs.end(), "Get catdocs failed"
);
std::shared_ptr<TCategorie_doc::classe_doc> mov2cat = preload.mov2cat(95752);
CHECK(mov2cat, "mov2cat failed: classe doc is null");
mov2cat = preload.mov2cat(96955); // Rev. charge causale 052
CHECK(mov2cat->causcont == "052", "Error retriving cat.doc. from numreg for causale.");
const TString cat_selected = "FATTACQ";
TCategorie_doc catdoc;
std::shared_ptr<TArray_sheet> annessi = catdoc.get_sheet_ann(cat_selected);
CHECK(annessi->items() == 2, "TCategorie_doc::get_sheet_ann() failed: retrived %d elements instead of 2", (int)annessi->items());
std::shared_ptr<TArray_sheet> sheet_catdocs = catdoc.get_sheet_catdocs();
CHECK(sheet_catdocs->items() == 6, "TCategorie_doc::get_sheet_catdocs() failed: retrived %d elements instead of 6", (int)sheet_catdocs->items());
TRecord_categorie rec(TRecord_categorie::catdocs);
TRecord_categorie rec2(TRecord_categorie::annessi);
rec.put("NAME", "FATTACQ");
rec.read();
TString name = rec.get("NAME");
TString descr = rec.get("DESCR");
TString classdo = rec.get("CLASSDOCSOS");
TString caussos = rec.get("CAUSSOS");
TString causcon = rec.get("CAUSCONT");
TString tipodoc = rec.get("TIPODOC");
CHECK(name == "FATTACQ" && descr.starts_with("FATTURE") && classdo == "FTA" && caussos == "TD01"&& causcon.blank() && tipodoc == "FA", "TRecord_categorie failed to retrieve FATTACQ");
rec2.put("CATDOC", "FATTACQ");
bool ok = rec2.read();
CHECK(ok, "TRecord_categorie (annessi) failed to retrieve annessi FATTACQ");
for (; ok; ok = rec2.next())
{
TString s_catdoc = rec2.get("CATDOC");
TString s_name = rec2.get("NAME");
TString s_descr = rec2.get("DESCR");
TString s_tipoann = rec2.get("TIPOANN");
bool s_obblig = rec2.get("OBBLIG") == "X";
CHECK(s_catdoc == "FATTACQ" && s_tipoann == "DC" && !s_obblig && (s_name == "GENACQ" && s_descr.starts_with("Annesso generico") ||
s_name == "LEASING" && s_descr.starts_with("Annesso lea")),
"TRecord_categorie (annessi) failed to retrive annessi FATTACQ");
}
}
TF9_doccart doccart;
TString old_numreg; old_numreg << 95752;
TFilename doc;
TString_array list_annessi;
vector<annesso_t> vect_annessi;
//TFilename f_doc; f_doc << "asd";
//bool annesso;
//bool doc_ae = doccart.doc_already_exists(f_doc, old_numreg, annesso);
bool movdoc = doccart.mov2doc(old_numreg, doc);
TString msg("Error retriving filename from reg n. "); msg << old_numreg;
CHECK(movdoc && TString(doc.name()) == "ve1300_F01_0000000011_0002237.pdf", (const char*)msg);
old_numreg.cut(0) << 95222; // Doppio annesso
bool movann = doccart.mov2listann(old_numreg, list_annessi);
CHECK(movann && list_annessi.items() == 2, "Error retriving list annessi from numreg %s", (const char*)old_numreg);
bool movannvect = doccart.mov2listann_vect(old_numreg, vect_annessi);
CHECK(movannvect && vect_annessi.size() == 2, "Error retriving vector annessi from numreg %s", (const char*)old_numreg);
message_box("TESTS COMPLETELY SUCCESSFUL");
}

View File

@ -41,6 +41,62 @@ const char* TEstrazione::caus_sos(const TLocalisamfile& mov, const TipoIVA iva)
return "";
}
void TEstrazione::check_annessi(movimento_t& mov_i, const TString& numreg)
{
TToken_string ann_nexist;
if (!check_annessi_oblig(mov_i.catdoc->catdoc, numreg, ann_nexist))
{
TString msg_annessi_mancanti("Annessi obligatori mancanti: ");
for (int i = 0; i < ann_nexist.items(); ++i)
msg_annessi_mancanti << ann_nexist.get() << " ";
mov_i.err = true;
mov_i.estratto = false;
mov_i.descr_err = msg_annessi_mancanti;
mov_i.descr_estr = movimento_t::annesso_nexist;
}
else
{
const bool loaded = load_annessi(mov_i);
#ifdef DBG
if (loaded)
bool simo = true;
#endif
}
}
bool TEstrazione::check_annessi_oblig(const TString& catdoc, const TString& numreg, TToken_string& ann_nexist)
{
ann_nexist.destroy(-1);
TCategorie_doc categorie;
const TString_array lista_cat_annessi = categorie.get_array_ann(catdoc); // Lista cat annessi
TF9_doccart file_cart;
std::vector<annesso_t> list_file_ann; // Lista file annessi
file_cart.mov2listann_vect(numreg, list_file_ann);
bool ok_ann = true;
FOR_EACH_ARRAY_ITEM(lista_cat_annessi, nr, ann)
{
TCategorie_doc::annesso annesso;
const bool ok_cat = categorie.get_ann(*(TToken_string*)ann, annesso);
if (ok_cat && annesso.obblig)
{
// Controllo che esista l'annesso per questo mov.
bool exist = false;
for (auto f_ann = list_file_ann.begin(); f_ann != list_file_ann.end(); ++f_ann)
{
if (f_ann->catdocann == *(TToken_string*)ann)
{
exist = true;
break;
}
}
ok_ann &= exist;
if (!exist)
ann_nexist.add(*(TToken_string*)ann);
}
}
return ok_ann;
}
bool TEstrazione::check_documento_vendita(const TLocalisamfile& mov, _Out_ bool& exist_doc)
{
if (!mov.get(MOV_DPROVV).empty() && !mov.get(MOV_DANNO).empty() && !mov.get(MOV_DCODNUM).empty() && !mov.get(MOV_DNDOC).empty())
@ -421,6 +477,9 @@ const char* TEstrazione::diagnostica_mov()
mov_i.estratto = cd.get();
mov_i.descr_estr = cd ? movimento_t::no_err : movimento_t::no_catdoc;
mov_i.catdoc = cd;
if (mov_i.catdoc)
check_annessi(mov_i, numreg);
}
if (mov_i.estratto)
{
@ -442,11 +501,6 @@ const char* TEstrazione::diagnostica_mov()
mov_i.descr_estr = movimento_t::no_filecart;
}
}
bool loaded = load_annessi(mov_i);
#ifdef DBG
if (loaded)
bool simo = true;
#endif
}
}
ok &= mov_i.err;
@ -477,8 +531,10 @@ const char* TEstrazione::diagnostica_mov()
bool simo = true; // Rev charge
if (it->numreg == 95752)
bool simo = true; // Cartaceo
if (it->numreg == 95740) // Annessi
bool simo = true;
if (it->numreg == 95740)
bool simo = true; // Annessi
if (it->numreg == 95222)
bool simo = true; // Annessi
#endif
/* Controlli per vendite cambiati:
* Elettroniche solo quelle agli italiani, tutti gli altri sono cartacei
@ -521,6 +577,9 @@ const char* TEstrazione::diagnostica_mov()
mov_i.descr_estr = cd ? movimento_t::no_err : movimento_t::no_catdoc;
mov_i.catdoc = cd;
if (mov_i.catdoc)
check_annessi(mov_i, numreg);
if (!mov_i.catdoc)
++_stats.fv_nocatdoc;
if (mov_i.err)
@ -547,11 +606,6 @@ const char* TEstrazione::diagnostica_mov()
mov_i.descr_estr = movimento_t::no_filecart;
}
}
bool loaded = load_annessi(mov_i);
#ifdef DBG
if (loaded)
bool simo = true;
#endif
}
ok &= !mov_i.err;
}
@ -718,61 +772,54 @@ bool TEstrazione::estrazione_iva(bool escluso)
{
vector<annesso_t>& ann = it->annessi;
TCategorie_doc cd;
auto classost = [&](const int i)
{
const std::shared_ptr<TCategorie_doc::classe_doc> as = cd.get_classe_doc(ann[i].catdocann);
if (as != nullptr)
return as->class_sost;
return TString("");
};
size_t i = 0;
size_t size = ann.size();
iva_query.add(IVA_CLASAN1, classost(i));
iva_query.add(IVA_NOMF1, ann[i++].filename);
iva_query.add(IVA_CLASAN1, ann[i].catdocann);
iva_query.add(IVA_NOMF1, ann[i++].filename);
// HOW DID MY LIFE COME TO THIS?....
if (size > i)
{
iva_query.add(IVA_CLASAN2, classost(i));
iva_query.add(IVA_CLASAN2, ann[i].catdocann);
iva_query.add(IVA_NOMF2, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN3, classost(i));
iva_query.add(IVA_CLASAN3, ann[i].catdocann);
iva_query.add(IVA_NOMF3, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN4, classost(i));
iva_query.add(IVA_CLASAN4, ann[i].catdocann);
iva_query.add(IVA_NOMF4, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN5, classost(i));
iva_query.add(IVA_CLASAN5, ann[i].catdocann);
iva_query.add(IVA_NOMF5, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN4, classost(i));
iva_query.add(IVA_CLASAN4, ann[i].catdocann);
iva_query.add(IVA_NOMF4, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN6, classost(i));
iva_query.add(IVA_CLASAN6, ann[i].catdocann);
iva_query.add(IVA_NOMF6, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN7, classost(i));
iva_query.add(IVA_CLASAN7, ann[i].catdocann);
iva_query.add(IVA_NOMF7, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN8, classost(i));
iva_query.add(IVA_CLASAN8, ann[i].catdocann);
iva_query.add(IVA_NOMF8, ann[i++].filename);
}
if (size > i)
{
iva_query.add(IVA_CLASAN9, classost(i));
iva_query.add(IVA_CLASAN9, ann[i].catdocann);
iva_query.add(IVA_NOMF9, ann[i++].filename);
}
}
@ -1002,22 +1049,12 @@ std::shared_ptr<TCategorie_doc::classe_doc> TCategorie_doc::find_tipodoc(const T
for (auto it = _rows.begin(); it != _rows.end(); ++it)
{
const std::shared_ptr<classe_doc>& classe = *it;
if (classe->causcont.empty() && classe->tipocaus == tipodoc)
if (classe->causcont.blank() && classe->tipocaus == tipodoc)
return *it;
}
return nullptr;
}
std::vector<pair<TString, TString>>::iterator TCategorie_doc::find_annesso(const TString& catdoc, const char* catdoc_ann)
{
for (auto it = _annessi.begin(); it != _annessi.end(); ++it)
{
if (it->first == catdoc && it->second == catdoc_ann)
return it;
}
return _annessi.end();
}
std::vector<pair<TString, std::shared_ptr<TArray_sheet>>>::iterator TCategorie_doc::find_sheet_annessi(const TString& catdoc)
{
for(auto it = _sheets_annessi.begin(); it != _sheets_annessi.end(); ++it)
@ -1041,15 +1078,16 @@ std::shared_ptr<TCategorie_doc::classe_doc> TCategorie_doc::get_classe_doc(const
void TCategorie_doc::load_all()
{
_rows.clear();
_annessi.clear();
_rows_annessi.clear();
int idx = 0;
while (true)
{
const TString& appo = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, INI_CATDOC, "", idx++);
if (appo == "STOP" || appo.empty()) /* STOP: Riga terminatrice */
if (appo == "STOP" || appo.blank()) /* STOP: Riga terminatrice */
break;
TToken_string row(appo);
classe_doc cd = { row.get(1), row.get(), row.get(), row.get(), row.get(), row.get(), row.get(), row.get() };
classe_doc cd = { row.get(1), row.get(), row.get(), row.get(), row.get(), row.get() };
_rows.emplace_back(std::make_shared<classe_doc>(cd));
}
@ -1057,13 +1095,66 @@ void TCategorie_doc::load_all()
while (true)
{
const TString& appo = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "", idx++);
if (appo == "STOP" || appo.empty()) /* STOP: Riga terminatrice */
if (appo == "STOP" || appo.blank()) /* STOP: Riga terminatrice */
break;
TToken_string row(appo);
_annessi.emplace_back(pair<TString, TString>({ row.get(0), row.get(1) }));
annesso ann{ row.get(0), row.get(), row.get(), row.get(), row.get_bool() };
_rows_annessi.insert({ row.get(1), ann });
}
}
void TCategorie_doc::save_ann()
{
remove_all_ann();
int idx = 0;
for (auto it = _rows_annessi.begin(); it != _rows_annessi.end(); ++it)
{
TToken_string row;
if(!it->second.catdocpadre.blank())
row.add(it->second.catdocpadre, 0);
if (!it->second.catdoc.blank())
row.add(it->second.catdoc, 1);
if (!it->second.descr.blank())
row.add(it->second.descr, 2);
if (!it->second.opcee.blank())
row.add(it->second.opcee, 3);
row.add(it->second.obblig ? "X" : "", 4);
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, row, idx++);
}
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "STOP", idx); // Riga terminatrice
reload();
}
void TCategorie_doc::save_cat()
{
remove_all_cat();
int idx = 0;
for (auto it = _rows.begin(); it != _rows.end(); ++it)
{
classe_doc& cd = **it;
TToken_string row;
if (!cd.catdoc.blank())
row.add(cd.catdoc, 1);
if (!cd.descr.blank())
row.add(cd.descr, 2);
if (!cd.class_sost.blank())
row.add(cd.class_sost, 3);
if (!cd.caus_sost.blank())
row.add(cd.caus_sost, 4);
if (!cd.causcont.blank())
row.add(cd.causcont, 5);
if (!cd.tipocaus.blank())
row.add(cd.tipocaus, 6);
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_CATDOC, row, idx++);
}
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_CATDOC, "STOP", idx); // Riga terminatrice
reload();
}
const char* TCategorie_doc::traduci_caus_sost(const TString& caus)
{
if (caus == "TD01") return "TD01 Fattura";
@ -1079,7 +1170,7 @@ const char* TCategorie_doc::traduci_caus_sost(const TString& caus)
const char* TCategorie_doc::traduci_class_ann(const TString& class_ann)
{
if (class_ann == "RC") return "Reverse Charge";
if (class_ann == "DC") return "Doc. cartaceo";
if (class_ann == "DC") return "ANN. cartaceo";
return "";
}
@ -1090,75 +1181,74 @@ const char* TCategorie_doc::traduci_class_sost(const TString& class_sost)
return "";
}
void TCategorie_doc::add_annesso(const TString& catdoc, const char* catdoc_ann)
std::map<TString, TCategorie_doc::annesso>::iterator TCategorie_doc::find_annesso(const TString& catdoc_padre, const char* catdoc_ann)
{
_annessi.insert(_annessi.end(), pair<TString, TString>({ catdoc, catdoc_ann }));
auto it = _rows_annessi.find(catdoc_ann);
if (it->second.catdocpadre == catdoc_padre)
return it;
return _rows_annessi.end();
}
int idx = 0;
TString iget = "start";
while (iget != "STOP" && !iget.empty())
{
iget = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "", idx);
ini_remove(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, idx++);
}
void TCategorie_doc::add_annesso(const TString& catdoc_padre, const TString& catdoc_ann, const TString& descr,
const TString& class_ann, const bool obblig)
{
#ifdef DBG
CHECK(catdoc_padre && *catdoc_padre && catdoc_ann && *catdoc_ann && class_ann && *class_ann,
"add_annesso failed: some parameters are NULL or keys are empty");
#else
if (catdoc_padre && *catdoc_padre && catdoc_ann && *catdoc_ann && class_ann && *class_ann)
return;
#endif
annesso ann{ catdoc_padre, catdoc_ann, descr, class_ann, obblig };
_rows_annessi.insert({ catdoc_padre, ann });
idx = 0;
for(auto it = _annessi.begin(); it != _annessi.end(); ++it)
{
TToken_string row;
row.add(it->first, 0);
row.add(it->second);
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, row, idx++);
}
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "STOP", idx); // Riga terminatrice
save_ann();
}
reload();
void TCategorie_doc::add_categoria(const TString& catdoc, const TString& descr, const TString& class_sost, const TString& caus_sost,
const TString& causcont, const TString& tipocaus)
{
classe_doc cd = { catdoc, descr, class_sost, caus_sost, causcont, tipocaus };
_rows.emplace_back(std::make_shared<classe_doc>(cd));
save_cat();
}
void TCategorie_doc::del_annesso(const TString& catdoc, const char* catdoc_ann)
{
const auto annesso = find_annesso(catdoc, catdoc_ann);
if(annesso != _annessi.end())
const auto ann = find_annesso(catdoc, catdoc_ann);
if(ann != _rows_annessi.end())
{
_annessi.erase(annesso);
int idx = 0;
TString iget = "start";
while (iget != "STOP" && !iget.empty())
{
iget = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "", idx);
ini_remove(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, idx++);
}
idx = 0;
for (auto it = _annessi.begin(); it != _annessi.end(); ++it)
{
TToken_string row;
row.add(it->first, 0);
row.add(it->second);
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, row, idx++);
}
ini_set_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "STOP", idx); // Riga terminatrice
reload();
_rows_annessi.erase(ann);
save_ann();
}
}
bool TCategorie_doc::get_ann(const TString& catann, annesso& annesso)
{
const map<TString, TCategorie_doc::annesso>::iterator it = _rows_annessi.find(catann);
if (it != _rows_annessi.end())
{
annesso = it->second;
return true;
}
return false;
}
TString_array TCategorie_doc::get_array_ann(const TString& catdoc)
{
TString_array sa(0);
for(auto it = _annessi.begin(); it != _annessi.end(); ++it)
for(auto it = _rows_annessi.begin(); it != _rows_annessi.end(); ++it)
{
if (it->first == catdoc)
if (it->second.catdocpadre == catdoc)
{
TToken_string row(it->second);
TToken_string row(it->second.catdoc);
sa.add(row);
}
}
return sa;
}
TString_array TCategorie_doc::get_array_rows(bool traduci)
TString_array TCategorie_doc::get_array_rows(const bool traduci)
{
TString_array sa(_rows.size());
for(auto it = _rows.begin(); it != _rows.end(); ++it)
@ -1171,7 +1261,6 @@ TString_array TCategorie_doc::get_array_rows(bool traduci)
ts.add(!traduci ? row->caus_sost : traduci_caus_sost(row->caus_sost));
ts.add(row->causcont);
ts.add(row->tipocaus);
ts.add(!traduci ? row->tipomov : traduci_class_ann(row->tipomov));
sa.add(ts);
}
@ -1182,17 +1271,17 @@ std::shared_ptr<TArray_sheet> TCategorie_doc::get_sheet_catdocs()
{
if (_sheet_catdocs == nullptr)
{
_sheet_catdocs = make_shared<TArray_sheet>(-1, -1, 78, 13, "cat.docs",
_sheet_catdocs = make_shared<TArray_sheet>(-1, -1, 125, 20, "Categorie Documentali",
"Categoria\nDocumento(Codice)@15|Descrizione\nDocumento@26|"
"Classe Documentale\nSostitutiva@25|Causale per\nSostitutiva (TD01...)@34|"
"Causale\nContabile@8|Tipo\nDocumento@6|Classificazione\nAnnesso@15",
"Classe Documentale\nSostitutiva@13|Causale per\nSostitutiva (TD01...)@13|"
"Causale\nContabile@8|Tipo\nDocumento@8",
MODE_SHEETS);
if (!_name_catdocs)
_name_catdocs = make_shared<set<TString>>();
else
_name_catdocs->clear();
//_sheet_catdocs->add_button(DLG_CANCEL, "Annulla", K_ESC, TOOL_CANCEL, TOOL_CANCEL);
const TString_array ar = get_array_rows(true);
const TString_array ar = get_array_rows();
FOR_EACH_ARRAY_ITEM(ar, nr, row)
{
_sheet_catdocs->add(*(TToken_string*)row);
@ -1207,30 +1296,32 @@ std::shared_ptr<TArray_sheet> TCategorie_doc::get_sheet_ann(const TString& catdo
auto it = find_sheet_annessi(catdoc);
if (it == _sheets_annessi.end())
{
const auto inserted = _sheets_annessi.insert(_sheets_annessi.end(), {
catdoc, make_shared<TArray_sheet>(-1, -1, 78, 13, "Annessi",
"Categoria\nAnnesso(Codice)@15|Descrizione\nDocumento@26|"
"Classe Documentale\nSostitutiva@25|Classificazione\nAnnesso@14",
MODE_SHEETS)
});
TString title; title << "Annessi della Categoria " << catdoc;
shared_ptr<TArray_sheet> sheet = make_shared<TArray_sheet>(-1, -1, 78, 13, title,
"Categoria\nAnnesso(Codice)@15|Descrizione\nDocumento@26|"
"Classificazione\nAnnesso@14|Obbligatorio@8",
_mode_sheet);
const auto inserted = _sheets_annessi.insert(_sheets_annessi.end(), { catdoc, sheet });
const TString_array aann = get_array_ann(catdoc);
if (!aann.empty())
{
TArray_sheet* as = inserted->second.get();
TRecord_categorie rec;
FOR_EACH_ARRAY_ITEM(aann, nr, row)
FOR_EACH_ARRAY_ITEM(aann, nr, r)
{
rec.put("NAME", ((TToken_string*)row)->get(0));
rec.read(true);
TToken_string t;
t.add(((TToken_string*)row)->get(0));
t.add(rec.get("DESCR"));
t.add(rec.get("CLASSDOCSOS"));
t.add(rec.get("CLASSANN"));
as->add(t);
TToken_string& row = *(TToken_string*)r;
std::map<TString, annesso>::iterator it_ann = find_annesso(catdoc, row.get(0));
if(it_ann != _rows_annessi.end())
{
const annesso& ann = it_ann->second;
TToken_string t;
t.add(ann.catdoc);
t.add(ann.descr);
t.add(ann.opcee);
t.add(ann.obblig ? "X" : "");
sheet->add(t);
}
}
}
it = inserted;
it = inserted; // Per restituirlo anche vuoto.
}
return it->second;
}
@ -1260,6 +1351,39 @@ void TCategorie_doc::reload()
load_all();
}
void TCategorie_doc::remove_all()
{
remove_all_ann();
remove_all_cat();
}
void TCategorie_doc::remove_all_ann()
{
int idx = 0;
TString iget = "start";
while (iget != "STOP" && !iget.blank())
{
iget = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, "", idx);
ini_remove(CONFIG_DITTA, INI_PAR_MOD, INI_ANNESSI, idx++);
}
}
void TCategorie_doc::remove_all_cat()
{
int idx = 0;
TString iget = "start";
while (iget != "STOP" && !iget.blank())
{
iget = ini_get_string(CONFIG_DITTA, INI_PAR_MOD, INI_CATDOC, "", idx);
ini_remove(CONFIG_DITTA, INI_PAR_MOD, INI_CATDOC, idx++);
}
}
TCategorie_doc::TCategorie_doc() : _mode_sheet(MODE_SHEETS)
{
load_all();
}
///////////////////////////////////////////////////////////////////////////////
// TRecord_categorie
///////////////////////////////////////////////////////////////////////////////
@ -1312,12 +1436,19 @@ bool TRecord_categorie::read(bool traduci)
FOR_EACH_ARRAY_ITEM(sa, nr, str)
{
TString n = (*(TToken_string*)str).get(0);
if (name.empty() || n == name)
if (name.blank() || n == name) // Se name vuoto perche' sto cercando solo per catdoc
{
TToken_string t;
t.add(catdoc);
t.add(n);
_result_set.add(t);
auto it = find_annesso(catdoc, n);
if (it != _rows_annessi.end())
{
TToken_string t;
t.add(it->second.catdocpadre);
t.add(it->second.catdoc);
t.add(it->second.descr);
t.add(it->second.opcee);
t.add(it->second.obblig);
_result_set.add(t);
}
}
}
return next();
@ -1332,10 +1463,12 @@ TRecord_categorie::TRecord_categorie(type table): _table(table)
_categorie.head.add("CAUSSOS");
_categorie.head.add("CAUSCONT");
_categorie.head.add("TIPODOC");
_categorie.head.add("CLASSANN");
_annessi.head.add("CATDOC");
_annessi.head.add("NAME");
_annessi.head.add("DESCR");
_annessi.head.add("TIPOANN");
_annessi.head.add("OBBLIG");
}

View File

@ -133,40 +133,53 @@ class TCategorie_doc
public:
struct classe_doc
{
TString catdoc;
TString descr;
TString class_sost; // { FTA | FTV } - classe documentale sostitutiva
TString caus_sost; // causale per sostitutiva(TD01…)
TString causcont;
TString tipocaus;
TString tipomov;
TString opcee;
TString catdoc; // Codice cat. documentale.
TString descr; // Descrizione documento.
TString class_sost; // { FTA | FTV } - classe documentale sostitutiva.
TString caus_sost; // causale per sostitutiva (TD01...).
TString causcont; // Codice causale.
TString tipocaus; // Usato come tipo documento (FA, FV, CR, ...).
};
struct annesso
{
TString catdocpadre;
TString catdoc; // Codice cat. documentale.
TString descr; // Descrizione documento.
TString opcee; // { RV | DC } - Usato come classificazione annesso (Reverse, ann. cartaceo).
bool obblig; // Definisce se deve essere per forza presente l'annesso.
};
private:
std::vector<std::shared_ptr<classe_doc>> _rows;
std::vector<std::pair<TString, TString>> _annessi;
std::vector<std::pair<TString, std::shared_ptr<TArray_sheet>>> _sheets_annessi;
std::shared_ptr<TArray_sheet> _sheet_catdocs;
std::shared_ptr<std::set<TString>> _name_catdocs;
int _mode_sheet;
std::vector<std::shared_ptr<classe_doc>>::iterator find(const TString& class_sost, const TString& caus_sost,
const TString& op_cee);
std::shared_ptr<classe_doc> find_causcont(const TString& caus);
std::shared_ptr<classe_doc> find_tipodoc(const TString& tipodoc);
std::vector<pair<TString, TString>>::iterator find_annesso(const TString& catdoc, const char* catdoc_ann);
std::vector<pair<TString, std::shared_ptr<TArray_sheet>>>::iterator find_sheet_annessi(const TString& catdoc);
std::shared_ptr<classe_doc> find_causcont(const TString& caus); // OK
std::shared_ptr<classe_doc> find_tipodoc(const TString& tipodoc); // OK
std::vector<pair<TString, std::shared_ptr<TArray_sheet>>>::iterator find_sheet_annessi(const TString& catdoc); // OK
void load_all();
void save_ann();
void save_cat();
static const char* traduci_caus_sost(const TString& caus);
static const char* traduci_class_ann(const TString& class_ann);
static const char* traduci_class_sost(const TString& class_sost);
protected:
std::map<TString, annesso> _rows_annessi;
std::map<TString, annesso>::iterator find_annesso(const TString& catdoc_padre, const char* catdoc_ann);
public:
//std::shared_ptr<classe_doc> causcont2cat(const char* caus, bool force_cartacea);
void add_annesso(const TString& catdoc, const char* catdoc_ann);
void add_annesso(const TString& catdoc_padre, const TString& catdoc_ann, const TString& descr,
const TString& class_ann, bool obblig = false);
void add_categoria(const TString& catdoc, const TString& descr, const TString& class_sost,
const TString& caus_sost, const TString& causcont, const TString& tipocaus);
void del_annesso(const TString& catdoc, const char* catdoc_ann);
bool get_ann(const TString& catann, annesso& annesso);
TString_array get_array_ann(const TString& catdoc);
TString_array get_array_rows(bool traduci = false);
std::shared_ptr<classe_doc> get_classe_doc(const TString& catdoc);
@ -175,8 +188,12 @@ public:
std::shared_ptr<TArray_sheet> get_sheet_ann(const TString& catdoc);
std::shared_ptr<classe_doc> mov2cat(int numreg);
void reload();
void remove_all();
static void remove_all_ann();
static void remove_all_cat();
void set_mode_sheet(const int mode) { _mode_sheet = mode; }
TCategorie_doc() { load_all(); }
TCategorie_doc();
};
class TRecord_categorie : public TCategorie_doc
@ -223,7 +240,8 @@ struct movimento_t
no_fv, // Movimento di vendita non e' una fattura.
no_cartaceo, // Movimento cartaceo che non ha bisogno di essere estratto.
pura_iva, // Movimento di sola IVA (integrazione Rev. Charge)
no_filecart // Il documento cartaceo non ha associato un file, o questo non e' stato trovato.
no_filecart, // Il documento cartaceo non ha associato un file, o questo non e' stato trovato.
annesso_nexist // Un annesso obbligatorio e' mancante.
};
bool err;
@ -239,7 +257,7 @@ struct movimento_t
TString reg_protiva;
TString descr;
state_fppro state{ null_state };
TString descr_err; // Messaggio di errore visibile dal controllo estrazion
TString descr_err; // Messaggio di errore visibile dal controllo estrazione.
bool estratto{ true };
err_mov descr_estr{ no_err }; // Messaggio di informazioni visibile dal 'Apri Estr.'
std::shared_ptr<TCategorie_doc::classe_doc> catdoc;
@ -254,7 +272,7 @@ struct movimento_t
case no_err:
return "OK";
case escluso:
return "Il movimemnto e' segnato come escluso. Saltato.";
return "Il movimento e' segnato come escluso. Saltato.";
case no_catdoc:
return "Nessuna categoria documentale riconosciuta per questo movimento, o non e' una fattura.";
case no_doc:
@ -269,6 +287,8 @@ struct movimento_t
return "Movimento cartaceo che non ha bisogno di essere estratto";
case pura_iva:
return "Movimento di sola IVA. (Le integrazioni Rev. Charge sono gestite come annessi alle vendite)";
case annesso_nexist:
return "Un annesso obbligatorio e' mancante.";
default: return "";
}
}
@ -323,6 +343,8 @@ class TEstrazione : public TObject
bool update_drd_stato_estr() const;
static const char* categoria_doc();
static const char* caus_sos(const TLocalisamfile& mov, TipoIVA iva);
static void check_annessi(movimento_t& mov_i, const TString& numreg);
static bool check_annessi_oblig(const TString& catdoc, const TString& numreg, TToken_string& ann_nexist);
static bool check_documento_vendita(const TLocalisamfile& mov, _Out_ bool& exist_doc);
/** CHECK RIFERIMENTO FPPRO
* Per le fatture di acquisto controllo se ho il riferimento nell'FPPRO.
@ -402,7 +424,7 @@ public:
void set_addrcart(const TString& addrcart) { _head.addr_cart = addrcart; }
TEstrazione(const TString& ambiente, bool flag_prov, char tipodoc, const TString& descr, const TString& addrcart,
bool escluso, const TDate* dal = nullptr, const TDate* al = nullptr, bool has_vendext = false, bool has_cartacei = false);
bool escluso, const TDate* dal = nullptr, const TDate* al = nullptr, bool has_checkvend = false, bool has_cartacei = false);
};
@ -450,6 +472,11 @@ public:
bool mov2listann(const TString& numreg, _Out_ TString_array& list_annessi);
bool mov2listann_vect(const TString& numreg, _Out_ vector<annesso_t>& list_annessi);
static TString get_full_path_file_cartaceo(const TString& filename)
{
return TString() << TFilename(F9CONF.get_addr_cart()).slash_terminate() << filename;
}
TF9_doccart() : _tdocs(LF_F9DOCS), _tannessi(LF_F9ANNESSI) { }
};

View File

@ -198,7 +198,6 @@ void TIva_insert_prepared_stat::write()
count = ++count % 3;
}
_query << "\n)\nVALUES (\n" << vals_appo << "\n)";
bool simo = true;
}
void TIva_insert_prepared_stat::add(const char* field, const TString& value)