Patch level : 10.0 738

Files correlati     : cg2.exe
Ricompilazione Demo : [ ]
Commento

Bug:                         0001532: 001982 - Pharmatex - richiamo causali da prima nota


è richiesto di poter richiamare, (così come già possibile per le causali a regime iva speciale) qualsiasi causale ad un'altra.
Valutare anche la possibilità di concatenare più di 2 causali, controllando che non avvenga un loop di richiamo infinito tra una causale e l'altra.


git-svn-id: svn://10.65.10.50/trunk@20445 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2010-05-12 13:39:07 +00:00
parent 23076b22d4
commit 24d509402e
6 changed files with 128 additions and 112 deletions

View File

@ -395,7 +395,7 @@ bool TCaus_app::mostra_campi()
m.hide(F_OP_INTRACOM); m.hide(F_OP_INTRACOM);
m.hide(F_VALINTRA); m.hide(F_VALINTRA);
m.hide(F_COD_CAUS_IM); // m.hide(F_COD_CAUS_IM);
m.hide(F_CODCAUREG); m.hide(F_CODCAUREG);
const int tpm = m.get_int(F_TIPO_MOV); const int tpm = m.get_int(F_TIPO_MOV);
@ -425,8 +425,8 @@ bool TCaus_app::mostra_campi()
m.hide(F_OP_FINE_ANNO); m.hide(F_OP_FINE_ANNO);
m.enable(F_MOV_VALU, valuta()); m.enable(F_MOV_VALU, valuta());
m.show(F_COD_CAUS_IM); // m.show(F_COD_CAUS_IM);
m.enable(F_COD_CAUS_IM, !saldaconto()); // m.enable(F_COD_CAUS_IM, !saldaconto());
m.show(F_CODCAUREG); m.show(F_CODCAUREG);
m.show(F_AUTO_FAT); m.show(F_AUTO_FAT);
@ -874,7 +874,7 @@ void TCaus_app::on_config_change()
_msk->show(F_TIPO_MOV_1, saldaconto()); _msk->show(F_TIPO_MOV_1, saldaconto());
_msk->show(F_TIPO_MOV_2, saldaconto()); _msk->show(F_TIPO_MOV_2, saldaconto());
_msk->enable(F_COD_CAUS_IM, !saldaconto()); // _msk->enable(F_COD_CAUS_IM, !saldaconto());
_msk->enable(F_MOV_VALU, valuta()); _msk->enable(F_MOV_VALU, valuta());
if (saldaconto()) if (saldaconto())

View File

@ -26,7 +26,7 @@ BEGIN
DISPLAY "Documento" TIPODOC DISPLAY "Documento" TIPODOC
DISPLAY "Registro" REG DISPLAY "Registro" REG
DISPLAY "Tipo movimento" TIPOMOV DISPLAY "Tipo movimento" TIPOMOV
DISPLAY "Inc./Pag." CODCAUSIM DISPLAY "Colleg." CODCAUSIM
DISPLAY "770" M770 DISPLAY "770" M770
DISPLAY "Cespiti" COLLCESP DISPLAY "Cespiti" COLLCESP
OUTPUT F_COD_CAUS CODCAUS OUTPUT F_COD_CAUS CODCAUS
@ -46,7 +46,7 @@ BEGIN
DISPLAY "Documento" TIPODOC DISPLAY "Documento" TIPODOC
DISPLAY "Registro" REG DISPLAY "Registro" REG
DISPLAY "Movimento" TIPOMOV DISPLAY "Movimento" TIPOMOV
DISPLAY "Inc./Pag." CODCAUSIM DISPLAY "Colleg." CODCAUSIM
DISPLAY "770" M770 DISPLAY "770" M770
DISPLAY "Cespiti" COLLCESP DISPLAY "Cespiti" COLLCESP
COPY OUTPUT F_COD_CAUS COPY OUTPUT F_COD_CAUS
@ -247,10 +247,10 @@ END
STRING F_COD_CAUS_IM 3 STRING F_COD_CAUS_IM 3
BEGIN BEGIN
PROMPT 34 8 "Codice causale per l'incasso immediato " PROMPT 34 8 "Codice causale collegata "
FLAGS "UZ" FLAGS "UZ"
FIELD CODCAUSIM FIELD CODCAUSIM
USE LF_CAUSALI SELECT REG=="" USE LF_CAUSALI
INPUT CODCAUS F_COD_CAUS_IM INPUT CODCAUS F_COD_CAUS_IM
DISPLAY "Codice" CODCAUS DISPLAY "Codice" CODCAUS
DISPLAY "Descrizione@50" DESCR DISPLAY "Descrizione@50" DESCR

View File

@ -31,8 +31,8 @@ public:
TDate _datadoc; TDate _datadoc;
TString8 _numdoc; TString8 _numdoc;
real _totale; real _totale;
TString4 _causale_fattura; TString4 _causale_originale;
TipoIVA _iva_fattura; TipoIVA _iva_originale;
}; };
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -262,7 +262,10 @@ bool TPrimanota_application::read_caus(const char* cod, int year)
bool ok = true; bool ok = true;
if (cod != NULL) if (cod != NULL)
{
ok = causale().read(cod, year); ok = causale().read(cod, year);
_iva = causale().iva();
}
bool nob = false, dob = false; bool nob = false, dob = false;
_is_saldaconto = false; _is_saldaconto = false;
@ -667,12 +670,18 @@ bool TPrimanota_application::get_next_key(TToken_string& tmp)
case 1: case 1:
tmp.add(_automatico->_causale); tmp.add(_automatico->_causale);
_msk[0]->set(F_CODCAUS, _automatico->_causale); // Joke get_mask _msk[0]->set(F_CODCAUS, _automatico->_causale); // Joke get_mask
_iva = nessuna_iva; // Impedisce incremento del numero documento if (_automatico->_tipo == 3)
{
TCausale c(_automatico->_causale);
_iva = c.iva();
}
else
_iva = nessuna_iva; // Impedisce incremento del numero documento
break; break;
case 2: case 2:
tmp.add(_automatico->_causale_fattura); tmp.add(_automatico->_causale_originale);
_msk[0]->set(F_CODCAUS, _automatico->_causale_fattura); // Joke get_mask _msk[0]->set(F_CODCAUS, _automatico->_causale_originale); // Joke get_mask
_iva = _automatico->_iva_fattura; // Provoca incremento del numero documento _iva = _automatico->_iva_originale; // Provoca incremento del numero documento
break; break;
default: default:
tmp.add(m.get(F_CODCAUS)); // Ultima causale usata tmp.add(m.get(F_CODCAUS)); // Ultima causale usata
@ -1219,51 +1228,59 @@ int TPrimanota_application::write(const TMask& m)
bool salvaconto = false; bool salvaconto = false;
const long old_nreg = NUMREG_PROVVISORIO; const long old_nreg = NUMREG_PROVVISORIO;
if (iva() != nessuna_iva) if (iva() == nessuna_iva)
{
int tipauto = 0; // Tipo movimento automatico
TString4 causauto; // Possibile causale per incasso immediato
causale().reg().reread(); // Aggiorna protocollo IVA
if (is_saldaconto())
{
switch (causale().tipomov())
{
case tm_fattura:
write_scadenze(m); // Salva fattura
break;
case tm_nota_credito:
salvaconto = true; // Salva nota credito
break;
default:
break;
}
}
else
{
if (!m.get_bool(F_SOLAIVA) && !gestione_saldaconto())
{
causauto = causale().causale_inc_imm();
tipauto = causauto.full() ? 1 : 0;
}
}
if (iva() == iva_acquisti && tipauto <= 0)
{
// Genera regolarizzazione IVA acquisti
causauto = causale().causale_reg_iva();
tipauto = causauto.full() ? 2 : 0;
}
if (tipauto > 0 && causauto.full())
genera_automatico(tipauto, causauto);
}
else
{ {
if (is_fattura()) if (is_fattura())
write_scadenze(m); // Salva fattura write_scadenze(m); // Salva fattura
salvaconto = is_pagamento(); salvaconto = is_pagamento();
}
int tipauto = 0; // Tipo movimento automatico
TString4 causauto; // Possibile causale per incasso immediato
causale().reg().reread(); // Aggiorna protocollo IVA
if (is_saldaconto())
{
switch (causale().tipomov())
{
case tm_fattura:
write_scadenze(m); // Salva fattura
break;
case tm_nota_credito:
salvaconto = true; // Salva nota credito
break;
default:
break;
}
} }
else
{
if (iva() != nessuna_iva && !m.get_bool(F_SOLAIVA))
{
causauto = causale().causale_collegata();
if (causauto.full())
{
TCausale c(causauto);
if ((!gestione_saldaconto() || c.tipomov() == 0) && c.iva() == nessuna_iva)
tipauto = causauto.full() ? 1 : 0;
}
}
}
if (iva() == iva_acquisti && tipauto <= 0)
{
// Genera regolarizzazione IVA acquisti
causauto = causale().causale_reg_iva();
tipauto = causauto.full() ? 2 : 0;
}
if (tipauto <= 0)
{
causauto = causale().causale_collegata();
tipauto = causauto.full() ? 3 : 0;
}
if (tipauto > 0 && causauto.full())
genera_automatico(tipauto, causauto);
if (salvaconto) if (salvaconto)
{ {
@ -1374,12 +1391,15 @@ void TPrimanota_application::genera_automatico(int tipo, const char* causimm)
// Parte comune a tutti i movimenti automatici // Parte comune a tutti i movimenti automatici
_automatico->_tipo = tipo; _automatico->_tipo = tipo;
_automatico->_causale = causimm; _automatico->_causale = causimm;
_automatico->_causale_fattura = m.get(F_CODCAUS); _automatico->_causale_originale = m.get(F_CODCAUS);
_automatico->_iva_fattura = caus.iva(); _automatico->_iva_originale = caus.iva();
_automatico->_datadoc = m.get(F_DATADOC); if (tipo != 3)
_automatico->_numdoc = m.get(F_NUMDOC); {
_automatico->_clifo.get(_rel->cg(0)); _automatico->_datadoc = m.get(F_DATADOC);
_automatico->_totale = m.get_real(F_TOTALE); _automatico->_numdoc = m.get(F_NUMDOC);
_automatico->_clifo.get(_rel->cg(0));
_automatico->_totale = m.get_real(F_TOTALE);
}
// Solo regolarizzazioni IVA // Solo regolarizzazioni IVA
if (_automatico->_tipo == 2) if (_automatico->_tipo == 2)
@ -1395,8 +1415,11 @@ void TPrimanota_application::genera_automatico(int tipo, const char* causimm)
} }
else // Step 1 else // Step 1
{ {
m.set(F_DATADOC, _automatico->_datadoc); if (_automatico->_tipo != 3)
m.set(F_NUMDOC, _automatico->_numdoc); {
m.set(F_DATADOC, _automatico->_datadoc);
m.set(F_NUMDOC, _automatico->_numdoc);
}
switch (_automatico->_tipo) switch (_automatico->_tipo)
{ {
@ -1852,12 +1875,15 @@ bool TPrimanota_application::save(bool check_dirty)
return TRelation_application::save(check_dirty); return TRelation_application::save(check_dirty);
} }
void TPrimanota_application::dump_rec(TConfig & ini, const TRectype & rec, int row) void TPrimanota_application::dump_rec(TConfig & ini, const TRectype & rec, int row, int pref)
{ {
if (row > 0) if (pref > 0)
ini.set_paragraph(format("%d,%d", rec.num(), row)); ini.set_paragraph(format("%d,%d,%d", rec.num(), row, pref));
else else
ini.set_paragraph(format("%d", rec.num())); if (row > 0)
ini.set_paragraph(format("%d,%d", rec.num(), row));
else
ini.set_paragraph(format("%d", rec.num()));
for (int f = rec.items()-1; f >= 0; f--) for (int f = rec.items()-1; f >= 0; f--)
{ {
const char* name = rec.fieldname(f); const char* name = rec.fieldname(f);
@ -1865,7 +1891,7 @@ void TPrimanota_application::dump_rec(TConfig & ini, const TRectype & rec, int r
} }
} }
void TPrimanota_application::dump_fatt(TConfig& ini, TPartita & game, int rigafatt) void TPrimanota_application::dump_fatt(TConfig& ini, TPartita & game, int rigafatt, int pref)
{ {
CHECKD(rigafatt > 0 && rigafatt < 9999, "Riga fattura errata ", rigafatt); CHECKD(rigafatt > 0 && rigafatt < 9999, "Riga fattura errata ", rigafatt);
@ -1879,20 +1905,21 @@ void TPrimanota_application::dump_fatt(TConfig& ini, TPartita & game, int rigafa
rec.fill_array(); rec.fill_array();
const int lastrow = rec.last(); const int lastrow = rec.last();
dump_rec(ini, rec, r); dump_rec(ini, rec, r, pref);
for (int rp = rec.first(); rp <= lastrow; rp = rec.succ(rp)) for (int rp = rec.first(); rp <= lastrow; rp = rec.succ(rp))
{ {
const TRectype & recpag = rec.row(rp); const TRectype & recpag = rec.row(rp);
dump_rec(ini, recpag, rp); dump_rec(ini, recpag, rp, pref);
} }
} }
for ( ; ; r++) for ( ; ; r++)
{ {
if (ini.set_paragraph(format("%d,%d", LF_SCADENZE, r+1))) if (ini.set_paragraph(format("%d,%d", LF_SCADENZE, r+1)))
ini.remove_all(); ini.remove_all();
else else
break; break;
}
} }
} }
@ -1933,39 +1960,28 @@ void TPrimanota_application::mask2ini(const TMask& msk, TConfig& ini)
} }
else else
{ {
int pref = 1;
for (TPartita* game = p.first(); game != NULL; game = p.next()) for (TPartita* game = p.first(); game != NULL; game = p.next())
{ {
TBit_array dumped; const int lastrow = game->last();
const int rigapag = game->primo_pagamento(numreg);
if (rigapag > 0)
{
// Ricava la lista dei pagamenti dal database invece di leggerli dalla struttura in memoria :-(
const TRiga_partite& riga = game->riga(rigapag);
TRelation rel(LF_PAGSCA);
TCursor pag(&rel);
TRectype& recpag = pag.curr();
recpag.put(PAGSCA_TIPOC, riga.get(PART_TIPOCF)); for (int r = game->first(); r <= lastrow; r = game->succ(r))
recpag.put(PAGSCA_GRUPPO, riga.get(PART_GRUPPO)); {
recpag.put(PAGSCA_CONTO, riga.get(PART_CONTO)); dump_rec(ini, game->riga(r), r, pref);
recpag.put(PAGSCA_SOTTOCONTO, riga.get(PART_SOTTOCONTO)); if (((tipo_movimento)game->riga(r).get_int(PART_TIPOMOV)) == tm_fattura)
recpag.put(PAGSCA_ANNO, riga.get(PART_ANNO)); dump_fatt(ini, *game, r, pref);
recpag.put(PAGSCA_NUMPART, riga.get(PART_NUMPART));
pag.setregion(recpag, recpag);
const int items = pag.items();
for (pag = 0L; pag.pos() < items; ++pag)
{
if (rigapag == recpag.get_int(PAGSCA_NRIGP))
{
const int rigafatt = recpag.get_int(PAGSCA_NRIGA);
if (rigafatt > 0 && rigafatt < 9999 && !dumped[rigafatt])
{
dump_fatt(ini, *game, rigafatt);
dumped.set(rigafatt);
}
}
}
} }
TRecord_array uns = game->unassigned();
const int rows = uns.rows();
const int last = uns.last_row();
if (rows > 0)
{
pref++;
for (int r = uns.first_row(); r <= last; r = uns.succ_row(r))
dump_rec(ini, uns.row(r), r, pref);
}
pref++;
} }
} }
} }

View File

@ -164,8 +164,8 @@ protected: // TApplication
virtual void on_firm_change(); virtual void on_firm_change();
virtual void on_config_change(); virtual void on_config_change();
virtual void print(); virtual void print();
void dump_rec(TConfig & ini, const TRectype & rec, int row = 0); void dump_rec(TConfig & ini, const TRectype & rec, int row = 0, int pref = 0);
void dump_fatt(TConfig& ini, TPartita & game, int rigafatt); void dump_fatt(TConfig& ini, TPartita & game, int rigafatt, int pref = 0);
virtual void ini2mask(TConfig& ini, TMask& msk, bool query); virtual void ini2mask(TConfig& ini, TMask& msk, bool query);
virtual void mask2ini(const TMask& msk, TConfig& ini); virtual void mask2ini(const TMask& msk, TConfig& ini);
virtual bool save(bool check_dirty); virtual bool save(bool check_dirty);

View File

@ -138,7 +138,7 @@ int TCausale::regime_speciale() const
bool TCausale::esclusione_allegati() const bool TCausale::esclusione_allegati() const
{ return _rec.get_bool(CAU_ALLEG); } { return _rec.get_bool(CAU_ALLEG); }
const TString& TCausale::causale_inc_imm() const const TString& TCausale::causale_collegata() const
{ return _rec.get(CAU_CODCAUSIM); } { return _rec.get(CAU_CODCAUSIM); }
const TString& TCausale::causale_reg_iva() const const TString& TCausale::causale_reg_iva() const

View File

@ -39,7 +39,7 @@ public:
bool valintra() const; bool valintra() const;
bool soloiva() const; bool soloiva() const;
char provvisorio() const { return _provvisorio; } char provvisorio() const { return _provvisorio; }
const TString& causale_inc_imm() const; const TString& causale_collegata() const;
const TString& causale_reg_iva() const; const TString& causale_reg_iva() const;
const TString& tipo_doc() const; const TString& tipo_doc() const;