diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 5a292acdd..0675f0171 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -10,6 +10,10 @@ #include #include #include +#include + +#include "righedoc.h" +#include "tclifor.h" #include "ve1100.h" #include "ve0100b.h" @@ -23,17 +27,44 @@ class TDocVen_Form: public TForm { TRelation &_firmrel; // relazione di gestione dei dati della ditta corrente TString _module; // codice del modulo di carta associato a questo al form + TPiede_documento *_total_prog; // oggetto per i totalizzatori progressivi + TRiga *_riga; // oggetto per la gestione della singola riga del documento + TCliFor *_cliente; // oggetto per le informazioni sul cliente + bool _cli_loaded; // flag che indica se l'oggetto cliente è già stato caricato protected: virtual void extended_parse_general(TScanner &); // gestione dei parametri estesi nella sezione general virtual bool validate(TForm_item &, TToken_string &); // gestione dei messaggi estesi nei campi + virtual word set_body(word p, bool u); // derivata per la gestione del totalizzatore public: const TString &get_module_code() { return _module; } // ritorna il codice del modulo di carta TDocVen_Form(const char *, TRelation &); + virtual ~TDocVen_Form(); }; -TDocVen_Form::TDocVen_Form(const char* name, TRelation &rel): TForm(name), _firmrel(rel) {} +TDocVen_Form::TDocVen_Form(const char* name, TRelation &rel): TForm(name), _firmrel(rel) { + _total_prog= new TPiede_documento; + _riga= new TRiga; + _cliente= new TCliFor; + _cli_loaded= FALSE; +} + +TDocVen_Form::~TDocVen_Form() { + delete _total_prog; + delete _riga; + delete _cliente; +} + +word TDocVen_Form::set_body(word p, bool u) { + if (u) { // se si sta effettivamente generando il body viene fatto anche il calcolo del totalizzatore + TLocalisamfile &rdoc= (cursor())->file(LF_RIGHEDOC); + TRectype &recriga= rdoc.curr(); + _riga->load(rdoc.curr()); + _riga->somma(*_total_prog); + } + return TForm::set_body(p, u); +} void TDocVen_Form::extended_parse_general(TScanner &scanner) { if (scanner.popkey() == "MO") _module = scanner.string(); // se viene riconosciuto il token per l'impostazione del modulo legge il codice... @@ -128,7 +159,7 @@ bool TDocVen_Form::validate(TForm_item &cf, TToken_string &s) { TTable tab(s.get()); // prende il nome della tabella tab.zero(); // vuota il record corrente della tabella TString in(s.get()); // prende il valore o il campo da usare come codice di ricerca - if (in.left(1)== '#') { + if (in[0]== '#') { in.ltrim(1); TForm_item &fi= cf.find_field(in); in= fi.get(); @@ -140,6 +171,33 @@ bool TDocVen_Form::validate(TForm_item &cf, TToken_string &s) { } return (TRUE); } // fine _TABLEREAD + + if (code== "_ALIGN") { + // allineamento della posizione di un campo rispetto ad un altro + // sintassi: _ALIGN,,[,] + // dove: è il campo della form (preceduto da '#') da cui prendere l'allineamento + // è uno dei seguenti valori: + // TOP allinea sulla riga d'inizio + // MIDDLE allinea al centro (effettivo) + // BOTTOM allinea sulla riga di fine (effettiva, non preimpostata) + // è uno dei seguenti valori: + // LEFT allinea sulla colonna d'inizio + // RIGHT allinea sulla colonna di fine + TString in(s.get()), alver(s.get()); + if (in[0]== '#') in.ltrim(1); + TForm_item &fi= cf.find_field(in); + if (alver[0]=='!') alver.ltrim(1); + if (alver== "TOP") cf.y()= fi.y(); + if (alver== "MIDDLE") cf.y()= fi.y()+ fi.effective_height()/2; + if (alver== "BOTTOM") cf.y()= fi.y()+ fi.effective_height()-1; + if (s.items()==4) { + TString alor(s.get()); + if (alor[0]=='!') alor.ltrim(1); + if (alor== "LEFT") cf.x()= fi.x(); + if (alor== "RIGHT") cf.x()= fi.x()+ fi.width(); + } + return (TRUE); + } // fine _ALIGN if (code== "_DITTA") { // lettura dei dati della ditta @@ -151,11 +209,12 @@ bool TDocVen_Form::validate(TForm_item &cf, TToken_string &s) { // !NUM numero civico (fiscale se c'è, oppure di residenza) // !CAP CAP (fiscale se c'è, oppure di residenza) // !COM comune (fiscale se c'è, oppure di residenza) + // !PROV provincia (fiscale se c'è, oppure di residenza) // !IVA partita iva // !CF codice fiscale // !TEL numero di telefono (con prefisso) // !FAX numero di fax (con prefisso) - // nota: la relazione di della ditta è così strutturata: + // nota: la relazione della ditta è così strutturata: // %NDITTE (9) Dati ditte // + %ANAGR (6) Anagrafica generale (indirizzo, ecc.) // + %COMUNI (113@) Comune di residenza @@ -181,6 +240,10 @@ bool TDocVen_Form::validate(TForm_item &cf, TToken_string &s) { if (_fisc) cf.set(_firmrel.lfile(-213).get("DENCOM")); else cf.set(_firmrel.lfile(-113).get("DENCOM")); } + if (in=="PROV") { + if (_fisc) cf.set(_firmrel.lfile(-213).get("PROVCOM")); + else cf.set(_firmrel.lfile(-113).get("PROVCOM")); + } if (in=="IVA") cf.set(_firmrel.lfile(6).get("PAIV")); if (in=="CF") cf.set(_firmrel.lfile(6).get("COFI")); if (in=="TEL") { @@ -216,7 +279,169 @@ bool TDocVen_Form::validate(TForm_item &cf, TToken_string &s) { cf.set(n.string("LETTERE")); return (TRUE); } // fine _CIFRELETTERE - + + if (code.left(6) == "_TOTAL") { + // totalizzatori di testata/coda, riga e progressione + // sintassi: _TOTAL_{CODA|RIGA|PROGRES},[,] + // dove: è il codice del totalizzatore richiesto + // è il campo della form che riceve il valore del totalizzatore, se non è specificato è scritto nel campo corrente + static real zero("0.0"); // 0 sotto forma di real per i casi in cui il totalizzatore non viene trovato + TString tot= s.get(); // prende il codice del totalizzatore richiesto + TForm_item *fi; // puntatore al campo della form in cui scrivere il valore del totalizzatore + if (s.items()==2) { + TString c= s.get(); // prende il codice del campo della form + if (c[0]== '#') c.ltrim(1); + fi= &(cf.find_field(c)); // prende il puntatore al campo specificato + } else fi= &cf; // prende il puntatore al campo corrente + if (code.mid(6) == "_CODA") { + TLocalisamfile &doc= (cursor())->file(LF_DOC); + TToken_string totcoda(doc.get("G1")); // prende il campo memo con i totalizzatori sotto forma di token string + int pos= totcoda.get_pos(tot); // cerca il totalizzatore richiesto, il suo valore è nel token successivo + if (pos>=0) fi->set(totcoda.get(pos+1)); // setta il campo della form + else fi->set(zero.string()); + } + if (code.mid(6) == "_RIGA") { + TLocalisamfile &rdoc= (cursor())->file(LF_RIGHEDOC); + TToken_string totriga(rdoc.get("G1")); // prende il campo memo con i totalizzatori sotto forma di token string + int pos= totriga.get_pos(tot); // cerca il totalizzatore richiesto, il suo valore è nel token successivo + if (pos>=0) fi->set(totriga.get(pos+1)); // setta il campo della form + else fi->set(zero.string()); + } + if (code.mid(6) == "_PROGRES") { + TString16 tot16(tot); + fi->set(_total_prog->get(tot16).string()); + } + return (TRUE); + } // fine _TOTAL_xxx + + if (code== "_CLIENTE") { + // lettura dei dati del cliente + // sintassi: _CLIENTE,{|} + // dove: è un riferimento alla relazione di gestione dei dati del cliente + // è uno delle macro seguenti: + // !RAGSOC ragione sociale + // !IND indirizzo + // !NUM numero civico + // !LOC località + // !CAP CAP + // !COM comune + // !PROV provincia + // !IVA partita iva + // !CF codice fiscale + // !PERS se persona fisica, se giuridica + // !DATANAS data di nascita + // !COMNAS comune di nascita + // !TEL primo numero di telefono (con prefisso) + // !TEL2 secondo numero di telefono (con prefisso) + // !TEL3 terzo numero di telefono (con prefisso) + // !FAX numero di fax (con prefisso) + // nota: la relazione del cliente è così strutturata: + // CLIFO (20) Clienti/fornitori + // + CFVEN (17) Clienti/fornitori per vendite + // + %COMUNI (113@) Comune di residenza + // + %COMUNI (213@) Comune di nascita + TLocalisamfile &doc= (cursor())->file(LF_DOC); + TString16 tipocf= doc.get("TIPOCF"), codcf= doc.get("CODCF"), ocfpi= doc.get("OCFPI"); + if (!_cli_loaded ) { // il cliente è sulla testata del documento di vendita, quindi può essere caricato una volta sola per tutte + _cliente->load(tipocf[0], atol(codcf), ocfpi); + _cliente->add(LF_COMUNI, "COM=STATOCF+COMCF", 1, LF_CLIFO, 100+LF_COMUNI); + _cliente->add(LF_COMUNI, "COM=STATONASC+COMNASC", 1, LF_CLIFO, 200+LF_COMUNI); + _cli_loaded= TRUE; + } + TString in(s.get()); // prende la macro o il fieldref + if (in[0]=='!') { + in.ltrim(1); + if (in=="RAGSOC") cf.set(_cliente->get(LF_CLIFO, "RAGSOC")); + if (in=="IND") cf.set(_cliente->get(LF_CLIFO, "INDCF")); + if (in=="NUM") cf.set(_cliente->get(LF_CLIFO, "CIVCF")); + if (in=="LOC") cf.set(_cliente->get(LF_CLIFO, "LOCALITACF")); + if (in=="CAP") cf.set(_cliente->get(LF_CLIFO, "CAPCF")); + if (in=="COM") cf.set(_cliente->get(-(100+LF_COMUNI), "DENCOM")); + if (in=="PROV") cf.set(_cliente->get(-(100+LF_COMUNI), "PROVCOM")); + if (in=="IVA") cf.set(_cliente->get(LF_CLIFO, "PAIV")); + if (in=="CF") cf.set(_cliente->get(LF_CLIFO, "COFI")); + if (in=="PERS") cf.set(_cliente->get(LF_CLIFO, "TIPOPERS")); + if (in=="DATANAS") cf.set(_cliente->get(LF_CLIFO, "DATANASC")); + if (in=="COMNAS") cf.set(_cliente->get(-(200+LF_COMUNI), "DENCOM")); + if (in=="TEL") { + TString tel(_cliente->get(LF_CLIFO, "PTEL")); + tel << "/" << _cliente->get(LF_CLIFO, "TEL"); + cf.set(tel); + } + if (in=="TEL2") { + TString tel2(_cliente->get(LF_CLIFO, "PTEL2")); + tel2 << "/" << _cliente->get(LF_CLIFO, "TEL2"); + cf.set(tel2); + } + if (in=="TEL3") { + TString tel3(_cliente->get(LF_CLIFO, "PTEL3")); + tel3 << "/" << _cliente->get(LF_CLIFO, "TEL3"); + cf.set(tel3); + } + if (in=="FAX") { + TString fax(_cliente->get(LF_CLIFO, "PFAX")); + fax << "/" << _cliente->get(LF_CLIFO, "FAX"); + cf.set(fax); + } + } else { + TFieldref fref(s.get(), 0); + cf.set(fref.read((TRelation *)_cliente)); // l'oggetto cliente è figlio della TRelation, quindi lo passo al fieldref semplicemente con un typecast + } + return (TRUE); + } // fine _CLIENTE + + if (code== "_RIEPILOGOIVA") { + // tabella riepilogo aliquote iva e relative imposte + // sintassi: _RIEPILOGOIVA, + // dove: è uno dei seguenti: + // !IMPONIB colonna degli imponibili + // !ALIQ colonna delle aliquote + // !IMPOSTE colonna delle imposte + // !DESCR colonna delle descrizioni + TString in= s.get(); // prende l'indicatore della colonna da creare + TLocalisamfile &doc= (cursor())->file(LF_DOC); + TToken_string totaliz(doc.get("G1")); // prende il campo memo con i totalizzatori sotto forma di token string + if (in[0]=='!') { + in.ltrim(1); + int w= cf.width(), num= totaliz.items(); + TString out, curr, tot; + for (int i=0; iadd(LF_ANAG, "TIPOA=TIPOA|CODANAGR=CODANAGR"); - _firmrel->add(LF_COMUNI, "COM=COMRES", 1, LF_ANAG, 100+LF_COMUNI); - _firmrel->add(LF_COMUNI, "COM=COMRF", 1, LF_ANAG, 200+LF_COMUNI); + _firmrel->add(LF_COMUNI, "COM=STATORES+COMRES", 1, LF_ANAG, 100+LF_COMUNI); + _firmrel->add(LF_COMUNI, "COM=STATORES+COMRF", 1, LF_ANAG, 200+LF_COMUNI); if (argc()>2) { // lettura dei parametri iniziali dalla linea di comando _codnum= argv(2); // il primo parametro è il codice di numerazione _anno= atoi(argv(3)); // il secondo è l'anno @@ -351,7 +576,7 @@ void TStampa_Doc_Vendita::print() { if (whattodo==cancel) break; // se non si può procedere la stampa viene interrotta else if (whattodo==go) { // altrimenti prosegue TCursor &fcur= *(f.cursor()); // ricava il riferimento al cursore originale del form - TLocalisamfile &rdoc= fcur.file(); // ricava il riferimento al file principale del cursore del form + TLocalisamfile &rdoc= fcur.file(LF_RIGHEDOC); // ricava il riferimento al file principale del cursore del form TRectype darec_r(rdoc.curr()); // istanzia il record di filtro per il cursore darec_r.zero(); // vuota il record darec_r.put("CODNUM", _codnum); // compone la chiave parziale per il filtro sul cursore dal file principale del cursore di selezione dei documenti