Patch level : aga 1.7 565

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Riportata la versione AGA 1.7 patch 564


git-svn-id: svn://10.65.10.50/trunk@11414 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2003-09-12 14:20:25 +00:00
parent 2b40264bb7
commit 847a4bb9c5
20 changed files with 2098 additions and 167 deletions

View File

@ -1,5 +1,5 @@
1001
101
12
DATAGEN|5|8|0|DATA GENERAZIONE FILE
ORAGEN|1|8|0|ORA GENERAZIONE FILE HH:MM:SS
GIORNI|2|3|0|GIORNI PER CALCOLO RISCHIO
@ -12,3 +12,5 @@ TIPOPAG|1|2|0|RB O RD (RB/TRATTA O RIMESSA DIRETTA)
DATASCAD|5|8|0|DATA SCADENZA
IMPORTO|4|18|2|IMPORTO
ESPOSTO|4|18|2|ESPOSTO
1
DATAGEN+ORAGEN+CLIENTE+PARTITA|X

View File

@ -23,6 +23,8 @@ protected:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
int calcola_esposto(const TRiga_scadenze& scad, const TDate& dataanalisi, const TDate& dataesposto,
TDate& datascad, TImporto& esposto) const;
public:
TMask& mask() { return *_msk; }
@ -43,12 +45,44 @@ bool TPartite2Euroasis::destroy()
return TSkeleton_application::destroy();
}
int TPartite2Euroasis::calcola_esposto(const TRiga_scadenze& scad, const TDate& dataanalisi, const TDate& dataesposto,
TDate& datascad, TImporto& esposto) const
{
const bool rischio = dataanalisi != dataesposto;
int tipo = scad.get_int(SCAD_TIPOPAG);
datascad = scad.get_date(SCAD_DATASCAD);
for (int i=scad.last(); i>0; i= scad.pred(i))
{
const TRiga_partite& pag = scad.partita().riga(i);
const int tp = pag.get_int(PART_TIPOPAG);
if (tp >= 2 && tp <= 7)
{
tipo = tp;
const TDate datapag = pag.get_date(PART_DATAPAG);
bool is_esposto = FALSE;
if (rischio && datapag > dataesposto && datapag <= dataanalisi)
is_esposto = TRUE;
else
if (datapag > dataanalisi)
is_esposto = TRUE;
if (is_esposto)
{
const char sez = pag.sezione();
const TImporto imp(sez, scad.row(i).get_real(PAGSCA_IMPORTO));
esposto+=imp;
}
if (datapag > datascad)
datascad = datapag;
}
}
return tipo;
}
void TPartite2Euroasis::main_loop()
{
TRelation rel(LF_SCADENZE);
rel.add(LF_PARTITE,"TIPOC==TIPOC|GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO|ANNO=ANNO|NUMPART==NUMPART",1,0);
rel.add(LF_PAGSCA, "TIPOC==TIPOC|GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO|ANNO==ANNO|NUMPART==NUMPART|NRIGA==NRIGA|NRATA==NRATA");
//TCursor cur(&rel, "29->PAGATA != \"X\" && 29->TIPOC == \"C\"", 2); // verificare la chiave
TCursor cur(&rel, "29->TIPOC == \"C\"", 2); // verificare la chiave
TMask& m = mask();
TConfig config("scp0100.ini");
@ -73,64 +107,33 @@ void TPartite2Euroasis::main_loop()
const TDate dataanalisi = m.get_date(F_DATA);
const int giorni = m.get_int(F_GIORNI);
const TDate dataesposto = dataanalisi - (long) giorni;
//TRectype from(LF_SCADENZE), to(LF_SCADENZE);
//from.put(SCAD_DATASCAD, _datascadi);
//to.put(SCAD_DATASCAD, _datascadf);
//_cur->setregion(from, to);
TRectype& recscad = cur.curr();
const TRectype& recpartita = cur.curr(LF_PARTITE);
const long items = cur.items();
TProgind p(items, "Elaborazione scadenze in corso ...", TRUE, TRUE, 10);
p.setstatus(1);
int err = NOERR;
for (cur=0; cur.pos()<items && !p.iscancelled() && err==NOERR; ++(cur))
{
p.addstatus(1);
TPartita partita(recpartita);
p.addstatus(1);
const int nriga = recscad.get_int(SCAD_NRIGA);
const int nrata = recscad.get_int(SCAD_NRATA);
TRiga_scadenze scad = partita.rata(nriga, nrata);
TRiga_partite rigapartite = scad.riga();
const int nrigp = rigapartite.get_int(PART_NRIGA);
const char sez = rigapartite.sezione();
const int last = partita.last();
const TDate datapag = rigapartite.get_date(PART_DATAPAG);
const bool rischio = dataanalisi != dataesposto;
//const bool valuta = FALSE;
//const TRectype & pag = scad.row(nrigp);
//const TImporto imp(sez, pag.get_real(valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO));
TDate data(scad.get(SCAD_DATASCAD));
const int lasts = scad.last();
bool esposto = FALSE;
bool sbf = FALSE;
bool found_pag = TRUE;
for (int p = scad.first(); p <= lasts; p = scad.succ(p))
{
if (p != nrigp)
{
const TRiga_partite & prow = partita.riga(p);
const int tp = prow.get_int(PART_TIPOPAG);
if (tp >= 2 && tp <= 7)
{
const TDate dataprow = prow.get(PART_DATAPAG);
if (dataprow < datapag)
{
data = datapag;
break;
}
}
}
}
if (rischio && data > dataesposto && data <= dataanalisi)
{
esposto = TRUE;
sbf = TRUE;
}
else
if (data > dataanalisi)
esposto = TRUE;
TImporto pagato = scad.importo_pagato(FALSE);
if (!scad.chiusa() || esposto && !pagato.is_zero())
const int nrata = recscad.get_int(SCAD_NRATA);
const long codcli = recscad.get_long(SCAD_SOTTOCONTO);
if (codcli == 11062)
{
int i = 0;
i++;
}
TPartita partita(recpartita);
const TRiga_scadenze& scad = partita.rata(nriga, nrata);
const TRiga_partite& rigapartite = scad.riga();
TDate datascad = scad.get(SCAD_DATASCAD);
TImporto esposto;
const int tipop = calcola_esposto(scad, dataanalisi, dataesposto, datascad, esposto);
if (!scad.chiusa() || !esposto.is_zero())
{
TImporto importo = scad.residuo(FALSE);
importo.normalize('D');
@ -151,19 +154,17 @@ void TPartite2Euroasis::main_loop()
strpartita << "/";
strpartita << recpartita.get(PART_NUMPART);
filescad.put("PARTITA", strpartita);
const int tipopag = recscad.get_int(SCAD_TIPOPAG);
if (tipopag >= 2 && tipopag <= 7)
if (tipop >= 2 && tipop <= 7)
filescad.put("TIPOPAG", "RB");
else
filescad.put("TIPOPAG", "RD");
filescad.put("DATASCAD", recscad.get(SCAD_DATASCAD));
filescad.put("DATASCAD", datascad);
filescad.put("IMPORTO", importo.valore());
filescad.put("ESPOSTO", pagato.valore());
filescad.put("ESPOSTO", esposto.valore());
err = filescad.write();
//if (err != NOERR)
// error_box("Errore %d in scrittura file dbf", err);
}
}
if (err == NOERR)
{
if (exe.not_empty())

287
ve/filconad.ini Executable file
View File

@ -0,0 +1,287 @@
[MAIN]
DECSEP = ,
FIELDSEP =
RECORDSEP =
RECORDSIZE = 128
SKIPLINES = 0
TYPEFIELD = -1
TYPELEN = -1
TYPEPOS = -1
[TYPE FISSO]
ALIGN =
DATA =
DECIMAL = 0
FILLER = ' '
LENGTH = 0
PICTURE =
[TYPE DATA]
ALIGN =
DATA = D
DECIMAL = 0
FILLER =
LENGTH = 6
PICTURE =
[TYPE NUMERO]
ALIGN = R
DATA = N
DECIMAL = 0
FILLER = '0'
LENGTH = 0
PICTURE =
[TYPE STRINGA]
ALIGN = L
DATA = S
DECIMAL = 0
FILLER = ' '
LENGTH = 0
PICTURE =
[TYPE IMPORTO]
ALIGN = R
DATA = S
DECIMAL = 0
FILLER = '0'
LENGTH = 0
PICTURE =
[HEADER 01]
NAME(0)=TIPO RECORD
TYPE(0)=FISSO
LENGTH(0)=2
POSITION(0)=0
MESSAGE(0)=_FISSO,!01
FIELD(0)=
NAME(1) = NUMERO PROGRESSIVO
TYPE(1) = NUMERO
LENGTH(1) = 5
POSITION(1) = 2
MESSAGE(1) = _PROGRESSIVO
NAME(2) = NUMERO FATTURA
TYPE(2) = NUMERO
LENGTH(2) = 6
POSITION(2) = 7
MESSAGE(2) = _FATTURA,NUMERO
NAME(3) = DATA FATTURA
TYPE(3) =
LENGTH(3) = 6
POSITION(3) = 13
MESSAGE(3) = _FATTURA,DATA
NAME(4) = NUMERO BOLLA
TYPE(4) = NUMERO
LENGTH(4) = 6
POSITION(4) = 19
FIELD(4) = 33->NDOC
NAME(5) = DATA BOLLA
TYPE(5) =
LENGTH(5) = 6
POSITION(5) = 25
MESSAGE(5) = _BOLLA,DATA
NAME(6) = CODICE FORNITORE
ALIGN(6) = R
DATA(6) = S
LENGTH(6) = 15
POSITION(6) = 31
MESSAGE(6) = _FORNITORE
NAME(7) = TIPO FORNITORE
TYPE(7) =
LENGTH(7) = 1
POSITION(7) = 46
NAME(8) = CODICE CLIENTE
TYPE(8) =
LENGTH(8) = 15
POSITION(8) = 47
// MESSAGE(8) = _CONAD
NAME(9) = CODICE COOPERATIVA
TYPE(9) =
LENGTH(9) = 15
POSITION(9) = 62
NAME(10) = CODICE SOCIO
ALIGN(10) = R
DATA(10) = S
LENGTH(10) = 15
POSITION(10) = 77
FIELD(10) = 16->PTEL
NAME(11) = TIPO SOCIO
TYPE(11) =
LENGTH(11) = 1
POSITION(11) = 92
NAME(12) = TIPO DOCUMENTO
TYPE(12) = STRINGA
LENGTH(12) = 1
POSITION(12) = 93
MESSAGE(12) = _FISSO,!F
NAME(13) = CODICE DIVISA
TYPE(13) =
LENGTH(13) = 3
POSITION(13) = 94
MESSAGE(13) = _FISSO,!EUR
NAME(14) = FILLER
TYPE(14) =
LENGTH(14) = 25
POSITION(14) = 97
NAME(15) = RISERVATO
TYPE(15) =
LENGTH(15) = 6
POSITION(15) = 122
[RECORD 02]
NAME(0) = TIPO RECORD
TYPE(0) =
LENGTH(0) = 2
POSITION(0) = 0
MESSAGE(0) = _FISSO,!02
NAME(1) = NUMERO PROGRESSIVO
TYPE(1) =
LENGTH(1) = 5
POSITION(1) = 2
MESSAGE(1) = _PROGRESSIVO
FILLER(1) = '0'
NAME(2) = CODICE ARTICOLO
TYPE(2) =
LENGTH(2) = 15
POSITION(2) = 7
FIELD(2) = 34->CODART
NAME(3) = DESCRIZIONE ARTICOLO
TYPE(3) =
LENGTH(3) = 30
POSITION(3) = 22
FIELD(3) = 34->DESCR
NAME(4) = UNITA DI MISURA
TYPE(4) =
LENGTH(4) = 2
POSITION(4) = 52
FIELD(4) = 34->UMQTA
NAME(5) = QUANTITA FATTURATA
LENGTH(5) = 7
TYPE(5) = IMPORTO
POSITION(5) = 54
MESSAGE(5) = _RIGABOLLA,QUANTITA
NAME(6) = PREZZO UNITARIO
TYPE(6) = IMPORTO
LENGTH(6) = 9
DECIMAL(6) = 3
POSITION(6) = 61
MESSAGE(6) = _RIGABOLLA,PREZZO
NAME(7) = IMPORTO TOTALE
TYPE(7) = IMPORTO
LENGTH(7) = 9
DECIMAL(7) = 3
POSITION(7) = 70
MESSAGE(7) = _RIGABOLLA,IMPORTO
NAME(8) = NUMERO PEZZI
TYPE(8) =
LENGTH(8) = 4
POSITION(8) = 79
NAME(9) = TIPO IVA
TYPE(9) = STRINGA
LENGTH(9) = 1
POSITION(9) = 83
NAME(10) = ALIQUOTA IVA
TYPE(10) = STRINGA
LENGTH(10) = 2
POSITION(10) = 84
MESSAGE(10) = _RIGABOLLA,ALIQUOTA
NAME(11) = TIPO MOVIMENTO
TYPE(11) =
LENGTH(11) = 1
POSITION(11) = 86
NAME(12) = TIPO CESSIONE
TYPE(12) = STRINGA
LENGTH(12) = 1
POSITION(12) = 87
MESSAGE(12) = _RIGABOLLA,OMAGGIO
NAME(13) = NUMERO ORDINE CONAD
TYPE(13) =
LENGTH(13) = 6
POSITION(13) = 88
NAME(14) = CODICE LISTINO
TYPE(14) =
LENGTH(14) = 2
POSITION(14) = 94
NAME(15) = TIPO ARTICOLO
TYPE(15) =
LENGTH(15) = 1
POSITION(15) = 96
NAME(16) = TIPO CONTRATTO
TYPE(16) =
LENGTH(16) = 1
POSITION(16) = 97
NAME(17) = TIPO TRATTAMENTO
TYPE(17) =
LENGTH(17) = 1
POSITION(17) = 98
NAME(18) = COSTO TRASPORTO
TYPE(18) =
LENGTH(18) = 5
DECIMAL(18) = 3
POSITION(18) = 99
NAME(19) = CODICE CONTABILE
TYPE(19) =
LENGTH(19) = 1
POSITION(19) = 104
NAME(20) = TIPO RESO
TYPE(20) =
LENGTH(20) = 1
POSITION(20) = 105
NAME(21) = PREZZO CATALOGO
TYPE(21) =
LENGTH(21) = 7
DECIMAL(21) = 3
POSITION(21) = 106
NAME(22) = FILLER
TYPE(22) =
LENGTH(22) = 3
POSITION(22) = 113
NAME(23) = DATA ORDINE
TYPE(23) =
LENGTH(23) = 6
POSITION(23) = 116
NAME(24) = RISERVATO
TYPE(24) =
LENGTH(24) = 6
POSITION(24) = 122

View File

@ -55,9 +55,16 @@ void TIndustriosa_app::get_field(const TDocumento& doc, const TRectype& mov, con
{
val.cut(0);
if (stricmp(field, "_CANTIERE") == 0)
{
val = rec.get(RDOC_CODCMS).left(4);
val << rec.get(RDOC_FASCMS);
if (val.empty())
{
val = doc.get(DOC_CODCMS).left(4);
val << doc.get(DOC_FASCMS);
}
else
val << rec.get(RDOC_FASCMS);
} else
if (stricmp(field, "_CONINDU") == 0)
{

View File

@ -27,7 +27,7 @@ DareAvere = _SEZIONE
Importo = _IMPORTO
ImpVal = _IMPORTOVAL
Descri = DESCR
Codiva = _CODIVA
Codiva = 34->CODIVA
TipoDet = "0"
FlagProvv = "0"
Impodet = "0"

563
ve/ve7200.cpp Executable file
View File

@ -0,0 +1,563 @@
#include <applicat.h>
#include <assoc.h>
#include <automask.h>
#include <currency.h>
#include <msksheet.h>
#include <printer.h>
#include <recarray.h>
#include <relation.h>
#include <sort.h>
#include "velib.h"
#include "ve7.h"
#include "ve7200.h"
#include "ve7200a.h"
#include "../cg/cgsaldac.h"
#include <scadenze.h>
#include <partite.h>
class TDocumentoOrdine : public TDocumento
{
TString_array _scadenze_array;// Array che contiene le scadenze ("<data>|<importo>")
int _scadenze_current; // indice per identificare l'elementi corrente sull'array (-1 se non ha ancora calcolato)
public:
// Funzioni per il ricalcolo delle scadenze
void scadord_reset(); // riposiziona sulla prima scadenza
void scadord_recalc(); // resetta e ricalcola le scadenze
void scadord_set_next(); // seleziona il prossimo elemento dell'array delle scadenze
const char * scadord_get(const TString& w); // reperisce l'informazione richiesta dall'elemento corrente
int scadord_items() { return _scadenze_array.items(); } // restituisce il numero di scadenze
TString_array& scadord() { return _scadenze_array; }
TDocumentoOrdine (const TRectype & rec, dec_parm & parm) ;
TDocumentoOrdine (const TRectype & rec) ;
TDocumentoOrdine () ;
virtual ~TDocumentoOrdine();
};
void TDocumentoOrdine::scadord_recalc()
{
TAssoc_array scadenze;
scadenze.destroy();
_scadenze_array.destroy();
_scadenze_current = -1;
TRectype& testadoc = head();
TPagamento& pag = pagamento();
const int rows = physical_rows();
for (int i = 0; i < rows; i++)
{
const TRiga_documento& rigadoc = physical_row(i+1);
bool evasa = rigadoc.get_bool(RDOC_RIGAEVASA);
if (!evasa)
evasa = (rigadoc.qtaresidua() <= 0);
if (!evasa)
{
TDate datacons = rigadoc.get_date(RDOC_DATACONS);
if (!datacons.ok())
datacons = testadoc.get_date(DOC_DATACONS);
TString16 codval = valuta();
real totimponibili = rigadoc.valore(FALSE, AUTO_DECIMALS);
real totimposte = rigadoc.iva().imposta(totimponibili, AUTO_DECIMALS, codval);
real totspese = ZERO;
const bool is_in_valuta = in_valuta();
if (is_in_valuta)
{
const real change(cambio());
TCurrency_documento val1(totimponibili, *this); val1.change_to_firm_val();
TCurrency_documento val2(totimposte, *this); val2.change_to_firm_val();
TCurrency_documento val3(totspese, *this); val3.change_to_firm_val();
pag.set_total_valuta(totimponibili, totimposte, totspese, change, val1.get_num(), val2.get_num() ,val3.get_num(), codval);
}
else
pag.set_total(totimponibili, totimposte, totspese);
pag.set_inizio(datacons);
pag.set_rate_auto();
const int numrate = pag.n_rate( );
real rata;
for (int i = 0; i< numrate; i++)
{
rata = pag.importo_rata(i, is_in_valuta);
const char* datastringa = (const char*) pag.data_rata(i).string();
if (scadenze.is_key(datastringa))
{
real& valore = (real&)scadenze[datastringa];
valore+=rata;
}
else
{
real* oggetto = new real(rata);
scadenze.add(datastringa,(TObject*)oggetto);
}
}
}
}
scadenze.restart();
real* c;
for (c = (real*) scadenze.first_item(); c != NULL; c = (real*) scadenze.succ_item())
{
const char* datastringa = scadenze.get_hashobj()->key();
TToken_string t;
t.add(datastringa);
real importo(*c);
t.add(importo.string());
_scadenze_array.add(t);
}
if (_scadenze_array.items() > 0)
_scadenze_current++;
}
const char* TDocumentoOrdine::scadord_get(const TString& w)
{
const char* ret = "";
if (_scadenze_current == -1)
// calcola le scadenze e le mette in _scadenze_array
scadord_recalc();
if (_scadenze_current > -1 && _scadenze_current < _scadenze_array.items())
{
if (w == "DATA")
ret = _scadenze_array.row(_scadenze_current).get(0); // ritorna la data di scadenza
if (w == "IMPORTO")
ret = _scadenze_array.row(_scadenze_current).get(1); // ritorna l'importo in scadenza
}
return ret;
}
void TDocumentoOrdine::scadord_set_next()
{
if (_scadenze_current >= 0 &&
_scadenze_current < _scadenze_array.items() )
_scadenze_current++;
}
void TDocumentoOrdine::scadord_reset()
{
if (_scadenze_current > 0)
_scadenze_current = 0;
}
TDocumentoOrdine::TDocumentoOrdine(const TRectype& rec)
: TDocumento(rec), _scadenze_current(-1)
{
}
TDocumentoOrdine::TDocumentoOrdine(const TRectype& rec, dec_parm & parm)
: TDocumento(rec), _scadenze_current(-1)
{
}
TDocumentoOrdine::TDocumentoOrdine()
: TDocumento(), _scadenze_current(-1)
{ }
TDocumentoOrdine::~TDocumentoOrdine()
{ }
class TFlussi_form : public TForm
{
public:
virtual bool validate(TForm_item &cf, TToken_string &s);
void set_testata() {set_header(1,TRUE);}
void set_pedata() {set_footer(1,FALSE); set_footer(1,TRUE);}
TPrint_section& get_line() {return section('B', odd_page);}
TFlussi_form();
virtual ~TFlussi_form();
};
TFlussi_form::TFlussi_form() :TForm ("ve7200a")
{
}
TFlussi_form::~TFlussi_form()
{
}
bool TFlussi_form::validate(TForm_item &cf, TToken_string &s)
{
return TForm::validate(cf,s);
}
class TFlussi_mask : public TAutomask
{
TRelation * _rel;
TCursor * _cur;
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TFlussi_mask();
virtual ~TFlussi_mask(){};
};
TFlussi_mask::TFlussi_mask() :TAutomask ("ve7200a")
{
}
bool TFlussi_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
return TRUE;
}
class TStampaFlussiCassa : public TSkeleton_application
{
#pragma pack(1)
struct struct_scadenza
{
char data[9];
real importo;
char descrizione[80];
char estremidoc[45];
char statodoc;
};
#pragma pack()
TRelation* _rel;
TCursor* _cur;
TFlussi_mask* _msk;
TFlussi_form* _form;
TSort* _sort;
TString_array _tipi_doc; // Array di stringhe contenente i tipi documenti da elaborare
TDate _datascadi, _datascadf;
real _totale; // totale a partire da saldo iniziale
protected:
virtual bool create(void);
virtual bool destroy(void);
virtual void main_loop() ;
void elabora_scad();
void elabora_doc();
void stampa_flussi();
void print_header();
void print_footer();
void print_line(struct_scadenza* riga);
public:
TStampaFlussiCassa() {} ;
virtual ~TStampaFlussiCassa() {} ;
};
bool TStampaFlussiCassa::create()
{
open_files(LF_DOC, LF_RIGHEDOC, LF_SCADENZE, LF_CLIFO, LF_CFVEN, 0);
_rel = new TRelation(LF_SCADENZE);
_rel->add(LF_PARTITE,"TIPOC==TIPOC|GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO|ANNO=ANNO|NUMPART==NUMPART",1,0);
_rel->add(LF_PAGSCA, "TIPOC==TIPOC|GRUPPO==GRUPPO|CONTO==CONTO|SOTTOCONTO==SOTTOCONTO|ANNO==ANNO|NUMPART==NUMPART|NRIGA==NRIGA|NRATA==NRATA");
_cur = new TCursor(_rel, "PAGATA != \"X\"", 2);
_msk = new TFlussi_mask();
_form = new TFlussi_form();
_sort = new TSort(sizeof(struct_scadenza));
_sort->addsortkey(0,8);
return TSkeleton_application::create();
}
bool TStampaFlussiCassa::destroy()
{
delete _sort;
delete _form;
delete _msk;
delete _cur;
delete _rel;
return TSkeleton_application::destroy();
}
void TStampaFlussiCassa::main_loop()
{
while (_msk->run()!=K_QUIT)
{
_datascadi = _msk->get_date(F_DATASCADI);
_datascadf = _msk->get_date(F_DATASCADF);
_totale = _msk->get_real(F_SALDOINI);
_sort->init(); // inizializza il sort
elabora_scad(); // cominciamo dalle scadenze
elabora_doc(); // continuiamo con i documenti
_sort->endsort(); // fine sort
stampa_flussi(); // stampiamo il tutto
}
}
void TStampaFlussiCassa::stampa_flussi()
{
const int reclen = sizeof(struct_scadenza);
TString256 result;
printer().open();
print_header();
print_footer();
TPrint_section& section = _form->get_line();
section.reset();
if (_totale > 0)
{
_form->find_field('B', odd_page, FF_B_IMPORTOD).set(_totale.string());
_form->find_field('B', odd_page, FF_B_IMPORTOA).set("");
}
else
{
_form->find_field('B', odd_page, FF_B_IMPORTOA).set(_totale.string());
_form->find_field('B', odd_page, FF_B_IMPORTOD).set("");
}
_form->find_field('B', odd_page, FF_B_DESCRIZIONE).set("Saldo iniziale");
_form->find_field('B', odd_page, FF_B_DESCRIZIONE).set("Saldo iniziale");
section.update();
for (word i = 0; i < section.height(); i++)
{
TPrintrow row = section.row(i);
printer().print(section.row(i));
}
struct_scadenza* riga;
riga = (struct_scadenza*)_sort->retrieve();
while (riga != NULL)
{
print_line(riga);
riga = (struct_scadenza*) _sort->retrieve();
}
printer().close();
}
void TStampaFlussiCassa::print_header()
{
_form->set_testata();
}
void TStampaFlussiCassa::print_footer()
{
_form->set_pedata();
}
void TStampaFlussiCassa::elabora_scad()
{
TRectype from(LF_SCADENZE), to(LF_SCADENZE);
from.put(SCAD_DATASCAD, _datascadi);
to.put(SCAD_DATASCAD, _datascadf);
_cur->setregion(from, to);
TRectype& recscad = _cur->curr();
const TRectype& recpartita = _cur->curr(LF_PARTITE);
const long items = _cur->items();
for (*_cur=0; _cur->pos()<items; ++(*_cur))
{
struct_scadenza riga_scadenza;
TPartita partita(recpartita);
const int nriga = recscad.get_int(SCAD_NRIGA);
const int nrata = recscad.get_int(SCAD_NRATA);
TRiga_scadenze rigascadenze = partita.rata(nriga, nrata);
TDate datascad = recscad.get_date(SCAD_DATASCAD);
long data = datascad.date2ansi();
TImporto importo = rigascadenze.residuo(FALSE);
importo.normalize('D');
TString16 codice;
codice.cut(0);
codice << recscad.get(SCAD_TIPOCF);
codice << '|' << recscad.get(SCAD_SOTTOCONTO);
TString80 descr = cache().get(LF_CLIFO, codice, CLI_RAGSOC);
sprintf(riga_scadenza.data, "%8ld", data);
riga_scadenza.importo = importo.valore();
strcpy(riga_scadenza.descrizione, descr);
TString80 estremi = "Doc. ";
estremi << recpartita.get(PART_NUMDOC);
estremi << " del " << recpartita.get(PART_DATADOC);
estremi << " - Prot. " << recpartita.get(PART_PROTIVA);
strcpy(riga_scadenza.estremidoc, estremi);
riga_scadenza.statodoc = ' ';
const char* record = (const char*) &riga_scadenza;
_sort->sort(record);
}
}
void TStampaFlussiCassa::elabora_doc()
{
TSheet_field& sheet = _msk->sfield(F_SHEETDOC);
TRelation doc_rel(LF_DOC);
TRectype da(LF_DOC);
TRectype a(LF_DOC);
const long items = sheet.items();
if (items > 0)
{
int year_from = _msk->get_int(F_ESERCIZIO);
int year_to = _datascadf.year();
bool ok = TRUE;
TString16 codnum, tipodoc;
bool aresiduo;
char dastato, astato;
TString filt_expr;
TDate dataini(1, 1, year_from);
da.put("DATADOC", dataini);
da.put("PROVV", "D");
da.put("ANNO", year_from);
a.put("DATADOC", _datascadf);
a.put("PROVV", "D");
a.put("ANNO", year_to);
filt_expr << "(";
FOR_EACH_SHEET_ROW(sheet, r, row)
{
codnum = row->get(0);
tipodoc = row->get(2);
dastato = row->get_char(4);
astato = row->get_char(5);
aresiduo = row->get_char(6);
if (codnum.not_empty() && tipodoc.not_empty())
{
filt_expr << "((CODNUM=\"";
filt_expr << codnum << "\")&&";
filt_expr << "(TIPODOC=\"";
filt_expr << tipodoc << "\")";
if (dastato != ' ')
filt_expr << " &&(STATO>=\"" << dastato << "\")";
if (astato != ' ')
filt_expr << "&&(STATO<=\"" << astato << "\")";
filt_expr << ")||";
}
}
filt_expr.rtrim(2);
filt_expr << ")";
TCursor doc_cur(&doc_rel,filt_expr,3,&da,&a);
const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato
if (cur_items != 0)
{
doc_cur.freeze();
const TRectype& cur_rec = doc_cur.curr();
for (doc_cur = 0; doc_cur.pos() < cur_items; ++doc_cur)
{
TDocumento documento(cur_rec);
if (documento.is_ordine())
{
TDocumentoOrdine* doc = new TDocumentoOrdine;
if (doc->read(doc_cur.curr()) == NOERR) // legge il documento
{
doc->scadord_recalc();
for (int i=0;i < doc->scadord_items(); i++)
{
struct_scadenza riga_scadenza;
TDate datascad = doc->scadord_get("DATA");
if (datascad >= _datascadi && datascad <= _datascadf)
{
long data = datascad.date2ansi();
real importoscad = doc->scadord_get("IMPORTO");
const char sez = doc->tipocf();
TImporto importo((sez=='C' ? 'D' : 'A'), importoscad);
importo.normalize('D');
TString16 codice;
codice.cut(0);
codice << doc->tipocf();
codice << '|' << doc->codcf();
TString80 descr = cache().get(LF_CLIFO, codice, CLI_RAGSOC);
TString80 estremi = doc->tipo().codice();
estremi << " n. " << doc->numero();
estremi << " del " << doc->data().string();
const char stato = doc->stato();
sprintf(riga_scadenza.data, "%8ld", data);
riga_scadenza.importo = importo.valore();
strcpy(riga_scadenza.descrizione, descr);
strcpy(riga_scadenza.estremidoc, estremi);
riga_scadenza.statodoc = stato;
const char* record = (const char*) &riga_scadenza;
_sort->sort(record);
}
doc->scadord_set_next();
}
}
else
delete doc;
}
else
{
TDocumentoEsteso* doc = new TDocumentoEsteso;
if (doc->read(doc_cur.curr()) == NOERR) // legge il documento
{
doc->scadenze_recalc();
for (int i=0;i < doc->scadenze_items(); i++)
{
struct_scadenza riga_scadenza;
TDate datascad = doc->scadenze_get("DATA");
if (datascad >= _datascadi && datascad <= _datascadf)
{
long data = datascad.date2ansi();
real importoscad = doc->scadenze_get("IMPORTO");
const char sez = doc->tipocf();
TImporto importo((sez=='C' ? 'D' : 'A'), importoscad);
importo.normalize('D');
TString16 codice;
codice.cut(0);
codice << doc->tipocf();
codice << '|' << doc->codcf();
TString80 descr = cache().get(LF_CLIFO, codice, CLI_RAGSOC);
TString80 estremi = doc->tipo().codice();
estremi << " n. " << doc->numero();
estremi << " del " << doc->data().string();
const char stato = doc->stato();
sprintf(riga_scadenza.data, "%8ld", data);
riga_scadenza.importo = importo.valore();
strcpy(riga_scadenza.descrizione, descr);
strcpy(riga_scadenza.estremidoc, estremi);
riga_scadenza.statodoc = stato;
const char* record = (const char*) &riga_scadenza;
_sort->sort(record);
}
doc->scadenze_set_next();
}
}
else
delete doc;
}
}
}
}
}
void TStampaFlussiCassa::print_line(struct_scadenza* riga)
{
const long scadenza = atol(riga->data);
const TDate datascad(scadenza);
const real importo = riga->importo;
TString80 descr = riga->descrizione;
descr.trim();
_form->find_field('B', odd_page, FF_B_DESCRIZIONE).set(descr);
if (importo.sign() >=0)
{
_form->find_field('B', odd_page, FF_B_IMPORTOD).set(importo.string());
_form->find_field('B', odd_page, FF_B_IMPORTOA).set("");
}
else
{
_form->find_field('B', odd_page, FF_B_IMPORTOA).set(importo.string());
_form->find_field('B', odd_page, FF_B_IMPORTOD).set("");
}
TString80 estremi = riga->estremidoc;
_form->find_field('B', odd_page, FF_B_ESTREMIDOC).set(estremi);
TString4 stato = "";
stato[0] = riga->statodoc;
_form->find_field('B', odd_page, FF_B_STATODOC).set(stato);
_form->find_field('B', odd_page, FF_B_SCADENZA).set(datascad);
_totale += importo;
_form->find_field('B', odd_page, FF_B_PROGRESSIVO).set(_totale.string());
TPrint_section& section = _form->get_line();
section.update();
for (word i = 0; i < section.height(); i++)
{
TPrintrow row = section.row(i);
printer().print(section.row(i));
}
}
int ve7200(int argc, char **argv)
{
TStampaFlussiCassa a;
a.run(argc, argv, "Stampa flussi di cassa");
return 0;
}

22
ve/ve7200.h Executable file
View File

@ -0,0 +1,22 @@
// campi form flussi di cassa
#define FF_DESCRIZIONE 1
#define FF_DOCUMENTO 2
#define FF_IMPORTOD 3
#define FF_IMPORTOA 4
#define FF_ESTREMIDOC 5
#define FF_STATODOC 6
#define FF_SCADENZA 7
#define FF_PROGRESSIVO 8
#define FF_B_DESCRIZIONE 11
#define FF_B_DOCUMENTO 12
#define FF_B_IMPORTOD 13
#define FF_B_IMPORTOA 14
#define FF_B_SCADENZA 15
#define FF_B_ESTREMIDOC 16
#define FF_B_STATODOC 17
#define FF_B_PROGRESSIVO 18
#define FF_DITTA 21
#define FF_DATE 22
#define FF_PAGE 23

145
ve/ve7200a.frm Executable file
View File

@ -0,0 +1,145 @@
#include "ve7200.h"
GENERAL
BEGIN
// OFFSET 0 1
// FONT "Courier New"
// SIZE 10
END
SECTION GRAPHIC
BEGIN
END
//-------------------------intestazione form-----------------------------------------------//
SECTION HEADER ODD 6
STRINGA FF_DITTA 40 1
BEGIN
KEY "nome ditta"
PROMPT 1 1 "Ditta "
MESSAGE _DITTA, !RAGSOC
END
DATA FF_DATE
BEGIN
KEY "Data"
PROMPT 1 3 "Data "
MESSAGE _TODAY
END
NUMERO FF_PAGE 10
BEGIN
KEY "Nr. pagina"
PROMPT 154 3 "Pag."
END
STRINGA -1
BEGIN
KEY "titolo"
PROMPT 75 3 "@bSTAMPA FLUSSI DI CASSA"
END
STRINGA FF_DESCRIZIONE 60
BEGIN
KEY "Descrizione"
PROMPT 1 5 "@bDescrizione"
END
STRINGA FF_IMPORTOD 18
BEGIN
KEY "Importo dare"
PROMPT 62 5 "@b Incassi"
END
STRINGA FF_IMPORTOA 18
BEGIN
KEY "Importo avere"
PROMPT 81 5 "@b Spese"
END
STRINGA FF_ESTREMIDOC 45
BEGIN
KEY "Estremi doc."
PROMPT 110 5 "@bEstremi doc."
END
STRINGA FF_STATODOC 1
BEGIN
KEY "Stato doc."
PROMPT 156 5 "S"
END
STRINGA FF_SCADENZA 10
BEGIN
KEY "Scadenza"
PROMPT 158 5 "@bScadenza"
END
STRINGA FF_PROGRESSIVO 18
BEGIN
KEY "Progressivo"
PROMPT 169 5 "@b Progressivo"
END
STRINGA -1
BEGIN
KEY "riga di separazione"
PROMPT 1 6 "___________________________________________________________________________________________________________________________________________________________________________"
END
END
//-----------------------riga tipo uno---------------------------------------------------//
SECTION BODY ODD 1
STRINGA FF_B_DESCRIZIONE 60
BEGIN
KEY "Descrizione"
PROMPT 1 1 ""
END
NUMBER FF_B_IMPORTOD 18
BEGIN
KEY "Importo dare"
PROMPT 62 1 ""
PICTURE "###.###.###.###,@@"
END
NUMBER FF_B_IMPORTOA 18
BEGIN
KEY "Importo avere"
PROMPT 81 1 ""
PICTURE "###.###.###.###,@@"
END
STRINGA FF_B_ESTREMIDOC 45
BEGIN
KEY "Estremi doc."
PROMPT 110 1 ""
END
STRINGA FF_B_STATODOC 1
BEGIN
KEY "Stato doc."
PROMPT 156 1 ""
END
STRINGA FF_B_SCADENZA 10
BEGIN
KEY "Scadenza"
PROMPT 158 1 ""
END
NUMBER FF_B_PROGRESSIVO 18
BEGIN
KEY "Progressivo"
PROMPT 169 1 ""
PICTURE "###.###.###.###,@@"
END
END
SECTION FOOTER ODD 1
END

17
ve/ve7200a.h Executable file
View File

@ -0,0 +1,17 @@
#define F_CODDITTA 101
#define F_RAGSOC 102
#define F_ESERCIZIO 103
#define F_DATASCADI 104
#define F_DATASCADF 105
#define F_SALDOINI 106
#define F_SHEETDOC 107
// campi dello sheet
#define F_S_CODNUM 101
#define F_S_DESNUM 102
#define F_S_TIPODOC 103
#define F_S_DESTIPO 104
#define F_S_DASTATO 105
#define F_S_ASTATO 106
#define F_S_ARESIDUO 107
#define F_S_DESDASTATO 108
#define F_S_DESASTATO 109

210
ve/ve7200a.uml Executable file
View File

@ -0,0 +1,210 @@
#include "ve7200a.h"
TOOLBAR "" 0 -5 0 4
STRING 30 70 50
BEGIN
FLAGS "G"
PROMPT 10 -5 "Profilo "
PSELECT
END
BUTTON DLG_PRINT 10 2
BEGIN
PROMPT -12 -11 ""
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -11 ""
END
ENDPAGE
PAGE "Stampa Flussi di cassa" -1 -1 78 18
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 1 0 "@bDitta"
END
NUMBER F_CODDITTA 5
BEGIN
PROMPT 2 1 "Codice "
FLAGS "DFR"
USE LF_NDITTE
INPUT CODDITTA F_CODDITTA
OUTPUT F_RAGSOC RAGSOC
CHECKTYPE REQUIRED
END
STRING F_RAGSOC 50
BEGIN
PROMPT 17 1 "Rag.Soc. "
FLAGS "D"
END
GROUPBOX DLG_NULL 78 5
BEGIN
PROMPT 1 3 "@bParametri"
END
STRING F_ESERCIZIO 4
BEGIN
PROMPT 2 4 "Esercizio da cui partire per le scadenze dei documenti "
FLAGS "UPZ"
USE ESC
INPUT CODTAB F_ESERCIZIO
DISPLAY "Codice@10" CODTAB
DISPLAY "Dal@16" D0
DISPLAY "Al@16" D1
OUTPUT F_ESERCIZIO CODTAB
CHECKTYPE NORMAL
END
DATE F_DATASCADI
BEGIN
PROMPT 2 5 "Data di scadenza dal "
HELP "Data di inizio scadenza"
CHECKTYPE REQUIRED
WARNING "Data di inizio scadenza non valida"
FLAGS "A"
END
DATE F_DATASCADF
BEGIN
PROMPT 40 5 "al "
HELP "Data di fine scadenza"
CHECKTYPE REQUIRED
VALIDATE DATE_CMP_FUNC >= F_DATASCADI
WARNING "Data di fine scadenza non valida"
END
CURRENCY F_SALDOINI 15
BEGIN
PROMPT 2 6 "Saldo iniziale "
END
SPREADSHEET F_SHEETDOC
BEGIN
PROMPT 2 8 "Scelta documenti"
ITEM "Cod. num."
ITEM "Descrizione num.@32"
ITEM "Tipo doc."
ITEM "Descrizione tipo@32"
ITEM "Da stato"
ITEM "A stato"
ITEM "A residuo"
END
ENDPAGE
ENDMASK
PAGE "Scelta documenti" -1 -1 75 10
STRING F_S_CODNUM 4
BEGIN
PROMPT 2 1 "Cod. num. "
FLAGS "U"
USE %NUM
INPUT CODTAB F_S_CODNUM
DISPLAY "Cod. Num." CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_S_CODNUM CODTAB
OUTPUT F_S_DESNUM S0
CHECKTYPE REQUIRED
END
STRING F_S_DESNUM 50
BEGIN
PROMPT 20 1 ""
HELP "Descrizione numerazione"
USE %NUM KEY 2
INPUT S0 F_S_DESNUM
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_S_CODNUM
END
STRING F_S_TIPODOC 4
BEGIN
PROMPT 2 2 "Tipo doc. "
HELP "Codice tipo documento"
USE %TIP
INPUT CODTAB F_S_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_S_TIPODOC CODTAB
OUTPUT F_S_DESTIPO S0
CHECKTYPE REQUIRED
FLAG "UP"
END
STRING F_S_DESTIPO 50
BEGIN
PROMPT 20 2 ""
HELP "Descrizione tipo documento"
USE %TIP KEY 2
INPUT S0 F_S_DESTIPO
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_S_TIPODOC
END
STRING F_S_DASTATO 1
BEGIN
PROMPT 2 3 "Da stato "
USE %STD
INPUT CODTAB F_S_DASTATO
DISPLAY "Stato" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_S_DASTATO CODTAB
OUTPUT F_S_DESDASTATO S0
CHECKTYPE NORMAL
END
STRING F_S_ASTATO 1
BEGIN
PROMPT 2 4 "A stato "
USE %STD
INPUT CODTAB F_S_ASTATO
DISPLAY "Stato" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_S_ASTATO CODTAB
OUTPUT F_S_DESASTATO S0
CHECKTYPE NORMAL
END
BOOLEAN F_S_ARESIDUO
BEGIN
PROMPT 2 5 "A residuo"
END
STRING F_S_DESDASTATO 50
BEGIN
PROMPT 20 3 ""
END
STRING F_S_DESASTATO 50
BEGIN
PROMPT 20 4 ""
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_DELREC 9 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_CANCEL 9 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -1,10 +1,6 @@
#include <applicat.h>
#include <automask.h>
#include <form.h>
#include <printer.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <recarray.h>
#include <utility.h>
#include <doc.h>
@ -14,23 +10,8 @@
#include "ve7300.h"
#include "ve7300a.h"
//la dichiarazione delle classi è nel ve7300.h (come si dovrebbe sempre fare...)
//-----FORM--------------------------------------------------------------------------------------//
class TEntrFor_form : public TForm
{
private:
TSorted_cursor* _sc;
protected:
virtual bool validate(TForm_item& cf, TToken_string& s);
void output_values(const TRectype & rec, const char * output, TForm_item & cf);
const TRectype* find_original_rdoc(const TRectype& row) const;
public:
virtual TCursor* cursor() const { return _sc; }
TEntrFor_form();
virtual ~TEntrFor_form();
};
TEntrFor_form::TEntrFor_form() :TForm ("ve7300a")
{
@ -161,13 +142,18 @@ bool TEntrFor_form::validate(TForm_item& cf, TToken_string& s)
if (rdoc != NULL && rdoc->get(RDOC_PROVV).not_empty())
{
output_values(*rdoc, s.get(2), cf);
output_values(*rdoc, s.get(2), cf);
}
return TRUE;
}
if (code== "_RITARDO")
{
// deve prima controllare se è stato selezionato un valore limite x il ritardo\anticipo
const TString4 tiporit = app().get_tiporit();
const long valrit = app().get_ritardo();
const TString16 id1 = s.get(1);
const TString16 id2 = s.get(2);
@ -178,9 +164,11 @@ bool TEntrFor_form::validate(TForm_item& cf, TToken_string& s)
const TDate d2 = fd2.get();
TString16 rit;
long ritardo;
if (d1.ok() && d2.ok())
{
long ritardo = d1 - d2;
ritardo = d1 - d2;
if (ritardo > 0)
rit.format("@b%ld@r",ritardo);
@ -189,9 +177,14 @@ bool TEntrFor_form::validate(TForm_item& cf, TToken_string& s)
}
else
rit = "@b???@r";
// if (app().get_dettaglio())
// {
// const bool salta = ((tiporit == "R") && (ritardo < valrit)) ||
// ((tiporit == "A") && (ritardo > -valrit));
// find_field('B',odd_page,"FORNITORI").set_height(salta ? 0 : 1);
// }
cf.set(rit); //scrive nel campo del form
return TRUE;
}
@ -201,20 +194,6 @@ bool TEntrFor_form::validate(TForm_item& cf, TToken_string& s)
//-----AUTOMASK---------------------------------------------------------------------------------//
class TEntrFor_mask : public TAutomask
{
TRelation * _rel;
TCursor * _cur;
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TEntrFor_mask();
virtual ~TEntrFor_mask(){};
};
TEntrFor_mask::TEntrFor_mask() :TAutomask ("ve7300a")
{
}
@ -230,27 +209,6 @@ bool TEntrFor_mask::on_field_event(TOperable_field& o, TField_event e, long joll
}
//-------SKELETON APPLICATION------------------------------------------------------------------------------//
class TEntrFor: public TSkeleton_application
{
TEntrFor_mask * _mask;
TEntrFor_form * _form;
protected:
virtual bool create(void);
virtual bool destroy(void);
virtual void main_loop();
void print_header();
void print_footer();
void print_line(const TString& r, const long j);
public:
void add_filter_range(TString& filtro, short id1, short id2, const char* campo) const;
void add_filter_expr(TString& filtro, short id, const char* campo, const char* cmp) const;
TEntrFor() {}
virtual ~TEntrFor() {}
};
// creazione dell'applicazione
bool TEntrFor::create()
@ -270,6 +228,19 @@ bool TEntrFor::destroy()
return TSkeleton_application::destroy();
}
//stampa dei parametri di testata
void TEntrFor::print_header()
{
_form->find_field('H', odd_page, FH_DACODART).set(_mask->get(F_DACODART));
_form->find_field('H', odd_page, FH_ACODART).set(_mask->get(F_ACODART));
_form->find_field('H', odd_page, FH_DACODFORN).set(_mask->get(F_DACODFOR));
_form->find_field('H', odd_page, FH_ACODFORN).set(_mask->get(F_ACODFOR));
_form->find_field('H', odd_page, FH_DADATA).set(_mask->get(F_DADATA));
_form->find_field('H', odd_page, FH_ADATA).set(_mask->get(F_ADATA));
_form->set_testata();
}
void TEntrFor::add_filter_expr(TString& filtro, short id, const char* campo, const char* cmp) const
{
TMask_field& f = _mask->field(id);
@ -296,6 +267,15 @@ void TEntrFor::add_filter_range(TString& filtro, short id1, short id2, const cha
add_filter_expr(filtro, id2, campo, "<=");
}
//metodo per far vedere o meno la subsection ARTICOLI in base alle lune dell'utente
void TEntrFor::set_dettaglio()
{
_dettaglio = _mask->get_bool(F_DETAIL);
_form->find_field('B',odd_page,"FORNITORI").enable(_dettaglio);
_form->find_field('B',odd_page,"FORNITORI2").enable(!_dettaglio);
}
void TEntrFor::main_loop()
{
while (_mask->run() == K_ENTER)
@ -332,6 +312,10 @@ void TEntrFor::main_loop()
lines++;
}
}
//prendo i parametri su ritardo\anticipo che passo al form
_ritant = _mask->get_long(F_RITARDO);
_tiporit = _mask->get(F_TIPORIT);
if (filtrosheet.not_empty())
{
@ -364,7 +348,11 @@ void TEntrFor::main_loop()
cursore.setfilter(filtro, TRUE);
const TRecnotype items = cursore.items();
//..e vai che si stampa!
// abilita la sezione del body con i dettagli delle righedoc
set_dettaglio();
//..e vai che si stampa!
print_header();
_form->print();
}

View File

@ -1,16 +1,77 @@
// campi form Riepilogo entrate fornitori ve7300a.frm
#define FF_CODART 1
#define FF_DESCRART 2
#define FF_CODFORN 3
#define FF_RAGSOC 4
#define FF_NUMORD 5
#define FF_DATAORD 6
#define FF_COSTO 7
#define FF_QTA 8
#define FF_DATACONS 9
#define FF_DATAENTR 10
#define FF_NUMENTR 11
#define FF_RITARDO 12
#define FF_DOCFORN 13
#define FF_DATAFORN 14
#include <applicat.h>
#include <automask.h>
#include <form.h>
//--------------FORM-----------------------
class TEntrFor_form : public TForm
{
private:
TSorted_cursor* _sc;
protected:
virtual bool validate(TForm_item& cf, TToken_string& s);
void output_values(const TRectype & rec, const char * output, TForm_item & cf);
const TRectype* find_original_rdoc(const TRectype& row) const;
public:
void set_testata() {set_header(1,TRUE);}
virtual TCursor* cursor() const { return _sc; }
TEntrFor_form();
virtual ~TEntrFor_form();
};
//-------------MASCHERA-------------------
class TEntrFor_mask : public TAutomask
{
TRelation * _rel;
TCursor * _cur;
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TEntrFor_mask();
virtual ~TEntrFor_mask(){};
};
//------------APPLICAZIONE----------------
class TEntrFor: public TSkeleton_application
{
TEntrFor_mask * _mask;
TEntrFor_form * _form;
long _ritant;
TString4 _tiporit;
bool _dettaglio;
protected:
virtual bool create(void);
virtual bool destroy(void);
virtual void main_loop();
void print_header();
void print_footer();
void print_line(const TString& r, const long j);
void set_dettaglio();
public:
void add_filter_range(TString& filtro, short id1, short id2, const char* campo) const;
void add_filter_expr(TString& filtro, short id, const char* campo, const char* cmp) const;
TString4 get_tiporit() const {return _tiporit;};
long get_ritardo() const {return _ritant;};
bool get_dettaglio() const {return _dettaglio;};
TEntrFor() : _dettaglio(TRUE), _ritant(0L) {}
virtual ~TEntrFor() {}
};
//metodo per richiamare l'applicazione principale (serve per avere il valore di un intero,
//ricavato nell'applicazione,nel form)
inline TEntrFor& app() { return (TEntrFor&) main_app(); }

View File

@ -1,4 +1,4 @@
#include "ve7300.h"
#include "ve7300a.h"
//____________________RELAZIONE_____________________________//
USE LF_RIGHEDOC KEY 3 //BY CODARTMAG CODCF DATADOC
JOIN LF_DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC
@ -22,7 +22,7 @@ END
//__________________TESTATA___________________________//
SECTION HEADER ODD 6
SECTION HEADER ODD 8
STRINGA -1
BEGIN
@ -30,107 +30,160 @@ BEGIN
PROMPT 1 1 "@bSTAMPA DI RIEPILOGO ENTRATE FORNITORI"
END
STRINGA FH_DACODART 27
BEGIN
KEY "da codart"
PROMPT 1 2 "Da art. "
PICTURE "####################"
END
STRINGA FH_ACODART 27
BEGIN
KEY "a codart"
PROMPT 1 3 "A art. "
PICTURE "####################"
END
STRINGA FH_DACODFORN 15
BEGIN
KEY "da codforn"
PROMPT 30 2 "Da forn. "
PICTURE "######"
END
STRINGA FH_ACODFORN 15
BEGIN
KEY "a codforn"
PROMPT 30 3 "A forn. "
PICTURE "######"
END
STRINGA FH_DADATA 10
BEGIN
KEY "da data"
PROMPT 60 2 "Dal "
END
STRINGA FH_ADATA 10
BEGIN
KEY "a data"
PROMPT 60 3 "Al "
END
NUMERO FH_PAGINA 3
BEGIN
KEY "Nr. pagina"
PROMPT 100 2 "Pag. "
MESSAGE _PAGENO
END
STRINGA -1
BEGIN
KEY "separatore"
PROMPT 1 2 "@b____________________________________________________________________________________________________________________________________"
PROMPT 1 4 "@b____________________________________________________________________________________________________________________________________"
END
STRINGA -1
BEGIN
KEY "codice articolo"
PROMPT 1 3 "@bCodice articolo"
PROMPT 1 5 "@bCodice articolo"
END
STRINGA -1
BEGIN
KEY "descrizione articolo"
PROMPT 25 3 "@bDescrizione articolo"
PROMPT 25 5 "@bDescrizione articolo"
END
STRINGA -1
BEGIN
KEY "descrizione produttore(cover user10)"
PROMPT 75 5 "@bProduttore"
END
STRINGA -1
BEGIN
KEY "codice fornitore"
PROMPT 5 4 "@bCod. forn."
PROMPT 5 6 "@bCod. forn."
END
STRINGA -1
BEGIN
KEY "ragione sociale fornitore"
PROMPT 29 4 "@bRagione sociale"
PROMPT 29 6 "@bRagione sociale"
END
STRINGA -1
BEGIN
KEY "data entrata"
PROMPT 10 5 "@bData entr."
PROMPT 10 7 "@bData entr."
END
STRINGA -1
BEGIN
KEY "numero entrata"
PROMPT 23 5 "@bN.entr."
PROMPT 23 7 "@bN.entr."
END
STRINGA -1
BEGIN
KEY "costo"
PROMPT 39 5 "@bCosto"
PROMPT 39 7 "@bCosto"
END
STRINGA -1
BEGIN
KEY "quantita"
PROMPT 50 5 "@bQta"
PROMPT 50 7 "@bQta"
END
STRINGA -1
BEGIN
KEY "data consegna"
PROMPT 57 5 "@bData cons."
PROMPT 57 7 "@bData cons."
END
STRINGA -1
BEGIN
KEY "data ordine"
PROMPT 69 5 "@bData ord."
PROMPT 69 7 "@bData ord."
END
STRINGA -1
BEGIN
KEY "numero entrata"
PROMPT 81 5 "@bN.ord."
PROMPT 81 7 "@bN.ord."
END
STRINGA -1
BEGIN
KEY "giorni di ritardo"
PROMPT 89 5 "@bRitardo"
PROMPT 89 7 "@bRitardo"
END
STRINGA -1
BEGIN
KEY "documento fornitore"
PROMPT 98 5 "@bDoc. forn."
PROMPT 98 7 "@bDoc. forn."
END
STRINGA -1
BEGIN
KEY "data docum. fornitore"
PROMPT 110 5 "@bData forn."
PROMPT 110 7 "@bData forn."
END
STRINGA -1
BEGIN
KEY "separatore"
PROMPT 1 6 "@b____________________________________________________________________________________________________________________________________"
PROMPT 1 8 "@b____________________________________________________________________________________________________________________________________"
END
END
//____________BODY___________________//
SECTION BODY ODD 3
SECTION BODY ODD 1
STRINGA FF_CODART 20
BEGIN
@ -146,6 +199,13 @@ BEGIN
FIELD LF_ANAMAG->DESCR
END
STRINGA FF_PRODUCER
BEGIN
KEY "produttore"
PROMPT 75 1 ""
FIELD LF_ANAMAG->USER10
END
//Raggruppamento per codice articolo (livello 1)
SECTION ARTICOLI 2 1 1 FILE LF_RIGHEDOC GROUP CODARTMAG
@ -162,6 +222,11 @@ SECTION ARTICOLI 2 1 1 FILE LF_RIGHEDOC GROUP CODARTMAG
PROMPT 29 1 ""
FIELD LF_CLIFO->RAGSOC
END
SECTION FORNITORI2 1 0 0 FILE LF_RIGHEDOC GROUP LF_DOC->CODCF
END
//Raggruppamento per codice fornitore (livello 2)
SECTION FORNITORI 2 1 1 FILE LF_RIGHEDOC GROUP LF_DOC->CODCF
@ -242,4 +307,3 @@ SECTION ARTICOLI 2 1 1 FILE LF_RIGHEDOC GROUP CODARTMAG
END //end section ARTICOLI
END

View File

@ -13,8 +13,39 @@
#define F_ADESCRFOR 118
#define F_DADATA 119
#define F_ADATA 120
#define F_DETAIL 121
#define F_TIPORIT 122
#define F_RITARDO 123
#define F_SHEETNUMS 201
// campi form Riepilogo entrate fornitori ve7300a.frm
#define FF_CODART 1
#define FF_DESCRART 2
#define FF_CODFORN 3
#define FF_RAGSOC 4
#define FF_NUMORD 5
#define FF_DATAORD 6
#define FF_COSTO 7
#define FF_QTA 8
#define FF_DATACONS 9
#define FF_DATAENTR 10
#define FF_NUMENTR 11
#define FF_RITARDO 12
#define FF_DOCFORN 13
#define FF_DATAFORN 14
#define FF_PRODUCER 15
//testata
#define FH_DACODART 20
#define FH_ACODART 21
#define FH_DACODFORN 22
#define FH_ACODFORN 23
#define FH_DADATA 24
#define FH_ADATA 25
#define FH_PAGINA 26

View File

@ -49,7 +49,7 @@ END
STRING F_ACODART 20
BEGIN
PROMPT 2 4 "All'art. "
PROMPT 2 3 "All'art. "
FLAG "U"
USE LF_ANAMAG
INPUT CODART F_ACODART
@ -61,7 +61,7 @@ END
STRING F_ADESCRART 50
BEGIN
PROMPT 2 5 "Descrizione "
PROMPT 2 4 "Descrizione "
USE LF_ANAMAG KEY 2
INPUT DESCR F_ADESCRART
COPY DISPLAY F_DADESCRART
@ -70,7 +70,7 @@ END
STRING F_DACODFOR 6
BEGIN
PROMPT 2 7 "Dal fornitore "
PROMPT 2 6 "Dal fornitore "
USE LF_CLIFO KEY 1
INPUT TIPOCF "F"
INPUT CODCF F_DACODFOR
@ -83,7 +83,7 @@ END
STRING F_DADESCRFOR 50
BEGIN
PROMPT 2 8 "Ragione sociale "
PROMPT 2 7 "Ragione sociale "
USE LF_CLIFO KEY 2
INPUT TIPOCF "F"
INPUT RAGSOC F_DADESCRFOR
@ -94,7 +94,7 @@ END
STRING F_ACODFOR 6
BEGIN
PROMPT 2 10 "Al fornitore "
PROMPT 2 8 "Al fornitore "
COPY USE F_DACODFOR
INPUT TIPOCF "F"
INPUT CODCF F_ACODFOR
@ -106,7 +106,7 @@ END
STRING F_ADESCRFOR 50
BEGIN
PROMPT 2 11 "Ragione sociale "
PROMPT 2 9 "Ragione sociale "
COPY USE F_DADESCRFOR
INPUT TIPOCF "F"
INPUT RAGSOC F_ADESCRFOR
@ -116,17 +116,42 @@ END
DATE F_DADATA
BEGIN
PROMPT 2 13 "Dalla data "
PROMPT 2 11 "Dalla data "
END
DATE F_ADATA
BEGIN
PROMPT 35 13 "Alla data "
PROMPT 35 11 "Alla data "
END
SPREADSHEET F_SHEETNUMS 75 5
BOOLEAN F_DETAIL
BEGIN
PROMPT 2 15 ""
PROMPT 2 13 "Stampa dettaglio righe"
MESSAGE FALSE CLEAR,F_TIPORIT|CLEAR,F_RITARDO
MESSAGE TRUE ENABLE,F_TIPORIT|ENABLE,F_RITARDO
END
RADIOBUTTON F_TIPORIT 1 16
BEGIN
PROMPT 30 12 ""
ITEM " |Tutti"
MESSAGE CLEAR,F_RITARDO
ITEM "R|Ritardo"
MESSAGE ENABLE,F_RITARDO
ITEM "A|Anticipo"
MESSAGE ENABLE,F_RITARDO
FLAGS "HD"
END
NUMBER F_RITARDO 4
BEGIN
PROMPT 43 14 "Giorni "
FLAGS "HD"
END
SPREADSHEET F_SHEETNUMS 75 4
BEGIN
PROMPT 2 16 ""
ITEM "Cod. Num."
ITEM "Descrizione cod. num."
END

345
ve/ve7400.cpp Executable file
View File

@ -0,0 +1,345 @@
#include <applicat.h>
#include <assoc.h>
#include <automask.h>
#include <currency.h>
#include <filetext.h>
#include <msksheet.h>
#include <printer.h>
#include <recarray.h>
#include <relation.h>
#include <sort.h>
#include "velib.h"
#include "ve7.h"
#include "ve7400a.h"
class TFilConad: public TFile_text
{
protected:
virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str);
public:
TFilConad(const TString& file_name, const TString& config_name);
virtual ~TFilConad() { }
};
TFilConad::TFilConad(const TString& file_name, const TString& config_name)
: TFile_text(file_name, config_name)
{
}
class TBolle2Conad_mask : public TAutomask
{
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TBolle2Conad_mask();
virtual ~TBolle2Conad_mask(){};
};
TBolle2Conad_mask::TBolle2Conad_mask() :TAutomask ("ve7400a")
{
}
bool TBolle2Conad_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
return TRUE;
}
class TBolle2Conad : public TSkeleton_application
{
TCursor* _cur;
TBolle2Conad_mask* _msk;
TDate _dataini, _datafin;
long _codconad;
TString80 _codforn;
TDocumento* _fattura;
TDocumento* _bolla;
TRiga_documento* _rigabolla;
TFilConad* _trasfile;
long _progressivo;
TAssoc_array* _elencobolle; // assoc array per verificare se la bolla è gia stat passata
protected:
virtual bool create(void);
virtual bool destroy(void);
virtual void main_loop() ;
void elabora_documenti();
void elabora_righe_doc();
void elabora_doc_originale(const TDocumento& documento);
public:
const TDocumento fattura() {return *_fattura;} ;
const TDocumento bolla() {return *_bolla;} ;
const TRiga_documento rigabolla() {return *_rigabolla;} ;
const long progressivo() {return _progressivo;} ;
const TString80 fornitore() { return _codforn;} ;
const long conad() { return _codconad;} ;
TBolle2Conad() {} ;
virtual ~TBolle2Conad() {} ;
};
// restituisce un riferimento all' applicazione
inline TBolle2Conad& app() { return (TBolle2Conad&) main_app();}
// gestione dei messaggi estesi nei campi
void TFilConad::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str)
{
const TString code(s.get(0));
TString valore;
if (code == "_FISSO")
{
// gestione dei campi fissi per i record delle riba
// sintassi: _FISSO,!<valore>
// dove: <valore> è la stringa fissa da emettere
TString in(s.get());
CHECK(in[0]=='!',"Macro _FISSO senza carattere '!'");
in.ltrim(1);
in.trim();
valore = in;
}
else if (code == "_PROGRESSIVO")
{
valore.format("%05d", app().progressivo());
}
else if (code == "_FORNITORE")
{
valore = app().fornitore();
}
else if (code == "_CONAD")
{
valore.format("%015d", app().conad());
}
else if (code == "_FATTURA")
{
// gestione campi da leggere dalla fattura
TString in(s.get());
if (in == "DATA")
{
TDate data = app().fattura().data();
valore = data.string(brief, '-', full, full, amg_date);
valore.strip("-");
}
else if (in == "NUMERO")
{
valore.format("%06d", app().fattura().numero());
}
}
else if (code == "_BOLLA")
{
// gestione campi da leggere dalla bolla
TString in(s.get());
if (in == "DATA")
{
TDate data = app().bolla().data();
valore = data.string(brief, '-', full, full, amg_date);
valore.strip("-");
}
}
else if (code == "_RIGABOLLA")
{
// gestione campi da leggere dalla riga bolla corrente
TString in(s.get());
if (in == "PREZZO")
{
real r = app().rigabolla().prezzo(TRUE, FALSE);
valore = r.string(9,3);
valore.strip(".");
}
else if (in == "IMPORTO")
{
real r = app().rigabolla().importo(TRUE, FALSE);
valore = r.string(9,3);
valore.strip(".");
}
else if (in == "ALIQUOTA")
{
real r = app().rigabolla().iva().percentuale();
valore = r.string(2,0,'0');
}
else if (in == "QUANTITA")
{
real r = app().rigabolla().quantita();
valore = r.string(7,2);
valore.strip(".");
}
else if (in == "OMAGGIO")
{
if (app().rigabolla().is_omaggio())
valore = "6";
else
valore = "1";
}
}
else NFCHECK("Macro non definita: %s", (const char *)code);
str = valore;
}
bool TBolle2Conad::create()
{
open_files(LF_DOC, LF_RIGHEDOC, LF_CLIFO, LF_CFVEN, LF_ANAMAG, 0);
_msk = new TBolle2Conad_mask();
_trasfile = NULL;
_elencobolle = new TAssoc_array();
return TSkeleton_application::create();
}
bool TBolle2Conad::destroy()
{
delete _elencobolle;
if (_trasfile)
delete _trasfile;
delete _msk;
return TSkeleton_application::destroy();
}
void TBolle2Conad::main_loop()
{
TConfig config("ve7400a.ini", "TRASFERIMENTO");
_codconad = config.get_long("CONAD");
_codforn = config.get("FORNITORE");
TFilename filename = config.get("NOMEFILE");
if (filename.exist())
remove(filename);
while (_msk->run()!=K_QUIT)
{
_elencobolle->destroy();
_progressivo = 0;
_trasfile = new TFilConad(filename, "filconad.ini");
_trasfile->open(filename,'w');
_trasfile->force_record_separator(TRUE);
_dataini = _msk->get_date(F_DATAINI);
_datafin = _msk->get_date(F_DATAFIN);
elabora_documenti();
_trasfile->close();
delete _trasfile;
_trasfile = NULL;
}
}
void TBolle2Conad::elabora_documenti()
{
TSheet_field& sheet = _msk->sfield(F_SHEETDOC);
TRelation doc_rel(LF_DOC);
doc_rel.add(LF_RIGHEDOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC");
TRectype da(LF_DOC);
TRectype a(LF_DOC);
const long items = sheet.items();
if (items > 0)
{
bool ok = TRUE;
TString16 codnum;
TString filt_expr;
da.put("TIPOCF", "C");
da.put("CODCF", _codconad);
da.put("PROVV", "D");
da.put("ANNO", _dataini.year());
da.put("DATADOC", _dataini);
a.put("TIPOCF", "C");
a.put("CODCF", _codconad);
a.put("PROVV", "D");
a.put("ANNO", _datafin.year());
a.put("DATADOC", _datafin);
filt_expr << "(";
FOR_EACH_SHEET_ROW(sheet, r, row)
{
codnum = row->get(0);
if (codnum.not_empty())
{
filt_expr << "(CODNUM==\"";
filt_expr << codnum << "\")||";
}
}
filt_expr.rtrim(2);
filt_expr << ")";
_cur = new TCursor(&doc_rel,filt_expr,2,&da,&a);
const long cur_items = _cur ->items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato
if (cur_items != 0)
{
_cur->freeze();
TRectype& cur_rec = _cur->curr();
for (*_cur = 0; _cur->pos() < cur_items; ++(*_cur))
elabora_righe_doc();
}
delete _cur;
}
}
void TBolle2Conad::elabora_righe_doc()
{
_fattura = new TDocumento(_cur->curr());
for (int i=1;i<=_fattura->rows();i++)
{
const TRiga_documento& riga = (*_fattura)[i];
const TString16 dacodnum = riga.get("DACODNUM");
const int daanno = riga.get_int("DAANNO");
const char daprovv = riga.get("DAPROVV")[0];
const long dandoc = riga.get_long("DANDOC");
if (dacodnum.not_empty() && daanno != 0 && daprovv != ' ' && dandoc != 0)
{
TString codicebolla = "";
codicebolla << daprovv;
codicebolla << daanno;
codicebolla << dacodnum;
codicebolla << dandoc;
if (!_elencobolle->is_key((const char*) codicebolla))
{
_elencobolle->add((const char*) codicebolla);
_bolla = new TDocumento(daprovv, daanno, dacodnum, dandoc);
elabora_doc_originale(*_bolla);
delete _bolla;
}
}
}
delete _fattura;
}
void TBolle2Conad::elabora_doc_originale(const TDocumento& documento)
{
TRelation bol_rel(LF_DOC);
bol_rel.add(LF_RIGHEDOC, "CODNUM==CODNUM|ANNO==ANNO|PROVV==PROVV|NDOC==NDOC");
bol_rel.add(LF_ANAMAG, "CODART==CODART", 1, LF_RIGHEDOC);
bol_rel.add(LF_INDSP, "TIPOCF==TIPOCF|CODCF==CODCF|CODIND==CODINDSP", 1, LF_DOC);
TRectype da(documento.head());
TCursor bol_cur(&bol_rel, "", 2, &da, &da);
bol_cur = 0;
_progressivo++;
// scrivo il record 01 testata bolla
TRecord_text rec;
rec.set_type("01");
_trasfile->autoload(rec, bol_cur);
_trasfile->write(rec);
// scrivo i record 02 righe bolla
for (int i=1;i<=documento.rows();i++)
{
_rigabolla = new TRiga_documento(documento[i]);
rec.set_type("02");
_trasfile->autoload(rec, bol_cur);
_trasfile->write(rec);
delete _rigabolla;
bol_cur.next_match(LF_RIGHEDOC);
}
}
int ve7400(int argc, char **argv)
{
TBolle2Conad a;
a.run(argc, argv, "Trasferimento bolle CONAD");
return 0;
}

10
ve/ve7400a.h Executable file
View File

@ -0,0 +1,10 @@
#define F_CODDITTA 101
#define F_RAGSOC 102
#define F_DATAINI 103
#define F_DATAFIN 104
#define F_SHEETDOC 105
// campi dello sheet
#define F_S_CODNUM 101
#define F_S_DESNUM 102
//#define F_S_TIPODOC 103
//#define F_S_DESTIPO 104

149
ve/ve7400a.uml Executable file
View File

@ -0,0 +1,149 @@
#include "ve7400a.h"
TOOLBAR "" 0 -5 0 4
STRING 30 70 50
BEGIN
FLAGS "G"
PROMPT 10 -5 "Profilo "
PSELECT
END
BUTTON DLG_OK 10 2
BEGIN
PROMPT -12 -11 ""
END
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -11 ""
END
ENDPAGE
PAGE "Trasferimento bolle CONAD" -1 -1 78 18
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 1 0 "@bDitta"
END
NUMBER F_CODDITTA 5
BEGIN
PROMPT 2 1 "Codice "
FLAGS "GDF"
USE LF_NDITTE
INPUT CODDITTA F_CODDITTA
OUTPUT F_RAGSOC RAGSOC
CHECKTYPE REQUIRED
END
STRING F_RAGSOC 50
BEGIN
PROMPT 17 1 "Rag.Soc. "
FLAGS "D"
END
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 1 3 "@bParametri"
END
DATE F_DATAINI
BEGIN
PROMPT 2 4 "Fatture dal "
HELP "Data di inizio per trasferimento documenti"
CHECKTYPE REQUIRED
WARNING "Data dal non valida"
FLAGS "A"
END
DATE F_DATAFIN
BEGIN
PROMPT 30 4 "al "
HELP "Data di fine per trasferimento documenti"
CHECKTYPE REQUIRED
VALIDATE DATE_CMP_FUNC >= F_DATAINI
WARNING "Data di fine scadenza non valida"
END
SPREADSHEET F_SHEETDOC 78 10
BEGIN
PROMPT 1 6 "Scelta documenti"
ITEM "Cod. num."
ITEM "Descrizione num.@50"
//ITEM "Tipo doc."
//ITEM "Descrizione tipo@45"
END
ENDPAGE
ENDMASK
PAGE "Scelta documenti" -1 -1 75 10
STRING F_S_CODNUM 4
BEGIN
PROMPT 2 1 "Cod. num. "
FLAGS "U"
USE %NUM
INPUT CODTAB F_S_CODNUM
DISPLAY "Cod. Num." CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_S_CODNUM CODTAB
OUTPUT F_S_DESNUM S0
CHECKTYPE REQUIRED
END
STRING F_S_DESNUM 50
BEGIN
PROMPT 20 1 ""
HELP "Descrizione numerazione"
USE %NUM KEY 2
INPUT S0 F_S_DESNUM
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_S_CODNUM
END
//STRING F_S_TIPODOC 4
//BEGIN
// PROMPT 2 2 "Tipo doc. "
// HELP "Codice tipo documento"
// USE %TIP
// INPUT CODTAB F_S_TIPODOC
// DISPLAY "Codice" CODTAB
// DISPLAY "Descrizione@50" S0
// OUTPUT F_S_TIPODOC CODTAB
// OUTPUT F_S_DESTIPO S0
// CHECKTYPE REQUIRED
// FLAG "UP"
//END
//STRING F_S_DESTIPO 50
//BEGIN
// PROMPT 20 2 ""
// HELP "Descrizione tipo documento"
// USE %TIP KEY 2
// INPUT S0 F_S_DESTIPO
// DISPLAY "Descrizione@50" S0
// DISPLAY "Codice" CODTAB
// COPY OUTPUT F_S_TIPODOC
//END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_DELREC 9 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_CANCEL 9 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -91,8 +91,12 @@ TRiepilogo_iva& TRiepilogo_iva::copy(const TRiepilogo_iva& a)
(TRectype &) _codiva = (TRectype &) a._codiva;
_imp = a._imp;
_imp_spese = a._imp_spese;
_imp_spese_row = a._imp_spese_row;
_iva = a._iva;
_iva_spese = a._iva_spese;
_sconto_perc = a._sconto_perc;
_sconto_imp = a._sconto_imp;
_iva_sconto = a._iva_sconto;
_tipo = a._tipo;
return *this;
}

View File

@ -1904,7 +1904,7 @@ error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec)
// Aggiorna le righe di sconto (importo o a percentuale)
error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc)
{
TAssoc_array& aa = doc.tabella_iva();
TAssoc_array aa(doc.tabella_iva()); // no reference
TRiepilogo_iva * riep;
TString16 cod; // Codice IVA corrente
real sconto;
@ -1930,7 +1930,7 @@ error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc)
TBill& conto = perc ? _sco_perc_bill : _sco_imp_bill;
sconto = perc ? -riep->sconto_perc() : -riep->sconto_imp();
if (sconto != ZERO)
{
{
TRiga_documento r(&doc, "07"); // il tipo riga 02 spese a valore
r.put(RDOC_QTA, "1.00");
r.put(RDOC_PREZZO, sconto);