Aggiunta prima versione programmi:

- Gestione agenti
  - Gestione provvigioni
  - Gestione tabelle

Da fare:
  stampe varie


git-svn-id: svn://10.65.10.50/trunk@5108 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1997-08-27 09:18:41 +00:00
parent 3f560b06df
commit 1fe4f39307
30 changed files with 2817 additions and 13 deletions

27
pr/agenti.h Executable file
View File

@ -0,0 +1,27 @@
#ifndef __AGE_H
#define __AGE_H
#define AGE_CODAGE "CODAGE"
#define AGE_RAGSOC "RAGSOC"
#define AGE_CODFORN "CODFORN"
#define AGE_TIPO "TIPO"
#define AGE_CODCAPO "CODCAPO"
#define AGE_PERCCAPO "PERCCAPO"
#define AGE_PERCFATT "PERCFATT"
#define AGE_PERCPAG "PERCPAG"
#define AGE_TIPOIMP "TIPOIMP"
#define AGE_TIPOCAL "TIPOCAL"
#define AGE_PERCPROVV "PERCPROVV"
#define AGE_SEQRIC "SEQRIC"
#define AGE_CODRICPR1 "CODRICPR1"
#define AGE_CODRICPR2 "CODRICPR2"
#define AGE_CODRICPR3 "CODRICPR3"
#define AGE_CODRICPR4 "CODRICPR4"
#define AGE_SEQALT "SEQALT"
#define AGE_CODALTPR1 "CODALTPR1"
#define AGE_CODALTPR2 "CODALTPR2"
#define AGE_CODALTPR3 "CODALTPR3"
#define AGE_CODALTPR4 "CODALTPR4"
#endif

View File

@ -1,3 +1,3 @@
122
0
$agenti|0|0|116|36|Archivio agenti|||
$agenti|0|0|110|36|Archivio agenti|||

View File

@ -1,5 +1,5 @@
122
21
20
CODAGE|1|5|0|Codice agente
RAGSOC|1|50|0|Ragioe sociale
CODFORN|3|6|0|Codice fornitore relativo
@ -7,8 +7,7 @@ TIPO|1|1|0|Tipo (<A>gente, <C>apozona, <S>ubagente
CODCAPO|1|5|0|Codice dell'agente capozona
PERCCAPO|4|5|2|Percentuale di provvigione del capozona
PERCFATT|4|6|2|Percentuale di provvigione da liquidare all'atto della fatturazione
PERCPAG|4|6|2|Percentuale di provvigione da liquidare all'atto del pagamento
TIPOIMP1|1|1|0|Tipo importo su cui calcolare le provvigioni (<L>ordo, <N>etto)
TIPOIMP|1|1|0|Tipo importo su cui calcolare le provvigioni (<L>ordo, <N>etto)
TIPOCAL|1|1|0|Tipo di calcolo della provvigione (<D>ocumento, <R>iga per riga)
PERCPROVV|4|5|2|Percentuale di provvigione fissa dell'agente
SEQRIC|1|4|0|Sequenza di ricerca percentuale di provvigione (<A>gente, Categoria di <V>endita, <M>agazzino, <C>liente, C<O>ndizioni di vendita, Archivio <P>rovvigioni

View File

@ -1,3 +1,3 @@
123
0
$percprov|0|0|32|36|Archivio percentuali di provvigione|||
$percprov|0|0|67|36|Archivio percentuali di provvigione|||

View File

@ -1,9 +1,9 @@
123
5
CODPR|1|2|0|Codice archivio percentuale di provvigione
KEY|1|4|0|Chiave parametrica
TIPO|1|2|0|Tipo (Provvigione a <P>ercentuale , a <I>mporto unitario, a <V>alore complessivo))
KEYORD|1|40|0|Chiave parametrica
TIPO|1|1|0|Tipo (Provvigione a <P>ercentuale , a <I>mporto unitario, a <V>alore complessivo))
PERCPROVV|4|5|2|Percentuale di provvigione
IMPORTO|4|18|2|Importo unitario o Valore
1
CODPR+KEY|
CODPR+KEYORD|

View File

@ -4,15 +4,15 @@ CODAGE|1|5|0|Codice agente
ANNO|2|4|0|Anno del documento
CODNUM|1|4|0|Codice numerazione del documento
NDOC|3|7|0|Numero documento
NRIGA|1|4|0|Numero riga
NRATA|1|4|0|Numero rata
NRIGA|2|4|0|Numero riga
NRATA|2|4|0|Numero rata
GENERATA|1|1|0|Flag di generazione (< >Immessa, generata dal <D>ocumento)
DATADOC|5|8|0|Data del documento
IMPDOC|4|18|2|Totale documento
IMPPRDOC|4|18|2|Provvigione totale del documento
IMPNETDOC|4|18|2|Importo base di calcolo delle provvigioni (?)
CODCLI|3|6|0|Codice cliente
TIPOPAG|1|1|0|Tipo pagamento
TIPOPAG|2|1|0|Tipo pagamento
CODVAL|1|3|0|Codice valuta
CAMBIO|4|18|2|Cambio della valuta
DATACAMBIO|5|8|0|Data cambio
@ -24,6 +24,6 @@ PAGATO|4|18|2|Importo rata pagato
PROVVPAG|4|18|2|Provvigione pagata
PAGMAT|4|18|2|Pagamento maturato
PROVVMAT|4|18|2|Provvigione maturata
TIPOPAGPR|1|1|0|Tipo pagamento della provvigione (?)
TIPOPAGPR|2|1|0|Tipo pagamento della provvigione (?)
1
CODAGE+ANNO+CODNUM+NDOC+NRIGA+NRATA|
CODAGE+NRIGA|

11
pr/percprov.h Executable file
View File

@ -0,0 +1,11 @@
#ifndef __PER_H
#define __PER_H
#define PER_CODPR "CODPR"
#define PER_KEYORD "KEYORD"
#define PER_TIPO "TIPO"
#define PER_PERCPROVV "PERCPROVV"
#define PER_IMPORTO "IMPORTO"
#endif

34
pr/pr0.cpp Executable file
View File

@ -0,0 +1,34 @@
#include <xvt.h>
#include <checks.h>
#include "pr0.h"
const char* const usage = "Errore - uso : %s -{0|1|2|3|4|5|6}";
int main(int argc,char** argv)
{
const int n = argc > 1 ? atoi(argv[1]+1) : -1;
switch (n)
{
case 0:
pr0100(argc,argv); break; // gestione tabelle
case 1:
pr0200(argc,argv); break; // stampa tabelle
case 2:
pr0300(argc,argv); break; // parametri studio
case 3:
pr0400(argc,argv); break; // parametri ditta
case 4:
pr0500(argc,argv); break; // gestione agenti
case 5:
pr0600(argc,argv); break; // gestione archivi percentuali di provvigione
case 6:
pr0700(argc,argv); break; // gestione provvigioni agenti
default:
error_box(usage, argv[0]);
}
exit(0);
return 0;
}

13
pr/pr0.h Executable file
View File

@ -0,0 +1,13 @@
#ifndef __PR0_H
#define __PR0_H
int pr0100(int argc, char** argv);
int pr0200(int argc, char** argv);
int pr0300(int argc, char** argv);
int pr0400(int argc, char** argv);
int pr0500(int argc, char** argv);
int pr0600(int argc, char** argv);
int pr0700(int argc, char** argv);
#endif // __PR0_H

49
pr/pr0.url Executable file
View File

@ -0,0 +1,49 @@
#include <default.url>
/* pr0 -0 Gestione tabelle */
MENU TASK_MENUBAR
SUBMENU MENU_FILE "~File"
/* pr0 -1 Stampa tabelle */
MENUBAR MENU_BAR(1)
MENU MENU_BAR(1)
SUBMENU MENU_FILE "~File"
/* pr0 -2 Parametri studio */
MENUBAR MENU_BAR(2)
MENU MENU_BAR(2)
SUBMENU MENU_FILE "~File"
/* pr0 -3 Parametri ditta */
MENUBAR MENU_BAR(3)
MENU MENU_BAR(3)
SUBMENU MENU_FILE "~File"
/* pr0 -4 Gestione agenti */
MENUBAR MENU_BAR(4)
MENU MENU_BAR(4)
SUBMENU MENU_FILE "~File"
/* pr0 -5 Gestione percentuali di provvigione */
MENUBAR MENU_BAR(5)
MENU MENU_BAR(5)
SUBMENU MENU_FILE "~File"
/* pr0 -6 Gestione provvigioni */
MENUBAR MENU_BAR(6)
MENU MENU_BAR(6)
SUBMENU MENU_FILE "~File"

70
pr/pr0100.cpp Executable file
View File

@ -0,0 +1,70 @@
// Programma generico di gestione tabelle modulo provvigioni agenti
#include <tabapp.h>
#include <tabutil.h>
#include "prtbapr.h"
class TTablePR_app : public Tab_application
{
protected:
virtual bool user_destroy() ;
virtual bool user_create() ;
static bool gmc_handler(TMask_field& f, KEY k);
public:
TTablePR_app() {}
virtual ~TTablePR_app() {}
};
static inline TTablePR_app& app() { return (TTablePR_app&)main_app(); }
bool TTablePR_app::gmc_handler(TMask_field& f, KEY k)
{
if (f.to_check(k))
{
TString v1 = f.get(),v2;
TMask& m = f.mask();
if (v1 == "E" || v1 == "R")
{
for (short id = F_SEQRIC1; id <= F_SEQRIC4; id++)
{
if (f.dlg() == id)
continue;
v2 = m.get(id);
if (v1 == "E" && v2 == "R" || v1 == "R" && v2 == "E")
return f.error_box("Non e' possibile usare contemporaneamente la "
"tabella gruppo merceologico e la tabella sottogruppo "
"merceologico");
}
}
}
return TRUE;
}
bool TTablePR_app::user_create()
{
Tab_application::user_create();
const TString& name = get_tabname();
TMask& mask = *get_mask();
if (name == "APR")
{
mask.set_handler(F_SEQRIC1,gmc_handler);
mask.set_handler(F_SEQRIC2,gmc_handler);
mask.set_handler(F_SEQRIC3,gmc_handler);
mask.set_handler(F_SEQRIC4,gmc_handler);
}
return TRUE;
}
bool TTablePR_app::user_destroy()
{
return Tab_application::user_destroy();
}
int pr0100(int argc, char** argv)
{
TTablePR_app a;
a.run(argc, argv, "Tabella");
return 0;
}

5
pr/pr0200.cpp Executable file
View File

@ -0,0 +1,5 @@
int pr0200(int argc, char** argv)
{
return 0;
}

5
pr/pr0300.cpp Executable file
View File

@ -0,0 +1,5 @@
int pr0300(int argc, char** argv)
{
return 0;
}

5
pr/pr0400.cpp Executable file
View File

@ -0,0 +1,5 @@
int pr0400(int argc, char** argv)
{
return 0;
}

130
pr/pr0500.cpp Executable file
View File

@ -0,0 +1,130 @@
// Programma di gestione agenti
#include <relapp.h>
#include "agenti.h"
#include "pr0.h"
#include "pr0500a.h"
class TGestione_agenti_app:public TRelation_application
{
TMask *_msk;
TRelation *_rel;
TLocalisamfile *_age;
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual TMask* get_mask(int mode) {return _msk;}
virtual bool changing_mask(int mode) {return FALSE;}
virtual TRelation* get_relation() const {return _rel;}
static bool percfat_handler(TMask_field& f, KEY k);
static bool codcapo_handler(TMask_field& f, KEY k);
static bool seqalt_handler(TMask_field& f, KEY k);
static bool codalt_handler(TMask_field& f, KEY k);
public:
TGestione_agenti_app() {};
~TGestione_agenti_app() {};
};
static inline TGestione_agenti_app& app() { return (TGestione_agenti_app&) main_app(); }
bool TGestione_agenti_app::percfat_handler(TMask_field& f, KEY k)
{
if (f.to_check(k,TRUE))
{
const real p = 100.0 - real(f.get());
f.mask().set(F_PERCPAG,p);
}
return TRUE;
}
bool TGestione_agenti_app::codcapo_handler(TMask_field& f, KEY k)
{
if (f.to_check(k) && k == K_ENTER) // Solo prima che prema il pulsante di registrazione
{
TLocalisamfile* agenti = app()._age;
TRecfield agente(agenti->curr(),AGE_CODAGE);
TRecfield capo(agenti->curr(),AGE_CODCAPO);
TString ag = f.mask().get(F_CODAGE),ca = f.get();
agente = ca;
while (agenti->read() == NOERR)
{
ca = capo;
if (ca == ag)
break;
if (ca.empty())
break;
agente = ca;
}
if (agenti->good() && ca == ag)
return f.error_box("Il codice del capozona inserito non e' valido, in quanto e' stato rilevato nella catena un codice capozona corrispondente al presente codice agente.");
}
return TRUE;
}
bool TGestione_agenti_app::seqalt_handler(TMask_field& f, KEY k)
{
if (f.to_check(k) && k == K_ENTER) // Solo prima che prema il pulsante di registrazione
{
if (f.get() == "A")
{
TMask& m = f.mask();
if (m.get(F_SEQRIC1) == "A" || m.get(F_SEQRIC2) == "A" ||
m.get(F_SEQRIC3) == "A" || m.get(F_SEQRIC4) == "A")
return f.error_box("La percentuale definita nell'agente non puo' essere usata nella indicazione "
"di percentuale aggiuntiva se gia' utilizzata nella sequenza di ricerca della percentuale di provvigione");
}
}
return TRUE;
}
bool TGestione_agenti_app::codalt_handler(TMask_field& f, KEY k)
{
if (f.to_check(k) && k == K_ENTER) // Solo prima che prema il pulsante di registrazione
{
TString16 cod = f.get();
if (cod.not_empty())
{
TMask& m = f.mask();
if (m.get(F_CODRICPR1) == cod || m.get(F_CODRICPR2) == cod ||
m.get(F_CODRICPR3) == cod || m.get(F_CODRICPR4) == cod)
return f.error_box("L'archivio provvigioni %s definito nella indicazione di percentuale aggiuntiva non puo' essere utilizzato "
"se gia' impostato nella sequenza di ricerca della percentuale di provvigione", (const char*)cod);
}
}
return TRUE;
}
bool TGestione_agenti_app::user_create()
{
_msk = new TMask("pr0500a") ;
_rel = new TRelation(LF_AGENTI);
_msk->set_handler(F_CODCAPO,codcapo_handler);
_msk->set_handler(F_SEQALT1,seqalt_handler);
_msk->set_handler(F_SEQALT2,seqalt_handler);
_msk->set_handler(F_SEQALT3,seqalt_handler);
_msk->set_handler(F_SEQALT4,seqalt_handler);
_msk->set_handler(F_CODALTPR1,codalt_handler);
_msk->set_handler(F_CODALTPR2,codalt_handler);
_msk->set_handler(F_CODALTPR3,codalt_handler);
_msk->set_handler(F_CODALTPR4,codalt_handler);
_msk->set_handler(F_PERCFATT,percfat_handler);
_age = new TLocalisamfile (LF_AGENTI);
return TRUE;
}
bool TGestione_agenti_app::user_destroy()
{
delete _msk;
delete _rel;
delete _age;
return TRUE;
}
int pr0500(int argc, char** argv)
{
TGestione_agenti_app a;
a.run(argc,argv,"Gestione agenti");
return 0;
}

32
pr/pr0500a.h Executable file
View File

@ -0,0 +1,32 @@
// campi maschera pr0500a.uml
#define F_CODAGE 101
#define F_RAGSOC 102
#define F_CODFORN 103
#define F_DESCRFORN 104
#define F_TIPO 105
#define F_CODCAPO 106
#define F_DESCRCAPO 107
#define F_PERCCAPO 108
#define F_PERCFATT 109
#define F_PERCPAG 110
#define F_TIPOIMP 111
#define F_TIPOCAL 112
#define F_PERCPROVV 113
#define F_SEQRIC1 114
#define F_SEQRIC2 115
#define F_SEQRIC3 116
#define F_SEQRIC4 117
#define F_CODRICPR1 118
#define F_CODRICPR2 119
#define F_CODRICPR3 120
#define F_CODRICPR4 121
#define F_SEQALT1 122
#define F_SEQALT2 123
#define F_SEQALT3 124
#define F_SEQALT4 125
#define F_CODALTPR1 126
#define F_CODALTPR2 127
#define F_CODALTPR3 128
#define F_CODALTPR4 129

404
pr/pr0500a.uml Executable file
View File

@ -0,0 +1,404 @@
#include "pr0500a.h"
TOOLBAR "" 0 20 0 2
#include <toolbar.h>
ENDPAGE
PAGE "Gestione Agenti" -1 -1 78 8
GROUPBOX DLG_NULL 80 4
BEGIN
PROMPT 1 1 "Agente"
FLAGS "R"
END
STRING F_CODAGE 5
BEGIN
PROMPT 2 2 "Codice "
FIELD CODAGE
FLAGS "UZ"
KEY 1
USE LF_AGENTI
INPUT CODAGE F_CODAGE
DISPLAY "Codice@8R" CODAGE
DISPLAY "Descrizione@50" RAGSOC
OUTPUT F_CODAGE CODAGE
OUTPUT F_RAGSOC RAGSOC
CHECKTYPE REQUIRED
END
STRING F_RAGSOC 50
BEGIN
PROMPT 2 3 "Ragione sociale "
FIELD RAGSOC
KEY 2
USE LF_AGENTI KEY 2
INPUT RAGSOC F_RAGSOC
DISPLAY "Descrizione@50" RAGSOC
DISPLAY "Codice@8R" CODAGE
COPY OUTPUT F_CODAGE
CHECKTYPE REQUIRED
END
NUMBER F_CODFORN 6
BEGIN
PROMPT 2 5 "Cod. fornitore "
FIELD CODFORN
USE LF_CLIFO KEY 1 SELECT TIPOCF=="F"
INPUT TIPOCF "F"
INPUT CODCF F_CODFORN
DISPLAY "Codice" CODCF
DISPLAY "Ragione sociale@50" RAGSOC
OUTPUT F_CODFORN CODCF
OUTPUT F_DESCRFORN RAGSOC
CHECKTYPE NORMAL
ADD RUN CG0 -1
END
STRING F_DESCRFORN 50
BEGIN
PROMPT 27 5 ""
USE LF_CLIFO KEY 2 SELECT TIPOCF=="F"
INPUT TIPOCF "F"
INPUT RAGSOC F_DESCRFORN
DISPLAY "Ragione sociale@50" RAGSOC
DISPLAY "Codice" CODCF
OUTPUT F_CODFORN CODCF
OUTPUT F_DESCRFORN RAGSOC
CHECKTYPE NORMAL
ADD RUN CG0 -1
END
LISTBOX F_TIPO 10
BEGIN
PROMPT 2 6 "Tipo agente "
FIELD TIPO
ITEM "A|Agente"
ITEM "C|Capozona"
ITEM "S|Subagente"
END
GROUPBOX DLG_NULL 80 4
BEGIN
PROMPT 1 7 "Capozona"
FLAGS "R"
END
STRING F_CODCAPO 5
BEGIN
PROMPT 2 8 "Cod. capozona "
FIELD CODCAPO
FLAGS "UZ"
USE LF_AGENTI
INPUT CODAGE F_CODCAPO
DISPLAY "Codice@8R" CODAGE
DISPLAY "Descrizione@50" RAGSOC
OUTPUT F_CODCAPO CODAGE
OUTPUT F_DESCRCAPO RAGSOC
CHECKTYPE NORMAL
MESSAGE EMPTY CLEAR,F_PERCCAPO
MESSAGE ENABLE,F_PERCCAPO
END
STRING F_DESCRCAPO 50
BEING
PROMPT 27 8 ""
USE LF_AGENTI KEY 2
INPUT RAGSOC F_DESCRCAPO
DISPLAY "Descrizione@50" RAGSOC
DISPLAY "Codice@8R" CODAGE
OUTPUT F_CODCAPO CODAGE
OUTPUT F_DESCRCAPO RAGSOC
CHECKTYPE NORMAL
END
NUMBER F_PERCCAPO 5 2
BEGIN
PROMPT 2 9 "% provvigione capozona sulle provvigioni "
FIELD PERCCAPO
NUM_EXPR {(#F_PERCCAPO>=0.0)&&(#F_PERCCAPO<100.0)}
WARNING "Inserire una percentuale tra 0 e 100"
END
NUMBER F_PERCFATT 6 2
BEGIN
PROMPT 2 11 "% provvigione da liquidare alla fatturazione "
FIELD PERCFATT
NUM_EXPR {(#F_PERCFATT>=0.0)&&(#F_PERCFATT<=100.0)}
WARNING "Inserire una percentuale tra 0 e 100"
END
NUMBER F_PERCPAG 6 2
BEGIN
PROMPT 2 12 "% provvigione da liquidare al pagamento "
FLAGS "D"
END
LISTBOX F_TIPOIMP 5
BEGIN
PROMPT 2 13 "Tipo di importo per il calcolo provvigione "
FIELD TIPOIMP
ITEM "L|Lordo"
ITEM "N|Netto"
END
LISTBOX F_TIPOCAL 9
BEGIN
PROMPT 2 14 "Tipo di calcolo provvigione "
FIELD TIPOCAL
ITEM "D|Documento"
ITEM "R|Riga"
END
NUMBER F_PERCPROVV 5 2
BEGIN
PROMPT 2 15 "% provvigione fissa "
FIELD PERCPROVV
NUM_EXPR {(#F_PERCPROVV>=0.0)&&(#F_PERCPROVV<100.0)}
WARNING "Inserire una percentuale tra 0 e 100"
END
ENDPAGE
PAGE "Ricerche" -1 -1 78 8
LISTBOX F_SEQRIC1 22
BEGIN
PROMPT 1 2 "Sequenza ricerca % provvigione "
FIELD SEQRIC[1,1]
ITEM "A|Agente" MESSAGE CLEAR,F_CODRICPR1
ITEM "V|Categoria di vendita" MESSAGE CLEAR,F_CODRICPR1
ITEM "M|Articolo di magazzino" MESSAGE CLEAR,F_CODRICPR1
ITEM "C|Cliente" MESSAGE CLEAR,F_CODRICPR1
ITEM "O|Condizione di vendita" MESSAGE CLEAR,F_CODRICPR1
ITEM "1|Archivio % provvigioni" MESSAGE ENABLE,F_CODRICPR1
STR_EXPR ((#THIS_FIELD!=#F_SEQRIC2)&&(#THIS_FIELD!=#F_SEQRIC3)&&(#THIS_FIELD!=#F_SEQRIC4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
END
STRING F_CODRICPR1 2
BEGIN
PROMPT 59 2 ""
FIELD CODRICPR1
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODRICPR1
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODRICPR1 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODRICPR2)&&(#THIS_FIELD!=#F_CODRICPR3)&&(#THIS_FIELD!=#F_CODRICPR4))
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
LISTBOX F_SEQRIC2 22
BEGIN
PROMPT 32 3 ""
FIELD SEQRIC[2,2]
ITEM "-|Nessuno" MESSAGE CLEAR,5@|CLEAR,F_CODRICPR2
ITEM "A|Agente" MESSAGE ENABLE,F_SEQRIC3|CLEAR,F_CODRICPR2
ITEM "V|Categoria di vendita" MESSAGE ENABLE,F_SEQRIC3|CLEAR,F_CODRICPR2
ITEM "M|Articolo di magazzino" MESSAGE ENABLE,F_SEQRIC3|CLEAR,F_CODRICPR2
ITEM "C|Cliente" MESSAGE ENABLE,F_SEQRIC3|CLEAR,F_CODRICPR2
ITEM "O|Condizione di vendita" MESSAGE ENABLE,F_SEQRIC3|CLEAR,F_CODRICPR2
ITEM "2|Archivio % provvigioni" MESSAGE ENABLE,F_SEQRIC3|ENABLE,F_CODRICPR2
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQRIC1)&&(#THIS_FIELD!=#F_SEQRIC3)&&(#THIS_FIELD!=#F_SEQRIC4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
END
STRING F_CODRICPR2 2
BEGIN
PROMPT 59 3 ""
FIELD CODRICPR2
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODRICPR2
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODRICPR2 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODRICPR1)&&(#THIS_FIELD!=#F_CODRICPR3)&&(#THIS_FIELD!=#F_CODRICPR4))
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
LISTBOX F_SEQRIC3 22
BEGIN
PROMPT 32 4 ""
FIELD SEQRIC[3,3]
ITEM "-|Nessuno" MESSAGE CLEAR,F_SEQRIC4|CLEAR,F_CODRICPR3
ITEM "A|Agente" MESSAGE ENABLE,F_SEQRIC4|CLEAR,F_CODRICPR3
ITEM "V|Categoria di vendita" MESSAGE ENABLE,F_SEQRIC4|CLEAR,F_CODRICPR3
ITEM "M|Articolo di magazzino" MESSAGE ENABLE,F_SEQRIC4|CLEAR,F_CODRICPR3
ITEM "C|Cliente" MESSAGE ENABLE,F_SEQRIC4|CLEAR,F_CODRICPR3
ITEM "O|Condizione di vendita" MESSAGE ENABLE,F_SEQRIC4|CLEAR,F_CODRICPR3
ITEM "3|Archivio % provvigioni" MESSAGE ENABLE,F_SEQRIC4|ENABLE,F_CODRICPR3
GROUP 5
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQRIC1)&&(#THIS_FIELD!=#F_SEQRIC2)&&(#THIS_FIELD!=#F_SEQRIC4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
END
STRING F_CODRICPR3 2
BEGIN
PROMPT 59 4 ""
FIELD CODRICPR3
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODRICPR3
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODRICPR3 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODRICPR1)&&(#THIS_FIELD!=#F_CODRICPR2)&&(#THIS_FIELD!=#F_CODRICPR4))
GROUP 4 5
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
LISTBOX F_SEQRIC4 22
BEGIN
PROMPT 32 5 ""
FIELD SEQRIC[4,4]
ITEM "-|Nessuno" MESSAGE CLEAR,F_CODRICPR4
ITEM "A|Agente" MESSAGE CLEAR,F_CODRICPR4
ITEM "V|Categoria di vendita" MESSAGE CLEAR,F_CODRICPR4
ITEM "M|Articolo di magazzino" MESSAGE CLEAR,F_CODRICPR4
ITEM "C|Cliente" MESSAGE CLEAR,F_CODRICPR4
ITEM "O|Condizione di vendita" MESSAGE CLEAR,F_CODRICPR4
ITEM "4|Archivio % provvigioni" MESSAGE ENABLE,F_CODRICPR4
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQRIC1)&&(#THIS_FIELD!=#F_SEQRIC2)&&(#THIS_FIELD!=#F_SEQRIC3))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
GROUP 5
END
STRING F_CODRICPR4 2
BEGIN
PROMPT 59 5 ""
FIELD CODRICPR4
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODRICPR4
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODRICPR4 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODRICPR1)&&(#THIS_FIELD!=#F_CODRICPR2)&&(#THIS_FIELD!=#F_CODRICPR3))
GROUP 4 5
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
LISTBOX F_SEQALT1 22
BEGIN
PROMPT 1 9 "Indicazione % aggiuntiva "
FIELD SEQALT[1,1]
ITEM "-|Nessuno" MESSAGE CLEAR,6@
ITEM "A|Agente" MESSAGE CLEAR,F_CODALTPR1|ENABLE,F_SEQALT2
ITEM "1|Archivio % provvigioni" MESSAGE ENABLE,F_CODALTPR1|ENABLE,F_SEQALT2
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQALT2)&&(#THIS_FIELD!=#F_SEQALT3)&&(#THIS_FIELD!=#F_SEQALT4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
END
STRING F_CODALTPR1 2
BEGIN
PROMPT 59 9 ""
FIELD CODALTPR1
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODALTPR1
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODALTPR1 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODALTPR2)&&(#THIS_FIELD!=#F_CODALTPR3)&&(#THIS_FIELD!=#F_CODALTPR4))
GROUP 6
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
LISTBOX F_SEQALT2 22
BEGIN
PROMPT 32 10 ""
FIELD SEQALT[2,2]
ITEM "-|Nessuno" MESSAGE CLEAR,7@|CLEAR,F_CODALTPR2
ITEM "A|Agente" MESSAGE ENABLE,F_SEQALT3|CLEAR,F_CODALTPR2
ITEM "2|Archivio % provvigioni" MESSAGE ENABLE,F_SEQALT3|ENABLE,F_CODALTPR2
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQALT1)&&(#THIS_FIELD!=#F_SEQALT3)&&(#THIS_FIELD!=#F_SEQALT4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
GROUP 6
END
STRING F_CODALTPR2 2
BEGIN
PROMPT 59 10 ""
FIELD CODALTPR2
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODALTPR2
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODALTPR2 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODALTPR1)&&(#THIS_FIELD!=#F_CODALTPR3)&&(#THIS_FIELD!=#F_CODALTPR4))
GROUP 6
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
LISTBOX F_SEQALT3 22
BEGIN
PROMPT 32 11 ""
FIELD SEQALT[3,3]
ITEM "-|Nessuno" MESSAGE CLEAR,F_SEQALT4|CLEAR,F_CODALTPR3
ITEM "A|Agente" MESSAGE ENABLE,F_SEQALT4|CLEAR,F_CODALTPR3
ITEM "3|Archivio % provvigioni" MESSAGE ENABLE,F_SEQALT4|ENABLE,F_CODALTPR3
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQALT1)&&(#THIS_FIELD!=#F_SEQALT2)&&(#THIS_FIELD!=#F_SEQALT4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
GROUP 6 7
END
STRING F_CODALTPR3 2
BEGIN
PROMPT 59 11 ""
FIELD CODALTPR3
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODALTPR3
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODALTPR3 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODALTPR1)&&(#THIS_FIELD!=#F_CODALTPR2)&&(#THIS_FIELD!=#F_CODALTPR4))
GROUP 6 7
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
LISTBOX F_SEQALT4 22
BEGIN
PROMPT 32 12 ""
FIELD SEQALT[4,4]
ITEM "-|Nessuno" MESSAGE CLEAR,F_CODALTPR4
ITEM "A|Agente" MESSAGE CLEAR,F_CODALTPR4
ITEM "4|Archivio % provvigioni" MESSAGE ENABLE,F_CODALTPR4
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQALT1)&&(#THIS_FIELD!=#F_SEQALT2)&&(#THIS_FIELD!=#F_SEQALT3))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
GROUP 6 7
END
STRING F_CODALTPR4 2
BEGIN
PROMPT 59 12 ""
FIELD CODALTPR4
FLAGS "UZ"
USE APR
INPUT CODTAB F_CODALTPR4
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODALTPR4 CODTAB
CHECKTYPE NORMAL
STR_EXPR (#THIS_FIELD=="")||((#THIS_FIELD!=#F_CODALTPR1)&&(#THIS_FIELD!=#F_CODALTPR2)&&(#THIS_FIELD!=#F_CODALTPR3))
GROUP 6 7
WARNING "Codice archivio non valido o gia' utilizzato per questa sequenza"
END
ENDPAGE
ENDMASK

253
pr/pr0600.cpp Executable file
View File

@ -0,0 +1,253 @@
// Programma di gestione percentuali di provvigione
#include <relapp.h>
#include <tabutil.h>
#include "percprov.h"
#include "pr0600a.h"
#include "pr0.h"
typedef short order[4];
class TGestione_percprovv_app:public TRelation_application
{
TMask *_msk;
TRelation *_rel;
order _ordinamento;
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual TMask* get_mask(int mode) {return _msk;}
virtual bool changing_mask(int mode) {return FALSE;}
virtual TRelation* get_relation() const {return _rel;}
virtual void init_query_mode(TMask& m);
virtual void init_query_insert_mode(TMask& m);
static bool codpr_handler(TMask_field& f, KEY k);
static bool complete_key_handler(TMask_field& f, KEY k);
static bool output_key_handler(TMask_field& f, KEY k);
static bool tipo_handler(TMask_field& f, KEY k);
static void set_order_fields(TString16& ord, TMask& m);
public:
TGestione_percprovv_app() {};
~TGestione_percprovv_app() {};
};
static inline TGestione_percprovv_app& app() { return (TGestione_percprovv_app&) main_app(); }
bool TGestione_percprovv_app::output_key_handler(TMask_field& f, KEY k)
{
if (k == K_TAB) // Viene passato solo quando entra in modifica, visto che e' disabled
{
order& kd = app()._ordinamento;
TMask& m = f.mask();
TString codpr = m.get(F_CODPR_QUERY);
TString key = f.get();
TString16 ord;
int from = 0;
TTable apr("APR");
apr.put("CODTAB",codpr);
if (apr.read() == NOERR)
ord = apr.get("S3");
set_order_fields(ord,m);
for (int i = 0; i < 4; i++)
{
if (kd[i] == 0)
break;
TMask_field& fld = m.field(kd[i]);
const word size = fld.size();
fld.set(key.mid(from,size));
from += size;
}
((TEditable_field&)f).test_key_complete(FALSE);
}
return TRUE;
}
bool TGestione_percprovv_app::tipo_handler(TMask_field& f, KEY k)
{
if (f.to_check(k))
{
const char v = f.get()[0];
if (v == 'I' || v == 'V')
{
order& kd = app()._ordinamento;
bool found = FALSE;
for (int i = 0; i < 4 && !found; i++)
if (kd[i] == F_CODART)
found = TRUE;
if (!found)
return f.error_box("Impossibile settare il tipo di provvigione ad importo unitario o valore se non "
"e' presente la ricerca per codice articolo.");
}
}
return TRUE;
}
bool TGestione_percprovv_app::complete_key_handler(TMask_field& f, KEY k)
{
if (f.to_check(k))
{
TMask& m = f.mask();
TString v,k,fmt;
order& kd = app()._ordinamento;
for (int i = 0; i < 4; i++)
{
if (kd[i] == 0)
break;
TMask_field& f = m.field(kd[i]);
if (kd[i] != F_CLIENTE)
fmt.format("%%-%us",f.size());
else
fmt.format("%%%us",f.size());
v.format(fmt,(const char*)f.get());
k << v;
}
m.set(F_KEYORD,k);
}
return TRUE;
}
void TGestione_percprovv_app::set_order_fields(TString16& ord, TMask& m)
{
order& kd = app()._ordinamento;
for (int i = 0; i < 4; i++)
switch (ord[i])
{
case 'C':
m.show(-5);
m.field(F_CLIENTE).check_type(CHECK_REQUIRED);
kd[i] = F_CLIENTE;
break;
case 'V':
m.show(-6);
m.field(F_CATVEN).check_type(CHECK_REQUIRED);
kd[i] = F_CATVEN;
break;
case 'A':
m.show(-7);
m.field(F_CODAGE).check_type(CHECK_REQUIRED);
kd[i] = F_CODAGE;
break;
case 'P':
m.show(-8);
m.field(F_CODPAG).check_type(CHECK_REQUIRED);
kd[i] = F_CODPAG;
break;
case 'S':
m.show(-9);
m.field(F_CODSCONTO).check_type(CHECK_REQUIRED);
kd[i] = F_CODSCONTO;
break;
case 'Z':
m.show(-10);
m.field(F_CODZONA).check_type(CHECK_REQUIRED);
kd[i] = F_CODZONA;
break;
case 'M':
m.show(-11);
m.field(F_CODART).check_type(CHECK_REQUIRED);
kd[i] = F_CODART;
break;
case 'E':
m.show(-12);
m.field(F_CODGMC).check_type(CHECK_REQUIRED);
kd[i] = F_CODGMC;
break;
case 'R':
m.show(-13);
m.field(F_CODSMC).check_type(CHECK_REQUIRED);
kd[i] = F_CODSMC;
break;
case 'F':
m.show(-14);
m.field(F_CODRFA).check_type(CHECK_REQUIRED);
kd[i] = F_CODRFA;
break;
default:
kd[i] = 0;
break;
}
}
bool TGestione_percprovv_app::codpr_handler(TMask_field& f, KEY k)
{
if (f.to_check(k))
{
TTable apr("APR");
TString s(f.get());
apr.put("CODTAB",s);
if (apr.read() == NOERR)
{
TString16 ord;
TMask& m = f.mask();
ord = apr.get("S3");
m.set(F_DESCR,apr.get("S0"));
m.show(F_TIPO);
m.show(F_PERCPROVV);
set_order_fields(ord,m);
}
else
return f.error_box("Codice archivio non presente");
}
return TRUE;
}
void TGestione_percprovv_app::init_query_mode(TMask& m)
{
m.hide(F_CODPR_NEW);
m.show(F_CODPR_QUERY);
set_search_field(F_CODPR_QUERY);
m.hide(-1);
for (short i = F_CLIENTE; i<=F_CODRFA; i+=2)
m.field(i).check_type(CHECK_NONE); // Il flag di forced rimane a TRUE
}
void TGestione_percprovv_app::init_query_insert_mode(TMask& m)
{
m.hide(F_CODPR_QUERY);
m.show(F_CODPR_NEW);
set_search_field(F_CODPR_NEW);
m.hide(-1);
for (short i = F_CLIENTE; i<=F_CODRFA; i+=2)
m.field(i).check_type(CHECK_NONE); // Il flag di forced rimane a TRUE
}
bool TGestione_percprovv_app::user_create()
{
_msk = new TMask("pr0600a") ;
_msk->set_handler(F_CODPR_QUERY,codpr_handler);
_msk->set_handler(F_CODPR_NEW,codpr_handler);
_msk->set_handler(F_CLIENTE,complete_key_handler);
_msk->set_handler(F_CATVEN,complete_key_handler);
_msk->set_handler(F_CODAGE,complete_key_handler);
_msk->set_handler(F_CODPAG,complete_key_handler);
_msk->set_handler(F_CODSCONTO,complete_key_handler);
_msk->set_handler(F_CODZONA,complete_key_handler);
_msk->set_handler(F_CODART,complete_key_handler);
_msk->set_handler(F_CODGMC,complete_key_handler);
_msk->set_handler(F_CODSMC,complete_key_handler);
_msk->set_handler(F_CODRFA,complete_key_handler);
_msk->set_handler(F_KEYORD,output_key_handler);
_msk->set_handler(F_TIPO,tipo_handler);
_rel = new TRelation(LF_PERCPROV);
return TRUE;
}
bool TGestione_percprovv_app::user_destroy()
{
delete _msk;
delete _rel;
return TRUE;
}
int pr0600(int argc, char** argv)
{
TGestione_percprovv_app a;
a.run(argc,argv,"Gestione percentuali provvigione");
return 0;
}

33
pr/pr0600a.h Executable file
View File

@ -0,0 +1,33 @@
// campi maschera pr0600a.uml
#define F_CODPR_QUERY 101
#define F_CODPR_NEW 102
#define F_DESCR 103
#define F_KEYORD 104
#define F_CLIENTE 105
#define F_DESCR1 106
#define F_CATVEN 107
#define F_DESCR2 108
#define F_CODAGE 109
#define F_DESCR3 110
#define F_CODPAG 111
#define F_DESCR4 112
#define F_CODSCONTO 113
#define F_DESCR5 114
#define F_CODZONA 115
#define F_DESCR6 116
#define F_CODART 117
#define F_DESCR7 118
#define F_CODGMC 119
#define F_DESCR8 120
#define F_CODSMC 121
#define F_DESCR9 122
#define F_CODRFA 123
#define F_DESCR10 124
#define F_TIPO 125
#define F_PERCPROVV 126
#define F_IMPORTO 127
#define F_TIMPORTO 128
#define F_TVALORE 129

334
pr/pr0600a.uml Executable file
View File

@ -0,0 +1,334 @@
#include "pr0600a.h"
TOOLBAR "" 0 20 0 2
#include <toolbar.h>
ENDPAGE
PAGE "Percentuali provvigione" -1 -1 78 8
GROUPBOX DLG_NULL 80 4
BEGIN
PROMPT 1 1 "Archivio"
FLAGS "R"
END
STRING F_CODPR_QUERY 2
BEGIN
PROMPT 2 2 "Codice archivio "
FIELD CODPR
FLAGS "UZ"
KEY 1
USE LF_PERCPROV KEY 1 //SELECT CODPR==#F_CODPR_QUERY
INPUT CODPR F_CODPR_QUERY
INPUT KEYORD F_KEYORD
DISPLAY "Archivio" CODPR
DISPLAY "Ordinamento@40" KEYORD
OUTPUT F_CODPR_QUERY CODPR
OUTPUT F_KEYORD KEYORD
CHECKTYPE REQUIRED
END
STRING F_CODPR_NEW 2
BEGIN
PROMPT 2 2 "Codice archivio "
FIELD CODPR
FLAGS "HUZ"
KEY 1
USE APR
INPUT CODTAB F_CODPR_NEW
DISPLAY "Codice@10" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODPR_NEW CODTAB
CHECKTYPE FORCED
WARNING "Codice archivio non presente"
END
STRING F_DESCR 50
BEGIN
PROMPT 2 3 "Descrizione "
FLAGS "D"
END
STRING F_KEYORD 40
BEGIN
PROMPT 100 100 "Ordinamento "
FLAGS "D_"
FIELD KEYORD
KEY 1
USE LF_PERCPROV
INPUT CODPR F_CODPR_QUERY SELECT
INPUT KEYORD F_KEYORD
DISPLAY "Archivio" CODPR
DISPLAY "Ordinamento@40" KEYORD
OUTPUT F_CODPR_QUERY CODPR
OUTPUT F_KEYORD KEYORD
CHECKTYPE REQUIRED
END
STRING F_CLIENTE 6
BEGIN
PROMPT 2 6 "Cod. cliente "
FLAGS "R"
KEY 1
USE LF_CLIFO KEY 1 SELECT TIPOCF=="C"
INPUT TIPOCF "C"
INPUT CODCF F_CLIENTE
DISPLAY "Codice" CODCF
DISPLAY "Ragione sociale@50" RAGSOC
OUTPUT F_CLIENTE CODCF
OUTPUT F_DESCR1 RAGSOC
CHECKTYPE FORCED
GROUP 1 5
END
STRING F_DESCR1 50 39
BEGIN
PROMPT 41 6 ""
FLAGS "D"
GROUP 1 5
END
STRING F_CATVEN 2
BEGIN
PROMPT 2 7 "Cat. vendita "
FLAGS "U"
KEY 1
USE CVE
INPUT CODTAB F_CATVEN
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CATVEN CODTAB
OUTPUT F_DESCR2 S0
CHECKTYPE FORCED
GROUP 1 6
END
STRING F_DESCR2 50 39
BEGIN
PROMPT 41 7 ""
FLAGS "D"
GROUP 1 6
END
STRING F_CODAGE 5
BEGIN
PROMPT 2 8 "Cod. agente "
FLAGS "UZ"
KEY 1
USE LF_AGENTI
INPUT CODAGE F_CODAGE
DISPLAY "Codice" CODAGE
DISPLAY "Ragione sociale@50" RAGSOC
OUTPUT F_CODAGE CODAGE
OUTPUT F_DESCR3 RAGSOC
CHECKTYPE FORCED
GROUP 1 7
END
STRING F_DESCR3 50 39
BEGIN
PROMPT 41 8 ""
FLAGS "D"
GROUP 1 7
END
STRING F_CODPAG 4
BEGIN
PROMPT 2 9 "Cod. pagamento "
FLAGS "UZ"
KEY 1
USE %CPG
INPUT CODTAB F_CODPAG
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODPAG CODTAB
OUTPUT F_DESCR4 S0
CHECKTYPE FORCED
GROUP 1 8
END
STRING F_DESCR4 50 39
BEGIN
PROMPT 41 9 ""
FLAGS "D"
GROUP 1 8
END
STRING F_CODSCONTO 2
BEGIN
PROMPT 2 10 "Cod. sconto "
FLAGS "U"
KEY 1
USE %SCC
INPUT CODTAB F_CODSCONTO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODSCONTO CODTAB
OUTPUT F_DESCR5 S0
CHECKTYPE FORCED
GROUP 1 9
END
STRING F_DESCR5 50 39
BEGIN
PROMPT 41 10 ""
FLAGS "D"
GROUP 1 9
END
STRING F_CODZONA 2
BEGIN
PROMPT 2 11 "Cod. zona "
FLAGS "U"
KEY 1
USE ZON
INPUT CODTAB F_CODZONA
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODZONA CODTAB
OUTPUT F_DESCR6 S0
CHECKTYPE FORCED
GROUP 1 10
END
STRING F_DESCR6 50 39
BEGIN
PROMPT 41 11 ""
FLAGS "D"
GROUP 1 10
END
STRING F_CODART 20
BEGIN
PROMPT 2 12 "Cod. articolo "
FLAGS "U"
KEY 1
USE LF_ANAMAG
INPUT CODART F_CODART
DISPLAY "Articolo@20" CODART
DISPLAY "Descrizione@50" DESCR
OUTPUT F_CODART CODART
OUTPUT F_DESCR7 DESCR
CHECKTYPE FORCED
GROUP 1 11
END
STRING F_DESCR7 50 39
BEGIN
PROMPT 41 12 ""
FLAGS "D"
GROUP 1 11
END
STRING F_CODGMC 3
BEGIN
PROMPT 2 13 "Cat. merc. "
FLAGS "U"
KEY 1
USE GMC SELECT CODTAB[4,5]==""
INPUT CODTAB F_CODGMC
DISPLAY "Codice" CODTAB[1,3]
DISPLAY "Descrizione@50" S0
OUTPUT F_CODGMC CODTAB[1,3]
OUTPUT F_DESCR8 S0
CHECKTYPE FORCED
GROUP 1 12
END
STRING F_DESCR8 50 39
BEGIN
PROMPT 41 13 ""
FLAGS "D"
GROUP 1 12
END
STRING F_CODSMC 5
BEGIN
PROMPT 2 14 "Sottocat. merc. "
FLAGS "U"
KEY 1
USE GMC
INPUT CODTAB F_CODSMC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODSMC CODTAB
OUTPUT F_DESCR9 S0
CHECKTYPE FORCED
GROUP 1 13
END
STRING F_DESCR9 50 39
BEGIN
PROMPT 41 14 ""
FLAGS "D"
GROUP 1 13
END
STRING F_CODRFA 5
BEGIN
PROMPT 2 15 "Raggr. fiscale "
FLAGS "U"
KEY 1
USE RFA SELECT CODTAB
INPUT CODTAB F_CODRFA
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODRFA CODTAB
OUTPUT F_DESCR10 S0
CHECKTYPE FORCED
GROUP 1 14
END
STRING F_DESCR10 50 39
BEGIN
PROMPT 41 15 ""
FLAGS "D"
GROUP 1 14
END
LISTBOX F_TIPO 20
BEGIN
PROMPT 2 18 "Tipo provvigione "
FIELD TIPO
ITEM "P|Percentuale"
MESSAGE SHOW,F_PERCPROVV|HIDE,2@
ITEM "I|Importo unitario"
MESSAGE HIDE,F_PERCPROVV|SHOW,F_IMPORTO|SHOW,F_TIMPORTO|HIDE,F_TVALORE
ITEM "V|Valore complessivo"
MESSAGE HIDE,F_PERCPROVV|SHOW,F_IMPORTO|HIDE,F_TIMPORTO|SHOW,F_TVALORE
END
NUMBER F_PERCPROVV 5 2
BEGIN
PROMPT 2 19 "% provvigione "
FIELD PERCPROVV
NUM_EXPR {(#F_PERCPROVV>=0.0)&&(#F_PERCPROVV<100.0)}
WARNING "Inserire una percentuale tra 0 e 100"
END
TEXT F_TIMPORTO
BEGIN
PROMPT 2 19 "Importo unitario"
GROUP 2
END
TEXT F_TVALORE
BEGIN
PROMPT 2 19 "Valore complessivo "
GROUP 2
END
NUMBER F_IMPORTO 18 2
BEGIN
PROMPT 38 19 ""
FIELD IMPORTO
PICTURE "###.###.###.###"
GROUP 2
END
ENDPAGE
ENDMASK

408
pr/pr0700.cpp Executable file
View File

@ -0,0 +1,408 @@
// Programma di gestione provvigioni
#include <applicat.h>
#include <msksheet.h>
#include <urldefid.h>
#include <colors.h>
#include "prlib.h"
#include "provv.h"
#include "pr0700a.h"
#include "pr0700b.h"
#include "pr0.h"
class TGestione_provv_app:public TApplication
{
TMask *_msk;
TLocalisamfile *_provv;
TProvvigioni_agente *_prag;
bool _dirty;
protected:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG) ;
void load_provvigioni(TMask* m);
void fill_sheet_doc();
bool check_totals();
static bool doc_sheet_notify(TSheet_field& ds, int r, KEY key);
static bool rate_sheet_notify(TSheet_field& rs, int r, KEY key);
static bool nrata_handler(TMask_field& f, KEY key);
static bool ndoc_handler(TMask_field& f, KEY key);
static bool datascad_handler(TMask_field& f, KEY key);
static bool imprata_handler(TMask_field& f, KEY key);
static bool improvv_handler(TMask_field& f, KEY key);
static void fill_rate_doc(TRate_doc& rd, TSheet_field& sf);
public:
TGestione_provv_app() {};
~TGestione_provv_app() {};
};
static inline TGestione_provv_app& app() { return (TGestione_provv_app&) main_app(); }
static TString16 __current_key;
////////////////////////////////////////////////////////////////////////////////////////
// Da fare :
// - abilitazione colonne provvpag e pagato con pulsante
// - Calcolo provvigioni in caso di selezione documento
//
////////////////////////////////////////////////////////////////////////////////////////
bool TGestione_provv_app::nrata_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER)
{ // Scorre tutte le righe dello spreadsheet esaminando il numero di rata
// nel caso trovi un'altra riga con lo stesso numero, visualizza un errore
const int nrata = atoi(f.get());
TSheet_field& s = *f.mask().get_sheet();
const int selected = s.selected();
const int items = s.items(); // Numero di righe dello spreadsheet
for (int i = 0; i < items; i++)
if (i != selected)
{
int other_rata = s.row(i).get_int(0);
if (nrata == other_rata)
return f.error_box("Non e' possibile inserire due rate con lo stesso numero");
}
}
return TRUE;
}
bool TGestione_provv_app::ndoc_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER)
{ // Scorre tutte le righe dello spreadsheet esaminando ANNO+CODNUM+NDOC
// nel caso trovi un'altra riga con la stessa chiave, visualizza un errore
TSheet_field& s = *f.mask().get_sheet();
const int selected = s.selected();
const int items = s.items(); // Numero di righe dello spreadsheet
TToken_string& tt = s.row(selected);
int anno = tt.get_int(0);
TString codnum = tt.get(1);
long ndoc = tt.get_long(2);
TString key,other_key;
key.format("%4d%4s%7ld",anno,(const char*)codnum,ndoc);
for (int i = 0; i < items; i++)
if (i != selected)
{
TToken_string& ot = s.row(i);
anno = ot.get_int(0);
codnum = ot.get(1);
ndoc = ot.get_long(2);
other_key.format("%4d%4s%7ld",anno,(const char*)codnum,ndoc);
if (key == other_key)
return f.error_box("Non e' possibile inserire due documenti con lo stessa chiave");
}
}
return TRUE;
}
bool TGestione_provv_app::datascad_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER && __current_key.not_empty())
{
TProvvigioni_agente* pa = app()._prag;
TRate_doc& rd = pa->rate(__current_key);
TDate d(f.get());
if (d < rd.datadoc())
return f.error_box("La data di scadenza deve essere maggiore o uguale della data documento");
}
return TRUE;
}
bool TGestione_provv_app::imprata_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER && __current_key.not_empty())
{
TProvvigioni_agente* pa = app()._prag;
TRate_doc& rd = pa->rate(__current_key);
real r(f.get());
if (r > rd.impdoc())
return f.error_box("L'importo della rata non puo' essere maggiore dell'importo del documento");
}
return TRUE;
}
bool TGestione_provv_app::improvv_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER && __current_key.not_empty())
{
TProvvigioni_agente* pa = app()._prag;
TRate_doc& rd = pa->rate(__current_key);
real r(f.get());
if (r > rd.impprdoc())
return f.error_box("L'importo della provvigione non puo' essere maggiore dell'importo provvigione del documento");
}
return TRUE;
}
void TGestione_provv_app::fill_rate_doc(TRate_doc& rd, TSheet_field& sf)
{
// Righe delle rate
const int items = sf.items();
rd.remove_rata(); // cancella tutte le rate
for (int i = 0; i < items; i++) // Aggiunge le rate presenti nello sheet
{
TToken_string& tt = sf.row(i);
TRata* rt = new TRata;
rt->set(tt);
rd.add_rata(rt);
}
}
bool TGestione_provv_app::rate_sheet_notify(TSheet_field& ds, int r, KEY key)
{
if (__current_key.empty())
return TRUE;
TProvvigioni_agente* pa = app()._prag;
TRate_doc& rd = pa->rate(__current_key);
switch (key)
{
case K_INS: // Inserimento di una nuova rata vuota
{
TRata* rt = new TRata;
rt->set_generata(); // Nuova rata: va segnalata come inserita
rd.add_rata(rt);
app()._dirty = TRUE;
}
break;
case K_ENTER: // Notifica dell'avvenuta modifica di una rata
{
TRata& rt = rd[r]; // Sostituisce i valori della riga corrente
rt.set(ds.row(r));
app()._dirty = TRUE;
}
break;
case K_DEL: // Notifica della cancellazione di una riga
rd.remove_rata(r); // Effettua anche il pack degli elementi
app()._dirty = TRUE;
break;
default:
break;
}
return TRUE;
}
bool TGestione_provv_app::doc_sheet_notify(TSheet_field& ds, int r, KEY key)
{
TProvvigioni_agente* pa = app()._prag;
switch (key)
{
case K_INS: // Inserimento di un nuovo documento
{
TSheet_field& rs = (TSheet_field&) ds.mask().field(F_RATE_SHEET);
if (rs.items() > 0) // Resetta lo spreadsheet se vi sono delle righe
rs.reset();
app()._dirty = TRUE;
}
break;
case K_TAB: // Posizionamento sulla riga r
// Visualizza le rate relative sull'apposito sheet
{
TMask& m = ds.mask();
if (!m.is_running())
break;
TToken_string& tt = ds.row(r);
int anno = tt.get_int(0);
TString codnum = tt.get(1);
long ndoc = tt.get_long(2);
m.set(F_MANNO,anno);
m.set(F_MCODNUM,codnum);
m.set(F_MNDOC,ndoc);
__current_key.format("%4d%4s%7ld",anno,(const char*)codnum,ndoc);
TSheet_field& rs = (TSheet_field&) ds.mask().field(F_RATE_SHEET);
if (rs.items() > 0) // Resetta lo spreadsheet se vi sono delle righe precedenti
rs.reset();
TRate_doc& rd = pa->rate(__current_key,TRUE);
const int items = rd.items();
for (int i = 0; i < items; i++)
{
TRata& rt = rd[i];
TToken_string& ttt = rs.row(i);
ttt.add(rt.rata());
ttt.add(rt.datascad()); ttt.add(rt.imprata().string());
ttt.add(rt.impprovv().string()); ttt.add(rt.pagato().string());
ttt.add(rt.provvpag().string()); ttt.add(rt.pagmat().string());
ttt.add(rt.provvmat().string()); ttt.add(rt.saldata() ? "X" : " ");
ttt.add(rt.tipopagpr());
int i = 1;
i++;
}
rs.force_update();
}
break;
case K_ENTER: // Abbandono della riga r (modificata). Analogamente va fatto sullo sheet delle rate
// Memorizza rate e documento
// Confronta la chiave della riga attuale con quella ricavata quando ci si e'
// posizionati sopra.
// Se __current_key non e' vuota viene rimosso il vecchio TRate_doc
// e aggiunto quello con la chiave nuova
{
TToken_string& tt = ds.row(r);
int anno = tt.get_int(0);
TString codnum = tt.get(1);
long ndoc = tt.get_long(2);
TString k;
k.format("%4d%4s%7ld",anno,(const char*)codnum,ndoc);
bool flag = FALSE;
if (__current_key != k) // Se le chiavi sono diverse
{
if (__current_key.not_empty())
pa->remove_rate(__current_key); // Cancella il vecchio
__current_key = k;
flag = TRUE;
}
TRate_doc& rd = pa->rate(k,flag); // Aggiunge il nuovo o prende lo stesso elemento
// Schiaffa dentro rate e dati documento
rd.set(tt);
fill_rate_doc(rd,(TSheet_field&)ds.mask().field(F_RATE_SHEET));
app()._dirty = TRUE;
}
break;
case K_DEL: // Rimozione della riga r
// Rimuove il documento e le rate
pa->remove_rate(__current_key);
app()._dirty = TRUE;
break;
default:
break;
}
return TRUE;
}
bool TGestione_provv_app::create()
{
_msk = new TMask("pr0700b") ;
_provv = new TLocalisamfile(LF_PROVV);
_prag = new TProvvigioni_agente;
TSheet_field & sf = (TSheet_field&)_msk->field(F_DOC_SHEET);
sf.set_notify(doc_sheet_notify);
sf.sheet_mask().set_handler(F_ANNO,ndoc_handler);
TSheet_field & rs = (TSheet_field&)_msk->field(F_RATE_SHEET);
rs.set_notify(rate_sheet_notify);
TMask& sm = rs.sheet_mask();
sm.set_handler(F_RATA,nrata_handler);
sm.set_handler(F_DATASCAD,datascad_handler);
sm.set_handler(F_IMPRATA,imprata_handler);
sm.set_handler(F_IMPPROVV,improvv_handler);
dispatch_e_menu(MENU_ITEM(1));
return TRUE;
}
bool TGestione_provv_app::destroy()
{
delete _msk;
delete _provv;
delete _prag;
return TRUE;
}
void TGestione_provv_app::fill_sheet_doc()
{
TString_array kl;
const int items = _prag->documenti(kl);
kl.sort(); // Cosi' i documenti sono in ordine
TSheet_field & sf = (TSheet_field&)_msk->field(F_DOC_SHEET);
TSheet_field & rs = (TSheet_field&)_msk->field(F_RATE_SHEET);
__current_key = "";
rs.reset();
sf.reset();
for (int i = 0; i < items; i++)
{
TRate_doc& rd = _prag->rate(kl.row(i));
TToken_string& tt = sf.row(i);
tt.add(rd.anno()); tt.add(rd.codnum());
tt.add(rd.ndoc()); tt.add(rd.datadoc());
tt.add(rd.impdoc().string()); tt.add(rd.impprdoc().string());
tt.add(rd.impnet().string()); tt.add(rd.codcf());
tt.add(rd.tipo()); tt.add(rd.codval());
tt.add(rd.cambio().string()); tt.add(rd.datacam());
}
}
bool TGestione_provv_app::check_totals()
// Controlla che la somma delle provvigioni per ogni rata non sia superiore alla provvigione
// totale del documento. Ritorna TRUE se tutti i documenti hanno le provvigioni ok
{
TString_array kl;
const int items = _prag->documenti(kl);
bool rt = TRUE;
for (int i = 0; rt && i < items ; i++)
if (!_prag->rate(kl.row(i)).ok_provvigione())
{
rt = FALSE;
error_box("La somma delle provvigioni supera l'importo della provvigione totale per il documento %s",
(const char*)kl.row(i));
}
return rt;
}
void TGestione_provv_app::load_provvigioni(TMask* m)
{
TString agente = m->get(F_CODAGE);
_msk->set(F_CODAGE,agente);
_msk->set(F_RAGSOC,m->get(F_RAGSOC));
_msk->set(F_MANNO,"");
_msk->set(F_MCODNUM,"");
_msk->set(F_MNDOC,"");
_prag->read(agente);
KEY k;
bool repeat;
const char* msg = _prag->rows() == 0 ? "Registrare i dati inseriti" : "Registrare le modifiche" ;
fill_sheet_doc(); // Inizializza lo sheet dei documenti
_dirty = FALSE;
do
{
k = _msk->run();
bool to_write = k == K_ENTER;
repeat = FALSE;
if (k == K_ESC && _dirty)
{
k = yesnocancel_box(msg);
if (k == K_ESC)
repeat = TRUE;
else if (k == K_YES)
to_write = TRUE;
}
if (to_write)
if (check_totals()) // Controlla i totali delle provvigioni per tutti i documenti
_prag->write();
else
repeat = TRUE;
} while (repeat);
}
bool TGestione_provv_app::menu(MENU_TAG)
{
bool ok = TRUE;
TMask* m = new TMask("pr0700a");
while (ok)
{
xvt_statbar_set("Ricerca", TRUE);
m->reset();
ok = m->run() == K_ENTER;
if (ok)
load_provvigioni(m);
}
delete m;
return 0;
}
int pr0700(int argc, char** argv)
{
TGestione_provv_app a;
a.run(argc,argv,"Gestione provvigioni");
return 0;
}

5
pr/pr0700a.h Executable file
View File

@ -0,0 +1,5 @@
// campi maschera pr0700a.uml
#define F_CODAGE 201
#define F_RAGSOC 202

55
pr/pr0700a.uml Executable file
View File

@ -0,0 +1,55 @@
#include "pr0700a.h"
TOOLBAR "" 0 20 0 2
BUTTON DLG_OK 10 2
BEGIN
PROMPT -12 -11 ""
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -11 ""
END
ENDPAGE
PAGE "Gestione Provvigioni" -1 -1 78 8
GROUPBOX DLG_NULL 80 4
BEGIN
PROMPT 1 1 "Agente"
FLAGS "R"
END
STRING F_CODAGE 5
BEGIN
PROMPT 2 2 "Codice "
FLAGS "UZ"
USE LF_AGENTI
INPUT CODAGE F_CODAGE
DISPLAY "Codice@8R" CODAGE
DISPLAY "Descrizione@50" RAGSOC
OUTPUT F_CODAGE CODAGE
OUTPUT F_RAGSOC RAGSOC
CHECKTYPE REQUIRED
ADD RUN PR0 -4
END
STRING F_RAGSOC 50
BEGIN
PROMPT 2 3 "Ragione sociale "
USE LF_AGENTI KEY 2
INPUT RAGSOC F_RAGSOC
DISPLAY "Descrizione@50" RAGSOC
DISPLAY "Codice@8R" CODAGE
OUTPUT F_RAGSOC RAGSOC
OUTPUT F_CODAGE CODAGE
CHECKTYPE REQUIRED
ADD RUN PR0 -4
END
ENDPAGE
ENDMASK

38
pr/pr0700b.h Executable file
View File

@ -0,0 +1,38 @@
// Campi maschera pr0700b.uml
#define F_CODAGE 201
#define F_RAGSOC 202
#define F_DOC_SHEET 203
#define F_RATE_SHEET 204
#define F_MANNO 205
#define F_MCODNUM 206
#define F_MNDOC 207
// Sheet documenti
#define F_ANNO 101
#define F_CODNUM 102
#define F_NDOC 103
#define F_DATADOC 104
#define F_IMPDOC 105
#define F_IMPPRDOC 106
#define F_IMPNETDOC 107
#define F_CLIENTE 108
#define F_TIPOPAG 109
#define F_CODVAL 110
#define F_CAMBIO 111
#define F_DATACAMBIO 112
#define F_RAGCLI 113
// Sheet rate
#define F_RATA 101
#define F_DATASCAD 102
#define F_IMPRATA 103
#define F_IMPPROVV 104
#define F_PAGMAT 105
#define F_PROVVMAT 106
#define F_PAGATO 107
#define F_PROVVPAG 108
#define F_SALDATA 109
#define F_TIPOPAGPR 110

328
pr/pr0700b.uml Executable file
View File

@ -0,0 +1,328 @@
#include "pr0700b.h"
TOOLBAR "" 0 20 0 2
BUTTON DLG_OK 10 2
BEGIN
PROMPT -12 -11 ""
END
BUTTON DLG_CANCEL 10 2
BEGIN
PROMPT -22 -11 ""
END
ENDPAGE
PAGE "Provvigioni" -1 -1 78 8
STRING F_CODAGE 5
BEGIN
PROMPT 2 1 "Codice agente "
FLAGS "DUZ"
END
STRING F_RAGSOC 50
BEGIN
PROMPT 23 1 ""
FLAGS "D"
END
NUMBER F_MANNO 4
BEGIN
PROMPT 2 2 "Documento "
FLAGS "D"
END
STRING F_MCODNUM 4
BEGIN
PROMPT 23 2 ""
FLAGS "D"
END
NUMBER F_MNDOC 7
BEGIN
PROMPT 28 2 ""
FLAGS "D"
END
SPREADHSEET F_DOC_SHEET 0 8
BEGIN
PROMPT 2 3 ""
ITEM "Anno"
ITEM "Cod.\nNum."
ITEM "Num.\nDoc.@7"
ITEM "Data\nDoc.@10"
ITEM "Importo\ndocumento@18"
ITEM "Provvigione\ndocumento@18"
ITEM "Base di calcolo@18"
ITEM "Cliente"
ITEM "Tipo\npag."
ITEM "Valuta"
ITEM "Cambio"
ITEM "Data\ncambio@10"
GROUP 1
END
SPREADHSEET F_RATE_SHEET 0 8
BEGIN
PROMPT 2 12 ""
ITEM "Nr. rata"
ITEM "Data scadenza"
ITEM "Importo\nrata@18"
ITEM "Importo\nprovvigione@18"
ITEM "Pagamento\nmaturato@18"
ITEM "Provvigione\nmaturata@18"
ITEM "Importo\nrata pagata@18"
ITEM "Importo\nprovvigione pagata@18"
ITEM "Saldata"
ITEM "Tipo\npag."
GROUP 1
END
ENDPAGE
ENDMASK
// Maschera spreadsheet dei documenti
PAGE "" -1 -1 78 16
NUMBER F_ANNO 4
BEGIN
PROMPT 2 2 "Anno "
END
STRING F_CODNUM 4
BEGIN
PROMPT 13 2 "Cod. num. "
FLAGS "U"
USE %NUM
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODNUM CODTAB
CHECKTYPE NORMAL
END
NUMBER F_NDOC 7
BEGIN
PROMPT 32 2 "Num. doc. "
USE LF_DOC
JOIN %CPG TO LF_DOC ALIAS 401 INTO CODTAB==CODPAG
INPUT PROVV "D"
INPUT ANNO F_ANNO
INPUT CODNUM F_CODNUM
INPUT NDOC F_NDOC
DISPLAY "Anno" ANNO
DISPLAY "Codice numerazione" CODNUM
DISPLAY "Numero documento" NDOC
OUTPUT F_ANNO ANNO
OUTPUT F_CODNUM CODNUM
OUTPUT F_NDOC NDOC
OUTPUT F_DATADOC DATADOC
OUTPUT F_CLIENTE CODCF
OUTPUT F_CODVAL CODVAL
OUTPUT F_CAMBIO CAMBIO
OUTPUT F_DATACAMBIO DATACAMBIO
OUTPUT F_TIPOPAG -401->S4
ADD RUN VE0 -1
END
DATE F_DATADOC
BEGIN
PROMPT 54 2 "Data doc. "
END
NUMBER F_IMPDOC 18 2
BEGIN
PROMPT 2 4 "Importo doc. "
PICTURE "##.###.###.###.###"
END
NUMBER F_IMPPRDOC 18 2
BEGIN
PROMPT 2 5 "Importo provv. doc. "
PICTURE "##.###.###.###.###"
NUM_EXPR {(#THIS_FIELD <= #F_IMPDOC)}
WARNING "L'importo della provvigione deve essere minore dell'importo documento"
END
NUMBER F_IMPNETDOC 18 2
BEGIN
PROMPT 2 6 "Base di calcolo "
PICTURE "##.###.###.###.###"
NUM_EXPR {(#THIS_FIELD <= #F_IMPDOC)}
WARNING "L'importo della base di calcolo deve essere minore dell'importo documento"
END
NUMBER F_CLIENTE 7
BEGIN
PROMPT 2 8 "Cod. cliente "
USE LF_CLIFO KEY 1 SELECT TIPOCF=="C"
INPUT TIPOCF "C"
INPUT CODCF F_CLIENTE
DISPLAY "Cod. cliente" CODCF
DISPLAY "Ragione sociale@50" RAGSOC
OUTPUT F_CLIENTE CODCF
OUTPUT F_RAGCLI RAGSOC
CHECKTYPE NORMAL
END
STRING F_RAGCLI 50
BEGIN
PROMPT 27 8 ""
FLAGS "D"
END
LISTBOX F_TIPOPAG 1 20
BEGIN
PROMPT 2 9 "Tipo pagamento "
ITEM "1|Rimessa diretta"
ITEM "2|Tratta"
ITEM "3|Ri.Ba."
ITEM "4|Cessione"
ITEM "5|Paghero'"
ITEM "6|Lettera di cred."
ITEM "7|Tratta accettata"
ITEM "8|Rapp. int. dir."
ITEM "9|Bonifici"
END
STRING F_CODVAL 3
BEGIN
PROMPT 2 11 "Codice valuta "
FLAGS "U"
USE %VAL
INPUT CODTAB F_CODVAL
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODVAL CODTAB
CHECKTYPE NORMAL
END
NUMBER F_CAMBIO 18 2
BEGIN
PROMPT 25 11 "Cambio "
END
DATE F_DATACAMBIO
BEGIN
PROMPT 52 11 "Data cambio "
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_CANCEL 9 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_DELREC 9 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
ENDMASK
// Maschera spreadsheet delle rate
PAGE "" -1 -1 76 14
NUMBER F_RATA 4
BEGIN
PROMPT 2 1 "Numero rata "
END
DATE F_DATASCAD
BEGIN
PROMPT 2 2 "Data scadenza "
END
NUMBER F_IMPRATA 18 2
BEGIN
PROMPT 2 3 "Importo rata "
PICTURE "##.###.###.###.###"
END
NUMBER F_IMPPROVV 18 2
BEGIN
PROMPT 2 4 "Importo provvigione "
PICTURE "##.###.###.###.###"
END
NUMBER F_PAGMAT 18 2
BEGIN
PROMPT 2 7 "Importo pagamento maturato "
PICTURE "##.###.###.###.###"
NUM_EXPR {(#THIS_FIELD <= #F_IMPRATA)}
WARNING "L'importo pagamento maturato deve essere minore dell'importo della rata"
END
NUMBER F_PROVVMAT 18 2
BEGIN
PROMPT 2 8 "Importo provvigione maturata "
PICTURE "##.###.###.###.###"
NUM_EXPR {(#THIS_FIELD <= #F_IMPPROVV)}
WARNING "L'importo provvigione maturata deve essere minore dell'importo della provvigione"
END
NUMBER F_PAGATO 18 2
BEGIN
PROMPT 2 5 "Importo rata pagata "
PICTURE "##.###.###.###.###"
FLAGS "D"
END
NUMBER F_PROVVPAG 18 2
BEGIN
PROMPT 2 6 "Importo provvigione pagata "
PICTURE "##.###.###.###.###"
FLAGS "D"
END
BOOLEAN F_SALDATA
BEGIN
PROMPT 2 9 "Rata saldata "
END
LISTBOX F_TIPOPAGPR 1 20
BEGIN
PROMPT 2 10 "Tipo pagamento "
ITEM "1|Rimessa diretta"
ITEM "2|Tratta"
ITEM "3|Ri.Ba."
ITEM "4|Cessione"
ITEM "5|Paghero'"
ITEM "6|Lettera di cred."
ITEM "7|Tratta accettata"
ITEM "8|Rapp. int. dir."
ITEM "9|Bonifici"
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_CANCEL 9 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_DELREC 9 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
ENDMASK

116
pr/prlib.h Executable file
View File

@ -0,0 +1,116 @@
#ifndef __PRLIB_H
#define __PRLIB_H
#ifndef __RELATION_H
#include <relation.h>
#endif
#ifndef __RECARRAY_H
#include <recarray.h>
#endif
class TRata : public TSortable
{
TDate _datascad;
real _imprata, _impprovv, _pagato, _provvpag, _pagmat, _provvmat;
bool _saldata;
int _nrata,_tipopagpr;
char _generata;
public:
virtual TObject* dup() const { return new TRata(*this); }
virtual int compare(const TSortable& s) const;
const int rata() const { return _nrata;}
const TDate datascad() const { return _datascad; }
const real imprata() const { return _imprata;}
const real impprovv() const { return _impprovv;}
const real pagato() const { return _pagato;}
const real provvpag() const { return _provvpag;}
const real provvmat() const { return _pagmat;}
const real pagmat() const { return _provvmat;}
const bool saldata() const { return _saldata;}
const char generata() const { return _generata;}
const int tipopagpr()const { return _tipopagpr;}
void set_saldata(bool b = TRUE) { _saldata = b; }
void set_generata(char g = ' ') { _generata = g; }
void set(TRectype& rec);
void set(TToken_string& t);
TRata(TRectype& rec);
TRata() {}
~TRata() {}
};
class TRate_doc : public TObject
{
// Dati del documento
int _anno;
TString16 _codnum,_codval;
long _ndoc,_codcf;
TDate _datadoc,_datacambio;
real _impdoc,_impprdoc,_impnetdoc,_cambio;
char _tipopag;
TArray _rows; // Rate del documento. La rata 0 corrisponde alla provvigione all'atto della fatturazione
// Array di TRata
public:
virtual TObject* dup() const { return new TRate_doc(*this); }
const int anno() const { return _anno; }
const TString16& codnum() const { return _codnum; }
const TString16& codval() const { return _codval; }
const long ndoc() const { return _ndoc; }
const long codcf() const { return _codcf; }
const TDate datadoc() const { return _datadoc; }
const TDate datacam() const { return _datacambio;}
const char tipo() const { return _tipopag;}
const real impdoc() const { return _impdoc;}
const real impprdoc() const { return _impprdoc;}
const real cambio() const { return _cambio;}
const real impnet() const { return _impnetdoc;}
const int items() { return _rows.items();}
TRata& row(int i) { return (TRata&) _rows[i]; }
TRata& operator[](int i) { return row(i); }
void add_rata(TRata* r) {_rows.add(r);}
void remove_rata(int i = -1) {_rows.destroy(i,TRUE);}
// Ordina le rate
void sort_rate() {_rows.sort();}
// Controlla che la somma delle provvigioni delle singole rate sia <= della provvigione del documento
bool ok_provvigione();
void set(TRectype& rec);
void set(TToken_string& t);
TRate_doc(TRectype& rec);
~TRate_doc() {}
};
class TProvvigioni_agente : public TObject
{
TString16 _agente; // Codice agente
TRecord_array *_rows; // Righe provvigionali (LF_PROVV) usato per leggere/scrivere
TAssoc_array _rate; // Array associativo per ANNO+CODNUM+NDOC
// contiene le informazioni del documento con le relative rate.
protected:
void rate2rows();
public:
const TString16& agente () const { return _agente;}
// Per operare direttamente sulle righe
const TRectype& operator [](int index) const
{ return _rows->operator[](index);}
TRectype& operator[] (int index) { return _rows->operator[](index);}
const int rows() const { return _rows->rows();}
// lettura, scrittura ecc...
int read(const char* agente);
int write(bool rows = FALSE); // Se rows == TRUE scrive le righe cosi' come sono, senza chiamare la rate2rows
int rewrite(bool rows = FALSE);
int remove(bool rows = FALSE);
// Restituisce un elenco di documenti che hanno rate per le provvigioni di questo agente
int documenti(TString_array& kl) { return _rate.get_keys(kl); }
// Per accedere tramite singole rate...
TRate_doc& rate(int anno, const char* codnum, long ndoc, bool create = FALSE) ;
TRate_doc& rate(const char* key, bool create = FALSE) ;
// Rimuove le rate del documento indicato
void remove_rate(int anno, const char* codnum, long ndoc);
void remove_rate(const char* key);
TProvvigioni_agente(const char* agente);
TProvvigioni_agente() ;
~TProvvigioni_agente();
};
#endif

289
pr/prlib01.cpp Executable file
View File

@ -0,0 +1,289 @@
#include "prlib.h"
#include "provv.h"
#include <doc.h>
// TProvvigioni_agente
TProvvigioni_agente::TProvvigioni_agente()
{
_rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
}
TProvvigioni_agente::TProvvigioni_agente(const char* agente)
{
_rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
read(agente);
}
TProvvigioni_agente::~TProvvigioni_agente()
{
delete _rows;
}
int TProvvigioni_agente::read(const char* agente)
{
int err = NOERR;
TRectype rec(LF_PROVV);
rec.put(PROV_CODAGE,agente);
_agente = agente;
_rate.destroy();
_rows->destroy_rows();
err = _rows->read(rec); // Legge tutte le righe provvigionali di codesto agente
if (err != NOERR)
return err;
const int rows = _rows->rows();
int anno;
long ndoc;
TString key,codnum;
for (int i = 1; i <= rows; i++) // Compila l'assoc_array per documenti/rate
{
TRectype& r = _rows->row(i,FALSE);
anno = r.get_int(DOC_ANNO);
codnum = r.get(DOC_CODNUM);
ndoc = r.get_long(DOC_NDOC);
key.format("%4d%4s%7ld",anno,(const char*)codnum,ndoc); // Compone la chiave
const bool exist = _rate.is_key(key); // Guarda se esiste gia' questo documento
TRate_doc com_rata(r);
TRate_doc& rd = exist ? (TRate_doc&) _rate[key] : com_rata;
TRata* rt = new TRata(r);
rd.add_rata(rt);
_rate.add(key,rd,exist); // Sostituisce/aggiunge l'elemento
}
// Dopo aver letto le righe, ordina le rate per ogni documento
for (TRate_doc* rd = (TRate_doc*) _rate.first_item(); rd != NULL; rd = (TRate_doc*) _rate.succ_item())
rd->sort_rate();
return err;
}
void TProvvigioni_agente::rate2rows()
{
_rows->destroy_rows();
// Setta la chiave del TRecord_array
TRectype* chiave = new TRectype(LF_PROVV);
chiave->put(PROV_CODAGE, _agente);
_rows->set_key(chiave);
// Scorre gli elementi di _rate (TDoc_rate) uno ad uno
// per settare le righe provvigionali
TString_array kl;
const int items = documenti(kl); // Prende l'elenco dei documenti
kl.sort(); // ordina per documento
int nrow = 1;
for (int i = 0; i < items; i++)
{
TRate_doc& rd = (TRate_doc&)_rate[kl.row(i)];
const int ritems = rd.items(); // Ciclo per rate di questo documento
for (int j = 0; j < ritems; j++)
{
TRata& rt = rd[j];
TRectype* record = new TRectype(LF_PROVV);
record->put(PROV_CODAGE,_agente);
record->put(PROV_NRIGA,nrow++);
record->put(PROV_ANNO,rd.anno());
record->put(PROV_CODNUM,rd.codnum());
record->put(PROV_NDOC,rd.ndoc());
record->put(PROV_NRATA,rt.rata());
record->put(PROV_GENERATA,rt.generata());
record->put(PROV_SALDATA,rt.saldata());
record->put(PROV_TIPOPAGPR,rt.tipopagpr());
record->put(PROV_DATADOC,rd.datadoc());
record->put(PROV_IMPDOC,rd.impdoc());
record->put(PROV_IMPPRDOC,rd.impprdoc());
record->put(PROV_IMPNETDOC,rd.impnet());
record->put(PROV_CODCLI,rd.codcf());
record->put(PROV_TIPOPAG,rd.tipo());
record->put(PROV_CODVAL,rd.codval());
record->put(PROV_DATACAMBIO,rd.datacam());
record->put(PROV_CAMBIO,rd.cambio());
record->put(PROV_DATASCAD,rt.datascad());
record->put(PROV_IMPRATA,rt.imprata());
record->put(PROV_IMPPROVV,rt.impprovv());
record->put(PROV_PAGATO,rt.pagato());
record->put(PROV_PROVVPAG,rt.provvpag());
record->put(PROV_PAGMAT,rt.pagmat());
record->put(PROV_PROVVMAT,rt.provvmat());
_rows->add_row(record);
}
}
}
int TProvvigioni_agente::write(bool rows)
{
if (!rows)
rate2rows();
return _rows->write();
}
int TProvvigioni_agente::rewrite(bool rows)
{
if (!rows)
rate2rows();
return _rows->rewrite();
}
int TProvvigioni_agente::remove(bool rows)
{
if (!rows)
rate2rows();
return _rows->remove();
}
TRate_doc& TProvvigioni_agente::rate(int anno, const char* codnum, long ndoc, bool create)
{
TString k;
k.format("%4d%4s%7ld",anno,codnum,ndoc);
return rate(k,create);
}
TRate_doc& TProvvigioni_agente::rate(const char* key, bool create)
{
const bool exist = _rate.is_key(key);
if (!exist)
{
if (create)
{
TRectype r(LF_PROVV);
TString k(key);
r.put(PROV_ANNO,k.sub(0,4));
r.put(PROV_CODNUM,k.sub(4,8));
r.put(PROV_NDOC,k.sub(8));
TRate_doc* rd = new TRate_doc(r);
_rate.add(key,rd);
}
else
fatal_box("Impossibile trovare l'elemento %s tra le righe provvigionali",key);
}
return (TRate_doc&) _rate[key];
}
void TProvvigioni_agente::remove_rate(int anno, const char* codnum, long ndoc)
{
TString k;
k.format("%4d%4s%7ld",anno,codnum,ndoc);
remove_rate(k);
}
void TProvvigioni_agente::remove_rate(const char* key)
{
const bool exist = _rate.is_key(key);
if (exist)
_rate.remove(key);
else
fatal_box("Impossibile trovare l'elemento %s tra le righe provvigionali", key);
}
/////////////////////////////////////////////////////////////////////////////////
// TRate_doc
/////////////////////////////////////////////////////////////////////////////////
TRate_doc::TRate_doc(TRectype& rec)
{
set(rec); // bleah!
}
bool TRate_doc::ok_provvigione()
{
real totprov;
const int its = items();
for (int i = 0; i < its; i++) // Somma le provvigioni di tutte le rate
totprov += row(i).impprovv();
return totprov <= _impprdoc; // controlla che tale somma e' compresa nel totale provvigione del documento
}
void TRate_doc::set(TRectype& rec)
{
CHECK(rec.num() == LF_PROVV,"Il record non ha il tracciato di LF_PROVV");
_anno = rec.get_int(PROV_ANNO);
_codnum = rec.get(PROV_CODNUM);
_codval = rec.get(PROV_CODVAL);
_ndoc = rec.get_long(PROV_NDOC);
_codcf = rec.get_long(PROV_CODCLI);
_datadoc = rec.get_date(PROV_DATADOC);
_datacambio = rec.get_date(PROV_DATACAMBIO);
_tipopag = rec.get_char(PROV_TIPOPAG);
_impdoc = rec.get_real(PROV_IMPDOC);
_impprdoc = rec.get_real(PROV_IMPPRDOC);
_impnetdoc = rec.get_real(PROV_IMPNETDOC);
_cambio = rec.get_real(PROV_CAMBIO);
}
void TRate_doc::set(TToken_string& t)
{
CHECK(t.items() >= 12, "Numero di items non valido");
_anno = t.get_int(0);
_codnum = t.get(1);
_ndoc = t.get_long(2);
_datadoc = t.get(3);
_impdoc = t.get(4);
_impprdoc = t.get(5);
_impnetdoc = t.get(6);
_codcf = t.get_long(7);
_tipopag = t.get_char(8);
_codval = t.get(9);
_cambio = t.get(10);
_datacambio = t.get(11);
}
/////////////////////////////////////////////////////////////////////////////////
// TRata
/////////////////////////////////////////////////////////////////////////////////
int TRata::compare(const TSortable& s) const
{
const TRata& r = (const TRata&) s;
if (_nrata > r.rata())
return 1; // Numero maggiore
else
if (_nrata < r.rata());
return -1; // Numero minore
return 0; // Stesso numero di rata
}
void TRata::set(TToken_string& t)
{
CHECK(t.items() == 10, "Troppi pochi elementi nella token string");
_nrata = t.get_int(0);
_datascad = t.get(1);
_imprata = t.get(2);
_impprovv = t.get(3);
_pagmat = t.get(4);
_provvmat = t.get(5);
_pagato = t.get(6);
_provvpag = t.get(7);
_saldata = t.get(8)[0] == 'X' ? TRUE : FALSE;
_tipopagpr = t.get_int(9);
}
void TRata::set(TRectype& rec)
{
CHECK(rec.num() == LF_PROVV,"Il record non ha il tracciato di LF_PROVV");
_datascad = rec.get_date(PROV_DATASCAD);
_imprata = rec.get_real(PROV_IMPRATA);
_impprovv = rec.get_real(PROV_IMPPROVV);
_pagato = rec.get_real(PROV_PAGATO);
_provvpag = rec.get_real(PROV_PROVVPAG);
_pagmat = rec.get_real(PROV_PAGMAT);
_provvmat = rec.get_real(PROV_PROVVMAT);
_saldata = rec.get_bool(PROV_SALDATA);
_nrata = rec.get_int(PROV_NRATA);
_generata = rec.get_char(PROV_GENERATA);
_tipopagpr = rec.get_int(PROV_TIPOPAGPR);
}
TRata::TRata(TRectype& rec)
{
set(rec);
}

31
pr/provv.h Executable file
View File

@ -0,0 +1,31 @@
#ifndef __PROV_H
#define __PROV_H
#define PROV_CODAGE "CODAGE"
#define PROV_NRIGA "NRIGA"
#define PROV_ANNO "ANNO"
#define PROV_CODNUM "CODNUM"
#define PROV_NDOC "NDOC"
#define PROV_NRATA "NRATA"
#define PROV_GENERATA "GENERATA"
#define PROV_DATADOC "DATADOC"
#define PROV_IMPDOC "IMPDOC"
#define PROV_IMPPRDOC "IMPPRDOC"
#define PROV_IMPNETDOC "IMPNETDOC"
#define PROV_CODCLI "CODCLI"
#define PROV_TIPOPAG "TIPOPAG"
#define PROV_CODVAL "CODVAL"
#define PROV_CAMBIO "CAMBIO"
#define PROV_DATACAMBIO "DATACAMBIO"
#define PROV_DATASCAD "DATASCAD"
#define PROV_IMPRATA "IMPRATA"
#define PROV_IMPPROVV "IMPPROVV"
#define PROV_SALDATA "SALDATA"
#define PROV_PAGATO "PAGATO"
#define PROV_PROVVPAG "PROVVPAG"
#define PROV_PAGMAT "PAGMAT"
#define PROV_PROVVMAT "PROVVMAT"
#define PROV_TIPOPAGPR "TIPOPAGPR"
#endif

9
pr/prtbapr.h Executable file
View File

@ -0,0 +1,9 @@
// campi maschera prtbapr.uml
#define F_CODAPR 101
#define F_DESCR 102
#define F_SEQRIC1 114
#define F_SEQRIC2 115
#define F_SEQRIC3 116
#define F_SEQRIC4 117

121
pr/prtbapr.uml Executable file
View File

@ -0,0 +1,121 @@
#include "prtbapr.h"
TOOLBAR "" 0 20 0 2
#include <toolbar.h>
ENDPAGE
PAGE "Archivio provvigioni" -1 -1 78 8
GROUPBOX DLG_NULL 80 4
BEGIN
PROMPT 1 1 "Archivio"
FLAGS "R"
END
STRING F_CODAPR 2
BEGIN
PROMPT 2 2 "Codice "
FIELD CODTAB
FLAGS "UZ"
KEY 1
USE APR
INPUT CODTAB F_CODAPR
DISPLAY "Codice@6" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODAPR CODTAB
OUTPUT F_DESCR S0
CHECKTYPE REQUIRED
END
STRING F_DESCR 50
BEGIN
PROMPT 2 3 "Descrizione "
FIELD S0
KEY 2
USE APR KEY 2
INPUT S0 F_DESCR
DISPLAY "Descrizione@50" S0
DISPLAY "Codice@6" CODTAB
COPY OUTPUT F_CODAPR
CHECKTYPE REQUIRED
END
LISTBOX F_SEQRIC1 22
BEGIN
PROMPT 1 6 "Chiave di ricerca archivio "
FIELD S3[1,1]
ITEM "C|Cliente"
ITEM "V|Categoria di vendita"
ITEM "A|Agente"
ITEM "P|Cod. pagamento"
ITEM "S|Sconto"
ITEM "Z|Zona"
ITEM "M|Articolo di magazzino"
ITEM "E|Categoria merc."
ITEM "R|Sottocategoria merc."
ITEM "F|Raggruppamento fisc."
STR_EXPR ((#THIS_FIELD!=#F_SEQRIC2)&&(#THIS_FIELD!=#F_SEQRIC3)&&(#THIS_FIELD!=#F_SEQRIC4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
END
LISTBOX F_SEQRIC2 22
BEGIN
PROMPT 32 7 ""
FIELD S3[2,2]
ITEM "-|Nessuno" MESSAGE CLEAR,5@
ITEM "C|Cliente" MESSAGE ENABLE,F_SEQRIC3
ITEM "V|Categoria di vendita" MESSAGE ENABLE,F_SEQRIC3
ITEM "A|Agente" MESSAGE ENABLE,F_SEQRIC3
ITEM "P|Cod. pagamento" MESSAGE ENABLE,F_SEQRIC3
ITEM "S|Sconto" MESSAGE ENABLE,F_SEQRIC3
ITEM "Z|Zona" MESSAGE ENABLE,F_SEQRIC3
ITEM "M|Articolo di magazzino" MESSAGE ENABLE,F_SEQRIC3
ITEM "E|Categoria merc." MESSAGE ENABLE,F_SEQRIC3
ITEM "R|Sottocategoria merc." MESSAGE ENABLE,F_SEQRIC3
ITEM "F|Raggruppamento fisc." MESSAGE ENABLE,F_SEQRIC3
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQRIC1)&&(#THIS_FIELD!=#F_SEQRIC3)&&(#THIS_FIELD!=#F_SEQRIC4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
END
LISTBOX F_SEQRIC3 22
BEGIN
PROMPT 32 8 ""
FIELD S3[3,3]
ITEM "-|Nessuno" MESSAGE CLEAR,F_SEQRIC4
ITEM "C|Cliente" MESSAGE ENABLE,F_SEQRIC4
ITEM "V|Categoria di vendita" MESSAGE ENABLE,F_SEQRIC4
ITEM "A|Agente" MESSAGE ENABLE,F_SEQRIC4
ITEM "P|Cod. pagamento" MESSAGE ENABLE,F_SEQRIC4
ITEM "S|Sconto" MESSAGE ENABLE,F_SEQRIC4
ITEM "Z|Zona" MESSAGE ENABLE,F_SEQRIC4
ITEM "M|Articolo di magazzino" MESSAGE ENABLE,F_SEQRIC4
ITEM "E|Categoria merc." MESSAGE ENABLE,F_SEQRIC4
ITEM "R|Sottocategoria merc." MESSAGE ENABLE,F_SEQRIC4
ITEM "F|Raggruppamento fisc." MESSAGE ENABLE,F_SEQRIC4
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQRIC1)&&(#THIS_FIELD!=#F_SEQRIC2)&&(#THIS_FIELD!=#F_SEQRIC4))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
GROUP 5
END
LISTBOX F_SEQRIC4 22
BEGIN
PROMPT 32 9 ""
FIELD S3[4,4]
ITEM "-|Nessuno"
ITEM "C|Cliente"
ITEM "V|Categoria di vendita"
ITEM "A|Agente"
ITEM "P|Cod. pagamento"
ITEM "S|Sconto"
ITEM "Z|Zona"
ITEM "M|Articolo di magazzino"
ITEM "E|Categoria merc."
ITEM "R|Sottocategoria merc."
ITEM "F|Raggruppamento fisc."
STR_EXPR (#THIS_FIELD=="-")||((#THIS_FIELD!=#F_SEQRIC1)&&(#THIS_FIELD!=#F_SEQRIC2)&&(#THIS_FIELD!=#F_SEQRIC3))
WARNING "La sequenza di ricerca deve indicare quattro tipi diversi di righe"
GROUP 5
END