Patch level : 10.0
Files correlati : lv4 Ricompilazione Demo : [ ] Commento : Corretta importazione partite aperte da COGECO git-svn-id: svn://10.65.10.50/trunk@20003 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
b5f3f979c1
commit
9b208509b7
@ -1033,7 +1033,7 @@ void TFatturazione_lavanderie::campi_raggruppamento_righe(TToken_string& campi_r
|
||||
//se lo standard lascia campi_riga vuota, allora la pongo uguale a "CODART|UMQTA"
|
||||
//che sono sicuramente sempre uguali
|
||||
if (campi_riga.empty())
|
||||
campi_riga = "CODART|UMQTA"; // Uguali sempre
|
||||
campi_riga = RDOC_CODART"|"RDOC_UMQTA; // Uguali sempre
|
||||
}
|
||||
|
||||
//FIND_OR_CREATE_ROW: questo metodo cerca tra tutte le righe documento della fattura prodotta
|
||||
|
@ -23,7 +23,8 @@ struct TStruttura: public TObject
|
||||
long _qta;
|
||||
TStruttura():_cliente(0),_numeroDoc(0),_qta(0) {}
|
||||
TStruttura(long cliente, const TString& articolo, const TString& descr,
|
||||
TDate dataDoc, int numeroDoc, long qta):_cliente(cliente),_articolo(articolo),_descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {}
|
||||
TDate dataDoc, int numeroDoc, long qta):_cliente(cliente),_articolo(articolo),
|
||||
_descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {}
|
||||
};
|
||||
|
||||
struct TStrutturaData: public TObject
|
||||
|
168
lv/lv4200.cpp
168
lv/lv4200.cpp
@ -23,7 +23,7 @@
|
||||
|
||||
enum CGC_SALDAC { CGC_NULL, CGC_TIPOCF, CGC_ANNO, CGC_NUMPART, CGC_CODCF,
|
||||
CGC_NUMEROREC, CGC_CAMBIO, CGC_VALUTA, CGC_TIPODOC, CGC_DATADOC,
|
||||
CGC_SCADENZA, CGC_IMPORTO, CGC_IMPORTO_VAL };
|
||||
CGC_SCADENZA, CGC_IMPORTO, CGC_IMPORTO_VAL,CGC_NUMDOC };
|
||||
|
||||
class TCausali_cache : public TCache
|
||||
{
|
||||
@ -33,7 +33,7 @@ protected:
|
||||
virtual TObject* key2obj(const char* key);
|
||||
|
||||
public:
|
||||
const TCausale& causale(char tipocf, tipo_movimento tm, const TDate& datadoc);
|
||||
const TCausale& causale(char tipocf, tipo_movimento tm);
|
||||
void init(const char* cln, const char* frn) { _cln = cln; _frn = frn; }
|
||||
};
|
||||
|
||||
@ -41,9 +41,6 @@ TObject* TCausali_cache::key2obj(const char* key)
|
||||
{
|
||||
const char tipocf = key[0];
|
||||
const tipo_movimento tm = tipo_movimento(key[1]-'0');
|
||||
int anno = atoi(key + 2);
|
||||
if (anno <= 0)
|
||||
anno = TDate(TODAY).year();
|
||||
|
||||
TString4 codcaus;
|
||||
if (tm == tm_fattura)
|
||||
@ -57,16 +54,15 @@ TObject* TCausali_cache::key2obj(const char* key)
|
||||
if (caus.move_first())
|
||||
codcaus = caus.get(CAU_CODCAUS).as_string();
|
||||
}
|
||||
TCausale* pcaus = new TCausale(codcaus, anno);
|
||||
TCausale* pcaus = new TCausale(codcaus);
|
||||
return pcaus;
|
||||
}
|
||||
|
||||
const TCausale& TCausali_cache::causale(const char tipocf, tipo_movimento tm, const TDate& datadoc)
|
||||
const TCausale& TCausali_cache::causale(const char tipocf, tipo_movimento tm)
|
||||
{
|
||||
// Metodo bastardo per evitare TToken_string temporanee "a randa"
|
||||
// creo chiave a lunghezza fissa TIPOCF+TIPOMOV = C1
|
||||
TString8 key;
|
||||
key.format("%c%1d%4d" , tipocf, tm, datadoc.year());
|
||||
// creo chiave a lunghezza fissa TIPOCF+TIPOMOV+ANNO = C12010
|
||||
const char key[4] = { tipocf, '0'+tm, '\0' };
|
||||
return *(const TCausale*)objptr(key);
|
||||
}
|
||||
|
||||
@ -91,28 +87,26 @@ bool TImporta_sc_mask::on_field_event(TOperable_field& f, TField_event e, long j
|
||||
{
|
||||
switch (f.dlg())
|
||||
{
|
||||
//giochetto per avere la lista dei files validi nella directory di trasferimento!
|
||||
case F_NAME:
|
||||
if (e == fe_button)
|
||||
//giochetto per avere la lista dei files validi nella directory di trasferimento!
|
||||
case F_NAME:
|
||||
if (e == fe_button)
|
||||
{
|
||||
TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), "File@32");
|
||||
TFilename path = get(F_PATH);
|
||||
path.add("*.txt"); //file da importare
|
||||
list_files(path, as.rows_array());
|
||||
TFilename name;
|
||||
FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
|
||||
{
|
||||
TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), "File@32");
|
||||
TFilename path = get(F_PATH);
|
||||
path.add("*.txt"); //file da importare
|
||||
list_files(path, as.rows_array());
|
||||
TFilename name;
|
||||
FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
|
||||
{
|
||||
name = *row;
|
||||
*row = name.name();
|
||||
}
|
||||
if (as.run() == K_ENTER)
|
||||
{
|
||||
f.set(as.row(as.selected()));
|
||||
}
|
||||
name = *row;
|
||||
*row = name.name();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (as.run() == K_ENTER)
|
||||
f.set(as.row(as.selected()));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -128,17 +122,18 @@ class TImporta_sc : public TSkeleton_application
|
||||
TBill _clienti, _fornitori;
|
||||
|
||||
private:
|
||||
void nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm);
|
||||
void nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm, bool is_riba);
|
||||
bool paga_rata(TPartita& game, int nrata, int nrigp, real& importo) const;
|
||||
void set_descr(TRectype& rec) const;
|
||||
|
||||
protected:
|
||||
bool log_error(TLog_report& log, const char* msg, const TRecordset& recset);
|
||||
const TCausale& causale(char tipocf, tipo_movimento tm, const TDate& datadoc);
|
||||
const TCausale& causale(char tipocf, tipo_movimento tm);
|
||||
char get_tmcf(int gruppo, int conto) const;
|
||||
bool find_clifo_bill(char tipocf, int& gruppo, int& conto, long sottoconto);
|
||||
|
||||
TRiga_partite& nuova_fattura(const TImporta_cogeco_recset& recset, TPartita& game);
|
||||
void nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game);
|
||||
void nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game, bool is_riba);
|
||||
void nuova_riba(const TImporta_cogeco_recset& recset, TPartita& game);
|
||||
void nuovo_pagamento(const TImporta_cogeco_recset& recset, TPartita& game);
|
||||
void nuova_nota_credito(const TImporta_cogeco_recset& recset, TPartita& game);
|
||||
@ -153,8 +148,8 @@ public:
|
||||
};
|
||||
|
||||
// Cerca una causale appropriata in base a TIPOCF (C o F) e TIPOMOV (1, 2, 3, ...)
|
||||
const TCausale& TImporta_sc::causale(char tipocf, tipo_movimento tm, const TDate& datadoc)
|
||||
{ return _cache_causali.causale(tipocf, tm, datadoc); }
|
||||
const TCausale& TImporta_sc::causale(char tipocf, tipo_movimento tm)
|
||||
{ return _cache_causali.causale(tipocf, tm); }
|
||||
|
||||
// Ricava il campo TMCF (Cliente o Fornitore) di un dato conto
|
||||
char TImporta_sc::get_tmcf(int gruppo, int conto) const
|
||||
@ -189,8 +184,7 @@ bool TImporta_sc::find_clifo_bill(char tipocf, int& gruppo, int& conto, long sot
|
||||
if (!found)
|
||||
{
|
||||
// Cerca sulla prima riga dellla causale
|
||||
const TDate datadoc(TODAY);
|
||||
const TCausale& caus = causale(tipocf, tm_fattura, datadoc);
|
||||
const TCausale& caus = causale(tipocf, tm_fattura);
|
||||
TBill bill; caus.bill(1, bill);
|
||||
gruppo = bill.gruppo();
|
||||
conto = bill.conto();
|
||||
@ -216,6 +210,33 @@ bool TImporta_sc::find_clifo_bill(char tipocf, int& gruppo, int& conto, long sot
|
||||
return found;
|
||||
}
|
||||
|
||||
void TImporta_sc::set_descr(TRectype& rec) const
|
||||
{
|
||||
TString descr;
|
||||
descr << "*** ";
|
||||
switch (rec.num())
|
||||
{
|
||||
case LF_SCADENZE:
|
||||
descr << TR("Rata") << ' ' << rec.get(SCAD_NRATA);
|
||||
rec.put(SCAD_DESCR, descr);
|
||||
break;
|
||||
case LF_PARTITE:
|
||||
switch (tipo_movimento(rec.get_int(PART_TIPOMOV)))
|
||||
{
|
||||
case tm_fattura : descr << TR("Fattura") << ' '
|
||||
<< rec.get(PART_ANNO) << '/' << rec.get(PART_NUMDOC); break;
|
||||
case tm_nota_credito: descr << TR("Nota di credito")
|
||||
<< rec.get(PART_ANNO) << '/' << rec.get(PART_NUMDOC); break;
|
||||
case tm_insoluto : descr << TR("Insoluto"); break;
|
||||
default : descr << TR("Pagamento"); break;
|
||||
}
|
||||
rec.put(PART_DESCR, descr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiunge una nuova riga fattura a 'game' in base ai dati in 'recset'
|
||||
TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset, TPartita& game)
|
||||
{
|
||||
@ -227,10 +248,12 @@ TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset,
|
||||
const TDate datadoc = recset.get_date(CGC_DATADOC);
|
||||
fattura.put(PART_DATAREG, datadoc);
|
||||
fattura.put(PART_DATADOC, datadoc);
|
||||
fattura.put(PART_DESCR, TR("*** Fattura gnerata da COGECO ***"));
|
||||
const long numdoc = recset.get(CGC_NUMDOC).as_int();
|
||||
if (numdoc > 0)
|
||||
fattura.put(PART_NUMDOC, numdoc);
|
||||
|
||||
const char tipocf = game.conto().tipo();
|
||||
const TCausale& caus = causale(tipocf, tm_fattura, datadoc);
|
||||
const TCausale& caus = causale(tipocf, tm_fattura);
|
||||
if (caus.ok())
|
||||
{
|
||||
fattura.put(PART_CODCAUS, caus.codice());
|
||||
@ -243,6 +266,8 @@ TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset,
|
||||
fattura.put(PART_TIPOMOV, tm_fattura);
|
||||
fattura.put(PART_SEZ, tipocf == 'C' ? 'D' : 'A');
|
||||
}
|
||||
set_descr(fattura);
|
||||
|
||||
nriga = fattura.get_int(PART_NRIGA);
|
||||
}
|
||||
|
||||
@ -257,7 +282,7 @@ TRiga_partite& TImporta_sc::nuova_fattura(const TImporta_cogeco_recset& recset,
|
||||
|
||||
// Aggiunge una nuova rata alla UNICA fattura di 'game'.
|
||||
// Attenzione: in assenza di fattura ne viene creata una "al volo" di pari importo.
|
||||
void TImporta_sc::nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game)
|
||||
void TImporta_sc::nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita& game, bool is_riba)
|
||||
{
|
||||
int nriga = game.prima_fattura(); // PART_NRIGA della fattura (solitamente = 1)
|
||||
if (nriga <= 0) // Se non ci sono fattura in questa partita ...
|
||||
@ -266,12 +291,28 @@ void TImporta_sc::nuova_scadenza(const TImporta_cogeco_recset& recset, TPartita&
|
||||
nriga = game.prima_fattura(); // Aggiorno PART_NRIGA che valeva -1
|
||||
}
|
||||
TRiga_partite& fattura = game.riga(nriga); // Accedo alla riga di fattura, che ora DEVE esistere!
|
||||
TRiga_scadenze& scadenza = fattura.new_row(); // Creo nuova rata, alla faccia di SCAD_CODPAG
|
||||
|
||||
// Se la scadenza coincide o precede l'ultima, non creo una rata nuova
|
||||
const TDate datascad = recset.get_date(CGC_SCADENZA);
|
||||
int nrata = fattura.rate();
|
||||
if (nrata > 0)
|
||||
{
|
||||
const TRiga_scadenze& rata = fattura.rata(nrata);
|
||||
if (datascad > rata.get_date(SCAD_DATASCAD))
|
||||
nrata = 0; // Devo creare una rata nuova
|
||||
}
|
||||
if (nrata <= 0)
|
||||
{
|
||||
TRiga_scadenze& scadenza = fattura.new_row(); // Creo nuova rata, alla faccia di SCAD_CODPAG
|
||||
nrata = scadenza.get_int(SCAD_NRATA); // valeva 0
|
||||
scadenza.put(SCAD_DATASCAD, recset.get_date(CGC_SCADENZA));
|
||||
scadenza.put(SCAD_TIPOPAG, is_riba ? 3 : 1);
|
||||
set_descr(scadenza);
|
||||
}
|
||||
|
||||
TRiga_scadenze& scadenza = fattura.rata(nrata);
|
||||
const real importo = recset.get_real(CGC_IMPORTO);
|
||||
scadenza.put(SCAD_DATASCAD, recset.get_date(CGC_SCADENZA));
|
||||
scadenza.put(SCAD_IMPORTO, importo);
|
||||
scadenza.put(SCAD_DESCR, TR("*** Rata generata da COGECO ***"));
|
||||
scadenza.add(SCAD_IMPORTO, importo);
|
||||
}
|
||||
|
||||
bool TImporta_sc::paga_rata(TPartita& game, int nrata, int nrigp, real& importo) const
|
||||
@ -293,6 +334,7 @@ bool TImporta_sc::paga_rata(TPartita& game, int nrata, int nrigp, real& importo)
|
||||
rpag.put(field[k], scadenza.get(field[k]));
|
||||
rpag.put(PAGSCA_NRIGP, nrigp); // Completa la chiave di PAGSCA col numero riga di partita
|
||||
rpag.put(PAGSCA_IMPORTO, pagare);
|
||||
rpag.put(PAGSCA_ACCSAL, pagare >= residuo ? 'S' : 'A');
|
||||
const TValuta euro;
|
||||
game.modifica_pagamento(rpag, euro, true); // Speriamo che faccia tutto lei :-)
|
||||
importo -= pagare;
|
||||
@ -303,7 +345,7 @@ bool TImporta_sc::paga_rata(TPartita& game, int nrata, int nrigp, real& importo)
|
||||
}
|
||||
|
||||
// Aggiunge una nuova riga tipo 2 (n.c.) o 3 (pag.) alla partita
|
||||
void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm)
|
||||
void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, TPartita& game, tipo_movimento tm, bool is_riba)
|
||||
{
|
||||
// Crea una nuova riga di partita
|
||||
TRiga_partite& pagamento = game.new_row();
|
||||
@ -313,13 +355,17 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T
|
||||
pagamento.put(PART_DATAREG, datadoc);
|
||||
pagamento.put(PART_DATADOC, datadoc);
|
||||
if (tm == tm_nota_credito)
|
||||
pagamento.put(PART_DESCR, TR("*** Nota di credito generata da COGECO ***"));
|
||||
{
|
||||
const long numdoc = recset.get(CGC_NUMDOC).as_int();
|
||||
if (numdoc > 0)
|
||||
pagamento.put(PART_NUMDOC, numdoc);
|
||||
}
|
||||
else
|
||||
pagamento.put(PART_DESCR, TR("*** Pagamento generato da COGECO ***"));
|
||||
pagamento.put(PART_DATAPAG, datadoc);
|
||||
|
||||
// Cerca di inizlizzare la riga con una causale appropriata
|
||||
const char tipocf = game.conto().tipo();
|
||||
const TCausale& caus = causale(tipocf, tm, datadoc);
|
||||
const TCausale& caus = causale(tipocf, tm);
|
||||
if (caus.ok())
|
||||
{
|
||||
pagamento.put(PART_CODCAUS, caus.codice());
|
||||
@ -332,6 +378,7 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T
|
||||
pagamento.put(PART_TIPOMOV, tm);
|
||||
pagamento.put(PART_SEZ, tipocf == 'F' ? 'D' : 'A');
|
||||
}
|
||||
set_descr(pagamento); // Ora sono certo del TIPOMOV e posso generare la descrizione
|
||||
|
||||
// Somma da distribuire sulle rate aperte
|
||||
real importo = recset.get_real(CGC_IMPORTO);
|
||||
@ -373,7 +420,15 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T
|
||||
}
|
||||
}
|
||||
if (best_rata > 0)
|
||||
{
|
||||
if (is_riba)
|
||||
{
|
||||
const TRiga_scadenze& rata = fattura.rata(best_rata);
|
||||
if (rata.get_int(SCAD_TIPOPAG) == 3) // Per le RIBA precisa la data pagamento
|
||||
pagamento.put(PART_DATAPAG, rata.get(SCAD_DATASCAD));
|
||||
}
|
||||
paga_rata(game, best_rata, nrigp, importo);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
@ -390,6 +445,7 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T
|
||||
rpag.put(PAGSCA_NRATA, 9999); // Questo 9999 significa "rata ignota"
|
||||
rpag.put(PAGSCA_NRIGP, nrigp); // Completa la chiave di PAGSCA col numero riga di partita
|
||||
rpag.put(PAGSCA_IMPORTO, importo);
|
||||
rpag.put(PAGSCA_ACCSAL, 'A'); // Gli ancticipi sono sempre in acconto :-)
|
||||
const TValuta euro;
|
||||
game.modifica_pagamento(rpag, euro, true);
|
||||
}
|
||||
@ -399,17 +455,17 @@ void TImporta_sc::nuovo_pagamento_o_nota(const TImporta_cogeco_recset& recset, T
|
||||
// per cui in CAMPO viene aperta una scadenza ed immediatamente chiusa col relativo pagamento
|
||||
void TImporta_sc::nuova_riba(const TImporta_cogeco_recset& recset, TPartita& game)
|
||||
{
|
||||
nuova_scadenza(recset, game);
|
||||
nuovo_pagamento(recset, game);
|
||||
nuova_scadenza(recset, game, true);
|
||||
nuovo_pagamento_o_nota(recset, game, tm_pagamento, true);
|
||||
}
|
||||
|
||||
// Creo una nuova riga partita corrispondente ad una riga pagamento in PAGSCA
|
||||
void TImporta_sc::nuovo_pagamento(const TImporta_cogeco_recset& recset, TPartita& game)
|
||||
{ nuovo_pagamento_o_nota(recset, game, tm_pagamento); }
|
||||
{ nuovo_pagamento_o_nota(recset, game, tm_pagamento, false); }
|
||||
|
||||
// Creo una nuova riga partita corrispondente ad una riga nota di credito in PAGSCA
|
||||
void TImporta_sc::nuova_nota_credito(const TImporta_cogeco_recset& recset, TPartita& game)
|
||||
{ nuovo_pagamento_o_nota(recset, game, tm_nota_credito); }
|
||||
{ nuovo_pagamento_o_nota(recset, game, tm_nota_credito, false); }
|
||||
|
||||
// Creo una nuova riga partita corrispondente ad una riga di insoluto PAGSCA
|
||||
bool TImporta_sc::nuovo_insoluto(const TImporta_cogeco_recset& recset, TPartita& game, TLog_report& log)
|
||||
@ -457,11 +513,10 @@ bool TImporta_sc::nuovo_insoluto(const TImporta_cogeco_recset& recset, TPartita&
|
||||
|
||||
insoluto.put(PART_DATAREG, datadoc);
|
||||
insoluto.put(PART_DATADOC, datadoc);
|
||||
insoluto.put(PART_DESCR, TR("*** Insoluto trasferito da COGECO ***"));
|
||||
insoluto.put(PART_IMPTOTDOC, importo);
|
||||
|
||||
const char tipocf = game.conto().tipo();
|
||||
const TCausale& caus = causale(tipocf, tm_insoluto, datadoc);
|
||||
const TCausale& caus = causale(tipocf, tm_insoluto);
|
||||
if (caus.ok())
|
||||
{
|
||||
insoluto.put(PART_CODCAUS, caus.codice());
|
||||
@ -474,6 +529,7 @@ bool TImporta_sc::nuovo_insoluto(const TImporta_cogeco_recset& recset, TPartita&
|
||||
insoluto.put(PART_TIPOMOV, tm_insoluto);
|
||||
insoluto.put(PART_SEZ, fattura.sezione());
|
||||
}
|
||||
set_descr(insoluto);
|
||||
paga_rata(game, best_rata, nrigp, importo);
|
||||
}
|
||||
else
|
||||
@ -576,7 +632,7 @@ void TImporta_sc::transfer(const TFilename& file)
|
||||
TImporta_cogeco_recset recset(file);
|
||||
recset.sort(game_sorter);
|
||||
|
||||
TString caption; _msk->get_caption(caption);
|
||||
const TString& caption = main_app().title();
|
||||
TProgind pi(recset.items(), caption, true, true);
|
||||
|
||||
TConfig* conf = NULL;
|
||||
@ -664,7 +720,7 @@ void TImporta_sc::transfer(const TFilename& file)
|
||||
case 11: nuovo_pagamento(recset, *game); break; // Pagamento
|
||||
case 13: nuova_nota_credito(recset, *game); break; // Nota di credito su RB clienti
|
||||
case 14: nuova_nota_credito(recset, *game); break; // Abbuono
|
||||
case 15: nuova_scadenza(recset, *game); break;
|
||||
case 15: nuova_scadenza(recset, *game, false); break;
|
||||
case 18: nuova_riba(recset, *game); break; // Paghero'
|
||||
case 19: nuova_riba(recset, *game); break; // Avviso di scadenza
|
||||
case 20: nuova_riba(recset, *game); break; // R.I.D.
|
||||
|
Loading…
x
Reference in New Issue
Block a user