Gestione contratti nolo

git-svn-id: svn://10.65.10.50/branches/R_10_00@22834 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-03-25 13:46:24 +00:00
parent 37a279b6a0
commit 2c285b1ca8
10 changed files with 2590 additions and 1560 deletions

View File

@ -27,10 +27,24 @@
#define F_NA_RIFA_TIP 232
#define F_NA_RIFA_SPE 233
// Aggiunte il 17/01/2012
#define F_CODTIPO_FAT2 241
#define F_DESCRTIPO_FAT2 242
//------------------------------
#define F_CO_NOLO_NUM 235
#define F_CO_NOLO_TIP 237
#define F_CO_NOLO_SPE 238
#define F_NA_NOLO_NUM 240
#define F_NA_NOLO_TIP 242
#define F_NA_NOLO_SPE 243
#define F_FT_NOLO_TIP 244
#define F_FT_NOLO_SPE 245
// Aggiunte il 17/01/2012
#define F_CODTIPO_FAT2 246
#define F_DESCRTIPO_FAT2 247
// Aggiunte il 17/03/2013
#define F_CODPAG_FAT 248
#define F_CODPAG_NAC 249
//==============================
//pagina 2

File diff suppressed because it is too large Load Diff

View File

@ -17,6 +17,56 @@
//////////////////////////////////////////////
// Maschera
//////////////////////////////////////////////
class TDocumenti_premio_query_msk : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TDocumenti_premio_query_msk() : TAutomask("ha0300b") {}
};
bool TDocumenti_premio_query_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_TIPOCONTR:
if (e == fe_init || e == fe_modify)
{
//all'inizio deve proporre una lista dei possibili numerazioni e tipi che stanno in configurazione
TConfig config(CONFIG_DITTA, "ha");
TString4 codnum, tipodoc;
switch (o.get()[0])
{
case 'A':
codnum = config.get("CoAntNum");
tipodoc = config.get("CoAntTip");
break;
case 'N':
codnum = config.get("CoNoloNum");
tipodoc = config.get("CoNoloTip");
break;
case 'R':
codnum = config.get("CoRifaNum");
tipodoc = config.get("CoRifaTip");
break;
default:
codnum = config.get("CoPostNum");
tipodoc = config.get("CoPostTip");
break;
}
set(F_CODNUM, codnum);
set(F_TIPODOC, tipodoc);
}
default:
break;
}
return true;
}
class TDocumenti_premio_msk : public TAutomask
{
protected:
@ -27,13 +77,9 @@ protected:
public:
const TString& find_contabilizzazione() const;
TDocumenti_premio_msk();
TDocumenti_premio_msk(const char* name = "ha0300a") : TAutomask(name) {}
};
TDocumenti_premio_msk::TDocumenti_premio_msk() : TAutomask("ha0300a")
{
}
//metodo standard per far funzionare il shift+f12 in modo da poter cambiare lo stato
bool TDocumenti_premio_msk::on_key(KEY key)
{
@ -142,33 +188,6 @@ bool TDocumenti_premio_msk::on_field_event(TOperable_field& o, TField_event e, l
{
switch (o.dlg())
{
case F_TIPOCONTR:
if (e == fe_init || e == fe_modify)
{
//all'inizio deve proporre una lista dei possibili numerazioni e tipi che stanno in configurazione
TConfig config(CONFIG_DITTA, "ha");
TString4 codnum, tipodoc;
switch (o.get()[0])
{
case 'A':
codnum = config.get("CoAntNum");
tipodoc = config.get("CoAntTip");
break;
case 'R':
codnum = config.get("CoRifaNum");
tipodoc = config.get("CoRifaTip");
break;
default:
codnum = config.get("CoPostNum");
tipodoc = config.get("CoPostTip");
break;
}
set(F_CODNUM, codnum);
set(F_TIPODOC, tipodoc);
}
break;
case S_CODART:
if ((e == fe_init || e == fe_close) && !o.empty())
{
@ -226,16 +245,20 @@ bool TDocumenti_premio_msk::on_field_event(TOperable_field& o, TField_event e, l
//////////////////////////////////////////////
// Applicazione
//////////////////////////////////////////////
class TDocumenti_premio : public TRelation_application
{
TRelation* _rel;
TDocumenti_premio_msk* _msk;
TRelation* _rel; // Relazione principale su DOC
TDocumenti_premio_query_msk* _qmsk; // Maschera query
TDocumenti_premio_msk* _cmsk; // Maschera contratti "normali"
TDocumenti_premio_msk* _nmsk; // Maschera contratti noleggio
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual TMask* get_mask(int) {return _msk;}
virtual TRelation* get_relation() const {return _rel;}
virtual TMask* get_mask(int m);
virtual bool changing_mask(int) { return true; }
virtual TRelation* get_relation() const { return _rel; }
void write_rows(const TMask& m);
void read_rows(TMask& m);
@ -251,42 +274,46 @@ protected:
virtual void init_modify_mode(TMask& m);
};
TMask* TDocumenti_premio::get_mask(int m)
{
if (m < MODE_INS)
return _qmsk;
const TString& tipo = _qmsk->get(F_TIPOCONTR);
return tipo == "N" ? _nmsk : _cmsk;
}
//cerca il primo numero valido per NDOC
bool TDocumenti_premio::get_next_key(TToken_string& key)
{
long n = 0;
const TMask& m = curr_mask();
const char provv = m.get(F_PROVV)[0];
const int anno = m.get_int(F_ANNO);
const TString& codnum = m.get(F_CODNUM);
TLocalisamfile doc(LF_DOC);
TRectype& curr = doc.curr();
const char provv = _msk->get(F_PROVV)[0];
const int anno = _msk->get_int(F_ANNO);
const TString4 codnum = _msk->get(F_CODNUM);
curr.put(DOC_PROVV, provv);
curr.put(DOC_ANNO, anno);
curr.put(DOC_PROVV, provv);
curr.put(DOC_ANNO, anno);
curr.put(DOC_CODNUM, codnum);
curr.put(DOC_NDOC, 9999999L);
curr.put(DOC_NDOC, 9999999L);
const int err = doc.read(_isgreat);
long n = 1;
const int err = doc.read(_isgreat);
if (err != _isemptyfile)
{
if (err == NOERR)
doc.prev();
if (curr.get_char(DOC_PROVV) == provv && curr.get_int(DOC_ANNO) == anno && curr.get(DOC_CODNUM) == codnum)
n = curr.get_long(DOC_NDOC);
n += curr.get_long(DOC_NDOC);
}
n++;
key.cut(0);
key.add(F_PROVV); key.add(provv);
key.add(F_ANNO); key.add(anno);
key.add(F_CODNUM); key.add(codnum);
key.add(F_NDOC); key.add(n);
key.add(F_PROVV); key.add(provv);
key.add(F_ANNO); key.add(anno);
key.add(F_CODNUM); key.add(codnum);
key.add(F_NDOC); key.add(n);
return n > 0;
return true;
}
void TDocumenti_premio::read_rows(TMask& m)
@ -323,7 +350,7 @@ void TDocumenti_premio::read_rows(TMask& m)
TToken_string& row = sheet.row(-1); //aggiunge una riga vuota
for (int j = sm.fields()-1; j >= 0; j--) //giro su tutti i campi della maschera di riga...
{
TMask_field& mf = sm.fld(j); //aggiunge solo quelli che hanno un field
const TMask_field& mf = sm.fld(j); //aggiunge solo quelli che hanno un field
if ((mf.field() != NULL) && (mf.dlg() > 100)) //> 100 per evitare errori sui campi dlg_null
{
const int idx = sheet.cid2index(mf.dlg());
@ -334,12 +361,15 @@ void TDocumenti_premio::read_rows(TMask& m)
//..in modalità fe_init)
sheet.check_row(sheet.items()-1);
}
else if (tipo == HARDY_TIPORIGA_SOMMA)//se invece è la riga con le somme anticipate/maturate (solo 1 per contratto!) -> va messa in testata
else if (tipo == HARDY_TIPORIGA_SOMMA) //se invece è la riga con le somme anticipate/maturate (solo 1 per contratto!) -> va messa in testata
{
const real anticipato = rec.get(RCA_2_ANTICIPATO);
const real maturato = rec.get(RCA_2_RESO_STORICO);
m.set(F_ANTICIPATO, anticipato);
m.set(F_RESO_STORICO, maturato);
if (m.id2pos(F_ANTICIPATO) >= 0)
{
const real anticipato = rec.get(RCA_2_ANTICIPATO);
const real maturato = rec.get(RCA_2_RESO_STORICO);
m.set(F_ANTICIPATO, anticipato);
m.set(F_RESO_STORICO, maturato);
}
}
} //for (int i = 1;...
}
@ -348,17 +378,16 @@ void TDocumenti_premio::read_rows(TMask& m)
void TDocumenti_premio::write_rows(const TMask& m)
{
//chiave delle righe basata sui campi di testata
const char provv = m.get(F_PROVV)[0];
const int anno = m.get_int(F_ANNO);
const char provv = m.get(F_PROVV)[0];
const int anno = m.get_int(F_ANNO);
const TString& codnum = m.get(F_CODNUM);
const long ndoc = m.get_long(F_NDOC);
const long ndoc = m.get_long(F_NDOC);
TRectype* key_rec = new TRectype(LF_RIGHEDOC);
key_rec->put(RDOC_PROVV, provv);
key_rec->put(RDOC_ANNO, anno);
key_rec->put(RDOC_PROVV, provv);
key_rec->put(RDOC_ANNO, anno);
key_rec->put(RDOC_CODNUM, codnum);
key_rec->put(RDOC_NDOC, ndoc);
key_rec->put(RDOC_NDOC, ndoc);
//recordarray con le righe che rispondono alla chiave di testata key_rec
TRecord_array righedoc(LF_RIGHEDOC, RDOC_NRIGA);
@ -374,7 +403,7 @@ void TDocumenti_premio::write_rows(const TMask& m)
TRectype& rec = righedoc.row(i+1, true); //record con l'elemento riga dell'array
for (int i = sm.fields()-1; i >= 0; i--) //giro su tutti i campi della maschera di riga...
{
TMask_field& mf = sm.fld(i); //aggiunge solo quelli che hanno un field
const TMask_field& mf = sm.fld(i); //aggiunge solo quelli che hanno un field
if ((mf.dlg() > 100) && (mf.field() != NULL)) //> 100 per evitare errori sui campi dlg_null
{
const int idx = sheet.cid2index(mf.dlg());
@ -383,41 +412,44 @@ void TDocumenti_premio::write_rows(const TMask& m)
}
rec.put(RDOC_TIPORIGA, HARDY_TIPORIGA_MERCE);
}
//salva la riga di tipo somme anticipate/rimborsate (H02) che in realtà è in testata
//questo vale solo per i contratti di Anticip/Rifatturazione (lo fa solo se l'anticipo è > 0)
// salva la riga di tipo somme anticipate/rimborsate (H02) che in realtà è in testata
// questo vale solo per i contratti di Anticip/Rifatturazione (lo fa solo se l'anticipo è > 0)
const char tipo_contr = m.get(F_TIPOCONTR)[0];
const real anticipato = m.get_real(F_ANTICIPATO);
if (anticipato > ZERO && (tipo_contr == 'A' || tipo_contr == 'R'))
if (tipo_contr == 'A' || tipo_contr == 'R')
{
const int righedoc_items = righedoc.rows();
TRectype& last_rec = righedoc.row(righedoc_items + 1, true);
const real maturato = m.get_real(F_RESO_STORICO);
last_rec.put(RCA_2_ANTICIPATO, anticipato);
last_rec.put(RCA_2_RESO_STORICO, maturato);
last_rec.put(RDOC_TIPORIGA, HARDY_TIPORIGA_SOMMA);
last_rec.put(RDOC_QTA, 1);
//panegirico sul codice iva (che ci va sennò col cavolo che si riesce a contabilizzare il contratto)
TString80 codspp;
switch (tipo_contr)
const real anticipato = m.get_real(F_ANTICIPATO);
if (anticipato > ZERO)
{
case 'A': codspp = ini_get_string(CONFIG_DITTA, "ha", "CoAntSpe"); break;
case 'R': codspp = ini_get_string(CONFIG_DITTA, "ha", "CoRifaSpe"); break;
default: break;
}
last_rec.put(RDOC_CODART, codspp);
const int righedoc_items = righedoc.rows();
TRectype& last_rec = righedoc.row(righedoc_items + 1, true);
const real maturato = m.get_real(F_RESO_STORICO);
last_rec.put(RCA_2_ANTICIPATO, anticipato);
last_rec.put(RCA_2_RESO_STORICO, maturato);
last_rec.put(RDOC_TIPORIGA, HARDY_TIPORIGA_SOMMA);
last_rec.put(RDOC_QTA, 1);
//cerca se il cliente ha un'iva speciale (1 cliente su 1E+6, ma tant'è...)
TCli_for clifo(m.get(F_TIPOCF)[0], m.get_long(F_CODCF));
TString4 codiva(clifo.vendite().get(CFV_ASSFIS));
//per i restanti 1E+6 - 1 clienti...
if (codiva.blank())
codiva = cache().get("SPP", codspp, "S3");
last_rec.put(RDOC_CODIVA, codiva);
//panegirico sul codice iva (che ci va sennò col cavolo che si riesce a contabilizzare il contratto)
TString80 codspp;
switch (tipo_contr)
{
case 'A': codspp = ini_get_string(CONFIG_DITTA, "ha", "CoAntSpe"); break;
case 'R': codspp = ini_get_string(CONFIG_DITTA, "ha", "CoRifaSpe"); break;
default: break;
}
last_rec.put(RDOC_CODART, codspp);
//cerca se il cliente ha un'iva speciale (1 cliente su 1E+6, ma tant'è...)
TCli_for clifo(m.get(F_TIPOCF)[0], m.get_long(F_CODCF));
TString4 codiva(clifo.vendite().get(CFV_ASSFIS));
//per i restanti 1E+6 - 1 clienti...
if (codiva.blank())
codiva = cache().get("SPP", codspp, "S3");
last_rec.put(RDOC_CODIVA, codiva);
}
}
//e alla fine della fiera scrive tutto ufficialmente
righedoc.rewrite();
}
@ -425,8 +457,6 @@ void TDocumenti_premio::write_rows(const TMask& m)
void TDocumenti_premio::init_query_mode(TMask& m)
{
m.disable(F_STATO);
m.disable(DLG_ELABORA);
}
void TDocumenti_premio::init_insert_mode(TMask& m)
@ -434,21 +464,30 @@ void TDocumenti_premio::init_insert_mode(TMask& m)
//alla creazione di un nuovo contratto lo stato viene posto = 2
//questo x' il contratto è già stato stampato dal cliente in fase di stesura
m.set(F_STATO, 2);
m.disable(DLG_ELABORA);
if (m.id2pos(DLG_ELABORA) >= 0)
m.disable(DLG_ELABORA);
const TString& codpag = ini_get_string(CONFIG_DITTA, "ha", "CodPagNac", "015");
m.set(F_CODPAG, codpag);
}
void TDocumenti_premio::init_modify_mode(TMask& m)
{
m.disable(F_TIPOCONTR); //non si può cambiare il tipo contratto una volta stabilito sennò non funziona + un cazzo
m.enable(DLG_ELABORA, _msk->find_contabilizzazione().full());
TDocumenti_premio_msk& dpm = (TDocumenti_premio_msk&)m;
dpm.disable(F_TIPOCONTR); //non si può cambiare il tipo contratto una volta stabilito sennò non funziona + un cazzo
if (m.id2pos(DLG_ELABORA) >= 0)
dpm.enable(DLG_ELABORA, dpm.find_contabilizzazione().full());
}
bool TDocumenti_premio::remove()
{
TSheet_field& righe = _msk->sfield(F_RIGHE);
_msk->reset(F_ANTICIPATO);
TDocumenti_premio_msk& dpm = (TDocumenti_premio_msk&)curr_mask();
TSheet_field& righe = dpm.sfield(F_RIGHE);
if (dpm.id2pos(F_ANTICIPATO) >= 0)
dpm.reset(F_ANTICIPATO);
righe.destroy();
write_rows(*_msk);
write_rows(dpm);
return TRelation_application::remove();
}
@ -478,15 +517,19 @@ int TDocumenti_premio::read(TMask& m)
bool TDocumenti_premio::user_create()
{
_rel = new TRelation(LF_DOC);
_msk = new TDocumenti_premio_msk;
_rel = new TRelation(LF_DOC);
_qmsk = new TDocumenti_premio_query_msk;
_cmsk = new TDocumenti_premio_msk("ha0300a");
_nmsk = new TDocumenti_premio_msk("ha0300c");
return true;
}
bool TDocumenti_premio::user_destroy()
{
delete _nmsk;
delete _cmsk;
delete _qmsk;
delete _rel;
delete _msk;
return true;
}

View File

@ -34,6 +34,13 @@
#define F_ANTICIPATO 231
#define F_RESO_STORICO 232
#define F_RESIDUO 233
#define F_FREQUENZA 234
#define F_IMPRATA 235
#define F_NRATE 236
#define F_EMESSE 237
#define F_DATARECESSO 238
#define F_RIGHE 500 //questo va messo 500 sennò ve0 si incazza e non funziona più

View File

@ -1,500 +1,497 @@
#include "ha0300a.h"
TOOLBAR "" 0 0 0 2
#include <filebar.h>
BUTTON DLG_NULL 2 2
BEGIN
PROMPT -1 1 ""
END
BUTTON DLG_ELABORA 2 2
BEGIN
PROMPT 3 1 "Contabilizza"
PICTURE TOOL_ELABORA
END
#include <cancelbar.h>
ENDPAGE
PAGE "Gestione contratti premio" -1 -1 78 23
GROUPBOX DLG_NULL 78 14
BEGIN
PROMPT 1 0 ""
END
TEXT DLG_NULL
BEGIN
PROMPT 1 1 "@bTipo contratto"
END
RADIOBUTTON F_TIPOCONTR 1 70
BEGIN
PROMPT 16 0 ""
ITEM "A|Anticipo"
MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@|CLEAR,F_CODLIS
ITEM "P|Posticipo"
MESSAGE ENABLE,F_DATAFCOMP|CLEAR,1@|ENABLE,F_CODLIS
ITEM "R|Rifatturazione"
MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@|CLEAR,F_CODLIS
FLAGS "GZ"
KEY 1
END
STRING F_CODNUM 4
BEGIN
PROMPT 102 101 "Cod. num. "
FIELD CODNUM
USE %NUM KEY 1
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
KEY 1
END
STRING F_TIPODOC 4
BEGIN
FIELD TIPODOC
PROMPT 120 101 "Tipo doc. "
USE %TIP KEY 1
INPUT CODTAB F_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
END
LIST F_TIPOCF 9
BEGIN
PROMPT 130 101 ""
FIELD TIPOCF
IT "C|Cliente"
FLAGS "D"
END
NUMBER F_CODCF 6
BEGIN
PROMPT 2 2 "Cliente "
WARNING "Cliente assente"
HELP "Codice del cliente del documento"
FIELD CODCF
USE LF_CLIFO SELECT (GRUPPO=4) && (CONTO=201) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT CODCF F_CODCF
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
OUTPUT F_CODCF CODCF
OUTPUT F_DESCF RAGSOC
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
END
STRING F_DESCF 50
BEGIN
WARNING "Cliente assente"
HELP "Ragione sociale del cliente del documento"
PROMPT 24 2 ""
USE LF_CLIFO KEY 2 SELECT (GRUPPO=4) && (CONTO=201) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT RAGSOC F_DESCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Codice" CODCF
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
COPY OUTPUT F_CODCF
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
END
NUMBER F_CODCFATT 6
BEGIN
PROMPT 2 3 "Cli. fatt."
WARNING "Inserire un codice >= 200000"
HELP "Codice del cliente cui fatturare >= 200000"
FIELD DOC2
USE LF_CLIFO SELECT (GRUPPO=4) && (CONTO=101) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT CODCF F_CODCFATT
COPY DISPLAY F_CODCF
OUTPUT F_CODCFATT CODCF
OUTPUT F_DESCFATT RAGSOC
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
END
STRING F_DESCFATT 50
BEGIN
WARNING "Cliente assente"
HELP "Ragione sociale del cliente cui fatturare"
PROMPT 24 3 ""
USE LF_CLIFO KEY 2 SELECT (GRUPPO=4) && (CONTO=101) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT RAGSOC F_DESCFATT
COPY DISPLAY F_DESCF
COPY OUTPUT F_CODCFATT
CHECKTYPE SEARCH
ADD RUN cg0 -1 C
END
LIST F_PROVV 1
BEGIN
PROMPT 140 101 ""
ITEM "D|D"
FIELD PROVV
FLAGS "D"
KEY 1
END
NUMBER F_ANNO 4
BEGIN
PROMPT 2 4 "Esercizio "
USE ESC
INPUT CODTAB F_ANNO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_ANNO CODTAB
FIELD ANNO
CHECKTYPE REQUIRED
FLAGS "A"
KEY 1
END
NUMBER F_NDOC 6
BEGIN
PROMPT 24 4 "N. contr. premi "
USE LF_DOC SELECT BETWEEN(CODCF,#F_CODCF,#F_CODCF)
JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF
INPUT CODNUM F_CODNUM SELECT
INPUT PROVV F_PROVV SELECT
INPUT ANNO F_ANNO SELECT
INPUT NDOC F_NDOC
DISPLAY "Numero" NDOC
DISPLAY "Data doc.@10" DATADOC
DISPLAY "Inizio@10" DATACOMP
DISPLAY "Fine@10" DATAFCOMP
DISPLAY "Tipo" TIPODOC
DISPLAY "Agente" CODAG
DISPLAY "Cliente" CODCF
DISPLAY "Ragione sociale@50" LF_CLIFO->RAGSOC
OUPUT F_NDOC NDOC
FIELD NDOC
KEY 1
CHECKTYPE REQUIRED
END
DATE F_DATADOC
BEGIN
PROMPT 50 4 "Data "
FIELD DATADOC
END
STRING F_STATO 1
BEGIN
PROMPT 69 4 "Stato "
FIELD STATO
USE %STD KEY 1
INPUT CODTAB F_STATO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_STATO CODTAB
CHECKTYPE NORMAL
FLAGS "DG"
END
STRING F_CODCONTR 3
BEGIN
PROMPT 2 5 "Listino cliente "
USE CONDV
INPUT TIPO "C"
INPUT TIPOCF F_TIPOCF SELECT
INPUT CODCF F_CODCFATT SELECT
INPUT COD F_CODCONTR
DISPLAY "Codice" COD
DISPLAY "Descrizione@50" DESCR
DISPLAY "Inizio validita'" VALIN
DISPLAY "Fine validità" VALFIN
OUTPUT F_CODCONTR COD
OUTPUT F_DESCONTR DESCR
FIELD CODCONT
CHECKTYPE NORMAL
END
STRING F_DESCONTR 50
BEGIN
PROMPT 26 5 ""
FLAGS "DG"
END
STRING F_CODLIS 3
BEGIN
PROMPT 2 6 "Listino standard "
USE CONDV
INPUT TIPO "L"
INPUT COD F_CODLIS
DISPLAY "Codice" COD
DISPLAY "Descrizione@50" DESCR
DISPLAY "Inizio validita'" VALIN
DISPLAY "Fine validità" VALFIN
OUTPUT F_CODLIS COD
OUTPUT F_DESLIS DESCR
FIELD CODLIST
CHECKTYPE NORMAL
END
STRING F_DESLIS 50
BEGIN
PROMPT 26 6 ""
FLAGS "DG"
END
STRING F_CODAG 5
BEGIN
PROMPT 2 7 "Agente "
FIELD CODAG
USE LF_AGENTI
INPUT CODAGE F_CODAG
DISPLAY "Codice@8R" CODAGE
DISPLAY "Descrizione@50" RAGSOC
OUTPUT F_CODAG CODAGE
OUTPUT F_DESCRAG RAGSOC
CHECKTYPE NORMAL
FLAGS "UZ"
END
STRING F_DESCRAG 50
BEGIN
PROMPT 24 7 ""
USE LF_AGENTI KEY 2
INPUT RAGSOC F_DESCRAG
DISPLAY "Descrizione@50" RAGSOC
DISPLAY "Codice@8R" CODAGE
COPY OUTPUT F_CODAG
CHECKTYPE NORMAL
END
STRING F_CODPAG 4
BEGIN
PROMPT 2 8 "Cond. pag. "
FIELD CODPAG
USE %CPG
INPUT CODTAB F_CODPAG
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODPAG CODTAB
OUTPUT F_DESCRPAG S0
CHECKTYPE NORMAL
FLAGS "U"
HE "Inserisci il codice del tipo di pagamento"
WA "Codice tipo pagamento non trovato"
ADD RUN ba3 -6
END
STRING F_DESCRPAG 50
BEGIN
PROMPT 24 8 ""
USE %CPG KEY 2
INPUT S0 F_DESCRPAG
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_CODPAG
CHECKTYPE NORMAL
HE "Inserisci il codice del tipo di pagamento"
WA "Codice tipo pagamento non trovato"
ADD RUN ba3 -6
END
TEXT DLG_NULL
BEGIN
PROMPT 2 9 "Validita':"
END
DATE F_DATACOMP
BEGIN
PROMPT 13 9 "Inizio "
FIELD DATACOMP
CHECKTYPE REQUIRED
END
DATE F_DATAFCOMP
BEGIN
PROMPT 33 9 "Fine "
FIELD DATAFCOMP
END
NUMBER F_NUMREG 7
BEGIN
PROMPT 54 9 "N.reg.CG "
FIELD NUMREG
FLAGS "DUG"
MESSAGE EMPTY DISABLE,F_COLLEGA
MESSAGE ENABLE,F_COLLEGA
END
BUTTON F_COLLEGA 2 1
BEGIN
PROMPT 74 9 "CG mov."
PICTURE BMP_DARROWR
FLAGS "D"
END
TEXT DLG_NULL
BEGIN
PROMPT 2 10 "@bRiferimenti contratto"
END
STRING F_DOCRIF 12
BEGIN
PROMPT 31 10 "Codice "
FIELD DOC1
END
DATA F_DATA_DOCRIF
BEGIN
PROMPT 55 10 "Data "
FIELD DATADOCRIF
END
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 2 11 "@bSomme anticipate/restituite"
END
CURRENCY F_ANTICIPATO
BEGIN
PROMPT 3 12 "Anticipato "
FLAGS "U"
GROUP 1
END
CURRENCY F_RESO_STORICO
BEGIN
PROMPT 38 12 "Restituito "
GROUP 1
END
SPREADSHEET F_RIGHE
BEGIN
PROMPT 2 14 ""
ITEM "Codice Articolo@20"
ITEM "Descrizione@40"
ITEM "UM@2"
ITEM "Prezzo listino"
ITEM "Premio@10"
ITEM "Ns. carico"
ITEM "Bonus@10"
END
ENDPAGE
ENDMASK
/////////////////////////////////////////
//maschera di riga
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 2 1 ""
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 3 1 ""
END
ENDPAGE
PAGE "Riga contratto premi Hardy" -1 -1 76 12
STRING S_CODART 20
BEGIN
PROMPT 1 1 "Articolo "
USE LF_ANAMAG KEY 1
INPUT CODART S_CODART
DISPLAY "Codice@20" CODART
DISPLAY "Descrizione@50" DESCR
OUTPUT S_CODART CODART
OUTPUT S_DESCR DESCR
CHECKTYPE REQUIRED
WARNING "Articolo assente"
FLAGS "U"
FIELD CODART
ADD RUN ve2 -3
END
STRING S_DESCR 50
BEGIN
PROMPT 1 2 "Descrizione "
USE LF_ANAMAG KEY 2
INPUT DESCR S_DESCR
DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice@20" CODART
COPY OUTPUT S_CODART
FIELD DESCR
CHECKTYPE SEARCH
END
STRING S_UMQTA 2
BEGIN
PROMPT 1 3 "U.M. "
USE LF_UMART KEY 2
JOIN %UMS INTO CODTAB=UM
INPUT CODART S_CODART SELECT
INPUT UM S_UMQTA
DISPLAY "Codice@20" UM
DISPLAY "Descrizione@50" %UMS->S0
OUTPUT S_UMQTA UM
FIELD UMQTA
FLAGS "U"
CHECKTYPE REQUIRED
END
GROUPBOX DLG_NULL 74 6
BEGIN
PROMPT 1 4 "@bValori"
END
CURRENCY S_PREZZO
BEGIN
PROMPT 2 5 "Prezzo listino "
FLAGS "UDG"
FIELD PREZZO
END
CURRENCY S_PREMIO
BEGIN
PROMPT 2 6 "Premio "
FLAGS "U"
FIELD QTAGG1
END
CURRENCY S_RICARICO
BEGIN
PROMPT 2 7 "A Ns. carico "
FLAGS "U"
FIELD QTAGG2
END
CURRENCY S_MATURATO
BEGIN
PROMPT 2 8 "Bonus maturato "
FLAGS "DU"
FIELD QTAGG5
END
ENDPAGE
#include "ha0300a.h"
TOOLBAR "" 0 0 0 2
#include <filebar.h>
BUTTON DLG_NULL 2 2
BEGIN
PROMPT -1 1 ""
END
BUTTON DLG_ELABORA 2 2
BEGIN
PROMPT 3 1 "Contabilizza"
PICTURE TOOL_ELABORA
END
#include <cancelbar.h>
ENDPAGE
PAGE "Gestione contratti premio" -1 -1 78 23
GROUPBOX DLG_NULL 78 15
BEGIN
PROMPT 1 0 ""
END
LIST F_TIPOCONTR 1 20
BEGIN
PROMPT 2 1 "@bTipo contratto premio "
ITEM "A|Anticipo"
MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@|CLEAR,F_CODLIS
ITEM "P|Posticipo"
MESSAGE ENABLE,F_DATAFCOMP|CLEAR,1@|ENABLE,F_CODLIS
ITEM "R|Rifatturazione"
MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@|CLEAR,F_CODLIS
// ITEM "N|Noleggio"
FLAGS "DGZ"
END
STRING F_CODNUM 4
BEGIN
PROMPT 102 101 "Cod. num. "
FIELD CODNUM
USE %NUM KEY 1
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
KEY 1
END
STRING F_TIPODOC 4
BEGIN
FIELD TIPODOC
PROMPT 120 101 "Tipo doc. "
USE %TIP KEY 1
INPUT CODTAB F_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
END
LIST F_TIPOCF 9
BEGIN
PROMPT 130 101 ""
FIELD TIPOCF
IT "C|Cliente"
FLAGS "D"
END
NUMBER F_CODCF 6
BEGIN
PROMPT 2 2 "Cliente "
WARNING "Cliente assente"
HELP "Codice del cliente del documento"
FIELD CODCF
USE LF_CLIFO SELECT SOSPESO!="X"
INPUT TIPOCF "C"
INPUT CODCF F_CODCF
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
OUTPUT F_CODCF CODCF
OUTPUT F_DESCF RAGSOC
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
END
STRING F_DESCF 50
BEGIN
WARNING "Cliente assente"
HELP "Ragione sociale del cliente del documento"
PROMPT 24 2 ""
USE LF_CLIFO KEY 2 SELECT SOSPESO!="X"
INPUT TIPOCF "C"
INPUT RAGSOC F_DESCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Codice" CODCF
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
COPY OUTPUT F_CODCF
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
END
NUMBER F_CODCFATT 6
BEGIN
PROMPT 2 3 "Cli. fatt."
USE LF_CLIFO SELECT (GRUPPO=4)&&(CONTO=101)&&(SOSPESO!="X")
INPUT TIPOCF "C"
INPUT CODCF F_CODCFATT
COPY DISPLAY F_CODCF
OUTPUT F_CODCFATT CODCF
OUTPUT F_DESCFATT RAGSOC
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
FIELD DOC2
WARNING "Inserire un codice >= 200000"
HELP "Codice del cliente cui fatturare >= 200000"
END
STRING F_DESCFATT 50
BEGIN
PROMPT 24 3 ""
USE LF_CLIFO KEY 2 SELECT (GRUPPO=4)&&(CONTO=101)&&(SOSPESO!="X")
INPUT TIPOCF "C"
INPUT RAGSOC F_DESCFATT
COPY DISPLAY F_DESCF
COPY OUTPUT F_CODCFATT
CHECKTYPE SEARCH
ADD RUN cg0 -1 C
WARNING "Cliente assente"
HELP "Ragione sociale del cliente cui fatturare"
END
LIST F_PROVV 1
BEGIN
PROMPT 140 101 ""
ITEM "D|D"
FIELD PROVV
FLAGS "D"
KEY 1
END
NUMBER F_ANNO 4
BEGIN
PROMPT 2 4 "Esercizio "
FIELD ANNO
CHECKTYPE REQUIRED
FLAGS "AD"
KEY 1
END
NUMBER F_NDOC 6
BEGIN
PROMPT 24 4 "N. contr. premi "
FIELD NDOC
CHECKTYPE REQUIRED
KEY 1
FLAGS "D"
END
DATE F_DATADOC
BEGIN
PROMPT 50 4 "Data "
FIELD DATADOC
END
STRING F_STATO 1
BEGIN
PROMPT 69 4 "Stato "
FIELD STATO
USE %STD KEY 1
INPUT CODTAB F_STATO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_STATO CODTAB
CHECKTYPE NORMAL
FLAGS "DG"
END
STRING F_CODCONTR 3
BEGIN
PROMPT 2 5 "Listino cliente "
USE CONDV
INPUT TIPO "C"
INPUT TIPOCF F_TIPOCF SELECT
INPUT CODCF F_CODCFATT SELECT
INPUT COD F_CODCONTR
DISPLAY "Codice" COD
DISPLAY "Descrizione@50" DESCR
DISPLAY "Inizio validità" VALIN
DISPLAY "Fine validità" VALFIN
OUTPUT F_CODCONTR COD
OUTPUT F_DESCONTR DESCR
FIELD CODCONT
CHECKTYPE NORMAL
END
STRING F_DESCONTR 50
BEGIN
PROMPT 26 5 ""
FLAGS "DG"
END
STRING F_CODLIS 3
BEGIN
PROMPT 2 6 "Listino standard "
USE CONDV
INPUT TIPO "L"
INPUT COD F_CODLIS
DISPLAY "Codice" COD
DISPLAY "Descrizione@50" DESCR
DISPLAY "Inizio validità" VALIN
DISPLAY "Fine validità" VALFIN
OUTPUT F_CODLIS COD
OUTPUT F_DESLIS DESCR
FIELD CODLIST
CHECKTYPE NORMAL
END
STRING F_DESLIS 50
BEGIN
PROMPT 26 6 ""
FLAGS "DG"
END
STRING F_CODAG 5
BEGIN
PROMPT 2 7 "Agente "
FIELD CODAG
USE LF_AGENTI
INPUT CODAGE F_CODAG
DISPLAY "Codice@8R" CODAGE
DISPLAY "Descrizione@50" RAGSOC
OUTPUT F_CODAG CODAGE
OUTPUT F_DESCRAG RAGSOC
CHECKTYPE NORMAL
FLAGS "UZ"
END
STRING F_DESCRAG 50
BEGIN
PROMPT 24 7 ""
USE LF_AGENTI KEY 2
INPUT RAGSOC F_DESCRAG
DISPLAY "Descrizione@50" RAGSOC
DISPLAY "Codice@8R" CODAGE
COPY OUTPUT F_CODAG
CHECKTYPE NORMAL
END
STRING F_CODPAG 4
BEGIN
PROMPT 2 8 "Cond. pag. "
FIELD CODPAG
USE %CPG
INPUT CODTAB F_CODPAG
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODPAG CODTAB
OUTPUT F_DESCRPAG S0
CHECKTYPE NORMAL
FLAGS "U"
HE "Inserisci il codice del tipo di pagamento"
WA "Codice tipo pagamento non trovato"
ADD RUN ba3 -6
END
STRING F_DESCRPAG 50
BEGIN
PROMPT 24 8 ""
USE %CPG KEY 2
INPUT S0 F_DESCRPAG
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_CODPAG
CHECKTYPE NORMAL
HE "Inserisci il codice del tipo di pagamento"
WA "Codice tipo pagamento non trovato"
ADD RUN ba3 -6
END
TEXT DLG_NULL
BEGIN
PROMPT 2 9 "@bValidità: "
END
DATE F_DATACOMP
BEGIN
PROMPT 13 9 "Inizio "
FIELD DATACOMP
CHECKTYPE REQUIRED
END
DATE F_DATAFCOMP
BEGIN
PROMPT 33 9 "Fine "
FIELD DATAFCOMP
END
NUMBER F_NUMREG 7
BEGIN
PROMPT 54 9 "N.reg.CG "
FIELD NUMREG
FLAGS "DUG"
MESSAGE EMPTY DISABLE,F_COLLEGA
MESSAGE ENABLE,F_COLLEGA
END
BUTTON F_COLLEGA 2 1
BEGIN
PROMPT 74 9 "CG mov."
PICTURE BMP_DARROWR
FLAGS "D"
END
TEXT DLG_NULL
BEGIN
PROMPT 2 10 "@bRiferimenti contratto"
END
STRING F_DOCRIF 12
BEGIN
PROMPT 31 10 "Codice "
FIELD DOC1
END
DATA F_DATA_DOCRIF
BEGIN
PROMPT 55 10 "Data "
FIELD DATADOCRIF
END
LIST F_FREQUENZA 1 15
BEGIN
PROMPT 2 11 "Generazione NAC a frequenza "
ITEM "A|Annuale"
ITEM "S|Semestrale"
ITEM "T|Trimestrale"
ITEM " | "
FIELD CATVEN
END
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 2 12 "@bSomme anticipate/restituite"
END
CURRENCY F_ANTICIPATO 12
BEGIN
PROMPT 3 13 "Anticipato "
GROUP 1
END
CURRENCY F_RESO_STORICO 12
BEGIN
PROMPT 30 13 "Restituito "
GROUP 1
END
NUMERO F_RESIDUO 12 2
BEGIN
PROMPT 56 13 "Residuo "
VALIDATE 14 1 #231-#232
FLAGS "GD"
DRIVENBY 231 232
END
SPREADSHEET F_RIGHE
BEGIN
PROMPT 2 15 ""
ITEM "Articolo@20"
ITEM "Descrizione@40"
ITEM "UM@2"
ITEM "Prezzo listino"
ITEM "Premio@10"
ITEM "Ns. carico"
ITEM "Bonus@10"
END
ENDPAGE
ENDMASK
/////////////////////////////////////////
//maschera di riga
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 2 1 ""
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 3 1 ""
END
ENDPAGE
PAGE "Riga contratto premi Hardy" -1 -1 76 12
STRING S_CODART 20
BEGIN
PROMPT 1 1 "Articolo "
USE LF_ANAMAG
JOIN LF_UMART INTO CODART==CODART NRIGA=1
INPUT CODART S_CODART
DISPLAY "Codice@20" CODART
DISPLAY "U.M." LF_UMART->UM
DISPLAY "Descrizione@50" DESCR
OUTPUT S_CODART CODART
OUTPUT S_DESCR DESCR
CHECKTYPE REQUIRED
WARNING "Articolo assente"
FLAGS "U"
FIELD CODART
ADD RUN ve2 -3
END
STRING S_DESCR 50
BEGIN
PROMPT 1 2 "Descrizione "
USE LF_ANAMAG KEY 2
JOIN LF_UMART INTO CODART==CODART NRIGA=1
INPUT DESCR S_DESCR
DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice@20" CODART
DISPLAY "U.M." LF_UMART->UM
COPY OUTPUT S_CODART
FIELD DESCR
CHECKTYPE SEARCH
END
STRING S_UMQTA 2
BEGIN
PROMPT 1 3 "U.M. "
USE LF_UMART KEY 2
JOIN %UMS INTO CODTAB=UM
INPUT CODART S_CODART SELECT
INPUT UM S_UMQTA
DISPLAY "Codice@20" UM
DISPLAY "Descrizione@50" %UMS->S0
OUTPUT S_UMQTA UM
FIELD UMQTA
FLAGS "U"
CHECKTYPE REQUIRED
END
GROUPBOX DLG_NULL 74 6
BEGIN
PROMPT 1 4 "@bValori"
END
CURRENCY S_PREZZO
BEGIN
PROMPT 2 5 "Prezzo listino "
FLAGS "UDG"
FIELD PREZZO
END
CURRENCY S_PREMIO
BEGIN
PROMPT 2 6 "Premio "
FLAGS "U"
FIELD QTAGG1
END
CURRENCY S_RICARICO
BEGIN
PROMPT 2 7 "A Ns. carico "
FLAGS "U"
FIELD QTAGG2
END
CURRENCY S_MATURATO
BEGIN
PROMPT 2 8 "Bonus maturato "
FLAGS "DU"
FIELD QTAGG5
END
ENDPAGE
ENDMASK

145
ha/ha0300b.uml Normal file
View File

@ -0,0 +1,145 @@
#include "ha0300a.h"
TOOLBAR "" 0 0 0 2
#include <relapbar.h>
ENDPAGE
PAGE "Gestione contratti premio" -1 -1 78 23
RADIOBUTTON F_TIPOCONTR 1 78
BEGIN
PROMPT 1 0 "@bTipo Contratto"
ITEM "A|Anticipo"
ITEM "P|Posticipo"
ITEM "R|Rifatturazione"
ITEM "N|Noleggio"
FLAGS "GZ"
END
GROUPBOX DLG_NULL 78 5
BEGIN
PROMPT 1 3 ""
END
STRING F_CODNUM 4
BEGIN
PROMPT 2 4 "Cod. num. "
FIELD CODNUM
USE %NUM KEY 1
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
KEY 1
END
STRING F_TIPODOC 4
BEGIN
FIELD TIPODOC
PROMPT 24 4 "Tipo doc. "
USE %TIP KEY 1
INPUT CODTAB F_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
END
LIST F_PROVV 1
BEGIN
PROMPT 140 101 ""
ITEM "D|D"
FIELD PROVV
FLAGS "D"
KEY 1
END
LIST F_TIPOCF 9
BEGIN
PROMPT 130 101 ""
FIELD TIPOCF
IT "C|Cliente"
FLAGS "D"
END
NUMBER F_CODCF 6
BEGIN
PROMPT 2 5 "Cliente "
FIELD CODCF
USE LF_CLIFO SELECT (GRUPPO=4) && (CONTO=101) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT CODCF F_CODCF
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
OUTPUT F_CODCF CODCF
OUTPUT F_DESCF RAGSOC
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
WARNING "Cliente assente"
HELP "Codice del cliente del contratto"
END
STRING F_DESCF 50
BEGIN
PROMPT 24 5 ""
USE LF_CLIFO KEY 2 SELECT (GRUPPO=4) && (CONTO=101) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT RAGSOC F_DESCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Codice" CODCF
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
COPY OUTPUT F_CODCF
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
WARNING "Cliente assente"
HELP "Ragione sociale del cliente del contratto"
END
NUMBER F_ANNO 4
BEGIN
PROMPT 2 6 "Esercizio "
USE ESC
INPUT CODTAB F_ANNO
DISPLAY "Codice" CODTAB
DISPLAY "Inizio esercizio" D0
DISPLAY "Fine esercizio" D1
OUTPUT F_ANNO CODTAB
FIELD ANNO
CHECKTYPE REQUIRED
FLAGS "AZ"
KEY 1
END
NUMBER F_NDOC 6
BEGIN
PROMPT 24 6 "N. contratto "
USE LF_DOC KEY 5 SELECT (BETWEEN(DOC2,#F_CODCF,#F_CODCF))&&(TIPODOC==#F_TIPODOC)
JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==DOC2
INPUT PROVV "D"
INPUT CODNUM F_CODNUM SELECT
INPUT ANNO F_ANNO
INPUT NDOC F_NDOC
DISPLAY "Numero" NDOC
DISPLAY "Data doc.@10" DATADOC
DISPLAY "Inizio@10" DATACOMP
DISPLAY "Fine@10" DATAFCOMP
DISPLAY "Tipo" TIPODOC
DISPLAY "Agente" CODAG
DISPLAY "Cliente" DOC2
DISPLAY "Ragione sociale@50" LF_CLIFO->RAGSOC
OUPUT F_ANNO ANNO
OUPUT F_NDOC NDOC
FIELD NDOC
KEY 1
CHECKTYPE REQUIRED
END
ENDPAGE
ENDMASK

451
ha/ha0300c.uml Normal file
View File

@ -0,0 +1,451 @@
#include "ha0300a.h"
TOOLBAR "" 0 0 0 2
#include <relapbar.h>
ENDPAGE
PAGE "Gestione contratti premio" -1 -1 78 23
GROUPBOX DLG_NULL 78 15
BEGIN
PROMPT 1 0 ""
END
LIST F_TIPOCONTR 1 20
BEGIN
PROMPT 2 1 "@bTipo contratto premio "
// ITEM "A|Anticipo"
// ITEM "P|Posticipo"
// ITEM "R|Rifatturazione"
ITEM "N|Noleggio"
FLAGS "DGZ"
END
STRING F_CODNUM 4
BEGIN
PROMPT 102 101 "Cod. num. "
FIELD CODNUM
USE %NUM KEY 1
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
KEY 1
END
STRING F_TIPODOC 4
BEGIN
FIELD TIPODOC
PROMPT 120 101 "Tipo doc. "
USE %TIP KEY 1
INPUT CODTAB F_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
CHECKTYPE NORMAL
FLAGS "GDU"
END
LIST F_TIPOCF 9
BEGIN
PROMPT 130 101 ""
FIELD TIPOCF
IT "C|Cliente"
FLAGS "D"
END
NUMBER F_CODCF 6
BEGIN
PROMPT 2 2 "Cliente "
FIELD CODCF
FLAGS "D"
END
STRING F_DESCF 50
BEGIN
PROMPT 24 2 ""
FLAGS "D"
END
NUMBER F_CODCFATT 6
BEGIN
PROMPT 2 3 "Cli. fatt."
USE LF_CLIFO SELECT (GRUPPO=4) && (CONTO=101) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT CODCF F_CODCFATT
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
OUTPUT F_CODCFATT CODCF
OUTPUT F_DESCFATT RAGSOC
OUTPUT F_CODCF CODCF
OUTPUT F_DESCF RAGSOC
CHECKTYPE REQUIRED
ADD RUN cg0 -1 C
FIELD DOC2
END
STRING F_DESCFATT 50
BEGIN
PROMPT 24 3 ""
USE LF_CLIFO KEY 2 SELECT (GRUPPO=4) && (CONTO=101) && (SOSPESO!="X")
INPUT TIPOCF "C"
INPUT RAGSOC F_DESCFATT
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Codice" CODCF
DISPLAY "Partita IVA@12" PAIV
DISPLAY "Sospeso" SOSPESO
COPY OUTPUT F_CODCFATT
CHECKTYPE SEARCH
ADD RUN cg0 -1 C
END
LIST F_PROVV 1
BEGIN
PROMPT 140 101 ""
ITEM "D|D"
FIELD PROVV
FLAGS "D"
KEY 1
END
NUMBER F_ANNO 4
BEGIN
PROMPT 2 4 "Esercizio "
FIELD ANNO
CHECKTYPE REQUIRED
FLAGS "DZ"
KEY 1
END
NUMBER F_NDOC 6
BEGIN
PROMPT 24 4 "N. contr. premi "
FLAGS "D"
FIELD NDOC
CHECKTYPE REQUIRED
KEY 1
END
DATE F_DATADOC
BEGIN
PROMPT 50 4 "Data "
FIELD DATADOC
END
STRING F_STATO 1
BEGIN
PROMPT 69 4 "Stato "
FIELD STATO
USE %STD
INPUT CODTAB F_STATO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_STATO CODTAB
CHECKTYPE NORMAL
FLAGS "D"
END
STRING F_CODCONTR 3
BEGIN
PROMPT 2 5 "Listino cliente "
USE CONDV
INPUT TIPO "C"
INPUT TIPOCF F_TIPOCF SELECT
INPUT CODCF F_CODCFATT SELECT
INPUT COD F_CODCONTR
DISPLAY "Codice" COD
DISPLAY "Descrizione@50" DESCR
DISPLAY "Inizio validità" VALIN
DISPLAY "Fine validità" VALFIN
OUTPUT F_CODCONTR COD
OUTPUT F_DESCONTR DESCR
FIELD CODCONT
CHECKTYPE NORMAL
END
STRING F_DESCONTR 50
BEGIN
PROMPT 26 5 ""
FLAGS "DG"
END
STRING F_CODLIS 3
BEGIN
PROMPT 2 6 "Listino standard "
USE CONDV
INPUT TIPO "L"
INPUT COD F_CODLIS
DISPLAY "Codice" COD
DISPLAY "Descrizione@50" DESCR
DISPLAY "Inizio validità" VALIN
DISPLAY "Fine validità" VALFIN
OUTPUT F_CODLIS COD
OUTPUT F_DESLIS DESCR
FIELD CODLIST
CHECKTYPE NORMAL
END
STRING F_DESLIS 50
BEGIN
PROMPT 26 6 ""
FLAGS "DG"
END
STRING F_CODAG 5
BEGIN
PROMPT 2 7 "Agente "
FIELD CODAG
USE LF_AGENTI
INPUT CODAGE F_CODAG
DISPLAY "Codice@8R" CODAGE
DISPLAY "Descrizione@50" RAGSOC
OUTPUT F_CODAG CODAGE
OUTPUT F_DESCRAG RAGSOC
CHECKTYPE NORMAL
FLAGS "UZ"
END
STRING F_DESCRAG 50
BEGIN
PROMPT 24 7 ""
USE LF_AGENTI KEY 2
INPUT RAGSOC F_DESCRAG
DISPLAY "Descrizione@50" RAGSOC
DISPLAY "Codice@8R" CODAGE
COPY OUTPUT F_CODAG
CHECKTYPE NORMAL
END
STRING F_CODPAG 4
BEGIN
PROMPT 2 8 "Cond. pag. "
FIELD CODPAG
USE %CPG
INPUT CODTAB F_CODPAG
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODPAG CODTAB
OUTPUT F_DESCRPAG S0
CHECKTYPE NORMAL
FLAGS "U"
HE "Inserire il codice del tipo di pagamento"
WA "Codice tipo pagamento non trovato"
ADD RUN ba3 -6
END
STRING F_DESCRPAG 50
BEGIN
PROMPT 24 8 ""
USE %CPG KEY 2
INPUT S0 F_DESCRPAG
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_CODPAG
CHECKTYPE NORMAL
HE "Inserire il codice del tipo di pagamento"
WA "Codice tipo pagamento non trovato"
ADD RUN ba3 -6
END
TEXT DLG_NULL
BEGIN
PROMPT 2 9 "@bValidità: "
END
DATE F_DATACOMP
BEGIN
PROMPT 14 9 "Inizio "
FIELD DATACOMP
CHECKTYPE REQUIRED
END
DATE F_DATAFCOMP
BEGIN
PROMPT 36 9 "Fine "
FIELD DATAFCOMP
CHECKTYPE REQUIRED
END
DATE F_DATARECESSO
BEGIN
PROMPT 56 9 "Recesso "
FIELD DATASCIMP
END
TEXT DLG_NULL
BEGIN
PROMPT 2 10 "@bRiferimenti contratto"
END
STRING F_DOCRIF 12
BEGIN
PROMPT 32 10 "Codice "
FIELD DOC1
END
DATA F_DATA_DOCRIF
BEGIN
PROMPT 59 10 "Data "
FIELD DATADOCRIF
END
LIST F_FREQUENZA 1 15
BEGIN
PROMPT 2 11 "Generazione NAC a frequenza "
ITEM "M|Mensile"
FIELD CATVEN
FLAGS "D"
END
GROUPBOX DLG_NULL 76 3
BEGIN
PROMPT 2 12 "@bRateizzazione"
END
CURRENCY F_IMPRATA 10
BEGIN
PROMPT 3 13 "Importo rata "
FIELD IMPPAGATO
CHECKTYPE REQUIRED
END
NUMBER F_NRATE 3
BEGIN
PROMPT 35 13 "Numero rate "
FIELD NCOLLI
CHECKTYPE REQUIRED
END
NUMBER F_EMESSE 3
BEGIN
PROMPT 60 13 "Rate emesse "
FIELD NUMANT
FLAGS "D"
END
SPREADSHEET F_RIGHE
BEGIN
PROMPT 2 15 ""
ITEM "Articolo@20"
ITEM "Descrizione@40"
ITEM "UM@2"
ITEM "Prezzo listino"
ITEM "Premio@10"
ITEM "Ns. carico"
ITEM "Bonus@10"
END
ENDPAGE
ENDMASK
/////////////////////////////////////////
//maschera di riga
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 2 1 ""
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 3 1 ""
END
ENDPAGE
PAGE "Riga contratto premi Hardy" -1 -1 76 12
STRING S_CODART 20
BEGIN
PROMPT 1 1 "Articolo "
USE LF_ANAMAG
JOIN LF_UMART INTO CODART==CODART NRIGA=1
INPUT CODART S_CODART
DISPLAY "Codice@20" CODART
DISPLAY "U.M." LF_UMART->UM
DISPLAY "Descrizione@50" DESCR
OUTPUT S_CODART CODART
OUTPUT S_DESCR DESCR
CHECKTYPE REQUIRED
WARNING "Articolo assente"
FLAGS "U"
FIELD CODART
ADD RUN ve2 -3
END
STRING S_DESCR 50
BEGIN
PROMPT 1 2 "Descrizione "
USE LF_ANAMAG KEY 2
JOIN LF_UMART INTO CODART==CODART NRIGA=1
INPUT DESCR S_DESCR
DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice@20" CODART
DISPLAY "U.M." LF_UMART->UM
COPY OUTPUT S_CODART
FIELD DESCR
CHECKTYPE SEARCH
END
STRING S_UMQTA 2
BEGIN
PROMPT 1 3 "U.M. "
USE LF_UMART KEY 2
JOIN %UMS INTO CODTAB=UM
INPUT CODART S_CODART SELECT
INPUT UM S_UMQTA
DISPLAY "Codice@20" UM
DISPLAY "Descrizione@50" %UMS->S0
OUTPUT S_UMQTA UM
FIELD UMQTA
FLAGS "U"
CHECKTYPE REQUIRED
END
GROUPBOX DLG_NULL 74 6
BEGIN
PROMPT 1 4 "@bValori"
END
CURRENCY S_PREZZO
BEGIN
PROMPT 2 5 "Prezzo listino "
FLAGS "UDG"
FIELD PREZZO
END
CURRENCY S_PREMIO
BEGIN
PROMPT 2 6 "Premio "
FLAGS "U"
FIELD QTAGG1
END
CURRENCY S_RICARICO
BEGIN
PROMPT 2 7 "A Ns. carico "
FLAGS "U"
FIELD QTAGG2
END
CURRENCY S_MATURATO
BEGIN
PROMPT 2 8 "Bonus maturato "
FLAGS "DU"
FIELD QTAGG5
END
ENDPAGE
ENDMASK

View File

@ -8,6 +8,8 @@
#include <doc.h>
#include <rdoc.h>
#include "../cg/cglib01.h"
#include "../cg/cgsaldac.h"
#include "../ef/ef0101.h"
#include "../ve/velib.h"
#include "halib.h"
@ -106,7 +108,6 @@ bool THardy_elab_docs_mask::on_field_event(TOperable_field& o, TField_event e, l
///////////////////////////////////////
class THardy_elab_docs : public TSkeleton_application
{
protected:
//metodi alto livello
void elabora(const TMask& mask);
@ -117,17 +118,19 @@ protected:
//metodi medio livello
bool aggiorna_contratto(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log);
bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log);
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log);
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TAssoc_array& nac_nolo, TLog_report& log);
bool genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& nakey, TLog_report& log);
bool genera_eff(const TDocumento& fat, const real& tot_nac, TLog_report& log);
//metodi basso livello
int find_contratti_cliente(const long codcfatt, const TMask& mask, TArray& contratti_cliente);
int find_contratti_cliente(const long codcfatt, const TMask& mask, int flags, TArray& contratti_cliente);
void check_date(const TDate& datafine, TDate& dataini);
int find_numerazioni(const TString& tipo_to_elab, TString_array& num_doc);
int month_diff(const TDate& inizio, const TDate& fine) const;
public:
virtual void main_loop();
virtual bool create();
};
//metodo per ricavare la data iniziale di elaborazione qualora l'utonto non la metta e l'esercizio da usare
@ -166,40 +169,42 @@ int THardy_elab_docs::find_numerazioni(const TString& tipo_to_elab, TString_arra
//metodo per accoppare tutte le NAC provvisorie generate in precedenza
int THardy_elab_docs::kill_provv_nac(const TMask& mask)
{
int nac_killed = 0;
const TDate& adata = mask.get_date(F_ADATA);
int anno = adata.year();
const int anno = adata.year();
TConfig config(CONFIG_DITTA, "ha");
TToken_string numerazioni;
numerazioni.add(config.get("NaAntNum"));
numerazioni.add(config.get("NaRifaNum"));
numerazioni.add(config.get("NaNoloNum"));
numerazioni.add(config.get("NaPostNum"));
numerazioni.add(config.get("NaRifaNum"));
FOR_EACH_TOKEN(numerazioni, codnum)
int nac_killed = 0;
TRelation rel_doc(LF_DOC);
TRectype& rec = rel_doc.curr();
FOR_EACH_TOKEN(numerazioni, codnum) if (*codnum > ' ')
{
TRelation rel_doc(LF_DOC);
TRectype& rec = rel_doc.curr();
rec.put(DOC_PROVV, "P");
rec.put(DOC_ANNO, anno);
rec.zero();
rec.put(DOC_PROVV, 'P');
rec.put(DOC_ANNO, anno);
rec.put(DOC_CODNUM, codnum);
TCursor cur_doc (&rel_doc, "", 1, &rec, &rec);
const long items = cur_doc.items();
const TRecnotype items = cur_doc.items();
cur_doc.freeze();
TProgind progind(items, "Eliminazione NAC provvisorie in corso...", false, true);
TProgind progind(items, TR("Eliminazione NAC provvisorie in corso..."));
for (cur_doc = 0; cur_doc.pos() < items; ++cur_doc)
{
progind.addstatus(1);
if (!progind.addstatus(1))
break;
TDocumento doc(rec);
int err = doc.remove();
if (err == NOERR)
if (doc.remove() == NOERR)
nac_killed++;
}
}
return nac_killed;
}
@ -276,43 +281,59 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
}
//metodo che riempie un array con tutti i contratti del cliente passatogli (in base alla tipologia di contratti da elaborare)
int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& mask, TArray& contratti_cliente)
int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& mask, int flags, TArray& contratti_cliente)
{
contratti_cliente.destroy();
const TDate data_fine_elab = mask.get_date(F_ADATA);
TDate data_ini_elab = mask.get_date(F_DADATA);
if (!data_ini_elab.ok())
check_date(data_fine_elab, data_ini_elab);
//settaggio delle variabili
//il codice numerazione lo trova nella configurazione Hardy, e lo deve scegliere in base alla tipologia di contratti che sta esaminando!
TConfig config(CONFIG_DITTA, "ha");
const TString4 tip_ant = config.get("CoAntTip");
const TString4 tip_rifa = config.get("CoRifaTip");
const TString4 tip_post = config.get("CoPostTip");
TAssoc_array cod_num_cont;
cod_num_cont.add(config.get("CoAntNum"));
cod_num_cont.add(config.get("CoRifaNum"));
cod_num_cont.add(config.get("CoPostNum"));
FOR_EACH_ASSOC_OBJECT(cod_num_cont, h, k, o)
for (int f = 0; f < 4; f++) if (flags & (1 << f))
{
const TString& agente = mask.get(F_CODAGE);
TString4 codnum, tipodoc;
switch (f)
{
case 0:
codnum = ini_get_string(CONFIG_DITTA, "ha", "CoAntNum");
tipodoc = ini_get_string(CONFIG_DITTA, "ha", "CoAntTip");
break;
case 1:
codnum = ini_get_string(CONFIG_DITTA, "ha", "CoRifaNum");
tipodoc = ini_get_string(CONFIG_DITTA, "ha", "CoRifaTip");
break;
case 2:
codnum = ini_get_string(CONFIG_DITTA, "ha", "CoPostNum");
tipodoc = ini_get_string(CONFIG_DITTA, "ha", "CoPostTip");
break;
case 3:
codnum = ini_get_string(CONFIG_DITTA, "ha", "CoNoloNum");
tipodoc = ini_get_string(CONFIG_DITTA, "ha", "CoNoloTip");
break;
default:
break;
}
//deve cercare tutti i contratti del cliente e metterli nell'array
const TString& agente = mask.get(F_CODAGE);
//deve cercare tutti i contratti del cliente e metterli nell'array
TString query;
query << "USE DOC KEY 5";
query << "\nSELECT ((TIPODOC=#A_TIPODOC)||(TIPODOC=#R_TIPODOC)||(TIPODOC=#P_TIPODOC))&&(STR(DOC2=#CODCF))";
query << "\nSELECT (TIPODOC=#TIPODOC)&&(STATO!=9)";
if (codcfatt > 0) query <<"&&(STR(DOC2=#CODCF))";
if (agente.full()) query << "&&(CODAG=#CODAG)";
query << "\nFROM PROVV=D CODNUM=" << k;
query << "\nTO PROVV=D CODNUM=" << k;
query << "\nFROM PROVV=D CODNUM=" << codnum;
query << "\nTO PROVV=D CODNUM=" << codnum;
TISAM_recordset recset(query);
recset.set_var("#A_TIPODOC", tip_ant);
recset.set_var("#R_TIPODOC", tip_rifa);
recset.set_var("#P_TIPODOC", tip_post);
recset.set_var("#CODCF", codcfatt);
recset.set_var("#CODAG", agente);
recset.set_var("#TIPODOC", tipodoc);
if (codcfatt > 0)
recset.set_var("#CODCF", codcfatt);
if (agente.full())
recset.set_var("#CODAG", agente);
const long n_contratti = recset.items(); //questo serve solo al sagace programmatore
@ -320,55 +341,62 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
//contratti anticipo 'A': datainizio esiste sempre, datafine non esiste (va ad esaurimento)
//contratti nolo 'N': datainizio esiste sempre, datafine esiste sempre
//contratti posticipo 'P': datainizio esiste sempre, datafine può non esistere
//contratti rifatturazione 'R': come contratti anticipo
//controlla validità del contratto con le date scelte per l'elaborazione dei documenti
const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date();
const TDate data_fine_elab = mask.get_date(F_ADATA);
TDate data_ini_elab = mask.get_date(F_DADATA);
if (!data_ini_elab.ok())
check_date(data_fine_elab, data_ini_elab);
//quindi la datainizio vale per tutti allo stesso modo (è obbligatoria nei contratti)
//se l'elaborazione finisce prima che cominci il contratto -> il contratto non serve a nulla
if (data_ini_contratto > data_fine_elab)
continue;
//la data fine vale invece solo per i contratti 'P' e potrebbe non esserci (contratti senza scadenza)
TDate data_fine_contratto;
TDate data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date();
if (f == 3) // if (tipo_contratto == "N")
{
const TDate data_recesso = recset.get(DOC_DATASCIMP).as_date();
if (data_recesso.ok())
data_fine_contratto = data_recesso;
else
{
const int rate = recset.get(DOC_NCOLLI).as_int();
const int paga = recset.get(DOC_NUMANT).as_int();
if (paga >= rate) // Fine pagamento rate
continue;
}
}
//se la data fine contratto non è valida (ma è presente!) non dobbiamo fare nulla, perchè il contratto non va elaborato
data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date();
if (data_fine_contratto.ok())
{
if (data_fine_contratto < data_ini_elab)
continue;
}
if (data_fine_contratto.ok() && data_fine_contratto < data_ini_elab)
continue;
//ci tocca istanziarci un contratto_premi
TContratto_premi* curr_contratto = new TContratto_premi(recset.cursor()->curr());
//azzeratore del campo con il totale reso per elaborazione, nel caso di contratti Anticipo/Rifatturazione, riga spese
const char tipo_contr = curr_contratto->tipo_contratto();
if (tipo_contr == 'A' || tipo_contr == 'R')
FOR_EACH_PHYSICAL_RDOC(*curr_contratto, r, rdoc)
{
FOR_EACH_PHYSICAL_RDOC(*curr_contratto, r, rdoc)
const TString& tr = rdoc->get(RDOC_TIPORIGA);
if (tr == HARDY_TIPORIGA_SOMMA && (tipo_contr == 'A' || tipo_contr == 'R'))
{
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
{
rdoc->zero(RCA_2_RESO_CORRENTE);
rdoc->zero(RCA_2_RESO_CORRENTE);
const real prezzo = rdoc->prezzo(false, false);
const real resost = rdoc->get(RCA_2_RESO_STORICO);
if (resost >= prezzo) // Contratto esaurito da ignorare
{
delete curr_contratto;
curr_contratto = NULL;
}
break;
const real prezzo = rdoc->prezzo(false, false);
const real resost = rdoc->get(RCA_2_RESO_STORICO);
if (resost >= prezzo) // Contratto esaurito da ignorare
{
delete curr_contratto;
curr_contratto = NULL;
}
}
break;
} else
if (tr == HARDY_TIPORIGA_MERCE)
rdoc->zero(RDOC_QTA);
}
if (curr_contratto != NULL) // Ignora contratti chiusi
@ -378,6 +406,13 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
return contratti_cliente.items();
}
int THardy_elab_docs::month_diff(const TDate& inizio, const TDate& fine) const
{
const int i = inizio.year()*12 + inizio.month();
const int f = fine.year()*12 + fine.month();
return f-i;
}
bool THardy_elab_docs::aggiorna_contratto(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log)
{
@ -403,7 +438,7 @@ bool THardy_elab_docs::aggiorna_contratto(const TRiga_documento& rdoc, TContratt
TArticolo articolo(rdoc_codart);
const real normalized_rdoc_qta = articolo.convert_to_um(rdoc_qta, umqta_tot, rdoc_umqta, true);
//aggiornamento delle righe di tipo spesa (verigh02) per aggiornare le somme restituite nel caso di contratti di anticipo/rifatturazione
//aggiornamento delle righe di tipo spesa (verig02) per aggiornare le somme restituite nel caso di contratti di anticipo/rifatturazione
if (tipo_contratto == 'A' || tipo_contratto == 'R')
{
FOR_EACH_PHYSICAL_RDOC(contratto, ra, rigacontratto)
@ -439,8 +474,6 @@ bool THardy_elab_docs::aggiorna_contratto(const TRiga_documento& rdoc, TContratt
}
} //if(rigamerce_premio != ZERO...
} //if(rdoc_codart...
} //FOR_EACH_PHYSICAL..
return elaborato;
@ -466,6 +499,7 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti
TDate data_inizio(1, 1, data_fine.year());
switch (contratto.frequenza())
{
case 'M': data_inizio.set_month(data_fine.month()); break; // Solo contratti NOLO
case 'S': data_inizio.set_month(data_fine.month() > 6 ? 7 : 1); break;
case 'T': data_inizio.set_month(max(1, data_fine.month()-2)); break;
default: break;
@ -481,9 +515,10 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti
}
bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log)
bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
TAssoc_array& nac_nolo, TLog_report& log)
{
if (documenti_cliente.empty())
if (contratti_cliente.empty())
return false;
//si informa se l'elaborazione è definitiva o meno
@ -506,25 +541,29 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
// TESTATA
//alcuni parametri delle righe vanno presi dalla configurazione
TConfig config(CONFIG_DITTA, "ha");
TString4 nac_codnum, nac_tipo;
TString8 cod_riga;
switch (tipo_contratto)
{
case 'A':
nac_codnum = config.get("NaAntNum");
nac_tipo = config.get("NaAntTip");
cod_riga = config.get("NaAntSpe");
nac_codnum = ini_get_string(CONFIG_DITTA, "ha", "NaAntNum");
nac_tipo = ini_get_string(CONFIG_DITTA, "ha", "NaAntTip");
cod_riga = ini_get_string(CONFIG_DITTA, "ha", "NaAntSpe");
break;
case 'N':
nac_codnum = ini_get_string(CONFIG_DITTA, "ha", "NaNoloNum");
nac_tipo = ini_get_string(CONFIG_DITTA, "ha", "NaNoloTip");
cod_riga = ini_get_string(CONFIG_DITTA, "ha", "NaNoloSpe");
break;
case 'R':
nac_codnum = config.get("NaRifaNum");
nac_tipo = config.get("NaRifaTip");
cod_riga = config.get("NaRifaSpe");
nac_codnum = ini_get_string(CONFIG_DITTA, "ha", "NaRifaNum");
nac_tipo = ini_get_string(CONFIG_DITTA, "ha", "NaRifaTip");
cod_riga = ini_get_string(CONFIG_DITTA, "ha", "NaRifaSpe");
break;
default:
nac_codnum = config.get("NaPostNum");
nac_tipo = config.get("NaPostTip");
cod_riga = config.get("NaPostSpe");
nac_codnum = ini_get_string(CONFIG_DITTA, "ha", "NaPostNum");
nac_tipo = ini_get_string(CONFIG_DITTA, "ha", "NaPostTip");
cod_riga = ini_get_string(CONFIG_DITTA, "ha", "NaPostSpe");
break;
}
@ -560,12 +599,11 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
//ogni riga di tipo merce (verigh01) del contratto origina una riga della NAC
//noto il codice di riga spesa (che farà le veci del codart), troviamo il tipo riga dalla tabella SPP e tutte le features che servono
const TRectype& rec_spp = cache().get("SPP", cod_riga);
const TString4 tipo_riga = rec_spp.get("S8");
const TString4 tipo_riga_spp = rec_spp.get("S8");
const TString80 descr_riga_spp = rec_spp.get("S0");
const TString4 codiva = rec_spp.get("S3");
TDate adata = mask.get_date(F_ADATA);
TDate adata = mask.get_date(F_ADATA);
TDate dadata = mask.get_date(F_DADATA);
if (!dadata.ok())
check_date(adata, dadata);
@ -573,6 +611,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
TDate dmin(1, 1, adata.year());
switch (contratto.frequenza())
{
case 'M': dmin.set_month(adata.month()); break; // Solo nolo
case 'S': dmin.set_month(adata.month() > 6 ? 7 : 1); break;
case 'T': dmin.set_month(max(1, adata.month()-2)); break;
default: break;
@ -604,7 +643,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
const real riga_contratto_premio = riga_contratto.get_real(RC_1_PREMIO);
// riga merce NAC
TRiga_documento& nac_row = nac.new_row(tipo_riga);
TRiga_documento& nac_row = nac.new_row(tipo_riga_spp);
nac_row.put(RDOC_CODART, cod_riga);
//panegirico della descrizione
@ -642,7 +681,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
nac.destroy_rows();
// riga spesa NAC
TRiga_documento& nac_row = nac.new_row(tipo_riga);
TRiga_documento& nac_row = nac.new_row(tipo_riga_spp);
nac_row.put(RDOC_CODART, cod_riga);
//panegirico della descrizione
@ -663,6 +702,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
}
}
// salvataggi vari
// ---------------
// NAC
@ -681,28 +721,51 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
// CONTRATTO
//se il contratto è di tipo A/R aggiorna la riga spese speciale (verigh02)
if ((tipo_contratto == 'A' || tipo_contratto == 'R') && err == NOERR)
if (err == NOERR) switch (tipo_contratto)
{
FOR_EACH_PHYSICAL_RDOC(contratto, r, rdoc)
case 'A':
case 'R':
{
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
FOR_EACH_PHYSICAL_RDOC(contratto, r, rdoc)
{
const real anticipato = rdoc->get_real(RCA_2_ANTICIPATO);
real reso_storico = rdoc->get_real(RCA_2_RESO_STORICO);
reso_storico += rdoc->get_real(RCA_2_RESO_CORRENTE);
rdoc->put(RCA_2_RESO_STORICO, reso_storico);
//se il contratto è andato a pareggio avverte diligentemente l'operatore
if (reso_storico >= anticipato)
log_msg << " -- Contratto pareggiato!";
} //if (rdoc->get(RDOC_TIPORIGA)...
} //FOR_EACH_PHYSICAL_RDOC(contratto...
} //if (tipo_contratto == 'A'..
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
{
const real anticipato = rdoc->get_real(RCA_2_ANTICIPATO);
real reso_storico = rdoc->get_real(RCA_2_RESO_STORICO);
reso_storico += rdoc->get_real(RCA_2_RESO_CORRENTE);
rdoc->put(RCA_2_RESO_STORICO, reso_storico);
//se il contratto è andato a pareggio avverte diligentemente l'operatore
if (reso_storico >= anticipato)
log_msg << " -- Contratto pareggiato!";
} //if (rdoc->get(RDOC_TIPORIGA)...
} //FOR_EACH_PHYSICAL_RDOC(contratto...
}
break;
case 'N':
{
TToken_string nakey; // Chiave NAC
nakey.add(provv);
nakey.add(anno);
nakey.add(nac_codnum);
nakey.add(nac.get(DOC_NDOC));
TToken_string cnkey; // Chiave contratto
cnkey.add(contratto.get(DOC_PROVV));
cnkey.add(contratto.get(DOC_ANNO));
cnkey.add(contratto.get(DOC_CODNUM));
cnkey.add(contratto.get(DOC_NDOC));
nac_nolo.add(cnkey, nakey); // memorizza la coppia contratto/nac di nolo
}
break;
default:
break;
}
// se non ci sono errori -> in caso di elaborazione definitiva procede alla registrazione..
//.. del contratto (ricordiamo che in memoria il contratto ha già le righe aggiornate
if (definitivo && err == NOERR)
if (err == NOERR && definitivo)
{
//alla fine della fiera aggiorna il contratto
err = contratto.rewrite();
@ -710,28 +773,167 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
if (err == NOERR)
log_msg << " -- Contratto aggiornato";
else
log_msg << " -- Impossibile aggiornare contratto";
log_msg << " -- Impossibile aggiornare contratto: errore " << err;
}
log.log(0, log_msg);
log.log(0, "");
} //FOR_EACH_ARRAY_ITEM(... giro sui contratti cliente
} //FOR_EACH_ARRAY_ITEM(... giro sui contratti cliente
//il metodo ritornerà il successo o meno della registrazione
return true;
}
bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& nac_nolo, TLog_report& log)
{
//si informa se l'elaborazione è definitiva o meno
const char provv = mask.get_bool(F_DEFINITIVO) ? 'D' : 'P';
const TDate datadoc = mask.get(F_DATAELAB);
const TString4 fat_codnum = ini_get_string(CONFIG_DITTA, "ha", "NaNoloNum");
const TString4 fat_tipodoc = ini_get_string(CONFIG_DITTA, "ha", "FtNoloTip");
const TString4 fat_codpag = ini_get_string(CONFIG_DITTA, "ha", "CodPagFat");
const TString8 cod_riga = ini_get_string(CONFIG_DITTA, "ha", "FtNoloSpe");
TDocumento fat(provv, datadoc.year(), fat_codnum, 0); //num_doc = 0 perchè viene aggiornato in fase di registrazione
fat.set_tipo(fat_tipodoc);
fat.put(DOC_STATO, 1);
fat.put(DOC_DATADOC, datadoc);
fat.put(DOC_TIPOCF, 'C');
fat.put(DOC_CODCF, contratto.get(DOC_DOC2));
fat.put(DOC_CODAG, contratto.get(DOC_CODAG));
fat.put(DOC_CODPAG, fat_codpag);
fat.put(DOC_DOC1, contratto.get(DOC_NDOC));
fat.put(DOC_DATADOCRIF, contratto.get(DOC_DATADOC));
fat.cli2doc();
const TRectype& rec_spp = cache().get("SPP", cod_riga);
const TString4 tipo_riga_spp = rec_spp.get("S8");
const TString80 descr_riga_spp = rec_spp.get("S0");
real importo = contratto.get_real(DOC_IMPPAGATO);
const TDate recesso = contratto.data_recesso();
if (recesso.ok() && recesso <= mask.get_date(F_ADATA))
{
const real rate_da_pagare = contratto.get_int(DOC_NCOLLI) - contratto.get_int(DOC_NUMANT);
importo *= rate_da_pagare;
contratto.put(DOC_NUMANT, contratto.get(DOC_NCOLLI)); // Chiude contratto forzosamente
}
else
{
contratto.add(DOC_NUMANT, UNO); // Incrementa numero di rate pagate
}
if (provv == 'D')
{
const int err = contratto.rewrite();
if (err != NOERR)
log.log(2, TR("Impossibile aggiornare il numero di rate pagate sul cotratto"));
}
TRiga_documento& rdoc = fat.new_row(tipo_riga_spp);
rdoc.put(RDOC_CODART, cod_riga);
rdoc.put(RDOC_DESCR, descr_riga_spp);
rdoc.put(RDOC_QTA, UNO);
rdoc.put(RDOC_PREZZO, importo);
const int err = fat.write();
if (err == NOERR)
{
TString log_msg;
log_msg.format("Generata FATTURA: %-4s%-4s%c %7ld",
(const char*)fat_codnum, (const char*)fat_tipodoc, fat.get_char(DOC_PROVV), fat.get_long(DOC_NDOC));
log.log(0, log_msg);
real tot_nac;
if (!nac_nolo.empty_items())
{
const char provv = nac_nolo.get(0)[0];
const int anno = nac_nolo.get_int();
const TString4 codnum = nac_nolo.get();
const long ndoc = nac_nolo.get_long();
TDocumento nac(provv, anno, codnum, ndoc);
nac.put(DOC_DATADOCRIF, fat.get(DOC_DATADOC));
nac.put(DOC_CODNUMRIF, fat.get(DOC_CODNUM));
nac.put(DOC_ANNORIF, fat.get(DOC_ANNO));
nac.put(DOC_NUMDOCRIF, fat.get(DOC_NDOC));
nac.rewrite();
tot_nac = nac.totale_doc();
}
genera_eff(fat, tot_nac, log);
}
else
{
log.log(2, TR("Impossibile generare la FATTURA"));
}
return err == NOERR;
}
bool THardy_elab_docs::genera_eff(const TDocumento& fat, const real& tot_nac, TLog_report& log)
{
#ifdef NDEBUG
if (fat.get_char(DOC_PROVV) != 'D')
return false;
#endif
const real tot_fat = fat.totale_doc();
if (tot_fat == tot_nac)
return false;
const bool credito = tot_fat > tot_nac;
const real importo = credito ? (tot_fat - tot_nac) : (tot_nac - tot_fat);
TDate datascad = fat.get(DOC_DATADOC); datascad.set_end_month();
TEffetto eff;
eff.put(EFF_DATASCAD, datascad);
eff.put(EFF_TIPOPAG, credito ? tp_rid : tp_bonifico);
eff.put(EFF_TIPOCF, fat.get(DOC_TIPOCF));
eff.put(EFF_CODCF, fat.get(DOC_CODCF));
eff.put(EFF_CODABI, fat.get(DOC_CODABIA));
eff.put(EFF_CODCAB, fat.get(DOC_CODCABA));
TRectype& reff = eff.row_r(1, true);
reff.put(REFF_ANNO, fat.get(DOC_ANNO));
reff.put(REFF_NUMPART, fat.get(DOC_NDOC));
reff.put(REFF_NRIGA, 1);
reff.put(REFF_NRATA, 1);
reff.put(REFF_PROVV, fat.get(DOC_PROVV));
reff.put(REFF_ANNODOC, fat.get(DOC_ANNO));
reff.put(REFF_CODNUM, fat.get(DOC_CODNUM));
reff.put(REFF_NFATT, fat.get(DOC_NDOC));
reff.put(REFF_DATAFATT,fat.get(DOC_DATADOC));
reff.put(REFF_IMPFATT, tot_fat);
reff.put(REFF_IMPORTO, importo);
reff.put(REFF_ACCSAL, 'A');
TLocalisamfile file(LF_EFFETTI);
int err = eff.write(file);
if (err == NOERR)
{
TString msg;
msg << "Registrato effetto " << eff.numero();
log.log(0, msg);
}
else
log.log(2, "Impossibile registrare l'effetto");
return err == NOERR;
}
void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fatture, TLog_report& log)
{
TProgind pi(fatture.items(), TR("Elaborazione documenti in corso..."), true, true);
TProgind pi(fatture.items(), TR("Elaborazione documenti in corso..."));
//inizializza variabili da usare nella scansione del recordset
long old_codcf = 0L;
//array con l'insieme dei contratti e dei documenti elaborati per un singolo cliente!
TArray contratti_cliente, documenti_cliente;
TAssoc_array nac_nolo;
//giro sulle fatture (è il giro di più alto livello che viene esteso all'interno delle elabora_contratti)
for (bool ok = fatture.move_first(); ok; ok = fatture.move_next())
@ -745,7 +947,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
{
//generazione NAC del cliente precedente (una per contratto cliente)
if (old_codcf > 0 && !documenti_cliente.empty())
genera_nac(mask, contratti_cliente, documenti_cliente, log);
genera_nac(mask, contratti_cliente, nac_nolo, log);
//aggiorna old_codcf in modo da poter controllare i contratti solo al cambio codcf
old_codcf = codcf;
@ -754,11 +956,11 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
TString msg; msg << TR("Cliente") << ' ' << codcf << ' ' << cache().get(LF_CLIFO, key, CLI_RAGSOC);
log.log(0, msg);
const int n_contratti = find_contratti_cliente(codcf, mask, contratti_cliente);
const int n_contratti = find_contratti_cliente(codcf, mask, 0xF, contratti_cliente);
if (n_contratti == 0)
{
TString msg;
msg << "Il cliente " << codcf << " non ha un contratto valido nel periodo selezionato pur avendo fatture.";
msg << TR("Il cliente non ha un contratto valido nel periodo selezionato pur avendo fatture.");
log.log_error(msg);
}
}
@ -778,13 +980,13 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
} //for (bool ok = recset.move_first()...
//generazione NAC dell'ultimo cliente (una per contratto cliente)
if (!documenti_cliente.empty())
genera_nac(mask, contratti_cliente, documenti_cliente, log);
if (!contratti_cliente.empty())
genera_nac(mask, contratti_cliente, nac_nolo, log);
//se elaborazione definitiva -> cambia lo stato ai documenti di vendita elaborati, mettendolo uguale..
//..a quello deciso in configurazione
const bool definitivo = mask.get_bool(F_DEFINITIVO);
if (definitivo)
if (definitivo && !documenti_cliente.empty())
{
const TString4 stato_finale = ini_get_string(CONFIG_DITTA, "ha", "StatoFinFatt");
FOR_EACH_ARRAY_ITEM(documenti_cliente, r, riga)
@ -794,6 +996,23 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
fattura.rewrite();
}
}
// Elabora tutti i contratti di nolo per generare fatture ed effetti
const int cn = find_contratti_cliente(mask.get_long(F_CODCF), mask, 0x8, contratti_cliente);
FOR_EACH_ARRAY_ROW(contratti_cliente, n_nolo, r_nolo)
{
TContratto_premi& contratto = *(TContratto_premi*)r_nolo;
TToken_string cnkey; // Chiave contratto
cnkey.add(contratto.get(DOC_PROVV));
cnkey.add(contratto.get(DOC_ANNO));
cnkey.add(contratto.get(DOC_CODNUM));
cnkey.add(contratto.get(DOC_NDOC));
const TToken_string* nk = (const TToken_string*)nac_nolo.objptr(cnkey);
TToken_string nakey = nk ? *nk : EMPTY_STRING;
genera_fat(mask, contratto, nakey, log);
}
}
//metodo di alto livello con i punti principali del programma (come da analisi...)
@ -828,15 +1047,12 @@ void THardy_elab_docs::main_loop()
{
THardy_elab_docs_mask mask;
while (mask.run() == K_ENTER)
{
elabora(mask);
}
}
bool THardy_elab_docs::create()
{
open_files(LF_DOC, LF_RIGHEDOC, 0);
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, 0);
return TSkeleton_application::create();
}
@ -845,4 +1061,4 @@ int ha0500 (int argc, char* argv[])
THardy_elab_docs elabapp;
elabapp.run(argc, argv, TR("Generazione NAC"));
return 0;
}
}

View File

@ -4,6 +4,7 @@
TString4 TContratto_premi::_tipo_ant;
TString4 TContratto_premi::_tipo_post;
TString4 TContratto_premi::_tipo_rifa;
TString4 TContratto_premi::_tipo_nolo;
//metodi della TContratto_premi
char TContratto_premi::tipo_contratto() const
@ -16,6 +17,7 @@ char TContratto_premi::tipo_contratto() const
_tipo_ant = config.get("CoAntTip");
_tipo_post = config.get("CoPostTip");
_tipo_rifa = config.get("CoRifaTip");
_tipo_nolo = config.get("CoNoloTip");
}
//ritorna il tipo contratto come carattere; se non lo trova -> tipo 'P'osticipo perchè..
@ -24,18 +26,21 @@ char TContratto_premi::tipo_contratto() const
const TString& tipo_doc = get(DOC_TIPODOC);
if (tipo_doc == _tipo_ant)
return 'A';
else
{
if (tipo_doc == _tipo_rifa)
return 'R';
}
if (tipo_doc == _tipo_rifa)
return 'R';
if (tipo_doc == _tipo_nolo)
return 'N';
return 'P';
}
char TContratto_premi::frequenza() const
{
char f = get_char(DOC_CATVEN);
if (f < 'A') f = 'A';
if (f < 'A')
{
const TString& tipo_doc = get(DOC_TIPODOC);
f = tipo_doc == _tipo_nolo ? 'M' : 'A';
}
return f;
}
@ -49,6 +54,10 @@ bool TContratto_premi::data_valida(const TDate& datadoc) const
if (f.ok() && datadoc > f)
return false;
const TDate r = data_recesso();
if (r.ok() && datadoc > r)
return false;
return true;
}
@ -93,6 +102,7 @@ const TString& TCodArtEsselunga_cache::decode(const TString& codart)
/////////////////////////////////////////////////////////////
// Metodi di utility
/////////////////////////////////////////////////////////////
real hd_find_sconto(const TString& str_sconto)
{
real val_perc;
@ -203,7 +213,7 @@ void hd_key2conto(const TString& key, int& gr, int& co, long& so)
{
gr = atoi(key.mid(1,2));
co = atoi(key.mid(3,2));
so = atoi(key.mid(5,3));
so = atol(key.mid(5,3));
}
const TString& hd_get_next_att_key(const TString& codart)
@ -225,7 +235,5 @@ const TString& hd_get_next_att_key(const TString& codart)
codtab.format("%-5s%07d", (const char*)codart, last_prog + 1);
return codtab;
}
return EMPTY_STRING;
}

View File

@ -27,7 +27,7 @@
class TContratto_premi : public TDocumento
{
static TString4 _tipo_ant, _tipo_post, _tipo_rifa;
static TString4 _tipo_ant, _tipo_post, _tipo_rifa, _tipo_nolo;
public:
char tipo_contratto() const;
@ -36,6 +36,7 @@ public:
TDate data_inizio() const { return get_date(DOC_DATACOMP); }
TDate data_fine() const { return get_date(DOC_DATAFCOMP); }
TDate data_recesso() const { return get_date(DOC_DATASCIMP); }
bool data_valida(const TDate& datadoc) const;
TContratto_premi(char provv, int anno, const char* codnum, long ndoc);