Patch level : 00.nopatch
Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunta personalizzazione al tronco principale git-svn-id: svn://10.65.10.50/trunk@9257 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
dc88a00acd
commit
75329eea65
19
ve/vec1.cpp
Executable file
19
ve/vec1.cpp
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#include <checks.h>
|
||||||
|
#include <xvt.h>
|
||||||
|
|
||||||
|
extern int vec1100(int argc, char* argv[]); // personalizzazione rifatturazione cover
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
const int r= (argc>1)? argv[1][1]-'0' : -1;
|
||||||
|
|
||||||
|
switch (r)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
vec1100(argc, argv); break;
|
||||||
|
default:
|
||||||
|
error_box("Sintassi: %s [-0 {[params]|[L]}]", argv[0]); break;
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
return 0;
|
||||||
|
}
|
25
ve/vec1.h
Executable file
25
ve/vec1.h
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef __VEC1_H
|
||||||
|
#define __VEC1_H
|
||||||
|
|
||||||
|
#ifndef __STRINGS_H
|
||||||
|
#include <strings.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int vec1100(int argc, char* argv[]);
|
||||||
|
|
||||||
|
#ifdef __MAIN__
|
||||||
|
#define extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern TString80 tmp;
|
||||||
|
|
||||||
|
#ifdef __MAIN__
|
||||||
|
#undef extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __VEC1_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
11
ve/vec1.url
Executable file
11
ve/vec1.url
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#define APPNAME campo
|
||||||
|
#define QAPPNAME "campo"
|
||||||
|
#define QFIRMNAME "A.G.A. Informatica Srl"
|
||||||
|
#include <default.url>
|
||||||
|
|
||||||
|
MENU TASK_MENUBAR
|
||||||
|
SUBMENU MENU_FILE "~File"
|
||||||
|
ITEM BAR_ITEM(1) "~Parametri"
|
||||||
|
|
||||||
|
|
||||||
|
|
260
ve/vec1100.cpp
Executable file
260
ve/vec1100.cpp
Executable file
@ -0,0 +1,260 @@
|
|||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
// Rifatturazione cover
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <applicat.h>
|
||||||
|
#include <config.h>
|
||||||
|
#include <defmask.h>
|
||||||
|
#include <form.h>
|
||||||
|
#include <msksheet.h>
|
||||||
|
#include <printer.h>
|
||||||
|
#include <progind.h>
|
||||||
|
#include <sheet.h>
|
||||||
|
|
||||||
|
#include <doc.h>
|
||||||
|
#include <rdoc.h>
|
||||||
|
|
||||||
|
#include "velib.h"
|
||||||
|
#include "sconti.h"
|
||||||
|
#include "vec1100.h"
|
||||||
|
|
||||||
|
class TRifatturazione: public TSkeleton_application
|
||||||
|
{
|
||||||
|
TMask * _m; //maschera di input dati
|
||||||
|
TString _codnum; // codice di numerazione del documento
|
||||||
|
int _anno; // anno della documentazione
|
||||||
|
long _codcli; // codice del cliente
|
||||||
|
TDate _dadata, _adata; // estremi di data dei documenti
|
||||||
|
TRelation * _rel;
|
||||||
|
TCursor * _cur;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static bool date_handler(TMask_field& f, KEY k);
|
||||||
|
virtual bool create();
|
||||||
|
virtual bool destroy();
|
||||||
|
virtual void main_loop();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void select_docs();
|
||||||
|
real get_price (const TString& codart, TString& um, real& quantita); // metodo per ricavare la variazione di prezzo
|
||||||
|
void add_line (TDocumento& doc, const TRiga_documento & old_row, const TString& um, real& quantita, real& price); // metodo per compilare le righe del nuovo documento
|
||||||
|
TRifatturazione() {};
|
||||||
|
virtual ~TRifatturazione() {};
|
||||||
|
};
|
||||||
|
|
||||||
|
// handler delle date della maschera di input
|
||||||
|
bool TRifatturazione::date_handler(TMask_field& f, KEY k)
|
||||||
|
{
|
||||||
|
bool rt = TRUE;
|
||||||
|
TMask& m = f.mask();
|
||||||
|
if (f.to_check(k) && k == K_ENTER)
|
||||||
|
{
|
||||||
|
TDate dadata = m.get_date(F_DA_DATADOC);
|
||||||
|
TDate adata = m.get_date(F_A_DATADOC);
|
||||||
|
const int anno = m.get_int(F_ANNO);
|
||||||
|
|
||||||
|
int anno1 = dadata.year();
|
||||||
|
int anno2 = adata.year();
|
||||||
|
|
||||||
|
if (anno1 != anno || anno2 != anno) // le date devono avere anno coincidente con quello selezionato nella maschera
|
||||||
|
{
|
||||||
|
f.error_box ("Gli anni delle date iniziale e finale devono essere uguali all'anno selezionato");
|
||||||
|
rt = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create della classe TRifatturazione (stanziamento degli oggetti principali)
|
||||||
|
bool TRifatturazione::create()
|
||||||
|
{
|
||||||
|
open_files(LF_DOC, LF_RIGHEDOC, LF_CFVEN, LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
|
||||||
|
_m = new TMask ("vec1100a");
|
||||||
|
_rel = new TRelation (LF_DOC);
|
||||||
|
_cur = new TCursor( _rel, "", 2);
|
||||||
|
|
||||||
|
_m -> set_handler (F_ANNO, date_handler); //prende i dati dalla maschera per controllarli
|
||||||
|
|
||||||
|
return TSkeleton_application::create();
|
||||||
|
}
|
||||||
|
|
||||||
|
// destroy della classe TRifatturazione (distrugge ció che la create genera)
|
||||||
|
bool TRifatturazione::destroy()
|
||||||
|
{
|
||||||
|
delete _cur;
|
||||||
|
delete _rel;
|
||||||
|
delete _m;
|
||||||
|
|
||||||
|
return TSkeleton_application::destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
// main loop della classe TRifatturazione (essenzialmente carica la maschera)
|
||||||
|
void TRifatturazione::main_loop()
|
||||||
|
{
|
||||||
|
KEY key;
|
||||||
|
while ((key = _m -> run()) != K_QUIT)
|
||||||
|
{
|
||||||
|
select_docs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TRifatturazione::select_docs()
|
||||||
|
// applica la relation ed il cursor sul file LF_DOC (non li crea perché lo ha giá fatto la create()!!) e setta il filtro
|
||||||
|
{
|
||||||
|
TString16 f;
|
||||||
|
f.format("CODNUM==\"%s\"", (const char *) _m->get(F_CODNUM)); // DEVI SEMPRE usare (const char *) nelle format !!!!
|
||||||
|
|
||||||
|
TRectype darec(LF_DOC),arec(LF_DOC); // Record estremi filtro
|
||||||
|
|
||||||
|
darec.put(DOC_TIPOCF,"C"); // Setta i parametri del primo record
|
||||||
|
darec.put(DOC_CODCF, _m->get(F_CODCF));
|
||||||
|
darec.put(DOC_PROVV, "D");
|
||||||
|
darec.put(DOC_ANNO, _m->get(F_ANNO));
|
||||||
|
darec.put(DOC_DATADOC, _m->get(F_DA_DATADOC));
|
||||||
|
|
||||||
|
arec.put(DOC_TIPOCF,"C"); // ..e quelli dell'ultimo (cambia solo la data!!)
|
||||||
|
arec.put(DOC_CODCF, _m->get(F_CODCF));
|
||||||
|
arec.put(DOC_PROVV, "D");
|
||||||
|
arec.put(DOC_ANNO, _m->get(F_ANNO));
|
||||||
|
arec.put(DOC_DATADOC, _m->get(F_A_DATADOC));
|
||||||
|
|
||||||
|
_cur->setfilter(f);
|
||||||
|
_cur->setregion(darec,arec);
|
||||||
|
|
||||||
|
const long items = _cur->items();
|
||||||
|
_cur -> freeze(); // applica la freeze per 'congelare' il file al momento dell'applicazione del cursore
|
||||||
|
// va qui! prima di cominciare la scansione ma appena dopo la definizione degli items
|
||||||
|
TDocumento* indoc = new TDocumento; // creo indoc in modo da non perdere traccia del documento
|
||||||
|
_cur->file().set_curr (indoc); // cosí ogni record principale del cursore é un documento
|
||||||
|
TProgind pi(items,"Elaborazione in corso..",TRUE,TRUE); // barra di progressione
|
||||||
|
|
||||||
|
TDate datadoc = _m->get(F_DATADOC);
|
||||||
|
|
||||||
|
TDocumento doc; // doc su cui scriverá!!
|
||||||
|
*_cur=0; // preparo la testata del nuovo documento facendola uguale a quella del primo
|
||||||
|
doc.put(DOC_PROVV, "D"); // documento (tanto devono essere tutti uguali)
|
||||||
|
doc.put(DOC_ANNO,datadoc.year());
|
||||||
|
doc.put(DOC_CODNUM, _m->get(F_CODNUM));
|
||||||
|
doc.copy_data(doc, _cur->curr()); // copia la testata del record sul quale si é posizionato
|
||||||
|
doc.put(DOC_DATADOC, datadoc); // assegna al nuovo documento la data che veniva dalla maschera
|
||||||
|
doc.put(DOC_STATO, "1"); // e mette lo stato iniziale
|
||||||
|
|
||||||
|
for (*_cur=0; _cur->pos() < items; ++(*_cur))
|
||||||
|
{
|
||||||
|
pi.addstatus(1); // barra di progressione
|
||||||
|
if (pi.iscancelled()) break; // é possibile interrompere l'elaborazione
|
||||||
|
|
||||||
|
for ( int r =1; r <= indoc->rows(); r++) // cicla sulle righe del documento selezionato
|
||||||
|
{
|
||||||
|
const TRiga_documento& row = (*indoc)[r];
|
||||||
|
if (row.is_merce()) // lavora solo se la riga é di tipo merce
|
||||||
|
{
|
||||||
|
TString80 codart(row.get(RDOC_CODARTMAG)); // crea una stringa con il codice articolo
|
||||||
|
if (codart.not_empty())
|
||||||
|
{
|
||||||
|
TString16 um(row.get(RDOC_UMQTA)); // ed una con l'unitá di misura che trova nella riga
|
||||||
|
real quantita = row.get(RDOC_QTA); // e una con la quantitá della riga
|
||||||
|
|
||||||
|
real price = get_price (codart,um,quantita); // trova la variazione di prezzo per l'articolo, la sua um (di base) e la quantitá in um(base)
|
||||||
|
|
||||||
|
if (price > 0) add_line(doc,row,um,quantita,price); // compila le righe del documento
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (doc.rows() > 0)
|
||||||
|
{
|
||||||
|
doc.write();
|
||||||
|
}
|
||||||
|
_cur->file().set_curr(new TRectype(LF_DOC));
|
||||||
|
_cur->freeze(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
real TRifatturazione::get_price (const TString& codart, TString& um, real& quantita)
|
||||||
|
{
|
||||||
|
|
||||||
|
TString codlist = _m->get(F_LISTINO); // prende il codice listino
|
||||||
|
TToken_string chiave; // crea la chiave di lettura del file LF_RCONDV; una volta creata la chiave
|
||||||
|
chiave.add("L"); // ha i parametri per trovare il prezzo nel corrispondente record (non viene
|
||||||
|
chiave.add(""); // utilizzato un TRectype per esigenze di velocitá)
|
||||||
|
chiave.add("");
|
||||||
|
chiave.add("");
|
||||||
|
chiave.add(codlist);
|
||||||
|
chiave.add("A");
|
||||||
|
chiave.add(codart);
|
||||||
|
// chiave.add(um_base);
|
||||||
|
|
||||||
|
const TRectype& rcondv = cache().get(LF_RCONDV, chiave);
|
||||||
|
real old_price = rcondv.get("PREZZO"); // devi prendere il PREZZO dalle righe listino del listino con codice codlist
|
||||||
|
real new_price;
|
||||||
|
if (old_price != ZERO)
|
||||||
|
{
|
||||||
|
TArticolo articolo(codart); // crea un oggetto TArticolo con il codice codart
|
||||||
|
quantita = articolo.convert_to_um (quantita,NULL,um); // converte la quantita in um base
|
||||||
|
real perc = _m->get(F_PERCENT); // dalla maschera prendi la % di sovrapprezzo
|
||||||
|
new_price = perc / 100 * old_price; // mi serve il solo sovrapprezzo
|
||||||
|
um = articolo.um()[1].get(UMART_UM); // deve prendere l'unitá di misura base dell'articolo (lo prende come primo record delle unitá di misura)
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_price;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TRifatturazione::add_line (TDocumento& doc, const TRiga_documento & old_row, const TString& um, real& quantita, real& price)
|
||||||
|
{
|
||||||
|
int tot_lines = doc.rows();
|
||||||
|
|
||||||
|
for ( int i = 1; i <= tot_lines; i++)
|
||||||
|
{
|
||||||
|
const TRiga_documento & riga = doc[i];
|
||||||
|
TString codartmag = riga.get(RDOC_CODARTMAG);
|
||||||
|
TString codart = old_row.get(RDOC_CODARTMAG);
|
||||||
|
if (codartmag == codart) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > tot_lines) // se non ha trovato il codart... // mette nella riga (che copia da quella del documento originale)
|
||||||
|
// codart, quantitá, prezzo, um e azzera alcuni campi
|
||||||
|
{
|
||||||
|
TRiga_documento & new_row = doc.new_row(old_row.tipo().codice()); // copia la riga del documento originale (stesso tiporiga)
|
||||||
|
TDocumento::copy_data(new_row, old_row);
|
||||||
|
new_row.zero(RDOC_GENERATA);
|
||||||
|
new_row.put(RDOC_PREZZO, price);
|
||||||
|
new_row.put(RDOC_UMQTA, um);
|
||||||
|
new_row.put(RDOC_QTA, quantita);
|
||||||
|
new_row.zero(RDOC_QTAEVASA);
|
||||||
|
new_row.zero(RDOC_QTAGG1);
|
||||||
|
new_row.zero(RDOC_QTAGG2);
|
||||||
|
new_row.zero(RDOC_QTAGG3);
|
||||||
|
new_row.zero(RDOC_QTAGG4);
|
||||||
|
new_row.zero(RDOC_QTAGG5);
|
||||||
|
new_row.zero(RDOC_RIGAEVASA);
|
||||||
|
new_row.zero(RDOC_SCONTO);
|
||||||
|
new_row.zero(RDOC_PERCPROV);
|
||||||
|
new_row.zero(RDOC_IMPFISSO);
|
||||||
|
new_row.zero(RDOC_IMPFISUN);
|
||||||
|
new_row.set_original_rdoc_key(old_row); // metodo per prendere i valori dei campi chiave nella riga originale e metterli
|
||||||
|
// nei campi di tipo DA.. del file RDOC ('mmazza!!)
|
||||||
|
}
|
||||||
|
else // se ha trovato il codart...
|
||||||
|
// mette nella riga del nuovo documento solo la quantitá, aggiungendola a quella che esiste giá
|
||||||
|
{
|
||||||
|
TRiga_documento & riga = doc[i];
|
||||||
|
real qta = riga.get(RDOC_QTA);
|
||||||
|
qta += quantita;
|
||||||
|
riga.put(RDOC_QTA,qta);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Do all the work!
|
||||||
|
int vec1100(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
TRifatturazione a;
|
||||||
|
a.run(argc, argv, "Rifatturazione");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
12
ve/vec1100.h
Executable file
12
ve/vec1100.h
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
#define F_CODNUM 101
|
||||||
|
#define F_ANNO 102
|
||||||
|
#define F_PROVV 103
|
||||||
|
#define F_CODCF 104
|
||||||
|
#define F_RAGSOC 105
|
||||||
|
#define F_DA_DATADOC 106
|
||||||
|
#define F_A_DATADOC 107
|
||||||
|
#define F_PERCENT 108
|
||||||
|
#define F_LISTINO 109
|
||||||
|
#define F_TIPOCF 110
|
||||||
|
#define F_DATADOC 111
|
||||||
|
#define F_NDOC 112
|
99
ve/vec1100a.uml
Executable file
99
ve/vec1100a.uml
Executable file
@ -0,0 +1,99 @@
|
|||||||
|
#include "vec1100.h"
|
||||||
|
|
||||||
|
PAGE "Rifatturazione COVER" -1 -1 60 15
|
||||||
|
|
||||||
|
STRING F_CODNUM 4 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 1 "Codice numerazione "
|
||||||
|
FLAG "UP"
|
||||||
|
USE %NUM
|
||||||
|
INPUT CODTAB F_CODNUM
|
||||||
|
DISPLAY "Cod. Num." CODTAB
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
OUTPUT F_CODNUM CODTAB
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
NUMBER F_ANNO 4 0
|
||||||
|
BEGIN
|
||||||
|
PROMPT 48 1 "Anno "
|
||||||
|
FLAG "P"
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
NUMBER F_CODCF 8
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 3 "Codice cliente "
|
||||||
|
USE LF_CLIFO KEY 1
|
||||||
|
INPUT TIPOCF "C"
|
||||||
|
INPUT CODCF F_CODCF
|
||||||
|
DISPLAY "Cod. Cli.@6R" CODCF
|
||||||
|
DISPLAY "Ragione sociale@50" RAGSOC
|
||||||
|
OUTPUT F_CODCF CODCF
|
||||||
|
OUTPUT F_RAGSOC RAGSOC
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_RAGSOC 50 30
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 4 "Ragione Sociale "
|
||||||
|
USE LF_CLIFO KEY 2
|
||||||
|
INPUT TIPOCF "C"
|
||||||
|
INPUT RAGSOC F_RAGSOC
|
||||||
|
DISPLAY "Ragione sociale@50" RAGSOC
|
||||||
|
DISPLAY "Cod. Cli.@6R" CODCF
|
||||||
|
OUTPUT F_CODCF CODCF
|
||||||
|
OUTPUT F_RAGSOC RAGSOC
|
||||||
|
CHECKTIPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
DATE F_DA_DATADOC
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 6 "Dalla data "
|
||||||
|
VALIDATE NOT_EMPTY_FUNC
|
||||||
|
END
|
||||||
|
|
||||||
|
DATE F_A_DATADOC
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 7 "Alla data "
|
||||||
|
VALIDATE DATE_CMP_FUNC >= F_DA_DATADOC
|
||||||
|
WARNING "Inserire una data finale non inferiore alla data iniziale"
|
||||||
|
END
|
||||||
|
|
||||||
|
NUMBER F_PERCENT 6 3
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 9 "Percentuale maggiorazione "
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_LISTINO 3
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 10 "Listino "
|
||||||
|
USE LF_CONDV
|
||||||
|
INPUT TIPO "L"
|
||||||
|
INPUT COD F_LISTINO
|
||||||
|
DISPLAY "Codice listino@3R" COD
|
||||||
|
DISPLAY "Descrizione@50" DESCR
|
||||||
|
OUTPUT F_LISTINO COD
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
DATE F_DATADOC
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 11 "Data del documento da creare "
|
||||||
|
FLAG "A"
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_OK 10 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT -13 -1 ""
|
||||||
|
MESSAGE EXIT,K_ENTER
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_QUIT 10 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT -33 -1 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
ENDPAGE
|
||||||
|
|
||||||
|
ENDMASK
|
Loading…
x
Reference in New Issue
Block a user