From c1b5d15f8e276daa7b4f4399790872adf212ad3e Mon Sep 17 00:00:00 2001
From: "(no author)" <(no author)@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Mon, 6 Jun 2011 15:50:46 +0000
Subject: [PATCH] This commit was manufactured by cvs2svn to create branch
'R_10_00'.
git-svn-id: svn://10.65.10.50/branches/R_10_00@22218 c028cbd2-c16b-5b4b-a496-9718f37d4682
---
cg/cg7100i.rep | 80 +++++
cg/cg7100i.uml | 140 ++++++++
cg/cgsalda3.cpp | 845 ++++++++++++++++++++++++++++++++++++++++++++++++
cg/cgsalda3.h | 104 ++++++
ha/ha1250.cpp | 120 +++++++
ha/ha1250.h | 18 ++
6 files changed, 1307 insertions(+)
create mode 100755 cg/cg7100i.rep
create mode 100755 cg/cg7100i.uml
create mode 100755 cg/cgsalda3.cpp
create mode 100755 cg/cgsalda3.h
create mode 100755 ha/ha1250.cpp
create mode 100755 ha/ha1250.h
diff --git a/cg/cg7100i.rep b/cg/cg7100i.rep
new file mode 100755
index 000000000..868c1685c
--- /dev/null
+++ b/cg/cg7100i.rep
@@ -0,0 +1,80 @@
+
+
+ Lista movimenti per importo
+
+
+
+
+
+
+
+
+
+ #TIPOCF
+
+
+
+
+
+
+
+
+
+
+
+
+ #VALUTA
+
+
+
+
+
+
+
+ ANNOES
+
+
+ NUMREG
+
+
+ DATAREG
+
+
+ DATACOMP
+
+
+ CODCF
+
+
+ DATADOC
+
+
+ NUMDOC
+
+
+ TIPODOC
+
+
+ CODCAUS
+
+
+
+ DESCR
+
+
+ TOTDOC
+
+
+
+
+ USE MOV KEY 3
+SELECT (BETWEEN(DATAREG,#DATAINI,#DATAFIN))(STR(BETWEEN(TOTDOC,#DAIMPORTO,#AIMPORTO)))(CODVAL=#VALUTA)
+BY NUMREG
+FROM TIPO=#TIPOCF CODCF=#CODCF
+TO TIPO=#TIPOCF CODCF=#CODCF
+
+
\ No newline at end of file
diff --git a/cg/cg7100i.uml b/cg/cg7100i.uml
new file mode 100755
index 000000000..95ce82596
--- /dev/null
+++ b/cg/cg7100i.uml
@@ -0,0 +1,140 @@
+#include "cg7100.h"
+
+PAGE "Lista movimenti per importo" -1 -1 78 14
+
+NUMBER F_CODDITTA 5
+BEGIN
+ PROMPT 1 1 "Ditta "
+ FLAGS "FRD"
+ USE LF_NDITTE KEY 1
+ CHECKTYPE REQUIRED
+ INPUT CODDITTA F_CODDITTA
+ DISPLAY "Codice" CODDITTA
+ DISPLAY "Ragione sociale @50" RAGSOC
+ OUTPUT F_CODDITTA CODDITTA
+ OUTPUT F_RAGSOC RAGSOC
+END
+
+STRING F_RAGSOC 50
+BEGIN
+ PROMPT 15 1 ""
+ FLAGS "D"
+END
+
+DATE F_DATASTAMPA
+BEGIN
+ PROMPT 1 2 "Data stampa "
+ HELP "Data in cui viene effettuata la stampa"
+ FLAGS "A"
+ FIELD #DATASTAMPA
+END
+
+GROUPBOX DLG_NULL 76 3
+BEGIN
+ PROMPT 1 3 "@bData registrazione movimento"
+END
+
+DATE F_DATAINI
+BEGIN
+ PROMPT 2 4 "Dal "
+ HELP "Data da cui iniziare la ricerca"
+ FIELD #DATAINI
+END
+
+DATE F_DATAFIN
+BEGIN
+ PROMPT 28 4 "Al "
+ HELP "Data fino a cui eseguire la ricerca"
+ FIELD #DATAFIN
+END
+
+GROUPBOX DLG_NULL 76 4
+BEGIN
+ PROMPT 1 6 "@bClente/Fornitore"
+END
+
+LIST F_I_TIPOCF 1 11
+BEGIN
+ PROMPT 2 7 "Tipo "
+ FLAGS "PG"
+ ITEM "C|Cliente"
+ ITEM "F|Fornitore"
+ FIELD #TIPOCF
+END
+
+NUMBER F_I_CODCF 6
+BEGIN
+ PROMPT 26 7 "Codice "
+ FLAGS "GR"
+ USE LF_CLIFO
+ INPUT TIPOCF F_I_TIPOCF SELECT
+ INPUT CODCF F_I_CODCF
+ DISPLAY "Codice@6R" CODCF
+ DISPLAY "Ragione sociale@50" RAGSOC
+ DISPLAY "Codice fiscale@16" COFI
+ DISPLAY "Partita IVA@11" PAIV
+ OUTPUT F_I_TIPOCF TIPOCF
+ OUTPUT F_I_CODCF CODCF
+ OUTPUT F_I_RAGSOC RAGSOC
+ HELP "Codice relativo al cliente o fornitore"
+ CHECKTYPE NORMAL
+ FIELD #CODCF
+END
+
+STRING F_I_RAGSOC 50
+BEGIN
+ PROMPT 2 8 "Ragsoc. "
+ USE LF_CLIFO KEY 2
+ INPUT TIPOCF F_I_TIPOCF SELECT
+ INPUT RAGSOC F_I_RAGSOC
+ DISPLAY "Ragione sociale@50" RAGSOC
+ DISPLAY "Sospeso" SOSPESO
+ DISPLAY "Codice@R" CODCF
+ DISPLAY "Codice fiscale@16" COFI
+ DISPLAY "Partita IVA@11" PAIV
+ COPY OUTPUT F_I_CODCF
+ CHECKTYPE NORMAL
+END
+
+GROUPBOX DLG_NULL 76 3
+BEGIN
+ PROMPT 1 10 "@bImporti/Valuta"
+END
+
+CURRENCY F_I_DAIMPORTO
+BEGIN
+ PROMPT 2 11 "Da "
+ FIELD #DAIMPORTO
+END
+
+CURRENCY F_I_AIMPORTO
+BEGIN
+ PROMPT 26 11 "A "
+ FIELD #AIMPORTO
+ NUM_EXPR #THIS_FIELD>=#F_I_DAIMPORTO
+ WARNING "Il secondo importo non puo' essere inferiore al primo"
+END
+
+STRING F_I_CODVAL 3
+BEGIN
+ PROMPT 51 11 "Valuta "
+ FLAGS "UZ"
+ USE %VAL
+ INPUT CODTAB F_I_CODVAL
+ DISPLAY "Codice" CODTAB
+ DISPLAY "Valuta@50" S0
+ OUTPUT F_I_CODVAL CODTAB
+ HELP "Codice della valuta: indicare se NON Euro"
+ CHECKTYPE NORMAL
+ FIELD #VALUTA
+END
+
+ENDPAGE
+
+TOOLBAR "topbar" 0 0 0 2
+
+#include
+
+ENDPAGE
+
+ENDMASK
\ No newline at end of file
diff --git a/cg/cgsalda3.cpp b/cg/cgsalda3.cpp
new file mode 100755
index 000000000..1934b874d
--- /dev/null
+++ b/cg/cgsalda3.cpp
@@ -0,0 +1,845 @@
+#include "cgsalda3.h"
+
+#include
+#include
+#include
+
+#include
+#include
+
+///////////////////////////////////////////////////////////
+// TPartite_cache
+///////////////////////////////////////////////////////////
+
+// Callback per scansione cursore
+static bool fill_games(const TRelation& rel, void* pJolly)
+{
+ TPartite_cache& a = *(TPartite_cache*)pJolly;
+ a.add_game(rel.curr());
+ return true;
+}
+
+// Carica la lista delle partite.
+void TPartite_cache::set_bill(TPartite_array& games, const TBill& conto, long numreg,
+ const TString& codval, TSolder_tree_flags flags)
+{
+ _games = &games;
+ _bill = conto;
+ _numreg = numreg;
+ _codval = codval;
+ destroy();
+
+ TRelation partite(LF_PARTITE);
+ TRectype& rec = partite.curr();
+
+ const char tipocf = conto.tipo();
+ if (tipocf > ' ')
+ {
+ rec.put(PART_TIPOCF, tipocf);
+ rec.put(PART_SOTTOCONTO, conto.codclifo());
+ }
+ else
+ {
+ rec.put(PART_GRUPPO, conto.gruppo());
+ rec.put(PART_CONTO, conto.conto());
+ rec.put(PART_SOTTOCONTO, conto.sottoconto());
+ }
+
+ flags = TSolder_tree_flags(flags & sct_all_games); // Ignora eventuale flag di valuta
+
+ TString filter;
+ if (flags != sct_all_games && numreg > 0 && numreg < 999999)
+ filter << '(' << PART_NREG << "==\"" << numreg << "\")";
+
+ if (flags == sct_open_games || flags == sct_closed_games)
+ {
+ if (filter.full())
+ filter << "||";
+ filter << "(" << PART_CHIUSA << ((flags & sct_open_games)!=0 ? "!=" : "==") << "\"X\")";
+ }
+
+ TCursor cur(&partite, filter, 1, &rec, &rec);
+ cur.scan(fill_games, this);
+
+ for (TPartita* p = games.first(); p != NULL; p = games.next()) if (!p->is_on_file())
+ add_game(*p);
+}
+
+TPartita* TPartite_cache::find(int idx) const
+{
+ TPartita* g = NULL;
+ if (has_game(idx))
+ {
+ const TToken_string& str = row(idx);
+ int anno; str.get(0, anno);
+ TString8 numero; str.get(1, numero);
+ g = &_games->partita(_bill, anno, numero);
+ }
+ return g;
+}
+
+const TString& TPartite_cache::build_key(int anno, const char* partita) const
+{
+ TString8 numpart = partita;
+ numpart.trim();
+ TString& tmp = get_tmp_string(16);
+ tmp.format("%04d|%s", anno, (const char*)numpart);
+ return tmp;
+}
+
+int TPartite_cache::game_id(int anno, const char* numpart) const
+{
+ const TString& key = build_key(anno, numpart);
+ return TString_array::find(key);
+}
+
+bool TPartite_cache::add_game(int anno, const char* partita)
+{
+ const TString& key = build_key(anno, partita);
+ const bool can_add = TString_array::find(key) < 0;
+ if (can_add)
+ add(key);
+ return can_add;
+}
+
+bool TPartite_cache::add_game(const TRectype& partita)
+{
+ if (!same_values(partita.get(PART_CODVAL), _codval))
+ return false;
+ return add_game(partita.get_int(PART_ANNO), partita.get(PART_NUMPART));
+}
+
+bool TPartite_cache::add_game(const TPartita& partita)
+{
+ if (!same_values(partita.codice_valuta(), _codval))
+ return false;
+ return add_game(partita.anno(), partita.numero());
+}
+
+///////////////////////////////////////////////////////////
+// TSolder_tree
+///////////////////////////////////////////////////////////
+
+TPartita* TSolder_tree::partita() const
+{
+ int index = -1; _curr.get(0, index);
+ return _cache.find(index);
+}
+
+TRiga_partite* TSolder_tree::riga_partita() const
+{
+ TRiga_partite* fatt = NULL;
+ if (_curr.items() >= 2)
+ {
+ TPartita* g = partita();
+ if (g != NULL)
+ {
+ int nriga = 1; _curr.get(1, nriga);
+ if (nriga > 0 && nriga < g->UNASSIGNED)
+ return &g->riga(nriga);
+ }
+ }
+ return fatt;
+}
+
+TRiga_scadenze* TSolder_tree::scadenza() const
+{
+ TRiga_scadenze* scad = NULL;
+ if (_curr.items() >= 3)
+ {
+ TPartita* g = partita();
+ if (g != NULL)
+ {
+ int nriga = 1; _curr.get(1, nriga);
+ int nrata = 1; _curr.get(2, nrata);
+ if (nrata > 0 && nrata < g->UNASSIGNED && g->esiste(nriga, nrata))
+ scad = &g->rata(nriga, nrata);
+ }
+ }
+ return scad;
+}
+
+TRectype* TSolder_tree::pagamento() const
+{
+ TRectype* rpag = NULL;
+ if (_curr.items() >= 4)
+ {
+ TPartita* g = partita();
+ if (g != NULL)
+ {
+ int nriga = 1; _curr.get(1, nriga);
+ int nrata = 1; _curr.get(2, nrata);
+ int nrigp = 2; _curr.get(3, nrigp);
+ if (g->esiste(nriga, nrata, nrigp))
+ rpag = &g->pagamento(nriga, nrata, nrigp);
+ }
+ }
+ return rpag;
+}
+
+bool TSolder_tree::goto_root()
+{
+ const bool can_be_done = has_root();
+ if (can_be_done)
+ _curr = "0"; // Prima partita della lista
+ else
+ _curr.cut(0);
+ return can_be_done;
+}
+
+bool TSolder_tree::goto_firstson()
+{
+ const int level = _curr.items();
+ if (level <= 0 || level >= 4)
+ return false;
+
+ TPartita* g = partita();
+ if (g == NULL) // Dovrebbe funzionare sempre per level > 0
+ return false;
+
+ if (level == 1)
+ {
+ int riga = g->prima_fattura();
+ bool ok = riga > 0 && riga < TPartita::UNASSIGNED;
+ if (!ok && g->unassigned().rows() > 0)
+ {
+ riga = TPartita::UNASSIGNED;
+ ok = true;
+ }
+ if (ok)
+ _curr.add(riga);
+ return ok;
+ }
+
+ const int riga = _curr.get_int(1);
+ if (level == 2)
+ {
+ if (riga == TPartita::UNASSIGNED)
+ {
+ _curr.add(TPartita::UNASSIGNED);
+ return true;
+ }
+ const bool ok = g->esiste(riga, 1);
+ if (ok)
+ _curr.add(1);
+ return ok;
+ }
+
+ const int rata = _curr.get_int(2);
+ if (level == 3)
+ {
+ int nrigp = 0;
+ if (rata != TPartita::UNASSIGNED)
+ {
+ const TRiga_scadenze& scad = g->rata(riga, rata);
+ nrigp = scad.first();
+ }
+ else
+ {
+ nrigp = g->unassigned().first_row();
+ }
+ const bool ok = g->esiste(riga, rata, nrigp);
+ if (ok)
+ _curr.add(nrigp);
+ return ok;
+ }
+
+ return false;
+}
+
+bool TSolder_tree::goto_rbrother()
+{
+ const int level = _curr.items();
+ if (level == 0) // Il prossimo clifo non esiste mai per progetto
+ return false;
+
+ const int index = _curr.get_int(0);
+ if (level == 1) // Esite la prossima partita?
+ {
+ const bool ok = _cache.find(index+1) != NULL;
+ if (ok)
+ _curr.add(index+1, 0);
+ return ok;
+ }
+
+ TPartita& g = _cache.game(index);
+ const int riga = _curr.get_int(1);
+ if (level == 2) // Esite la prossima riga?
+ {
+ bool ok = false;
+ if (riga > 0 && riga < g.UNASSIGNED)
+ {
+ int nriga = riga+1; // good guess :-)
+ for (nriga = g.succ(riga); g.esiste(nriga); nriga = g.succ(nriga))
+ {
+ const TRiga_partite& rp = g.riga(nriga);
+ if (rp.is_fattura())
+ break;
+ }
+ ok = g.esiste(nriga);
+ if (!ok && g.unassigned().rows() > 0)
+ {
+ nriga = g.UNASSIGNED;
+ ok = true;
+ }
+ if (ok)
+ _curr.add(nriga, 1);
+ }
+ return ok;
+ }
+
+ const int rata = _curr.get_int(2);
+ if (level == 3) // Esiste la prossima rata?
+ {
+ bool ok = false;
+ if (rata > 0 && rata < g.UNASSIGNED)
+ {
+ const int nrata = rata+1;
+ ok = g.esiste(riga, nrata);
+ if (ok)
+ _curr.add(nrata, 2);
+ }
+ return ok;
+ }
+
+ const int pag = _curr.get_int(3);
+ if (level == 4) // Esiste il prossimo pagamento
+ {
+ int npag = 0;
+ if (rata > 0 && rata < g.UNASSIGNED)
+ {
+ const TRiga_scadenze& scad = g.rata(riga, rata);
+ npag = scad.succ(pag);
+ }
+ else
+ npag = g.unassigned().succ_row(pag);
+ const bool ok = g.esiste(riga, rata, npag);
+ if (ok)
+ _curr.add(npag, 3);
+ return ok;
+ }
+
+ return false;
+}
+
+bool TSolder_tree::could_have_son() const
+{
+ const int level = _curr.items();
+ if (level <= 0 || level >= 4)
+ return false; // Sono su di un pagamento
+
+ const TPartita* g = partita();
+ if (g == NULL)
+ return false;
+
+ int riga = 0; _curr.get(1, riga);
+ if (level == 2) // Sono su di una riga fattura o non assegnata
+ return riga == g->UNASSIGNED || g->esiste(riga, 1);
+
+ if (level == 3) // Sono su di una rata o non assegnata
+ {
+ int rata = 0; _curr.get(2, rata);
+ return rata == g->UNASSIGNED || g->esiste(riga, rata);
+ }
+
+ return true;
+}
+
+bool TSolder_tree::has_son() const
+{
+ bool ok = could_have_son();
+ if (ok)
+ {
+ TSolder_tree& me = (TSolder_tree&)*this;
+ const TString16 old = me._curr;
+ ok = me.goto_firstson();
+ me._curr = old;
+ }
+ return ok;
+}
+
+bool TSolder_tree::has_root() const
+{ return _cache.items() > 0; }
+
+bool TSolder_tree::has_father() const
+{ return _curr.find(_curr.separator()) > 0; }
+
+bool TSolder_tree::has_rbrother() const
+{
+ TSolder_tree& me = (TSolder_tree&)*this;
+ const TString16 old = me._curr;
+ const bool ok = me.goto_rbrother();
+ me._curr = old;
+ return ok;
+}
+
+bool TSolder_tree::has_lbrother() const
+{
+ TSolder_tree& me = (TSolder_tree&)*this;
+ const TString16 old = me._curr;
+ const bool ok = me.goto_lbrother();
+ me._curr = old;
+ return ok;
+}
+
+bool TSolder_tree::goto_father()
+{
+ const bool ok = has_father();
+ if (ok)
+ {
+ const int pipe = _curr.rfind(_curr.separator());
+ if (pipe > 0)
+ _curr.cut(pipe);
+ else
+ _curr.cut(0);
+ }
+ return ok;
+}
+
+bool TSolder_tree::goto_lbrother()
+{
+ const int level = _curr.items();
+ if (level <= 0) // Il precedente clifo non esiste mai per progetto
+ return false;
+
+ const int index = _curr.get_int(0);
+ if (level == 1) // Esite la precedente partita?
+ {
+ const bool ok = index > 0;
+ if (ok)
+ _curr.add(index-1, 0);
+ return ok;
+ }
+
+ TPartita& g = _cache.game(index);
+ const int riga = _curr.get_int(1);
+ if (level == 2) // Esite la precedente riga?
+ {
+ int nriga = 0;
+ if (riga == g.UNASSIGNED)
+ nriga = g.last();
+ else
+ nriga = g.pred(riga);
+ while (nriga > 0 && !g.riga(nriga).is_fattura())
+ nriga = g.pred(nriga);
+
+ const bool ok = nriga > 0;
+ if (ok)
+ _curr.add(nriga, 1);
+ return ok;
+ }
+
+ const int rata = _curr.get_int(2);
+ if (level == 3) // Esiste la precedente rata?
+ {
+ bool ok = false;
+ if (riga != g.UNASSIGNED && rata != g.UNASSIGNED)
+ {
+ const int nrata = rata-1;
+ ok = nrata > 0;
+ if (ok)
+ _curr.add(nrata, 2);
+ }
+ return ok;
+ }
+
+ const int pag = _curr.get_int(3);
+ if (level == 4) // Esiste il precedente pagamento
+ {
+ int npag = 0;
+ if (riga == g.UNASSIGNED || rata == g.UNASSIGNED)
+ {
+ npag = g.unassigned().pred_row(pag);
+ }
+ else
+ {
+ const TRiga_scadenze& scad = g.rata(riga, rata);
+ npag = scad.pred(pag);
+ }
+ const bool ok = npag > 0;
+ if (ok)
+ _curr.add(npag, 3);
+ return ok;
+ }
+
+ return false;
+}
+
+void TSolder_tree::set_var_imp(TVariant& var, const TImporto& imp, bool in_value) const
+{
+ if (!imp.is_zero())
+ {
+ const TCurrency cur(imp.valore(), in_value ? _codval : EMPTY_STRING);
+ var = cur.string(true);
+ }
+ else
+ var.set_null();
+}
+
+void TSolder_tree::set_var_real(TVariant& var, const real& imp, bool in_value) const
+{
+ if (!imp.is_zero())
+ {
+ TCurrency cur(imp, in_value ? (const char*)_codval : "");
+ if (in_value != show_val())
+ {
+ if (in_value)
+ cur.change_to_firm_val();
+ else
+ cur.change_value(_codval, _cambio, _exchange_contro);
+ }
+ var = cur.string(true);
+ }
+}
+
+TFieldtypes TSolder_tree::get_var(const TString& name, TVariant& var) const
+{
+ const int level = _curr.items();
+ if (level == 0) // Should never happen :-)
+ {
+ if (name == PART_DESCR)
+ var = _cache.bill().descrizione();
+ return var.type();
+ }
+
+ TPartita& g = *partita();
+
+ if (name == PART_CODVAL)
+ {
+ var = _codval;
+ return _alfafld;
+ }
+
+ if (level == 1)
+ {
+ if (name == PART_DESCR)
+ {
+ TString8 numpart = g.numero(); numpart.trim();
+ TString16 desc; desc << g.anno() << '/' << numpart;
+ var = desc;
+ } else
+ if (name == PART_NUMDOC || name == PART_DATADOC)
+ {
+ int r = g.prima_fattura();
+ if (r <= 0) r = g.first();
+ var = g.riga(r).get(name);
+ } else
+ if (name == "DARE" || name == "AVERE")
+ {
+ if (!g.chiusa()) // Ignora saldi sicuramente nulli
+ {
+ const bool sv = show_val();
+ const TImporto saldo = g.calcola_saldo(sv);
+ if (saldo.sezione() == name[0])
+ set_var_imp(var, saldo, sv);
+ }
+ }
+ return var.type();
+ }
+
+ int nriga = 1; _curr.get(1, nriga);
+
+ if (level == 2)
+ {
+ if (nriga > 0 && nriga < g.UNASSIGNED && g.esiste(nriga))
+ {
+ const TRiga_partite& riga = g.riga(nriga);
+ if (name == PART_DESCR)
+ {
+ TString desc = riga.get(PART_DESCR);
+ if (desc.blank())
+ {
+ const long nreg = riga.get_long(PART_NREG);
+ if (nreg > 0)
+ desc = cache().get(LF_MOV, nreg, MOV_DESCR);
+ if (desc.blank())
+ desc = cache().get(LF_CAUSALI, riga.get(PART_CODCAUS), CAU_DESCR);
+ }
+ var = desc;
+ } else
+ if (name == "DARE" || name == "AVERE")
+ {
+ const bool sv = show_val();
+ const TImporto imp = riga.importo(sv);
+ if (imp.sezione() == name[0])
+ set_var_imp(var, imp, sv);
+ }
+ else
+ {
+ // NUMDOC, DATADOC, NREG
+ if (riga.TRectype::exist(name))
+ var = riga.get(name);
+ }
+ }
+ else
+ {
+ if (name == PART_DESCR)
+ var = TR("Pagamenti non assegnati");
+ else
+ {
+ if (g.unassigned().rows() == 1)
+ {
+ const int nriga = g.unassigned().first_row();
+ const TRiga_partite& riga = g.riga(nriga);
+ const TFieldtypes ft = riga.type(name);
+ switch (ft)
+ {
+ case _nullfld: break;
+ case _intfld:
+ case _intzerofld:
+ case _longfld:
+ case _longzerofld:
+ {
+ const TString& n = riga.get(name);
+ if (!real::is_null(n))
+ var = n;
+ }
+ break;
+ case _realfld: set_var_real(var, riga.get_real(name), false); break;
+ default : var = riga.get(name); break;
+ }
+ }
+ }
+ }
+ return var.type();
+ }
+
+ int nrata = 1; _curr.get(2, nrata);
+
+ if (level == 3)
+ {
+ if (nrata > 0 && nrata < g.UNASSIGNED && g.esiste(nriga, nrata))
+ {
+ const TRiga_partite& fatt = g.riga(nriga);
+ const TRiga_scadenze& rata = fatt.rata(nrata);
+ if (name == PART_DESCR)
+ {
+ TString16 desc;
+ desc << nrata << '/' << fatt.rate();
+ var = desc;
+ } else
+ if (name == PART_NUMDOC)
+ var = fatt.get(name); else
+ if (name == PART_DATADOC)
+ var = rata.get(SCAD_DATASCAD); else
+ if (name == "DARE" || name == "AVERE")
+ {
+ const bool sv = show_val();
+ const TImporto imp = rata.importo(sv);
+ if (imp.sezione() == name[0])
+ set_var_imp(var, imp, sv);
+ }
+ }
+ else
+ {
+ if (name == PART_DESCR)
+ var = TR("Rata non assegnata");
+ }
+ return var.type();
+ }
+
+ int npag = 2; _curr.get(3, npag);
+ if (g.esiste(nriga, nrata, npag))
+ {
+ const TRectype& pag = g.pagamento(nriga, nrata, npag);
+ const TRiga_partite& rpag = g.riga(npag);
+ const tipo_movimento tipo = rpag.tipo();
+
+ if (name == PART_DESCR)
+ {
+ switch(tipo)
+ {
+ case tm_nota_credito : var = TR("Nota di credito"); break;
+ case tm_insoluto : var = TR("Insoluto"); break;
+ case tm_pagamento_insoluto: var = TR("Pagamento insoluto"); break;
+ default : var = TR("Pagamento"); break;
+ }
+ } else
+ if (name == "DARE" || name == "AVERE")
+ {
+ if (rpag.sezione() == name[0])
+ {
+ const bool sv = show_val();
+ const real imp = pag.get_real(sv ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO);
+ set_var_imp(var, TImporto(rpag.sezione(), imp), sv);
+ }
+ } else
+ if (name == PAGSCA_ABBUONI)
+ {
+ set_var_real(var, rpag.get_real(name), show_val());
+ } else
+ if (name == PAGSCA_DIFFCAM)
+ {
+ if (_codval.full() && !show_val())
+ set_var_real(var, rpag.get_real(name), false);
+ } else
+ if (name == PAGSCA_RITENUTE)
+ {
+ if (_codval.empty())
+ set_var_real(var, rpag.get_real(name), false);
+ } else
+ if (name == PAGSCA_RITSOC)
+ {
+ if (_codval.empty())
+ set_var_real(var, rpag.get_real(name), false);
+ } else
+ if (name == PART_DATADOC)
+ {
+ var = rpag.get(name);
+ if (var.is_zero())
+ var = rpag.get(PART_DATAREG);
+ } else
+ if (rpag.TRectype::exist(name))
+ var = rpag.get(name);
+ }
+
+ return var.type();
+}
+
+bool TSolder_tree::get_description(TString& desc) const
+{
+ TVariant var; get_var(PART_DESCR, var);
+ desc = var.as_string();
+ return !var.is_null();
+}
+
+// Flags: 3 = tutte le partite; 8 = mostra in valuta
+void TSolder_tree::set_root(TPartite_array& games, const TBill& conto, long numreg, int numrig,
+ const TString& codval, const real& cambio, TSolder_tree_flags flags)
+{
+ _num_rig = numrig;
+ _flags = flags;
+ if (is_true_value(codval))
+ {
+ _codval = codval;
+ _cambio = cambio;
+ if (_cambio <= ZERO)
+ _cambio = UNO;
+ }
+ else
+ {
+ _codval.cut(0);
+ _cambio = ZERO;
+ // Ignora visualizzazione importi in valuta in assenza di vera valuta
+ _flags = TSolder_tree_flags(_flags & ~sct_show_val);
+ }
+ _cache.set_bill(games, conto, numreg, _codval, _flags);
+ goto_root();
+}
+
+bool TSolder_tree::marked() const
+{
+ bool yes = false;
+ const int level = _curr.items();
+ if (level >= 1)
+ {
+ const TPartita& g = *partita();
+ if (level == 1)
+ yes = !g.chiusa();
+ else
+ {
+ int nriga = 1; _curr.get(1, nriga);
+ if (nriga > 0 && nriga < g.UNASSIGNED)
+ {
+ const TRiga_partite& riga = g.riga(nriga);
+ yes = riga.get_long(PART_NREG) == _cache.num_reg();
+ if (!yes && level == 3)
+ {
+ int nrata = 1; _curr.get(2, nrata);
+ const TRiga_scadenze& scad = g.rata(nriga, nrata);
+ yes = !scad.chiusa();
+ }
+ }
+ }
+ }
+ return yes;
+}
+
+TImage* TSolder_tree::image(bool selected) const
+{
+ const int level = _curr.items();
+ short id = 0;
+ switch (level)
+ {
+ case 1:
+ {
+ TPartita* p = partita();
+ id = p && p->chiusa() ? BMP_DIRDNSEL : BMP_DIRDN;
+ }
+ break;
+ case 2:
+ {
+ const TRiga_partite* s = riga_partita();
+ id = s && s->get_bool(PART_CHIUSA) ? BMP_FILECHK : BMP_FILE;
+ }
+ break;
+ case 3:
+ {
+ const TRiga_scadenze* s = scadenza();
+ id = s && s->chiusa() ? BMP_DIRDNSEL : BMP_DIRDN;
+ }
+ break;
+ case 4:
+ {
+ int nrigp = 0; _curr.get(3, nrigp);
+ if (nrigp > 0)
+ {
+ const TRiga_partite& rp = partita()->riga(nrigp);
+ switch (rp.tipo())
+ {
+ case tm_pagamento_insoluto: // Alias tm_pagamento
+ case tm_pagamento: id = BMP_PAGAMENTO; break;
+ default: id = BMP_INSOLUTO; break;
+ }
+ }
+ else
+ id = BMP_FILE;
+ }
+ break;
+ default: break;
+ }
+ return id > 0 ? get_res_image(id) : TTree::image(selected);
+}
+
+bool TSolder_tree::goto_game(int anno, const char* numpart, int nriga, int nrata, int nrigp)
+{
+ // Controllo cge la partita sia tra quelle possibili in cache
+ const int idx = _cache.game_id(anno, numpart);
+ if (idx < 0)
+ return false;
+
+ // Costruisco la chiave del nodo desiderato: idx|nriga|nrata|nrigp
+ TToken_string key;
+ key.add(idx);
+ if (nriga > 0)
+ {
+ key.add(nriga);
+ if (nrata > 0)
+ {
+ key.add(nrata);
+ if (nrigp > 0)
+ key.add(nrigp);
+ }
+ }
+ return goto_node(key);
+}
+
+bool TSolder_tree::goto_single_game(int anno, const char* numpart, int nriga, int nrata, int nrigp)
+{
+ // Controllo se per caso la partita non sia gia' in cache
+ if (_cache.game_id(anno, numpart) < 0)
+ {
+ TPartite_array& giochi = _cache.partite();
+ if (!giochi.exist(_cache.bill(), anno, numpart))
+ return false;
+ }
+
+ // Svuoto la cache e ci metto la sola partita desiderata
+ _cache.destroy();
+ _cache.add_game(anno, numpart);
+ expand_all(); // Espando tutto l'alberello
+
+ // Posiziono l'albero normalmente
+ return goto_game(anno, numpart, nriga, nrata, nrigp);
+}
+
diff --git a/cg/cgsalda3.h b/cg/cgsalda3.h
new file mode 100755
index 000000000..a8f7100ef
--- /dev/null
+++ b/cg/cgsalda3.h
@@ -0,0 +1,104 @@
+#ifndef __CGSALDA3_H__
+#define __CGSALDA3_H__
+
+#ifndef __TREE_H
+#include
+#endif
+
+#ifndef __CGSALDAC_H__
+#include "cgsaldac.h"
+#endif
+
+///////////////////////////////////////////////////////////
+// TPartite_cache
+///////////////////////////////////////////////////////////
+
+enum TSolder_tree_flags { sct_single_game, sct_open_games, sct_closed_games, sct_all_games, sct_show_val = 8 };
+
+// Lista delle partite presenti in un TSolder_tree
+class TPartite_cache : public TString_array
+{
+ TPartite_array* _games;
+ TBill _bill; // Cliente corrente
+ long _numreg; // Numero di registrazione corrente
+ TString4 _codval; // Valuta corrente
+
+protected:
+ const TString& build_key(int anno, const char* partita) const;
+
+public:
+ TPartite_array& partite() { CHECK(_games, "NULL _games"); return *_games; }
+ const TBill& bill() const { return _bill; }
+ long num_reg() const { return _numreg; }
+ const TString& codice_valuta() const { return _codval; }
+ void set_bill(TPartite_array& games, const TBill& conto, long numreg, const TString& codval, TSolder_tree_flags flags);
+
+ bool has_game(int id) const { return id >= 0 && id < items(); }
+ TPartita* find(int id) const; // Find by index (0 based)
+ TPartita& game(int id) const { TPartita* g = find(id); CHECKD(g, "NULL game ", id); return *g; }
+ int game_id(int anno, const char* num) const;
+
+ bool add_game(int anno, const char* partita);
+ bool add_game(const TRectype& rec);
+ bool add_game(const TPartita& part);
+
+ TPartite_cache() : _games(NULL) {}
+};
+
+///////////////////////////////////////////////////////////
+// TSolder_tree
+///////////////////////////////////////////////////////////
+
+class TSolder_tree : public TBidirectional_tree
+{
+ TPartite_cache _cache;
+ TToken_string _curr;
+ TString4 _codval;
+ real _cambio;
+ int _num_rig;
+ TSolder_tree_flags _flags;
+
+protected:
+ void set_var_imp(TVariant& var, const TImporto& imp, bool in_value) const;
+ void set_var_real(TVariant& row, const real& imp, bool in_value) const;
+
+public:
+ virtual bool goto_root();
+ virtual bool goto_firstson();
+ virtual bool goto_rbrother();
+ virtual bool goto_node(const TString &id) { _curr = id; return true; }
+ virtual bool could_have_son() const;
+ virtual bool has_son() const;
+ virtual bool has_rbrother() const;
+ virtual TObject* curr_node() const { return (TObject*)&_curr; }
+ virtual void node2id(const TObject* obj, TString& id) const { id = *(TString*)obj; }
+
+ virtual bool has_root() const;
+ virtual bool has_father() const;
+ virtual bool has_lbrother() const;
+ virtual bool goto_father();
+ virtual bool goto_lbrother();
+ virtual bool get_description(TString& desc) const;
+ virtual TFieldtypes get_var(const TString& name, TVariant& var) const;
+ virtual bool marked() const;
+ virtual TImage* image(bool selected) const;
+
+public:
+ void set_root(TPartite_array& games, const TBill& conto, long numreg, int numrig,
+ const TString& codval, const real& cambio, TSolder_tree_flags flags);
+ long num_reg() const { return _cache.num_reg(); }
+ int num_rig() const { return _num_rig; }
+ const TString& codval() const { return _codval; }
+ const bool in_val() const { return _codval.full(); }
+ bool show_val() const { return (_flags & sct_show_val) != 0; }
+
+ TPartita* partita() const;
+ TRiga_partite* riga_partita() const;
+ TRiga_scadenze* scadenza() const;
+ TRectype* pagamento() const;
+ const TBill& bill() const { return _cache.bill(); }
+ bool goto_game(int anno, const char* numpart, int nriga, int nrata, int nrigp);
+ bool goto_single_game(int anno, const char* numpart, int nriga, int nrata, int nrigp);
+};
+
+#endif
diff --git a/ha/ha1250.cpp b/ha/ha1250.cpp
new file mode 100755
index 000000000..2485e8522
--- /dev/null
+++ b/ha/ha1250.cpp
@@ -0,0 +1,120 @@
+#include
+#include
+#include
+
+#include "ha1250.h"
+
+
+bool THardy_transaction::is_server() const
+{
+ bool i_am_server = false;
+ TConfig config(CONFIG_INSTALL, "Main");
+ const int type = config.get_int("Type");
+ if (type == 2)
+ {
+ const TFilename study = config.get("Study");
+ if (xvt_fsys_is_fixed_drive(study))
+ i_am_server = true;
+ }
+ return i_am_server;
+}
+
+
+void THardy_transaction::main_loop()
+{
+ TMask* mask = create_mask();
+
+ //sono il server?
+ bool i_am_server = is_server();
+
+ TFilename trans = argv(2);
+ if (trans.starts_with("/i") || trans.starts_with("-i"))
+ {
+ //se sono il server eseguo subito l'elaborazione
+ if (i_am_server)
+ {
+ //legge i files da trasferire
+ trans.ltrim(2);
+ TConfig ini(trans, fake_trans_file());
+ FOR_EACH_MASK_FIELD(*mask, i, f)
+ {
+ const TFieldref* field = f->field();
+ if (field != NULL)
+ {
+ const char* val = field->read(ini, fake_trans_file());
+ if (val && *val)
+ {
+ f->set(val);
+ f->on_hit();
+ }
+ }
+ }
+ if (ini.get("Mode", "Transaction")[0] == 'A')
+ {
+ elabora(*mask);
+ delete mask;
+ return;
+ }
+ }
+ else
+ error_box(TR("Le transazioni possono essere eseguite solo dal server!"));
+ }
+
+ while (mask->run() == K_ENTER)
+ {
+ //se è il server -> esegue le operazioni di elaborazione
+ if (i_am_server)
+ elabora(*mask);
+ else //senno' prepara il .ini per l'elaborazione postinica
+ {
+ TFilename lista_files = _trans_path;
+ lista_files.add(name());
+ lista_files.ext("ini");
+ TConfig ini(lista_files, "Transaction");
+ ini.set("Action", "RUN");
+ ini.set("Mode", "AUTO");
+ ini.set_paragraph(fake_trans_file());
+ FOR_EACH_MASK_FIELD(*mask, i, f)
+ {
+ const TFieldref* field = f->field();
+ if (field != NULL && f->active())
+ field->write(ini, fake_trans_file(), f->get());
+ }
+ message_box(TR("Transazione di scarico inviata al server"));
+ }
+ }
+ delete mask;
+}
+
+
+bool THardy_transaction::create()
+{
+ TConfig config(CONFIG_DITTA, "ha");
+ _output_path = config.get("OutputPath");
+ _input_path = config.get("InputPath");
+ _archive_path = config.get("ArchivePath");
+ _conc_path = config.get("ConcentratorePath");
+ _trans_path = config.get("TransactionPath");
+
+ if (!_output_path.exist())
+ return error_box(FR("Non esiste la cartella di destinazione %s!"), (const char*)_output_path);
+
+ if (!_input_path.exist())
+ return error_box(FR("Non esiste la cartella di upload %s!"), (const char*)_input_path);
+
+ if (!_archive_path.exist())
+ return error_box(FR("Non esiste la cartella di archiviazione dei files processati &s!"), (const char*)_archive_path);
+
+ if (!_conc_path.exist())
+ return error_box(FR("Non esiste la cartella del concentratore %s!"), (const char*)_conc_path);
+
+ TFilename conc_prog_path = _conc_path;
+ conc_prog_path.add("ProgettoConcentratore.exe");
+ if (!conc_prog_path.exist())
+ return error_box(FR("Il programma concentratore non si trova nella cartella %s!"), _conc_path);
+
+ if (!_trans_path.exist())
+ return error_box(FR("Non esiste la cartella di transazione %s!"), (const char*)_trans_path);
+
+ return TSkeleton_application::create();
+}
\ No newline at end of file
diff --git a/ha/ha1250.h b/ha/ha1250.h
new file mode 100755
index 000000000..2c0fb2d2b
--- /dev/null
+++ b/ha/ha1250.h
@@ -0,0 +1,18 @@
+#include
+#include
+
+class THardy_transaction : public TSkeleton_application
+{
+protected:
+ TFilename _output_path, _input_path, _archive_path, _conc_path, _trans_path;
+
+protected:
+ virtual void elabora(const TMask& mask) pure;
+ virtual TMask* create_mask() const pure;
+ bool is_server() const;
+ virtual const char* fake_trans_file() const pure;
+
+public:
+ virtual void main_loop();
+ virtual bool create();
+};
\ No newline at end of file