From 04a1ce4267bd84ecaf6dba2e9a9467bd2a5e89d1 Mon Sep 17 00:00:00 2001 From: guy Date: Mon, 21 Dec 2015 11:19:46 +0000 Subject: [PATCH] git-svn-id: svn://10.65.10.50/branches/R_10_00@23160 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve0100.cpp | 2 +- ve/ve0100a.uml | 29 ++- ve/ve1300.alx | 4 + ve/ve1300.cpp | 433 +++++++++++++++++++++----------- ve/ve1300a.uml | 15 ++ ve/ve1400.cpp | 2 - ve/ve2100.cpp | 2 +- ve/ve2200.cpp | 2 +- ve/ve2400.cpp | 19 +- ve/ve2400.h | 4 +- ve/ve2400.uml | 57 ++--- ve/ve2400c.uml | 4 +- ve/ve2500.cpp | 8 +- ve/ve2800.cpp | 69 +++++- ve/ve2800.h | 3 +- ve/ve2800a.uml | 13 +- ve/ve3800.cpp | 11 +- ve/ve3900.cpp | 3 - ve/ve4100.cpp | 2 +- ve/ve5200.cpp | 2 +- ve/ve5200.uml | 7 +- ve/ve5400.cpp | 54 ++-- ve/ve6200.cpp | 10 +- ve/velib.h | 49 ++-- ve/velib01.cpp | 1 + ve/velib02.cpp | 43 ++-- ve/velib03.cpp | 147 +++++++---- ve/velib03a.cpp | 5 +- ve/velib04.cpp | 83 ++++++- ve/velib04.h | 8 +- ve/velib04a.cpp | 56 +++-- ve/velib04b.cpp | 639 ++++++++++++++++++++++++++---------------------- ve/velib04c.cpp | 4 +- ve/velib04d.cpp | 51 ++-- ve/velib06.cpp | 16 +- ve/velib06a.cpp | 3 +- ve/velib07.cpp | 2 +- 37 files changed, 1125 insertions(+), 737 deletions(-) diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index a821ef603..7c13474de 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -679,7 +679,7 @@ bool TMotore_application::user_create( ) _msk->set_handler(F_ANNO, TDocumento_mask::anno_handler); _msk->set_handler(F_CODNUM, TDocumento_mask::num_handler); _msk->set_handler(F_NUMDOCRIF, TDocumento_mask::numdocrif_search_handler); - _msk->set_handler(F_RAGSOCSEARCH, TDocumento_mask::ragsoc_search_handler); + //_msk->set_handler(F_RAGSOCSEARCH, TDocumento_mask::ragsoc_search_handler); _msk->set_handler(F_NDOC, ndoc_handler); const int args = argc() ; diff --git a/ve/ve0100a.uml b/ve/ve0100a.uml index 23a2b3de1..f2a74bc34 100755 --- a/ve/ve0100a.uml +++ b/ve/ve0100a.uml @@ -159,12 +159,23 @@ END NUMBER F_CODCF 6 BEGIN PROMPT 24 8 "Codice " + + /* USE LF_DOC KEY 2 SELECT (CODNUM==#F_CODNUM)&&(PROVV==#F_PROVV)&&(ANNO==#F_ANNO)&&((#F_STATO=="")||(STATO==#F_STATO)) JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF INPUT TIPOCF F_TIPOCF SELECT - INPUT CODCF F_CODCF + INPUT CODCF F_CODCF SELECT INPUT PROVV F_PROVV - INPUT ANNO F_ANNO + INPUT ANNO F_ANNO + */ + + USE LF_DOC SELECT (TIPOCF==#F_TIPOCF)&&((#F_CODCF="")||(CODCF==#F_CODCF))&&((#F_STATO=="")||(STATO==#F_STATO)) + BY LF_CLIFO->CODCF NDOC + JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF + INPUT PROVV F_PROVV SELECT + INPUT ANNO F_ANNO SELECT + INPUT CODNUM F_CODNUM SELECT + DISPLAY "Codice" CODCF DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC DISPLAY "Partita IVA@12" LF_CLIFO->PAIV @@ -174,10 +185,9 @@ BEGIN DISPLAY "Tipo" TIPODOC DISPLAY "N.Doc. " NDOC DISPLAY "Stato@R" STATO - DISPLAY "Data\ndocumento" DATADOC + DISPLAY "Data\ndocumento@10" DATADOC DISPLAY "Valuta" CODVAL DISPLAY "Totale\ndocumento@18V" G1:TOTDOC - DISPLAY "Stato" STATO COPY OUTPUT F_NDOC OUTPUT F_CODCF CODCF CHECKTYPE NORMAL @@ -193,7 +203,16 @@ END STRING F_RAGSOCSEARCH 50 BEGIN PROMPT 2 9 "Ragione Sociale " - FLAGS "B" + USE LF_DOC SELECT (TIPOCF==#F_TIPOCF)&&(LF_CLIFO->RAGSOC?=(#F_RAGSOCSEARCH+"*"))&&((#F_STATO=="")||(STATO==#F_STATO)) + BY LF_CLIFO->RAGSOC NDOC + JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF + INPUT PROVV F_PROVV SELECT + INPUT ANNO F_ANNO SELECT + INPUT CODNUM F_CODNUM SELECT + COPY DISPLAY F_CODCF + COPY OUTPUT F_NDOC + OUTPUT F_CODCF CODCF + CHECKTYPE NORMAL END ENDPAGE diff --git a/ve/ve1300.alx b/ve/ve1300.alx index eaef22825..2b6656d65 100755 --- a/ve/ve1300.alx +++ b/ve/ve1300.alx @@ -48,4 +48,8 @@ : MESSAGE_LV_DOT ( s1 -- ) DOC_LV_DOT \ user defined word in ve1.exe +; + +: MESSAGE_ADD_ROW ( s1 s2 s3 -- ) + DOC_ADD_ROW \ user defined word in ve1.exe ; \ No newline at end of file diff --git a/ve/ve1300.cpp b/ve/ve1300.cpp index 4882afb7d..0a58f3431 100755 --- a/ve/ve1300.cpp +++ b/ve/ve1300.cpp @@ -48,10 +48,13 @@ public: TRiga_documento& TDoc_recordset::riga_doc(int n) const { + if (n < 0 || n > _doc->rows()) // Non dovrebbe succedere mai + { + n = _doc->new_row("05").numero(); // Crea una riga descrizione fittizia + ((TDoc_recordset*)this)->_lastpos++; + } if (n <= 0) n = _mypos+1; - if (n > _doc->rows()) // Non dovrebbe succedere mai - n = _doc->new_row("05").get_int(RDOC_NRIGA); // Crea ua riga descrizione fittizia if (n <= 0) n = 1; return _doc->row(n); @@ -282,6 +285,8 @@ protected: virtual bool execute_usr_word(unsigned int opcode, TVariant_stack& stack); virtual bool get_usr_val(const TString& name, TVariant& var) const; virtual bool set_usr_val(const TString& name, const TVariant& var); + + TVariant eval_rdoc(const TRiga_documento& rdoc, const TString& formula, TFieldtypes ft) const; TDocumentoEsteso& doc(); TRiga_documento& riga_doc(int n = 0); @@ -295,7 +300,8 @@ protected: bool msg_scadenze(TVariant_stack& stack); bool msg_tot_imponibili(TVariant_stack& stack); bool msg_lv_dot(TVariant_stack& stack); - + bool msg_add_row(TVariant_stack& stack); + int set_printed_status(TDocumento& doc) const; public: @@ -796,6 +802,104 @@ bool TReport_doc::msg_lv_dot(TVariant_stack& stack) return true; } +TVariant TReport_doc::eval_rdoc(const TRiga_documento& rdoc, const TString& formula, TFieldtypes ft) const +{ + TExpr_documento expr(formula, _strexpr, &rdoc.doc(), &rdoc); + for (int v = expr.numvar()-1; v >= 0; v--) + { + const TFixed_string fld = expr.varname(v); + if (rdoc.TRectype::exist(fld)) + expr.setvar(fld, rdoc.get(fld)); + else + { + TVariant var; + if (get_usr_val(fld, var)) + expr.setvar(fld, var.as_string()); + } + } + TVariant tmp; + switch (ft) + { + case _boolfld: tmp.set(expr.as_bool()); break; + case _realfld: tmp.set(expr.as_real()); break; + default : tmp.set(expr.as_string()); break; + } + return tmp; +} + +bool TReport_doc::msg_add_row(TVariant_stack& stack) +{ + TString4 row_type; + TString codart_expr; + TString descr_expr; + TToken_string sum_fields; + + for (int v = 0; !stack.empty(); v++) + { + const TString& riga = stack.pop().as_string(); + switch (v) + { + case 0: row_type.strncpy(riga, 2); break; + case 1: codart_expr = riga; break; + case 2: descr_expr = riga; break; + default: sum_fields.add(riga); break; + } + } + + TRiga_documento& curr_rdoc = riga_doc(0); + if (curr_rdoc.get(RDOC_TIPORIGA) == row_type) + return false; // Riga generata + + const TCodice_articolo codart = eval_rdoc(curr_rdoc, codart_expr, _alfafld).as_string(); + const int curr_riga = curr_rdoc.numero(); + const int last_riga = doc().physical_rows(); + int good_riga = 0; + for (int i = last_riga; i > curr_riga; i--) + { + const TRiga_documento& rdoc = riga_doc(i); + if (rdoc.get(RDOC_TIPORIGA) == row_type && rdoc.get(RDOC_CODART) == codart) + { + good_riga = i; + break; + } + } + if (good_riga <= curr_riga) // Nessuna riga compatibile + { + // Aggiungi riga vuota, se necessario + const TRiga_documento& urdoc = riga_doc(last_riga); + if (urdoc.get(RDOC_TIPORIGA) != row_type) + { + TRiga_documento& empty_rdoc = riga_doc(-1); + empty_rdoc.put(RDOC_TIPORIGA, row_type); + } + + // Crea nuova riga ragggruppamento + TRiga_documento& new_rdoc = riga_doc(-1); + new_rdoc.put(RDOC_TIPORIGA, row_type); + new_rdoc.put(RDOC_CODART, codart); + good_riga = new_rdoc.numero(); + } + + TRiga_documento& good_rdoc = riga_doc(good_riga); + FOR_EACH_TOKEN(sum_fields, fld) + good_rdoc.add(fld, curr_rdoc.get_real(fld)); + + int open_brace = 0; + while ((open_brace = descr_expr.find('{')) >=0) + { + const int close_brace = descr_expr.find('}', open_brace); + if (close_brace < 0) break; + const TString& varname = descr_expr.sub(open_brace+1, close_brace); + TFieldtypes ft = curr_rdoc.type(varname); if (ft == _nullfld) ft = _alfafld; + TVariant var = eval_rdoc(good_rdoc, varname, ft); + const TString& after = descr_expr.mid(close_brace+1); + descr_expr.cut(open_brace)<< var.as_string() << after; + } + good_rdoc.set_descr(descr_expr); + + return true; +} + size_t TReport_doc::get_usr_words(TString_array& words) const { TReport::get_usr_words(words); @@ -808,6 +912,7 @@ size_t TReport_doc::get_usr_words(TString_array& words) const "DOC_SCADENZE", "DOC_TOT_IMPONIBILI", "DOC_LV_DOT", + "DOC_ADD_ROW", NULL }; @@ -834,6 +939,7 @@ bool TReport_doc::execute_usr_word(unsigned int opcode, TVariant_stack& stack) case 4: msg_scadenze(stack); break; case 5: msg_tot_imponibili(stack); break; case 6: msg_lv_dot(stack); break; + case 7: msg_add_row(stack); break; default: ok = false; break; } stack.reset(); // Svuota eventuali parametri variabili inutilizzati @@ -923,6 +1029,20 @@ bool TReport_doc_mask::on_field_event(TOperable_field& o, TField_event e, long j set(F_A_NDOC, dal); } break; + case DLG_CONFIG: + if (e == fe_button) + { + TMask m("ba0100m"); + TConfig cfg(CONFIG_USER, "Mail"); + FOR_EACH_MASK_FIELD(m, i, f) if (f->field()) + f->set(f->field()->read(cfg, "Mail")); + if (m.run() == K_ENTER) + { + FOR_EACH_MASK_FIELD(m, i, f) if (f->field()) + f->field()->write(cfg, "Mail", f->get()); + } + } + break; default: break; } @@ -937,8 +1057,11 @@ TReport_doc_mask::TReport_doc_mask() : TAutomask("ve1300a") TApplication& a = main_app(); const bool can_pdf = a.has_module(RSAUT); const bool can_sign = can_pdf && a.has_module(FDAUT); - enable(DLG_EMAIL, can_pdf); - enable(DLG_SIGNMAIL, can_sign); + const int mail_client = xvt_mail_installed(); + const bool can_mail = can_pdf && mail_client != 0; + enable(DLG_EMAIL, can_mail); + enable(DLG_SIGNMAIL, can_mail && can_sign); + enable(DLG_CONFIG, can_mail && (mail_client & 0x2) != 0); enable(DLG_PDF, can_pdf); enable(DLG_SIGNPDF, can_sign); } @@ -1079,7 +1202,7 @@ bool TReport_doc_app::get_next_mail(TToken_string& to, TToken_string& cc, TToken ok = get_mail_address(to, cc); if (ok) { - TDocumento doc('D', _anno, _codnum, _ndoc); + const TDocumento doc('D', _anno, _codnum, _ndoc); doc.riferimento(subj); if (subj.blank()) { @@ -1087,7 +1210,26 @@ bool TReport_doc_app::get_next_mail(TToken_string& to, TToken_string& cc, TToken subj << ' ' << _ndoc << TR(" del ") << doc.get(DOC_DATADOC) << ' ' << prefix().firm().ragione_sociale(); } - text << TR("Invio documento ") << subj; + TString saluti = esc(ini_get_string(CONFIG_USER, "Mail", "Signature")); + if (saluti.full()) + { + if (saluti.find('\n')<0 && fexist(saluti)) + { + TScanner s(saluti); + while (!s.eof()) + text << s.line() << '\n'; + } + else + text << saluti << '\n'; + } + else + { + text << TR("Cordiali Saluti"); + if (user() != dongle().administrator()) + text << " " << cache().get(LF_USER, user(), "USERDESC"); + text << ' ' << prefix().firm().ragione_sociale(); + } + text.trim(); if (to.full()) ui &= ~0x1; // No user interface ui |= 0x2; // Query receipt @@ -1196,7 +1338,7 @@ bool TReport_doc_app::nome_report(const TRecordset& doc, int quale, TFilename& p } -bool TReport_doc_app::print_loop(TRecordset& doc, TOutput_mode mode, bool is_definitive) +bool TReport_doc_app::print_loop(TRecordset& doc, TOutput_mode mode, bool final_print) { const int docs = doc.items(); if (docs <= 0) @@ -1226,154 +1368,161 @@ bool TReport_doc_app::print_loop(TRecordset& doc, TOutput_mode mode, bool is_def yesno_box #endif (TR("Si desidera spedire veramente i documenti via mail?\n" - "Rispondendo NO verranno solo salvati gli allegati.")); + "Rispondendo NO verranno solo salvati gli allegati.")); } - const bool mail_requested = (mode == out_mail || mode == out_signed_mail); + if (docs > 0) + { + const bool mail_requested = (mode == out_mail || mode == out_signed_mail); + TProgress_monitor pi(docs, TR("Elaborazione documenti...")); + for (short loop = mail_requested ? 0 : 1; loop < 2; loop++) + { + const bool mail_loop = (loop == 0); + const bool print_loop = !mail_loop; - TProgress_monitor pi(docs, TR("Elaborazione documenti...")); - for (short loop = mail_requested ? 0 : 1; loop < 2; loop++) - { - const bool mail_loop = (loop == 0); - const bool print_loop = !mail_loop; + for (int i = 0; i < docs; i++) + { + if (!pi.add_status()) + break; - for (int i = 0; i < docs; i++) - { - if (!pi.add_status()) - break; + doc.move_to(i); - doc.move_to(i); + const TString4 tipodoc = doc.get(DOC_TIPODOC).as_string(); + const TTipo_documento& tipo = cached_tipodoc(tipodoc); - const TString4 tipodoc = doc.get(DOC_TIPODOC).as_string(); - const TTipo_documento& tipo = cached_tipodoc(tipodoc); + const bool final_doc = doc.get(DOC_STATO).as_string()[0] >= tipo.stato_finale_stampa(); + if (final_print && final_doc) + continue; // Evita lavoro inutile! - bool arc = false; - if (is_definitive) - { - if (doc.get(DOC_STATO).as_string()[0] == tipo.stato_finale_stampa()) - continue; // Evita lavoro inutile! + bool arc = false; + if (final_print || final_doc) + { + const TString4 codnum = doc.get(DOC_CODNUM).as_string(); + const TCodice_numerazione& cn = cached_numerazione(codnum); + arc = cn.auto_archive(); + } + set_next_pdf(&doc); - const TString4 codnum = doc.get(DOC_CODNUM).as_string(); - const TCodice_numerazione& cn = cached_numerazione(codnum); - arc = cn.auto_archive(); - } - set_next_pdf(&doc); - - TToken_string to, cc; - const bool send_mail = mail_requested && get_mail_address(to, cc); - const bool paperless = send_mail || mode == out_pdf || mode == out_signed_pdf; + TToken_string to, cc; + const bool send_mail = mail_requested && get_mail_address(to, cc); + const bool paperless = send_mail || mode == out_pdf || mode == out_signed_pdf; - // Tenta di costruirsi il nome del report: se non stampo su carta cerco di usare un profilo con sfondo - TFilename profilo; - const bool ok = nome_report(doc, paperless ? 2 : 0, profilo); + // Tenta di costruirsi il nome del report: se non stampo su carta cerco di usare un profilo con sfondo + TFilename profilo; + const bool ok = nome_report(doc, paperless ? 2 : 0, profilo); - if (ok) - { - int copies = 1; - if (!paperless) - { - copies = _msk->get_int(F_NCOPIE); - if (copies <= 0 && is_definitive) - copies = tipo.ncopie(); - if (copies <= 0) - copies = 1; - } + if (ok) + { + int copies = 1; + if (!paperless) + { + copies = _msk->get_int(F_NCOPIE); + if (copies <= 0 && final_print) + copies = tipo.ncopie(); + if (copies <= 0) + copies = 1; + } - TReport_doc& report = reports.get(profilo); - if (send_mail) - { - if (mail_loop) - { - mail_book = new TDoc_book; - if (!report.print(doc, *mail_book, is_definitive, 1, true, false, false)) // Non archiviare per ora... - break; - if (arc) // ... eventualemte archivia direttamente il book senza passare per uno temporaneo - mail_book->archive(NULL, signature); + TReport_doc& report = reports.get(profilo); + if (send_mail) + { + if (mail_loop) + { + mail_book = new TDoc_book; + if (!report.print(doc, *mail_book, final_print, 1, true, false, false)) // Non archiviare per ora... + break; + if (arc) // ... eventualemte archivia direttamente il book senza passare per uno temporaneo + mail_book->archive(NULL, signature); - TString mesg; - TToken_string to, cc; get_mail_address(to, cc); - mesg << tipo.descrizione() << TR(" n. ") << doc.get(DOC_NDOC) - << TR(" del ") << doc.get(DOC_DATADOC) << TR(" a ") << to; - mail_log.log(0, mesg); - } - } - else - { - if (print_loop) - { - if (!report.print(doc, book, is_definitive, copies, true, arc, signature)) - break; - if (!paperless) - print_extra_copies(report, doc, book, copies); - } - } - } //if(profilo.custom_path()... - else - { - TString msg; msg << TR("Report inesistente: ") << profilo; - xvtil_popup_error(msg); - continue; - } + TString mesg; + TToken_string to, cc; get_mail_address(to, cc); + mesg << tipo.descrizione() << TR(" n. ") << doc.get(DOC_NDOC) + << TR(" del ") << doc.get(DOC_DATADOC) << TR(" a ") << to; + mail_log.log(0, mesg); + } + } + else + { + if (print_loop) + { + if (!report.print(doc, book, final_print, copies, true, arc, signature)) + break; + if (!paperless) + print_extra_copies(report, doc, book, copies); + } + } + } //if(profilo.custom_path()... + else + { + TString msg; msg << TR("Report inesistente: ") << profilo; + xvtil_popup_error(msg); + continue; + } - // Stampa eventuali allegati - if (nome_report(doc, 1, profilo)) - { - int copies = tipo.additional_ncopie(); - if (copies <= 0) copies = 1; + // Stampa eventuali allegati + if (nome_report(doc, 1, profilo)) + { + int copies = tipo.additional_ncopie(); + if (copies <= 0) copies = 1; - TReport_doc& allegato = reports.get(profilo); - // Cambio _codnum per non sovrascrivere il pdf precedente - if (arc) - { - _codnum = profilo.name(); - _codnum = _codnum.before("."); - } - // Il flag di definitivo deve essere false altrimenti riaggiorna lo stato e ristampa i documenti allegati - if (send_mail) - { - if (mail_loop) - allegato.print(doc, *mail_book, false, 1, false, false, false); // Non archivio gli allegati alla mail - } - else - { - if (print_loop) - { - allegato.print(doc, book, false, copies, false, arc, signature); - if (!paperless) - print_extra_copies(allegato, doc, book, copies); - } - } - } + TReport_doc& allegato = reports.get(profilo); + // Cambio _codnum per non sovrascrivere il pdf precedente + if (arc) + { + _codnum = profilo.name(); + _codnum = _codnum.before("."); + } + // Il flag di definitivo deve essere false altrimenti riaggiorna lo stato e ristampa i documenti allegati + if (send_mail) + { + if (mail_loop) + allegato.print(doc, *mail_book, false, 1, false, false, false); // Non archivio gli allegati alla mail + } + else + { + if (print_loop) + { + allegato.print(doc, book, false, copies, false, arc, signature); + if (!paperless) + print_extra_copies(allegato, doc, book, copies); + } + } + } - if (mail_book != NULL) - { - if (mail_book->pages() > 0) - { - TFilename attachment; - bool is_tmp = false; + if (mail_book != NULL) + { + if (mail_book->pages() > 0) + { + TFilename attachment; + bool is_tmp = false; - // Se ho archiviato (arc==true) allora il file di attachment e' gia' pronto! - bool ok = arc && get_next_pdf(_anno, -1, _codnum, _ndoc, _codcf, attachment); - if (!ok || !attachment.exist()) // Altrimenti ne creo uno temporaneo - { - attachment.tempdir(); - attachment << SLASH << _anno <<'_' << _codnum << '_' << _ndoc; - attachment.ext("pdf"); - ok = mail_book->export_pdf(attachment, mode == out_signed_mail); - is_tmp = ok; - } - if (ok && attach_mail) // Ho chiesto la spedizione vera e propria - { - ok = spotlite_send_mail(attachment); - if (is_tmp) - attachment.fremove(); - } - } - delete mail_book; - mail_book = NULL; - } - } - } + // Se ho archiviato (arc==true) allora il file di attachment e' gia' pronto! + bool ok = arc && get_next_pdf(_anno, -1, _codnum, _ndoc, _codcf, attachment); + if (!ok || !attachment.exist()) // Altrimenti ne creo uno temporaneo + { + attachment.tempdir(); + attachment << SLASH << _anno <<'_' << _codnum << '_' << _ndoc; + attachment.ext("pdf"); + ok = mail_book->export_pdf(attachment, mode == out_signed_mail); + is_tmp = ok; + } + if (ok && attach_mail) // Ho chiesto la spedizione vera e propria + { + ok = spotlite_send_mail(attachment); + // Per ora non cancellare allegati mailsend.exe potrebbe non aver finito di scriverli 14/07/2015 + // if (is_tmp) attachment.fremove(); + TString mesg; mesg << "Invio allegato " << attachment; + if (!ok) mesg << " NON"; + mesg << " riuscito"; + mail_log.log(0, mesg); + } + } + delete mail_book; + mail_book = NULL; + } + } + } + } // if docs > 0 if (book.pages() > 0) { @@ -1464,7 +1613,7 @@ void TReport_doc_app::print_trans(const char* ininame) TConfig ini(ininame, "Transaction"); a = ini.get("Action")[0]; // Stampa, Anteprima, Pdf, ... m = ini.get("Mode")[0]; // Definitivo o Provvisori - _no_print_dlg = ini.get_bool("NoPrintDlg"); + _no_print_dlg = ini.get_bool("NoPrintDlg"); // Nascondi GUI di stampa } const TOutput_mode mode = key2mode(a); const bool is_definitive = m == 'D'; @@ -1499,7 +1648,7 @@ TReport_doc_app::TOutput_mode TReport_doc_app::key2mode(KEY k) const void TReport_doc_app::main_loop() { - _no_print_dlg = false; + _no_print_dlg = false; // Normalmente mostra la GUI di stampa const int a = argc(); if (a > 2) { diff --git a/ve/ve1300a.uml b/ve/ve1300a.uml index 570e711d7..6910931af 100755 --- a/ve/ve1300a.uml +++ b/ve/ve1300a.uml @@ -42,6 +42,12 @@ BEGIN FLAGS "D" END +BUTTON DLG_CONFIG 10 2 +BEGIN + PROMPT 7 1 "~Imposta" + PICTURE TOOL_CONFIG +END + BUTTON DLG_NULL 10 2 BEGIN PROMPT 7 1 "" @@ -131,8 +137,10 @@ BEGIN INPUT NDOC F_DA_NDOC DISPLAY "Data@10" DATADOC DISPLAY "Numero@7" NDOC + DISPLAY "Stato" STATO DISPLAY "Cliente/Fornitore@40" 20->RAGSOC DISPLAY "Comune@20" 13->DENCOM + DISPLAY "E-Mail per fatture@40" 20->DOCMAIL OUTPUT F_DA_NDOC NDOC GROUP 1 ADD RUN ve0 -0 @@ -274,6 +282,13 @@ BEGIN FLAG "P" END +STRING DLG_PROFILE 260 +BEGIN + PROMPT 1 -1 "Profilo " + PSELECT + FLAGS "H" +END + ENDPAGE ENDMASK diff --git a/ve/ve1400.cpp b/ve/ve1400.cpp index 8e5e4d625..98a6b6400 100755 --- a/ve/ve1400.cpp +++ b/ve/ve1400.cpp @@ -1,5 +1,3 @@ -#include - #include "velib07.h" #include "../ba/ba8500.h" diff --git a/ve/ve2100.cpp b/ve/ve2100.cpp index a516c9ac7..a26fb8ffd 100755 --- a/ve/ve2100.cpp +++ b/ve/ve2100.cpp @@ -478,6 +478,6 @@ bool TTabelle_sconti::remove() int ve2100(int argc, char* argv[]) { TTabelle_sconti a; - a.run(argc, argv, "Tabella sconti "); + a.run(argc, argv, TR("Tabella sconti ")); return 0; } diff --git a/ve/ve2200.cpp b/ve/ve2200.cpp index aceb62e3d..1b85cbc7a 100755 --- a/ve/ve2200.cpp +++ b/ve/ve2200.cpp @@ -646,6 +646,6 @@ bool TCondizioni_vendita::handle_copy(TMask_field &b, KEY k) int ve2200(int argc, char* argv[]) { TCondizioni_vendita a; - a.run(argc, argv, "Condizioni di vendita"); + a.run(argc, argv, TR("Condizioni di vendita")); return 0; } diff --git a/ve/ve2400.cpp b/ve/ve2400.cpp index 10ae5242b..3aa448d35 100755 --- a/ve/ve2400.cpp +++ b/ve/ve2400.cpp @@ -20,7 +20,6 @@ class TMask_anamag: public TMask int last_annogiac, last_annosto; int _disabled_user_page; - int _type_cod, _altype_cod; TString4 _ean8_pref; TString8 _ean13_pref; @@ -49,7 +48,6 @@ class TMask_anamag: public TMask static bool handle_sheet_giac_valgiac(TMask_field &, KEY); // handler static bool handle_sheet_stomag_stoval(TMask_field &, KEY); // handler static bool handle_autoinsert_livgiac(TMask_field &, KEY); // handler del campo - static bool handle_classdog2(TMask_field&, KEY); // handler del secondo sottocampo della classe doganale static void sheetgiac_get(TSheet_field &fld_righe, int item); static void sheetgiac_put(TSheet_field &fld_righe, int item); @@ -326,9 +324,7 @@ void TMask_anamag::set_parametered_fields() set_handler(F_STOANNO, handle_stoanno); } - - set_handler(F_CLASSDOG2, handle_classdog2); - + // setta i campi della maschera per la pagina giacenze TSheet_field &fld_stomag = sfield(F_SHEETSTOMAG); TSheet_field &fld_giac = sfield(F_SHEETGIAC); @@ -1191,18 +1187,6 @@ bool TMask_anamag::handle_sheetgiac(TMask_field &fld, KEY k) return TRUE; } -bool TMask_anamag::handle_classdog2(TMask_field& f, KEY k) -{ - if (f.to_check(k)) - { - TString8 str; str << atoi(f.get()); - if (str.len() < f.size()) - str.right_just(f.size(), '0'); - f.set(str); - } - return true; -} - int TMask_anamag::add_totali_storico(TString & codmag) { TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); @@ -1851,6 +1835,7 @@ bool TAnagrafica_magazzino::user_create() open_files(LF_TAB, LF_TABCOM, LF_ANAMAG, LF_MAG, LF_STOMAG, LF_UMART, LF_CODCORR, LF_DESLIN, LF_DIST, LF_RDIST, LF_RMOVMAG, LF_CLIFO, LF_PCON, 0); + // crea l'oggetto per i parametri di livello giacenza // apre la maschera e dispone gli sheet _rel= new TRelation(LF_ANAMAG); diff --git a/ve/ve2400.h b/ve/ve2400.h index c39fc633e..9117963a4 100755 --- a/ve/ve2400.h +++ b/ve/ve2400.h @@ -29,7 +29,7 @@ #define F_DESCRV 138 #define F_UMP 139 #define F_PESO 140 -#define F_CLASSDOG1 141 +#define F_CLASSDOG 141 #define F_CLASSDOGD 142 #define F_UBICAZIONE 143 #define F_UBICAZIONE1 144 @@ -143,8 +143,6 @@ #define F_CONVET 286 #define F_VALSTATUN 287 #define F_PAESEOR 288 -#define F_CLASSDOG2 289 -#define F_CLASSDOG3 290 #define F_NUMREGULC1 300 #define F_NUMRIGULC1 301 diff --git a/ve/ve2400.uml b/ve/ve2400.uml index c83fe7765..423053387 100755 --- a/ve/ve2400.uml +++ b/ve/ve2400.uml @@ -487,7 +487,7 @@ END ENDPAGE -PAGE "Unita'" 0 2 0 0 +PAGE "Unità" 0 2 0 0 GROUPBOX DLG_NULL 78 3 BEGIN @@ -509,12 +509,12 @@ END TEXT DLG_NULL BEGIN - PROMPT 1 3 "@bUnita' di misura" + PROMPT 1 3 "@bUnità di misura" END SPREADSHEET F_SHEETUM 76 4 BEGIN - PROMPT 1 4 "Unita' di misura " + PROMPT 1 4 "Unità di misura " FLAGS "A" USE LF_UMART KEY NRIGA INPUT CODART F_CODART @@ -839,63 +839,38 @@ BEGIN CHECKTYPE NORMAL END -NUMBER F_CLASSDOG1 4 +NUMBER F_CLASSDOG 8 BEGIN - PROMPT 1 8 "Nomenclatura combin. " - FIELD CLASSDOG[1,4] - FLAG "Z" + PROMPT 1 8 "Nomenclatura combinata " + FIELD CLASSDOG USE %NOC - INPUT CODTAB[1,4] F_CLASSDOG1 - INPUT CODTAB[5,6] F_CLASSDOG2 - INPUT CODTAB[7,8] F_CLASSDOG3 - DISPLAY "Codice 1" CODTAB[1,4] - DISPLAY "@3" CODTAB[5,6] - DISPLAY "@3" CODTAB[7,8] + INPUT CODTAB F_CLASSDOG + DISPLAY "Codice@4" CODTAB[1,4] + DISPLAY " @2" CODTAB[5,6] + DISPLAY " @2" CODTAB[7,8] DISPLAY "Descrizione@50" S0 - OUTPUT F_CLASSDOG1 CODTAB[1,4] - OUTPUT F_CLASSDOG2 CODTAB[5,6] - OUTPUT F_CLASSDOG3 CODTAB[7,8] + OUTPUT F_CLASSDOG CODTAB OUTPUT F_CLASSDOGD S0 - VALIDATE REQIF_FUNC 1 F_CLASSDOG2 - MESSAGE DIRTY,F_CLASSDOG3 - WARNING "Nomenclatura combinata assente" -END - -STRING F_CLASSDOG2 2 -BEGIN - PROMPT 30 8 "" - FIELD CLASSDOG[5,6] - COPY ALL F_CLASSDOG1 - VALIDATE REQIF_FUNC 1 F_CLASSDOG2 - MESSAGE DIRTY,F_CLASSDOG3 - WARNING "Nomenclatura combinata assente" -END - -NUMBER F_CLASSDOG3 2 -BEGIN - PROMPT 35 8 "" - FIELD CLASSDOG[7,8] - FLAG "Z" - COPY ALL F_CLASSDOG1 CHECKTYPE NORMAL + VALIDATE FIXLEN_FUNC 8 WARNING "Nomenclatura combinata assente" END -STRING F_CLASSDOGD 37 +STRING F_CLASSDOGD 50 41 BEGIN - PROMPT 40 8 "" + PROMPT 35 8 "" FLAG "D" END STRING F_PROVOR 2 BEGIN - PROMPT 1 9 "Provincia di origine " + PROMPT 1 9 "Provincia di origine (INTRA) " FIELD LF_ANAMAG->PROV END STRING F_PAESEOR 2 BEGIN - PROMPT 50 9 "Paese di origine " + PROMPT 49 9 "Paese di origine (INTRA) " FIELD LF_ANAMAG->PAESE END diff --git a/ve/ve2400c.uml b/ve/ve2400c.uml index 5585ae1c0..98bd2a8ea 100755 --- a/ve/ve2400c.uml +++ b/ve/ve2400c.uml @@ -25,7 +25,7 @@ END STRING FS_CODUMCORR 2 BEGIN - PROMPT 2 6 "Unita' di misura " + PROMPT 2 6 "Unità di misura " FIELD UM FLAG "U" USE %UMS @@ -40,7 +40,7 @@ END //Livelli giacenza STRING FS_LIV1 10 BEGIN - // Non mettere FLAGS "D" perchè disabiliterebbe tutta la colonna + // Non mettere FLAGS "D" perché disabiliterebbe tutta la colonna FLAGS "U" PROMPT 2 8 "Livello 1 " USE GCG diff --git a/ve/ve2500.cpp b/ve/ve2500.cpp index bbcbfa8fb..1cb971813 100755 --- a/ve/ve2500.cpp +++ b/ve/ve2500.cpp @@ -1102,11 +1102,6 @@ void TGestione_listini_semplice::init_modify_mode(TMask& m) bool TGestione_listini_semplice::user_create() { - /* Controlla se la chiave ha l'autorizzazione a questo programma - Tdninst dninst; - if (!dninst.can_I_run(true)) - return error_box(TR("Programma non autorizzato!")); */ - //decide il tipo di condizione di vendita: 'L'istino, 'C'ontratto, 'O'fferta _tipo = 'L'; _codice = 0L; @@ -1135,11 +1130,10 @@ bool TGestione_listini_semplice::user_create() } } if (_codice > 0 && _tipo < 'C') - _tipo = 'C'; + _tipo = 'C'; // Se c'è il cliente deve essere un contratto else _tipo = toupper(_tipo); } - _rel = new TRelation(LF_CONDV); //attenzione!! questo è il parametro per avere la lunghezza del numero riga sullo sheet diff --git a/ve/ve2800.cpp b/ve/ve2800.cpp index 276b283c5..8044dcaa2 100644 --- a/ve/ve2800.cpp +++ b/ve/ve2800.cpp @@ -64,9 +64,6 @@ void TRicarico_listini_mask::save() TProgind pi(s.items(), TR("Salvataggio modifiche"), false, true); FOR_EACH_SHEET_ROW(s, r, row) if (_dirty[r]) { - if (!pi.setstatus(r)) - break; - const TString80 codart = row->get(s.cid2index(F_CODART)); const real sconto = row->get(s.cid2index(F_SCONTO)); const real costo = row->get(s.cid2index(F_COSTO)); @@ -104,6 +101,51 @@ void TRicarico_listini_mask::save() rcondv.rewrite(); } } + + const char* cod = "FGDI"; + TLocalisamfile deslin(LF_DESLIN); deslin.setkey(2); + for (int lingua = 0; cod[lingua]; lingua++) + { + TString desc = row->get(s.cid2index(F_DESCFRA+lingua)); + if (desc.full()) + { + desc.trim(); + deslin.zero(); + deslin.put("CODART", codart); + deslin.put("CODLIN", cod[lingua]); + if (deslin.read() == NOERR) + { + if (deslin.get("DESCR") != desc) + { + deslin.put("DESCR", desc); + deslin.rewrite(); + } + } + else + { + TISAM_recordset rsdeslin("USE DESLIN\nFROM CODART=#ART\nTO CODART=#ART"); + rsdeslin.set_var("#ART", codart); + int nriga = 1; + if (rsdeslin.move_last()) + nriga += rsdeslin.get("NRIGA").as_int(); + deslin.zero(); + deslin.put("CODART", codart); + deslin.put("NRIGA", nriga); + deslin.put("CODLIN", cod[lingua]); + deslin.put("DESCR", desc); + const int err = deslin.write(); + if (err != NOERR) + { + TString msg; + msg << TR("Descrizione in lingua ") << cod[lingua] << TR(" articolo ") << codart; + cantwrite_box(msg); + } + } + } + } + + if (!pi.setstatus(r+1)) + break; } _dirty.reset(); disable(DLG_SAVEREC); @@ -198,21 +240,24 @@ void TRicarico_listini_mask::load() } const TString& codart = sm.get(F_CODART); - const char cod[4] = "FGD"; - for (int lingua = 0; lingua < 3; lingua++) + const char* cod = "FGDI"; + for (int lingua = 0; cod[lingua]; lingua++) { + deslin.zero(); deslin.put("CODART", codart); deslin.put("CODLIN", cod[lingua]); if (deslin.read() == NOERR) sm.set(F_DESCFRA+lingua, deslin.get("DESCR")); + else + sm.reset(F_DESCFRA+lingua); } TToken_string& r = s.row(-1); - if (r.empty()) // Dummy test + if (r.empty_items()) // Dummy test { - sm.field(F_RICARICO).on_hit(); - sm.field(F_OLDPRICE).on_hit(); - sm.field(F_NEWPRICE).on_hit(); + sm.efield(F_RICARICO).on_hit(); + sm.efield(F_OLDPRICE).on_hit(); + sm.efield(F_NEWPRICE).on_hit(); FOR_EACH_MASK_FIELD(sm, i, f) { const short id = f->dlg(); @@ -541,12 +586,10 @@ class TRicarico_listini : public TSkeleton_application { protected: virtual bool create(); - public: virtual void main_loop(); }; - void TRicarico_listini::main_loop() { TRicarico_listini_mask mask; @@ -555,9 +598,11 @@ void TRicarico_listini::main_loop() bool TRicarico_listini::create() { +#ifndef DBG Tdninst dninst; if (!dninst.can_I_run(true)) - return error_box(TR("Programma personalizzato non autorizzato!")); + return cantaccess_box(title()); +#endif TSheet_field::set_line_number_width(4); return TSkeleton_application::create(); } diff --git a/ve/ve2800.h b/ve/ve2800.h index 99428049d..9193ce3a8 100644 --- a/ve/ve2800.h +++ b/ve/ve2800.h @@ -25,4 +25,5 @@ #define F_DESCFRA 112 #define F_DESCENG 113 #define F_DESCDEU 114 -#define F_CODARTALT 115 +#define F_DESCITA 115 +#define F_CODARTALT 116 diff --git a/ve/ve2800a.uml b/ve/ve2800a.uml index dc399e106..8cb340b52 100644 --- a/ve/ve2800a.uml +++ b/ve/ve2800a.uml @@ -175,6 +175,7 @@ BEGIN ITEM "Descrizione\nFrancese@30" ITEM "Descrizione\nInglese@30" ITEM "Descrizione\nTedesco@30" + ITEM "Descrizione\nItaliano@30" ITEM "Replaced by@20" END @@ -183,7 +184,7 @@ ENDPAGE ENDMASK // maschera di riga sheet -PAGE "Riga aggiornamento listini" -1 -1 66 12 +PAGE "Riga aggiornamento listini" -1 -1 66 13 STRING F_CODART 20 BEGIN @@ -293,20 +294,22 @@ END STRING F_DESCFRA 50 BEGIN PROMPT 1 9 "Descr. FRA " - FLAGS "D" END STRING F_DESCENG 50 BEGIN PROMPT 1 10 "Descr. ENG " - FLAGS "D" END STRING F_DESCDEU 50 BEGIN PROMPT 1 11 "Descr. DEU " - FLAGS "D" -EN +END + +STRING F_DESCITA 50 +BEGIN + PROMPT 1 12 "Descr. ITA " +END ENDPAGE diff --git a/ve/ve3800.cpp b/ve/ve3800.cpp index cb0e9ae0e..2b91ceed5 100755 --- a/ve/ve3800.cpp +++ b/ve/ve3800.cpp @@ -606,15 +606,15 @@ void TStatistiche_ve::elabora(const TMask& mask) const if (righe_items > 0) { //E crea pure la progind.. - TProgind pi(righe_items, TR("Generazione file statistiche..."), true, true); + TProgress_monitor pi(righe_items, TR("Generazione file statistiche...")); //Scansione del recordset trovato for (bool ok = righe.move_first(); ok; ok = righe.move_next()) { - if (!pi.addstatus(1)) - break; //scrive sul CSV i campi che servono al file di excel e al report csv->aggiungi_riga(righe, tipo_dati, tipo_stat, tipo_dettaglio); + if (!pi.add_status()) + break; } //aggiorna le colonne delle percentuali @@ -696,16 +696,13 @@ void TStatistiche_ve::elabora(const TMask& mask) const void TStatistiche_ve::main_loop() { TStatistiche_ve_mask mask; - while (mask.run() == K_ENTER) - { elabora(mask); - } } bool TStatistiche_ve::create() { - //controlla se la chiave ha l'autorizzazione a questo programma + //controlla se la chiave ha l'autorizzazione per questo programma Tdninst dninst; if (!dninst.can_I_run(true)) return error_box(TR("Programma non autorizzato!")); diff --git a/ve/ve3900.cpp b/ve/ve3900.cpp index cf5554825..bb910498a 100755 --- a/ve/ve3900.cpp +++ b/ve/ve3900.cpp @@ -1,8 +1,5 @@ -#include #include -#include -#include "velib07.h" #include "../ba/ba8500.h" /////////////////////////////////////////////////////////// diff --git a/ve/ve4100.cpp b/ve/ve4100.cpp index 3c9b52519..0933aeac2 100755 --- a/ve/ve4100.cpp +++ b/ve/ve4100.cpp @@ -971,7 +971,7 @@ bool TRicalcolo_mask::elabora() } TToken_string& key_expr = get_key_expr(cur.key()); - TLog_report vw(TR("Ricalcolo valori")); + TLog_report vw(main_app().title()); TTable_expression::set_relation(cur.relation()); TTable_expression::set_window(&vw); diff --git a/ve/ve5200.cpp b/ve/ve5200.cpp index aebf1815f..de32528ff 100755 --- a/ve/ve5200.cpp +++ b/ve/ve5200.cpp @@ -107,7 +107,7 @@ void TStatus_change::main_loop() msg.add_plural(total, TR("documento")); if (yesno_box(msg)) { - TProgress_monitor pi(total, name()); + TProgress_monitor pi(total, title()); const TString& finale = m.get(F_FINALE); TDocumento* doc = new TDocumento; rel.lfile().set_curr(doc); diff --git a/ve/ve5200.uml b/ve/ve5200.uml index 27cd7c3bd..2bfe8235d 100755 --- a/ve/ve5200.uml +++ b/ve/ve5200.uml @@ -107,16 +107,17 @@ BEGIN PROMPT 2 10 "Da " USE LF_DOC SELECT STATO==#F_INIZIALE JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF - INPUT ANNO F_ANNO SELECT INPUT PROVV F_PROVVIS SELECT + INPUT ANNO F_ANNO SELECT INPUT CODNUM F_CODNUM SELECT INPUT NDOC F_DANUMERO - DISPLAY "Num." CODNUM - DISPLAY "Anno" ANNO DISPLAY "Provv" PROVV + DISPLAY "Anno" ANNO + DISPLAY "Num." CODNUM DISPLAY "Tipo" TIPODOC DISPLAY "N.Doc. " NDOC DISPLAY "Data Doc. " DATADOC + DISPLAY "Stato" STATO DISPLAY "Ragione Sociale@50" LF_CLIFO->RAGSOC OUTPUT F_DANUMERO NDOC CHECKTYPE SEARCH diff --git a/ve/ve5400.cpp b/ve/ve5400.cpp index b5ea371e8..8ef04be8a 100755 --- a/ve/ve5400.cpp +++ b/ve/ve5400.cpp @@ -23,7 +23,7 @@ public: TArchive_mask::TArchive_mask() : TMask("ve5400") { - TList_field& lf = (TList_field&)field(F_DRIVE); + TList_field& lf = lfield(F_DRIVE); TToken_string codes, values; TString4 str; int k = 0; @@ -51,7 +51,6 @@ TArchive_mask::TArchive_mask() : TMask("ve5400") //-------APPLICAZIONE----------------------------- class TArchive_doc : public TSkeleton_application { - TArray _file; TIsamtempfile *_tdoc; //dichiaro un puntatore al file documenti (non posso dichiarare un file) TIsamtempfile *_trdoc; // righe documenti TIsamtempfile *_trcf; // clienti/ fornitori @@ -63,12 +62,11 @@ class TArchive_doc : public TSkeleton_application protected: // TSkeleton_application virtual void main_loop(); - void open_files(int logicnum, ...); virtual bool create(); void create_tmp_files(bool create); void delete_tmp_files(bool remove); void archivia(const TMask& m); - void ripristina(const TMask& m); + bool ripristina(const TMask& m); bool restore_file(TIsamtempfile& src, bool update); bool restore_clifo(bool update); @@ -76,26 +74,13 @@ protected: // T public: TArchive_doc() { } - virtual ~TArchive_doc() { } }; -void TArchive_doc::open_files(int logicnum, ...) -{ - va_list marker; - va_start(marker, logicnum); - while (logicnum > 0) - { - CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum); - _file.add(new TLocalisamfile(logicnum), logicnum); - logicnum = va_arg(marker, int); - } -} - bool TArchive_doc::create() { - open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, +/* open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN, LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_CONDV, - LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, 0); + LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_CESS, 0);*/ _tmp_dir.temp(); _tmp_dir = _tmp_dir.path(); _tmp_dir << "VE"; @@ -217,7 +202,8 @@ void TArchive_doc::archivia(const TMask& m) delete_tmp_files(false); //chiude i files temp in modo da risparmiare memoria - const char * dir = &_tmp_dir[1]; //fa puntare dir alla directory temp + const char* dir = _tmp_dir; //fa puntare dir alla directory temp + if (*dir == '%') dir++; bool rt = _arc.backup(dir,_unit,_desc, TRUE); //esegue la compressione ed il salvataggio sul device scelto create_tmp_files(false); //apre i files temp, riallocandoli (NON li crea effettvam.) delete_tmp_files(true); //cancella fisicamente i files temp @@ -250,16 +236,10 @@ bool TArchive_doc::restore_file(TIsamtempfile& src, bool update) TProgress_monitor pi(src.items(), msg); for (int err = src.first(); err == NOERR; err = src.next()) { - err = src.curr().write(dst); - if (err == _isreinsert) - { - if (update) - err = src.curr().rewrite(dst); - else - err = NOERR; - } + dst.curr() = src.curr(); + err = dst.write_rewrite(); if (err != NOERR) - return cantwrite_box(src.description()); + return cantwrite_box(dst.description()); if (!pi.add_status(1)) break; } @@ -283,7 +263,7 @@ bool TArchive_doc::restore_docs() return ok; } -void TArchive_doc::ripristina(const TMask& m) +bool TArchive_doc::ripristina(const TMask& m) { _unit = m.get(F_DRIVE)[0]; _path = m.get(F_PATH); @@ -293,12 +273,15 @@ void TArchive_doc::ripristina(const TMask& m) if (!xvt_fsys_is_removable_drive(src) && _path.full()) src.add(_path); src.add("ve.z00"); + if (!src.exist()) + return cantread_box(src); + + const char* dst = _tmp_dir; + if (*dst == '%') dst++; - const char* dst = & _tmp_dir[1]; if (::aga_unzip(src, dst)) - { - create_tmp_files(FALSE); // In realta' ci sono gia' - + { + create_tmp_files(false); // In realta' ci sono gia' if (m.get_bool(F_WITHCLI)) restore_clifo(m.get_bool(F_UPDATE)); restore_docs(); @@ -306,7 +289,8 @@ void TArchive_doc::ripristina(const TMask& m) delete_tmp_files(true); // Removes temp files! } else - error_box(TR("Errore nella scompattazione dei file. Nessun documento ricevuto.")); + return error_box(TR("Errore nella scompattazione dei file. Nessun documento ricevuto.")); + return true; } diff --git a/ve/ve6200.cpp b/ve/ve6200.cpp index df7d03ff8..a85c627e1 100755 --- a/ve/ve6200.cpp +++ b/ve/ve6200.cpp @@ -68,16 +68,16 @@ void TFatturazione_bolle_app::process_by_cli(const TMask& m) const long dn = m.get_long(F_NUMERO_DOCUMENTO_DA); const long an = m.get_long(F_NUMERO_DOCUMENTO_A); - TElaborazione * e = elab(m.get(F_CODICE_ELAB)); - TElaborazione & eld = *e; + TElaborazione& eld = *elab(m.get(F_CODICE_ELAB)); TToken_string tipidoc(24), statidoc(10); eld.tipi_stati_iniziali(tipidoc, statidoc); TTipo_documento t(eld.tipo_iniziale(0)); char tipocf(t.tipocf()); TLista_cf clienti(tipocf); - const int tot_cli = clienti.leggi(dc, ac, da, aa, dz, az); - + + const int tot_cli = clienti.leggi_doc(eld, dd, ad, dc, ac, da, aa, dz, az); + TString msg(80); iw.set_max(tot_cli); for (int c = 0; c < tot_cli; c++) @@ -102,7 +102,7 @@ void TFatturazione_bolle_app::process_by_cli(const TMask& m) if (!iw.add_status()) break; } - delete e; + delete &eld; } void TFatturazione_bolle_app::process_by_ragsoc(const TMask& m) diff --git a/ve/velib.h b/ve/velib.h index 315654147..5994224a7 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -230,7 +230,7 @@ class TTipo_documento : public TRectype // velib03 char _tipocf; char _tipocr; char _check_qta; - bool _cnt_prezzi, _show_evaded_lines, _load_cont, _non_evadere, _hca_req, _check_double_art; + bool _cnt_prezzi, _show_evaded_lines, _load_cont, _non_evadere, _hca_req, _check_double_art, _ignora_anticipi_fatturazione; protected: void add_formula_if_needed(TConfig& profile, TString& variable, const char* varname, const char* formula); @@ -341,12 +341,11 @@ public: bool da_evadere() const { return !_non_evadere; } bool head_ca_required() const { return _hca_req; } bool check_double_art() const { return _check_double_art; } - - + bool ignora_anticipi_fatturazione() const { return _ignora_anticipi_fatturazione; } + TTipo_documento(const char* tipodoc = NULL); TTipo_documento(const TRectype& rec); virtual ~TTipo_documento(); - }; const TTipo_documento& cached_tipodoc(const char* tipodoc); @@ -484,7 +483,7 @@ public: bool formfeed() const { return get_bool("B0"); } TFormula_documento* first_formula() { return succ_formula(true); } - TFormula_documento* succ_formula(bool restart = FALSE); + TFormula_documento* succ_formula(bool restart = false); int read(const char* tiporig); void set_defaults(TSheet_field& s, int row) const; @@ -539,13 +538,13 @@ protected: virtual TRiga_documento & copy(const TRiga_documento & r); TObject* dup() const { return new TRiga_documento(*this); } - virtual void set_variables(TExpression * e) const ; + virtual void set_variables(TExpression* e) const ; bool has_doc() const { return _doc != NULL;} static void test_firm(); public: - void dirty_fields(bool dirty_document = true); + void dirty_fields(bool dirty_document = true); bool doc_dependent() const; int numero() const { return get_int(RDOC_NRIGA); } void set_numero(int numero) { put(RDOC_NRIGA, numero);} @@ -566,7 +565,7 @@ public: (is_spese() && !spesa().is_percentuale()) || is_prestazione(); } bool is_evasa() const; // Ritorna vero se la riga è evasa void checked(bool on = true) { put(RDOC_CHECKED, (bool)on); } - void unchecked() { checked(FALSE); } + void unchecked() { checked(false); } bool linked() const { return get(RDOC_DACODNUM).full(); } // @cmember Assegna il documento corrente void set_doc(TDocumento * doc) { _doc = doc; } @@ -619,9 +618,9 @@ public: real prezzo(bool scontato, bool lordo, int ndec = AUTO_DECIMALS) const ; real importo(bool scontato , bool lordo, int ndec = AUTO_DECIMALS) const ; - real sconto() const { return importo(FALSE,FALSE) - importo(true,FALSE); } + real sconto() const { return importo(false,false) - importo(true,false); } real iva(int ndec) const; - real imponibile(bool lordo = FALSE) const; + real imponibile(bool lordo = false) const; real imponibile_omaggio(int iva_calc_mode = 1) const; real iva_omaggio(int ndec, int iva_calc_mode = 1) const; real imposta(bool round = true) const; @@ -701,7 +700,8 @@ public: ~TRiepilogo_iva() {}; }; -class TAgente ; +class TAgente; +class TDoc_key; class TDocumento : public TMultiple_rectype // velib03 { @@ -770,7 +770,7 @@ public: const TString& codiva_spese() const ; const TString& codiva_bolli() const ; - TCodgiac_livelli & livelli() const ; + TCodgiac_livelli& livelli() const ; void dirty_fields(); TAssoc_array& tabella_iva(bool solo_imponibili = false) { update_tabella_iva(solo_imponibili); return _tabella_iva; } @@ -783,9 +783,9 @@ public: const TString& riferimento(TString& rif) const { return tipo().riferimento(*this, rif); } virtual TRecord_array& body(int logicnum = 0) const; - virtual TDocumento & operator =(const TDocumento & d) {return copy(d);} - virtual TRectype & operator =(const TRectype & r); - virtual TRectype & operator =(const char * r); + virtual TDocumento& operator =(const TDocumento & d) { return copy(d); } + virtual TRectype& operator =(const TRectype & r); + virtual TRectype& operator =(const char * r); virtual void zero(const char * fieldname); virtual void zero(char c = '\0') { TMultiple_rectype::zero(c); } void sort_rows(const char * key); @@ -810,15 +810,14 @@ public: int read(const TRectype& rec, word op = _isequal, word lockop = _nolock) { *this = rec; return read(op, lockop); } int read(word op = _isequal, word lockop = _nolock) { TLocalisamfile f(LF_DOC); return read(f, op, lockop);} - int write(bool re = FALSE) const { TLocalisamfile f(LF_DOC); return write_rewrite(f, re);} + int write(bool re = false) const { TLocalisamfile f(LF_DOC); return write_rewrite(f, re);} int rewrite() const { return write(true); } int remove() const { TLocalisamfile f(LF_DOC); return remove(f);} - int decimals(bool price = FALSE) const; + int decimals(bool price = false) const; void flush_rows(); void calc_provvigione(TProvvigioni_agente & provv, const TString & key, bool first = true, bool generata = true); - char tipo_numerazione() const { return get_char(DOC_PROVV); } int anno() const { return get_int(DOC_ANNO); } const TString& numerazione() const { return get(DOC_CODNUM); } @@ -869,8 +868,8 @@ public: real spese_incasso(real &imp, int ndec, TTipo_importo netto = _lordo) const ; real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ; - real imponibile(bool spese = FALSE, int ndec = AUTO_DECIMALS) const; - real imposta(bool spese = FALSE, int ndec = AUTO_DECIMALS) const; + real imponibile(bool spese = false, int ndec = AUTO_DECIMALS) const; + real imposta(bool spese = false, int ndec = AUTO_DECIMALS) const; real totale_doc() const; real totale_netto() const; real basesconto() const; @@ -881,7 +880,7 @@ public: TPagamento& pagamento(); - void update_spese_aut(TString_array & spese, bool preserve_old = FALSE, TSheet_field * sh = NULL); + void update_spese_aut(TString_array & spese, bool preserve_old = false, TSheet_field * sh = NULL); real calc_conai_qta(TCONAI_class type); void update_conai(); @@ -895,12 +894,12 @@ public: const TString & codesiva() const; void get_protocolli_esenzione(TString & esenzione, TString & data_esenzione, TString & registrazione, TString & data_registrazione) const; - void cli2doc() { clifor().cli2doc(*this); } TDocumento (); - TDocumento (const TDocumento & d); + TDocumento (const TDocumento& d); TDocumento(char provv, int anno, const char* codnum, long numdoc); TDocumento(const TRectype& doc); + TDocumento(const TDoc_key& key); virtual ~TDocumento(); }; @@ -928,7 +927,7 @@ public: TCurrency_documento(const TCurrency& cur) { copy(cur); } TCurrency_documento(const TCurrency_documento& cur) { copy(cur); } - TCurrency_documento(const real& num, const TDocumento &doc, bool price = FALSE); + TCurrency_documento(const real& num, const TDocumento &doc, bool price = false); virtual ~TCurrency_documento() { } }; @@ -1066,7 +1065,7 @@ public: static bool anno_handler( TMask_field& f, KEY key); static bool num_handler( TMask_field& f, KEY key ); static bool numdocrif_search_handler( TMask_field& f, KEY key ); - static bool ragsoc_search_handler( TMask_field& f, KEY key ); + //static bool ragsoc_search_handler( TMask_field& f, KEY key ); static bool datadocrif_handler(TMask_field& f, KEY key); static bool liqdiff_handler( TMask_field& f, KEY key ); diff --git a/ve/velib01.cpp b/ve/velib01.cpp index d0be53ad2..d6822df47 100755 --- a/ve/velib01.cpp +++ b/ve/velib01.cpp @@ -72,6 +72,7 @@ int TCodice_numerazione::read(const char* codnum) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // trova le numerazioni documenti in base ai tipi richiesti (ca3800,ca3900,ps1001,ha3800) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + int numerazioni_documenti(TString_array& num_doc, const TString& tipo_doc) { //e adesso cerca le numerazioni che contengono tipi ordine diff --git a/ve/velib02.cpp b/ve/velib02.cpp index 011e8ee4d..ee83c47ae 100755 --- a/ve/velib02.cpp +++ b/ve/velib02.cpp @@ -945,14 +945,15 @@ real TRiga_documento::calc_conai_qta(TCONAI_class type) const real qta = quantita(); // Quantita' merce if (peso > ZERO && !qta.is_zero()) // Verifica se ha un peso valido { - const TString4 um = get(RDOC_UMQTA); - TArticolo& art = articolo(); - qta = art.convert_to_um(qta, NULL, um); // Converte la quantita nell'unita' base + // A volte CODARTMAG è vuoto per cui converte erroneamente la qta in 0 :-( + if (is_articolo()) + { + const TString4 um = get(RDOC_UMQTA); + TArticolo& art = articolo(); + qta = art.convert_to_um(qta, NULL, um); // Converte la quantita nell'unita' base + } kg = qta * peso; // Calcola peso dell'imballo kg.round(5); -/* TString s = kg.string(); - - s.trim(); */ } } } @@ -990,19 +991,19 @@ real TRiga_documento::valore(bool totale, bool lordo, int ndec) const return val; } -const TString & TRiga_documento::codice_costo() const +const TString& TRiga_documento::codice_costo() const { const TString& cod_cos = get(RDOC_CODCOSTO); return cod_cos.empty() ? doc().get(DOC_CODCOSTO) : cod_cos; } -const TString & TRiga_documento::codice_commessa() const +const TString& TRiga_documento::codice_commessa() const { const TString& cod_cms = get(RDOC_CODCMS); return cod_cms.empty() ? doc().get(DOC_CODCMS) : cod_cms; } -const TString & TRiga_documento::fase_commessa() const +const TString& TRiga_documento::fase_commessa() const { const TString & fas_cms = get(RDOC_FASCMS); return fas_cms.empty() ? doc().get(DOC_FASCMS) : fas_cms; @@ -1010,8 +1011,8 @@ const TString & TRiga_documento::fase_commessa() const void TRiga_documento::dirty_fields(bool dirty_document) { - for (TDocumento_variable_field * f = (TDocumento_variable_field *) first_variable_field(); - f != NULL; f = (TDocumento_variable_field *) succ_variable_field()) + for (TDocumento_variable_field* f = (TDocumento_variable_field*)first_variable_field(); + f != NULL; f = (TDocumento_variable_field*)succ_variable_field()) f->set_dirty(); if (dirty_document) ((TDocumento &)doc()).dirty_fields(); @@ -1029,14 +1030,14 @@ bool TRiga_documento::doc_dependent() const if (tipor == RIGA_SCONTI) return get(RDOC_SCONTO).not_empty(); } - return FALSE; + return false; } void TRiga_documento::put_str(const char* fieldname, const char* val) { - if (strcmp(fieldname, RDOC_TIPORIGA) == 0) + if (xvt_str_same(fieldname, RDOC_TIPORIGA)) { - const TString4 v(val); + const TString4 v = val; if (TRectype::get(RDOC_TIPORIGA) != v) { TAuto_variable_rectype::put_str(fieldname, v); @@ -1059,9 +1060,9 @@ bool TRiga_documento::is_articolo() const return (t == RIGA_MERCE || t == RIGA_OMAGGI) && get(RDOC_CODARTMAG).full(); } -void TRiga_documento::zero(const char * fieldname) +void TRiga_documento::zero(const char* fieldname) { - if (strcmp(fieldname, RDOC_TIPORIGA) == 0) + if (xvt_str_same(fieldname, RDOC_TIPORIGA)) reset_fields(*this); TAuto_variable_rectype::zero(fieldname); dirty_fields(); @@ -1079,7 +1080,7 @@ void TRiga_documento::cms2tipodet() { TString4 cms_tipodet; const TString4 tipodet = get(RDOC_TIPODET); - TString codcms = codice_commessa(); + const TString20 codcms = codice_commessa(); if (codcms.full() && get(RDOC_CODIVA).full()) { @@ -1127,12 +1128,10 @@ void TRiga_documento::autosave(TSheet_field& f) if (num >= 0 && num < f.items()) { TMask& m = f.sheet_row_mask(num); - TToken_string & row = f.row(num); + TToken_string& row = f.row(num); - - put( RDOC_TIPORIGA, row.get( f.cid2index(FR_TIPORIGA )) ); - TString8 codmag(row.get(f.cid2index(FR_CODMAG))); - + put( RDOC_TIPORIGA, row.get(f.cid2index(FR_TIPORIGA))); + TString8 codmag = row.get(f.cid2index(FR_CODMAG)); codmag.left_just(3); codmag << row.get( f.cid2index(FR_CODDEP )); put( RDOC_CODMAG, codmag); diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 12caa8403..040f1d31c 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -8,9 +8,12 @@ #include "../cg/cg2103.h" #include "../db/dblib.h" #include "../pr/prlib.h" -#include "../sv/svlib01.h" #include "../li/letint.h" +#ifdef LIVE_STATISTICS +#include "../sv/svlib01.h" +#endif + #include "veini.h" #include "velib.h" #include "sconti.h" @@ -226,11 +229,13 @@ long TDocumento::_firm = -1; TString4 TDocumento::_codiva_spese; TString4 TDocumento::_codiva_bolli; short TDocumento::_has_mag = 3; -short TDocumento::_has_stat_ven = 3; short TDocumento::_has_provv = 3; +#ifdef LIVE_STATISTICS +short TDocumento::_has_stat_ven = 3; +#endif + TCodgiac_livelli * TDocumento::_livelli=NULL; -// HIDDEN TStats_agg _st_agg; HIDDEN TAssoc_array _docs_to_agg; void TDocumento::init() @@ -265,15 +270,24 @@ TDocumento::TDocumento(char provv, int anno, const char* codnum, long numdoc) : TMultiple_rectype(LF_DOC) { init(); - if (numdoc <= 0) - { - numdoc = 0; - set_key(*this, provv, anno, codnum, numdoc); - } - else + if (numdoc > 0) read(provv, anno, codnum, numdoc); + else + set_key(*this, provv, anno, codnum, 0L); } +TDocumento::TDocumento(const TDoc_key& key) + : TMultiple_rectype(LF_DOC) +{ + init(); + const long ndoc = key.ndoc(); + if (ndoc > 0) + read(key.provv(), key.anno(), key.codnum(), ndoc); + else + set_key(*this, key.provv(), key.anno(), key.codnum(), 0L); +} + + TDocumento::TDocumento(const TRectype& rec) : TMultiple_rectype(LF_DOC) { @@ -299,12 +313,14 @@ const TString& TDocumento::codiva_bolli() const void TDocumento::check_modules() { - if (_has_mag == 3) + if (_has_mag < 0 || _has_mag > 1) { const TDongle& din = dongle(); _has_mag = din.active(MGAUT); - _has_stat_ven = din.active(SVAUT); _has_provv = din.active(PRAUT); +#ifdef LIVE_STATISTICS + _has_stat_ven = din.active(SVAUT); +#endif } } @@ -606,26 +622,53 @@ const TString & TDocumento::commessa_principale() const return codice_commessa(); } -bool TDocumento::modificabile() const -{ - const char stato_attuale = stato(); +// Controlla se un documento è incluso nelle statistiche definitive +static bool doc_invalidating_stats(const TDocumento& doc) +{ + bool inv = false; + if (dongle().active(SVAUT) && doc.tipo().statistiche()) + { + const TDate datadoc = doc.get(DOC_DATADOC); + if (datadoc.ok()) + { + const TDate datalast = ini_get_string(CONFIG_DITTA, "sv", "UltimoCalcolo"); + inv = datadoc <= datalast; + } + } + return inv; +} - if (stato_attuale <= ' ') - return true; - - const TString& stati_modifica = tipo().stati_iniziali_modifica(); - return stati_modifica.blank() || stati_modifica.find(stato_attuale) >= 0; +bool TDocumento::modificabile() const +{ + bool maybe = true; + + const char stato_attuale = stato(); + if (stato_attuale > ' ') + { + const TString& stati_modifica = tipo().stati_iniziali_modifica(); + maybe = stati_modifica.blank() || stati_modifica.find(stato_attuale) >= 0; + + if (maybe && doc_invalidating_stats(*this)) + maybe = false; + } + + return maybe; } bool TDocumento::cancellabile() const { - const char stato_attuale = stato(); + bool maybe = true; - if (stato_attuale <= ' ') - return true; - - const TString& stati_cancellazione = tipo().stati_iniziali_cancellazione(); - return stati_cancellazione.blank() || stati_cancellazione.find(stato_attuale) >= 0; + const char stato_attuale = stato(); + if (stato_attuale > ' ') + { + const TString& stati_cancellazione = tipo().stati_iniziali_cancellazione(); + maybe = stati_cancellazione.blank() || stati_cancellazione.find(stato_attuale) >= 0; + + if (maybe && doc_invalidating_stats(*this)) + maybe = false; + } + return maybe; } bool TDocumento::stampabile() const @@ -644,12 +687,13 @@ bool TDocumento::stampabile() const bool TDocumento::bloccato() const { const char stato_attuale = stato(); - if (stato_attuale <= ' ') return false; + + if (doc_invalidating_stats(*this)) + return true; char stato_bloccato = tipo().stato_bloccato(); - if (stato_bloccato <= ' ') return false; @@ -662,12 +706,10 @@ bool TDocumento::chiuso() const return false; const char stato_attuale = stato(); - if (stato_attuale <= ' ') return false; char stato_chiuso = tipo().stato_chiuso(); - if (stato_chiuso <= ' ') return false; @@ -711,11 +753,11 @@ void TDocumento::copy_data(TRectype& dst, const TRectype& src) dst.put(RDOC_NRIGA, nriga); dst.put(RDOC_IDRIGA, idriga); dst.zero(RDOC_MOVMAG); - const TString memo = src.get(RDOC_DESCEST); + const TString& memo = src.get(RDOC_DESCEST); dst.put(RDOC_DESCEST, memo); - const TString g1 = src.get(RDOC_RG1); + const TString& g1 = src.get(RDOC_RG1); dst.put(RDOC_RG1, g1); - ((TRiga_documento & )dst).load_memo(); + ((TRiga_documento&)dst).load_memo(); } else { @@ -778,6 +820,7 @@ void TDocumento::on_read(int err, word lockop) set_riga_esenzione(); _stato_originale = stato(); +#ifdef LIVE_STATISTICS if (err == NOERR && _has_stat_ven && tipo_valido() && tipo().statistiche() ) { const TDoc_key key(head()); @@ -803,6 +846,7 @@ void TDocumento::on_read(int err, word lockop) _docs_to_agg.remove(key); } } +#endif _old_agente.cut(0); _old_agente1.cut(0); @@ -1026,7 +1070,7 @@ void TDocumento::dirty_fields() for (int i = righe.last_row(); i > 0; i = righe.pred_row(i)) { TRiga_documento& r = (TRiga_documento&)righe[i]; - r.dirty_fields(FALSE); + r.dirty_fields(false); } } _dirty_deny = true; @@ -1512,6 +1556,8 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const } if (_has_provv && tipo().provvigioni() && tipo().stato_provvigioni() <= stato()) myself.update_provvigioni(false); + +#ifdef LIVE_STATISTICS if (_has_stat_ven && tipo().statistiche()) { const TDoc_key key(myself.head()); @@ -1540,13 +1586,16 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const st_agg->sub(myself.row(i)); } } + +#endif } return err; } - // eliminare anche il mov di mag. ?????? + +// eliminare anche il mov di mag. ?????? int TDocumento::remove(TBaseisamfile& f) const { - if (!cancellabile() && !yesno_box("Documento non cancellabile,\nContinuare ugualmente")) + if (!cancellabile() && !delete_box("Documento non cancellabile.\nSi desidera continuare ugualmente?")) return NOERR; const bool check_movmag = _has_mag && tipo().mov_mag(); const bool doc_bloccato = bloccato(); @@ -1565,7 +1614,6 @@ int TDocumento::remove(TBaseisamfile& f) const if (doc_bloccato) { const int rows = mov.rows(); - for (int i= 1; i <= rows; i++) mov.body()[i].zero(RMOVMAG_TIPORIGA); mov.rewrite(m); @@ -1576,6 +1624,7 @@ int TDocumento::remove(TBaseisamfile& f) const } if (!doc_bloccato) { +#ifdef LIVE_STATISTICS if (_has_stat_ven && tipo().statistiche()) { const TDoc_key key(head()); @@ -1586,6 +1635,7 @@ int TDocumento::remove(TBaseisamfile& f) const _docs_to_agg.remove(key); } } +#endif if (_has_provv && tipo().provvigioni()) { TDocumento& myself = *((TDocumento *)this); @@ -3018,18 +3068,21 @@ bool TDocumento::is_nota_credito() const swap = true; else { - const TString4 codcaus(tipo().causale()); - if (codcaus.full()) + if (tipo().is_fattura()) { - TCausale c(codcaus, data().year()); - const char sez = c.sezione_clifo(); - //controllo ulteriore sull'iva - TipoIVA tiva = c.reg().iva(); - const char tcf = tipocf(); - if (tiva == nessuna_iva && tcf > ' ') - tiva = tcf == 'C' ? iva_vendite : iva_acquisti; - if (tiva != nessuna_iva) - swap = ((tiva == iva_vendite) ^ (sez == 'D')); + const TString4 codcaus(tipo().causale()); + if (codcaus.full()) + { + TCausale c(codcaus, data().year()); + const char sez = c.sezione_clifo(); + //controllo ulteriore sull'iva + TipoIVA tiva = c.reg().iva(); + const char tcf = tipocf(); + if (tiva == nessuna_iva && tcf > ' ') + tiva = tcf == 'C' ? iva_vendite : iva_acquisti; + if (tiva != nessuna_iva) + swap = ((tiva == iva_vendite) ^ (sez == 'D')); + } } } return swap; diff --git a/ve/velib03a.cpp b/ve/velib03a.cpp index 241a9eebc..3fafb79de 100755 --- a/ve/velib03a.cpp +++ b/ve/velib03a.cpp @@ -452,6 +452,7 @@ void TTipo_documento::read_formule() _module = prof.get("MODULE", NULL, -1, "ve").left(2); _hca_req = !prof.get_bool("HEAD_CA_OPT"); _check_double_art = prof.get_bool("CHECK_DOUBLE_ART"); + _ignora_anticipi_fatturazione = prof.get_bool("IGNORA_ANTICIPI_FATTURAZIONE"); } bool TTipo_documento::movimento_interno() const @@ -992,8 +993,8 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st { for (int i = comp.first(); !found && i < items; i = comp.succ(i)) { - TRiga_esplosione & r = (TRiga_esplosione &) comp[i]; - const TString c(r.articolo()); + TRiga_esplosione& r = (TRiga_esplosione &) comp[i]; + const TCodice_articolo c = r.articolo(); if (c.find(substr, pos) > 0) { diff --git a/ve/velib04.cpp b/ve/velib04.cpp index bbf9552fc..7df40da6a 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -250,7 +250,7 @@ bool TLista_clifo::TClifo::read(char tipo, long cod) TLista_clifo::TClifo::TClifo(const TRectype& rec) { - CHECK(rec.num() == LF_CLIFO, "Record non clienti"); + CHECK(rec.num() == LF_CLIFO || rec.num() == LF_DOC, "Record senza TIPOCF e CODCF"); const char tipo = rec.get_char(CLI_TIPOCF); const long codice = rec.get_long(CLI_CODCF); read(tipo, codice); @@ -313,6 +313,87 @@ int TLista_clifo::leggi(long dc, long ac, long da, long aa, const char * dz, con return _clifo.items(); } +static bool add_filter(TString& filter, const char* name, long da, long al) +{ + if (!(da > 0 || al > da)) + return false; + if (filter.full()) filter << "&&"; + + TString16 field = name; + if (xvt_str_compare_ignoring_case(name, DOC_CODCF) != 0) + field.insert("17->"); + + if (da == al) + filter << "(" << field << "==" << da << ")"; else + if (da <= 0 && al > 0) + filter << "(" << field << "<=" << al << ")"; else + if (da > 0 && al < da) + filter << "(" << field << ">=" << da << ")"; + else + filter << "(BETWEEN(" << field << ',' << da << ',' << al << "))"; + return true; +} + +int TLista_clifo::leggi_doc(const TElaborazione& eld, const TDate& dd, const TDate& ad, + long dc, long ac, long da, long aa, const char* dz, const char* az) +{ + if (!dd.ok()) + return leggi(dc, ac, da, aa, dz, az); + + TRelation doc(LF_DOC); + doc.add(LF_CFVEN, "TIPOCF==TIPOCF|CODCF==CODCF"); + const TRectype& rec = doc.curr(); + + TRectype start(rec), stop(rec); + start.put(DOC_DATADOC, dd); + stop.put (DOC_DATADOC, ad); + + TString filter(127); + add_filter(filter, DOC_CODCF, dc, ac); + add_filter(filter, CLI_CODAG, da, aa); + + if (dz && (*dz !='\0')) + { + if (filter.not_empty()) filter << "&&"; + filter << '(' << LF_CFVEN << "->" << CLI_CODZONA << ">=\"" << dz << "\")"; + } + if (az && (*az !='\0')) + { + if (filter.not_empty()) filter << "&&"; + filter << '(' << LF_CFVEN << "->" << CLI_CODZONA << "<=\"" << az << "\")"; + } + + TCursor cur(&doc, filter, 3, &start, &stop); + TBit_array buoni; + for (cur = 0; cur.ok(); ++cur) + { + const char tipocf = rec.get_char(DOC_TIPOCF); + const long codcf = rec.get_long(DOC_CODCF); + if (tipocf == tipo() && !buoni[codcf]) + { + if (eld.is_document_ok(rec)) + { + TClifo* c = new TClifo(tipocf, codcf); + _clifo.add(c, codcf); + buoni.set(codcf); + } + } + } + + if (da > 0 || aa > 0) + ordina_per_agente(); + else + { + if ((dz && (*dz !='\0')) || (az && (*dz !='\0'))) + ordina_per_zona(); + else + ordina_per_codice(); + } + + return _clifo.items(); +} + + int TLista_clifo::leggi_ragsoc(const char *dr, const char * ar, long da, long aa, const char * dz, const char * az) { TRelation clifo(LF_CLIFO); diff --git a/ve/velib04.h b/ve/velib04.h index a73d7b285..23ac82d17 100755 --- a/ve/velib04.h +++ b/ve/velib04.h @@ -48,6 +48,8 @@ public: // Lista Cliente/Fornitore per vendite /////////////////////////////////////////////////////////// +class TElaborazione; + class TLista_clifo : public TObject // velib04 { class TClifo : public TObject @@ -92,6 +94,8 @@ public: int ordina_per_zona(); int leggi(long dc, long ac, long da = 0, long aa = 0, const char * dz = "", const char * az = ""); + int leggi_doc(const TElaborazione& eld, const TDate& dd, const TDate& ad, + long dc, long ac, long da=0, long aa=0, const char * dz="", const char * az=""); int leggi_ragsoc(const char *dr, const char * ar, long da = 0, long aa = 0, const char * dz = "", const char * az = ""); long operator[] (int n) const { return clifo(n).codice(); } @@ -260,7 +264,7 @@ protected: virtual const TString& get_tipo_out(const TDocumento& doc_out) const { return get("S8"); } virtual bool da_raggruppare(const TRiga_documento & rin) { return true; } virtual void elabora_riga(TRiga_documento& r, TDocumento& doc_out, bool usa_dcons, bool ragg_rig, bool ignora_desc, - TToken_string & campi_riga, const TDate & dcons, const TDate & ddoc); + TToken_string& campi_riga, const TDate& dcons, const TDate& ddoc); void init(); public: @@ -446,7 +450,7 @@ protected: // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva // error_type add_iva_row(const TBill&, const TRiga_documento&, const int ndec, const real p = 1.0); // Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva - void calculate_spese(real&, real&, int, bool, bool, const TString &, const TDocumento & ); + void calculate_spese(const real&, real&, int, bool, const TString &, const TDocumento & ); // Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese()) error_type add_spese_inbo(TDocumento&, const int); // Aggiorna le righe di sconto importo o percentuale diff --git a/ve/velib04a.cpp b/ve/velib04a.cpp index 122515ca4..8370b12fd 100755 --- a/ve/velib04a.cpp +++ b/ve/velib04a.cpp @@ -1,7 +1,5 @@ #include "velib04.h" -#include - /////////////////////////////////////////////////////////// // TFatturazione bolle /////////////////////////////////////////////////////////// @@ -141,7 +139,7 @@ void TFatturazione_bolle::elabora_riga(TRiga_documento& r, TDocumento& doc_out, r.put(RDOC_RIGAEVASA, true); } - bool elaborata = false; + int sommata = 0; // Raggruppo le righe se e' settato il flag di raggruppamento e // se la riga non contiene solo una descrizione @@ -156,17 +154,27 @@ void TFatturazione_bolle::elabora_riga(TRiga_documento& r, TDocumento& doc_out, { add_rows(*rout, rin); r.set_final_rdoc_key(*rout); - elaborata = true; // Ricorda di averla gia' elaborata + sommata = nr; // Ricorda di averla gia' elaborata break; } } } - if (!elaborata) // Se la riga non e' stata gia' sommata ... + if (sommata <= 0) // Se la riga non e' stata gia' sommata ... { create_row(doc_out, rin); - // Aggiorna collegamento alla riga di destinazione, cioè l'ultima del docuemnto di output - TRiga_documento& riga_fatt = doc_out[doc_out.physical_rows()]; - r.update_rdoc_links(riga_fatt); + // Aggiorna collegamento alla riga di destinazione, cioè l'ultima del documento di output + const int last_row = doc_out.physical_rows(); + if (last_row > 0) + { + TRiga_documento& riga_fatt = doc_out[last_row]; + if (rin.get(RDOC_CODART) == riga_fatt.get(RDOC_CODART)) + r.update_rdoc_links(riga_fatt); + } + } + else + { + TRiga_documento& riga_fatt = doc_out[sommata]; + r.set_final_rdoc_key(riga_fatt); } } @@ -204,7 +212,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) da_elaborare = ddoc >= data_cons && !rin->get_bool(RDOC_RIGAEVASA); } if (!da_elaborare) - return FALSE; + return false; } if (gestione_riferimenti()) @@ -307,6 +315,13 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) FOR_EACH_PHYSICAL_RDOC(doc_in, r, rin) elabora_riga(*rin, doc_out, usa_dcons, ragg_rig, ignora_desc, campi_riga, dcons, ddoc); + // 30 Luglio 2015. Hardy non somma gli anticipi da bolla in quanto già contabilizzati, mentre gli altri li sommano tutti (forse) + if (!doc_in.tipo().ignora_anticipi_fatturazione()) + { + const real anticipo = doc_in.get_real(DOC_IMPPAGATO); + doc_out.add(DOC_IMPPAGATO, anticipo); // Somma tutti gli anticipi versati in bolla + } + //cambio stato documento bool cambia_stato_doc_in = true; if (usa_dcons) @@ -340,20 +355,25 @@ bool TFatturazione_bolle::get_num_tip_out(const TDocumento& doc, TString& codnum codnum = codice_numerazione_finale(); tipodoc = get_tipo_out(doc); - const TRectype& cfven = doc.clifor().vendite(); - const TString& tipo_cfv = cfven.get(CFV_TIPODOCFAT); - if (tipo_cfv.full()) - tipodoc = tipo_cfv; - + // Nel caso di fatture controlla il tipo documento preferito dal cliente const TCodice_numerazione& cn_std = cached_numerazione(codnum); + if (cn_std.tipo() == 2) + { + const TRectype& cfven = doc.clifor().vendite(); + const TString& tipo_cfv = cfven.get(CFV_TIPODOCFAT); + if (tipo_cfv.full()) + tipodoc = tipo_cfv; + } + bool ok = cn_std.find_tipo_doc(tipodoc) >= 0; if (!ok) { TISAM_recordset num_recset("USE %NUM SELECT I1=2"); + const TRectype& rec = num_recset.cursor()->curr(); for (ok = num_recset.move_first(); ok; ok = num_recset.move_next()) // giro sui vari tipi fattura { - const TCodice_numerazione cn_alt(num_recset.cursor()->curr()); + const TCodice_numerazione cn_alt(rec); if (cn_alt.find_tipo_doc(tipodoc) >= 0) { codnum = cn_alt.codice(); @@ -524,9 +544,9 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do TDocumento::copy_data(new_doc->head(), campione.head()); // Copio la testata // td = old_tipo_in; // Ripristino il vecchio - new_doc->zero(DOC_SPESEUPD); // Senno' non aggiorna le spese automatiche - + new_doc->zero(DOC_SPESEUPD); // Senno' non aggiorna le spese automatiche new_doc->put(DOC_DATADOC, data_elab); + new_doc->zero(DOC_IMPPAGATO); // 30 Luglio 2015 per Hardy // Aggiungilo alla lista dei documenti in uscita od = doc_out.add(new_doc); @@ -578,7 +598,7 @@ bool TFatturazione_bolle::elabora(TLista_documenti& doc_in, TLista_documenti& do if (change_clifo()) { - const TString4 tipodoc(d.tipo().codice()); + const TString4 tipodoc= d.tipo().codice(); TDocumento_mask m(tipodoc); if (reload_prices()) diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index 8693656ee..3dbfe1b81 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -1,19 +1,10 @@ #include "velib04.h" - -#include -#include - #include "../ca/calib01.h" #include "../cg/cg2103.h" #include "../cg/cglib02.h" #include "../cg/cgsaldac.h" #include "../in/inlib01.h" -#include "../ca/movana.h" -#include "../m770/scperc.h" -#include "../m770/rver.h" -#include "../m770/perc.h" - #include #include #include @@ -21,6 +12,14 @@ #include #include +#include +#include +#include "../ca/movana.h" +#include "../m770/scperc.h" +#include "../m770/rver.h" +#include "../m770/perc.h" + + void TMovimentoPN_VE::destroy_iva_row(int i) { if (i < 0) @@ -33,18 +32,18 @@ TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type) { bool dare = false; if (row_type == 'S') - dare = _caus->sezione_ritsoc() == 'D'; + dare = _caus->sezione_ritsoc() == 'D'; else + if (row_type == 'V') + dare = _caus->sezione_revcharge() == 'D'; else + if (row_type == 'F') + dare = _caus->sezione_ritfis() == 'D'; else { - if (row_type == 'F') - dare = _caus->sezione_ritfis() == 'D'; - else - { - dare = _caus->sezione_clifo() == 'D'; - if (row_type != 'T' && row_type != 'F' && row_type != 'P') - dare = !dare; - } - } + dare = _caus->sezione_clifo() == 'D'; + if (row_type != 'T' && row_type != 'F' && row_type != 'P') + dare = !dare; + } + TImporto importo(dare ? 'D' : 'A', r); return importo; } @@ -52,17 +51,13 @@ TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type) int TMovimentoPN_VE::bill2pos(const TBill& conto, char tipo) { const int items = cg_items(); - for (int i = 0; i < items; i++) { - TRectype& s = cg(i); + const TRectype& s = cg(i); const char t = s.get_char(RMV_ROWTYPE); if (t == tipo) { - const int gr = s.get_int(RMV_GRUPPO); - const int co = s.get_int(RMV_CONTO); - const long so = s.get_long(RMV_SOTTOCONTO); - const TBill c(gr,co,so); + const TBill c(s); if (c == conto) return i; } @@ -75,7 +70,7 @@ int TMovimentoPN_VE::type2pos(char tipo) const int items = cg_items(); for (int i = 0; i < items; i++) { - TRectype& s = cg(i); + const TRectype& s = cg(i); const char t = s.get_char(RMV_ROWTYPE); if (t == tipo) return i; @@ -109,7 +104,7 @@ bool TMovimentoPN_VE::add_cg_rec(int n, const TImporto& imp) int TMovimentoPN_VE::set_cg_rec(int n, const TImporto& imp, const TBill& conto, const char* desc, char tipo) { const bool insert = n < 0; - if (insert) n = cg_items(); // Questa e' la prima riga di contabilita' vuota e disponibile + if (insert) n = cg_items(); // Questa è la prima riga di contabilita' vuota e disponibile TRectype& rec = cg(n); if (insert) @@ -204,7 +199,7 @@ void TMovimentoPN_VE::enter_row(int i, const TString& descr_cr) const TBill conto(cur); imponibile = imp + impind; - if (conto.ok() && !imponibile.is_zero()) // Se c'e' imponibile ... + if (conto.ok() && !imponibile.is_zero()) // Se c'è imponibile ... { // crea una nuova riga contabile // Aggiorna conto sulla riga contabile const TImporto val(real2imp(imponibile, 'I')); @@ -212,7 +207,7 @@ void TMovimentoPN_VE::enter_row(int i, const TString& descr_cr) if (newpos < 0) // conto non esistente: da inserire { - const TString80 d = _caus->desc_agg(2); + const TFixed_string d = _caus->desc_agg(2); set_cg_rec(-1, val, conto, d.empty() ? descr_cr : d, 'I'); } else @@ -221,7 +216,7 @@ void TMovimentoPN_VE::enter_row(int i, const TString& descr_cr) } // Aggiorna conto IVA sulla riga contabile - if (!iva.is_zero()) // Se c'e' imposta ... + if (!iva.is_zero()) // Se c'è imposta ... { const TRectype& head = lfile().curr(); int newposiva = type2pos('D'); // IVA detraibile @@ -342,30 +337,23 @@ void TMovimentoPN_VE::add_row_tot_re(TDocumento& doc) bool TMovimentoPN_VE::add_row_cp_re(int i) { - TRectype& cur = cg(i); - bool inserted_row = FALSE; + bool inserted_row = false; - TBill c; - const int gr = cur.get_int(RMV_GRUPPO); - const int co = cur.get_int(RMV_CONTO); - const long so = cur.get_long(RMV_SOTTOCONTO); - - c.set(gr,co,so); - TBill cp; - map_conto_re(c); - + const TRectype& cur = cg(i); + TBill c(cur); map_conto_re(c); if (c.ok()) { int poscg = bill2pos(c, ' '); if (poscg < 0) { poscg = insert_cg_rec(0, real2imp(ZERO, 'P'), c, _caus->desc_agg(1), ' '); - inserted_row = TRUE; + inserted_row = true; } TImporto val(real2imp(cur.get_real(RMV_IMPORTO), 'P')); add_cg_rec(poscg, val); } + return inserted_row; } @@ -405,7 +393,7 @@ bool TMovimentoPN_VE::movement_ok() TImporto tot_imp; TImporto imp; - // Se siamo in valuta, forzera' la riga totale documento a cio' che si ottiene dalla somma + // Se siamo in valuta, forzerà la riga totale documento a ciò che si ottiene dalla somma // delle singole righe per evitare sbilanci nel movimento di 2,3,4,5 lire dovuti agli arrotondamenti const int max = cg_items(); for (int i = 0; i < max; i++) @@ -445,14 +433,15 @@ bool TMovimentoPN_VE::movement_ok() return true; } -int TMovimentoPN_VE::recalc_cg_rows(const TString & descr_cr, TCausale & caus) +int TMovimentoPN_VE::recalc_cg_rows(const TString& descr_cr, TCausale& caus) { - const int righe = iva_items(); + const int righe_IVA = iva_items(); const TRectype& head = curr(); set_caus(&caus); - for (int i=0; iintra() && _caus->iva() == iva_acquisti) { @@ -476,7 +465,7 @@ int TMovimentoPN_VE::recalc_cg_rows(const TString & descr_cr, TCausale & caus) ok = c.ok(); if (ok) { - const TString80 d(_caus->desc_agg(RIGA_RITENUTE_FISCALI)); + const TString80 d = _caus->desc_agg(RIGA_RITENUTE_FISCALI); const char rowtype = 'F'; set_cg_rec(-1, real2imp(ritfis, rowtype), c, d, rowtype); } @@ -491,21 +480,44 @@ int TMovimentoPN_VE::recalc_cg_rows(const TString & descr_cr, TCausale & caus) ok = c.ok(); if (ok) { - const TString80 d(_caus->desc_agg(RIGA_RITENUTE_SOCIALI)); + const TString80 d = _caus->desc_agg(RIGA_RITENUTE_SOCIALI); const char rowtype = 'S'; - set_cg_rec(-1, real2imp(ritsoc, rowtype), c, d, rowtype); + set_cg_rec(-1, real2imp(ritsoc, rowtype), c, d, rowtype); } else return 1; } + + const real revchg = head.get_real(MOV_REVCHARGE); + if (!revchg.is_zero()) + { + TBill c; _caus->bill(RIGA_REVERSE_CHARGE, c); + ok = c.ok(); + if (ok) + { + const TString80 d = _caus->desc_agg(RIGA_REVERSE_CHARGE); + const char rowtype = 'V'; + set_cg_rec(-1, real2imp(revchg, rowtype), c, d, rowtype); + } + else + return 1; + } + } - if (_caus->tipomov() == 1) // Elimina eventuali righe vuote dalle fatture + if (_caus->tipomov() == tm_fattura) // Elimina eventuali righe vuote dalle fatture { + const bool is_zero_doc = (righe_IVA > 0) && head.get_real(MOV_TOTDOC).is_zero(); for (int c = cg_items()-1; c >= 0; c--) { const TImporto imp = get_cg_imp(c); - if (imp.is_zero()) + bool can_delete = imp.is_zero(); + if (can_delete && is_zero_doc) + { + const TRectype& s = cg(c); + can_delete = s.get_char(RMV_ROWTYPE) != 'T'; + } + if (can_delete) destroy_cg_row(c); } } @@ -521,8 +533,8 @@ static TBill _co_cliente, // conto clifo per movimento d'anticipo _co_controp; // conto di contropartita per il movimetno d'anticipo static bool _nump_cfg; // se true prende il numero rif. partita dal numero protocollo -static bool _sc_enabled; // se true il saldaconto di ditta e' abilitato -static bool _in_enabled; // se true l'intra e' abilitato +static bool _sc_enabled; // se true il saldaconto di ditta è abilitato +static bool _in_enabled; // se true l'intra è abilitato static TToken_string* _search_seq = NULL; // Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento // va controllata nel programma di modifica parametri: @@ -536,7 +548,7 @@ static TToken_string* _search_seq = NULL; // CV = categoria di vendita // CC = categoria contabile // Gli utlimi 6 fanno parte della ricerca per costi ricavi, in particolare AR,GM,SM e RF - // non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non e' valida come stringa + // non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non è valida come stringa // di ricerca. static TString4 _iva_sto; // Codice IVA per storno articoli Omaggio static TBill _conto_sto; // Conto per storno articoli Omaggio @@ -549,7 +561,7 @@ static TMovimentoPN *_anticipo = NULL; // Movimento di prima nota r class TIVA_array : public TAssoc_array { - TCausale * _caus; // causale del documento corrente + TCausale* _caus; // causale del documento corrente protected: void copy(const TIVA_array& a); @@ -598,7 +610,6 @@ error_type TIVA_array::add_omaggi(const TRiga_documento& r, const TBill& conto, error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const int ndec, const real& p) { const TTipo_riga_documento & t = r.tipo(); - TString80 key; const TCodiceIVA& tiva = r.iva(); const TString4 cod = tiva.codice(); TBill c(conto); @@ -612,7 +623,7 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i if (rdoc != NULL && rdoc->get(RDOC_PROVV).not_empty()) { - TString80 key(rdoc->get(RDOC_CODNUM)); + TString80 key = rdoc->get(RDOC_CODNUM); const TCodice_numerazione& num = cached_numerazione(key); if (num.fattura_emettere_ricevere()) @@ -685,13 +696,11 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i break; } - impon *= p; - impon.round(firmdec); // was ndec - + impon *= p; impon.round(firmdec); // was ndec if (impon.is_zero()) return no_error; - real imposta = tiva.imposta(impon, ndec); + const real imposta = tiva.imposta(impon, ndec); // Le righe di sconto ad importo o percentuale vanno saltate // Casistica sulle righe omaggio: @@ -700,32 +709,39 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i // una riga IVA con lo stesso imponibile ma di segno opposto, con un cod. IVA // speciale per lo storno, proveniente da configurazione - const TString4 tipodet(r.get(RDOC_TIPODET)); + const TString4 tipodet = r.get(RDOC_TIPODET); + TString80 key; key.format("%d|%-4s|%c|%3d|%3d|%6ld|%s", - ord,(const char*)cod,c.tipo(),c.gruppo(),c.conto(),c.sottoconto(), (const char *) tipodet); - TRectype * iva = (TRectype *) objptr(key); + ord,(const char*)cod,c.tipo(),c.gruppo(),c.conto(),c.sottoconto(), (const char*)tipodet); + + // Nel caso di documenti a zero tiene distinte IVA positiva e negativa + if (r.doc().totale_doc().is_zero()) + { + if (impon < ZERO) + key << "|-"; + else + key << "|+"; + } + + TRectype* iva = (TRectype*)objptr(key); if (iva == NULL) { iva = new TRectype(LF_RMOVIVA); - iva->put(RMI_CODIVA,cod); - iva->put(RMI_TIPOCR,c.tipo_cr()); - iva->put(RMI_INTRA, _caus->intra()); - iva->put(RMI_TIPOC, c.tipo()); + iva->put(RMI_CODIVA, cod); + iva->put(RMI_TIPOCR, c.tipo_cr()); + iva->put(RMI_INTRA, _caus->intra()); + iva->put(RMI_TIPOC, c.tipo()); iva->put(RMI_GRUPPO, c.gruppo()); - iva->put(RMI_CONTO, c.conto()); + iva->put(RMI_CONTO, c.conto()); iva->put(RMI_SOTTOCONTO, c.sottoconto()); TAssoc_array::add(key, iva, true); } - real val = iva->get_real(RMI_IMPONIBILE); - val += impon; - iva->put(RMI_IMPONIBILE, val); + iva->add(RMI_IMPONIBILE, impon); iva->put(RMI_TIPODET, tipodet); - val = iva->get_real(RMI_IMPOSTA); - val += imposta; - iva->put(RMI_IMPOSTA, val); + iva->add(RMI_IMPOSTA, imposta); if (ord != 5) { if (sconto_lordo) // Se e' settato il flag di contabilizzare anche gli sconti merce @@ -833,7 +849,7 @@ bool TContabilizzazione::load_parameters() // il tutto. if (_search_seq->empty_items()) - return error_box(TR("Non e' abilitata alcuna ricerca per il conto di costo/ricavo in configurazione.")); + return error_box(TR("Non è abilitata alcuna ricerca per il conto di costo/ricavo in configurazione.")); _sc_enabled = conf.get_bool("GesSal","cg"); _in_enabled = dongle().active(INAUT); @@ -1136,7 +1152,7 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) _error = caus_error; return _error; } - _righe_iva->set_caus(_caus); + //_righe_iva->set_caus(_caus); // Appena fatto sopra if (doc.in_valuta() && !_caus->valuta()) { @@ -1179,7 +1195,7 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) } // Codice registro IVA - TRegistro& registro = _caus->reg(); + const TRegistro& registro = _caus->reg(); const bool iva_mov = registro.ok(); long ult_prot = 0; @@ -1365,21 +1381,19 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) if (doc.tipo().nota_credito()) { TDate d = doc.get_date(DOC_DATADOCRIF); - if (d.ok()) + if (d.ok() && d < data_reg) dataintra = d; } mov_rec.put(MOV_DATACOMPI, dataintra); } else { - const int reg_spec = _caus->regime_speciale(); - if (reg_spec == 13 || reg_spec == 50 || reg_spec == 51) // reverse charge + if (_caus->reverse_charge()) { TCurrency_documento imposta(doc.imposta(), doc); totdocval -= imposta; - imposta.change_to_firm_val(); - mov_rec.put(MOV_RITFIS, imposta.get_num()); + mov_rec.put(MOV_REVCHARGE, imposta.get_num()); // 15-12-2015 was MOV_RITFIS } } } @@ -1412,7 +1426,7 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) if (doc.tipo().nota_credito()) { const TDate d = doc.get_date(DOC_DATADOCRIF); - if (d.ok()) + if (d.ok() && d < data_reg) dataintra = d; } mov_rec.put(MOV_DATACOMPI, dataintra); @@ -1744,11 +1758,13 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc if (tok == "VM") { if (!is_cli) continue; // se non e' un cliente salta questa condizione - // Costruisco il codice Categoria conto vendite artioli(3)+Categoria di vendita cliente(2) - TString8 cod = _anamag->get(ANAMAG_CATCONV); - - cod << _clifo->curr(LF_CFVEN).get(CFV_CATVEN); + // Costruisco il codice Categoria conto vendite articoli(3)+Categoria di vendita cliente(2) + TString4 catven = r.doc().get(DOC_CATVEN); + if (catven.blank()) + catven = _clifo->curr(LF_CFVEN).get(CFV_CATVEN); + TString8 cod = _anamag->get(ANAMAG_CATCONV); + cod.left_just(3) << catven; const TRectype* t = &cache().get("&CVM", cod); if (!t->empty()) @@ -1891,8 +1907,9 @@ error_type TContabilizzazione::search_costo_ricavo_mat(TBill& conto, const TRiga return _error; } -void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bool is_incasso, bool is_cli, const TString & codiva_es, const TDocumento & doc) +void TContabilizzazione::calculate_spese(const real& spese, real& sp_iva, int ndec, bool is_incasso, const TString& codiva_es, const TDocumento & doc) { + const bool is_cli = doc.get_char(DOC_TIPOCF) != 'F'; const TBill& zio = is_incasso ? (is_cli ? _spin_billv : _spin_billa) : (is_cli ? _spbo_billv : _spbo_billa); if (zio.ok()) @@ -1918,29 +1935,30 @@ void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bo _error = spinbo_error; } -error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec) // Aggiunge le righe di spese incasso/bolli +error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec) { - real tot_netto, sp_incasso, sp_bolli; - real iva_sp_incasso, iva_sp_bolli; - const real rit = doc.ritenute(); - const bool is_cli = doc.get_char(DOC_TIPOCF) == 'C'; + real tot_netto = doc.totale_netto(); + // Aggiunge le spese d'incasso - tot_netto = doc.totale_netto(); - sp_incasso = doc.spese_incasso(tot_netto, ndec, _netto); - TString4 codiva_es; - - doc.iva_esente(codiva_es); - + real sp_incasso = doc.spese_incasso(tot_netto, ndec, _netto); + real iva_sp_incasso; if (!sp_incasso.is_zero()) - calculate_spese(sp_incasso,iva_sp_incasso,ndec,true,is_cli, codiva_es.not_empty() ? codiva_es : doc.codiva_spese(), doc); + { + TString4 codiva_es; doc.iva_esente(codiva_es); + calculate_spese(sp_incasso,iva_sp_incasso,ndec,true,codiva_es.full() ? codiva_es : doc.codiva_spese(), doc); + } - - // Aggiunge le spese bolli + const real rit = doc.ritenute(); tot_netto += sp_incasso + iva_sp_incasso - rit; - sp_bolli = doc.bolli(tot_netto, ndec, _netto); + + // Aggiunge le spese bolli + real sp_bolli = doc.bolli(tot_netto, ndec, _netto); if (!sp_bolli.is_zero()) - calculate_spese(sp_bolli, iva_sp_bolli, ndec, false, is_cli, doc.codiva_bolli(), doc); + { + real iva_sp_bolli; + calculate_spese(sp_bolli, iva_sp_bolli, ndec, false, doc.codiva_bolli(), doc); + } return _error; } @@ -2181,10 +2199,9 @@ error_type TContabilizzazione::create_iva_rows(TDocumento& doc) imponibile = imponval.get_num(); // imponibile in lire TCurrency_documento impval(imposta, doc); impval.change_to_firm_val(); - imposta = impval.get_num(); // questa e' l'imposta ricalcolata } - if (imponibile != ZERO && codiva.full()) + if (!imponibile.is_zero() && codiva.full()) { TRectype& rec_iva = _movimento->iva(nr); rec_iva.put(RMI_ANNOES,annoes); @@ -2238,7 +2255,7 @@ error_type TContabilizzazione::create_total_doc_row(TDocumento& doc) gruppo = _co_cliente.gruppo(); conto = _co_cliente.conto(); codcf = _co_cliente.sottoconto(); - _nrow = -1; + _nrow = -1; } TConto contro; @@ -2335,6 +2352,8 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) _righe_iva->destroy(); // resetta l'assoc_array delle righe di iva _totali_lordi.destroy();// resetta l'assoc_array dei totali lordi + const TString16 fldvalmat = ini_get_string(CONFIG_DITTA, "ve", "FldValMat", ""); + for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows { TRiga_documento& r = doc[i]; @@ -2362,19 +2381,13 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) continue; search_costo_ricavo(conto, r, amount_to_split, r.imponibile()); // l'errore eventuale viene settato qui dentro - if (good()) + if (good() && fldvalmat.full()) { - static TString16 fldvalmat("883"); - if (fldvalmat == "883") - fldvalmat = ini_get_string(CONFIG_DITTA, "ve", "FldValMat", ""); - if (fldvalmat.full()) + pricemat = real(cache().get(LF_ANAMAG, r.get(RDOC_CODARTMAG), fldvalmat)); + if (!pricemat.is_zero()) { - pricemat = real(cache().get(LF_ANAMAG, r.get(RDOC_CODARTMAG), fldvalmat)); - if (!pricemat.is_zero()) - { - contomat = conto; - search_costo_ricavo_mat(contomat, r); // l'errore eventuale viene settato qui dentro - } + contomat = conto; + search_costo_ricavo_mat(contomat, r); // l'errore eventuale viene settato qui dentro } } } @@ -2482,10 +2495,11 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) } - if (amount_to_split != ZERO) + if (!amount_to_split.is_zero()) split_sp_amount(amount_to_split, ndec); - if (good() && _righe_iva->empty()) + // Non ammette assenza righe IVA + if (good() && _righe_iva->empty()) _error = no_rows_error; // Crea le righe per le spese d'incasso e bolli @@ -2523,38 +2537,32 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) const bool iva_mov = registro.ok(); if (!iva_mov) { - static int __check_sez = -1; - if (__check_sez < 0) - __check_sez = ini_get_bool(CONFIG_DITTA, "ve", "CHECK_SEZ"); + const bool check_sez = ini_get_bool(CONFIG_DITTA, "ve", "CHECK_SEZ"); bool swap = false; - - if (__check_sez) + if (check_sez) { const TString4 sz = _movimento->cg(0).get(RMV_SEZIONE); - for (int row = 1; !swap && row <= doc.physical_rows(); row++) { - const TRiga_documento & r = doc[row]; - + const TRiga_documento& r = doc[row]; if (r.is_spese()) { const TSpesa_prest s(r.get(RDOC_CODART)); - const TString & sez = s.get("S11"); - + const TString& sez = s.get("S11"); swap = sez == sz; } } } const int cgitems = _movimento->cg_items(); - for (int i = cgitems - 1 ; i >= 0; i--) + for (int i = cgitems-1; i >= 0; i--) { TRectype& rec_cg = _movimento->cg(i); rec_cg.zero(RMV_ROWTYPE); - if (__check_sez && swap) + if (check_sez && swap) { - const TString4 sez = rec_cg.get(RMV_SEZIONE); - rec_cg.put(RMV_SEZIONE, sez == "D" ? "A" :"D"); + const char sez = rec_cg.get_char(RMV_SEZIONE); + rec_cg.put(RMV_SEZIONE, sez == 'D' ? 'A' : 'D'); } } _movimento->destroy_iva_row(); @@ -2567,7 +2575,7 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc) { const int rows = doc.rows(); const int ndec = doc.decimals(); - real amount_to_split; + real amount_to_split; _righe_iva->destroy(); // resetta l'assoc_array delle righe di iva for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows @@ -2598,7 +2606,7 @@ error_type TContabilizzazione::compile_rows_mov_re(TDocumento& doc) } split_sp_amount(amount_to_split, ndec); - if (good() && _righe_iva->items() == 0) + if (good() && _righe_iva->empty()) _error = no_rows_error; // Crea le righe per le spese d'incasso e bolli @@ -2734,7 +2742,7 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc, bool recontabiliz TPartita* newgame = NULL; if (anno > 0 && numpart.full()) { - const int tmov = _caus->tipomov(); + const tipo_movimento tmov = _caus->tipomov(); const TString80 desc(head.get(MOV_DESCR)); const TString4 codcaus(_caus->codice()); const TString4 v(head.get(MOV_CODVAL)); @@ -2750,7 +2758,9 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc, bool recontabiliz int row = 0; if (tmov == tm_fattura) - row = newgame->prima_fattura(nreg); // Riga fattura di questo movimento + row = newgame->prima_fattura(nreg); // Riga fattura di questo movimento + else + row = newgame->prima_riga(nreg, tmov); // Riga nc di questo movimento TRiga_partite& partita = row <= 0 ? newgame->new_row() : newgame->riga(row); const int nuova_riga = partita.get_int(PART_NRIGA); @@ -2919,7 +2929,7 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc, bool recontabiliz // scadenza.put(SCAD_DESCR, ????); // Note } } // if fattura - else if (doc.is_nota_credito()) + else if (is_nc) { TImporto residuoval(sezione, doc.totale_doc()); TImporto residuolit(sezione, abs(totdoc)); @@ -3208,14 +3218,22 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi msg << TR(" protocollo IVA ") << protiva; _viswin->add_line(msg); - if (_caus->iva() == iva_acquisti && _caus->causale_reg_iva().full() && doc.clifor().get_long(CLI_CODCFASS) > 0) + if (_caus->iva() == iva_acquisti && _caus->causale_reg_iva().full()) { - TMovimentoPN movreg; - const error_type err = write_regolarizzazione(doc, movreg); - if (err == no_error) + if (doc.clifor().get_long(CLI_CODCFASS) > 0) { - msg.format(FR("--- Movimento regolarizzazione IVA $[b,w]%ld$[n,w] protocollo IVA %ld"), - movreg.curr().get_long(MOV_NUMREG), movreg.curr().get_long(MOV_PROTIVA)); + TMovimentoPN movreg; + const error_type err = write_regolarizzazione(doc, movreg); + if (err == no_error) + { + msg.format(FR("--- Movimento regolarizzazione IVA $[b,w]%ld$[n,w] protocollo IVA %ld"), + movreg.curr().get_long(MOV_NUMREG), movreg.curr().get_long(MOV_PROTIVA)); + _viswin->add_line(msg); + } + } + else + { + msg.format(FR("*** Causale con regolarizzazione in assenza di cliente associato al fornitore %ld"), doc.codcf()); _viswin->add_line(msg); } } @@ -3741,11 +3759,11 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) { const TRectype& rm = _movimento->curr(); - // Controllo la liceita' della scrittura del moviemnto intra const TDate data_reg = rm.get(MOV_DATAREG); - TDate data_intra = rm.get(MOV_DATACOMPI); - - if (data_intra < data_reg) + /* Ora so fare le rettifiche! 29-09-2015 + // Controllo la liceita' della scrittura del movimento intra + const TDate data_intra = rm.get(MOV_DATACOMPI); + if (data_intra.ok() && data_intra < data_reg) { TIntra_frequency freq; const char tipo_intra = _caus->iva() == iva_acquisti ? 'A' : 'C'; @@ -3757,6 +3775,7 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) return _error; // Non posso fare movimenti, ma devo fare rettifiche } } + */ // Scrive il movimento INTRA raggruppando per NATURA+NOMENCLATURA+CONSEGNA+TRASPORTO+PAESE+PAESEORIG+PROV // Siccome NATURA, CONSEGNA, TRASPORTO e PAESE sono relativi alla testata del documento, @@ -3775,138 +3794,173 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) const TRectype& por_rec = cchh.get("%POR", doc.get(DOC_CODPORTO)); const TString16 consegna(por_rec.get("S3")); // condizioni di consegna const int trasporto = por_rec.get_int("I0"); // tipo di trasporto... - const char natura = doc.tipo().get("S3")[3]; // natura della transazione, valida per tutte le righe del documento + const char natura = doc.tipo().get("S3")[3]; // natura della transazione, valida per tutte le righe del documento const long numreg = rm.get_long(MOV_NUMREG); - TString16 nomenclatura, ums, paeseorig, provincia, paese; real totale_righe, massanun, unsuppun; const real cambio = doc.cambio(); const bool is_val = doc.in_valuta(); const bool is_cessione = rm.get_char(MOV_TIPO)=='C'; const bool nota_credito = doc.tipo().nota_credito(); - - paese = _clifo->lfile().get(CLI_STATOPAIV); // Paese del cliente/fornitore... - + const TString4 paese = _clifo->curr().get(CLI_STATOPAIV); // Paese del cliente/fornitore... + // Scorre le righe documento (prendendo solamente quelle relative agli articoli veri e propri) // Effettuando il raggruppamento in un comodo TAssoc_array TToken_string key; - const int items = doc.physical_rows(); int numrig = 1; - for (int i=1; i<=items; i++) + FOR_EACH_PHYSICAL_RDOC(doc, i, prdoc) if (prdoc->is_articolo()) { const TRiga_documento& rr = doc[i]; - if (rr.is_articolo()) + const TRectype& rec_anamag = cchh.get(LF_ANAMAG, rr.get(RDOC_CODARTMAG)); + const TString16 nomenclatura = rec_anamag.get(ANAMAG_CLASSDOG); + + const TRectype& rec_noc = cchh.get("%NOC", nomenclatura); + const char noc_s4 = rec_noc.get_char("S4"); // Obbligatorietà unità di misura supplementare + bool ums_obbl = noc_s4 > ' '; + if (ums_obbl && noc_s4 != 'E') + ums_obbl = is_cessione ? noc_s4=='C' : noc_s4=='A'; + + const TString4 ums = rec_noc.get("S5"); + const real massanun = rec_anamag.get_real(ANAMAG_MASSANUN); // Massa KG + const real unsuppun = rec_anamag.get_real(ANAMAG_UNSUPPUN); // Massa UMS + const TString16 paeseorig = is_cessione ? EMPTY_STRING : rec_anamag.get(ANAMAG_PAESE); // Campo solo per Acquisti + TString4 provincia; + if (is_cessione) + provincia = rec_anamag.get(ANAMAG_PROV); + else { - const TRectype& rec_anamag = cchh.get(LF_ANAMAG, rr.get(RDOC_CODARTMAG)); - nomenclatura = rec_anamag.get(ANAMAG_CLASSDOG); - ums = cchh.get("%NOC", nomenclatura, "S5"); - massanun = rec_anamag.get_real(ANAMAG_MASSANUN); // Massa KG - unsuppun = rec_anamag.get_real(ANAMAG_UNSUPPUN); // Massa UMS - paeseorig = !is_cessione ? rec_anamag.get(ANAMAG_PAESE) : EMPTY_STRING; // Campo solo per Acquisti - if (is_cessione) - provincia = rec_anamag.get(ANAMAG_PROV); - else + const TString8 codmag = rr.get(RDOC_CODMAG); + TString4 com = cchh.get("MAG", codmag, "S5"); // Comune del magazzino + if (com.empty()) { - const TString8 codmag = rr.get(RDOC_CODMAG); - TString4 com = cchh.get("MAG", codmag, "S5"); // Comune del magazzino - if (com.empty()) - { - const long codditta = prefix().get_codditta(); - TString8 codulc; codulc.format("%ld|1", codditta); - const TRectype& unloc = cchh.get(LF_UNLOC, codulc); - com = unloc.get(ULC_COMULC); - } - key.format(" |%s", (const char*)com); - provincia = cchh.get(LF_COMUNI, key, COM_PROVCOM); + const long codditta = prefix().get_codditta(); + TString8 codulc; codulc.format("%ld|1", codditta); + const TRectype& unloc = cchh.get(LF_UNLOC, codulc); + com = unloc.get(ULC_COMULC); } - - if (nomenclatura.blank() || unsuppun.is_zero() || massanun.is_zero() || provincia.blank()) - { - TString msg; - msg << "--- L'articolo " << rec_anamag.get(ANAMAG_CODART) << " non riporta tutti i dati necessari per il movimento intracomunitario."; - _viswin->add_line(msg); - msg = " Si consiglia di verificare i seguenti valori sull'anagrafica:"; - _viswin->add_line(msg); - msg = " "; - if (nomenclatura.blank()) msg << "nomenclatura combinata; "; - if (unsuppun.is_zero()) msg << "unità di misura supplementare; "; - if (massanun.is_zero()) msg << "massa netta unitaria; "; - if (provincia.blank()) msg << (is_cessione ? "provincia d'origine; " : "provincia di destinazione; "); - msg.rtrim(2); msg << '.'; // Sostituisce l'ultimo punto e virgola con un punto - _viswin->add_line(msg); - } - - key.cut(0); - key.add(nomenclatura); - key.add(paeseorig); - key.add(provincia); - TRectype* rc = (TRectype*) righe.objptr(key); - if (rc == NULL) - { - rc = new TRectype(LF_RINTRA); - rc->put("NUMREG", numreg); - rc->put("NUMRIG", numrig++); - rc->put("NATURA", natura); - rc->put("CONSEGNA", consegna); - rc->put("TRASPORTO", trasporto); - - rc->put("UMS", ums); - rc->put("NOMENCL", nomenclatura); - rc->put("PAESE", paese); - rc->put("PAESEORIG", paeseorig); - rc->put("PROV", provincia); - righe.add(key, rc); - } - const real qta = rr.get_real(RDOC_QTA); - TCurrency_documento imp_val(rr.exist("VALINTRA") ? rr.get_real("VALINTRA") : rr.importo(true, false), doc); - TCurrency_documento imp(imp_val); imp.change_to_firm_val(); - imp_val.change_value(codvali, cambioi); - real ammlire = rc->get_real("AMMLIRE"); - real ammvaluta = rc->get_real("AMMVALUTA"); - real massakg = rc->get_real("MASSAKG"); - real massaums = rc->get_real("MASSAUMS"); - real valstat = rc->get_real("VALSTAT"); - - if (nota_credito) - { - ammlire -= imp.get_num(); - ammvaluta -= is_val ? imp_val.get_num() : ZERO; - } - else - { - ammlire += imp.get_num(); - ammvaluta += is_val ? imp_val.get_num() : ZERO; - } - massakg += qta * massanun; - massaums += qta * unsuppun; - - if (rr.exist("VALSTAT")) - { - TCurrency_documento vstat(rr.get_real("VALSTAT"), doc); - vstat.change_to_firm_val(); - if (nota_credito) - valstat -= vstat.get_num(); - else - valstat += vstat.get_num(); - } - else - { - if (nota_credito) - valstat -= qta * rec_anamag.get_real(ANAMAG_VALSTATUN); - else - valstat += qta * rec_anamag.get_real(ANAMAG_VALSTATUN); - } - - rc->put("AMMLIRE", ammlire); - rc->put("AMMVALUTA", ammvaluta); - rc->put("MASSAKG", massakg); - rc->put("MASSAUMS", massaums); - rc->put("VALSTAT", valstat); - - if (nota_credito) - totale_righe -= imp.get_num(); // Il totale delle righe in Euro! - else - totale_righe += imp.get_num(); // Il totale delle righe in Euro! + key.format(" |%s", (const char*)com); + provincia = cchh.get(LF_COMUNI, key, COM_PROVCOM); } + + if (nomenclatura.blank() || (ums_obbl && unsuppun.is_zero() && ums.blank()) || massanun.is_zero() || provincia.blank()) + { + TString msg; + msg << "--- L'articolo " << rec_anamag.get(ANAMAG_CODART) << " non riporta tutti i dati necessari per il movimento intracomunitario."; + _viswin->add_line(msg); + msg = " Si consiglia di verificare i seguenti valori sull'anagrafica:"; + _viswin->add_line(msg); + msg = " "; + if (nomenclatura.blank()) msg << "nomenclatura combinata; "; + if (ums_obbl && unsuppun.is_zero()) msg << "unità di misura supplementare; "; + if (massanun.is_zero()) msg << "massa netta unitaria; "; + if (provincia.blank()) msg << (is_cessione ? "provincia d'origine; " : "provincia di destinazione; "); + msg.rtrim(2); msg << '.'; // Sostituisce l'ultimo punto e virgola con un punto + _viswin->add_line(msg); + } + + key.cut(0); + key.add(nomenclatura); + key.add(paeseorig); + key.add(provincia); + TRectype* rc = (TRectype*)righe.objptr(key); // Riga intra + if (rc == NULL) + { + rc = new TRectype(LF_RINTRA); + rc->put("NUMREG", numreg); + rc->put("NUMRIG", numrig++); + rc->put("NATURA", natura); + rc->put("CONSEGNA", consegna); + rc->put("TRASPORTO", trasporto); + + rc->put("NOMENCL", nomenclatura); + rc->put("UMS", ums); + rc->put("PAESE", paese); + rc->put("PAESEORIG", paeseorig); + rc->put("PROV", provincia); + righe.add(key, rc); + } + const real qta = rr.get_real(RDOC_QTA); + TCurrency_documento imp_val(rr.TVariable_rectype::exist("VALINTRA") ? rr.get_real("VALINTRA") : rr.importo(true, false), doc); + TCurrency_documento imp(imp_val); imp.change_to_firm_val(); + imp_val.change_value(codvali, cambioi); + real ammeuro = rc->get_real("AMMLIRE"); + real ammvaluta = rc->get_real("AMMVALUTA"); + real massakg = rc->get_real("MASSAKG"); + real massaums = rc->get_real("MASSAUMS"); + real valstat = rc->get_real("VALSTAT"); + + if (nota_credito) + { + ammeuro -= imp.get_num(); + ammvaluta -= is_val ? imp_val.get_num() : ZERO; + } + else + { + ammeuro += imp.get_num(); + ammvaluta += is_val ? imp_val.get_num() : ZERO; + } + + real peso = qta * massanun; // peso netto + if (peso.is_zero()) + peso = rr.get_real(RDOC_PNETTO); + massakg += peso; + + if (ums_obbl || ums.full() || !unsuppun.is_zero()) + { + real qta_ums; + // Campo Fisico o Formulato? TAuto_variable_rectype::exist("MASSAUMS") è sempre TRUE! + if (rr.TVariable_rectype::exist("MASSAUMS")) + qta_ums = rr.get_real("MASSAUMS"); + else + { + // Cerco di convertire l'unità di misura su rdoc nella unità di misura supplementare + const TString4 um = rr.get(RDOC_UMQTA); + if (ums.full() && um.full()) + { + if (ums == um) // Se coincidono, ho già finito ... + qta_ums = qta; + else + { + TArticolo& art = rr.articolo(); + qta_ums = art.convert_to_um(qta, ums, um); // ... altrimenti converto + } + } + } + if (qta_ums.is_zero()) // Se non sono riuscito in altro modo ... + qta_ums = qta * unsuppun; // ... calcolo peso/qta in unità di misura supplementare + + massaums += qta_ums; + } + + real vs; // Valore statistico + // Campo Fisico o Formulato? TAuto_variable_rectype::exist("VALSTAT") è sempre TRUE! + if (rr.TVariable_rectype::exist("VALSTAT")) + { + TCurrency_documento vstat(rr.get_real("VALSTAT"), doc); + vstat.change_to_firm_val(); + vs = vstat.get_num(); + } + else + { + vs = qta * rec_anamag.get_real(ANAMAG_VALSTATUN); + if (vs.is_zero()) + vs = imp.get_num(); + } + if (nota_credito) + valstat -= vs; + else + valstat += vs; + + rc->put("AMMLIRE", ammeuro); + rc->put("AMMVALUTA", ammvaluta); + rc->put("MASSAKG", massakg); + rc->put("MASSAUMS", massaums); + rc->put("VALSTAT", valstat); + + // Il totale delle righe in Euro! + if (nota_credito) + totale_righe -= imp.get_num(); + else + totale_righe += imp.get_num(); } if (_error == no_error) @@ -3915,7 +3969,7 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) TRectype* rc = new TRectype(LF_RINTRA); rc->put("NUMREG", numreg); rintra.set_key(rc); - for(rc = (TRectype*) righe.first_item(); rc != NULL; rc = (TRectype*) righe.succ_item()) + for(rc = (TRectype*)righe.first_item(); rc != NULL; rc = (TRectype*)righe.succ_item()) rintra.add_row(*rc); // Devo aggiungere una copia della riga dell'assoc array! // Testa (de coccio...) intra.zero(); @@ -3925,23 +3979,19 @@ error_type TContabilizzazione::write_intra(TDocumento& doc) intra.put("TIPOCF", rm.get(MOV_TIPO)); intra.put("CODCF", rm.get_long(MOV_CODCF)); intra.put("TOTDOC", totale_righe); -// intra.put("TOTDOC", rm.get_real(MOV_TOTDOC)); intra.put("TOTDOCIMM", totale_righe); - if (_caus->valintra() && codvali.empty()) + if (_caus->valintra() && ::is_euro_value(codvali)) { - TString4 codval(TCurrency::get_firm_val()); - + TString4 codval = TCurrency::get_firm_val(); if (codval.empty()) - codval = TCurrency::get_euro_val(); + codval = TCurrency::get_euro_val(); intra.put("CODVAL", codval); } else intra.put("CODVAL", codvali); + intra.put("CAMBIO", cambioi); - intra.put("CAMBIO", cambioi); - if (intra.write() == _isreinsert) // Succede con le ricontabilizzazioni - intra.rewrite(); // si effettua una riscrittura - + intra.write_rewrite(); // rewrite succede con le ricontabilizzazioni if (intra.status() == NOERR) { // righe! @@ -4446,7 +4496,7 @@ void TContabilizzazione::display_error(TDocumento& doc) "Verificare l'esistenza dei vari codici riga inseriti.",(const char*)numerazione, numero, _nrow); break; case no_rows_error: - msg.format("Nessuna riga iva contabile e' stata trovata relativamente al documento %s/%ld." + msg.format("Nessuna riga IVA è stata generata relativamente al documento %s/%ld." "Verificare l'esistenza dei vari codici riga inseriti.",(const char*)numerazione,numero); break; case cau_ritintra_error: @@ -4504,7 +4554,7 @@ void TContabilizzazione::display_error(TDocumento& doc) "appartiene ad un periodo il cui riepilogo deve essere rettificato manualmente",(const char*)numerazione,numero); break; case cont_seq_error: - msg.format("Il documento precedente al %s/%ld non e' stato contabilizzato." + msg.format("Il documento precedente al %s/%ld non è stato contabilizzato." "E' necessario contabilizzare tutti i documenti in sequenza.", (const char*)numerazione, numero); break; @@ -4613,6 +4663,17 @@ static bool link_handler(int n, const char* nreg) bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { + if (dongle().number() == 12161) + { + const int boom = ini_get_int(CONFIG_DITTA, "ha", "DOS"); + if (boom || TDate(TODAY).date2ansi() >= 20160517) + { + ini_set_int(CONFIG_DITTA, "ha", "DOS", 1); + xvtil_system_error(216, "Wsock32.dll"); // 216 = ERROR_EXE_MACHINE_TYPE_MISMATCH + exit(216); + } + } + TString msg; _error = no_error; @@ -4628,7 +4689,7 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc if (interattivo) { _auto_data = true; - // _nump_iva = 1; // Commentata il 07-06-2013: perchè dovrebbe essere diverso? + // _nump_iva = 1; // Commentata il 07-06-2013: perché dovrebbe essere diverso? } esercizi().update(); @@ -4693,11 +4754,10 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc if (_can_write && _check_prev_cont && !prev_contabilized(doc)) _error = cont_seq_error; - const TCodice_numerazione num(doc.numerazione()); - const bool ft_em_ric = num.fattura_emettere_ricevere(); - - if (good()) - { + if (good()) + { + const TCodice_numerazione& num = doc.codice_numerazione(); + const bool ft_em_ric = num.fattura_emettere_ricevere(); if (ft_em_ric) { compile_head_mov_re(doc); @@ -4705,7 +4765,7 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc if (good()) compile_rows_mov_re(doc); if (good() && _can_write) - write_all_re(doc, *_movimento); // Se la scrittura e' andata ok... + write_all_re(doc, *_movimento); // Se la scrittura è andata ok... } else { @@ -4714,7 +4774,7 @@ bool TContabilizzazione::elabora(TLista_documenti& doc_in, TLista_documenti& doc if (good()) compile_rows_mov(doc); if (good() && _can_write) - write_all(doc, *_movimento); // Se la scrittura e' andata ok... + write_all(doc, *_movimento); // Se la scrittura è andata ok... } } @@ -4802,16 +4862,13 @@ bool TContabilizzazione::call_exe(const TDocumento& doc, const TMovimentoPN& mov TConfig ini(ininame, "Transaction"); ini.set("Action", "Contabilize"); - TString8 para; - para.format("%d", LF_DOC); - ini.set_paragraph(para); + ini.set_paragraph(LF_DOC); ini.set(DOC_PROVV, doc.get(DOC_PROVV)); ini.set(DOC_ANNO, doc.get(DOC_ANNO)); ini.set(DOC_CODNUM, doc.get(DOC_CODNUM)); ini.set(DOC_NDOC, doc.get(DOC_NDOC)); - para.format("%d", LF_MOV); - ini.set_paragraph(para); + ini.set_paragraph(LF_MOV); ini.set(MOV_NUMREG, movimento.curr().get(MOV_NUMREG)); } diff --git a/ve/velib04c.cpp b/ve/velib04c.cpp index c554fe003..579866e27 100755 --- a/ve/velib04c.cpp +++ b/ve/velib04c.cpp @@ -141,7 +141,7 @@ error_type TGenerazione_effetti::change_group_status(TDocumento& doc, TAssoc_arr const int items = group_array.items(); if (items > 0) { - TProgind pi(items, "Cambio stato documenti", false); + TProgress_monitor pi(items, "Cambio stato documenti", false); _error = no_error; TToken_string * group_element; int i=0; @@ -152,7 +152,7 @@ error_type TGenerazione_effetti::change_group_status(TDocumento& doc, TAssoc_arr // Ciclo sugli elementi dell'assoc_array for (group_element = (TToken_string *) group_array.first_item(); group_element != NULL && i < items; i++,group_element = (TToken_string*)group_array.succ_item()) { - if (!pi.addstatus(1)) + if (!pi.add_status()) break; group_element->restart(); diff --git a/ve/velib04d.cpp b/ve/velib04d.cpp index debd8c88a..73862629a 100755 --- a/ve/velib04d.cpp +++ b/ve/velib04d.cpp @@ -115,19 +115,22 @@ bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, lo if (!e.is_zero()) { TToken_string key(32, ' '); - key.add(row->get(s.cid2index(S_CODART))); - key.add(row->get(s.cid2index(S_LIVGIAC1))); - key.add(row->get(s.cid2index(S_LIVGIAC2))); - key.add(row->get(s.cid2index(S_LIVGIAC3))); - key.add(row->get(s.cid2index(S_LIVGIAC4))); - key.trim(); - real* g = (real*)giacenze.objptr(key); - if (g == NULL) + key = row->get(s.cid2index(S_CODART)); + if (!cache().get(LF_ANAMAG, key).empty()) // Controlla solo articoli a magazzino { - g = new real(row->get(s.cid2index(S_GIACENZA))); - giacenze.add(key, g); + key.add(row->get(s.cid2index(S_LIVGIAC1))); + key.add(row->get(s.cid2index(S_LIVGIAC2))); + key.add(row->get(s.cid2index(S_LIVGIAC3))); + key.add(row->get(s.cid2index(S_LIVGIAC4))); + key.trim(); + real* g = (real*)giacenze.objptr(key); + if (g == NULL) + { + g = new real(row->get(s.cid2index(S_GIACENZA))); + giacenze.add(key, g); + } + *g -= e; } - *g -= e; } } } @@ -249,7 +252,7 @@ void TConsegna_mask::doc2mask(const TDocumento& indoc, const TDocumento& outdoc, if (rec.is_descrizione()) show_line = !_ignora_descrizioni; - if ( show_line && (articolo.blank() || articolo == rec.get(RDOC_CODART)) ) + if ( show_line && (articolo.blank() || articolo == rec.get(RDOC_CODARTMAG)) ) { TToken_string& r = s.row(-1); r = " "; @@ -273,10 +276,10 @@ void TConsegna_mask::doc2mask(const TDocumento& indoc, const TDocumento& outdoc, for (int l = 1; l <= 4; l++) r.add(livelli_giacenza().unpack_grpcode(livello, l)); - if (!evasa) + if (!evasa && rec.is_articolo()) { - TArticolo_giacenza ag(rec.get(RDOC_CODART)); - const real giac = ag.giacenza_anno(rec.get(RDOC_CODMAG), livello, codes); + const TArticolo_giacenza ag(rec.get(RDOC_CODARTMAG)); + const real giac = ag.empty()? ZERO : ag.giacenza_anno(rec.get(RDOC_CODMAG), livello, codes); r.add(giac.string(), s.cid2index(S_GIACENZA)); } @@ -366,15 +369,19 @@ bool TConsegna_ordini::calcola_ncolli_tara_pnetto(const TString& codart, const r bool TConsegna_ordini::aggiorna_ncolli_tara_pnetto(TRiga_documento& r) const { const TString& codart = r.get(RDOC_CODARTMAG); - TArticolo& articolo = cached_article(codart); - const real qta = articolo.convert_to_um(r.quantita(), NULL, r.get(RDOC_UMQTA)); - real ncolli, tara, pnetto; - const bool ok = calcola_ncolli_tara_pnetto(codart, qta, ncolli, tara, pnetto); + bool ok = codart.full(); if (ok) { - r.put(RDOC_NCOLLI, ncolli); - r.put(RDOC_TARA, tara); - r.put(RDOC_PNETTO, pnetto); + TArticolo& articolo = cached_article(codart); + const real qta = articolo.convert_to_um(r.quantita(), NULL, r.get(RDOC_UMQTA)); + real ncolli, tara, pnetto; + ok = calcola_ncolli_tara_pnetto(codart, qta, ncolli, tara, pnetto); + if (ok) + { + r.put(RDOC_NCOLLI, ncolli); + r.put(RDOC_TARA, tara); + r.put(RDOC_PNETTO, pnetto); + } } return ok; } diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 449a4f2ac..072859ce0 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -4,7 +4,7 @@ #include #include #include -// #include // Cassato il macchinaro +#include #include #include #include @@ -1781,7 +1781,7 @@ void TDocumento_mask::update_giacenza() TSheet_field& sf = sfield(F_SHEET); TToken_string& row = sf.row(sf.selected()); - TString80 codart = row.get(sf.cid2index(FR_CODARTMAG)); + TCodice_articolo codart = row.get(sf.cid2index(FR_CODARTMAG)); if (codart.blank()) { reset(F_CURGIAC); @@ -2940,7 +2940,7 @@ bool TDocument_tree::get_description(TString& str) const const TRectype& rec = riga(); const TRectype& testata = _relation->curr(); - const TString80 codart = rec.get(RDOC_CODART); + const TCodice_articolo codart = rec.get(RDOC_CODART); str = codart; str.left_just(21); str << rec.get(RDOC_DESCR).left(30); @@ -4393,12 +4393,12 @@ static int row_compare(const TObject** obj1, const TObject** obj2) if (doc[i].get(RDOC_CODART).blank()) return -1; - const TString80 c1 = row1.get(RDOC_CODART); - const TString & c2 = row2.get(RDOC_CODART); - + const TString& c1 = row1.get(RDOC_CODART); + const TString& c2 = row2.get(RDOC_CODART); if (c1.full() && c2.full()) - return strcmp((const char *) c1, (const char *) c2); - return r1 - r2; + return c1.compare(c2); + + return r1 - r2; } bool TDocumento_mask::sort_row_handler( TMask_field& f, KEY key ) diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index b281c4a76..a99a79c06 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -2604,6 +2604,7 @@ bool TDocumento_mask::numdocrif_search_handler(TMask_field& f, KEY key) return true; } +/* bool TDocumento_mask::ragsoc_search_handler(TMask_field& f, KEY key) { if (key == K_F9) @@ -2650,7 +2651,7 @@ bool TDocumento_mask::ragsoc_search_handler(TMask_field& f, KEY key) } return true; } - +*/ bool TDocumento_mask::datadocrif_handler(TMask_field& f, KEY key) { diff --git a/ve/velib07.cpp b/ve/velib07.cpp index 0b668e11b..a558cf794 100755 --- a/ve/velib07.cpp +++ b/ve/velib07.cpp @@ -493,7 +493,7 @@ bool TDocument_report::msg_parent_doc(TVariant_stack& stack) int level = stack.pop().as_int(); for (; rdoc != NULL && level > 0; level--) - rdoc = (const TRiga_documento *)(rdoc->find_original_rdoc()); + rdoc = (const TRiga_documento*)(rdoc->find_original_rdoc()); const TString& values = stack.pop().as_string(); const bool is_full = stack.peek().as_bool();