diff --git a/ve/bollac.src b/ve/bollac.src index c4f18fc51..2e11734ac 100755 --- a/ve/bollac.src +++ b/ve/bollac.src @@ -187,7 +187,8 @@ DESCRMAG1 = S_NASCOSTO //2900 CAUSMAG2 = S_NASCOSTO //2900 DESCRMAG2 = S_NASCOSTO //2900 BLANK = S_DISABILITATO //4000 -//NOTECLI = S_NORMALE //2500 +CODNOTE = S_NORMALE //2500 +NOTECLI = S_NORMALE //2500 [DEFAULT] diff --git a/ve/f33.trr b/ve/f33.trr index 701c4a9cd..b8763c914 100755 --- a/ve/f33.trr +++ b/ve/f33.trr @@ -1,5 +1,5 @@ 33 -67 +68 CODNUM|1|4|0|Codice della numerazione ANNO|2|4|0|Anno/Esercizio PROVV|1|1|0|Tipo numerazione

rovvisorio efinitivo @@ -63,6 +63,7 @@ PNETTO|4|15|2|Peso netto NCOLLI|3|7|0|Numero di colli CAUSMAG1|1|3|0|Causale di magazzino 1 CAUSMAG2|1|3|0|Causale di magazzino 2 +CODNOTE|1|2|0|Codice note cliente NOTE|11|10|0|Note G1|11|10|0|Campo generale 1 DATAAGG|5|8|0|Data ultimo aggiornamento diff --git a/ve/sconti.cpp b/ve/sconti.cpp index 147f19439..58e4e40ec 100755 --- a/ve/sconti.cpp +++ b/ve/sconti.cpp @@ -305,11 +305,12 @@ bool TCond_vendita::cerca( int tiporicerca ) return FALSE; } -// Probabilmente dovrebbe lavorare sulla maschera, ma per ora la lasciamo cosl void TCond_vendita::ricerca(bool load_um_only, bool load_scagl_only) { TString codart = anamag().get( "CODART" ); const TString codriga = riga().get( FR_CODART ); + + _ivarid = _clifo->get_bool(LF_CFVEN, "IVARID"); _load_mask = !load_um_only && !load_scagl_only; if(anamag().bad() || codriga != codart ) diff --git a/ve/sconti.h b/ve/sconti.h index 929259704..29c433596 100755 --- a/ve/sconti.h +++ b/ve/sconti.h @@ -43,7 +43,6 @@ protected: void set_provv(const real & provv); void set_iva(const TString & codiva); - TCliFor & clifo() const { CHECK(_clifo, "Cliente/fornitore non inizializzato"); return * _clifo; } TConfig & config_ditta() const { CHECK(_config_ditta, "Configurazione ditta non inizializzata"); return * _config_ditta; } TMask & testa() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _testa; } TMask & riga() const { CHECK(_testa, "Maschera testata non inizializzata"); return * _riga; } @@ -51,6 +50,7 @@ protected: TLocalisamfile & umart() const { CHECK(_umart, "Anagrafica di unita' di misura magazzino non inizializzata") ; return *_umart; } public: + TCliFor & clifo() const { CHECK(_clifo, "Cliente/fornitore non inizializzato"); return * _clifo; } bool set_sconto( const char * exp, bool signal = FALSE ); const TString& get_sconto() const { return _sconto; } real sconto_val() const { return _molt_sconto;} diff --git a/ve/tclifor.cpp b/ve/tclifor.cpp index 9c291cd89..2a7d8bc1c 100755 --- a/ve/tclifor.cpp +++ b/ve/tclifor.cpp @@ -140,6 +140,7 @@ void TCliForVendite::update_mask( TMask& m, bool onload ) set( m, F_CODPORTO, LF_CFVEN, "CODPORTO" ); set( m, F_CODNOTESP1, LF_CFVEN, "CODNOTESP1" ); set( m, F_CODNOTESP2, LF_CFVEN, "CODNOTESP2" ); + set( m, F_CODNOTE, LF_CFVEN, "CODNOTE" ); set( m, F_CODVETT1, LF_CFVEN, "CODVETT1" ); set( m, F_CODVETT2, LF_CFVEN, "CODVETT2" ); set( m, F_CODVETT3, LF_CFVEN, "CODVETT3" ); @@ -214,11 +215,18 @@ void TCliForVendite::update_mask( TMask& m, bool onload ) m.check_field( F_CODPORTO ); m.check_field( F_CODNOTESP1 ); m.check_field( F_CODNOTESP2 ); + m.check_field( F_CODNOTE ); m.check_field( F_CODVETT1 ); m.check_field( F_CODVETT2 ); m.check_field( F_CODVETT3 ); m.check_field( F_CATVEN ); - m.check_field( F_CODZON ); + m.check_field( F_CODZON ); + const bool gescontr = app().config_ditta().get_bool("GES", "ve", 2); + const bool contr_enabled = get_bool(LF_CFVEN, "GESTCONTR"); + + m.enable(F_CODCONT1, contr_enabled && gescontr); + m.enable(F_CODCONT, contr_enabled && gescontr); + // imposta_dati_comune( m ); imposta_indirizzo_spedizione( m ); imposta_sconto_testa( m ); @@ -355,7 +363,7 @@ void TCliForVendite::imposta_sconto_testa( TMask& m ) void TCliForVendite::imposta_valuta( TMask& m ) { - TConfig ditta( CONFIG_DITTA ); + TConfig & ditta = app().config_ditta(); if( ditta.get_bool( "GESVALAC", "ve" ) ) { diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index bfae498c6..8c2cfb03a 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -133,8 +133,12 @@ bool TMotore_application::ss_handler( TSheet_field& ss, int r, KEY key ) { TMask & emask = app().edit_mask(); TRiga_documento & riga = app()._doc->insert_row(r + 1, emask.get( F_LBTIPORIGA )); + + TString16 s(app()._clifor->get(LF_CFVEN, "CODMAG")); - riga.autoload(ss); + s << app()._clifor->get(LF_CFVEN, "CODDEP"); + riga.put("CODMAG", s); + riga.autoload(ss); } else if (key == K_CTRL + K_INS) @@ -392,6 +396,7 @@ TMask* TMotore_application::get_mask( int mode ) msk1->set_handler( F_CODCF, clifo_handler ); msk1->set_handler( F_CODPAG, condpag_hndl ); msk1->set_handler( F_DATAINSC, condpag_hndl ); + msk1->set_handler( F_CODNOTE, note_hndl ); // _msk1->set_handler( 99, elabora_handler ); int numhandler = pro( ).get_int( "NHANDLER", "HANDLERS" ); // prof for ( i = 1; i <= numhandler; i ++ ) @@ -451,9 +456,10 @@ TMask* TMotore_application::get_mask( int mode ) const bool gescontrcli = _config_ditta->get_bool("GESCONCC"); if (gescontr) - { + { + + msk1->show(F_CODCONT1, gescontrcli); msk1->show(F_CODCONT, !gescontrcli); - msk1->show(F_CODCONT1, gescontrcli); } else { @@ -640,19 +646,6 @@ bool TMotore_application::user_create( ) { _config_ditta = new TConfig(CONFIG_DITTA); - // Controllo se sono cambiate le impostazioni delle vendite. - if (_config_ditta->get_bool( "CHANGED", "ve" )) - { // Se sono cambiate, rigenero tutte le maschere - if (yesno_box( CHANGE_MESSAGE ) ) - { - TExternal_app generazione( "ve0 -3 -all" ); - - generazione.run(); - } - else - message_box("Attenzione i profili dei documenti potrebbero\n non essere aggiornati"); - } - // Metto in relazione testata e righe _rel = new TRelation( LF_DOC ); open_files(LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_TAB, LF_TABCOM, 0); diff --git a/ve/ve0200a.uml b/ve/ve0200a.uml index 278299d79..1706bd252 100755 --- a/ve/ve0200a.uml +++ b/ve/ve0200a.uml @@ -221,6 +221,19 @@ PROMPT 2 13 "Gestione archivio sconti unita' di misura " FIELD GESSCOUM END +STRING F_SCOTRIGA 4 +BEGIN +PROMPT 2 14 "Tipo riga per gli sconti di testa " +FLAGS "U" +USE %TRI SELECT S7=="C" +FIELD SCOTRIGA +INPUT CODTAB F_SCOTRIGA +DISPLAY "Codice" CODTAB +DISPLAY "Descrizione@50" S0 +OUTPUT F_SCOTRIGA CODTAB +CHECKTYPE REQUIRED +END + ENDPAGE ENDMASK diff --git a/ve/ve0300a.src b/ve/ve0300a.src index d391e220e..5f5b23a95 100755 --- a/ve/ve0300a.src +++ b/ve/ve0300a.src @@ -1213,21 +1213,30 @@ OUTPUT=F_CODVETT3 CODTAB~F_NOMEVETT3 S0 WARNING=Codice primo vettore non trovato HELP=Inserisci il codice del primo (o unico) vettore -[NOTECLI] +[CODNOTE] GROUP=2500 X=2 Y=1 +FIELDNAME=CODNOTE +MSKID=F_CODNOTE +TYPE=T_STRINGA +PROMPT="Cod.Note " +SIZE=2 +USE=%NOT +INPUT=CODTAB F_CODNOTE +DISPLAY="Codice" CODTAB~"Descrizione@50" S0 +OUTPUT=F_CODNOTE CODTAB~F_NOTECLI S0 +WARNING=Note clienti assenti + +[NOTECLI] +GROUP=2500 +X=2 +Y=2 FIELDNAME=NOTE MSKID=F_NOTECLI TYPE=T_MEMO -PROMPT="" +PROMPT=" " SIZE=50 -USE=%NOT KEY 2 -INPUT=S0 F_NOTECLI -DISPLAY="Descrizione@50" S0~"Codice" CODTAB -OUTPUT=F_NOTECLI S0 -WARNING= -HELP= [NCOPIE] GROUP=1600 diff --git a/ve/veconf.h b/ve/veconf.h index 5ea5d0587..71e74d329 100755 --- a/ve/veconf.h +++ b/ve/veconf.h @@ -33,6 +33,7 @@ #define F_GESSCOSCA 128 #define F_GESSCOUM 129 +#define F_SCOTRIGA 130 // Campi per ve0200b.uml #define F_GESAGE 101 diff --git a/ve/velib01.cpp b/ve/velib01.cpp index 07c360fbd..cc27765ac 100755 --- a/ve/velib01.cpp +++ b/ve/velib01.cpp @@ -41,6 +41,11 @@ #include "veini.h" #endif +#ifndef __DEFMASK_H +#include +#endif + + #ifndef __PAGAMENT_H #include "..\cg\pagament.h" #endif @@ -158,6 +163,31 @@ bool condpag_hndl( TMask_field& field, KEY key ) return TRUE; } +bool note_hndl( TMask_field& f, KEY key ) +{ + TDocumento_mask & m = (TDocumento_mask &) f.mask(); + + if (key == K_TAB && (f.focusdirty() || !m.is_running())) + { + TTable & note = (TTable &) ((TEdit_field &) f).browse()->cursor()->file(); + const TString16 cod(f.get()); + + if (cod != note.get("CODTAB")) + { + note.zero(); + note.put("CODTAB", cod); + if (note.read() != NOERR) + note.zero(); + } + const bool reg_disabled = note.get_bool("B0"); + + if (reg_disabled) + message_box("Registrazione disbilitata : %s", (const char *) note.get("S0")); + m.enable(DLG_SAVEREC, !reg_disabled); + } + return TRUE; +} + // handler delle righe HIDDEN void row_set_handler( TMask& m, const int field, const int index ) @@ -172,9 +202,22 @@ HIDDEN void row_set_handler( TMask& m, const int field, const int index ) } } -HIDDEN TString16 curr_um; +HIDDEN TString16 curr_um; HIDDEN real curr_fc(1.0); - + +HIDDEN bool iva_handler( TMask_field& f, KEY key ) +{ + if (key == 0 || key == K_ENTER) + { + TDocumento_mask & mask = (TDocumento_mask &) f.mask().get_sheet()->mask(); + const TString16 codiva = mask.condv().clifo().get(LF_CFVEN, "ASSFIS"); + + if (codiva.not_empty()) + f.set(codiva); + } + return TRUE; +} + HIDDEN bool codart_handler( TMask_field& f, KEY key ) { // Se qualcuno cerca di modificare la maschera @@ -246,6 +289,10 @@ HIDDEN bool codart_handler( TMask_field& f, KEY key ) } condv.ricerca(); + const int pos = row_mask.id2pos(FR_CODIVA); + + if (pos >= 0) + iva_handler(row_mask.fld(pos), 0); } return TRUE; } @@ -366,7 +413,10 @@ HIDDEN bool sppr_handler( TMask_field& f, KEY key ) } prezzo /= mask.get_real(F_CAMBIO); } - row_mask.set(FR_PREZZO, prezzo); + row_mask.set(FR_PREZZO, prezzo); + const int pos =row_mask.id2pos(FR_CODIVA); + if (pos >= 0) + iva_handler(row_mask.fld(pos), 0); } } } @@ -1186,6 +1236,11 @@ TVariable_mask * TTipo_riga_documento::mask() } } } + const int posiva = _mask->id2pos(FR_CODIVA); + + if (posiva >= 0) + _mask->set_handler( FR_CODIVA, iva_handler ); + return _mask; } @@ -1682,7 +1737,7 @@ TAssoc_array TDocumento::_tipi; TDocumento::TDocumento() : TAuto_variable_rectype(LF_DOC), _rows(LF_RIGHEDOC, "NRIGA"), _nuovo(TRUE), - _condv(NULL), _rel(NULL) + _condv(NULL), _rel(NULL), _sconto(NULL) { set_memo_fld("G1"); } @@ -1690,7 +1745,7 @@ TDocumento::TDocumento() TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc, TCond_vendita * condv, TRelation * rel) : TAuto_variable_rectype(LF_DOC), _rows(LF_RIGHEDOC, "NRIGA"), _nuovo(TRUE), - _condv(condv), _rel(rel) + _condv(condv), _rel(rel), _sconto(NULL) { set_memo_fld("G1"); if (numdoc <= 0) @@ -1700,7 +1755,7 @@ TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc, TRiga_documento* key = new TRiga_documento(this); set_key(*key, provv, anno, codnum, numdoc); - _rows.set_key(key); + _rows.set_key(key); // ok } else read(provv, anno, codnum, numdoc); @@ -1747,17 +1802,17 @@ TDocumento::TDocumento(const TRectype& rec, TCond_vendita * condv, TRelation * r TRiga_documento& TDocumento::insert_row(int row, const char *tipo) { - TRiga_documento * r = new TRiga_documento((const TRiga_documento &) _rows.key(), this); + TRiga_documento * r = new TRiga_documento((const TRiga_documento &) _rows.key(), this); // ok r->set_numero(row); if (tipo) r->set_tipo(tipo); - _rows.insert_row(r); + _rows.insert_row(r); // ok return *r; } TRiga_documento& TDocumento::new_row(const char *tipo) { - TRiga_documento & r = (TRiga_documento&)_rows.row(-1, TRUE); + TRiga_documento & r = (TRiga_documento&)_rows.row(-1, TRUE); // ok if (tipo) r.set_tipo(tipo); return r; @@ -1779,15 +1834,16 @@ int TDocumento::read(const TRectype& rec) if (err == NOERR) { _nuovo = FALSE; - _rows.read(key); + _rows.read(key); //ok } else { _nuovo = TRUE; head() = rec; destroy_rows(); - _rows.set_key(key); + _rows.set_key(key); // ok } + set_riga_sconto(); return err; } @@ -1810,10 +1866,42 @@ long TDocumento::renum(long numdoc) } char num[16]; sprintf(num, "%ld", numdoc); renum_key("NDOC", num); // Aggiorna testata - _rows.renum_key("NDOC", num); // Aggiorna righe + _rows.renum_key("NDOC", num); // Aggiorna righe ok return numdoc; } +void TDocumento::set_riga_sconto() +{ + const TString80 sconto(get("SCONTOPERC")); + + if (sconto.empty()) + { + if(_sconto != NULL) + delete _sconto; + _sconto = NULL; + } + else + { + if (_sconto == NULL) + { + static TString _tipo_riga; + static long firm = -1; + long new_firm = main_app().get_firm(); + + if (firm != new_firm) + { + TConfig conf(CONFIG_DITTA); + + _tipo_riga = conf.get("SCOTRIGA", "ve"); + firm = new_firm; + } + _sconto = new TRiga_documento(this, _tipo_riga); + _sconto->put("DESCR","Sconto"); + } + _sconto->put("SCONTO", sconto); + } +} + void TDocumento::dirty_fields() { for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field(); @@ -1821,7 +1909,7 @@ void TDocumento::dirty_fields() f->set_dirty(); for (int i = rows(); i > 0; i--) { - TRiga_documento & r = (TRiga_documento &) _rows.row(i, FALSE); + TRiga_documento & r = (TRiga_documento &) row(i); if (r.doc_dependent()) r.dirty_fields(FALSE); @@ -1889,6 +1977,18 @@ const bool TDocumento::in_valuta() const return (val.not_empty() && val != "LIT"); } +TRiga_documento & TDocumento::row(int index) +{ + const int nrows = _rows.rows(); + if (index <= nrows) + return (TRiga_documento &) _rows.row(index, FALSE); + else + { + CHECKD(index == nrows + 1 &&_sconto != NULL, "Riga documento non esistente ", index); + return *_sconto; + } +} + long TDocumento::get_next_key(char provv, int anno, const char* codnum) const { static long n = 0; @@ -2076,7 +2176,9 @@ void TDocumento::put_str(const char* fieldname, const char* val) else { TAuto_variable_rectype::put_str(fieldname, val); - dirty_fields(); + dirty_fields(); + if (strcmp(fieldname, "SCONTOPERC") == 0) + set_riga_sconto(); } } diff --git a/ve/velib01.h b/ve/velib01.h index 64a771d4c..e1acbedd2 100755 --- a/ve/velib01.h +++ b/ve/velib01.h @@ -37,6 +37,7 @@ bool ora_hndl(TMask_field& field, KEY key); bool codcli_hndl(TMask_field& field, KEY key); bool dummy_hndl(TMask_field& field, KEY key); bool condpag_hndl(TMask_field& field, KEY key); +bool note_hndl(TMask_field& field, KEY key); class TDocumento_variable_field : public TVariable_field { @@ -314,12 +315,14 @@ class TDocumento : public TAuto_variable_rectype TRelation * _rel; TCond_vendita * _condv; TPagamento _pag; + TRiga_documento * _sconto; // Riga per lo sconto di testata protected: - TAuto_variable_rectype & row(int index) { return (TAuto_variable_rectype &) _rows.row(index, FALSE); } + TRiga_documento & row(int index); long get_next_key(char provv, int anno, const char* codnum) const; virtual void put_str(const char* fieldname, const char* val); - long renum(long numdoc = 0); + long renum(long numdoc = 0); + void set_riga_sconto(); public: void dirty_fields(); @@ -336,9 +339,9 @@ public: virtual void zero(const char * fieldname); virtual void zero(char c = '\0'); - int rows() const { return _rows.rows(); } - const TRiga_documento& operator[](int index) const { return (const TRiga_documento&)_rows.row(index); } - TRiga_documento& operator[](int index) { return (TRiga_documento&)_rows.row(index, FALSE); } + int rows() const { return _rows.rows() + ((_sconto != NULL) ? 1 : 0); } + const TRiga_documento& operator[](int index) const { return (const TRiga_documento&)((TDocumento *)this)->row(index); } + TRiga_documento& operator[](int index) { return (TRiga_documento&)row(index); } TRiga_documento& insert_row(int row, const char *tipo = NULL); TRiga_documento& new_row(const char *tipo = NULL); @@ -394,7 +397,7 @@ public: TCond_vendita * condv = NULL, TRelation * rel = NULL); TDocumento(const TRectype& doc, TCond_vendita * condv = NULL, TRelation * rel = NULL); - virtual ~TDocumento() { } + virtual ~TDocumento() { if (_sconto != NULL) delete _sconto;} }; class TDocumento_mask : public TVariable_mask diff --git a/ve/veuml.h b/ve/veuml.h index 5443f734a..bda26b726 100755 --- a/ve/veuml.h +++ b/ve/veuml.h @@ -76,6 +76,7 @@ #define F_ATTIVAANNO 179 // GESTITO DAL MOTORE #define F_OCCASEDIT 180 // GESTITO DAL MOTORE #define F_CATVEN 181 +#define F_CODNOTE 182 #define F_CODVAL1 200 #define F_NOMEVAL1 201