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:
guy 2010-01-28 10:45:45 +00:00
parent b5f3f979c1
commit 9b208509b7
3 changed files with 115 additions and 58 deletions

View File

@ -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

View File

@ -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

View File

@ -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.