diff --git a/ha/ha0300.cpp b/ha/ha0300.cpp index 5e16a8ffd..393fdbfbd 100755 --- a/ha/ha0300.cpp +++ b/ha/ha0300.cpp @@ -22,7 +22,7 @@ class TDocumenti_premio_msk : public TAutomask { protected: - bool find_prezzo_articolo(const TString& codart, real& prezzo, TString& um) const; + char find_prezzo_articolo(const TString& codart, real& prezzo, TString& um) const; virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); virtual bool on_key(KEY key); @@ -46,9 +46,9 @@ bool TDocumenti_premio_msk::on_key(KEY key) return TAutomask::on_key(key); } -bool TDocumenti_premio_msk::find_prezzo_articolo(const TString& codart, real& prezzo, TString& um) const +char TDocumenti_premio_msk::find_prezzo_articolo(const TString& codart, real& prezzo, TString& um) const { - //1) contratto + //1) contratto (listino cliente) const long codcf = get_long(F_CODCF); const TString& codcontr = get(F_CODCONTR); @@ -59,7 +59,9 @@ bool TDocumenti_premio_msk::find_prezzo_articolo(const TString& codart, real& pr um = rec_umart.get(UMART_UM); const real umart_prezzo = rec_umart.get_real(UMART_PREZZO); + char origine_prezzo = 'A'; //'A'nagrafica prezzo = umart_prezzo; //mal che vada sarà il prezzo di umart + TToken_string key; //CONTRATTI: tipo=C|catven=|tipocf=C|codcf=codcf|cod=codcontr|tiporiga=A|codriga=codart|um=um @@ -82,7 +84,10 @@ bool TDocumenti_premio_msk::find_prezzo_articolo(const TString& codart, real& pr //2) non c'è un prezzo sul contratto, prova con il listino standard if (!contratto_prezzo.is_zero()) + { prezzo = contratto_prezzo; + origine_prezzo = 'C'; + } else { key.cut(0); @@ -110,10 +115,13 @@ bool TDocumenti_premio_msk::find_prezzo_articolo(const TString& codart, real& pr const TRectype& rec_listino = cache().get(LF_RCONDV, key); const real listino_prezzo = rec_listino.get(RCONDV_PREZZO); if (!listino_prezzo.is_zero()) + { prezzo = listino_prezzo; + origine_prezzo = 'L'; + } } - return !prezzo.is_zero(); + return origine_prezzo; } bool TDocumenti_premio_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) @@ -155,11 +163,23 @@ bool TDocumenti_premio_msk::on_field_event(TOperable_field& o, TField_event e, l real prezzo; TString4 um; //se il prezzo l'ha trovato lo mette nel relativo campo - if (find_prezzo_articolo(o.get(), prezzo, um)) + char origine = find_prezzo_articolo(o.get(), prezzo, um); + if (!prezzo.is_zero()) { TMask& row_mask = o.mask(); row_mask.set(S_PREZZO, prezzo); row_mask.set(S_UMQTA, um); + + //per i contratti di anticipo/rifatturazione DEVE esistere il prezoo dell'articolo sul listino cliente (contratto campo).. + //..perchè non potrà andare a modificare altro che tale prezzo nel programma di aggiornamento contratti premio hardy.. + //..scaduti: (ha0400) + const char tipo_contr = get(F_TIPOCONTR)[0]; + if (origine != 'C' && (tipo_contr == 'A' || tipo_contr == 'R')) + { + TString msg; + msg.format("Non esiste il prezzo per l'articolo %s nel listino cliente selezionato!", (const char*)o.get()); + return error_box(msg); + } } else { diff --git a/ha/ha0300a.h b/ha/ha0300a.h index e285bf24f..977aa81fa 100755 --- a/ha/ha0300a.h +++ b/ha/ha0300a.h @@ -27,8 +27,11 @@ #define F_DATAFCOMP 226 #define F_NUMREG 227 #define F_COLLEGA 228 -#define F_ANTICIPATO 229 -#define F_RESO_STORICO 230 +#define F_DOCRIF 229 +#define F_DATA_DOCRIF 230 + +#define F_ANTICIPATO 231 +#define F_RESO_STORICO 232 #define F_RIGHE 500 //questo va messo 500 sennò ve0 si incazza e non funziona più diff --git a/ha/ha0300a.uml b/ha/ha0300a.uml index 46cb2db1a..aa56d1b4f 100755 --- a/ha/ha0300a.uml +++ b/ha/ha0300a.uml @@ -8,7 +8,7 @@ ENDPAGE PAGE "Gestione contratti premio" -1 -1 78 23 -GROUPBOX DLG_NULL 78 13 +GROUPBOX DLG_NULL 78 14 BEGIN PROMPT 1 0 "" END @@ -16,9 +16,12 @@ END RADIOBUTTON F_TIPOCONTR 1 76 BEGIN PROMPT 2 0 "@bTipo contratto" - ITEM "A|Anticipo" MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@ - ITEM "P|Posticipo" MESSAGE ENABLE,F_DATAFCOMP|CLEAR,1@ - ITEM "R|Rifatturazione" MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@ + ITEM "A|Anticipo" + MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@|CLEAR,F_CODLIS|REQUIRED,F_CODCONTR + ITEM "P|Posticipo" + MESSAGE ENABLE,F_DATAFCOMP|CLEAR,1@|ENABLE,F_CODLIS|NORMAL,F_CODCONTR + ITEM "R|Rifatturazione" + MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@|CLEAR,F_CODLIS|REQUIRED,F_CODCONTR FLAGS "GZ" KEY 1 END @@ -293,27 +296,44 @@ BEGIN FLAGS "D" END +TEXT DLG_NULL +BEGIN + PROMPT 2 10 "@bRiferimenti contratto" +END + +STRING F_DOCRIF 12 +BEGIN + PROMPT 31 10 "Codice " + FIELD DOC1 +END + +DATA F_DATA_DOCRIF +BEGIN + PROMPT 55 10 "Data " + FIELD DATADOCRIF +END + GROUPBOX DLG_NULL 76 3 BEGIN - PROMPT 2 10 "@bSomme anticipate/restituite" + PROMPT 2 11 "@bSomme anticipate/restituite" END CURRENCY F_ANTICIPATO BEGIN - PROMPT 3 11 "Anticipato " + PROMPT 3 12 "Anticipato " FLAGS "U" GROUP 1 END CURRENCY F_RESO_STORICO BEGIN - PROMPT 38 11 "Restituito " + PROMPT 38 12 "Restituito " GROUP 1 END SPREADSHEET F_RIGHE BEGIN -PROMPT 2 13 "" +PROMPT 2 14 "" ITEM "Codice Articolo@20" ITEM "Descrizione@40" ITEM "UM@2" diff --git a/ha/ha0400.cpp b/ha/ha0400.cpp index 2af18fccf..9cb87261c 100755 --- a/ha/ha0400.cpp +++ b/ha/ha0400.cpp @@ -5,11 +5,14 @@ #include #include #include +#include #include #include #include +#include "../ve/rcondv.h" + #include "halib.h" #include "ha0.h" #include "ha0400a.h" @@ -19,6 +22,7 @@ /////////////////////////////////////////////////////////// class THardy_tied_mask : public TAutomask { + int _pos_check, _pos_codcf, _pos_ragsoc, _pos_anno, _pos_codnum, _pos_ndoc, _pos_tipodoc, _pos_importo, _pos_condpag, _pos_codage; protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); @@ -28,6 +32,8 @@ protected: long fill_recordset(const long codcf, TISAM_recordset& recset); void fill_sheet(); + int elabora_contratto(TToken_string* riga_sheet, TLog_report& log); + public: THardy_tied_mask(); ~THardy_tied_mask(); @@ -117,6 +123,8 @@ void THardy_tied_mask::fill_sheet() row.add(ragsoc); const int anno = recset.get(RDOC_ANNO).as_int(); row.add(anno); + const TString& codnum = recset.get(RDOC_CODNUM).as_string(); + row.add(codnum); const long ndoc = recset.get(RDOC_NDOC).as_int(); row.add(ndoc); const TString& tipo = recset.get("DOC.TIPODOC").as_string(); @@ -161,6 +169,105 @@ void THardy_tied_mask::check_all(const bool checked) sf_righe.force_update(); } + +//metodo base per l'elaborazione dei contratti pareggiati +int THardy_tied_mask::elabora_contratto(TToken_string* riga_sheet, TLog_report& log) +{ + //si crea il contratto_premi di origine, per caricare i dati che poi dovrà modificare + const long codcf = riga_sheet->get_long(_pos_codcf); + const int anno = riga_sheet->get_int(_pos_anno); + const TString& codnum = riga_sheet->get(_pos_codnum); + const long ndoc = riga_sheet->get_long(_pos_ndoc); + const TString4 tipodoc = riga_sheet->get(_pos_tipodoc); + + //crea il contratto premi... + TContratto_premi contratto_premi('D', anno, codnum, ndoc); + //..e le sue righe + TRecord_array& righe_contr_premi = contratto_premi.body(); + + //cerca il listino cliente corrispondente.. + const TString4 listino_cliente = contratto_premi.get(DOC_CODCONT); + TLocalisamfile rcondv(LF_RCONDV); + + int err = NOERR; + //e adesso scatta la ricerca dell'articolo del contratto premi dentro le righe del listino cliente... + for (int i = righe_contr_premi.last_row(); i > 0 && err == NOERR; i = righe_contr_premi.pred_row(i)) + { + TRectype& riga = righe_contr_premi[i]; + //solo le righe merce del contratto premi devono essere scasinate! + if (riga.get(RDOC_TIPORIGA) == HARDY_TIPORIGA_MERCE) + { + const TString80 codart = riga.get(RDOC_CODART); + const TString4 um = riga.get(RDOC_UMQTA); + //adesso gli tocca cercare lo stesso articolo (e UM) dentro le righe listino cliente per raccatare il prezzo + rcondv.put(RCONDV_TIPO, 'C'); + rcondv.put(RCONDV_CATVEN, ""); + rcondv.put(RCONDV_TIPOCF, 'C'); + rcondv.put(RCONDV_CODCF, codcf); + rcondv.put(RCONDV_COD, listino_cliente); + rcondv.put(RCONDV_TIPORIGA, 'A'); + rcondv.put(RCONDV_CODRIGA, codart); + rcondv.put(RCONDV_UM, um); + + err = rcondv.read(_isequal, _lock); + if (err == NOERR) + { + //premio e ns_carico li prende dalla riga del contratto premi + const real premio = riga.get_real(RC_1_PREMIO); + const real ns_carico = riga.get_real(RC_1_NSCARICO); + //il prezzo lo prende dal listino cliente + real prezzo = rcondv.get_real(RCONDV_PREZZO); + //aggiorna il prezzo con una formula ladresca... + prezzo = prezzo - premio + ns_carico; + rcondv.put(RCONDV_PREZZO, prezzo); + + err = rcondv.rewrite(); + if (err != NOERR) + { + TString msg; + msg.format("Imossibile aggiornare il listino %s del cliente %6ld ! Errore %d", (const char*)listino_cliente, codcf, err); + log.log(1, msg); + } + } + else + { + TString msg; + msg.format("Impossibile trovare l'articolo %s con u.m. %s nel listino %s del cliente %6ld !! Errore %d", + (const char*)codart, (const char*)um, (const char*)listino_cliente, codcf, err); + log.log(2, msg); + } + + } //if (riga.get(RDOC_TIPORIGA)... + } //for (int i = righe_contr_premi.last_row()... + + //alla fine della fiera il contratto premi va messo in stato scaduto, ovvero 9 direi... + if (err == NOERR) + { + const TTipo_documento& tipodoc = contratto_premi.tipo(); + const TString& stato_scaduto = tipodoc.stato_chiuso(); + + contratto_premi.put(DOC_STATO, stato_scaduto); + err = contratto_premi.rewrite(); + + if (err != NOERR) + { + TString msg; + msg.format("Impossibile aggiornare il contratto premi %4d%s%7ld del cliente %6ld !! Errore %d", + anno, (const char*)codnum, ndoc, err); + log.log(2, msg); + } + } + + //aggiornamento positivo del log! + if (err == NOERR) + { + TString msg; + msg.format("Chiuso contratto premi %7ld del cliente %6ld - Aggiornato listino %s", ndoc, codcf, (const char*)listino_cliente); + } + + return err; +} + bool THardy_tied_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) @@ -182,6 +289,23 @@ bool THardy_tied_mask::on_field_event(TOperable_field& o, TField_event e, long j } break; + case DLG_OK: + if (e == fe_button) + { + //già che ci siamo mettiamoci pure un log di elaborazione + TLog_report log("Elaborazione contratti selezionati"); + log.kill_duplicates(); + log.log(0, ""); + TSheet_field& righe = sfield(F_RIGHE); + FOR_EACH_SHEET_ROW(righe, r, riga) + { + //vengono elaborate solo le righe checkate + const char checked = riga->get_char(0); + if (checked == 'X') + int err = elabora_contratto(riga, log); + } + } + break; default: break; break; @@ -191,6 +315,18 @@ bool THardy_tied_mask::on_field_event(TOperable_field& o, TField_event e, long j THardy_tied_mask::THardy_tied_mask() : TAutomask ("ha0400a") { + //assegna una volta per tutte le pos delle colonne di sheet + TSheet_field& sf_righe = sfield(F_RIGHE); + _pos_check = sf_righe.cid2index(S_CHECK); + _pos_codcf = sf_righe.cid2index(S_CODCF); + _pos_ragsoc = sf_righe.cid2index(S_RAGSOC); + _pos_anno = sf_righe.cid2index(S_ANNO); + _pos_codnum = sf_righe.cid2index(S_CODNUM); + _pos_ndoc = sf_righe.cid2index(S_NDOC); + _pos_tipodoc = sf_righe.cid2index(S_TIPO); + _pos_importo = sf_righe.cid2index(S_IMPORTO); + _pos_condpag = sf_righe.cid2index(S_CONDPAG); + _pos_codage = sf_righe.cid2index(S_CODAG); } THardy_tied_mask::~THardy_tied_mask() diff --git a/ha/ha0400a.h b/ha/ha0400a.h index 130691ab9..2ceb8ffea 100755 --- a/ha/ha0400a.h +++ b/ha/ha0400a.h @@ -13,8 +13,9 @@ #define S_CODCF 102 #define S_RAGSOC 103 #define S_ANNO 104 -#define S_NDOC 105 -#define S_TIPO 106 -#define S_IMPORTO 107 -#define S_CONDPAG 108 -#define S_CODAG 109 +#define S_CODNUM 105 +#define S_NDOC 106 +#define S_TIPO 107 +#define S_IMPORTO 108 +#define S_CONDPAG 109 +#define S_CODAG 110 diff --git a/ha/ha0400a.uml b/ha/ha0400a.uml index 3620ae556..9adc7c026 100755 --- a/ha/ha0400a.uml +++ b/ha/ha0400a.uml @@ -74,6 +74,7 @@ BEGIN ITEM "Cliente" ITEM "Ragione sociale@40" ITEM "Anno" + ITEM "Num." ITEM "N.Contr." ITEM "Tipo" ITEM "Importo@12" @@ -128,6 +129,11 @@ BEGIN PROMPT 1 3 "Anno " END +STRING S_CODNUM 4 +BEGIN + PROMPT 1 4 "Num. " +END + NUMBER S_NDOC 7 BEGIN PROMPT 1 4 "N. doc. "