Corretto calcolo fido cliente

git-svn-id: svn://10.65.10.50/branches/R_10_00@22889 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-07-26 15:48:01 +00:00
parent ab2403bd73
commit 4378b5f698
15 changed files with 341 additions and 268 deletions

View File

@ -140,10 +140,13 @@ Col(9) = FR_QTA
Col(10) = FR_LORDO Col(10) = FR_LORDO
Col(11) = FR_PREZZO Col(11) = FR_PREZZO
Col(12) = FR_CODIVA Col(12) = FR_CODIVA
Col(13) = FR_CAUS Col(13)= FR_NCOLLI
Col(14) = FR_CODMAGC Col(14)= FR_PNETTO
Col(15) = FR_CODDEPC Col(15)= FR_TARA
Col(16)=FR_TIPORIGA Col(16) = FR_CAUS
Col(17) = FR_CODMAGC
Col(18) = FR_CODDEPC
Col(19) = FR_TIPORIGA
[RIGHE] [RIGHE]

View File

@ -17,9 +17,9 @@
#include "../pr/agenti.h" #include "../pr/agenti.h"
#include "../pr/percprov.h" #include "../pr/percprov.h"
bool TCond_vendita::set_sconto( const char * exp, bool signal ) bool TCond_vendita::set_sconto(const char* exp, bool signal)
{ {
bool valid= scontoexpr2perc(exp,signal,_sconto,_molt_sconto); bool valid = scontoexpr2perc(exp, signal, _sconto, _molt_sconto);
if (_load_mask && _riga && _riga->id2pos(FR_SCONTO) >= 0 && _riga->field(FR_SCONTO).active()) if (_load_mask && _riga && _riga->id2pos(FR_SCONTO) >= 0 && _riga->field(FR_SCONTO).active())
_riga->set(FR_SCONTO, _sconto); _riga->set(FR_SCONTO, _sconto);
return valid; return valid;
@ -87,10 +87,9 @@ bool TCond_vendita::cerca( int tiporicerca )
{ {
case A_CONTRATTI: case A_CONTRATTI:
{ {
const TString16 codcont(testa().get(F_CODCONT)); const TString16 codcont = testa().get(F_CODCONT);
if (codcont.blank())
if (codcont.empty()) return false;
return FALSE;
_condv.put(CONDV_TIPO, "C"); _condv.put(CONDV_TIPO, "C");
if(config_ditta.get_bool("GESCONCC", "ve")) if(config_ditta.get_bool("GESCONCC", "ve"))
{ {
@ -102,10 +101,9 @@ bool TCond_vendita::cerca( int tiporicerca )
break; break;
case A_LISTINI: case A_LISTINI:
{ {
const TString16 codlist(testa().get(F_CODLIST)); const TString16 codlist = testa().get(F_CODLIST);
if (codlist.blank())
if (codlist.empty()) return false;
return FALSE;
_condv.put(CONDV_TIPO, "L"); _condv.put(CONDV_TIPO, "L");
// Se in ditta h abilitata la gestione della categoria di vendita in chiave // Se in ditta h abilitata la gestione della categoria di vendita in chiave
// al listino, la carico con gioia // al listino, la carico con gioia
@ -319,6 +317,121 @@ real TCond_vendita::get_percprovv(char tipoprovv, const TString & codpr, bool fi
return val; return val;
} }
bool TCond_vendita::try_sconto(char gestione, bool found_condv, bool load_um_only, bool load_scagl_only)
{
TString80 sconto;
switch (gestione)
{
case 'L':
// Percentuale su contratti/offerte/listini/anagrafica
if (found_condv)
{
const bool cv_scagl = _condv.get_bool("GESTSCAGL");
const bool cv_um = _condv.get_bool("GESTUM");
_load_mask |= load_scagl_only && cv_scagl;
_load_mask |= load_um_only && cv_um;
sconto = _rcondv.get("SCONTO");
_load_mask = !load_um_only && !load_scagl_only;
}
else
sconto = _anamag.get("SCONTO");
break;
case 'A':
{
TConfig config_ditta(CONFIG_DITTA, "ve");
const bool sco_scagl = config_ditta.get_bool("GESSCOSCA");
const bool sco_um_gest = config_ditta.get_bool("GESSCORIGAUM");
const char rigakey = config_ditta.get_char( "SCORIGAKEY");
// Posiziono l'anagrafica
_sconti.setkey(1);
_sconti.put("TIPO", "R");
if( config_ditta.get_bool("GESSCORIGACV"))
_sconti.put("CODCAT", testa().get(F_CATVEN));
if (sco_um_gest)
_sconti.put("UM", riga().get( FR_UMQTA));
_sconti.put("TIPORIGA", rigakey);
if (sco_scagl)
_sconti.put("NSCAGL", 1);
switch (rigakey)
{
case 'A':
{
const TString& codriga = riga().get(FR_CODARTMAG);
_sconti.put("CODART", codriga);
_sconti.read();
}
break;
case 'R':
_sconti.put("CODART", _anamag.get("RAGGFIS"));
_sconti.read();
break;
case 'C':
{
_sconti.put( "CODART", _anamag.get("GRMERC"));
_sconti.read( );
}
break;
case 'L':
{
_sconti.put("CODART", _anamag.get("GRMERC").left(3));
_sconti.read();
}
break;
default:
{
const TString& codriga = riga().get(FR_CODARTMAG);
_sconti.put("CODART", codriga);
_sconti.read();
}
break;
}
const bool found = _sconti.good();
if (found && sco_scagl)
{
TRectype rec(_sconti.curr());
int last_scagl = 0;
int scagl = _sconti.get_int("NSCAGL");
const real qta(_riga->get_real(FR_QTA));
real qta_lim(_sconti.get_real("QLIM"));
while (_sconti.good() && scagl > last_scagl && qta_lim > ZERO && qta > qta_lim)
{
if (_sconti.next() == NOERR)
{
last_scagl = scagl;
scagl = _sconti.get_int("NSCAGL");
qta_lim =_sconti.get_real("QLIM");
rec = _sconti.curr();
}
}
_rcondv.read(rec);
}
if (!found)
_sconti.zero();
_load_mask |= load_scagl_only && sco_scagl;
_load_mask |= load_scagl_only && sco_um_gest;
sconto = _sconti.get("SCONTO");
_load_mask = !load_um_only && !load_scagl_only;
}
break;
case 'C':
sconto = clifo().vendite().get(CFV_SCONTO);
break;
default:
sconto.cut(0);
break;
}
return set_sconto(sconto) && sconto.full();
}
void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
{ {
const TString80 codriga = riga().get( FR_CODARTMAG ); const TString80 codriga = riga().get( FR_CODARTMAG );
@ -342,22 +455,18 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
real prezzo; real prezzo;
bool found_prezzo = false; bool found_prezzo = false;
const TArticolo_giacenza & art = cached_article_balances(codriga); const TArticolo_giacenza & art = cached_article_balances(codriga);
static TTipo_valorizz __tipo = (TTipo_valorizz) -883;
const TTipo_riga_documento tiporiga(riga().get(FR_TIPORIGA));; const TTipo_riga_documento tiporiga(riga().get(FR_TIPORIGA));;
if (__tipo == -883) if (tiporiga.tipo() == RIGA_OMAGGI)
{
TConfig c(CONFIG_DITTA, "ve");
__tipo = (TTipo_valorizz) (c.get_int("PriceOmaggi") - 1);
}
if (tiporiga.tipo() == RIGA_OMAGGI)
{ {
const int annoes = esercizi().date2esc(testa().get_date(F_DATADOC)); const int annoes = esercizi().date2esc(testa().get_date(F_DATADOC));
const TString4 codmag = riga().get(FR_CODMAG); const TString4 codmag = riga().get(FR_CODMAG);
const TString80 livello = riga().get(MAG_LIVELLO); const TString80 livello = riga().get(MAG_LIVELLO);
found_prezzo = true; found_prezzo = true;
switch (__tipo)
const TTipo_valorizz tvo = TTipo_valorizz(ini_get_int(CONFIG_DITTA, "ve", "PriceOmaggi") - 1);
switch (tvo)
{ {
case valorizz_ultcos: case valorizz_ultcos:
prezzo = art.ultimo_costo(annoes); prezzo = art.ultimo_costo(annoes);
@ -399,9 +508,8 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
} }
} }
const TString16 umriga(riga().get(FR_UMQTA)); const TString4 umriga(riga().get(FR_UMQTA));
if (umriga.full())
if (umriga.not_empty())
{ {
_umart.setkey(2); _umart.setkey(2);
_umart.put("CODART", codriga); _umart.put("CODART", codriga);
@ -411,7 +519,7 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
} }
bool prezzo_lordo = false; bool prezzo_lordo = false;
TString16 valuta; TString4 valuta;
bool found_condv = false; bool found_condv = false;
const bool cv_scagl = _condv.get_bool("GESTSCAGL"); const bool cv_scagl = _condv.get_bool("GESTSCAGL");
const bool cv_um = _condv.get_bool("GESTUM"); const bool cv_um = _condv.get_bool("GESTUM");
@ -419,7 +527,6 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
if (!found_prezzo) if (!found_prezzo)
{ {
found_condv = cerca(A_CONTRATTI) || cerca(A_OFFERTE) || cerca(A_LISTINI); found_condv = cerca(A_CONTRATTI) || cerca(A_OFFERTE) || cerca(A_LISTINI);
if (found_condv) if (found_condv)
{ {
_load_mask |= load_scagl_only && cv_scagl; _load_mask |= load_scagl_only && cv_scagl;
@ -432,9 +539,8 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
} }
else else
{ {
TString16 field_prezzo(testa().doc().tipo().field_prezzo()); TString16 field_prezzo = testa().doc().tipo().field_prezzo();
if (field_prezzo.blank())
if (field_prezzo.empty())
prezzo = _umart.get_real("PREZZO"); prezzo = _umart.get_real("PREZZO");
else else
prezzo = _anamag.get_real(field_prezzo); prezzo = _anamag.get_real(field_prezzo);
@ -442,12 +548,12 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
_prov = "A"; _prov = "A";
} }
} }
if (doc_al_lordo)
if (doc_al_lordo)
{ {
if (!prezzo_lordo) if (!prezzo_lordo)
{ {
TCodiceIVA iva(_anamag.get("CODIVA")); const TCodiceIVA iva(_anamag.get("CODIVA"));
prezzo = iva.lordo(prezzo, AUTO_PRICES_DECIMALS, valuta); prezzo = iva.lordo(prezzo, AUTO_PRICES_DECIMALS, valuta);
} }
} }
@ -455,140 +561,36 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
{ {
if (prezzo_lordo) if (prezzo_lordo)
{ {
TCodiceIVA iva(_anamag.get("CODIVA")); const TCodiceIVA iva(_anamag.get("CODIVA"));
iva.scorpora(prezzo, AUTO_PRICES_DECIMALS, valuta); iva.scorpora(prezzo, AUTO_PRICES_DECIMALS, valuta);
} }
} }
set_prezzo(prezzo, valuta); set_prezzo(prezzo, valuta);
set_iva(_anamag.get(_ivarid ? ANAMAG_CODIVAR : ANAMAG_CODIVA));
if (_ivarid) // Gestione sconti di riga
set_iva(_anamag.get(ANAMAG_CODIVAR)); const char gestione1 = ini_get_string(CONFIG_DITTA, "ve", "GESSCORIGA")[0];
else if (!try_sconto(gestione1, found_condv, load_um_only, load_scagl_only) && gestione1 > ' ')
set_iva(_anamag.get(ANAMAG_CODIVA));
TConfig config_ditta(CONFIG_DITTA, "ve");
const char gestione = config_ditta.get_char( "GESSCORIGA", "ve" );
const bool sco_scagl = config_ditta.get_bool("GESSCOSCA", "ve");
const bool sco_um_gest = config_ditta.get_bool("GESSCORIGAUM", "ve");
switch (gestione)
{ {
case 'N': const char gestione2 = ini_get_string(CONFIG_DITTA, "ve", "GESSCORIGA2")[0];
// Sconti di riga non gestiti if (gestione2 != gestione1 && (gestione2 == 'A' || gestione2 == 'C' || gestione2 == 'L'))
set_sconto(""); try_sconto(gestione2, found_condv, load_um_only, load_scagl_only);
break;
case 'L':
// Percentuale su contratti/offerte/listini/anagrafica
if (found_condv)
{
_load_mask |= load_scagl_only && cv_scagl;
_load_mask |= load_um_only && cv_um;
set_sconto(_rcondv.get("SCONTO"));
_load_mask = !load_um_only && !load_scagl_only;
}
else
set_sconto(_anamag.get("SCONTO"));
break;
case 'A':
{
// Posiziono l'anagrafica
const char rigakey = config_ditta.get_char( "SCORIGAKEY", "ve" );
_sconti.setkey(1);
_sconti.put("TIPO", "R");
if( config_ditta.get_bool("GESSCORIGACV", "ve"))
_sconti.put("CODCAT", testa().get(F_CATVEN));
if (sco_um_gest)
_sconti.put("UM", riga().get( FR_UMQTA));
_sconti.put("TIPORIGA", rigakey);
if (sco_scagl)
_sconti.put("NSCAGL", 1);
switch (rigakey)
{
case 'A':
_sconti.put("CODART", codriga);
_sconti.read();
break;
case 'R':
_sconti.put("CODART", _anamag.get("RAGGFIS"));
_sconti.read();
break;
case 'C':
{
_sconti.put( "CODART", _anamag.get("GRMERC"));
_sconti.read( );
}
break;
case 'L':
{
_sconti.put("CODART", _anamag.get("GRMERC").left(3));
_sconti.read();
}
break;
default:
_sconti.put("CODART", codriga);
_sconti.read();
break;
}
const bool found = _sconti.good();
if (found && sco_scagl)
{
TRectype rec(_sconti.curr());
int last_scagl = 0;
int scagl = _sconti.get_int("NSCAGL");
const real qta(_riga->get_real(FR_QTA));
real qta_lim(_sconti.get_real("QLIM"));
while (_sconti.good() && scagl > last_scagl && qta_lim > ZERO && qta > qta_lim)
{
if (_sconti.next() == NOERR)
{
last_scagl = scagl;
scagl = _sconti.get_int("NSCAGL");
qta_lim =_sconti.get_real("QLIM");
rec = _sconti.curr();
}
}
_rcondv.read(rec);
}
if (!found)
_sconti.zero();
_load_mask |= load_scagl_only && sco_scagl;
_load_mask |= load_scagl_only && sco_um_gest;
set_sconto(_sconti.get("SCONTO"));
_load_mask = !load_um_only && !load_scagl_only;
}
break;
case 'C':
set_sconto(clifo().vendite().get(CFV_SCONTO));
break;
default:
set_sconto("");
break;
} }
if (_riga && _riga->id2pos(FR_PERCPROV) >= 0 && _riga->field(FR_PERCPROV).active()) if (_riga && _riga->id2pos(FR_PERCPROV) >= 0 && _riga->field(FR_PERCPROV).active())
{ {
const TString & codage = _testa->get(F_CODAG); const TString& codage = _testa->get(F_CODAG);
if (codage.full()) if (codage.full())
{ {
const TRectype & age = cache().get(LF_AGENTI, codage); const TRectype& age = cache().get(LF_AGENTI, codage);
if (!age.empty()) if (!age.empty())
{ {
TString16 seqric(age.get(AGE_SEQRIC)); TString16 seqric(age.get(AGE_SEQRIC));
real percprovv; real percprovv;
if (seqric[0] == '-') if (seqric[0] == '-')
seqric = config_ditta.get( "AGETIPOPERC", "ve" ); seqric = ini_get_string(CONFIG_DITTA, "ve", "AGETIPOPERC");
int len = seqric.len(); int len = seqric.len();
int i; int i;
@ -626,27 +628,26 @@ void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only)
if (!age.empty()) if (!age.empty())
{ {
TString16 seqric(age.get(AGE_SEQRIC)); TString16 seqric = age.get(AGE_SEQRIC);
real percprovv;
if (seqric[0] == '-') if (seqric[0] == '-')
seqric = config_ditta.get( "AGETIPOPERC", "ve" ); seqric = ini_get_string(CONFIG_DITTA, "ve", "AGETIPOPERC");
int len = seqric.len();
int i;
_load_mask |= load_scagl_only && cv_scagl; _load_mask |= load_scagl_only && cv_scagl;
_load_mask |= load_scagl_only && cv_um; _load_mask |= load_scagl_only && cv_um;
for (i = 0; percprovv.is_zero() && seqric[i] != '\0' && seqric[i] != '-'; i++)
real percprovv;
for (int i = 0; percprovv.is_zero() && seqric[i] != '\0' && seqric[i] != '-'; i++)
{ {
TString16 codric; TString16 codric;
if (isdigit(seqric[i])) if (isdigit(seqric[i]))
codric = age.get(format("CODRICPR%d", i+1)); codric = age.get(format("CODRICPR%d", i+1));
percprovv = get_percprovv(seqric[i], codric, false, age); percprovv = get_percprovv(seqric[i], codric, false, age);
} }
real percalt; real percalt;
seqric = age.get(AGE_SEQALT); seqric = age.get(AGE_SEQALT);
for (i = 0; percalt.is_zero() && seqric[i] != '\0' && seqric[i] != '-'; i++) for (int i = 0; percalt.is_zero() && seqric[i] != '\0' && seqric[i] != '-'; i++)
{ {
TString16 codric; TString16 codric;
if (isdigit(seqric[i])) if (isdigit(seqric[i]))
@ -698,12 +699,12 @@ void TCond_vendita::update_omaggi(bool full)
{ {
tipo_riga = "09"; tipo_riga = "09";
cnf.set("TROMAGGI", tipo_riga); cnf.set("TROMAGGI", tipo_riga);
warning_box(FR("Il tipo riga omaggi non risultava impostato.\nL'applicazione usera' automaticamente il tipo %s"), warning_box(FR("Il tipo riga omaggi non risultava impostato.\nL'applicazione userà automaticamente il tipo %s"),
(const char*) tipo_riga); (const char*) tipo_riga);
} }
} }
const real qbase = _rcondv.get_real("QBASE"); const real qbase = _rcondv.get_real("QBASE");
if (qbase == ZERO) if (qbase.is_zero())
qta = ZERO; qta = ZERO;
else else
{ {
@ -711,7 +712,7 @@ void TCond_vendita::update_omaggi(bool full)
qta.floor(); qta.floor();
qta *= _rcondv.get_real(RCONDV_QOM); qta *= _rcondv.get_real(RCONDV_QOM);
} }
creata = codart_omaggio.not_empty() && tipo_riga.not_empty() && qta != ZERO; creata = codart_omaggio.not_empty() && tipo_riga.not_empty() && !qta.is_zero();
if (creata) if (creata)
{ {

View File

@ -16,7 +16,7 @@ class TConfig;
class TCond_vendita : public TObject class TCond_vendita : public TObject
{ {
TString80 _sconto; TString80 _sconto;
TString16 _codiva; TString4 _codiva;
TString4 _prov; TString4 _prov;
real _prezzo; real _prezzo;
real _provv; real _provv;
@ -47,10 +47,11 @@ protected:
TDocumento_mask & testa() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _testa; } TDocumento_mask & testa() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _testa; }
TMask & riga() const { CHECK(_riga, "Maschera riga non inizializzata"); return * _riga; } TMask & riga() const { CHECK(_riga, "Maschera riga non inizializzata"); return * _riga; }
bool try_sconto(char gestione, bool found_condv, bool load_um_only, bool load_scagl_only);
public: public:
TCli_for & clifo() const { return _testa->doc().clifor(); } TCli_for & clifo() const { return _testa->doc().clifor(); }
bool set_sconto( const char * exp, bool signal = FALSE ); bool set_sconto( const char* exp, bool signal = false);
const TString& get_sconto() const { return _sconto; } const TString& get_sconto() const { return _sconto; }
real sconto_val() const { return _molt_sconto;} real sconto_val() const { return _molt_sconto;}
real get_prezzo() const { return _prezzo; } real get_prezzo() const { return _prezzo; }

View File

@ -164,9 +164,9 @@ GROUP 4
FIELD SCOKEY[4] FIELD SCOKEY[4]
END END
LIST F_GESSCORIGA 45 LIST F_GESSCORIGA 1 45
BEGIN BEGIN
PROMPT 2 8 "Tipo gestione sconti riga " PROMPT 2 7 "Gestione sconti riga principale "
ITEM "N|Non gestire" MESSAGE CLEAR,5@ ITEM "N|Non gestire" MESSAGE CLEAR,5@
ITEM "L|Percentuale su anagrafica/listini/contratti " MESSAGE CLEAR,5@ ITEM "L|Percentuale su anagrafica/listini/contratti " MESSAGE CLEAR,5@
ITEM "A|Gestione archivio sconti " MESSAGE ENABLE,5@ ITEM "A|Gestione archivio sconti " MESSAGE ENABLE,5@
@ -174,6 +174,16 @@ ITEM "C|Percentuale indicata su anagrafica cliente " MESSAGE CLEAR,5@
FIELD GESSCORIGA FIELD GESSCORIGA
END END
LIST F_GESSCORIGA2 1 45
BEGIN
PROMPT 2 8 "Gestione sconti riga secondaria "
ITEM "N|Non gestire"
ITEM "L|Percentuale su anagrafica/listini/contratti "
ITEM "A|Gestione archivio sconti " MESSAGE ENABLE,5@
ITEM "C|Percentuale indicata su anagrafica cliente "
FIELD GESSCORIGA2
END
BOOLEAN F_GESSCORIGACV BOOLEAN F_GESSCORIGACV
BEGIN BEGIN
PROMPT 2 9 "Gestione archivio sconti con categorie vendita cliente " PROMPT 2 9 "Gestione archivio sconti con categorie vendita cliente "

View File

@ -28,6 +28,7 @@
#define F_SCOKEY4 124 #define F_SCOKEY4 124
#define F_GESSCORIGA 125 #define F_GESSCORIGA 125
#define F_GESSCORIGA2 119
#define F_GESSCORIGACV 126 #define F_GESSCORIGACV 126
#define F_SCORIGAKEY 127 #define F_SCORIGAKEY 127

View File

@ -1102,7 +1102,7 @@ public:
void set_codnum(const char* codnum); void set_codnum(const char* codnum);
void set_ndoc(const long ndoc); void set_ndoc(const long ndoc);
TDoc_key& operator= (const char* key) {set(key); } TDoc_key& operator=(const char* key) { set(key); return *this; }
TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv = 'D'); TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv = 'D');
TDoc_key(const TRectype& rec); TDoc_key(const TRectype& rec);

View File

@ -554,7 +554,7 @@ real TRiga_documento::importo(bool scontato, bool lordo, int ndec) const
TCond_vendita cv(NULL, NULL); TCond_vendita cv(NULL, NULL);
cv.set_sconto(get("SCONTO")); cv.set_sconto(get("SCONTO"));
if (cv.get_sconto().not_empty()) if (cv.get_sconto().full())
{ {
importo = doc().basesconto(); importo = doc().basesconto();
importo *= (cv.sconto_val() - UNO); importo *= (cv.sconto_val() - UNO);

View File

@ -1844,7 +1844,7 @@ bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key )
for (int i = 1; i <= rows; i++) for (int i = 1; i <= rows; i++)
if (i != r + 1 && codart == doc[i].get(RDOC_CODART)) if (i != r + 1 && codart == doc[i].get(RDOC_CODART))
if ( !yesno_box(FR("L'articolo %s e' presente alla riga %d, si desdiera continuare"), (const char *)codart, i)) if ( !yesno_box(FR("L'articolo %s e' presente alla riga %d, si desidera continuare"), (const char *)codart, i))
return false; return false;
} }
} }
@ -3717,7 +3717,7 @@ void TDocumento_mask::user_set_handler(short fieldid, int index)
break; break;
case 6: case 6:
set_field_handler(fieldid, fido_hndl); set_field_handler(fieldid, fido_hndl);
break; break;
default: default:
break; break;
} }

View File

@ -156,25 +156,26 @@ bool fido_hndl(TMask_field& field, KEY key)
{ {
if (key == K_ENTER && !field.empty()) if (key == K_ENTER && !field.empty())
{ {
TDocumento_mask & m = (TDocumento_mask &) field.mask(); const TDocumento_mask& m = (TDocumento_mask&)field.mask();
const real fido_bau(field.get()); if (m.insert_mode() || m.get(F_STATO) == "1")
const char tipocf = m.get(F_TIPOCF)[0]; {
const long codcf = m.get_long(F_CODCF); const real fido_bau(field.get());
const TDate& datadoc = m.get_date(F_DATADOC); const long codcf = m.get_long(F_CODCF);
const int riskdays = ini_get_int(CONFIG_DITTA, "ve", "FIDO_RISKDAYS"); const TDate datadoc = m.get_date(F_DATADOC);
const real perc_toll = ini_get_string(CONFIG_DITTA, "ve", "FIDO_PERCTOLL"); const TDoc_key ignore_key = m.doc();
//calcola l'esposizione PRIMA del documento corrente const real perc_toll = ini_get_string(CONFIG_DITTA, "ve", "FIDO_PERCTOLL");
const real esposizione = calcola_fido_cliente (tipocf, codcf, datadoc, riskdays); //calcola l'esposizione PRIMA del documento corrente
//prende il valore del documento corrente const real esposizione = calcola_fido_cliente(codcf, datadoc, ignore_key);
const real totdoc = m.doc().totale_doc(); //prende il valore del documento corrente
//esposizione comprensiva del documento corrente const real totdoc = m.doc().totale_doc();
const real esposizione_totale = esposizione + totdoc; //esposizione comprensiva del documento corrente
const real fido_con_tolleranza = fido_bau * (CENTO + perc_toll) / CENTO; const real esposizione_totale = esposizione + totdoc;
const real fido_con_tolleranza = fido_bau * (CENTO + perc_toll) / CENTO;
if (esposizione_totale > fido_con_tolleranza) if (esposizione_totale > fido_con_tolleranza)
return yesno_box(FR("Attenzione! Il cliente %ld risulta fuori fido.\nEsposizione corrente: %s\n" return yesno_box(FR("Attenzione! Il cliente %ld risulta fuori fido.\nEsposizione corrente: %s\n"
"Tot. Doc. corrente: %s\nEsposizione totale: %s\nRegistrare ugualmente il documento?"), "Tot. Doc. corrente: %s\nEsposizione totale: %s\nRegistrare ugualmente il documento?"),
codcf, esposizione.stringa(), totdoc.stringa(), esposizione_totale.stringa()); codcf, esposizione.stringa(), totdoc.stringa(), esposizione_totale.stringa());
}
} }
return true; return true;
} }
@ -222,7 +223,7 @@ bool ora_hndl( TMask_field& field, KEY key )
bool dummy_hndl(TMask_field& field, KEY key) bool dummy_hndl(TMask_field& field, KEY key)
{ {
warning_box(FR("Al campo %d è arrivato un KEY %d"), field.dlg( ), key ); warning_box(FR("Al campo %d è arrivata una KEY %d"), field.dlg( ), key );
return true; return true;
} }
@ -234,7 +235,7 @@ bool condpag_hndl( TMask_field& field, KEY key )
if ( field.to_check(key) || (key == K_TAB && !m.is_running())) if ( field.to_check(key) || (key == K_TAB && !m.is_running()))
{ {
const TString& condpag = m.get(F_CODPAG); const TString& condpag = m.get(F_CODPAG);
if (condpag.not_empty()) if (condpag.full())
{ {
TDocumento& doc = m.doc(); TDocumento& doc = m.doc();
// Aggiorna dati necessari per determinare il pagamento // Aggiorna dati necessari per determinare il pagamento
@ -2160,14 +2161,13 @@ bool qtaart_handler( TMask_field& f, KEY key )
} }
real qta(row.get(sf.cid2index(FR_QTA))); real qta(row.get(sf.cid2index(FR_QTA)));
const TString16 caus(mask.get(F_CAUSMAG)); const TString8 caus = mask.get(F_CAUSMAG);
const TCausale_magazzino & c = cached_causale_magazzino(caus); const TCausale_magazzino & c = cached_causale_magazzino(caus);
const long nmovmag = doc.get_long(DOC_MOVMAG); const long nmovmag = doc.get_long(DOC_MOVMAG);
if (nmovmag != 0) if (nmovmag != 0)
{ {
TLocalisamfile rmovmag(LF_RMOVMAG); TLocalisamfile rmovmag(LF_RMOVMAG);
rmovmag.setkey(2); rmovmag.setkey(2);
rmovmag.put(RMOVMAG_CODART, codart); rmovmag.put(RMOVMAG_CODART, codart);
rmovmag.put(RMOVMAG_LIVGIAC, livello); rmovmag.put(RMOVMAG_LIVGIAC, livello);
@ -2180,19 +2180,16 @@ bool qtaart_handler( TMask_field& f, KEY key )
qta *= mask.fconv_qta(); qta *= mask.fconv_qta();
if (doc.tipo().check_giac()) if (doc.tipo().check_giac())
{ {
real giac(mask.get(F_CURGIAC)); const real giac = mask.get(F_CURGIAC);
if (giac < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione giacenza negativa: si desidera continuare?"))
if (giac < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione giacenza negativa, Devo continuare ?")) return false;
} else
if (doc.tipo().check_disp())
{
const real disp = mask.get(F_CURDISP);
if (disp < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione disponibilità negativa: si desidera continuare?"))
return false; return false;
} }
else
if (doc.tipo().check_disp())
{
real disp(mask.get(F_CURDISP));
if (disp < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione disponibilita' negativa, Devo continuare ?"))
return false;
}
} }
} }
} }

View File

@ -628,7 +628,7 @@ static const TString_array& mastro(char tipocf)
return a; return a;
} }
static real calcola_saldo_contabile(const char tipocf, const long codcf, const TDate& datacalc) static real calcola_saldo_contabile(const long codcf, const TDate& datacalc)
{ {
real saldone; real saldone;
@ -644,7 +644,7 @@ static real calcola_saldo_contabile(const char tipocf, const long codcf, const T
datainies.set_month(1); datainies.set_month(1);
} }
const TString_array& a = mastro(tipocf); const TString_array& a = mastro('C');
//per tutti i mastri selezionati va a calcolare il saldo del cliente/fornitore in input //per tutti i mastri selezionati va a calcolare il saldo del cliente/fornitore in input
FOR_EACH_ARRAY_ROW(a, i, row) FOR_EACH_ARRAY_ROW(a, i, row)
@ -669,18 +669,18 @@ static TImporto get_importo(const TISAM_recordset& partite, const char* sezione,
} }
static real calcola_esposto_da_saldaconto (const char tipocf, const long codcf, const TDate& datacalc, const int riskdays) static real calcola_esposto_da_saldaconto (long codcf, const TDate& datacalc)
{ {
const int riskdays = ini_get_int(CONFIG_DITTA, "ve", "FIDO_RISKDAYS");
//estrae le righe partita relative a pagamenti successivi alla data di rischio (e con tipopag >2,<7) //estrae le righe partita relative a pagamenti successivi alla data di rischio (e con tipopag >2,<7)
TString query; TString query;
query << "USE PART\nSELECT BETWEEN(DATAPAG,#DATASBF,0)&&BETWEEN(TIPOPAG,2,7)\n"; query << "USE PART\nSELECT BETWEEN(DATAPAG,#DATASBF,0)&&BETWEEN(TIPOPAG,2,7)\n";
query << "FROM TIPOC=#TIPOCF GRUPPO=0 CONTO=0 SOTTOCONTO=#CODCF ANNO=#ANNO\n"; query << "FROM TIPOC=C GRUPPO=0 CONTO=0 SOTTOCONTO=#CODCF ANNO=#ANNO\n";
query << "TO TIPOC=#TIPOCF GRUPPO=0 CONTO=0 SOTTOCONTO=#CODCF"; query << "TO TIPOC=C GRUPPO=0 CONTO=0 SOTTOCONTO=#CODCF";
TISAM_recordset partite(query); TISAM_recordset partite(query);
TString4 str_tipocf = tipocf;
partite.set_var("#TIPOCF", TVariant(str_tipocf));
partite.set_var("#CODCF", codcf); partite.set_var("#CODCF", codcf);
partite.set_var("#DATACALC", datacalc); partite.set_var("#DATACALC", datacalc);
//data considerante i giorni di rischio ammessi dall'utonto //data considerante i giorni di rischio ammessi dall'utonto
@ -719,8 +719,8 @@ static real calcola_esposto_da_saldaconto (const char tipocf, const long codcf,
} }
//la normalizzazione del totale delle partite va fatta in base al fatto che si parli di 'C'liente o 'F'ornitore //la normalizzazione del totale delle partite va fatta in base al fatto che si parli di 'C'liente o 'F'ornitore
const char sezione_finale = (tipocf == 'C') ? 'A' : 'D'; //const char sezione_finale = (tipocf == 'C') ? 'A' : 'D';
importone_esposto.normalize(sezione_finale); importone_esposto.normalize('A');
//valore in output //valore in output
real esposto; real esposto;
@ -730,69 +730,73 @@ static real calcola_esposto_da_saldaconto (const char tipocf, const long codcf,
} }
static real calcola_fido_da_documenti(const char tipocf, const long codcf, const TDate& datacalc) static real calcola_fido_da_documenti(long codcf, const TDate& datacalc, const TDoc_key& ignore)
{ {
real totalone; real totalone;
TConfig config(CONFIG_DITTA, "ve");
//scansione delle righe FIDO_XX(j)=.. sul paragrafo di configurazione VE per avere i parametri di numerazione/tipo.. // scansione delle righe FIDO_XX(j)=.. sul paragrafo di configurazione VE
//..da considerare // per avere i parametri di numerazione/tipo da considerare
for (int j = 0;;j++) TConfig config(CONFIG_DITTA, "ve");
for (int j = 0; ;j++)
{ {
const TString& num_fido = config.get("FIDO_NUM", NULL, j); const TString& num_fido = config.get("FIDO_NUM", NULL, j);
//se manca la numerazione si può fermare,in quanto non può esistere un tipo senza numerazione //se manca la numerazione si può fermare,in quanto non può esistere un tipo senza numerazione
if (num_fido.blank()) if (num_fido.blank())
break; break;
const TString& tipo_fido = config.get("FIDO_TIP", NULL, j); const TString& tipo_fido = config.get("FIDO_TIP", NULL, j);
const TString4 da_stato_fido = config.get("FIDO_DASTA", NULL, j); const TString& da_stato_fido = config.get("FIDO_DASTA", NULL, j);
const TString4 a_stato_fido = config.get("FIDO_ASTA", NULL, j); const TString& a_stato_fido = config.get("FIDO_ASTA", NULL, j);
const bool residuo_fido = config.get_bool("FIDO_RES", NULL, j); const bool residuo_fido = config.get_bool("FIDO_RES", NULL, j);
//per la numerazione scelta queryzza gli archivi alla ricerca dei documenti che rientrano nei parametri //per la numerazione scelta queryzza gli archivi alla ricerca dei documenti che rientrano nei parametri
TString query; TString query;
query << "USE DOC KEY 2\n"; query << "USE DOC KEY 2\n";
query << "SELECT (CODNUM=#CODNUM)&&(TIPODOC=#TIPODOC)&&(BETWEEN(STATO,#DASTATO,#ASTATO))\n"; query << "SELECT (CODNUM=#CODNUM)&&(TIPODOC=#TIPODOC)&&(BETWEEN(STATO,#DASTATO,#ASTATO))\n";
query << "FROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV='D'\n"; query << "FROM TIPOCF=C CODCF=#CODCF PROVV='D'\n";
query << "TO TIPOCF=#TIPOCF CODCF=#CODCF PROVV='D' ANNO=#ANNO DATADOC=#DATACALC"; query << "TO TIPOCF=C CODCF=#CODCF PROVV='D' ANNO=#ANNO DATADOC=#DATACALC";
TISAM_recordset documenti(query); TISAM_recordset documenti(query);
const char str_tipocf[2] = { tipocf, 0 }; documenti.set_var("#CODCF", codcf);
documenti.set_var("#TIPOCF", TVariant(str_tipocf)); documenti.set_var("#ANNO", (long)datacalc.year());
documenti.set_var("#CODCF", codcf);
documenti.set_var("#ANNO", TVariant((long)datacalc.year()));
documenti.set_var("#DATACALC", datacalc); documenti.set_var("#DATACALC", datacalc);
documenti.set_var("#CODNUM", TVariant(num_fido)); documenti.set_var("#CODNUM", num_fido);
documenti.set_var("#TIPODOC", TVariant(tipo_fido)); documenti.set_var("#TIPODOC", tipo_fido);
documenti.set_var("#DASTATO", TVariant(da_stato_fido)); documenti.set_var("#DASTATO", da_stato_fido);
documenti.set_var("#ASTATO", TVariant(a_stato_fido)); documenti.set_var("#ASTATO", a_stato_fido);
const int items = documenti.items(); const int items = documenti.items();
if (items > 0)
//adesso che ha i documenti che cercava..
for (bool ok = documenti.move_first(); ok; ok = documenti.move_next())
{ {
const TDocumento doc(documenti.cursor()->curr()); const TRectype& curr = documenti.cursor()->curr();
//deve tener conto di eventuali docs in valuta //adesso che ha i documenti che cercava..
TCurrency_documento totdoc(ZERO, doc); for (bool ok = documenti.move_first(); ok; ok = documenti.move_next())
//documento a residuo (tipo ordini)
if (residuo_fido)
{ {
totdoc.set_num(doc.valore(false, true)); if (ignore.full())
{
const TDoc_key k(curr);
if (k == ignore)
continue;
}
const TDocumento doc(curr);
//deve tener conto di eventuali docs in valuta
TCurrency_documento totdoc(ZERO, doc);
//documento a residuo (tipo ordini)
if (residuo_fido)
totdoc.set_num(doc.valore(false, true));
else //documento normale (tipo fattura)
totdoc.set_num(doc.totale_doc());
totdoc.change_to_firm_val();
//le nac vanno con segno rovesciato
if (doc.is_nota_credito())
totdoc = -totdoc;
totalone += totdoc.get_num();
} }
else //documento normale (tipo fattura)
{
totdoc.set_num(doc.totale_doc());
}
totdoc.change_to_firm_val();
//le nac vanno con segno rovesciato
if (doc.is_nota_credito())
totdoc = -totdoc;
totalone += totdoc.get_num();
} }
} }
@ -801,14 +805,14 @@ static real calcola_fido_da_documenti(const char tipocf, const long codcf, const
//metodo per il calcolo fido di un cliente ad una data definita //metodo per il calcolo fido di un cliente ad una data definita
real calcola_fido_cliente (const char tipocf, const long codcf, const TDate& datacalc, const int riskdays) real calcola_fido_cliente (long codcf, const TDate& datacalc, const TDoc_key& ignore)
{ {
//PRIMA PARTE: controlla i movimenti //PRIMA PARTE: controlla i movimenti
real saldo_contabile = calcola_saldo_contabile(tipocf, codcf, datacalc); real saldo_contabile = calcola_saldo_contabile(codcf, datacalc);
//SECONDA PARTE: controlla il saldaconto //SECONDA PARTE: controlla il saldaconto
real esposto_saldaconto = calcola_esposto_da_saldaconto(tipocf, codcf, datacalc, riskdays); real esposto_saldaconto = calcola_esposto_da_saldaconto(codcf, datacalc);
//TERZA PARTE: controlla i documenti //TERZA PARTE: controlla i documenti
real tot_documenti = calcola_fido_da_documenti(tipocf, codcf, datacalc); real tot_documenti = calcola_fido_da_documenti(codcf, datacalc, ignore);
return saldo_contabile + esposto_saldaconto + tot_documenti; return saldo_contabile + esposto_saldaconto + tot_documenti;
} }

View File

@ -118,12 +118,12 @@ public:
bool load(const char* name); bool load(const char* name);
}; };
/////////////////////////////////////////////// ///////////////////////////////////////////////
// Metodi non appartenenti a classi // Metodi non appartenenti a classi
/////////////////////////////////////////////// ///////////////////////////////////////////////
//metodo per il calcolo del fido cliente //metodo per il calcolo del fido cliente
real calcola_fido_cliente (const char tipocf, const long codcf, const TDate& datacalc, const int riskdays); real calcola_fido_cliente (long codcf, const TDate& datacalc, const TDoc_key& ignore);
#endif #endif

View File

@ -18,6 +18,8 @@
#define ATR_QTA 120 #define ATR_QTA 120
#define ATR_UM 121 #define ATR_UM 121
#define ATR_PRESTAZ 122 #define ATR_PRESTAZ 122
#define ATR_CODART 123
#define ATR_DESCART 124
#define ATR_CDC_V1 211 #define ATR_CDC_V1 211
#define ATR_CDC_V2 212 #define ATR_CDC_V2 212

View File

@ -118,6 +118,32 @@ BEGIN
CHECKTYPE NORMAL CHECKTYPE NORMAL
END END
STRING ATR_CODART 20
BEGIN
PROMPT 2 7 "Articolo (CI) "
USE LF_ANAMAG
INPUT CODART ATR_CODART
DISPLAY "Codice@20" CODART
DISPLAY "Descrizione@50" DESCR
OUTPUT ATR_CODART CODART
OUTPUT ATR_DESCART DESCR
CHECKTYPE NORMAL
FLAGS "U"
FIELD S2
END
STRING ATR_DESCART 50 34
BEGIN
PROMPT 40 7 ""
USE LF_ANAMAG KEY 2
INPUT DESCR ATR_DESCART
DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice@20" CODART
COPY OUTPUT ATR_CODART
CHECKTYPE NORMAL
FLAGS "U"
END
LISTBOX ATR_CAMPI 15 LISTBOX ATR_CAMPI 15
BEGIN BEGIN
PROMPT 2 8 "Campo default " PROMPT 2 8 "Campo default "
@ -166,25 +192,25 @@ END
DATE ATR_DISMISS DATE ATR_DISMISS
BEGIN BEGIN
PROMPT 2 11 "Data dismissione " PROMPT 2 10 "Data dismissione "
FIELD D0 FIELD D0
END END
NUMBER ATR_GRUPPOA 3 NUMBER ATR_GRUPPOA 3
BEGIN BEGIN
PROMPT 2 12 "Conto acquisti " PROMPT 2 11 "Conto acquisti "
FIELD I3 FIELD I3
END END
NUMBER ATR_CONTOA 3 NUMBER ATR_CONTOA 3
BEGIN BEGIN
PROMPT 22 12 "" PROMPT 22 11 ""
FIELD I4 FIELD I4
END END
NUMBER ATR_SOTTOA 6 NUMBER ATR_SOTTOA 6
BEGIN BEGIN
PROMPT 28 12 "" PROMPT 28 11 ""
FIELD I5 FIELD I5
USE LF_PCON SELECT SOTTOCONTO!="" USE LF_PCON SELECT SOTTOCONTO!=""
INPUT GRUPPO ATR_GRUPPOA INPUT GRUPPO ATR_GRUPPOA
@ -205,7 +231,7 @@ END
STRING ATR_DESCRCONTOA 50 35 STRING ATR_DESCRCONTOA 50 35
BEGIN BEGIN
PROMPT 39 12 "" PROMPT 39 11 ""
FLAG "U" FLAG "U"
USE LF_PCON KEY 2 SELECT SOTTOCONTO!="" USE LF_PCON KEY 2 SELECT SOTTOCONTO!=""
INPUT DESCR ATR_DESCRCONTOA INPUT DESCR ATR_DESCRCONTOA

View File

@ -39,6 +39,8 @@
#define RSS_SOTTOA 139 #define RSS_SOTTOA 139
#define RSS_DESCRCONTOA 140 #define RSS_DESCRCONTOA 140
#define RSS_CODART 141
#define RSS_DESCART 142
#define RSS_CDC_V1 151 #define RSS_CDC_V1 151
#define RSS_CDC_V2 152 #define RSS_CDC_V2 152

View File

@ -277,6 +277,32 @@ BEGIN
CHECKTYPE NORMAL CHECKTYPE NORMAL
END END
STRING RSS_CODART 20
BEGIN
PROMPT 1 11 "Articolo (CI) "
USE LF_ANAMAG
INPUT CODART RSS_CODART
DISPLAY "Codice@20" CODART
DISPLAY "Descrizione@50" DESCR
OUTPUT RSS_CODART CODART
OUTPUT RSS_DESCART DESCR
CHECKTYPE NORMAL
FLAGS "U"
FIELD S2
END
STRING RSS_DESCART 50 34
BEGIN
PROMPT 40 11 ""
USE LF_ANAMAG KEY 2
INPUT DESCR RSS_DESCART
DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice@20" CODART
COPY OUTPUT RSS_CODART
CHECKTYPE NORMAL
FLAGS "U"
END
LISTBOX RSS_CAMPI 15 LISTBOX RSS_CAMPI 15
BEGIN BEGIN
PROMPT 1 12 "Campo default " PROMPT 1 12 "Campo default "
@ -411,7 +437,7 @@ END
STRING RSS_QUALIFICA 20 STRING RSS_QUALIFICA 20
BEGIN BEGIN
PROMPT 2 21 "Qualfica " PROMPT 2 21 "Qualifica "
FIELD S3[41,60] FIELD S3[41,60]
END END