1997-08-05 14:10:21 +00:00
|
|
|
|
#include <progind.h>
|
|
|
|
|
|
2005-05-06 10:58:49 +00:00
|
|
|
|
#include "velib04.h"
|
|
|
|
|
#include "../cg/cgsaldac.h"
|
|
|
|
|
#include "../ef/ef0101.h"
|
|
|
|
|
|
1997-08-05 14:10:21 +00:00
|
|
|
|
#include <doc.h>
|
|
|
|
|
#include <rdoc.h>
|
|
|
|
|
#include <effetti.h>
|
|
|
|
|
#include <reffetti.h>
|
2006-04-13 17:56:02 +00:00
|
|
|
|
#include <cfven.h>
|
1997-08-05 14:10:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
// TGenerazione_effetti
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
TGenerazione_effetti::TGenerazione_effetti(const char* cod)
|
|
|
|
|
: TElaborazione(cod)
|
|
|
|
|
{
|
|
|
|
|
_valid_array.set(2); // tratta
|
|
|
|
|
_valid_array.set(3); // riba
|
|
|
|
|
_valid_array.set(5); // paghero'
|
|
|
|
|
_valid_array.set(7); // tratta accettata
|
|
|
|
|
_valid_array.set(8); // rapporti interbancari diretti (rid)
|
|
|
|
|
_valid_array.reset(9); // bonifici
|
|
|
|
|
|
|
|
|
|
_docfile = new TLocalisamfile(LF_DOC);
|
|
|
|
|
_rdocfile = new TLocalisamfile(LF_RIGHEDOC);
|
|
|
|
|
_occas = new TLocalisamfile(LF_OCCAS);
|
|
|
|
|
_clifo = new TLocalisamfile(LF_CLIFO);
|
|
|
|
|
_cfven = new TLocalisamfile(LF_CFVEN);
|
|
|
|
|
_tab = new TLocalisamfile(LF_TAB);
|
|
|
|
|
_efffile = new TLocalisamfile(LF_EFFETTI);
|
|
|
|
|
_refffile = new TLocalisamfile(LF_REFFETTI);
|
1999-06-18 15:35:05 +00:00
|
|
|
|
|
|
|
|
|
_can_write = TRUE;
|
|
|
|
|
_error = no_error;
|
|
|
|
|
_total_bills = 0L;
|
2010-09-26 17:07:35 +00:00
|
|
|
|
_impmin = real(ini_get_string(CONFIG_DITTA, "ve", "IMPMINEFF"));
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TGenerazione_effetti::TGenerazione_effetti(const TRectype& rec)
|
|
|
|
|
: TElaborazione(rec)
|
|
|
|
|
{
|
|
|
|
|
_valid_array.set(2); // tratta
|
|
|
|
|
_valid_array.set(3); // riba
|
|
|
|
|
_valid_array.set(5); // paghero'
|
|
|
|
|
_valid_array.set(7); // tratta accettata
|
|
|
|
|
_valid_array.set(8); // rapporti interbancari diretti (rid)
|
|
|
|
|
_valid_array.reset(9); // bonifici
|
|
|
|
|
_docfile = new TLocalisamfile(LF_DOC);
|
|
|
|
|
_rdocfile = new TLocalisamfile(LF_RIGHEDOC);
|
|
|
|
|
_occas = new TLocalisamfile(LF_OCCAS);
|
|
|
|
|
_clifo = new TLocalisamfile(LF_CLIFO);
|
|
|
|
|
_cfven = new TLocalisamfile(LF_CFVEN);
|
|
|
|
|
_tab = new TLocalisamfile(LF_TAB);
|
|
|
|
|
_efffile = new TLocalisamfile(LF_EFFETTI);
|
|
|
|
|
_refffile = new TLocalisamfile(LF_REFFETTI);
|
1999-06-18 15:35:05 +00:00
|
|
|
|
|
|
|
|
|
_can_write = TRUE;
|
|
|
|
|
_error = no_error;
|
|
|
|
|
_total_bills = 0L;
|
2010-09-26 17:07:35 +00:00
|
|
|
|
_impmin = real(ini_get_string(CONFIG_DITTA, "ve", "IMPMINEFF"));
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TGenerazione_effetti::~TGenerazione_effetti()
|
|
|
|
|
{
|
|
|
|
|
delete _docfile;
|
|
|
|
|
delete _rdocfile;
|
|
|
|
|
delete _occas;
|
|
|
|
|
delete _clifo;
|
|
|
|
|
delete _cfven;
|
|
|
|
|
delete _efffile;
|
|
|
|
|
delete _refffile;
|
|
|
|
|
delete _tab;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TGenerazione_effetti::display_error(TDocumento& doc)
|
|
|
|
|
{
|
|
|
|
|
TString msg;
|
|
|
|
|
TString numerazione = doc.numerazione();
|
|
|
|
|
const long numero = doc.numero();
|
|
|
|
|
|
|
|
|
|
switch (_error)
|
|
|
|
|
{
|
|
|
|
|
case nr_doc_error:
|
|
|
|
|
msg.format("Rilevato un numero di documento errato contabilizzando il documento %s/%ld."
|
|
|
|
|
"Verificare il numero documento e il codice numerazione inseriti in tabella.",(const char*)numerazione,numero);
|
|
|
|
|
break;
|
|
|
|
|
case chg_stat_error:
|
|
|
|
|
msg.format("Rilevato un errore cambiando lo stato al documento %s/%ld."
|
|
|
|
|
"Verificare l'integrita' del file documenti.",(const char*)numerazione,numero);
|
|
|
|
|
break;
|
|
|
|
|
case datadoc_error:
|
|
|
|
|
msg.format("Rilevato una data documento vuota relativamente al documento %s/%ld."
|
|
|
|
|
"Verificare l'informazione inserita.",(const char*)numerazione,numero);
|
|
|
|
|
break;
|
|
|
|
|
case codpag_error:
|
|
|
|
|
msg.format("Rilevato un codice pagamento non esistente relativamente al documento %s/%ld."
|
|
|
|
|
"Verificare l'esistenza del codice pagamento inserito.",(const char*)numerazione,numero);
|
|
|
|
|
break;
|
|
|
|
|
case scadenze_error:
|
|
|
|
|
msg.format("Calcolate 0 scadenze relativamente al documento %s/%ld."
|
|
|
|
|
"Verificare la correttezza del codice pagamento inserito.",(const char*)numerazione,numero);
|
|
|
|
|
break;
|
|
|
|
|
case write_error:
|
|
|
|
|
if (_efffile->status() != NOERR)
|
|
|
|
|
msg.format("Si e' verificato l' errore %d in scrittura sul file effetti relativamente al documento %s/%ld"
|
|
|
|
|
"Verificare la consistenza del file.",_efffile->status(),(const char*)numerazione,numero);
|
|
|
|
|
else
|
|
|
|
|
msg.format("Si e' verificato l' errore %d in scrittura sul file righe effetti relativamente al documento %s/%ld"
|
|
|
|
|
"Verificare la consistenza del file.",_refffile->status(),(const char*)numerazione,numero);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
msg.format("E' stato rilevato un errore generico contabilizzando il documento %s/%ld.",
|
|
|
|
|
(const char*)numerazione,numero);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
warning_box(msg);
|
|
|
|
|
_error = no_error; // reset error, as any other one would do, so you can show me the other ones.
|
|
|
|
|
_can_write = FALSE; // But from now on u cannot write anymore. U must exit this program and repair errors occurred.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
error_type TGenerazione_effetti::change_doc_status(TDocumento& doc)
|
|
|
|
|
// Cambia lo stato del documento
|
|
|
|
|
{
|
|
|
|
|
doc.stato(get("S4")[0]);
|
|
|
|
|
if (doc.rewrite() != NOERR)
|
|
|
|
|
_error = chg_stat_error;
|
|
|
|
|
return _error;
|
|
|
|
|
}
|
|
|
|
|
|
1999-06-18 15:35:05 +00:00
|
|
|
|
error_type TGenerazione_effetti::change_group_status(TDocumento& doc, TAssoc_array& group_array)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
// Cambia lo stato dei documenti raggruppati
|
|
|
|
|
{
|
1999-06-18 15:35:05 +00:00
|
|
|
|
const int items = group_array.items();
|
1997-08-05 14:10:21 +00:00
|
|
|
|
if (items > 0)
|
|
|
|
|
{
|
|
|
|
|
_error = no_error;
|
|
|
|
|
TToken_string * group_element;
|
|
|
|
|
int i=0;
|
|
|
|
|
// Ciclo sugli elementi dell'assoc_array
|
1999-06-18 15:35:05 +00:00
|
|
|
|
for (group_element = (TToken_string *) group_array.first_item(); group_element != NULL && i < items; i++,group_element = (TToken_string*)group_array.succ_item())
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
group_element->restart();
|
|
|
|
|
const int doc_items = group_element->items();
|
|
|
|
|
for (int j=0;j<doc_items;j++)
|
|
|
|
|
{
|
|
|
|
|
TToken_string t(group_element->get(j),'$');
|
|
|
|
|
char provv = t.get_char(0);
|
|
|
|
|
int anno = t.get_int(1);
|
|
|
|
|
TString codnum(t.get(2));
|
|
|
|
|
long numdoc = t.get_long(3);
|
|
|
|
|
if (doc.read(provv,anno,codnum,numdoc) == NOERR) // Legge il documento
|
|
|
|
|
{
|
|
|
|
|
doc.put(DOC_STATO,get("S4")[0]);
|
|
|
|
|
doc.rewrite();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return _error;
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-26 17:07:35 +00:00
|
|
|
|
error_type TGenerazione_effetti::write_groups(bool interattivo)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
const int items = _effetti_array.items();
|
|
|
|
|
int err = NOERR;
|
2004-04-28 22:23:16 +00:00
|
|
|
|
int i;
|
|
|
|
|
|
1997-08-05 14:10:21 +00:00
|
|
|
|
_error = no_error;
|
2004-04-28 22:23:16 +00:00
|
|
|
|
for (i = 0; i<items && err == NOERR; i++) // scorre gli effetti generati e li scrive su file
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
TEffetto& effetto = (TEffetto&)_effetti_array[i];
|
1999-04-06 15:34:39 +00:00
|
|
|
|
const real importo = effetto.get_real(EFF_IMPORTO);
|
2006-04-13 17:56:02 +00:00
|
|
|
|
|
1999-04-06 15:34:39 +00:00
|
|
|
|
if (importo > ZERO) // Gli effetti negativi non vanno scritti
|
2006-04-13 17:56:02 +00:00
|
|
|
|
{
|
|
|
|
|
const char tipocf = effetto.get_char(EFF_TIPOCF);
|
|
|
|
|
const long codcf = effetto.get_long(EFF_CODCF);
|
|
|
|
|
TString key;
|
|
|
|
|
|
|
|
|
|
key.format("%c|%ld", tipocf, codcf);
|
2010-09-26 17:07:35 +00:00
|
|
|
|
real impmin;
|
|
|
|
|
|
|
|
|
|
if (!interattivo)
|
|
|
|
|
{
|
|
|
|
|
impmin = real(cache().get(LF_CFVEN, key, CFV_IMPMINEFF));
|
|
|
|
|
if (impmin == ZERO)
|
|
|
|
|
impmin = _impmin;
|
|
|
|
|
}
|
2011-01-21 01:48:00 +00:00
|
|
|
|
if (effetto.get_int(EFF_TIPOPAG) == _rid || importo >= impmin)
|
2006-04-13 17:56:02 +00:00
|
|
|
|
err = effetto.write(*_efffile); // Pensa a tutto lui per rinumerare...
|
|
|
|
|
else
|
|
|
|
|
_effetti_array.destroy(i);
|
|
|
|
|
}
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
2006-04-13 17:56:02 +00:00
|
|
|
|
_effetti_array.pack();
|
1997-08-05 14:10:21 +00:00
|
|
|
|
if (err != NOERR)
|
|
|
|
|
{
|
|
|
|
|
i--;
|
|
|
|
|
for (int j = 0; j<i; j++) // rimuove gli effetti raggruppati, per non lasciare documenti raggruppati parzialmente
|
|
|
|
|
{
|
|
|
|
|
TEffetto& effetto = (TEffetto&)_effetti_array[j];
|
|
|
|
|
// posso fare tranquillamente la remove, visto che la numerazione dell'effetto e' gia' stata effettuata
|
|
|
|
|
effetto.remove(*_efffile);
|
|
|
|
|
}
|
|
|
|
|
error_box("Errore %d nella scrittura gruppi di effetti. Nessun raggruppamento effettuato.",err);
|
|
|
|
|
}
|
|
|
|
|
return _error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Criteri di raggruppamento effetti.
|
|
|
|
|
// Un documento puo' essere raggruppato con i seguenti criteri:
|
|
|
|
|
// - flag di raggruppamento effetti a TRUE (obbligatorio)
|
|
|
|
|
// - cliente (obbligatorio)
|
|
|
|
|
// - valuta (obbligatorio)
|
|
|
|
|
// - data scadenza (opzionale)
|
|
|
|
|
// - flag di sosp. d'imposta (opzionale)
|
|
|
|
|
// - cambio valuta (opzionale)
|
|
|
|
|
// - cond di pagamento (opzionale)
|
|
|
|
|
// - banca (opzionale)
|
|
|
|
|
// - tipo doc. (opzionale)
|
|
|
|
|
// - cod. numerazione (opzionale)
|
|
|
|
|
// - agente (opzionale)
|
|
|
|
|
// I parametri opzionali sono decisi nella tabella elaborazioni
|
|
|
|
|
// Spiegazione del raggruppamento:
|
|
|
|
|
// Il raggruppamento di documenti diversi in uno stesso effetto consiste nella creazione
|
|
|
|
|
// di piu' righe dello stesso effetto.
|
|
|
|
|
// Ad esempio supponiamo di avere il cliente 10 con 4 fatture ognuna con condizioni di pagamento diverse
|
|
|
|
|
// la fattura 1 e' suddivisa in 2 rate (10.000 + 30.000)
|
|
|
|
|
// la fattura 2 e' suddivisa in 4 rate (15.000 + 20.000 + 25.000 + 30.000)
|
|
|
|
|
// la fattura 3 e' suddivisa in 5 rate (20.000 + 40.000 + 80.000 + 160.000 + 320.000)
|
|
|
|
|
// la fattura 4 e' suddivisa in 3 rate (50.000 + 100.000 + 150.000)
|
|
|
|
|
// Il numero di effetti generati equivale al massimo numero di rate (5 in questo caso)
|
|
|
|
|
// quindi avremo 5 effetti:
|
|
|
|
|
// il primo avra' 4 righe (prima rata di tutte le fatture)
|
|
|
|
|
// il secondo avra' 4 righe (seconda rata di tutte le fatture)
|
|
|
|
|
// il terzo avra' 3 righe (terza rata delle fatture 2,3,4)
|
|
|
|
|
// il quarto avra' 2 righe (quarta rata delle fatture 2 e 3)
|
|
|
|
|
// il quinto avra' 1 riga (quinta rata della fattura 3)
|
|
|
|
|
// La testata di ogni effetto conterra' il totale (somma) dei singoli importi delle righe
|
|
|
|
|
// ovvero:
|
|
|
|
|
// tot. primo effetto: 95.000
|
|
|
|
|
// tot. secondo effetto: 190.000
|
|
|
|
|
// tot. terzo effetto: 255.000
|
|
|
|
|
// tot. quarto effetto: 190.000
|
|
|
|
|
// tot. quinto effetto: 320.000
|
|
|
|
|
// I dati della testata (soprattutto la data di scadenza) di ogni effetto vengono presi dal
|
|
|
|
|
// primo documento valido per la generazione dell'effetto corrente:
|
|
|
|
|
// per i primi due effetti vale la fattura 1
|
|
|
|
|
// per gli effetti 3 e 4 vale la fattura 2
|
|
|
|
|
// per l'effetto 5 vale la fattura 3.
|
|
|
|
|
// Questo e' quanto ho appreso (Hope I'm right...) ;-)
|
|
|
|
|
|
2010-09-26 17:07:35 +00:00
|
|
|
|
long TGenerazione_effetti::group_bills(TAssoc_array& group_array, bool interattivo)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
// Bail out if there aren't items...
|
1999-06-18 15:35:05 +00:00
|
|
|
|
const int items = group_array.items();
|
|
|
|
|
if (!good() || items == 0)
|
|
|
|
|
return 0L;
|
|
|
|
|
|
|
|
|
|
TDocumento doc;
|
1997-08-05 14:10:21 +00:00
|
|
|
|
_error = no_error;
|
|
|
|
|
|
|
|
|
|
int i=0,j,n,offset=0;
|
|
|
|
|
TString msg1,msg2;
|
|
|
|
|
TString16 codpag;
|
|
|
|
|
real imprata, imprataval, importo, importoval;
|
2010-06-17 08:09:42 +00:00
|
|
|
|
msg1 = TR("Raggruppamento effetti");
|
1997-08-05 14:10:21 +00:00
|
|
|
|
|
|
|
|
|
#ifdef DBG
|
|
|
|
|
TProgind p(items,msg1,TRUE,TRUE,1);
|
|
|
|
|
#else
|
|
|
|
|
TProgind p(items,msg1,FALSE,TRUE,1);
|
|
|
|
|
#endif
|
|
|
|
|
TToken_string * group_element;
|
|
|
|
|
// Ciclo sugli elementi dell'assoc_array
|
1999-06-18 15:35:05 +00:00
|
|
|
|
for (group_element = (TToken_string *) group_array.first_item(); group_element != NULL && i < items; i++,group_element = (TToken_string*)group_array.succ_item())
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
#ifdef DBG
|
|
|
|
|
if (p.iscancelled()) break;
|
|
|
|
|
#endif
|
|
|
|
|
p.setstatus(i+1);
|
|
|
|
|
// Ciclo sui documenti da raggruppare
|
|
|
|
|
group_element->restart();
|
|
|
|
|
const int doc_items = group_element->items();
|
2010-04-28 14:47:07 +00:00
|
|
|
|
|
1997-08-05 14:10:21 +00:00
|
|
|
|
for (j=0;j<doc_items;j++)
|
|
|
|
|
{
|
|
|
|
|
#ifdef DBG
|
|
|
|
|
if (p.iscancelled()) break;
|
|
|
|
|
#endif
|
|
|
|
|
TToken_string t(group_element->get(j),'$');
|
2003-06-24 12:55:12 +00:00
|
|
|
|
const char provv = t.get_char(0);
|
|
|
|
|
const int anno = t.get_int(1);
|
|
|
|
|
const TString4 codnum(t.get(2));
|
|
|
|
|
const long numdoc = t.get_long(3);
|
|
|
|
|
if (doc.read(provv,anno,codnum,numdoc) != NOERR)
|
|
|
|
|
continue; // Legge il documento (giusto saltare e proseguire se non lo trova?)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
|
2010-06-17 08:09:42 +00:00
|
|
|
|
msg2 = TR("Documento: ");
|
1997-08-05 14:10:21 +00:00
|
|
|
|
msg2 << codnum << "/" << numdoc;
|
2005-10-05 18:02:25 +00:00
|
|
|
|
xvtil_statbar_set(msg2);
|
1997-08-05 14:10:21 +00:00
|
|
|
|
do_events();
|
|
|
|
|
// Ricalcola le scadenze
|
|
|
|
|
codpag = doc.get(DOC_CODPAG);
|
|
|
|
|
|
2003-06-26 10:48:09 +00:00
|
|
|
|
const TRectype& cpg = cache().get("%CPG", codpag);
|
|
|
|
|
if (cpg.empty())
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
_error = codpag_error;
|
1999-06-18 15:35:05 +00:00
|
|
|
|
display_error(doc);
|
2009-11-13 15:24:24 +00:00
|
|
|
|
continue;
|
2000-10-03 13:45:12 +00:00
|
|
|
|
}
|
2004-06-04 11:20:51 +00:00
|
|
|
|
const real tot = doc.totale_doc() - doc.ritenute();
|
2000-10-03 13:45:12 +00:00
|
|
|
|
doc.put(DOC_CODPAG, codpag); //placeholder
|
1999-04-06 15:34:39 +00:00
|
|
|
|
|
2004-06-04 11:20:51 +00:00
|
|
|
|
const TCurrency_documento totale_fatt(tot, doc);
|
1997-08-05 14:10:21 +00:00
|
|
|
|
const bool valuta = doc.in_valuta();
|
|
|
|
|
const real change = doc.cambio();
|
|
|
|
|
const TDate datafatt = doc.get_date(DOC_DATADOC);
|
1999-04-06 15:34:39 +00:00
|
|
|
|
const bool is_nota_credito = doc.is_nota_credito();
|
2009-03-23 10:37:33 +00:00
|
|
|
|
long numdocrif = doc.get_long(DOC_NUMDOCRIF);
|
|
|
|
|
int annodocrif = doc.get_date(DOC_DATADOCRIF).year();
|
|
|
|
|
if (numdocrif > 0L && doc.get_char(DOC_TIPOCF) == 'C' && !doc.tipo().nota_credito())
|
|
|
|
|
{
|
|
|
|
|
annodocrif = 0;
|
|
|
|
|
numdocrif = 0L;
|
|
|
|
|
}
|
1999-04-06 15:34:39 +00:00
|
|
|
|
|
|
|
|
|
// Qui il controllo sul residuo da pagare per il documento corrente non va effettuato,
|
|
|
|
|
// proprio perch<63> si sta effettuando un raggruppamento di effetti; eventuali documenti
|
|
|
|
|
// con importo negativi (assimilati a note di credito) vanno presi in considerazione
|
|
|
|
|
// per la composizione dell'importo finale dell'effetto. Un effetto puo' essere composto
|
|
|
|
|
// anche da righe di valore negativo ma esso non verr<72> scritto solo nel caso in cui l'importo
|
|
|
|
|
// totale (la somma delle singole righe) sia negativo a sua volta
|
|
|
|
|
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
1999-04-06 15:34:39 +00:00
|
|
|
|
calc_pagamento(doc);
|
|
|
|
|
|
|
|
|
|
TPagamento& pag = doc.pagamento();
|
2000-10-03 13:45:12 +00:00
|
|
|
|
int numrate = pag.n_rate( );
|
2000-05-05 15:25:49 +00:00
|
|
|
|
if (numrate <= 0)
|
2009-11-13 15:24:24 +00:00
|
|
|
|
continue;
|
1998-08-25 18:07:30 +00:00
|
|
|
|
|
|
|
|
|
// Scorre le scadenze
|
|
|
|
|
for (n = 1; n <= numrate && good(); n++)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
1999-04-06 15:34:39 +00:00
|
|
|
|
if (valid_type(pag.tipo_rata(n-1)))
|
1998-08-25 18:07:30 +00:00
|
|
|
|
{
|
1999-04-06 15:34:39 +00:00
|
|
|
|
// Se non esiste effetto n-esimo (corrisponde al numero di rata corrente+offset)
|
|
|
|
|
// lo genera con la relativa riga. Se esiste vi somma gli importi ed accoda la riga
|
2010-04-28 14:47:07 +00:00
|
|
|
|
const int effitems = _effetti_array.items();
|
2010-04-29 10:14:44 +00:00
|
|
|
|
int index = offset;
|
2010-04-28 14:47:07 +00:00
|
|
|
|
const TDate datascad = pag.data_rata(n-1);
|
|
|
|
|
|
2010-04-29 10:14:44 +00:00
|
|
|
|
for (; index < effitems; index++)
|
2010-04-28 14:47:07 +00:00
|
|
|
|
{
|
2010-04-29 10:14:44 +00:00
|
|
|
|
TEffetto& effetto=(TEffetto&)_effetti_array[index];
|
2010-04-28 14:47:07 +00:00
|
|
|
|
|
|
|
|
|
if (datascad == effetto.get_date(EFF_DATASCAD))
|
|
|
|
|
break;
|
|
|
|
|
}
|
2010-04-29 10:14:44 +00:00
|
|
|
|
// const int index = n+j-1;
|
2003-11-10 15:18:25 +00:00
|
|
|
|
// Nuovo effetto: crea effetto con i dati di questo documento (e' il primo che incontro nella scansione)
|
2010-04-28 14:47:07 +00:00
|
|
|
|
if (index >= effitems)
|
1999-04-06 15:34:39 +00:00
|
|
|
|
{
|
2003-11-10 15:18:25 +00:00
|
|
|
|
TEffetto* effetto = new TEffetto;
|
1999-04-06 15:34:39 +00:00
|
|
|
|
// Setta i dati della testata;
|
2010-04-28 14:47:07 +00:00
|
|
|
|
effetto->put(EFF_DATASCAD, datascad);
|
2003-11-10 15:18:25 +00:00
|
|
|
|
effetto->put(EFF_TIPOPAG,pag.tipo_rata(n-1));
|
|
|
|
|
effetto->put(EFF_ULTCLASS,pag.ulc_rata(n-1));
|
|
|
|
|
effetto->put(EFF_TIPOCF, doc.get_char(DOC_TIPOCF));
|
|
|
|
|
effetto->put(EFF_CODCF, doc.get_long(DOC_CODCF));
|
|
|
|
|
effetto->put(EFF_CODVAL, doc.get(DOC_CODVAL));
|
|
|
|
|
effetto->put(EFF_CAMBIO, change);
|
|
|
|
|
effetto->put(EFF_DATACAMBIO,doc.get_date(DOC_DATACAMBIO));
|
|
|
|
|
effetto->put(EFF_CONTROEURO,doc.get_date(DOC_CONTROEURO));
|
|
|
|
|
effetto->put(EFF_CODABI,doc.get(DOC_CODABIA));
|
|
|
|
|
effetto->put(EFF_CODCAB,doc.get(DOC_CODCABA));
|
|
|
|
|
effetto->put(EFF_IBAN,doc.get(DOC_IBAN));
|
Patch level : 10.0 870
Files correlati : ef0.exe
Ricompilazione Demo : [ ]
Commento :
Gestione CUP
Verificare che i profili persnalizzati continuino a funzionare
Nella gestione profili e documenti aggiunti i campi per gestire piu banche di appoggio e presentazione dei clienti/ fornitori
La ricerca e sulla tabella se il cliente / fornitore non ha banche altrimenti e sulle banche del cliente/fornitore.
Ai profili personalizzati vanno aggiunti-modificati e posizionati i campi :
NU 117 5
BE
PR 2 11 "Banca appoggio : Cod. ABI "
FL "Z"
CH NORMAL
FI CODABIA
US %BAN SE CODTAB?="?????"
IN CODTAB[1,5] 117
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Denominazione@50" S0
OU 117 CODTAB[1,5]
OU 336 S0
OU 197 CODTAB[1,5]
ME CO,220
EN
NU 118 5
BE
PR 42 11 "Cod. CAB "
FL "Z"
CH NORMAL
FI CODCABA
US %BAN SE CODTAB?="??????????"
IN CODTAB[1,5] 117
IN CODTAB[6,10] 118
CO DI 117
OU 117 CODTAB[1,5]
OU 118 CODTAB[6,10]
OU 336 S0
OU 198 CODTAB[6,10]
ME CO,221
EN
NU 220 5
BE
PR 2 11 "Banca appoggio : Cod. ABI "
FL "ZH"
CH NORMAL
FI CODABIA
US 98 KEY 2
JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB
IN TIPOCF 107 SE
IN CODCF 108 SE
IN TIPOBAN "V"
IN ABI 220
IN CAB 221
IN PROGPR ""
DI "Cod. Istit." ABI
DI "Cod. Fil." CAB
DI "IBAN@27" IBAN
DI "Denominazione@50" %BAN->S0
OU 220 ABI
OU 221 CAB
OU 336 %BAN->S0
OU 192 IBAN
OU 197 ABI
OU 198 CAB
EN
NU 221 5
BE
PR 42 11 "Cod. CAB "
FL "ZH"
CH NORMAL
FI CODCABA
CO US 220
CO IN 220
CO DI 220
CO OU 220
EN
per la banca di appoggio
NU 119 5
BE
PR 2 14 "Banca presentazione : Cod. ABI "
FL "Z"
CH NORMAL
FI CODABIP
CO US 117
IN CODTAB[1,5] 119
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Denominazione@50" S0
OU 119 CODTAB[1,5]
OU 338 S0
ME CO,222
EN
NU 120 5
BE
PR 42 14 "Cod. CAB "
FL "Z"
CH NORMAL
FI CODCABP
CO US 118
IN CODTAB[1,5] 119
IN CODTAB[6,10] 120
CO DI 119
OU 119 CODTAB[1,5]
OU 120 CODTAB[6,10]
OU 338 S0
ME CO,223
EN
NU 214 2
BE
PR 60 14 "Progressivo "
FL "Z"
FI PROGBNP
US BNP
JOIN %BAN ALIAS 100 INTO CODTAB=CODTAB[1,10]
IN CODTAB[1,5] 119
IN CODTAB[6,10] 120
IN CODTAB[11,12] 214
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Progr." CODTAB[11,12]
DI "IBAN@27" S3
DI "Denominazione@50" 100@->S0
OU 119 CODTAB[1,5]
OU 120 CODTAB[6,10]
OU 214 CODTAB[11,12]
OU 338 100@->S0
ME CO,224
EN
NU 222 5
BE
PR 2 14 "Banca presentazione : Cod. ABI "
FL "ZH"
CH NORMAL
FI CODABIP
US 98 KEY 2
JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB
IN TIPOCF 107 SE
IN CODCF 108 SE
IN TIPOBAN "N"
IN ABI 222
IN CAB 223
IN PROGPR 224
DI "Cod. Istit." ABI
DI "Cod. Fil." CAB
DI "Progr." PROGPR
DI "IBAN@27" IBAN
DI "Denominazione@50" %BAN->S0
OU 222 ABI
OU 223 CAB
OU 224 PROGPR
OU 338 %BAN->S0
OU 192 IBAN
EN
NU 223 5
BE
PR 42 14 "Cod. CAB "
FL "ZH"
CH NORMAL
FI CODCABP
CO US 222
CO IN 222
CO DI 222
CO OU 222
EN
NU 224 2
BE
PR 60 14 "Progressivo "
FL "ZH"
CH NORMAL
FI PROGBNP
CO US 222
CO IN 222
CO DI 222
CO OU 222
EN
per la banca di presentazione.
Sono stati aggiunti campi CUP e CIG che hanno la ricerca sulla tabella ne caso normale e la ricerca sul file
commesse clienti nel caso sia presente l'analitica
Vanno aggiunti e posizionati ai profili personalizzati nel caso servano:
ST 215 15
BE
PR 2 11 "Cod.Unico Prog."
FL "U"
CH NORMAL
FI CUP
US %CUP
IN CODTAB 215
DI "Codice@15" CODTAB
DI "Descrizione@50" S0
OU 215 CODTAB
OU 216 S0
HE "Inserisci il Codice Unico di Progetto"
WA "Codice Unico di Progetto non trovato"
CH NORMAL
EN
ST 216 50
BE
PR 35 11 ""
FL ""
CH NORMAL
US %CUP KEY 2
IN S0 216
DI "Descrizione@50" S0
DI "Codice@15" CODTAB
CO OU 215
EN
ST 217 15
BE
PR 2 12 "Cod.Ident.Gara "
FL "U"
CH NORMAL
FI CIG
US %CIG
IN CODTAB 217
DI "Codice@15" CODTAB
DI "Descrizione@50" S0
OU 217 CODTAB
OU 218 S0
HE "Inserisci il Codice Identificativo Gara"
WA "Codice Identificativo Gara non trovato"
CH NORMAL
EN
ST 218 50
BE
PR 35 12 ""
FL ""
CH NORMAL
US %CIG KEY 2
IN S0 218
DI "Descrizione@50" S0
DI "Codice@15" CODTAB
CO OU 217
EN
ST 219 20
BE
PR 2 13 ""
FL "H"
FI CODCMS
EN
La generazione effetti scrive il CUP e il CIG sull'effetto.
La contabilizzazione scrive il CUP e il CIG sulle righe contabili.
git-svn-id: svn://10.65.10.50/branches/R_10_00@21374 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-12-28 08:28:47 +00:00
|
|
|
|
effetto->put(EFF_CUP,doc.get(DOC_CUP));
|
|
|
|
|
effetto->put(EFF_CIG,doc.get(DOC_CIG));
|
2003-11-10 15:18:25 +00:00
|
|
|
|
effetto->put(EFF_EFFCOMP,TRUE);
|
1999-04-06 15:34:39 +00:00
|
|
|
|
_effetti_array.add(effetto);
|
|
|
|
|
}
|
|
|
|
|
// aggiorna totale effetto (testata)
|
2003-11-10 15:18:25 +00:00
|
|
|
|
TEffetto& effetto=(TEffetto&)_effetti_array[index];
|
2000-10-03 13:45:12 +00:00
|
|
|
|
const int rows = effetto.rows_r();
|
|
|
|
|
|
1999-04-06 15:34:39 +00:00
|
|
|
|
importo = effetto.get_real(EFF_IMPORTO);
|
|
|
|
|
imprata = pag.importo_rata(n-1,FALSE);
|
2000-10-03 13:45:12 +00:00
|
|
|
|
imprataval = valuta ? pag.importo_rata(n-1,TRUE) : ZERO;
|
|
|
|
|
|
1999-04-06 15:34:39 +00:00
|
|
|
|
if (is_nota_credito)
|
2000-10-03 13:45:12 +00:00
|
|
|
|
{
|
|
|
|
|
// Cerca fattura da pagare con la nota di credito
|
2004-04-28 22:23:16 +00:00
|
|
|
|
int r;
|
|
|
|
|
|
|
|
|
|
for (r = 1; r <= rows; r++)
|
2000-10-03 13:45:12 +00:00
|
|
|
|
{
|
|
|
|
|
const int annoeff = effetto.row_r(r).get_int(REFF_ANNODOC);
|
|
|
|
|
const long codeff = effetto.row_r(r).get_long(REFF_NFATT);
|
|
|
|
|
if (annoeff == annodocrif && codeff == numdocrif)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (r <= rows) // Se l'ha trovata ...
|
|
|
|
|
{
|
2004-04-28 22:23:16 +00:00
|
|
|
|
const real importo_rata_lit = effetto.row_r(r).get_real(REFF_IMPORTO);
|
2000-10-03 13:45:12 +00:00
|
|
|
|
const real importo_rata_val = valuta ? effetto.row_r(r).get_real(REFF_IMPORTOVAL) : ZERO;
|
|
|
|
|
real delta_lit = imprata - importo_rata_lit;
|
|
|
|
|
real delta_val = valuta ? imprataval - importo_rata_val : ZERO;
|
|
|
|
|
// Controlla se l'importo della nota di credito supera quello della fattura
|
|
|
|
|
if (delta_lit > ZERO || delta_val > ZERO)
|
|
|
|
|
{
|
|
|
|
|
// Detrae l'eccedenza dalla rata corrente e la sposta nella rata successiva
|
|
|
|
|
imprata -= delta_lit;
|
|
|
|
|
imprataval -= delta_val;
|
|
|
|
|
|
|
|
|
|
if (n == numrate)
|
|
|
|
|
{
|
|
|
|
|
// Crea eventuale ultima rata mancante
|
|
|
|
|
pag.add_rata();
|
|
|
|
|
numrate++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Incrementa importo rata
|
|
|
|
|
delta_lit += pag.importo_rata(n, FALSE);
|
|
|
|
|
delta_val += pag.importo_rata(n, TRUE);
|
|
|
|
|
}
|
|
|
|
|
const TDate oggi(TODAY);
|
|
|
|
|
const int tiporata = pag.tipo_rata(n-1);
|
|
|
|
|
pag.set_rata(n, delta_val, delta_lit, oggi, tiporata, "", FALSE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
break; // Esce dal ciclo delle rate
|
|
|
|
|
|
1999-04-06 15:34:39 +00:00
|
|
|
|
imprata = -imprata;
|
2000-10-03 13:45:12 +00:00
|
|
|
|
imprataval = -imprataval;
|
|
|
|
|
}
|
|
|
|
|
// Aggiorna importi in lire/valuta dell'effetto
|
1999-04-06 15:34:39 +00:00
|
|
|
|
importo += imprata;
|
|
|
|
|
effetto.put(EFF_IMPORTO,importo);
|
|
|
|
|
if (valuta)
|
|
|
|
|
{
|
|
|
|
|
importoval = effetto.get_real(EFF_IMPORTOVAL);
|
|
|
|
|
importoval += imprataval;
|
|
|
|
|
effetto.put(EFF_IMPORTOVAL,importoval);
|
|
|
|
|
}
|
|
|
|
|
// Crea la nuova riga di questo effetto
|
|
|
|
|
TRectype& riga = effetto.row_r(rows+1,TRUE);
|
|
|
|
|
// reffetto.put(REFF_NPROGTR,nprog);
|
|
|
|
|
riga.put(REFF_NRIGATR,rows+1);
|
|
|
|
|
riga.put(REFF_NRATA,n);
|
|
|
|
|
riga.put(REFF_DATAFATT, datafatt);
|
|
|
|
|
riga.put(REFF_PROVV,provv);
|
|
|
|
|
riga.put(REFF_ANNODOC,anno);
|
|
|
|
|
riga.put(REFF_CODNUM,codnum);
|
|
|
|
|
riga.put(REFF_NFATT,numdoc);
|
2000-05-05 15:25:49 +00:00
|
|
|
|
riga.put(REFF_IMPFATT,totale_fatt.get_num());
|
1999-04-06 15:34:39 +00:00
|
|
|
|
riga.put(REFF_IMPORTO,imprata);
|
2000-10-03 13:45:12 +00:00
|
|
|
|
riga.put(REFF_ANNO, annodocrif);
|
|
|
|
|
riga.put(REFF_NUMPART, numdocrif);
|
1999-04-06 15:34:39 +00:00
|
|
|
|
if (valuta)
|
|
|
|
|
{
|
2000-05-05 15:25:49 +00:00
|
|
|
|
riga.put(REFF_IMPFATTVAL,totale_fatt.get_num());
|
|
|
|
|
TCurrency_documento totfatlit(totale_fatt); totfatlit.change_to_firm_val();
|
|
|
|
|
riga.put(REFF_IMPFATT,totfatlit.get_num());
|
1999-04-06 15:34:39 +00:00
|
|
|
|
riga.put(REFF_IMPORTOVAL,imprataval);
|
|
|
|
|
}
|
2010-04-28 14:47:07 +00:00
|
|
|
|
if (n == numrate)
|
|
|
|
|
effetto.put(EFF_ULTRATA, "X");
|
1998-08-25 18:07:30 +00:00
|
|
|
|
}
|
|
|
|
|
} // Ciclo sulle scadenze
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
|
|
|
|
} // Ciclo sui documenti di questo gruppo
|
2000-05-05 15:25:49 +00:00
|
|
|
|
offset=_effetti_array.items();
|
|
|
|
|
|
1997-08-05 14:10:21 +00:00
|
|
|
|
} // Ciclo sui gruppi
|
|
|
|
|
|
|
|
|
|
// Cambia lo stato a tutti i documenti raggruppati
|
1999-06-18 15:35:05 +00:00
|
|
|
|
long tot = 0L;
|
|
|
|
|
if (_can_write)
|
|
|
|
|
{
|
2005-10-05 18:02:25 +00:00
|
|
|
|
xvtil_statbar_set("Scrittura effetti raggruppati in corso...");
|
2000-10-03 13:45:12 +00:00
|
|
|
|
do_events();
|
2010-09-26 17:07:35 +00:00
|
|
|
|
if (write_groups(interattivo) == no_error)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
1999-06-18 15:35:05 +00:00
|
|
|
|
tot = _effetti_array.items();
|
|
|
|
|
change_group_status(doc, group_array);
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
1999-06-18 15:35:05 +00:00
|
|
|
|
}
|
1997-08-05 14:10:21 +00:00
|
|
|
|
_effetti_array.destroy();
|
1999-06-18 15:35:05 +00:00
|
|
|
|
group_array.destroy();
|
|
|
|
|
|
|
|
|
|
return tot;
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TGenerazione_effetti::valid_type(int pag) const
|
|
|
|
|
{
|
|
|
|
|
return _valid_array[pag];
|
|
|
|
|
}
|
|
|
|
|
|
1999-04-06 15:34:39 +00:00
|
|
|
|
void TGenerazione_effetti::calc_pagamento(TDocumento& doc)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
1999-04-06 15:34:39 +00:00
|
|
|
|
TPagamento& pag = doc.pagamento();
|
|
|
|
|
|
2000-05-05 15:25:49 +00:00
|
|
|
|
// const real change = doc.cambio();
|
2004-06-04 11:20:51 +00:00
|
|
|
|
const real tot = doc.totale_doc() - doc.ritenute();
|
|
|
|
|
const TCurrency_documento tot_doc(tot, doc);
|
2000-05-05 15:25:49 +00:00
|
|
|
|
const TCurrency_documento totspese(doc.spese(), doc);
|
2003-07-22 13:22:11 +00:00
|
|
|
|
const TCurrency_documento totimposte(doc.imposta(TRUE), doc);
|
2000-05-05 15:25:49 +00:00
|
|
|
|
const TCurrency_documento totimponibili(tot_doc - totimposte - totspese);
|
|
|
|
|
TCurrency_documento anticipo(doc.get_real(DOC_IMPPAGATO), doc);
|
|
|
|
|
const bool valuta = doc.in_valuta();
|
1999-06-18 15:35:05 +00:00
|
|
|
|
|
|
|
|
|
//Riaggiusta le rate a seconda del valore gia' pagato
|
2000-05-05 15:25:49 +00:00
|
|
|
|
TGeneric_distrib d(anticipo.get_num(), doc.decimals());
|
1999-06-18 15:35:05 +00:00
|
|
|
|
|
2000-05-05 15:25:49 +00:00
|
|
|
|
d.add(totimponibili.get_num());
|
|
|
|
|
d.add(totimposte.get_num());
|
|
|
|
|
d.add(totspese.get_num());
|
1999-06-18 15:35:05 +00:00
|
|
|
|
|
2000-05-05 15:25:49 +00:00
|
|
|
|
const TCurrency_documento pagtotimponibili(totimponibili.get_num() - d.get(), doc);
|
|
|
|
|
const TCurrency_documento pagtotimposte(totimposte.get_num() - d.get(), doc);
|
|
|
|
|
const TCurrency_documento pagtotspese(totspese.get_num() - d.get(), doc);
|
1999-06-18 15:35:05 +00:00
|
|
|
|
|
1998-08-25 18:07:30 +00:00
|
|
|
|
if (valuta)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
2000-05-05 15:25:49 +00:00
|
|
|
|
TCurrency_documento val2(pagtotimposte); val2.change_to_firm_val();
|
|
|
|
|
TCurrency_documento val3(pagtotspese); val3.change_to_firm_val();
|
2002-02-26 16:20:19 +00:00
|
|
|
|
TCurrency_documento val1(tot_doc); val1.change_to_firm_val(); val1 -= val2 + val3;
|
2000-05-05 15:25:49 +00:00
|
|
|
|
|
|
|
|
|
pag.set_total_valuta(pagtotimponibili, pagtotimposte, pagtotspese, val1, val2, val3);
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
2000-05-05 15:25:49 +00:00
|
|
|
|
pag.set_total(pagtotimponibili, pagtotimposte, pagtotspese);
|
1999-04-06 15:34:39 +00:00
|
|
|
|
pag.set_rate_auto();
|
1998-08-25 18:07:30 +00:00
|
|
|
|
|
1999-06-18 15:35:05 +00:00
|
|
|
|
const int numrate = pag.n_rate();
|
|
|
|
|
|
1998-08-25 18:07:30 +00:00
|
|
|
|
// Scorre all'indietro per rimuovere le rate a 0, evitando fastidiose
|
|
|
|
|
// complicazioni dovute al pack delle rate effettuato dalla remove_rate()
|
1999-06-18 15:35:05 +00:00
|
|
|
|
for (int i=numrate-1; i>=0; i--)
|
1998-08-25 18:07:30 +00:00
|
|
|
|
{
|
1999-04-06 15:34:39 +00:00
|
|
|
|
if (pag.importo_rata(i,valuta) == ZERO)
|
|
|
|
|
pag.remove_rata(i);
|
1998-08-25 18:07:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-09-26 17:07:35 +00:00
|
|
|
|
void TGenerazione_effetti::generate_bill(TDocumento& doc, bool interattivo) // bill in inglese significa anche effetto eheheh ;-)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
// That's my JOB!
|
|
|
|
|
// Ogni rata della fattura (si parla di effetti attivi per ora) genera 1 effetto.
|
|
|
|
|
// con almeno una riga.
|
|
|
|
|
// Ad es. Se ho una fattura suddivisa in 3 rate essa generera' 3 effetti con una riga.
|
|
|
|
|
// Nel caso si decida di raggruppare gli effetti (vedi criteri di raggruppamento)
|
|
|
|
|
// avro' un effetto con tante righe quante scadenze di fattura sono raggruppabili
|
|
|
|
|
// Le fatture possono generare effetti solo per i seguenti tipi di pagamento:
|
|
|
|
|
// 2 - Tratta
|
|
|
|
|
// 3 - Ri.Ba.
|
|
|
|
|
// 5 - Paghero'
|
|
|
|
|
// 7 - Tratta accettata
|
|
|
|
|
// 8 - Rapporti interbancari diretti
|
|
|
|
|
// Caso mai tale insieme risultasse incompleto od errato basta solo modificare l'enum posto all'inizio del programma
|
1999-04-06 15:34:39 +00:00
|
|
|
|
|
|
|
|
|
if (!doc.is_nota_credito()) // I documenti immessi come note di credito non generano effetti...(che senso hanno gli effetti con importi negativi?)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
2010-06-07 13:51:49 +00:00
|
|
|
|
const TString4 codpag(doc.get(DOC_CODPAG));
|
2003-06-26 10:48:09 +00:00
|
|
|
|
const TRectype& cpg = cache().get("%CPG", codpag);
|
|
|
|
|
if (cpg.empty())
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
1999-04-06 15:34:39 +00:00
|
|
|
|
_error = codpag_error;
|
1997-08-05 14:10:21 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
2010-06-07 13:51:49 +00:00
|
|
|
|
|
|
|
|
|
// Totdoc inaffidabile: ne forzo il ricalcolo
|
|
|
|
|
TVariable_field* tot_fld = doc.variable_field(doc.tipo().totale_doc());
|
|
|
|
|
if (tot_fld != NULL)
|
|
|
|
|
tot_fld->set_dirty();
|
|
|
|
|
|
1999-04-06 15:34:39 +00:00
|
|
|
|
TString16 data(doc.get(DOC_DATAINSC));
|
|
|
|
|
if (data.empty())
|
|
|
|
|
data = doc.get(DOC_DATADOC);
|
|
|
|
|
|
2004-06-04 11:20:51 +00:00
|
|
|
|
const real tot = doc.totale_doc() - doc.ritenute();
|
|
|
|
|
const TCurrency_documento totale_fatt(tot, doc); // Importo in valuta
|
2000-05-05 15:25:49 +00:00
|
|
|
|
const TCurrency_documento imppagato(doc.get_real(DOC_IMPPAGATO), doc); // Anticipo pagamento
|
|
|
|
|
if (totale_fatt > imppagato && !doc.get_bool(DOC_ACCSALDO)) // procede se non e' a saldo
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
2000-05-05 15:25:49 +00:00
|
|
|
|
const bool is_anticipo = imppagato.get_num() != ZERO;
|
1999-04-06 15:34:39 +00:00
|
|
|
|
const bool valuta = doc.in_valuta();
|
|
|
|
|
const real change = doc.cambio();
|
|
|
|
|
|
|
|
|
|
// calcolo delle scadenze
|
|
|
|
|
calc_pagamento(doc);
|
|
|
|
|
|
|
|
|
|
TPagamento & pag = doc.pagamento();
|
|
|
|
|
// CHECK(pag,"Failed to create a TPagamento");
|
|
|
|
|
const int numrate = pag.n_rate( );
|
2009-11-13 15:24:24 +00:00
|
|
|
|
if (numrate > 0)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
2009-11-13 15:24:24 +00:00
|
|
|
|
_efffile->last();
|
|
|
|
|
// Variabili per la scrittura dell'effetto
|
|
|
|
|
long nprog = _efffile->get_long(EFF_NPROGTR)+1;
|
|
|
|
|
const char tipocf = doc.get_char(DOC_TIPOCF);
|
|
|
|
|
const long codcf = doc.get_long(DOC_CODCF);
|
|
|
|
|
const TString4 codval(doc.get(DOC_CODVAL));
|
|
|
|
|
const TDate data_cambio = doc.get_date(DOC_DATACAMBIO);
|
|
|
|
|
const bool contro_euro = doc.get_bool(DOC_CONTROEURO);
|
|
|
|
|
const long codabi = doc.get_long(DOC_CODABIA);
|
|
|
|
|
const long codcab = doc.get_long(DOC_CODCABA);
|
|
|
|
|
const TString80 iban = doc.get(DOC_IBAN);
|
2010-06-07 13:51:49 +00:00
|
|
|
|
const TString4 provv(doc.get(DOC_PROVV));
|
2009-11-13 15:24:24 +00:00
|
|
|
|
const int anno = doc.get_int(DOC_ANNO);
|
2010-06-07 13:51:49 +00:00
|
|
|
|
const TString4 codnum(doc.get(DOC_CODNUM));
|
2009-11-13 15:24:24 +00:00
|
|
|
|
const long nfatt = doc.get_long(DOC_NDOC);
|
|
|
|
|
const TDate datafatt = doc.get_date(DOC_DATADOC);
|
|
|
|
|
TRectype& effetto = _efffile->curr();
|
|
|
|
|
TRectype& reffetto = _refffile->curr();
|
|
|
|
|
real importo;
|
|
|
|
|
for (int i = 0; i < numrate && good(); i++)
|
|
|
|
|
{
|
|
|
|
|
const int nrata = is_anticipo ? i + 2: i + 1;
|
|
|
|
|
|
|
|
|
|
if (valid_type(pag.tipo_rata(i)))
|
2006-04-13 17:56:02 +00:00
|
|
|
|
{
|
2009-11-13 15:24:24 +00:00
|
|
|
|
effetto.zero();
|
|
|
|
|
reffetto.zero();
|
|
|
|
|
effetto.put(EFF_NPROGTR,nprog);
|
|
|
|
|
effetto.put(EFF_DATASCAD, pag.data_rata(i));
|
|
|
|
|
effetto.put(EFF_TIPOPAG,pag.tipo_rata(i));
|
|
|
|
|
effetto.put(EFF_ULTCLASS,pag.ulc_rata(i));
|
|
|
|
|
effetto.put(EFF_TIPOCF, tipocf);
|
|
|
|
|
effetto.put(EFF_CODCF, codcf);
|
|
|
|
|
effetto.put(EFF_CODVAL, codval);
|
|
|
|
|
if (valuta)
|
|
|
|
|
{
|
|
|
|
|
effetto.put(EFF_CAMBIO, change);
|
|
|
|
|
effetto.put(EFF_DATACAMBIO,data_cambio);
|
|
|
|
|
effetto.put(EFF_CONTROEURO, contro_euro);
|
|
|
|
|
}
|
|
|
|
|
effetto.put(EFF_CODABI,codabi);
|
|
|
|
|
effetto.put(EFF_CODCAB,codcab);
|
|
|
|
|
effetto.put(EFF_IBAN,iban);
|
Patch level : 10.0 870
Files correlati : ef0.exe
Ricompilazione Demo : [ ]
Commento :
Gestione CUP
Verificare che i profili persnalizzati continuino a funzionare
Nella gestione profili e documenti aggiunti i campi per gestire piu banche di appoggio e presentazione dei clienti/ fornitori
La ricerca e sulla tabella se il cliente / fornitore non ha banche altrimenti e sulle banche del cliente/fornitore.
Ai profili personalizzati vanno aggiunti-modificati e posizionati i campi :
NU 117 5
BE
PR 2 11 "Banca appoggio : Cod. ABI "
FL "Z"
CH NORMAL
FI CODABIA
US %BAN SE CODTAB?="?????"
IN CODTAB[1,5] 117
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Denominazione@50" S0
OU 117 CODTAB[1,5]
OU 336 S0
OU 197 CODTAB[1,5]
ME CO,220
EN
NU 118 5
BE
PR 42 11 "Cod. CAB "
FL "Z"
CH NORMAL
FI CODCABA
US %BAN SE CODTAB?="??????????"
IN CODTAB[1,5] 117
IN CODTAB[6,10] 118
CO DI 117
OU 117 CODTAB[1,5]
OU 118 CODTAB[6,10]
OU 336 S0
OU 198 CODTAB[6,10]
ME CO,221
EN
NU 220 5
BE
PR 2 11 "Banca appoggio : Cod. ABI "
FL "ZH"
CH NORMAL
FI CODABIA
US 98 KEY 2
JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB
IN TIPOCF 107 SE
IN CODCF 108 SE
IN TIPOBAN "V"
IN ABI 220
IN CAB 221
IN PROGPR ""
DI "Cod. Istit." ABI
DI "Cod. Fil." CAB
DI "IBAN@27" IBAN
DI "Denominazione@50" %BAN->S0
OU 220 ABI
OU 221 CAB
OU 336 %BAN->S0
OU 192 IBAN
OU 197 ABI
OU 198 CAB
EN
NU 221 5
BE
PR 42 11 "Cod. CAB "
FL "ZH"
CH NORMAL
FI CODCABA
CO US 220
CO IN 220
CO DI 220
CO OU 220
EN
per la banca di appoggio
NU 119 5
BE
PR 2 14 "Banca presentazione : Cod. ABI "
FL "Z"
CH NORMAL
FI CODABIP
CO US 117
IN CODTAB[1,5] 119
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Denominazione@50" S0
OU 119 CODTAB[1,5]
OU 338 S0
ME CO,222
EN
NU 120 5
BE
PR 42 14 "Cod. CAB "
FL "Z"
CH NORMAL
FI CODCABP
CO US 118
IN CODTAB[1,5] 119
IN CODTAB[6,10] 120
CO DI 119
OU 119 CODTAB[1,5]
OU 120 CODTAB[6,10]
OU 338 S0
ME CO,223
EN
NU 214 2
BE
PR 60 14 "Progressivo "
FL "Z"
FI PROGBNP
US BNP
JOIN %BAN ALIAS 100 INTO CODTAB=CODTAB[1,10]
IN CODTAB[1,5] 119
IN CODTAB[6,10] 120
IN CODTAB[11,12] 214
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Progr." CODTAB[11,12]
DI "IBAN@27" S3
DI "Denominazione@50" 100@->S0
OU 119 CODTAB[1,5]
OU 120 CODTAB[6,10]
OU 214 CODTAB[11,12]
OU 338 100@->S0
ME CO,224
EN
NU 222 5
BE
PR 2 14 "Banca presentazione : Cod. ABI "
FL "ZH"
CH NORMAL
FI CODABIP
US 98 KEY 2
JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB
IN TIPOCF 107 SE
IN CODCF 108 SE
IN TIPOBAN "N"
IN ABI 222
IN CAB 223
IN PROGPR 224
DI "Cod. Istit." ABI
DI "Cod. Fil." CAB
DI "Progr." PROGPR
DI "IBAN@27" IBAN
DI "Denominazione@50" %BAN->S0
OU 222 ABI
OU 223 CAB
OU 224 PROGPR
OU 338 %BAN->S0
OU 192 IBAN
EN
NU 223 5
BE
PR 42 14 "Cod. CAB "
FL "ZH"
CH NORMAL
FI CODCABP
CO US 222
CO IN 222
CO DI 222
CO OU 222
EN
NU 224 2
BE
PR 60 14 "Progressivo "
FL "ZH"
CH NORMAL
FI PROGBNP
CO US 222
CO IN 222
CO DI 222
CO OU 222
EN
per la banca di presentazione.
Sono stati aggiunti campi CUP e CIG che hanno la ricerca sulla tabella ne caso normale e la ricerca sul file
commesse clienti nel caso sia presente l'analitica
Vanno aggiunti e posizionati ai profili personalizzati nel caso servano:
ST 215 15
BE
PR 2 11 "Cod.Unico Prog."
FL "U"
CH NORMAL
FI CUP
US %CUP
IN CODTAB 215
DI "Codice@15" CODTAB
DI "Descrizione@50" S0
OU 215 CODTAB
OU 216 S0
HE "Inserisci il Codice Unico di Progetto"
WA "Codice Unico di Progetto non trovato"
CH NORMAL
EN
ST 216 50
BE
PR 35 11 ""
FL ""
CH NORMAL
US %CUP KEY 2
IN S0 216
DI "Descrizione@50" S0
DI "Codice@15" CODTAB
CO OU 215
EN
ST 217 15
BE
PR 2 12 "Cod.Ident.Gara "
FL "U"
CH NORMAL
FI CIG
US %CIG
IN CODTAB 217
DI "Codice@15" CODTAB
DI "Descrizione@50" S0
OU 217 CODTAB
OU 218 S0
HE "Inserisci il Codice Identificativo Gara"
WA "Codice Identificativo Gara non trovato"
CH NORMAL
EN
ST 218 50
BE
PR 35 12 ""
FL ""
CH NORMAL
US %CIG KEY 2
IN S0 218
DI "Descrizione@50" S0
DI "Codice@15" CODTAB
CO OU 217
EN
ST 219 20
BE
PR 2 13 ""
FL "H"
FI CODCMS
EN
La generazione effetti scrive il CUP e il CIG sull'effetto.
La contabilizzazione scrive il CUP e il CIG sulle righe contabili.
git-svn-id: svn://10.65.10.50/branches/R_10_00@21374 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-12-28 08:28:47 +00:00
|
|
|
|
effetto.put(EFF_CUP,doc.get(DOC_CUP));
|
|
|
|
|
effetto.put(EFF_CIG,doc.get(DOC_CIG));
|
2009-11-13 15:24:24 +00:00
|
|
|
|
effetto.put(EFF_EFFCOMP,TRUE);
|
|
|
|
|
if (i == numrate - 1) effetto.put(EFF_ULTRATA,TRUE);
|
|
|
|
|
// Put sulla riga dell'effetto
|
|
|
|
|
reffetto.put(REFF_NPROGTR,nprog);
|
|
|
|
|
reffetto.put(REFF_NRIGATR,1);
|
|
|
|
|
reffetto.put(REFF_DATAFATT, datafatt);
|
|
|
|
|
reffetto.put(REFF_NRATA,nrata);
|
|
|
|
|
reffetto.put(REFF_PROVV,provv);
|
|
|
|
|
reffetto.put(REFF_ANNODOC,anno);
|
|
|
|
|
reffetto.put(REFF_CODNUM,codnum);
|
|
|
|
|
reffetto.put(REFF_NFATT,nfatt);
|
|
|
|
|
if (doc.get_char(DOC_TIPOCF) == 'F' || doc.tipo().nota_credito())
|
2006-04-13 17:56:02 +00:00
|
|
|
|
{
|
2009-11-13 15:24:24 +00:00
|
|
|
|
reffetto.put(REFF_ANNO, doc.get_date(DOC_DATADOCRIF).year());
|
|
|
|
|
reffetto.put(REFF_NUMPART, doc.get(DOC_NUMDOCRIF));
|
2006-04-13 17:56:02 +00:00
|
|
|
|
}
|
2009-11-13 15:24:24 +00:00
|
|
|
|
|
|
|
|
|
importo = pag.importo_rata(i,FALSE);
|
|
|
|
|
effetto.put(EFF_IMPORTO,importo);
|
|
|
|
|
reffetto.put(REFF_IMPFATT,totale_fatt.get_num());
|
|
|
|
|
reffetto.put(REFF_IMPORTO,importo);
|
|
|
|
|
|
2010-06-07 13:51:49 +00:00
|
|
|
|
TString8 key;
|
2009-11-13 15:24:24 +00:00
|
|
|
|
key.format("%c|%ld", tipocf, codcf);
|
2010-09-26 17:07:35 +00:00
|
|
|
|
real impmin;
|
|
|
|
|
|
|
|
|
|
if (!interattivo)
|
|
|
|
|
{
|
|
|
|
|
impmin = real(cache().get(LF_CFVEN, key, CFV_IMPMINEFF));
|
|
|
|
|
if (impmin == ZERO)
|
|
|
|
|
impmin = _impmin;
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-21 01:48:00 +00:00
|
|
|
|
if (effetto.get_int(EFF_TIPOPAG) == _rid || importo >= impmin)
|
2006-04-13 17:56:02 +00:00
|
|
|
|
{
|
2009-11-13 15:24:24 +00:00
|
|
|
|
if (valuta)
|
|
|
|
|
{
|
2010-06-07 13:51:49 +00:00
|
|
|
|
importo = pag.importo_rata(i, true); // Importo in valuta
|
2009-11-13 15:24:24 +00:00
|
|
|
|
TCurrency_documento totfatlit(totale_fatt); totfatlit.change_to_firm_val();
|
|
|
|
|
effetto.put(EFF_IMPORTOVAL,importo);
|
|
|
|
|
reffetto.put(REFF_IMPFATTVAL,totale_fatt.get_num());
|
|
|
|
|
reffetto.put(REFF_IMPFATT,totfatlit.get_num());
|
|
|
|
|
reffetto.put(REFF_IMPORTOVAL,importo);
|
2010-06-07 13:51:49 +00:00
|
|
|
|
}
|
2009-11-13 15:24:24 +00:00
|
|
|
|
if (_efffile->write() == NOERR && _refffile->write() == NOERR)
|
|
|
|
|
{
|
|
|
|
|
_total_bills++;
|
|
|
|
|
nprog++;
|
|
|
|
|
}
|
2010-06-07 13:51:49 +00:00
|
|
|
|
else
|
|
|
|
|
_error = write_error;
|
2006-04-13 17:56:02 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2009-11-13 15:24:24 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (good() && _can_write)
|
|
|
|
|
change_doc_status(doc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TGenerazione_effetti::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
|
1998-06-10 16:38:58 +00:00
|
|
|
|
const TDate& data_elab, bool interattivo)
|
1997-08-05 14:10:21 +00:00
|
|
|
|
{
|
1999-06-18 15:35:05 +00:00
|
|
|
|
TString msg;
|
1997-08-05 14:10:21 +00:00
|
|
|
|
_error = no_error;
|
|
|
|
|
_total_bills = 0L;
|
|
|
|
|
|
2009-04-17 16:26:10 +00:00
|
|
|
|
pre_process_input(doc_in);
|
1997-08-05 14:10:21 +00:00
|
|
|
|
const int items = doc_in.items(); // Numero dei documenti in questa elaborazione
|
|
|
|
|
for (int i = 0; i < items ; i++) // Scorriamo tutti i documenti nella lista
|
|
|
|
|
{
|
1999-06-18 15:35:05 +00:00
|
|
|
|
TDocumento& doc = doc_in[i];
|
2010-06-07 13:51:49 +00:00
|
|
|
|
msg.format(FR("Generazione effetti documento %s/%ld."), (const char*) doc.numerazione(), doc.numero());
|
2005-10-05 18:02:25 +00:00
|
|
|
|
xvtil_statbar_set(msg);
|
1999-06-18 15:35:05 +00:00
|
|
|
|
do_events();
|
|
|
|
|
|
2010-09-26 17:07:35 +00:00
|
|
|
|
generate_bill(doc, interattivo); // Genera gli effetti corrispondenti
|
1997-08-05 14:10:21 +00:00
|
|
|
|
if (!good())
|
1999-06-18 15:35:05 +00:00
|
|
|
|
display_error(doc);
|
1997-08-05 14:10:21 +00:00
|
|
|
|
}
|
2009-04-17 16:26:10 +00:00
|
|
|
|
post_process_input(doc_in);
|
2010-01-12 21:49:19 +00:00
|
|
|
|
post_process(doc_out, doc_in);
|
1997-08-05 14:10:21 +00:00
|
|
|
|
|
|
|
|
|
return _can_write;
|
|
|
|
|
}
|
|
|
|
|
|