2005-05-17 15:39:29 +00:00
|
|
|
|
#include <diction.h>
|
2005-07-12 16:24:29 +00:00
|
|
|
|
#include <printer.h>
|
2005-05-17 15:39:29 +00:00
|
|
|
|
#include <viswin.h>
|
|
|
|
|
|
2005-05-06 10:58:49 +00:00
|
|
|
|
#include "velib04.h"
|
|
|
|
|
|
2005-05-17 15:39:29 +00:00
|
|
|
|
#include "../ca/movana.h"
|
|
|
|
|
#include "../ca/rmovana.h"
|
|
|
|
|
#include "../ca/rrip.h"
|
2005-06-28 15:54:40 +00:00
|
|
|
|
#include "../cg/cg2103.h"
|
2005-05-17 15:39:29 +00:00
|
|
|
|
#include "../mg/anamag.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TCache_causali : public TCache
|
|
|
|
|
{
|
|
|
|
|
protected:
|
|
|
|
|
TObject* key2obj(const char* key);
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
const TCausale& causale(const TDocumento& doc);
|
|
|
|
|
TCache_causali() : TCache(17) { }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TObject* TCache_causali::key2obj(const char* key)
|
|
|
|
|
{
|
|
|
|
|
return new TCausale(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TCausale& TCache_causali::causale(const TDocumento& doc)
|
|
|
|
|
{
|
|
|
|
|
// Cerca il codice causale sul cliente
|
|
|
|
|
TToken_string key;
|
|
|
|
|
key.add(doc.get(DOC_TIPOCF));
|
|
|
|
|
key.add(doc.get(DOC_CODCF));
|
|
|
|
|
const TRectype& cfven = cache().get(LF_CFVEN, key);
|
|
|
|
|
const char* fld = doc.is_nota_credito() ? CFV_CODCAUSNC : CFV_CODCAUS;
|
|
|
|
|
TString4 codcaus = cfven.get(fld);
|
|
|
|
|
|
|
|
|
|
// Se non lo trova guarda sul tipo documento
|
|
|
|
|
if (codcaus.empty())
|
|
|
|
|
{
|
|
|
|
|
const TTipo_documento& tipo = doc.tipo();
|
|
|
|
|
codcaus = tipo.causale();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Trasforma il codice in causale vera e propria
|
|
|
|
|
return (const TCausale&)*objptr(codcaus);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
// TContabilizzazione_analitica
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
static TCache_ripartizioni _rip;
|
|
|
|
|
static TToken_string _search_seq;
|
|
|
|
|
|
|
|
|
|
const TCausale& TContabilizzazione_analitica::doc2caus(const TDocumento& doc)
|
|
|
|
|
{
|
|
|
|
|
static TCache_causali _caus;
|
|
|
|
|
return _caus.causale(doc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const TCausale& TContabilizzazione_analitica::rdoc2caus(const TRiga_documento& rdoc)
|
|
|
|
|
{
|
|
|
|
|
return doc2caus(rdoc.doc());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Copiata dalla contabilizzazione ed eliminati riferimenti a tutte le variabili globali del cazzo
|
2005-07-01 16:13:50 +00:00
|
|
|
|
bool TContabilizzazione_analitica::search_costo_ricavo(const TRiga_documento& r, TBill& conto)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
{
|
|
|
|
|
if (_search_seq.blank())
|
|
|
|
|
{
|
|
|
|
|
TConfig conf(CONFIG_DITTA, "ve");
|
|
|
|
|
_search_seq = conf.get("RICERCACR");
|
|
|
|
|
}
|
|
|
|
|
const int items = _search_seq.items();
|
|
|
|
|
|
|
|
|
|
TToken_string clifo_key;
|
|
|
|
|
clifo_key.format("%c|%ld", r.doc().get_char(DOC_TIPOCF), r.doc().get_long(DOC_CODCF));
|
|
|
|
|
const TRectype& cli_file = cache().get(LF_CLIFO, clifo_key);
|
|
|
|
|
|
2005-07-26 17:25:27 +00:00
|
|
|
|
const bool is_cli = cli_file.get_char(CLI_TIPOCF) != 'F';
|
2005-05-17 15:39:29 +00:00
|
|
|
|
bool skip_art_related = false;
|
2005-07-26 17:25:27 +00:00
|
|
|
|
bool skip_clifo = cli_file.empty();
|
2005-05-17 15:39:29 +00:00
|
|
|
|
|
|
|
|
|
const TCodiceIVA codiva(r.get(RDOC_CODIVA));
|
|
|
|
|
const char t = r.tipo().tipo();
|
|
|
|
|
|
|
|
|
|
switch (t)
|
|
|
|
|
{
|
|
|
|
|
case 'O': // righe omaggio come articoli spiaccicato identico (avranno imponibile 0)
|
|
|
|
|
case 'M': // righe di merce
|
|
|
|
|
{
|
|
|
|
|
// posiziona l'anagrafica sull'articolo specificato sulla ..iga
|
|
|
|
|
const TRectype& anamag = cache().get(LF_ANAMAG, r.get(RDOC_CODARTMAG));
|
|
|
|
|
if (anamag.empty()) // se non trova l'articolo saltera' anche gmc,smc,rfa.
|
|
|
|
|
skip_art_related = true;
|
|
|
|
|
|
|
|
|
|
TString16 tok;
|
|
|
|
|
// Scorre la stringa di ricerca
|
2005-07-01 16:13:50 +00:00
|
|
|
|
for (int i=0; i < items;i++)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
{
|
|
|
|
|
_search_seq.get(i, tok);
|
|
|
|
|
if (tok == "CF")
|
|
|
|
|
{
|
|
|
|
|
if (skip_clifo) continue;
|
|
|
|
|
const int gr = cli_file.get_int(CLI_GRUPPORIC);
|
|
|
|
|
const int co = cli_file.get_int(CLI_CONTORIC);
|
|
|
|
|
const long so = cli_file.get_long(CLI_SOTTOCRIC);
|
|
|
|
|
conto.set(gr,co,so);
|
2005-07-26 17:25:27 +00:00
|
|
|
|
if (conto.ok())
|
|
|
|
|
break; // se lo trova esce (tutti != 0)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (tok == "CA")
|
|
|
|
|
{
|
|
|
|
|
const TCausale& caus = rdoc2caus(r);
|
|
|
|
|
if (caus.IVA2bill(codiva,conto))
|
|
|
|
|
break; // se lo trova esce
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (tok == "AR")
|
|
|
|
|
{
|
|
|
|
|
if (skip_art_related)
|
|
|
|
|
continue;
|
|
|
|
|
int gr = anamag.get_int(is_cli ? ANAMAG_GRUPPOV : ANAMAG_GRUPPOA);
|
|
|
|
|
int co = anamag.get_int(is_cli ? ANAMAG_CONTOV : ANAMAG_CONTOA);
|
|
|
|
|
long so = anamag.get_long(is_cli ? ANAMAG_SOTTOCV : ANAMAG_SOTTOCA);
|
|
|
|
|
conto.set(gr,co,so);
|
|
|
|
|
if (!conto.ok()) // se il conto non c'e' guarda la categoria acquisti/vendite
|
|
|
|
|
{
|
|
|
|
|
const TString16 codtab = anamag.get(is_cli ? ANAMAG_CATCONV : ANAMAG_CATCONA);
|
|
|
|
|
const TRectype& t = cache().get(is_cli ? "CRA" : "CAA", codtab);
|
|
|
|
|
if (!t.empty())
|
|
|
|
|
{
|
|
|
|
|
gr = t.get_int("I0");
|
|
|
|
|
co = t.get_int("I1");
|
|
|
|
|
so = t.get_long("I2");
|
|
|
|
|
conto.set(gr,co,so);
|
|
|
|
|
}
|
|
|
|
|
}
|
2005-07-26 17:25:27 +00:00
|
|
|
|
if (conto.ok())
|
|
|
|
|
break;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (tok == "GM" || tok == "SM" || tok == "RF")
|
|
|
|
|
{
|
|
|
|
|
if (skip_art_related)
|
|
|
|
|
continue;
|
|
|
|
|
const bool is_fis = tok == "RF";
|
|
|
|
|
TString16 codtab = anamag.get(is_fis ? ANAMAG_RAGGFIS : ANAMAG_GRMERC);
|
|
|
|
|
if (tok == "GM" && codtab.len() > 3)
|
|
|
|
|
codtab.cut(3); // gli ultimi 2 si riferiscono al sottogruppo.
|
|
|
|
|
const TRectype& tab = cache().get(is_fis ? "RFA" : "GMC", codtab);
|
|
|
|
|
if (!tab.empty())
|
|
|
|
|
{
|
|
|
|
|
const int gr = tab.get_int(is_cli ? "I3" : "I0");
|
|
|
|
|
const int co = tab.get_int(is_cli ? "I4" : "I1");
|
|
|
|
|
const long so = tab.get_long(is_cli ? "I5" : "I2");
|
|
|
|
|
conto.set(gr,co,so);
|
|
|
|
|
}
|
|
|
|
|
if (conto.ok())
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (tok == "CV" || tok == "CC")
|
|
|
|
|
{
|
|
|
|
|
const bool is_cve = tok == "CV";
|
|
|
|
|
if (is_cve && !is_cli)
|
|
|
|
|
continue; // se e' un fornitore salta questa condizione
|
|
|
|
|
TString16 cod = is_cve ? r.doc().get(DOC_CATVEN) : EMPTY_STRING;
|
|
|
|
|
if (cod.empty())
|
|
|
|
|
{
|
|
|
|
|
if (skip_clifo)
|
|
|
|
|
continue; // se non aveva trovato il cliente salta al prossimo
|
|
|
|
|
|
|
|
|
|
const TRectype& cfven = cache().get(LF_CFVEN, clifo_key);
|
|
|
|
|
cod = cfven.get(is_cve ? CFV_CATVEN : CFV_CODCATC);
|
|
|
|
|
}
|
|
|
|
|
const TRectype& t = cache().get(is_cve ? "CVE" : "CCO", cod);
|
|
|
|
|
if (!t.empty())
|
|
|
|
|
{
|
|
|
|
|
const bool x =(is_cve || is_cli);
|
|
|
|
|
const int gr = t.get_int(x ? "I3" : "I0");
|
|
|
|
|
const int co = t.get_int(x ? "I4" : "I1");
|
|
|
|
|
const long so = t.get_long(x ? "I5": "I2");
|
|
|
|
|
conto.set(gr,co,so);
|
|
|
|
|
}
|
|
|
|
|
if (conto.ok())
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break; // case 'M'
|
|
|
|
|
}
|
|
|
|
|
case 'P': // righe prestazione
|
|
|
|
|
case 'S': // righe spese
|
|
|
|
|
{
|
2005-07-26 17:25:27 +00:00
|
|
|
|
const TString80 codspesa = r.get(RDOC_CODART);
|
|
|
|
|
const TRectype& tab = cache().get(t == 'P' ? "PRS" : "SPP", codspesa);
|
2005-05-17 15:39:29 +00:00
|
|
|
|
if (!tab.empty())
|
|
|
|
|
{
|
|
|
|
|
int gr = tab.get_int(is_cli ? "I0" : "I3");
|
|
|
|
|
int co = tab.get_int(is_cli ? "I1" : "I4");
|
|
|
|
|
long so = tab.get_long(is_cli ? "I2" : "I5");
|
|
|
|
|
conto.set(gr,co,so);
|
|
|
|
|
if (!is_cli && !conto.ok())
|
|
|
|
|
{
|
|
|
|
|
gr = r.get_int("QTAGG1");
|
|
|
|
|
co = r.get_int("QTAGG2");
|
|
|
|
|
so = r.get_long("QTAGG3");
|
|
|
|
|
conto.set(gr,co,so);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (t == 'P' && !conto.find()) // Cerca il conto nella stringa di ricerca (solo per prestazioni)
|
|
|
|
|
{
|
|
|
|
|
TString16 tok;
|
|
|
|
|
// Scorre la stringa di ricerca ma solo per causale o CLI/FO
|
2005-07-01 16:13:50 +00:00
|
|
|
|
for (int i=0; i<items;i++)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
{
|
|
|
|
|
_search_seq.get(i, tok);
|
|
|
|
|
if (tok == "CF")
|
|
|
|
|
{
|
|
|
|
|
if (skip_clifo)
|
|
|
|
|
continue;
|
|
|
|
|
const int gr = cli_file.get_int(CLI_GRUPPORIC);
|
|
|
|
|
const int co = cli_file.get_int(CLI_CONTORIC);
|
|
|
|
|
const long so = cli_file.get_long(CLI_SOTTOCRIC);
|
|
|
|
|
conto.set(gr,co,so);
|
|
|
|
|
if (conto.ok())
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (tok == "CA")
|
|
|
|
|
{
|
|
|
|
|
const TCausale& caus = rdoc2caus(r);
|
|
|
|
|
if (caus.IVA2bill(codiva,conto))
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break; // case 'P','S'
|
|
|
|
|
}
|
|
|
|
|
case 'C': // righe sconti
|
|
|
|
|
case 'D': // righe descrizioni (saltare)
|
|
|
|
|
default :
|
|
|
|
|
break;
|
|
|
|
|
} // end of switch
|
2005-07-01 16:13:50 +00:00
|
|
|
|
|
|
|
|
|
return conto.ok() && conto.find();
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti)
|
|
|
|
|
{
|
2005-07-01 13:03:24 +00:00
|
|
|
|
bool bArcticleFound = false;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
|
2005-07-01 13:03:24 +00:00
|
|
|
|
const char tipocf = riga.doc().get_char(DOC_TIPOCF);
|
|
|
|
|
TString80 contanal;
|
2005-07-25 13:30:03 +00:00
|
|
|
|
|
|
|
|
|
TBill bill; // Cerco il conto contabile
|
|
|
|
|
if (!search_costo_ricavo(riga, bill))
|
|
|
|
|
return true;
|
|
|
|
|
if (!bill.is_analitico())
|
|
|
|
|
return true;
|
|
|
|
|
|
2005-05-17 15:39:29 +00:00
|
|
|
|
if (riga.is_articolo())
|
|
|
|
|
{
|
|
|
|
|
const TRectype& anamag = cache().get(LF_ANAMAG, riga.get(RDOC_CODARTMAG));
|
2005-07-01 13:03:24 +00:00
|
|
|
|
bArcticleFound = !anamag.empty();
|
2005-07-25 13:30:03 +00:00
|
|
|
|
if (_usepdcc)
|
|
|
|
|
contanal.format("%03d%03d%06ld", bill.gruppo(), bill.conto(), bill.sottoconto());
|
|
|
|
|
else
|
|
|
|
|
contanal = anamag.get(tipocf == 'F' ? ANAMAG_CONTOINDA : ANAMAG_CONTOINDV);
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
const char* tabanal = NULL;
|
|
|
|
|
if (riga.is_spese())
|
|
|
|
|
{ tabanal = "SPP"; } else
|
|
|
|
|
if (riga.is_prestazione())
|
|
|
|
|
{ tabanal = "PRS"; } else
|
|
|
|
|
if (riga.is_risorsa())
|
|
|
|
|
{ tabanal = "RIS"; } else
|
|
|
|
|
if (riga.is_attrezzatura())
|
|
|
|
|
{ tabanal = "ATR"; }
|
|
|
|
|
if (tabanal != NULL)
|
|
|
|
|
{
|
|
|
|
|
const TRectype& spp = cache().get(tabanal, riga.get(RDOC_CODART));
|
2005-07-01 13:03:24 +00:00
|
|
|
|
bArcticleFound = !spp.empty();
|
2005-07-25 13:30:03 +00:00
|
|
|
|
if (_usepdcc)
|
|
|
|
|
contanal.format("%03d%03d%06ld", bill.gruppo(), bill.conto(), bill.sottoconto());
|
|
|
|
|
else
|
|
|
|
|
contanal = spp.get(tipocf == 'F' ? "S2" : "S1");
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2005-07-01 13:03:24 +00:00
|
|
|
|
if (!bArcticleFound) // Se l'anagrtafica non esiste va bene cosi'
|
|
|
|
|
return true;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
|
2005-07-25 13:30:03 +00:00
|
|
|
|
/* TBill bill; // Cerco il conto contabile
|
2005-07-01 16:13:50 +00:00
|
|
|
|
if (!search_costo_ricavo(riga, bill))
|
|
|
|
|
return true;
|
|
|
|
|
if (!bill.is_analitico())
|
2005-07-25 13:30:03 +00:00
|
|
|
|
return true;*/
|
2005-07-01 16:13:50 +00:00
|
|
|
|
|
2005-07-01 13:03:24 +00:00
|
|
|
|
const TString80 riga_cos = riga.codice_costo();
|
|
|
|
|
const TString80 riga_cms = riga.codice_commessa();
|
|
|
|
|
const TString16 riga_fsc = riga.fase_commessa();
|
|
|
|
|
const bool riga_any = riga_cos.not_empty() || riga_cms.not_empty() || riga_fsc.not_empty();
|
|
|
|
|
|
|
|
|
|
if (contanal.blank()) // Non ho trovato il conto in anagrafica ...
|
|
|
|
|
{
|
|
|
|
|
// Cerca la ripartizione del conto
|
|
|
|
|
const TRecord_array& rip = _rip.righe(bill);
|
|
|
|
|
TToken_string conto;
|
|
|
|
|
for (int i = 1; i <= rip.rows(); i++)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
{
|
2005-07-01 13:03:24 +00:00
|
|
|
|
const TRectype& rigarip = rip.row(i);
|
|
|
|
|
conto = rigarip.get(RRIP_CODCONTO);
|
2005-05-17 15:39:29 +00:00
|
|
|
|
if (riga_any)
|
|
|
|
|
{
|
2005-07-01 11:50:55 +00:00
|
|
|
|
conto.add(riga_cos, 1);
|
|
|
|
|
conto.add(riga_cms, 2);
|
|
|
|
|
conto.add(riga_fsc, 3);
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
2005-07-01 13:03:24 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
conto.add(rigarip.get(RRIP_CODCOSTO), 1);
|
|
|
|
|
conto.add(rigarip.get(RRIP_CODCMS), 2);
|
|
|
|
|
conto.add(rigarip.get(RRIP_CODFASE), 3);
|
|
|
|
|
}
|
|
|
|
|
conto.add(rigarip.get(RRIP_RIPARTO), 4);
|
2005-05-17 15:39:29 +00:00
|
|
|
|
conti.add(conto);
|
|
|
|
|
}
|
|
|
|
|
}
|
2005-07-01 13:03:24 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Ho trovato il conto in anagrafica ...
|
|
|
|
|
TToken_string conto = contanal;
|
|
|
|
|
if (riga_any)
|
|
|
|
|
{
|
|
|
|
|
conto.add(riga_cos, 1);
|
|
|
|
|
conto.add(riga_cms, 2);
|
|
|
|
|
conto.add(riga_fsc, 3);
|
|
|
|
|
}
|
|
|
|
|
conto.add(100, 4);
|
|
|
|
|
conti.add(conto);
|
|
|
|
|
}
|
2005-05-17 15:39:29 +00:00
|
|
|
|
|
2005-07-01 13:03:24 +00:00
|
|
|
|
return !conti.empty();
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TContabilizzazione_analitica::init_distrib(TString_array& conti, TGeneric_distrib& distrib)
|
|
|
|
|
{
|
|
|
|
|
FOR_EACH_ARRAY_ROW(conti, i, row)
|
|
|
|
|
{
|
|
|
|
|
real slice = row->get(4);
|
|
|
|
|
if (slice <= ZERO)
|
|
|
|
|
slice = UNO;
|
|
|
|
|
distrib.add(slice);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-07-25 13:30:03 +00:00
|
|
|
|
bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TViswin* viswin, bool can_write, TAnal_mov& mov)
|
2005-05-06 10:58:49 +00:00
|
|
|
|
{
|
2005-07-25 13:30:03 +00:00
|
|
|
|
TDate datareg, datacomp, datadoc;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
int annoes = 0;
|
2005-07-12 16:41:44 +00:00
|
|
|
|
TString descr, msg, codcaus;
|
2005-06-29 13:04:06 +00:00
|
|
|
|
bool dare = false;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
|
|
|
|
|
if (numreg_cg > 0)
|
|
|
|
|
{
|
|
|
|
|
const TRectype& mov_cg = cache().get(LF_MOV, numreg_cg);
|
|
|
|
|
datareg = mov_cg.get_date(MOV_DATAREG);
|
|
|
|
|
datacomp = mov_cg.get_date(MOV_DATACOMP);
|
|
|
|
|
annoes = mov_cg.get_int(MOV_ANNOES);
|
|
|
|
|
descr = mov_cg.get(MOV_DESCR);
|
2005-06-28 16:07:55 +00:00
|
|
|
|
TCausale & caus = (TCausale &) doc2caus(doc);
|
|
|
|
|
dare = !(caus.sezione_clifo() == 'D');
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2005-07-25 13:30:03 +00:00
|
|
|
|
datadoc = doc.get(DOC_DATADOC);
|
2005-07-12 16:24:29 +00:00
|
|
|
|
datareg = datacomp = datadoc;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
annoes = datareg.year();
|
2005-07-12 16:24:29 +00:00
|
|
|
|
doc.riferimento(descr);
|
|
|
|
|
if (descr.empty())
|
|
|
|
|
descr = doc.tipo().descrizione();
|
|
|
|
|
|
|
|
|
|
const TString8 rif = doc.get(DOC_NUMDOCRIF);
|
|
|
|
|
TCausale & caus = (TCausale &) doc2caus(doc);
|
2005-07-12 16:41:44 +00:00
|
|
|
|
codcaus = caus.codice();
|
2005-07-12 16:24:29 +00:00
|
|
|
|
const bool use_rif = caus.iva() == iva_acquisti && rif.not_empty();
|
|
|
|
|
if (use_rif)
|
|
|
|
|
{
|
|
|
|
|
descr << TR(" n. ") << rif;
|
|
|
|
|
descr << TR(" del ") << doc.get(DOC_DATADOCRIF);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
descr << TR(" n. ") << doc.numero();
|
|
|
|
|
descr << TR(" del ") << datadoc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2005-06-28 16:07:55 +00:00
|
|
|
|
dare = doc.get_char(DOC_TIPOCF) == 'F';
|
|
|
|
|
if (doc.is_nota_credito())
|
|
|
|
|
dare= !dare;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
2005-06-29 13:04:06 +00:00
|
|
|
|
const char sezione = dare ? 'D' : 'A';
|
2005-05-17 15:39:29 +00:00
|
|
|
|
const int decimals = TCurrency::get_firm_dec();
|
|
|
|
|
|
2005-06-29 13:04:06 +00:00
|
|
|
|
long numreg_ca = doc.get_long(DOC_NUMREGCA);
|
|
|
|
|
if (numreg_ca > 0)
|
|
|
|
|
{
|
|
|
|
|
const int err = mov.read(numreg_ca);
|
|
|
|
|
if (err == NOERR)
|
|
|
|
|
{
|
|
|
|
|
if (viswin != NULL)
|
|
|
|
|
{
|
|
|
|
|
msg.format("--- Il documento verr<72> ricontabilizzato nel movimento analitico %ld", numreg_ca);
|
|
|
|
|
viswin->add_line(msg);
|
|
|
|
|
}
|
|
|
|
|
mov.body().destroy_rows();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
mov.put(MOVANA_NUMREG, numreg_ca = 0);
|
|
|
|
|
}
|
|
|
|
|
mov.put(MOVANA_DATAREG, datareg);
|
|
|
|
|
mov.put(MOVANA_DATACOMP, datacomp);
|
2005-07-25 13:30:03 +00:00
|
|
|
|
mov.put(MOVANA_DATADOC, datadoc);
|
2005-06-29 13:04:06 +00:00
|
|
|
|
mov.put(MOVANA_ANNOES, annoes);
|
|
|
|
|
mov.put(MOVANA_DESCR, descr);
|
|
|
|
|
mov.put(MOVANA_NUMREGCG, numreg_cg); // Movimento contabile associato
|
2005-07-12 16:41:44 +00:00
|
|
|
|
mov.put(MOVANA_CODCAUS, codcaus);
|
2005-06-29 13:04:06 +00:00
|
|
|
|
mov.put(MOVANA_DPROVV, doc.get(DOC_PROVV)); // Documento originale
|
|
|
|
|
mov.put(MOVANA_DANNO, doc.get(DOC_ANNO));
|
|
|
|
|
mov.put(MOVANA_DCODNUM, doc.get(DOC_CODNUM));
|
|
|
|
|
mov.put(MOVANA_DNDOC, doc.get(DOC_NDOC));
|
|
|
|
|
|
2005-07-12 16:41:44 +00:00
|
|
|
|
|
2005-06-29 13:04:06 +00:00
|
|
|
|
TImporto totdoc; // Totale movimento analitico
|
|
|
|
|
|
|
|
|
|
// Scandisco le righe del documento,
|
2005-05-09 11:07:31 +00:00
|
|
|
|
for (int i = 1; i <= doc.physical_rows(); i++)
|
|
|
|
|
{
|
|
|
|
|
const TRiga_documento& riga = doc[i];
|
2005-05-17 15:39:29 +00:00
|
|
|
|
|
|
|
|
|
// salto descrizioni, sconti e omaggi
|
2005-05-09 11:07:31 +00:00
|
|
|
|
if (riga.is_descrizione() || riga.is_sconto() || riga.is_omaggio())
|
|
|
|
|
continue;
|
|
|
|
|
|
2005-05-17 15:39:29 +00:00
|
|
|
|
// salto valori nulli
|
2005-07-26 17:25:27 +00:00
|
|
|
|
const real qta = riga.get(RDOC_QTA);
|
|
|
|
|
// const real valore = riga.valore(true, decimals);
|
|
|
|
|
const real valore = riga.importo(true, false);
|
2005-05-17 15:39:29 +00:00
|
|
|
|
if (valore.is_zero())
|
|
|
|
|
continue;
|
2005-05-09 11:07:31 +00:00
|
|
|
|
|
2005-05-17 15:39:29 +00:00
|
|
|
|
TString_array conti;
|
2005-07-01 13:03:24 +00:00
|
|
|
|
const bool ok = find_conti(riga, conti);
|
|
|
|
|
if (!ok)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
{
|
|
|
|
|
if (viswin != NULL)
|
|
|
|
|
{
|
|
|
|
|
TString msg;
|
2005-07-01 11:50:55 +00:00
|
|
|
|
msg.format(FR("*** Riga %d: Manca il conto analitico dell'articolo '%s'"), i, (const char*)riga.get(RDOC_CODART));
|
2005-05-17 15:39:29 +00:00
|
|
|
|
viswin->add_line(msg);
|
|
|
|
|
}
|
2005-07-01 16:13:50 +00:00
|
|
|
|
_error = conto_error;
|
2005-07-01 13:03:24 +00:00
|
|
|
|
can_write = false;
|
2005-05-17 15:39:29 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2005-06-29 13:04:06 +00:00
|
|
|
|
TGeneric_distrib esso(valore, decimals);
|
|
|
|
|
init_distrib(conti, esso);
|
|
|
|
|
FOR_EACH_ARRAY_ROW(conti, i, row)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
{
|
2005-06-29 13:04:06 +00:00
|
|
|
|
TRectype& rmov = mov.new_row();
|
|
|
|
|
rmov.put(RMOVANA_ANNOES, annoes);
|
|
|
|
|
rmov.put(RMOVANA_CODCONTO, row->get(0));
|
2005-07-01 11:50:55 +00:00
|
|
|
|
rmov.put(RMOVANA_CODCCOSTO,row->get());
|
2005-06-29 13:04:06 +00:00
|
|
|
|
rmov.put(RMOVANA_CODCMS, row->get());
|
|
|
|
|
rmov.put(RMOVANA_CODFASE, row->get());
|
2005-07-01 11:50:55 +00:00
|
|
|
|
rmov.put(RMOVANA_DESCR, riga.get(RDOC_DESCR));
|
2005-06-29 13:04:06 +00:00
|
|
|
|
|
|
|
|
|
TImporto imp(sezione, real(esso.get()));
|
|
|
|
|
imp.normalize();
|
|
|
|
|
rmov.put(RMOVANA_SEZIONE, imp.sezione());
|
|
|
|
|
rmov.put(RMOVANA_IMPORTO, imp.valore());
|
|
|
|
|
|
|
|
|
|
totdoc += imp;
|
|
|
|
|
}
|
|
|
|
|
}
|
2005-05-17 15:39:29 +00:00
|
|
|
|
|
2005-07-01 13:03:24 +00:00
|
|
|
|
if (can_write && mov.rows() > 0)
|
2005-06-29 13:04:06 +00:00
|
|
|
|
{
|
|
|
|
|
totdoc.normalize();
|
|
|
|
|
mov.put(MOVANA_SEZIONE, totdoc.sezione());
|
|
|
|
|
mov.put(MOVANA_TOTDOC, totdoc.valore());
|
2005-06-24 17:05:02 +00:00
|
|
|
|
|
2005-06-29 13:04:06 +00:00
|
|
|
|
TLocalisamfile movana(LF_MOVANA);
|
|
|
|
|
if (numreg_ca > 0)
|
|
|
|
|
mov.rewrite(movana);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
mov.write(movana);
|
|
|
|
|
numreg_ca = mov.get_long(MOVANA_NUMREG);
|
|
|
|
|
doc.put(DOC_NUMREGCA, numreg_ca);
|
|
|
|
|
}
|
|
|
|
|
if (viswin != NULL)
|
|
|
|
|
{
|
|
|
|
|
msg.format(FR("--- Movimento analitico $[r,w]%ld$[n,w] del %s"), numreg_ca, datacomp.string());
|
|
|
|
|
viswin->add_line(msg);
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
2005-05-09 11:07:31 +00:00
|
|
|
|
}
|
2005-06-29 13:04:06 +00:00
|
|
|
|
|
2005-05-17 15:39:29 +00:00
|
|
|
|
return can_write;
|
2005-05-06 10:58:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2005-07-12 16:53:46 +00:00
|
|
|
|
static bool link_handler_ana(int n, const char* nreg)
|
|
|
|
|
{
|
|
|
|
|
switch (n)
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
{
|
|
|
|
|
TRectype mov(LF_MOVANA);
|
|
|
|
|
mov.put(MOVANA_NUMREG, nreg);
|
|
|
|
|
return mov.edit();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2005-05-06 10:58:49 +00:00
|
|
|
|
bool TContabilizzazione_analitica::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
|
|
|
|
const TDate& data_elab, bool interattivo)
|
|
|
|
|
{
|
|
|
|
|
const TImporto zero;
|
2005-07-12 16:53:46 +00:00
|
|
|
|
TPrinter& p = printer();
|
|
|
|
|
p.links().add("Movimento Analitico |r|w", 0);
|
|
|
|
|
p.setlinkhandler(link_handler_ana);
|
2005-07-12 16:41:44 +00:00
|
|
|
|
TViswin v(NULL, TR("Contabilizzazione documenti in analitica"), false, true, true);
|
2005-07-12 16:24:29 +00:00
|
|
|
|
|
|
|
|
|
v.open_modal();
|
2005-07-11 11:30:05 +00:00
|
|
|
|
for (int i = 0; i < doc_in.items(); i++)
|
2005-05-06 10:58:49 +00:00
|
|
|
|
{
|
2005-07-25 13:30:03 +00:00
|
|
|
|
TAnal_mov mov;
|
|
|
|
|
if (elabora(doc_in[i], 0, &v, true, mov))
|
2005-07-11 11:30:05 +00:00
|
|
|
|
doc_in[i].stato(get_char("S4"));
|
|
|
|
|
else
|
2005-05-09 11:07:31 +00:00
|
|
|
|
break;
|
2005-05-06 10:58:49 +00:00
|
|
|
|
}
|
2005-07-12 16:24:29 +00:00
|
|
|
|
v.close_print();
|
|
|
|
|
v.close_modal();
|
|
|
|
|
if (v.run() == K_CTRL+'S') // Ho premuto Stampa
|
2005-07-12 16:53:46 +00:00
|
|
|
|
p.print_txt(v.text());
|
2005-07-12 16:24:29 +00:00
|
|
|
|
|
2005-05-17 15:39:29 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2005-07-25 13:30:03 +00:00
|
|
|
|
void TContabilizzazione_analitica::init()
|
|
|
|
|
{
|
2005-09-19 17:17:27 +00:00
|
|
|
|
TConfig& cfg = ca_config();
|
2005-07-25 13:30:03 +00:00
|
|
|
|
_usepdcc = cfg.get_bool("UsePdcc");
|
|
|
|
|
}
|
|
|
|
|
|
2005-07-01 13:03:24 +00:00
|
|
|
|
TContabilizzazione_analitica::TContabilizzazione_analitica()
|
|
|
|
|
: TElaborazione(NULL), _error(no_error)
|
2005-07-25 13:30:03 +00:00
|
|
|
|
{
|
|
|
|
|
init();
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TContabilizzazione_analitica::TContabilizzazione_analitica(const TRectype& rec)
|
2005-07-01 13:03:24 +00:00
|
|
|
|
: TElaborazione(rec), _error(no_error)
|
2005-05-17 15:39:29 +00:00
|
|
|
|
{
|
2005-07-25 13:30:03 +00:00
|
|
|
|
init();
|
2005-05-17 15:39:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TContabilizzazione_analitica::~TContabilizzazione_analitica()
|
|
|
|
|
{ }
|