From 252db5bd073461684a124578ba30cd5b646c11b8 Mon Sep 17 00:00:00 2001 From: bonazzi Date: Mon, 24 Jul 2017 17:24:41 +0000 Subject: [PATCH] Partch 424Patch level : 12.0 424 Files correlati : ca0.ex ca0800a.msk ca1.exe ca1800a.msk ca2.exe ca2100a.uml ca3.exe ca3200.msk ca3200b.rep ca3300.msk ca3700.msk ca3700a.rep ca3700b.rep ca3800a.rep ca3800b.rep ca3800c.rep ca3900.msk ca3900a.rep ca39 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disabilitato il Flag di IVA per cassa se è un reverse charge. git-svn-id: svn://10.65.10.50/branches/R_10_00@23991 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- src/ca/ca0600.cpp | 831 ++++++++++++------------- src/ca/ca0700.cpp | 274 +++++---- src/ca/ca0800.cpp | 1080 ++++++++++++++++---------------- src/ca/ca0800a.uml | 846 ++++++++++++------------- src/ca/ca1800.cpp | 831 ++++++++++++------------- src/ca/ca1800a.h | 69 ++- src/ca/ca1800a.uml | 730 +++++++++++----------- src/ca/ca2100.cpp | 301 ++++++++- src/ca/ca2100a.h | 111 ++-- src/ca/ca2100a.uml | 1108 +++++++++++++++++---------------- src/ca/ca3100a.rep | 430 ++++++------- src/ca/ca3100b.rep | 452 +++++++------- src/ca/ca3200.cpp | 1468 ++++++++++++++++++++++---------------------- src/ca/ca3200.h | 89 +-- src/ca/ca3200.uml | 531 ++++++++-------- src/ca/ca3200b.rep | 286 +++++++++ src/ca/ca3300.cpp | 191 +++++- src/ca/ca3300.uml | 2 +- src/ca/ca3700.cpp | 642 ++++++++++++++++++- src/ca/ca3700.h | 1 + src/ca/ca3700.uml | 5 + src/ca/ca3700a.rep | 66 +- src/ca/ca3700b.rep | 228 +++++++ src/ca/ca3800a.rep | 85 ++- src/ca/ca3800b.rep | 86 ++- src/ca/ca3800c.rep | 84 ++- src/ca/ca3883.cpp | 355 ++++++----- src/ca/ca3883.h | 8 +- src/ca/ca3900.uml | 33 + src/ca/ca3900a.rep | 231 +++++-- src/ca/calib01.cpp | 68 +- src/ca/calib01.h | 11 +- src/ca/calib02.cpp | 29 +- src/ca/calib02.h | 2 +- 34 files changed, 6754 insertions(+), 4810 deletions(-) create mode 100644 src/ca/ca3200b.rep create mode 100644 src/ca/ca3700b.rep diff --git a/src/ca/ca0600.cpp b/src/ca/ca0600.cpp index dd2f61f8a..683bf6d5b 100755 --- a/src/ca/ca0600.cpp +++ b/src/ca/ca0600.cpp @@ -1,413 +1,418 @@ -// gestione files Contabilita' Analitica: COMMESSE -#include -#include -#include - -#include "calib01.h" -#include "ca0600a.h" -#include "commesse.h" -#include "cfcms.h" - -//////////////////////////////////////////////////////////////////////// -//MASCHERA -//////////////////////////////////////////////////////////////////////// -class TCms_anal_msk : public TSimple_anal_msk -{ -protected: - virtual int get_logicnum() const { return LF_COMMESSE; } - -public: - TCms_anal_msk(); -}; - -TCms_anal_msk::TCms_anal_msk() -{ - read("ca0600a"); - ca_create_fields(*this, 2, LF_CDC, 1, 1, F_CMS_CDC1, F_CMS_CDCDES1, 0x0, COMMESSE_CODCOSTO); - - const bool use_pdcc = ca_config().get_bool("UsePdcc"); - const int nfields = ca_create_fields(*this, 3, use_pdcc ? LF_PCON : LF_PCONANA, 2, 2, F_CMSPDA1, F_CMSDES1, 0x0, COMMESSE_CODCONTO); - int from = 1; - - for (int i = 0; i < nfields; i++) - { - TEdit_field & e = efield(F_CMSPDA1 + i); - - e.check_type(CHECK_NORMAL); - TFieldref * fr = (TFieldref *) e.field(); - if (fr != NULL) - { - fr->set_from(from); - if (i < 2) - from += 3; - else - from += 6; - fr->set_to(from - 1); - } - } -} - -//////////////////////////////////////////////////////////////////////// -//APPLICAZIONE -//////////////////////////////////////////////////////////////////////// -// applicazione per la gestione delle commesse -class TCms_app : public TAnal_app -{ - int _maxlev; - bool _has_filter; - -protected: - void fin2row(const TMask& m); - void for2row(const TMask& m); - void row2fin(const TMask& m); - void row2for(const TMask& m); - virtual int read(TMask& m); - virtual int write(const TMask& m); - virtual int rewrite(const TMask& m); - virtual bool remove(); - - virtual void ini2mask(TConfig& ini, TMask&m, bool query); - virtual void mask2ini(const TMask& m, TConfig& ini); - virtual bool filtered() const; - - virtual void init_modify_mode(TMask& mask); - virtual void init_insert_mode(TMask& mask); - virtual bool protected_record(TRectype& record); - virtual TSimple_anal_msk* create_mask() const { return new TCms_anal_msk; } - virtual bool user_create(); -}; - -void TCms_app::fin2row(const TMask& m) -{ - const TRelation * r = get_relation(); - TToken_string key; - - key.add(r->curr().get(COMMESSE_CODCMS)); - key.add("C"); - - TRecord_array fins(key, LF_CFCMS); - const int items = fins.rows(); - TSheet_field & s = m.sfield(F_CMS_FINAN); - - s.destroy(); - for (int i = 1; i <= items; i++) - { - const TRectype & rec = fins[i]; - TToken_string & str = s.row(i - 1); - - - str.add(rec.get(CFCMS_CODCF), s.cid2index(F_CMS_CODFIN)); - str.add(rec.get(CFCMS_NRIGABAN), s.cid2index(F_CMS_NRIGABANFIN)); - str.add(rec.get(CFCMS_CUP), s.cid2index(F_CMS_CUPFIN)); - str.add(rec.get(CFCMS_CIG), s.cid2index(F_CMS_CIGFIN)); - str.add(rec.get(CFCMS_PERCFIN), s.cid2index(F_CMS_PERCFINFIN)); - str.add(rec.get(CFCMS_DESCR), s.cid2index(F_CMS_DESCRFIN)); - s.check_row(i - 1); - } - s.force_update(); -} - -void TCms_app::for2row(const TMask& m) -{ - const TRelation * r = get_relation(); - TToken_string key; - - key.add(r->curr().get(COMMESSE_CODCMS)); - key.add("F"); - - TRecord_array fors(key, LF_CFCMS); - const int items = fors.rows(); - TSheet_field & s = m.sfield(F_CMS_FORN); - - s.destroy(); - for (int i = 1; i <= items; i++) - { - const TRectype & rec = fors[i]; - TToken_string & str = s.row(i - 1); - - str.add(rec.get(CFCMS_CODCF), s.cid2index(F_CMS_CODFOR)); - str.add(rec.get(CFCMS_NRIGABAN), s.cid2index(F_CMS_NRIGABANFOR)); - str.add(rec.get(CFCMS_CUP), s.cid2index(F_CMS_CUPFOR)); - str.add(rec.get(CFCMS_CIG), s.cid2index(F_CMS_CUPFOR)); - s.check_row(i - 1); - } - s.force_update(); -} - -int TCms_app::read(TMask& m) -{ - int err = TAnal_app::read(m); - - if (err == NOERR) - { - fin2row(m); - for2row(m); - } - return err; -} - -void TCms_app::row2fin(const TMask& m) -{ - TRelation * r = get_relation(); - TToken_string key; - - key.add(r->lfile().get(COMMESSE_CODCMS)); - key.add("C"); - - TRecord_array fins(key, LF_CFCMS); - TSheet_field & s = m.sfield(F_CMS_FINAN); - const int items = s.items(); - - fins.destroy_rows(); - for (int i = 0; i < items; i++) - { - TRectype & rec = fins.row(i + 1, true); - TToken_string & str = s.row(i); - - rec.put(CFCMS_CODCF, str.get(s.cid2index(F_CMS_CODFIN))); - rec.put(CFCMS_NRIGABAN, str.get(s.cid2index(F_CMS_NRIGABANFIN))); - rec.put(CFCMS_CUP, str.get(s.cid2index(F_CMS_CUPFIN))); - rec.put(CFCMS_CIG, str.get(s.cid2index(F_CMS_CIGFIN))); - rec.put(CFCMS_PERCFIN, str.get(s.cid2index(F_CMS_PERCFINFIN))); - rec.put(CFCMS_DESCR, str.get(s.cid2index(F_CMS_DESCRFIN))); - } - fins.write(true); -} - -void TCms_app::row2for(const TMask& m) -{ - TRelation * r = get_relation(); - TToken_string key; - - key.add(r->lfile().get(COMMESSE_CODCMS)); - key.add("F"); - - TRecord_array fors(key, LF_CFCMS); - TSheet_field & s = m.sfield(F_CMS_FORN); - const int items = s.items(); - - fors.destroy_rows(); - for (int i = 0; i < items; i++) - { - TRectype & rec = fors.row(i + 1, true); - TToken_string & str = s.row(i); - - rec.put(CFCMS_CODCF, str.get(s.cid2index(F_CMS_CODFOR))); - rec.put(CFCMS_NRIGABAN, str.get(s.cid2index(F_CMS_NRIGABANFOR))); - rec.put(CFCMS_CUP, str.get(s.cid2index(F_CMS_CUPFOR))); - rec.put(CFCMS_CIG, str.get(s.cid2index(F_CMS_CIGFOR))); - } - fors.write(true); -} - -int TCms_app::write(const TMask& m) -{ - TRelation * r = get_relation(); - - m.autosave(*r); - int err = TAnal_app::write(m); - if (err == NOERR) - { - row2fin(m); - row2for(m); - } - return err; -} - -int TCms_app::rewrite(const TMask& m) -{ - TRelation * r = get_relation(); - - m.autosave(*r); - int err = TAnal_app::rewrite(m); - if (err == NOERR) - { - row2fin(m); - row2for(m); - } - return err; -} - -bool TCms_app::remove() -{ - int err = TAnal_app::remove(); - if (err == NOERR) - { - TRelation * r = get_relation(); - TToken_string key; - - key.add(r->lfile().get(COMMESSE_CODCMS)); - key.add("C"); - - TRecord_array fins(key, LF_CFCMS); - - err = fins.remove(); - if (err == NOERR) - { - key.cut(0); - key.add(r->lfile().get(COMMESSE_CODCMS)); - key.add("F"); - - TRecord_array fors(key, LF_CFCMS); - err = fors.remove(); - } - } - return err == NOERR; -} - -void TCms_app::ini2mask(TConfig& ini, TMask& m, bool query) -{ - TString p; - const TRelation * r = get_relation(); - - TAnal_app::ini2mask(ini, m, query); - - if (!query) - { - int i; - p << LF_CFCMS << ",C"; - TSheet_field & si = m.sfield(F_CMS_FINAN); - - for (i = 0; ; i++) - { - TString para(p); para << "," << i + 1; - const long codcf = ini.get_long(CFCMS_CODCF, para); - if (codcf == 0L) - break; - TToken_string & row = si.row(i); - - row.add(codcf, si.cid2index(F_CMS_CODFIN)); - row.add(ini.get(CFCMS_NRIGABAN, para), si.cid2index(F_CMS_NRIGABANFIN)); - row.add(ini.get(CFCMS_CUP, para), si.cid2index(F_CMS_CUPFIN)); - row.add(ini.get(CFCMS_CIG, para), si.cid2index(F_CMS_CIGFIN)); - row.add(ini.get(CFCMS_PERCFIN, para), si.cid2index(F_CMS_PERCFINFIN)); - row.add(ini.get(CFCMS_DESCR, para), si.cid2index(F_CMS_DESCRFIN)); - si.update_mask(i - 1); - } - si.force_update(); - - p.cut(0); - p << LF_CFCMS << ",F"; - - TSheet_field & so = m.sfield(F_CMS_FORN); - - for (i = 0; ; i++) - { - TString para(p); para << "," << i + 1; - const long codcf = ini.get_long(CFCMS_CODCF, para); - if (codcf == 0L) - break; - TToken_string & row = so.row(i); - - row.add(codcf, so.cid2index(F_CMS_CODFOR)); - row.add(ini.get(CFCMS_NRIGABAN, para), so.cid2index(F_CMS_NRIGABANFOR)); - row.add(ini.get(CFCMS_CUP, para), so.cid2index(F_CMS_CUPFOR)); - row.add(ini.get(CFCMS_CIG, para), so.cid2index(F_CMS_CIGFOR)); - so.update_mask(i - 1); - } - so.force_update(); - } -} - -void TCms_app::mask2ini(const TMask& m, TConfig& ini) -{ - TString p; - const TRelation * r = get_relation(); - - TAnal_app::mask2ini(m, ini); - p << LF_CFCMS << ",C"; - TSheet_field & si = m.sfield(F_CMS_FINAN); - int items = si.items(); - - for (int i = 0; i < items; i++) - { - TString para(p); para << "," << i + 1; - TToken_string & row = si.row(i); - - ini.set(CFCMS_CODCF, row.get(si.cid2index(F_CMS_CODFIN)), para); - ini.set(CFCMS_NRIGABAN, row.get(si.cid2index(F_CMS_NRIGABANFIN)), para); - ini.set(CFCMS_CUP, row.get(si.cid2index(F_CMS_CUPFIN)), para); - ini.set(CFCMS_CIG, row.get(si.cid2index(F_CMS_CIGFIN)), para); - ini.set(CFCMS_PERCFIN, row.get(si.cid2index(F_CMS_PERCFINFIN)), para); - ini.set(CFCMS_DESCR, row.get(si.cid2index(F_CMS_DESCRFIN)), para); - } - - p.cut(0); - p << LF_CFCMS << ",F"; - - TSheet_field & so = m.sfield(F_CMS_FORN); - - items = so.items(); - for (int i = 0; i < items; i++) - { - TString para(p); para << "," << i + 1; - TToken_string & row = so.row(i); - - ini.set(CFCMS_CODCF, row.get(so.cid2index(F_CMS_CODFOR)), para); - ini.set(CFCMS_NRIGABAN, row.get(so.cid2index(F_CMS_NRIGABANFOR)), para); - ini.set(CFCMS_CUP, row.get(so.cid2index(F_CMS_CUPFOR)), para); - ini.set(CFCMS_CIG, row.get(so.cid2index(F_CMS_CIGFOR)), para); - } -} - -bool TCms_app::filtered() const -{ - if (_has_filter) - return true; - return TAnal_app::filtered(); -} - -//non si può eliminare una commessa se essa appare in un saldo analitico dell'anno in corso o dell'anno precedente -bool TCms_app::protected_record(TRectype& record) -{ - TString query; - query << "USE SALDANA\nSELECT COMMESSA==#COMMESSA\nFROM ANNO=#ANNO\n"; - const TString commessa = record.get(COMMESSE_CODCMS); - const TDate today(TODAY); - const long anno = today.year(); - - TISAM_recordset saldana_recset(query); - saldana_recset.set_var("#COMMESSA", TVariant(commessa)); - saldana_recset.set_var("#ANNO", TVariant(anno - 1)); - - const long items = saldana_recset.items(); - return items > 0; -} - -void TCms_app::init_modify_mode(TMask& mask) -{ - const short id = ((TCms_anal_msk &)mask).get_field_id(_maxlev - 1 , 1); - mask.enable(-1, mask.get(id).not_empty()); - - TAnal_app::init_modify_mode(mask); -} - -void TCms_app::init_insert_mode(TMask& mask) -{ - const short id = ((TCms_anal_msk &)mask).get_field_id(_maxlev - 1, 1); - mask.enable(-1, mask.get(id).not_empty()); - - TAnal_app::init_insert_mode(mask); -} - -bool TCms_app::user_create() -{ - const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_COMMESSE); - - _maxlev = mci.levels(); - if (_maxlev <= 0) - return error_box(TR("Le commesse non sono state configurate")); - - //eventuali filtri per utente - _has_filter = cache().get("%AUC", user(), "S0").full(); - - return TAnal_app::user_create(); -} - -int ca0600(int argc, char* argv[]) -{ - TCms_app a; - a.run(argc, argv, TR("Commesse")); - return 0; -} - +// gestione files Contabilita' Analitica: COMMESSE +#include +#include +#include + +#include "calib01.h" +#include "ca0600a.h" +#include "commesse.h" +#include "cfcms.h" + +//////////////////////////////////////////////////////////////////////// +//MASCHERA +//////////////////////////////////////////////////////////////////////// +class TCms_anal_msk : public TSimple_anal_msk +{ +protected: + virtual int get_logicnum() const { return LF_COMMESSE; } + +public: + TCms_anal_msk(); +}; + +TCms_anal_msk::TCms_anal_msk() +{ + read("ca0600a"); + ca_create_fields(*this, 2, LF_CDC, 1, 1, F_CMS_CDC1, F_CMS_CDCDES1, 0x0, COMMESSE_CODCOSTO); + + const bool use_pdcc = ca_config().get_bool("UsePdcc"); + const int nfields = ca_create_fields(*this, 3, use_pdcc ? LF_PCON : LF_PCONANA, 2, 2, F_CMSPDA1, F_CMSDES1, 0x0, COMMESSE_CODCONTO); + int from = 1; + + for (int i = 0; i < nfields; i++) + { + TEdit_field & e = efield(F_CMSPDA1 + i); + + e.check_type(CHECK_NORMAL); + TFieldref * fr = (TFieldref *) e.field(); + if (fr != NULL) + { + fr->set_from(from); + if (i < 2) + from += 3; + else + from += 6; + fr->set_to(from - 1); + } + } +} + +//////////////////////////////////////////////////////////////////////// +//APPLICAZIONE +//////////////////////////////////////////////////////////////////////// +// applicazione per la gestione delle commesse +class TCms_app : public TAnal_app +{ + int _maxlev; + bool _has_filter; + +protected: + void fin2row(const TMask& m); + void for2row(const TMask& m); + void row2fin(const TMask& m); + void row2for(const TMask& m); + virtual int read(TMask& m); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + virtual bool remove(); + + virtual void ini2mask(TConfig& ini, TMask&m, bool query); + virtual void mask2ini(const TMask& m, TConfig& ini); + virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM + virtual bool filtered() const; + + virtual void init_modify_mode(TMask& mask); + virtual void init_insert_mode(TMask& mask); + virtual bool protected_record(TRectype& record); + virtual TSimple_anal_msk* create_mask() const { return new TCms_anal_msk; } + virtual bool user_create(); + +public: + + TCms_app() {} +}; + +void TCms_app::fin2row(const TMask& m) +{ + const TRelation * r = get_relation(); + TToken_string key; + + key.add(r->curr().get(COMMESSE_CODCMS)); + key.add("C"); + + TRecord_array fins(key, LF_CFCMS); + const int items = fins.rows(); + TSheet_field & s = m.sfield(F_CMS_FINAN); + + s.destroy(); + for (int i = 1; i <= items; i++) + { + const TRectype & rec = fins[i]; + TToken_string & str = s.row(i - 1); + + + str.add(rec.get(CFCMS_CODCF), s.cid2index(F_CMS_CODFIN)); + str.add(rec.get(CFCMS_NRIGABAN), s.cid2index(F_CMS_NRIGABANFIN)); + str.add(rec.get(CFCMS_CUP), s.cid2index(F_CMS_CUPFIN)); + str.add(rec.get(CFCMS_CIG), s.cid2index(F_CMS_CIGFIN)); + str.add(rec.get(CFCMS_PERCFIN), s.cid2index(F_CMS_PERCFINFIN)); + str.add(rec.get(CFCMS_DESCR), s.cid2index(F_CMS_DESCRFIN)); + s.check_row(i - 1); + } + s.force_update(); +} + +void TCms_app::for2row(const TMask& m) +{ + const TRelation * r = get_relation(); + TToken_string key; + + key.add(r->curr().get(COMMESSE_CODCMS)); + key.add("F"); + + TRecord_array fors(key, LF_CFCMS); + const int items = fors.rows(); + TSheet_field & s = m.sfield(F_CMS_FORN); + + s.destroy(); + for (int i = 1; i <= items; i++) + { + const TRectype & rec = fors[i]; + TToken_string & str = s.row(i - 1); + + str.add(rec.get(CFCMS_CODCF), s.cid2index(F_CMS_CODFOR)); + str.add(rec.get(CFCMS_NRIGABAN), s.cid2index(F_CMS_NRIGABANFOR)); + str.add(rec.get(CFCMS_CUP), s.cid2index(F_CMS_CUPFOR)); + str.add(rec.get(CFCMS_CIG), s.cid2index(F_CMS_CUPFOR)); + s.check_row(i - 1); + } + s.force_update(); +} + +int TCms_app::read(TMask& m) +{ + int err = TAnal_app::read(m); + + if (err == NOERR) + { + fin2row(m); + for2row(m); + } + return err; +} + +void TCms_app::row2fin(const TMask& m) +{ + TRelation * r = get_relation(); + TToken_string key; + + key.add(r->lfile().get(COMMESSE_CODCMS)); + key.add("C"); + + TRecord_array fins(key, LF_CFCMS); + TSheet_field & s = m.sfield(F_CMS_FINAN); + const int items = s.items(); + + fins.destroy_rows(); + for (int i = 0; i < items; i++) + { + TRectype & rec = fins.row(i + 1, true); + TToken_string & str = s.row(i); + + rec.put(CFCMS_CODCF, str.get(s.cid2index(F_CMS_CODFIN))); + rec.put(CFCMS_NRIGABAN, str.get(s.cid2index(F_CMS_NRIGABANFIN))); + rec.put(CFCMS_CUP, str.get(s.cid2index(F_CMS_CUPFIN))); + rec.put(CFCMS_CIG, str.get(s.cid2index(F_CMS_CIGFIN))); + rec.put(CFCMS_PERCFIN, str.get(s.cid2index(F_CMS_PERCFINFIN))); + rec.put(CFCMS_DESCR, str.get(s.cid2index(F_CMS_DESCRFIN))); + } + fins.write(true); +} + +void TCms_app::row2for(const TMask& m) +{ + TRelation * r = get_relation(); + TToken_string key; + + key.add(r->lfile().get(COMMESSE_CODCMS)); + key.add("F"); + + TRecord_array fors(key, LF_CFCMS); + TSheet_field & s = m.sfield(F_CMS_FORN); + const int items = s.items(); + + fors.destroy_rows(); + for (int i = 0; i < items; i++) + { + TRectype & rec = fors.row(i + 1, true); + TToken_string & str = s.row(i); + + rec.put(CFCMS_CODCF, str.get(s.cid2index(F_CMS_CODFOR))); + rec.put(CFCMS_NRIGABAN, str.get(s.cid2index(F_CMS_NRIGABANFOR))); + rec.put(CFCMS_CUP, str.get(s.cid2index(F_CMS_CUPFOR))); + rec.put(CFCMS_CIG, str.get(s.cid2index(F_CMS_CIGFOR))); + } + fors.write(true); +} + +int TCms_app::write(const TMask& m) +{ + TRelation * r = get_relation(); + + m.autosave(*r); + int err = TAnal_app::write(m); + if (err == NOERR) + { + row2fin(m); + row2for(m); + } + return err; +} + +int TCms_app::rewrite(const TMask& m) +{ + TRelation * r = get_relation(); + + m.autosave(*r); + int err = TAnal_app::rewrite(m); + if (err == NOERR) + { + row2fin(m); + row2for(m); + } + return err; +} + +bool TCms_app::remove() +{ + int err = TAnal_app::remove(); + if (err == NOERR) + { + TRelation * r = get_relation(); + TToken_string key; + + key.add(r->lfile().get(COMMESSE_CODCMS)); + key.add("C"); + + TRecord_array fins(key, LF_CFCMS); + + err = fins.remove(); + if (err == NOERR) + { + key.cut(0); + key.add(r->lfile().get(COMMESSE_CODCMS)); + key.add("F"); + + TRecord_array fors(key, LF_CFCMS); + err = fors.remove(); + } + } + return err == NOERR; +} + +void TCms_app::ini2mask(TConfig& ini, TMask& m, bool query) +{ + TString p; + const TRelation * r = get_relation(); + + TAnal_app::ini2mask(ini, m, query); + + if (!query) + { + int i; + p << LF_CFCMS << ",C"; + TSheet_field & si = m.sfield(F_CMS_FINAN); + + for (i = 0; ; i++) + { + TString para(p); para << "," << i + 1; + const long codcf = ini.get_long(CFCMS_CODCF, para); + if (codcf == 0L) + break; + TToken_string & row = si.row(i); + + row.add(codcf, si.cid2index(F_CMS_CODFIN)); + row.add(ini.get(CFCMS_NRIGABAN, para), si.cid2index(F_CMS_NRIGABANFIN)); + row.add(ini.get(CFCMS_CUP, para), si.cid2index(F_CMS_CUPFIN)); + row.add(ini.get(CFCMS_CIG, para), si.cid2index(F_CMS_CIGFIN)); + row.add(ini.get(CFCMS_PERCFIN, para), si.cid2index(F_CMS_PERCFINFIN)); + row.add(ini.get(CFCMS_DESCR, para), si.cid2index(F_CMS_DESCRFIN)); + si.update_mask(i - 1); + } + si.force_update(); + + p.cut(0); + p << LF_CFCMS << ",F"; + + TSheet_field & so = m.sfield(F_CMS_FORN); + + for (i = 0; ; i++) + { + TString para(p); para << "," << i + 1; + const long codcf = ini.get_long(CFCMS_CODCF, para); + if (codcf == 0L) + break; + TToken_string & row = so.row(i); + + row.add(codcf, so.cid2index(F_CMS_CODFOR)); + row.add(ini.get(CFCMS_NRIGABAN, para), so.cid2index(F_CMS_NRIGABANFOR)); + row.add(ini.get(CFCMS_CUP, para), so.cid2index(F_CMS_CUPFOR)); + row.add(ini.get(CFCMS_CIG, para), so.cid2index(F_CMS_CIGFOR)); + so.update_mask(i - 1); + } + so.force_update(); + } +} + +void TCms_app::mask2ini(const TMask& m, TConfig& ini) +{ + TString p; + const TRelation * r = get_relation(); + + TAnal_app::mask2ini(m, ini); + p << LF_CFCMS << ",C"; + TSheet_field & si = m.sfield(F_CMS_FINAN); + int items = si.items(); + + for (int i = 0; i < items; i++) + { + TString para(p); para << "," << i + 1; + TToken_string & row = si.row(i); + + ini.set(CFCMS_CODCF, row.get(si.cid2index(F_CMS_CODFIN)), para); + ini.set(CFCMS_NRIGABAN, row.get(si.cid2index(F_CMS_NRIGABANFIN)), para); + ini.set(CFCMS_CUP, row.get(si.cid2index(F_CMS_CUPFIN)), para); + ini.set(CFCMS_CIG, row.get(si.cid2index(F_CMS_CIGFIN)), para); + ini.set(CFCMS_PERCFIN, row.get(si.cid2index(F_CMS_PERCFINFIN)), para); + ini.set(CFCMS_DESCR, row.get(si.cid2index(F_CMS_DESCRFIN)), para); + } + + p.cut(0); + p << LF_CFCMS << ",F"; + + TSheet_field & so = m.sfield(F_CMS_FORN); + + items = so.items(); + for (int i = 0; i < items; i++) + { + TString para(p); para << "," << i + 1; + TToken_string & row = so.row(i); + + ini.set(CFCMS_CODCF, row.get(so.cid2index(F_CMS_CODFOR)), para); + ini.set(CFCMS_NRIGABAN, row.get(so.cid2index(F_CMS_NRIGABANFOR)), para); + ini.set(CFCMS_CUP, row.get(so.cid2index(F_CMS_CUPFOR)), para); + ini.set(CFCMS_CIG, row.get(so.cid2index(F_CMS_CIGFOR)), para); + } +} + +bool TCms_app::filtered() const +{ + if (_has_filter) + return true; + return TAnal_app::filtered(); +} + +//non si può eliminare una commessa se essa appare in un saldo analitico dell'anno in corso o dell'anno precedente +bool TCms_app::protected_record(TRectype& record) +{ + TString query; + query << "USE SALDANA\nSELECT COMMESSA==#COMMESSA\nFROM ANNO=#ANNO\n"; + const TString commessa = record.get(COMMESSE_CODCMS); + const TDate today(TODAY); + const long anno = today.year(); + + TISAM_recordset saldana_recset(query); + saldana_recset.set_var("#COMMESSA", TVariant(commessa)); + saldana_recset.set_var("#ANNO", TVariant(anno - 1)); + + const long items = saldana_recset.items(); + return items > 0; +} + +void TCms_app::init_modify_mode(TMask& mask) +{ + const short id = ((TCms_anal_msk &)mask).get_field_id(_maxlev - 1 , 1); + mask.enable(-1, mask.get(id).not_empty()); + + TAnal_app::init_modify_mode(mask); +} + +void TCms_app::init_insert_mode(TMask& mask) +{ + const short id = ((TCms_anal_msk &)mask).get_field_id(_maxlev - 1, 1); + mask.enable(-1, mask.get(id).not_empty()); + + TAnal_app::init_insert_mode(mask); +} + +bool TCms_app::user_create() +{ + const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_COMMESSE); + + _maxlev = mci.levels(); + if (_maxlev <= 0) + return error_box(TR("Le commesse non sono state configurate")); + + //eventuali filtri per utente + _has_filter = cache().get("%AUC", user(), "S0").full(); + + return TAnal_app::user_create(); +} + +int ca0600(int argc, char* argv[]) +{ + TCms_app a; + a.run(argc, argv, TR("Commesse")); + return 0; +} + diff --git a/src/ca/ca0700.cpp b/src/ca/ca0700.cpp index 1803fe781..ae9eab345 100755 --- a/src/ca/ca0700.cpp +++ b/src/ca/ca0700.cpp @@ -1,136 +1,138 @@ -// gestione files Contabilita' Analitica: FASI -#include -#include -#include - -#include "calib01.h" -#include "calibmsk.h" -#include "ca0700a.h" -#include "fasi.h" - -//////////////////////////////////////////////////////////////////////// -//MASCHERA -//////////////////////////////////////////////////////////////////////// - -class TFsc_anal_msk : public TSimple_anal_msk -{ -protected: - virtual int get_logicnum() const { return LF_FASI; } - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - -public: - TFsc_anal_msk(); -}; - -bool TFsc_anal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - const short id = o.dlg(); - if (id > F_KEY4 && id <= F_KEY4+4) - { - const int level = id - F_KEY4 - 1; - return ca_test_multilevel_field(efield(id), level); - } - return TSimple_anal_msk::on_field_event(o, e, jolly); -} - -TFsc_anal_msk::TFsc_anal_msk() -{ - read("ca0700a"); - - const bool use_pdcc = ca_config().get_bool("UsePdcc"); - const int nfields = ca_create_fields(*this, 0, use_pdcc ? LF_PCON : LF_PCONANA, 2 + compute_offset(), 8, F_FSCPDA1, F_FSCDES1, 0x0, FASI_CODCONTO); - int from = 1; - - for (int i = 0; i < nfields; i++) - { - TEdit_field & e = efield(F_FSCPDA1 + i); - - e.check_type(CHECK_NORMAL); - TFieldref * fr = (TFieldref *) e.field(); - if (fr != NULL) - { - fr->set_from(from); - if (i < 2) - from += 3; - else - from += 6; - fr->set_to(from - 1); - } - } -} - -//////////////////////////////////////////////////////////////////////// -//APPLICAZIONE -//////////////////////////////////////////////////////////////////////// -// applicazione per la gestione delle fasi -class TFsc_app : public TAnal_app -{ - bool _has_filter; - -protected: - virtual bool filtered() const; - virtual bool protected_record(TRectype& record); - virtual TSimple_anal_msk* create_mask() const { return new TFsc_anal_msk; } - virtual bool user_create(); -}; - -bool TFsc_app::filtered() const -{ - if (_has_filter) - return true; - return TAnal_app::filtered(); -} - -//non si può eliminare una fase se essa appare in un saldo analitico dell'anno in corso o dell'anno precedente -bool TFsc_app::protected_record(TRectype& record) -{ - TString query; - query << "USE SALDANA\nSELECT (FASE==#FASE)"; - //controlla se le fasi sono figlie delle commesse o dei centri di costo o semplici figlie di nessuno - const TString& fath_fasi = ca_config().get("FathFasi"); - - if (fath_fasi == "CMS") - query << "&&(COMMESSA==#COMMESSA)"; - - if (fath_fasi == "CDC") - query << "&&(COSTO==#COSTO)"; - - query << "\nFROM ANNO=#ANNO"; - - const TString fase = record.get(FASI_CODFASE); - const TDate today(TODAY); - const long anno = today.year(); - const TString codcmsfas = record.get(FASI_CODCMSFAS); - - TISAM_recordset saldana_recset(query); - - saldana_recset.set_var("#FASE", TVariant(fase)); - saldana_recset.set_var("#ANNO", TVariant(anno - 1)); - if (fath_fasi == "CMS") - saldana_recset.set_var("#COMMESSA", TVariant(codcmsfas)); - if (fath_fasi == "CDC") - saldana_recset.set_var("#COSTO", TVariant(codcmsfas)); - - const long items = saldana_recset.items(); - return items > 0; -} - -bool TFsc_app::user_create() -{ - const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_FASI); - if (mci.levels() <= 0) - return error_box(TR("Le fasi non sono state configurate")); - - //eventuali filtri per utente - _has_filter = cache().get("%AUC", user(), "S2").full(); - - return TAnal_app::user_create(); -} - -int ca0700(int argc, char* argv[]) -{ - TFsc_app a; - a.run(argc, argv, TR("Fasi")); - return 0; -} - +// gestione files Contabilita' Analitica: FASI +#include +#include +#include + +#include "calib01.h" +#include "calibmsk.h" +#include "ca0700a.h" +#include "fasi.h" + +//////////////////////////////////////////////////////////////////////// +//MASCHERA +//////////////////////////////////////////////////////////////////////// + +class TFsc_anal_msk : public TSimple_anal_msk +{ +protected: + virtual int get_logicnum() const { return LF_FASI; } + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + +public: + TFsc_anal_msk(); +}; + +bool TFsc_anal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + const short id = o.dlg(); + if (id > F_KEY4 && id <= F_KEY4+4) + { + const int level = id - F_KEY4 - 1; + return ca_test_multilevel_field(efield(id), level); + } + return TSimple_anal_msk::on_field_event(o, e, jolly); +} + +TFsc_anal_msk::TFsc_anal_msk() +{ + read("ca0700a"); + + const bool use_pdcc = ca_config().get_bool("UsePdcc"); + const int nfields = ca_create_fields(*this, 0, use_pdcc ? LF_PCON : LF_PCONANA, 2 + compute_offset(), 8, F_FSCPDA1, F_FSCDES1, 0x0, FASI_CODCONTO); + int from = 1; + + for (int i = 0; i < nfields; i++) + { + TEdit_field & e = efield(F_FSCPDA1 + i); + + e.check_type(CHECK_NORMAL); + TFieldref * fr = (TFieldref *) e.field(); + if (fr != NULL) + { + fr->set_from(from); + if (i < 2) + from += 3; + else + from += 6; + fr->set_to(from - 1); + } + } +} + +//////////////////////////////////////////////////////////////////////// +//APPLICAZIONE +//////////////////////////////////////////////////////////////////////// +// applicazione per la gestione delle fasi +class TFsc_app : public TAnal_app +{ + bool _has_filter; + +protected: + virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM + + virtual bool filtered() const; + virtual bool protected_record(TRectype& record); + virtual TSimple_anal_msk* create_mask() const { return new TFsc_anal_msk; } + virtual bool user_create(); +}; + +bool TFsc_app::filtered() const +{ + if (_has_filter) + return true; + return TAnal_app::filtered(); +} + +//non si può eliminare una fase se essa appare in un saldo analitico dell'anno in corso o dell'anno precedente +bool TFsc_app::protected_record(TRectype& record) +{ + TString query; + query << "USE SALDANA\nSELECT (FASE==#FASE)"; + //controlla se le fasi sono figlie delle commesse o dei centri di costo o semplici figlie di nessuno + const TString& fath_fasi = ca_config().get("FathFasi"); + + if (fath_fasi == "CMS") + query << "&&(COMMESSA==#COMMESSA)"; + + if (fath_fasi == "CDC") + query << "&&(COSTO==#COSTO)"; + + query << "\nFROM ANNO=#ANNO"; + + const TString fase = record.get(FASI_CODFASE); + const TDate today(TODAY); + const long anno = today.year(); + const TString codcmsfas = record.get(FASI_CODCMSFAS); + + TISAM_recordset saldana_recset(query); + + saldana_recset.set_var("#FASE", TVariant(fase)); + saldana_recset.set_var("#ANNO", TVariant(anno - 1)); + if (fath_fasi == "CMS") + saldana_recset.set_var("#COMMESSA", TVariant(codcmsfas)); + if (fath_fasi == "CDC") + saldana_recset.set_var("#COSTO", TVariant(codcmsfas)); + + const long items = saldana_recset.items(); + return items > 0; +} + +bool TFsc_app::user_create() +{ + const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_FASI); + if (mci.levels() <= 0) + return error_box(TR("Le fasi non sono state configurate")); + + //eventuali filtri per utente + _has_filter = cache().get("%AUC", user(), "S2").full(); + + return TAnal_app::user_create(); +} + +int ca0700(int argc, char* argv[]) +{ + TFsc_app a; + a.run(argc, argv, TR("Fasi")); + return 0; +} + diff --git a/src/ca/ca0800.cpp b/src/ca/ca0800.cpp index 8ee38bbd4..49e9dccb2 100755 --- a/src/ca/ca0800.cpp +++ b/src/ca/ca0800.cpp @@ -1,525 +1,555 @@ -#include -#include -#include -#include - -#include "ca0800a.h" -#include "calib01.h" - -#include "fasi.h" -#include "rip.h" -#include "rrip.h" - -/////////////////////////////////////////////////////////// -// TRiparti_msk -/////////////////////////////////////////////////////////// - -class TRiparti_msk : public TAutomask -{ -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); - int create_sheet_fields(int lf, int& y, short& dlg); - void genera_righe_fasi(); - void create_sheet(); - -public: - TRiparti_msk(); -}; - -void TRiparti_msk::genera_righe_fasi() -{ - //data una commessa in ingresso, la si vuole ripartire sulle sue fasi - TString80 commessa; - for (short id = F_CODCMS_1; id2pos(id) > 0; id++) - commessa << get(id); - - if (commessa.full()) - { - //sheet della maschera da riempire - TSheet_field& sheet = sfield(F_SHEET); - sheet.destroy(); - //quali sono le fasi legate a 'sto cavolo di commessa? - TISAM_recordset fasi("USE FASI\nFROM CODCMSFAS=#COMMESSA\nTO CODCMSFAS=#COMMESSA"); - fasi.set_var("#COMMESSA", TVariant(commessa)); - TToken_string wts; - for (bool ok = fasi.move_first(); ok; ok = fasi.move_next()) - { - wts = " "; - wts.add(commessa); - wts.add(fasi.get(FASI_CODFASE).as_string()); - sheet.row(-1) = wts; - } - sheet.force_update(); //scrive le righe effettivamente - } //if(commessa.full()... -} - -bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - switch (o.dlg()) - { - //gestione tipo di ripartizioni possibili - //0 = percentuale; 1 = in base al peso economico della commessa; 2 = per parti (modello cocktail) - case F_TIPORIP: - if (e == fe_init || e == fe_modify) - { - TSheet_field& sf = sfield(F_SHEET); - TMask& sm = sf.sheet_mask(); - const int t = atoi(o.get()); - switch (t) - { - case 0: //percentuale - { - sm.hide(201); - sm.show(101); - sm.enable(101); - sf.enable_column(0); - set(F_TOTRIP, CENTO); - disable(F_TOTRIP); - show(F_SOMMA); - show(F_DIFFERENZA); - } - break; - case 1: //peso economico della commessa (non viene specificato nulla, la ripartizione avviene in base ai saldi) - { - sm.show(101); - sm.disable(101); //necessario per non avere 2 campi abilitati e nascosti nella stessa posizione (dà errore) - sm.hide(201); - sf.enable_column(0, false); - disable(F_TOTRIP); - hide(F_TOTRIP); - hide(F_SOMMA); - hide(F_DIFFERENZA); - } - break; - case 2: //parti - { - sm.hide(101); - sm.show(201); - sm.enable(201); - sf.enable_column(0); - enable(F_TOTRIP); - show(F_SOMMA); - show(F_DIFFERENZA); - } - break; - } - - sf.force_update(); - } - break; - case F_SHEET: - if (e == fe_init || (e == se_leave && o.dirty())) - { - TSheet_field& sf = sfield(F_SHEET); - real tot; - FOR_EACH_SHEET_ROW(sf, i, row) - tot += real(row->get(0)); - const int t = atoi(get(F_TIPORIP)); - - tot.round(5); - set(F_SOMMA, tot); - real diff = get_real(F_TOTRIP); - if (diff != ZERO) - diff -= tot; - set(F_DIFFERENZA, diff); - } - break; - case F_GENFASI: - if (e == fe_init) - { - bool accendimi = insert_mode(); - if (accendimi) - { - const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); - accendimi = fasinfo.parent() == LF_COMMESSE; - } - o.show(accendimi); - } - if (e == fe_button) - genera_righe_fasi(); - break; - default: - break; - } - return true; -} - -int TRiparti_msk::create_sheet_fields(int lf, int& y, short& dlg) -{ - TSheet_field& sf = sfield(F_SHEET); - TMask& sm = sf.sheet_mask(); - const int h = ca_create_fields(sm, 0, lf, 1, y, dlg, dlg+50); - - for (int i = 0; i < h; i++) - { - TEdit_field& fld = sm.efield(dlg+i); - int logic = lf; - if (logic == LF_FASI) - { - const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); - if (fasinfo.parent() != 0) - { - const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent()); - if (i < parinfo.levels()) - logic = fasinfo.parent(); - } - } - - if (logic == LF_PCON) - { - const TFieldref* f = fld.field(); - const TString16 fieldname = f->name(); - - if (fieldname == "GRUPPO") - fld.set_field("CODCONTO[1,3]"); else - if (fieldname == "CONTO") - fld.set_field("CODCONTO[4,6]"); else - if (fieldname == "SOTTOCONTO") - fld.set_field("CODCONTO[7,12]"); - } - else - { - const char* fieldname = NULL; - switch(logic) - { - case LF_CDC : fieldname = RRIP_CODCOSTO; break; - case LF_COMMESSE: fieldname = RRIP_CODCMS; break; - case LF_FASI : fieldname = RRIP_CODFASE; break; - default : fieldname = RRIP_CODCONTO; break; - } - TFieldref* f = (TFieldref*)fld.field(); - f->set_name(fieldname); - } - } - - y += h+1; - dlg += h; - return h; -} - -void TRiparti_msk::create_sheet() -{ - TSheet_field& sf = sfield(F_SHEET); - TMask& sm = sf.sheet_mask(); - sm.hide(-1); - - const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); - - TConfig& ini = ca_config(); - - int y = 1; - short dlg = 202; - - for (int i = 0; i < 2; i++) - { - const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 - if (level == "CDC") // Crea centro di costo - { - if (fasinfo.parent() == LF_CDC) - create_sheet_fields(LF_FASI, y, dlg); - else - create_sheet_fields(LF_CDC, y, dlg); - } else - if (level == "CMS") // Crea commessa - { - if (fasinfo.parent() == LF_COMMESSE) - create_sheet_fields(LF_FASI, y, dlg); - else - create_sheet_fields(LF_COMMESSE, y, dlg); - } - } - - if (fasinfo.levels() > 0 && fasinfo.parent() <= 0) - create_sheet_fields(LF_FASI, y, dlg); - - const bool use_pdc = ini.get_bool("UsePdcc"); - create_sheet_fields(use_pdc ? LF_PCON : LF_PCONANA, y, dlg); - - for (short id = 217; id >= 202; id--) - { - const int pos = sm.id2pos(id); - if (pos >= 0) - { - TMask_field& f = sm.fld(pos); - const int size = f.size(); - const TString& prompt = f.prompt(); - sf.set_column_header(id, prompt); - sf.set_column_justify(id, f.is_kind_of(CLASS_REAL_FIELD)); - sf.set_column_width(id, (max(3+size, prompt.len()+1)) * CHARX); - } - else - { - sf.delete_column(id); - } - } -} - -TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a") -{ - TConfig& ini = ca_config(); - - // Crea gli eventuali campi per commessa e centro di costo - const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); - int y = 12; - for (int i = 0; i < 2; i++) - { - const char* prompt = NULL; - int h = 0; - const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 - if (level == "CDC") // Crea centro di costo - { - h = ca_create_fields(*this, 0, LF_CDC, 2, y, F_CODCDC_1, F_DESCDC_1); - prompt = TR("@bCentro di costo"); - } else - if (level == "CMS") // Crea commessa - { - if (fasinfo.parent() == LF_COMMESSE) - { - h = ca_create_fields(*this, 0, LF_FASI, 2, y, F_CODCMS_1, F_DESCMS_1); - prompt = TR("@bCommessa/Fase"); - - const TMultilevel_code_info& cmsinfo = ca_multilevel_code_info(LF_COMMESSE); - const int cmslevels = cmsinfo.levels(); - for (int j = 0; j < cmslevels; j++) - { - TEdit_field& cfld = efield(F_CODCMS_1+j); - const TFieldref& fr = cmsinfo.fieldref(j); - TString80 str = RIP_CODCMS; - if (cmslevels > 1) - str.format("%s[%d,%d]", RIP_CODCMS, fr.from()+1, fr.to()); - cfld.set_field(str); - } - } - else - { - h = ca_create_fields(*this, 0, LF_COMMESSE, 2, y, F_CODCMS_1, F_DESCMS_1); - prompt = TR("@bCommessa"); - } - } else - if (level == "FSC" && fasinfo.parent() <= 0) - { - h = ca_create_fields(*this, 0, LF_FASI, 2, y, F_CODCMS_1, F_DESCMS_1); - prompt = TR("@bFase"); - } - - if (prompt != NULL) // Crea groupbox - { - const int last = fields()-1; - for (int j = 0; j < 2*h; j++) - fld(last-j).set_group(2); - - h += 2; - TGroup_field& grp = add_groupbox(F_LEVEL_1+i, 0, prompt, 1, y-1, 78, h); - grp.set_group(2); - y += h; - } - } - create_sheet(); -} - - -/////////////////////////////////////////////////////////// -// TRiparti_app -/////////////////////////////////////////////////////////// - -class TRiparti_app : public TRelation_application -{ - TRelation* _rel; - TRiparti_msk* _msk; - - const TString& somma_campi(TToken_string& row, int first, bool pdc = false) const; - void write_rows(); - - void spezza_campo(const TString& str, TToken_string& row, int first) const; - void read_rows(); - -protected: - virtual const char* extra_modules() const {return "ci|cm";} //funziona anche con autorizzazione CM - - virtual bool user_create(); - virtual bool user_destroy(); - virtual int write(const TMask& m); - virtual int rewrite(const TMask& m); - virtual int read(TMask& m); - virtual bool get_next_key(TToken_string& key); - - virtual TRelation* get_relation() const { return _rel; } - virtual TMask* get_mask(int) { return _msk; } -}; - -const TString& TRiparti_app::somma_campi(TToken_string& row, int first, bool pdc) const -{ - TSheet_field& sheet = _msk->sfield(F_SHEET); - TMask& m = sheet.sheet_mask(); - - const short id = 201 + first; - - TString& str = get_tmp_string(20); - for (int i = 0; i < 4; i++) - { - TString80 token = row.get(first+i); - if (m.id2pos(id+i) < 0) - break; - const TEdit_field& fld = m.efield(id+i); - if (pdc) - token.right_just(fld.size(), '0'); - else - token.left_just(fld.size()); - str << token; - } - return str; -} - -void TRiparti_app::spezza_campo(const TString& str, TToken_string& row, int first) const -{ - TSheet_field& sheet = _msk->sfield(F_SHEET); - TMask& m = sheet.sheet_mask(); - TString80 token; - - const short id = 201 + first; - int start = 0; - for (int i = 0; i < 4; i++) - { - if (m.id2pos(id+i) < 0) - break; - const TEdit_field& fld = m.efield(id+i); - const int len = fld.size(); - token = str.mid(start, len); token.trim(); - row.add(token, first+i); - start += len; - } -} - -void TRiparti_app::write_rows() -{ - real diff = _msk->get_real(F_TOTRIP); - const bool has_tot = _msk->get_int(F_TIPORIP) != 1 && diff != ZERO; - TRectype* key = new TRectype(LF_RRIP); - const char tipo = _msk->get(F_TIPO)[0]; - key->put("TIPO", tipo); - key->put("CODICE", _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I)); - - TRecord_array a(LF_RRIP, "NRIGA"); - a.set_key(key); - - TSheet_field& sheet = _msk->sfield(F_SHEET); - TMask& sm = sheet.sheet_mask(); - - FOR_EACH_SHEET_ROW(sheet, i, row) - { - TRectype& rec = a.row(i+1, true); // Crea una riga nuova - for (int i = sm.fields()-1; i >= 0; i--) - { - TMask_field& mf = sm.fld(i); - if (mf.field() != NULL) - { - const int idx = sheet.cid2index(mf.dlg()); - if (idx >= 0 && idx <= 17) - mf.field()->write(row->get(idx), rec); - } - } - if (has_tot) - diff -= rec.get_real(RRIP_RIPARTO); - } - if (has_tot && !_msk->get_real(F_DIFFERENZA).is_zero()) - { - if (yesno_box(FR("Il totale da ripartire differisce di %s\ndal totale delle righe devo aggiungere la differenza all'ultima riga"), diff.stringa())) - a[a.last_row()].add(RRIP_RIPARTO, diff); - else - { - TRectype & rec = a.row(-1, true); - rec.put(RRIP_RIPARTO, diff); - } - } - a.rewrite(); -} - -void TRiparti_app::read_rows() -{ - const char tipo = _msk->get(F_TIPO)[0]; - TToken_string key; - key << tipo << '|' << _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I); - TRecord_array a(key, LF_RRIP); - - TSheet_field& sheet = _msk->sfield(F_SHEET); - TMask& sm = sheet.sheet_mask(); - sheet.destroy(); - for (int i = 1; i <= a.rows(); i++) - { - TToken_string& row = sheet.row(i-1); - const TRectype& rec = a.row(i); - for (int i = sm.fields()-1; i >= 0; i--) - { - TMask_field& mf = sm.fld(i); - if (mf.field() != NULL) - { - const int idx = sheet.cid2index(mf.dlg()); - if (idx >= 0 && idx <= 17) - row.add(mf.field()->read(rec), idx); - } - } - } -} - -bool TRiparti_app::get_next_key(TToken_string& key) -{ - long num = 1; - - const char tipo = _msk->get(F_TIPO)[0]; - TString query; - query << "USE RIP\nFROM TIPO=" << tipo << "\nTO TIPO=" << tipo; - TISAM_recordset rip_recset(query); - - if (rip_recset.move_last()) - num += rip_recset.get(RIP_CODICE).as_int(); - - //la scelta del campo della maschera su cui scrivere dipende dal tipo di ripartizione scelta nel radiobutton dei tipi - long codice = F_CODICE_I; - if (tipo == 'B') - codice = F_CODICE_B; - - key.format("%d|%c|%d|%ld", F_TIPO, tipo, codice, num); - return true; -} - -int TRiparti_app::write(const TMask& m) -{ - write_rows(); - return TRelation_application::write(m); -} - -int TRiparti_app::rewrite(const TMask& m) -{ - write_rows(); - return TRelation_application::rewrite(m); -} - -int TRiparti_app::read(TMask& m) -{ - const int err = TRelation_application::read(m); - if (err == NOERR) - read_rows(); - return err; -} - -bool TRiparti_app::user_create() -{ - _rel = new TRelation(LF_RIP); - _msk = new TRiparti_msk; - return true; -} - -bool TRiparti_app::user_destroy() -{ - delete _rel; - delete _msk; - return true; -} - -int ca0800(int argc, char* argv[]) -{ - TRiparti_app a; - a.run(argc, argv, TR("Tabella di ripartizione")); - return 0; -} - +#include +#include +#include +#include + +#include "ca0800a.h" +#include "calib01.h" + +#include "fasi.h" +#include "rip.h" +#include "rrip.h" + +/////////////////////////////////////////////////////////// +// TRiparti_msk +/////////////////////////////////////////////////////////// + +class TRiparti_msk : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + int create_sheet_fields(int lf, int& y, short& dlg); + void genera_righe_fasi(); + void create_sheet(); + +public: + TRiparti_msk(); +}; + +void TRiparti_msk::genera_righe_fasi() +{ + //data una commessa in ingresso, la si vuole ripartire sulle sue fasi + TString80 commessa; + for (short id = F_CODCMS_1; id2pos(id) > 0; id++) + commessa << get(id); + + if (commessa.full()) + { + //sheet della maschera da riempire + TSheet_field& sheet = sfield(F_SHEET); + sheet.destroy(); + //quali sono le fasi legate a 'sto cavolo di commessa? + TISAM_recordset fasi("USE FASI\nFROM CODCMSFAS=#COMMESSA\nTO CODCMSFAS=#COMMESSA"); + fasi.set_var("#COMMESSA", TVariant(commessa)); + TToken_string wts; + for (bool ok = fasi.move_first(); ok; ok = fasi.move_next()) + { + wts = " "; + wts.add(commessa); + wts.add(fasi.get(FASI_CODFASE).as_string()); + sheet.row(-1) = wts; + } + sheet.force_update(); //scrive le righe effettivamente + } //if(commessa.full()... +} + +bool TRiparti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + //gestione tipo di ripartizioni possibili + //0 = percentuale; 1 = in base al peso economico della commessa; 2 = per parti (modello cocktail) + case F_TIPO: + if (e == fe_init || e == fe_modify) + { + TSheet_field& sf = sfield(F_SHEET); + const char tipo = o.get()[0]; + + switch (tipo) + { + case 'I': + sf.enable_column(sf.cid2index(118)); + break; + case 'B': + case 'P': + default: + { + sf.enable_column(sf.cid2index(118), false); + const int items = sf.items(); + + for (int r = 0; r < items; r++ ) + { + TToken_string & row = sf.row(r); + + row.add("", sf.cid2index(118)); + } + } + break; + } + sf.force_update(); + } + case F_TIPORIP: + if (e == fe_init || e == fe_modify) + { + TSheet_field& sf = sfield(F_SHEET); + TMask& sm = sf.sheet_mask(); + const int t = atoi(o.get()); + switch (t) + { + case 0: //percentuale + { + sm.hide(201); + sm.show(101); + sm.enable(101); + sf.enable_column(0); + set(F_TOTRIP, CENTO); + disable(F_TOTRIP); + show(F_SOMMA); + show(F_DIFFERENZA); + } + break; + case 1: //peso economico della commessa (non viene specificato nulla, la ripartizione avviene in base ai saldi) + { + sm.show(101); + sm.disable(101); //necessario per non avere 2 campi abilitati e nascosti nella stessa posizione (dà errore) + sm.hide(201); + sf.enable_column(0, false); + disable(F_TOTRIP); + hide(F_TOTRIP); + hide(F_SOMMA); + hide(F_DIFFERENZA); + } + break; + case 2: //parti + { + sm.hide(101); + sm.show(201); + sm.enable(201); + sf.enable_column(0); + enable(F_TOTRIP); + show(F_SOMMA); + show(F_DIFFERENZA); + } + break; + } + + sf.force_update(); + } + break; + case F_SHEET: + if (e == fe_init || (e == se_leave && o.dirty())) + { + TSheet_field& sf = sfield(F_SHEET); + real tot; + FOR_EACH_SHEET_ROW(sf, i, row) + tot += real(row->get(0)); + const int t = atoi(get(F_TIPORIP)); + + tot.round(5); + set(F_SOMMA, tot); + real diff = get_real(F_TOTRIP); + if (diff != ZERO) + diff -= tot; + set(F_DIFFERENZA, diff); + } + break; + case F_GENFASI: + if (e == fe_init) + { + bool accendimi = insert_mode(); + if (accendimi) + { + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + accendimi = fasinfo.parent() == LF_COMMESSE; + } + o.show(accendimi); + } + if (e == fe_button) + genera_righe_fasi(); + break; + default: + break; + } + return true; +} + +int TRiparti_msk::create_sheet_fields(int lf, int& y, short& dlg) +{ + TSheet_field& sf = sfield(F_SHEET); + TMask& sm = sf.sheet_mask(); + const int h = ca_create_fields(sm, 0, lf, 1, y, dlg, dlg+50); + + for (int i = 0; i < h; i++) + { + TEdit_field& fld = sm.efield(dlg+i); + int logic = lf; + if (logic == LF_FASI) + { + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + if (fasinfo.parent() != 0) + { + const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent()); + if (i < parinfo.levels()) + logic = fasinfo.parent(); + } + } + + if (logic == LF_PCON) + { + const TFieldref* f = fld.field(); + const TString16 fieldname = f->name(); + + if (fieldname == "GRUPPO") + fld.set_field("CODCONTO[1,3]"); else + if (fieldname == "CONTO") + fld.set_field("CODCONTO[4,6]"); else + if (fieldname == "SOTTOCONTO") + fld.set_field("CODCONTO[7,12]"); + } + else + { + const char* fieldname = NULL; + switch(logic) + { + case LF_CDC : fieldname = RRIP_CODCOSTO; break; + case LF_COMMESSE: fieldname = RRIP_CODCMS; break; + case LF_FASI : fieldname = RRIP_CODFASE; break; + default : fieldname = RRIP_CODCONTO; break; + } + TFieldref* f = (TFieldref*)fld.field(); + f->set_name(fieldname); + } + } + + y += h+1; + dlg += h; + return h; +} + +void TRiparti_msk::create_sheet() +{ + TSheet_field& sf = sfield(F_SHEET); + TMask& sm = sf.sheet_mask(); + sm.hide(-1); + + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + + TConfig& ini = ca_config(); + + int y = 1; + short dlg = 202; + + for (int i = 0; i < 2; i++) + { + const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 + if (level == "CDC") // Crea centro di costo + { + if (fasinfo.parent() == LF_CDC) + create_sheet_fields(LF_FASI, y, dlg); + else + create_sheet_fields(LF_CDC, y, dlg); + } else + if (level == "CMS") // Crea commessa + { + if (fasinfo.parent() == LF_COMMESSE) + create_sheet_fields(LF_FASI, y, dlg); + else + create_sheet_fields(LF_COMMESSE, y, dlg); + } + } + + if (fasinfo.levels() > 0 && fasinfo.parent() <= 0) + create_sheet_fields(LF_FASI, y, dlg); + + const bool use_pdc = ini.get_bool("UsePdcc"); + create_sheet_fields(use_pdc ? LF_PCON : LF_PCONANA, y, dlg); + + for (short id = 217; id >= 202; id--) + { + const int pos = sm.id2pos(id); + if (pos >= 0) + { + TMask_field& f = sm.fld(pos); + const int size = f.size(); + const TString& prompt = f.prompt(); + sf.set_column_header(id, prompt); + sf.set_column_justify(id, f.is_kind_of(CLASS_REAL_FIELD)); + sf.set_column_width(id, (max(3+size, prompt.len()+1)) * CHARX); + } + else + { + sf.delete_column(id); + } + } +} + +TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a") +{ + TConfig& ini = ca_config(); + + // Crea gli eventuali campi per commessa e centro di costo + const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI); + int y = 12; + for (int i = 0; i < 2; i++) + { + const char* prompt = NULL; + int h = 0; + const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2 + if (level == "CDC") // Crea centro di costo + { + h = ca_create_fields(*this, 0, LF_CDC, 2, y, F_CODCDC_1, F_DESCDC_1); + prompt = TR("@bCentro di costo"); + } else + if (level == "CMS") // Crea commessa + { + if (fasinfo.parent() == LF_COMMESSE) + { + h = ca_create_fields(*this, 0, LF_FASI, 2, y, F_CODCMS_1, F_DESCMS_1); + prompt = TR("@bCommessa/Fase"); + + const TMultilevel_code_info& cmsinfo = ca_multilevel_code_info(LF_COMMESSE); + const int cmslevels = cmsinfo.levels(); + for (int j = 0; j < cmslevels; j++) + { + TEdit_field& cfld = efield(F_CODCMS_1+j); + const TFieldref& fr = cmsinfo.fieldref(j); + TString80 str = RIP_CODCMS; + if (cmslevels > 1) + str.format("%s[%d,%d]", RIP_CODCMS, fr.from()+1, fr.to()); + cfld.set_field(str); + } + } + else + { + h = ca_create_fields(*this, 0, LF_COMMESSE, 2, y, F_CODCMS_1, F_DESCMS_1); + prompt = TR("@bCommessa"); + } + } else + if (level == "FSC" && fasinfo.parent() <= 0) + { + h = ca_create_fields(*this, 0, LF_FASI, 2, y, F_CODCMS_1, F_DESCMS_1); + prompt = TR("@bFase"); + } + + if (prompt != NULL) // Crea groupbox + { + const int last = fields()-1; + for (int j = 0; j < 2*h; j++) + fld(last-j).set_group(2); + + h += 2; + TGroup_field& grp = add_groupbox(F_LEVEL_1+i, 0, prompt, 1, y-1, 78, h); + grp.set_group(2); + y += h; + } + } + create_sheet(); +} + + +/////////////////////////////////////////////////////////// +// TRiparti_app +/////////////////////////////////////////////////////////// + +class TRiparti_app : public TRelation_application +{ + TRelation* _rel; + TRiparti_msk* _msk; + + const TString& somma_campi(TToken_string& row, int first, bool pdc = false) const; + void write_rows(); + + void spezza_campo(const TString& str, TToken_string& row, int first) const; + void read_rows(); + +protected: + virtual const char* extra_modules() const {return "ci|cm";} //funziona anche con autorizzazione CM + + virtual bool user_create(); + virtual bool user_destroy(); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + virtual int read(TMask& m); + virtual bool get_next_key(TToken_string& key); + + virtual TRelation* get_relation() const { return _rel; } + virtual TMask* get_mask(int) { return _msk; } +}; + +const TString& TRiparti_app::somma_campi(TToken_string& row, int first, bool pdc) const +{ + TSheet_field& sheet = _msk->sfield(F_SHEET); + TMask& m = sheet.sheet_mask(); + + const short id = 201 + first; + + TString& str = get_tmp_string(20); + for (int i = 0; i < 4; i++) + { + TString80 token = row.get(first+i); + if (m.id2pos(id+i) < 0) + break; + const TEdit_field& fld = m.efield(id+i); + if (pdc) + token.right_just(fld.size(), '0'); + else + token.left_just(fld.size()); + str << token; + } + return str; +} + +void TRiparti_app::spezza_campo(const TString& str, TToken_string& row, int first) const +{ + TSheet_field& sheet = _msk->sfield(F_SHEET); + TMask& m = sheet.sheet_mask(); + TString80 token; + + const short id = 201 + first; + int start = 0; + for (int i = 0; i < 4; i++) + { + if (m.id2pos(id+i) < 0) + break; + const TEdit_field& fld = m.efield(id+i); + const int len = fld.size(); + token = str.mid(start, len); token.trim(); + row.add(token, first+i); + start += len; + } +} + +void TRiparti_app::write_rows() +{ + real diff = _msk->get_real(F_TOTRIP); + const bool has_tot = _msk->get_int(F_TIPORIP) != 1 && diff != ZERO; + TRectype* key = new TRectype(LF_RRIP); + const char tipo = _msk->get(F_TIPO)[0]; + key->put("TIPO", tipo); + key->put("CODICE", _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I)); + + TRecord_array a(LF_RRIP, "NRIGA"); + a.set_key(key); + + TSheet_field& sheet = _msk->sfield(F_SHEET); + TMask& sm = sheet.sheet_mask(); + + FOR_EACH_SHEET_ROW(sheet, i, row) + { + TRectype& rec = a.row(i+1, true); // Crea una riga nuova + for (int i = sm.fields()-1; i >= 0; i--) + { + TMask_field& mf = sm.fld(i); + if (mf.field() != NULL) + { + const int idx = sheet.cid2index(mf.dlg()); + if (idx >= 0 && idx <= 17) + mf.field()->write(row->get(idx), rec); + } + } + if (has_tot) + diff -= rec.get_real(RRIP_RIPARTO); + } + if (has_tot && _msk->get_real(F_DIFFERENZA) != ZERO) + { + if (yesno_box(FR("Il totale da ripartire differisce di %s\ndal totale delle righe devo aggiungere la differenza all'ultima riga"), diff.stringa())) + a[a.last_row()].add(RRIP_RIPARTO, diff); + else + { + TRectype & rec = a.row(-1, true); + rec.put(RRIP_RIPARTO, diff); + } + } + a.rewrite(); +} + +void TRiparti_app::read_rows() +{ + const char tipo = _msk->get(F_TIPO)[0]; + TToken_string key; + key << tipo << '|' << _msk->get(tipo == 'B' ? F_CODICE_B : F_CODICE_I); + TRecord_array a(key, LF_RRIP); + + TSheet_field& sheet = _msk->sfield(F_SHEET); + TMask& sm = sheet.sheet_mask(); + sheet.destroy(); + for (int i = 1; i <= a.rows(); i++) + { + TToken_string& row = sheet.row(i-1); + const TRectype& rec = a.row(i); + for (int i = sm.fields()-1; i >= 0; i--) + { + TMask_field& mf = sm.fld(i); + if (mf.field() != NULL) + { + const int idx = sheet.cid2index(mf.dlg()); + if (idx >= 0 && idx <= 17) + row.add(mf.field()->read(rec), idx); + } + } + } +} + +bool TRiparti_app::get_next_key(TToken_string& key) +{ + long num = 1; + + const char tipo = _msk->get(F_TIPO)[0]; + TString query; + query << "USE RIP\nFROM TIPO=" << tipo << "\nTO TIPO=" << tipo; + TISAM_recordset rip_recset(query); + const long items = rip_recset.items(); + + if (rip_recset.move_last()) + num += rip_recset.get(RIP_CODICE).as_int(); + + //la scelta del campo della maschera su cui scrivere dipende dal tipo di ripartizione scelta nel radiobutton dei tipi + long codice = F_CODICE_I; + if (tipo == 'B') + codice = F_CODICE_B; + + key.format("%d|%c|%d|%ld", F_TIPO, tipo, codice, num); + return true; +} + +int TRiparti_app::write(const TMask& m) +{ + write_rows(); + return TRelation_application::write(m); +} + +int TRiparti_app::rewrite(const TMask& m) +{ + write_rows(); + return TRelation_application::rewrite(m); +} + +int TRiparti_app::read(TMask& m) +{ + const int err = TRelation_application::read(m); + if (err == NOERR) + read_rows(); + return err; +} + +bool TRiparti_app::user_create() +{ + _rel = new TRelation(LF_RIP); + _msk = new TRiparti_msk; + return true; +} + +bool TRiparti_app::user_destroy() +{ + delete _rel; + delete _msk; + return true; +} + +int ca0800(int argc, char* argv[]) +{ + TRiparti_app a; + a.run(argc, argv, TR("Tabella di ripartizione")); + return 0; +} + diff --git a/src/ca/ca0800a.uml b/src/ca/ca0800a.uml index 2ac4f7008..58f8d66af 100755 --- a/src/ca/ca0800a.uml +++ b/src/ca/ca0800a.uml @@ -1,423 +1,425 @@ -#include "ca0800a.h" - -TOOLBAR "topbar" 0 0 0 2 -#include -ENDPAGE - -PAGE "Ripartizioni" 0 0 0 2 - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 0 "" -END - -RADIOBUTTON F_TIPO 1 76 -BEGIN - PROMPT 2 0 "" - FLAGS "ZP" - ITEM "I|Interattiva" - MESSAGE SHOW,1@|HIDE,2@ - ITEM "B|Batch" - MESSAGE SHOW,2@|HIDE,1@ - ITEM "P|Pareggio" - MESSAGE SHOW,1@|HIDE,2@ - FIELD TIPO - KEY 1 -END - -STRING F_CODICE_I 8 -BEGIN - PROMPT 2 2 "Codice " - FLAGS "Z" - USE LF_RIP - INPUT TIPO F_TIPO SELECT - INPUT CODICE F_CODICE_I - DISPLAY "Codice@8" CODICE - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - DISPLAY "Descrizione@50" DESCRIZ - OUTPUT F_CODICE_I CODICE - OUTPUT F_DESCRIZ_I DESCRIZ - CHECKTYPE REQUIRED - FIELD CODICE - KEY 1 - GROUP 1 -END - -STRING F_CODICE_B 8 -BEGIN - PROMPT 2 2 "Codice " - FLAGS "Z" - USE LF_RIP - INPUT TIPO "B" - INPUT CODICE F_CODICE_B - DISPLAY "Codice@8 " CODICE - DISPLAY "Costo@20" CODCOSTO - DISPLAY "Commessa@20" CODCMS - DISPLAY "Descrizione@50" DESCRIZ - DISPLAY "Fase@10" CODFASE - OUTPUT F_CODICE_B CODICE - OUTPUT F_DESCRIZ_B DESCRIZ - CHECKTYPE REQUIRED - FIELD CODICE - KEY 1 - GROUP 2 -END - -STRING F_DESCRIZ_I 50 -BEGIN - PROMPT 24 2 "" - USE LF_RIP KEY 2 - INPUT TIPO "I" - INPUT DESCRIZ F_DESCRIZ_I - DISPLAY "Descrizione@50" DESCRIZ - DISPLAY "Codice " CODICE - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" CONTO - COPY OUTPUT F_CODICE_I - FIELD DESCRIZ - KEY 2 - GROUP 1 -END - -STRING F_DESCRIZ_B 50 -BEGIN - PROMPT 24 2 "" - COPY USE F_DESCRIZ_I - INPUT TIPO "B" - INPUT DESCRIZ F_DESCRIZ_B - DISPLAY "Descrizione@50" DESCRIZ - DISPLAY "Codice " CODICE - DISPLAY "Costo@20" CODCOSTO - DISPLAY "Commessa@20" CODCMS - DISPLAY "Fase@10" CODFASE - COPY OUTPUT F_CODICE_B - FIELD DESCRIZ - KEY 2 - GROUP 2 -END - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 4 "@bConto" - GROUP 1 -END - -NUMBER F_GRUPPO 3 -BEGIN - PROMPT 2 5 "Conto " - USE LF_PCON - INPUT GRUPPO F_GRUPPO - INPUT CONTO F_CONTO - INPUT SOTTOCONTO F_SOTTOCONTO - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT F_GRUPPO GRUPPO - OUTPUT F_CONTO CONTO - OUTPUT F_SOTTOCONTO SOTTOCONTO - OUTPUT F_DESCR DESCR - CHECKTYPE REQUIRED - FIELD GRUPPO - GROUP 1 -END - -NUMBER F_CONTO 3 -BEGIN - PROMPT 22 5 "" - COPY ALL F_GRUPPO - FIELD CONTO - CHECKTYPE NORMAL - GROUP 1 -END - -NUMBER F_SOTTOCONTO 6 -BEGIN - PROMPT 30 5 "" - COPY ALL F_GRUPPO - FIELD SOTTOCONTO - CHECKTYPE NORMAL - GROUP 1 -END - -STRING F_DESCR 50 -BEGIN - PROMPT 2 6 "Descrizione " - USE LF_PCON KEY 2 - INPUT DESCR F_DESCR - DISPLAY "Descrizione@50" DESCR - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - COPY OUTPUT F_GRUPPO - CHECKTYPE REQUIRED - GROUP 1 -END - -NUMBER F_ANNOES 4 -BEGIN - PROMPT 2 8 "Esercizio " - USE ESC - INPUT CODTAB F_ANNOES - DISPLAY "Codice Esercizio" CODTAB - DISPLAY "Data inizio esercizio" D0 - DISPLAY "Data fine esercizio " D1 - OUTPUT F_ANNOES CODTAB - FIELD ANNOES - CHECKTYPE NORMAL -END - -LIST F_INDBIL 16 -BEGIN - PROMPT 20 8 "Indicatore di bilancio " - ITEM "0|0. Non definito" - ITEM "1|1. Attivita'" - ITEM "2|2. Passivita'" - ITEM "3|3. Costi" - ITEM "4|4. Ricavi" - FIELD INDBIL -END - -LIST F_CLASSEMOV 25 -BEGIN - PROMPT 2 9 "Classe movimento " - ITEM "0|Tutti" - ITEM "1|Normali e Temporanei" - ITEM "2|Preventivi e Variazioni" - FIELD CLASSEMOV - GROUP 2 -END - -ENDPAGE - -PAGE "Righe" -1 -1 78 22 - -RADIOBUTTON F_TIPORIP 1 78 -BEGIN - PROMPT 1 0 "Ripartizione" - FLAGS "Z" - ITEM "0|Percentuale" - ITEM "1|Costo\Ricavo" - ITEM "2|Parti" - FIELD TIPORIP -END - -NUMBER F_TOTRIP 15 5 -BEGIN - PROMPT 2 3 "Totale " - FIELD TOTRIP -END - -NUMBER F_SOMMA 15 5 -BEGIN - PROMPT 27 3 "Somma " - FLAGS "D" -END - -NUMBER F_DIFFERENZA 15 5 -BEGIN - PROMPT 51 3 "Differenza " - FLAGS "D" -END - -SPREADSHEET F_SHEET 80 -3 -BEGIN - PROMPT 0 4 "" - ITEM "Ripartiz.@15F" - ITEM "Cdc1" - ITEM "Cdc2" - ITEM "Cdc3" - ITEM "Cdc4" - ITEM "Cms1" - ITEM "Cms2" - ITEM "Cms3" - ITEM "Cms4" - ITEM "Fas1" - ITEM "Fas2" - ITEM "Fas3" - ITEM "Fas4" - ITEM "Con1" - ITEM "Con2" - ITEM "Con3" - ITEM "Con4" - ITEM "Articolo@20" -END - -BUTTON F_GENFASI 60 2 -BEGIN - PROMPT -11 -1 "Ripartire la commessa d'origine tra le sue fasi" -END - -ENDPAGE - -ENDMASK - -PAGE "Sheet" -1 -1 78 19 - -NUMBER 101 15 5 -BEGIN - PROMPT 1 0 "% Ripartizione " - FLAGS "U" - FIELD RIPARTO - MESSAGE COPY,201 -END - -NUMBER 201 15 5 -BEGIN - PROMPT 1 0 "Numero parti " - FLAGS "U" - FIELD RIPARTO - MESSAGE COPY,101 -END - -STRING 102 20 -BEGIN - PROMPT 1 1 "Cdc1 " - USE LF_CDC - GROUP 1 -END - -STRING 103 20 -BEGIN - PROMPT 1 2 "Cdc2 " - COPY USE 102 - GROUP 1 -END - -STRING 104 20 -BEGIN - PROMPT 1 3 "Cdc3 " - COPY USE 102 - GROUP 1 -END - -STRING 105 20 -BEGIN - PROMPT 1 4 "Cdc4 " - COPY USE 102 - GROUP 1 -END - -STRING 106 20 -BEGIN - PROMPT 1 5 "Cms1 " - USE LF_COMMESSE - GROUP 1 -END - -STRING 107 20 -BEGIN - PROMPT 1 6 "Cms2 " - COPY USE 106 - GROUP 1 -END - -STRING 108 20 -BEGIN - PROMPT 1 7 "Cms3 " - COPY USE 106 - GROUP 1 -END - -STRING 109 20 -BEGIN - PROMPT 1 8 "Cms4 " - COPY USE 106 - GROUP 1 -END - -STRING 110 20 -BEGIN - PROMPT 1 9 "Fas1 " - USE LF_FASI - GROUP 1 -END - -STRING 111 10 -BEGIN - PROMPT 1 10 "Fas2 " - COPY USE 110 - GROUP 1 -END - -STRING 112 10 -BEGIN - PROMPT 1 11 "Fas3 " - COPY USE 110 - GROUP 1 -END - -STRING 113 10 -BEGIN - PROMPT 1 12 "Fas4 " - COPY USE 110 - GROUP 1 -END - -STRING 114 20 -BEGIN - PROMPT 1 14 "Gruppo " - USE LF_PCON - GROUP 1 -END - -STRING 115 20 -BEGIN - PROMPT 27 14 "Conto " - COPY USE 114 - GROUP 1 -END - -STRING 116 20 -BEGIN - PROMPT 46 14 "Sottoconto " - COPY USE 114 - GROUP 1 -END - -STRING 117 20 -BEGIN - PROMPT 1 15 "Sottoconticino " - COPY USE 114 - GROUP 1 -END - -STRING 118 20 -BEGIN - PROMPT 1 16 "Articolo " - USE LF_ANAMAG - INPUT CODART 118 - DISPLAY "Codice@20" CODART - DISPLAY "Descrizione@50" DESCR - OUTPUT 118 CODART - CHECKTYPE NORMAL - ADD RUN ve2 -3 - FIELD CODART -END - - -ENDPAGE - -TOOLBAR "topbar" 0 0 0 2 - -BUTTON DLG_OK 10 2 -BEGIN - PROMPT -13 -1 "" -END - -BUTTON DLG_DELREC 10 2 -BEGIN - PROMPT -23 -1 "" -END - -BUTTON DLG_CANCEL 10 2 -BEGIN - PROMPT -33 -1 "" -END - -ENDPAGE - +#include "ca0800a.h" + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +PAGE "Ripartizioni" 0 0 0 2 + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 0 "" +END + +RADIOBUTTON F_TIPO 1 76 +BEGIN + PROMPT 2 0 "" + FLAGS "ZP" + ITEM "I|Interattiva" + MESSAGE SHOW,1@|HIDE,2@ + ITEM "B|Batch" + MESSAGE SHOW,2@|HIDE,1@ + ITEM "P|Pareggio" + MESSAGE SHOW,1@|HIDE,2@ + FIELD TIPO + KEY 1 +END + +STRING F_CODICE_I 8 +BEGIN + PROMPT 2 2 "Codice " + FLAGS "Z" + USE LF_RIP + INPUT TIPO F_TIPO SELECT + INPUT CODICE F_CODICE_I + DISPLAY "Codice@8" CODICE + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCRIZ + OUTPUT F_CODICE_I CODICE + OUTPUT F_DESCRIZ_I DESCRIZ + CHECKTYPE REQUIRED + FIELD CODICE + KEY 1 + GROUP 1 +END + +STRING F_CODICE_B 8 +BEGIN + PROMPT 2 2 "Codice " + FLAGS "Z" + USE LF_RIP + INPUT TIPO "B" + INPUT CODICE F_CODICE_B + DISPLAY "Codice@8 " CODICE + DISPLAY "Costo@20" CODCOSTO + DISPLAY "Commessa@20" CODCMS + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Fase@10" CODFASE + OUTPUT F_CODICE_B CODICE + OUTPUT F_DESCRIZ_B DESCRIZ + CHECKTYPE REQUIRED + FIELD CODICE + KEY 1 + GROUP 2 +END + +STRING F_DESCRIZ_I 50 +BEGIN + PROMPT 24 2 "" + USE LF_RIP KEY 2 + INPUT TIPO "I" + INPUT DESCRIZ F_DESCRIZ_I + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Codice " CODICE + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" CONTO + COPY OUTPUT F_CODICE_I + FIELD DESCRIZ + KEY 2 + GROUP 1 +END + +STRING F_DESCRIZ_B 50 +BEGIN + PROMPT 24 2 "" + COPY USE F_DESCRIZ_I + INPUT TIPO "B" + INPUT DESCRIZ F_DESCRIZ_B + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Codice " CODICE + DISPLAY "Costo@20" CODCOSTO + DISPLAY "Commessa@20" CODCMS + DISPLAY "Fase@10" CODFASE + COPY OUTPUT F_CODICE_B + FIELD DESCRIZ + KEY 2 + GROUP 2 +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 4 "@bConto" + GROUP 1 +END + +NUMBER F_GRUPPO 3 +BEGIN + PROMPT 2 5 "Conto " + USE LF_PCON + INPUT GRUPPO F_GRUPPO + INPUT CONTO F_CONTO + INPUT SOTTOCONTO F_SOTTOCONTO + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPO GRUPPO + OUTPUT F_CONTO CONTO + OUTPUT F_SOTTOCONTO SOTTOCONTO + OUTPUT F_DESCR DESCR + CHECKTYPE REQUIRED + FIELD GRUPPO + GROUP 1 +END + +NUMBER F_CONTO 3 +BEGIN + PROMPT 22 5 "" + COPY ALL F_GRUPPO + FIELD CONTO + CHECKTYPE NORMAL + GROUP 1 +END + +NUMBER F_SOTTOCONTO 6 +BEGIN + PROMPT 30 5 "" + COPY ALL F_GRUPPO + FIELD SOTTOCONTO + CHECKTYPE NORMAL + GROUP 1 +END + +STRING F_DESCR 50 +BEGIN + PROMPT 2 6 "Descrizione " + USE LF_PCON KEY 2 + INPUT DESCR F_DESCR + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + COPY OUTPUT F_GRUPPO + CHECKTYPE REQUIRED + GROUP 1 +END + +NUMBER F_ANNOES 4 +BEGIN + PROMPT 2 8 "Esercizio " + USE ESC + INPUT CODTAB F_ANNOES + DISPLAY "Codice Esercizio" CODTAB + DISPLAY "Data inizio esercizio" D0 + DISPLAY "Data fine esercizio " D1 + OUTPUT F_ANNOES CODTAB + FIELD ANNOES + CHECKTYPE NORMAL +END + +LIST F_INDBIL 16 +BEGIN + PROMPT 20 8 "Indicatore di bilancio " + ITEM "0|0. Non definito" + ITEM "1|1. Attivita'" + ITEM "2|2. Passivita'" + ITEM "3|3. Costi" + ITEM "4|4. Ricavi" + FIELD INDBIL +END + +LIST F_CLASSEMOV 25 +BEGIN + PROMPT 2 9 "Classe movimento " + ITEM "0|Tutti" + ITEM "1|Normali e Temporanei" + ITEM "2|Preventivi e Variazioni" + FIELD CLASSEMOV + GROUP 2 +END + +ENDPAGE + +PAGE "Righe" -1 -1 78 22 + +RADIOBUTTON F_TIPORIP 1 78 +BEGIN + PROMPT 1 0 "Ripartizione" + FLAGS "Z" + ITEM "0|Percentuale" + ITEM "1|Costo\Ricavo" + ITEM "2|Parti" + FIELD TIPORIP +END + +NUMBER F_TOTRIP 15 5 +BEGIN + PROMPT 2 3 "Totale " + FIELD TOTRIP +END + +NUMBER F_SOMMA 15 5 +BEGIN + PROMPT 27 3 "Somma " + FLAGS "D" +END + +NUMBER F_DIFFERENZA 15 5 +BEGIN + PROMPT 51 3 "Differenza " + FLAGS "D" +END + +SPREADSHEET F_SHEET 80 -3 +BEGIN + PROMPT 0 4 "" + ITEM "Ripartiz.@15F" + ITEM "Cdc1" + ITEM "Cdc2" + ITEM "Cdc3" + ITEM "Cdc4" + ITEM "Cms1" + ITEM "Cms2" + ITEM "Cms3" + ITEM "Cms4" + ITEM "Fas1" + ITEM "Fas2" + ITEM "Fas3" + ITEM "Fas4" + ITEM "Con1" + ITEM "Con2" + ITEM "Con3" + ITEM "Con4" + ITEM "Articolo@20" +END + +BUTTON F_GENFASI 60 2 +BEGIN + PROMPT -11 -1 "Ripartire la commessa d'origine tra le sue fasi" +END + +ENDPAGE + +ENDMASK + +PAGE "Sheet" -1 -1 78 19 + +NUMBER 101 15 5 +BEGIN + PROMPT 1 0 "% Ripartizione " + FLAGS "U" + FIELD RIPARTO + MESSAGE COPY,201 +END + +NUMBER 201 15 5 +BEGIN + PROMPT 1 0 "Numero parti " + FLAGS "U" + FIELD RIPARTO + MESSAGE COPY,101 +END + +STRING 102 20 +BEGIN + PROMPT 1 1 "Cdc1 " + USE LF_CDC + GROUP 1 +END + +STRING 103 20 +BEGIN + PROMPT 1 2 "Cdc2 " + COPY USE 102 + GROUP 1 +END + +STRING 104 20 +BEGIN + PROMPT 1 3 "Cdc3 " + COPY USE 102 + GROUP 1 +END + +STRING 105 20 +BEGIN + PROMPT 1 4 "Cdc4 " + COPY USE 102 + GROUP 1 +END + +STRING 106 20 +BEGIN + PROMPT 1 5 "Cms1 " + USE LF_COMMESSE + GROUP 1 +END + +STRING 107 20 +BEGIN + PROMPT 1 6 "Cms2 " + COPY USE 106 + GROUP 1 +END + +STRING 108 20 +BEGIN + PROMPT 1 7 "Cms3 " + COPY USE 106 + GROUP 1 +END + +STRING 109 20 +BEGIN + PROMPT 1 8 "Cms4 " + COPY USE 106 + GROUP 1 +END + +STRING 110 20 +BEGIN + PROMPT 1 9 "Fas1 " + USE LF_FASI + GROUP 1 +END + +STRING 111 10 +BEGIN + PROMPT 1 10 "Fas2 " + COPY USE 110 + GROUP 1 +END + +STRING 112 10 +BEGIN + PROMPT 1 11 "Fas3 " + COPY USE 110 + GROUP 1 +END + +STRING 113 10 +BEGIN + PROMPT 1 12 "Fas4 " + COPY USE 110 + GROUP 1 +END + +STRING 114 20 +BEGIN + PROMPT 1 14 "Gruppo " + USE LF_PCON + GROUP 1 +END + +STRING 115 20 +BEGIN + PROMPT 27 14 "Conto " + COPY USE 114 + GROUP 1 +END + +STRING 116 20 +BEGIN + PROMPT 46 14 "Sottoconto " + COPY USE 114 + GROUP 1 +END + +STRING 117 20 +BEGIN + PROMPT 1 15 "Sottoconticino " + COPY USE 114 + GROUP 1 +END + +STRING 118 20 +BEGIN + PROMPT 1 16 "Articolo " + USE LF_ANAMAG + INPUT CODART 118 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT 118 CODART + OUTPUT 260 DESCR + CHECKTYPE NORMAL + ADD RUN ve2 -3 + FIELD CODART + MODULE CI +END + + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + ENDMASK \ No newline at end of file diff --git a/src/ca/ca1800.cpp b/src/ca/ca1800.cpp index e02d487c6..fc50102af 100755 --- a/src/ca/ca1800.cpp +++ b/src/ca/ca1800.cpp @@ -1,412 +1,421 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rmovana.h" -#include "calib01.h" -#include "calib02.h" -#include "ca1800a.h" - -//////////////////////////////////////////////////////// -// MASCHERA -//////////////////////////////////////////////////////// -class TPrint_contixcms_mask : public TAutomask -{ -protected: - virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); -public: - TPrint_contixcms_mask(); -}; - -TPrint_contixcms_mask::TPrint_contixcms_mask() : TAutomask("ca1800a") -{ - const bool has_ca = dongle().active(CAAUT); - //se la chiave ha CA mostra i campi gruppo 2 (codice e descrizione commessa).. - if (has_ca) - { - hide(-1); - show(-2); - //se le fasi sono figlie di nessuno può visualizzare il gruppo 3 (da fase a fase) - TConfig& cfg = ca_config(); - const TString& fath_fasi = cfg.get("FathFasi"); - if (fath_fasi.empty()) - show(-3); - else - hide(-3); - } - else //..se invece ha CM mostra i campi gruppo 1 (da cms a cms) e gruppo 3 (da fase a fase) - { - hide(-2); - show(-1); - show(-3); - } -} - -bool TPrint_contixcms_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - switch(o.dlg()) - { - case DLG_PRINT: - if (e == fe_button) - { - main_app().print(); - return false; - } - break; - case DLG_PREVIEW: - if (e == fe_button) - { - main_app().preview(); - return false; - } - break; - default: - break; - } - return true; -} - - -//////////////////////////////////////////////////////// -// REPORT -//////////////////////////////////////////////////////// -class TPrint_contixcms_report : public TAnal_report -{ -protected: - virtual bool use_mask() { return false; } -public: - TPrint_contixcms_report() {} -}; - - -//////////////////////////////////////////////////////// -// RECORDSET -//////////////////////////////////////////////////////// -class TPrint_contixcms_recordset : public TAS400_recordset -{ -protected: - long trova_riga(const TString& key); - -public: - bool aggiungi_riga(TISAM_recordset& recset); - TPrint_contixcms_recordset(); -}; - -TPrint_contixcms_recordset::TPrint_contixcms_recordset() -: TAS400_recordset("AS400(80)") -{ - create_field(RMOVANA_CODCMS, -1, 20, _alfafld, true); - create_field(RMOVANA_CODFASE, -1, 10, _alfafld, false); - create_field(RMOVANA_CODCONTO, -1, 12, _alfafld, true); - create_field("INDBIL", -1, 1, _intfld, true); - create_field(RMOVANA_DATACOMP, -1, 8, _datefld, true); - create_field(RMOVANA_IMPORTO, -1, 18, _realfld, true); - create_field(RMOVANA_SEZIONE, -1, 1, _alfafld, true); -} - -//cerca se una riga con chiave key esiste già -long TPrint_contixcms_recordset::trova_riga(const TString& key) -{ - long first = 0; - long last = items() - 1; - long riga = -1; - - TString80 guess_key; - - while(first <= last) - { - const long guess = (first + last) / 2; - move_to(guess); - - guess_key = get(RMOVANA_CODCMS).as_string(); //commessa - guess_key.left_just(20); - guess_key << get(RMOVANA_CODCONTO).as_string(); //conto - - const int diff = guess_key.compare(key); - if (diff == 0) - { - riga = guess; - break; - } - if (diff > 0) - { - last = guess - 1; - } - else - { - first = guess + 1; - } - } - - return riga; -} - -//funzione di ordinamento per il campo codcms/codconto -//sono 2 stringhe -static int compare_cms_conto(const TObject** o1, const TObject** o2) -{ - TString& s1 = *(TString*)*o1; - TString& s2 = *(TString*)*o2; - - const TString& cms1 = s1.left(20); - const TString& cms2 = s2.left(20); - - int cmp = cms1.compare(cms2); - - if (cmp == 0) - { - const TString& cnt1 = s1.mid(30, 12); - const TString& cnt2 = s2.mid(30, 12); - - cmp = cnt1.compare(cnt2); - } - - return cmp; -} - -//metodo per aggiungere righe al recordset da stampare -bool TPrint_contixcms_recordset::aggiungi_riga(TISAM_recordset& recset) -{ - //raccatta i dati che servono alla riga da stampare prendendoli dal record corrente del.. - //..recordset in esame riempito dalla query iniziale - const TString& codcms = recset.get(RMOVANA_CODCMS).as_string(); - const TString& codfase = recset.get(RMOVANA_CODFASE).as_string(); - const TString& codconto = recset.get(RMOVANA_CODCONTO).as_string(); - TAnal_bill zio(codconto); - const TIndbil ib = zio.indicatore_bilancio(); - //solo i conti di tipo costo/ricavo possono essere considerati (no attività/passività o non definiti) - if (ib == ib_costi || ib == ib_ricavi) - { - const TDate& datacomp = recset.get(RMOVANA_DATACOMP).as_date(); - const real curr_valore = recset.get(RMOVANA_IMPORTO).as_real(); - const char curr_sezione = recset.get(RMOVANA_SEZIONE).as_string()[0]; - TImporto curr_imp(curr_sezione, curr_valore); //importo riga correntemente in esame - - //chiave della riga (solo su commessa e conto!; la fase è solo un filtro in input) - TString80 key; - key = codcms; - key.left_just(20); - key << codconto; - - //cerca se per caso la riga non esista già con questa chiave - long numriga = trova_riga(key); - - //se la riga con la chiave key non esiste nel printrecordset la aggiunge - if (numriga < 0) - { - new_rec(""); - set(RMOVANA_CODCMS, TVariant(codcms)); - set(RMOVANA_CODFASE, TVariant(codfase)); - set(RMOVANA_CODCONTO, TVariant(codconto)); - set("INDBIL", TVariant(long(ib))); - set(RMOVANA_DATACOMP, TVariant(datacomp)); - - //deve ordinare il recordset - sort(compare_cms_conto); - - //dopo che la riga è stata aggiunta riesegue la trova_riga in modo da ottenere il numero di riga - numriga = trova_riga(key); - } - - //importo riga con indice numriga - const char tot_sezione = get(RMOVANA_SEZIONE).as_string()[0]; - const real tot_valore = get(RMOVANA_IMPORTO).as_real(); - TImporto tot_imp(tot_sezione, tot_valore); - - //aggiunge l'importo alla riga (nuova o vecchia) - tot_imp += curr_imp; - - //normalizza e risalva il valore aggiornato sulla riga - tot_imp.normalize(); - TString4 str_sez; - str_sez << tot_imp.sezione(); - set(RMOVANA_SEZIONE, str_sez); - set(RMOVANA_IMPORTO, tot_imp.valore()); - } - return true; -} - -//////////////////////////////////////////////////////// -// APPLICAZIONE -//////////////////////////////////////////////////////// -class TPrint_contixcms : public TSkeleton_application -{ - TPrint_contixcms_mask* _mask; - bool _has_ca; - -protected: - virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM - - virtual bool create(); - virtual void print(); - virtual void preview(); - virtual void print_or_preview(const bool stampa); - - TPrint_contixcms_recordset* elabora() const; - -public: - virtual void main_loop(); - -}; - - -//metodo di alto livello per la gestione dell'elaborazione -TPrint_contixcms_recordset* TPrint_contixcms::elabora() const -{ - //creazione dell'as400 recordset che verra' riempito dai record del recordset righe - TPrint_contixcms_recordset* printset = new TPrint_contixcms_recordset(); - - //creazione della query per la creazione del recordset - TString query; - query << "USE RMOVANA KEY 3\n"; - if (_has_ca) - query << "SELECT (BETWEEN(CODCMS,#CODCMS,#CODCMS))&&(BETWEEN(CODCONTO,#DACODCONTO,#ACODCONTO))\n"; - else - query << "SELECT (BETWEEN(CODCMS,#DACODCMS,#ACODCMS))&&(BETWEEN(CODFASE,#DACODFASE,#ACODFASE))&&(BETWEEN(CODCONTO,#DACODCONTO,#ACODCONTO))\n"; - query << "FROM DATACOMP=#DADATA\n"; - query << "TO DATACOMP=#ADATA"; - - TISAM_recordset recset(query); - - if (_has_ca) - recset.set_var("#CODCMS", TVariant(_mask->get(F_CODCMS))); - else - { - recset.set_var("#DACODCMS", TVariant(_mask->get(F_DACODCMS))); - recset.set_var("#ACODCMS", TVariant(_mask->get(F_ACODCMS))); - recset.set_var("#DACODFASE", TVariant(_mask->get(F_DACODFASE))); - recset.set_var("#ACODFASE", TVariant(_mask->get(F_ACODFASE))); - } - - //per il conto va gestito il fatto che il conto è contabile e non analitico ed è 0-filled - TString contone; - - int gruppo = _mask->get_int(F_GRUPPOINI); - int conto = _mask->get_int(F_CONTOINI); - long sottoconto = _mask->get_long(F_SOTTOCINI); - contone.format("%03d%03d%06ld", gruppo, conto, sottoconto); - recset.set_var("#DACODCONTO", contone); - - gruppo = _mask->get_int(F_GRUPPOFIN); - if (gruppo == 0) - gruppo = 999; - conto = _mask->get_int(F_CONTOFIN); - if (conto == 0) - conto = 999; - sottoconto = _mask->get_long(F_SOTTOCFIN); - if (sottoconto == 0) - sottoconto = 999999L; - contone.format("%03d%03d%06ld", gruppo, conto, sottoconto); - recset.set_var("#ACODCONTO", contone); - - //e alla fine le decisivissime date (che sono l'intervallo di scelta più importante) - recset.set_var("#DADATA", _mask->get_date(F_DATAINI)); - recset.set_var("#ADATA", _mask->get_date(F_DATAFIN)); - - //se ci sono record che soddisfano le pesanti richieste dell'utonto... - const long recset_items = recset.items(); - if (recset_items > 0) - { - //E crea pure la progind.. - TProgind pi(recset_items, TR("Elaborazione dati per la stampa..."), true, true); - - //Scansione del recordset trovato - for (bool ok = recset.move_first(); ok; ok = recset.move_next()) - { - if (!pi.addstatus(1)) - break; - //scrive sul CSV i campi che servono al report - printset->aggiungi_riga(recset); - } - } - - return printset; -} - - -//fantastico metodo per gestire stampa o anteprima -void TPrint_contixcms::print_or_preview(const bool stampa) -{ - if (_mask->check_fields()) - { - //l'utonto può scegliere che report usare (personalizzato!) - TString rep_name = _mask->get(F_REPORT); - //se il rep non è selezionato usa quello standard - if (rep_name.empty()) - rep_name << "ca1800a.rep"; - - TPrint_contixcms_report rep; - rep.load(rep_name); - - //metodo per la generazione del recordset che contiene tutti i dati da stampare - //insomma, il vero programma! - TPrint_contixcms_recordset* printset = elabora(); - - //appioppa il recordset al report - rep.set_recordset(printset); - - //setta i valori della maschera sul report (dopo la set_recordset, sennò.. - //..sarebbero sovrascritti dalla set_recordset) - rep.mask2report(*_mask); - - //se l'utonto vuole il dettaglio sottocontesco - if (_mask->get_bool(F_HIDESOTT)) - rep.section('B', 1).hide(); - - TReport_book book; - book.add(rep); - - if (stampa) - book.print(); - else - book.preview(); - } -} - -void TPrint_contixcms::print() -{ - print_or_preview(true); -} - -void TPrint_contixcms::preview() -{ - print_or_preview(false); -} - -void TPrint_contixcms::main_loop() -{ - _mask = new TPrint_contixcms_mask; - _mask->run(); - delete _mask; - _mask = NULL; -} - -bool TPrint_contixcms::create() -{ - //controlla se la chiave ha il modulo CA (e non solo CM) NON è ammesso CA E CM - _has_ca = dongle().active(CAAUT); - //in tal caso il programma è utilizzabile solo se si ha il piano dei conti contabile.. - if (_has_ca) - { - TConfig& cfg = ca_config(); - const bool usepdcc = cfg.get_bool("UsePdcc"); - if (!usepdcc) - return error_box(TR("Il programma non è utilizzabile con la corrente configurazione CA!")); - } - - return TSkeleton_application::create(); -} - -int ca1800(int argc, char* argv[]) -{ - TPrint_contixcms a; - a.run(argc, argv, TR("Stampa conti per commessa")); - return 0; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "movana.h" +#include "rmovana.h" +#include "calib01.h" +#include "calib02.h" +#include "ca1800a.h" + +//////////////////////////////////////////////////////// +// MASCHERA +//////////////////////////////////////////////////////// +class TPrint_contixcms_mask : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); +public: + TPrint_contixcms_mask(); +}; + +TPrint_contixcms_mask::TPrint_contixcms_mask() : TAutomask("ca1800a") +{ + const bool has_ca = dongle().active(CAAUT); + //se la chiave ha CA mostra i campi gruppo 2 (codice e descrizione commessa).. + if (has_ca) + { + hide(-1); + show(-2); + //se le fasi sono figlie di nessuno può visualizzare il gruppo 3 (da fase a fase) + TConfig& cfg = ca_config(); + const TString& fath_fasi = cfg.get("FathFasi"); + if (fath_fasi.empty()) + show(-3); + else + hide(-3); + } + else //..se invece ha CM mostra i campi gruppo 1 (da cms a cms) e gruppo 3 (da fase a fase) + { + hide(-2); + show(-1); + show(-3); + } +} + +bool TPrint_contixcms_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch(o.dlg()) + { + case DLG_PRINT: + if (e == fe_button) + { + main_app().print(); + return false; + } + break; + case DLG_PREVIEW: + if (e == fe_button) + { + main_app().preview(); + return false; + } + break; + default: + break; + } + return true; +} + + +//////////////////////////////////////////////////////// +// REPORT +//////////////////////////////////////////////////////// +class TPrint_contixcms_report : public TAnal_report +{ +protected: + virtual bool use_mask() { return false; } +public: + TPrint_contixcms_report() {} +}; + + +//////////////////////////////////////////////////////// +// RECORDSET +//////////////////////////////////////////////////////// +class TPrint_contixcms_recordset : public TAS400_recordset +{ +protected: + long trova_riga(const TString& key); + +public: + bool aggiungi_riga(TISAM_recordset& recset); + TPrint_contixcms_recordset(); +}; + +TPrint_contixcms_recordset::TPrint_contixcms_recordset() +: TAS400_recordset("AS400(80)") +{ + create_field(RMOVANA_CODCMS, -1, 20, _alfafld, true); + create_field(RMOVANA_CODFASE, -1, 10, _alfafld, false); + create_field(RMOVANA_CODCONTO, -1, 12, _alfafld, true); + create_field("INDBIL", -1, 1, _intfld, true); + create_field(RMOVANA_DATACOMP, -1, 8, _datefld, true); + create_field(RMOVANA_IMPORTO, -1, 18, _realfld, true); + create_field(RMOVANA_SEZIONE, -1, 1, _alfafld, true); +} + +//cerca se una riga con chiave key esiste già +long TPrint_contixcms_recordset::trova_riga(const TString& key) +{ + long first = 0; + long last = items() - 1; + long riga = -1; + + TString80 guess_key; + + while(first <= last) + { + const long guess = (first + last) / 2; + move_to(guess); + + guess_key = get(RMOVANA_CODCMS).as_string(); //commessa + guess_key.left_just(20); + guess_key << get(RMOVANA_CODCONTO).as_string(); //conto + + const int diff = guess_key.compare(key); + if (diff == 0) + { + riga = guess; + break; + } + if (diff > 0) + { + last = guess - 1; + } + else + { + first = guess + 1; + } + } + + return riga; +} + +//funzione di ordinamento per il campo codcms/codconto +//sono 2 stringhe +static int compare_cms_conto(const TObject** o1, const TObject** o2) +{ + TString& s1 = *(TString*)*o1; + TString& s2 = *(TString*)*o2; + + const TString& cms1 = s1.left(20); + const TString& cms2 = s2.left(20); + + int cmp = cms1.compare(cms2); + + if (cmp == 0) + { + const TString& cnt1 = s1.mid(30, 12); + const TString& cnt2 = s2.mid(30, 12); + + cmp = cnt1.compare(cnt2); + } + + return cmp; +} + +//metodo per aggiungere righe al recordset da stampare +bool TPrint_contixcms_recordset::aggiungi_riga(TISAM_recordset& recset) +{ + //raccatta i dati che servono alla riga da stampare prendendoli dal record corrente del.. + //..recordset in esame riempito dalla query iniziale + const TString& codcms = recset.get(RMOVANA_CODCMS).as_string(); + const TString& codfase = recset.get(RMOVANA_CODFASE).as_string(); + const TString& codconto = recset.get(RMOVANA_CODCONTO).as_string(); + TAnal_bill zio(codconto); + const TIndbil ib = zio.indicatore_bilancio(); + //solo i conti di tipo costo/ricavo possono essere considerati (no attività/passività o non definiti) + if (ib == ib_costi || ib == ib_ricavi) + { + const TDate& datacomp = recset.get(RMOVANA_DATACOMP).as_date(); + const real curr_valore = recset.get(RMOVANA_IMPORTO).as_real(); + const char curr_sezione = recset.get(RMOVANA_SEZIONE).as_string()[0]; + TImporto curr_imp(curr_sezione, curr_valore); //importo riga correntemente in esame + + //chiave della riga (solo su commessa e conto!; la fase è solo un filtro in input) + TString80 key; + key = codcms; + key.left_just(20); + key << codconto; + + //cerca se per caso la riga non esista già con questa chiave + long numriga = trova_riga(key); + + //se la riga con la chiave key non esiste nel printrecordset la aggiunge + if (numriga < 0) + { + new_rec(""); + set(RMOVANA_CODCMS, TVariant(codcms)); + set(RMOVANA_CODFASE, TVariant(codfase)); + set(RMOVANA_CODCONTO, TVariant(codconto)); + set("INDBIL", TVariant(long(ib))); + set(RMOVANA_DATACOMP, TVariant(datacomp)); + + //deve ordinare il recordset + sort(compare_cms_conto); + + //dopo che la riga è stata aggiunta riesegue la trova_riga in modo da ottenere il numero di riga + numriga = trova_riga(key); + } + + //importo riga con indice numriga + const char tot_sezione = get(RMOVANA_SEZIONE).as_string()[0]; + const real tot_valore = get(RMOVANA_IMPORTO).as_real(); + TImporto tot_imp(tot_sezione, tot_valore); + + //aggiunge l'importo alla riga (nuova o vecchia) + tot_imp += curr_imp; + + //normalizza e risalva il valore aggiornato sulla riga + tot_imp.normalize(); + TString4 str_sez; + str_sez << tot_imp.sezione(); + set(RMOVANA_SEZIONE, str_sez); + set(RMOVANA_IMPORTO, tot_imp.valore()); + } + return true; +} + +//////////////////////////////////////////////////////// +// APPLICAZIONE +//////////////////////////////////////////////////////// +class TPrint_contixcms : public TSkeleton_application +{ + TPrint_contixcms_mask* _mask; + bool _has_ca; + +protected: + virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM + + virtual bool create(); + virtual void print(); + virtual void preview(); + virtual void print_or_preview(const bool stampa); + + TPrint_contixcms_recordset* elabora() const; + +public: + virtual void main_loop(); + +}; + + +//metodo di alto livello per la gestione dell'elaborazione +TPrint_contixcms_recordset* TPrint_contixcms::elabora() const +{ + //creazione dell'as400 recordset che verra' riempito dai record del recordset righe + TPrint_contixcms_recordset* printset = new TPrint_contixcms_recordset(); + + //creazione della query per la creazione del recordset + TString query; + query << "USE RMOVANA KEY 3\n"; + if (_has_ca) + query << "SELECT (BETWEEN(CODCMS,#CODCMS,#CODCMS))&&(BETWEEN(CODCONTO,#DACODCONTO,#ACODCONTO))"; + else + query << "SELECT (BETWEEN(CODCMS,#DACODCMS,#ACODCMS))&&(BETWEEN(CODFASE,#DACODFASE,#ACODFASE))&&(BETWEEN(CODCONTO,#DACODCONTO,#ACODCONTO))"; + + const TString4 tipomov = _mask->get(F_TIPOMOV); + + if (tipomov.full()) + query << "&&(" << LF_MOVANA << "->" << MOVANA_TIPOMOV << (tipomov == "N" ? "==" : "!=") << "\"\")"; + query << "\n"; + if (tipomov.full()) + query << "JOIN MOVANA INTO NUMREG==NUMREG\n"; + query << "FROM DATACOMP=#DADATA\n"; + query << "TO DATACOMP=#ADATA"; + + TISAM_recordset recset(query); + + if (_has_ca) + recset.set_var("#CODCMS", TVariant(_mask->get(F_CODCMS))); + else + { + recset.set_var("#DACODCMS", TVariant(_mask->get(F_DACODCMS))); + recset.set_var("#ACODCMS", TVariant(_mask->get(F_ACODCMS))); + recset.set_var("#DACODFASE", TVariant(_mask->get(F_DACODFASE))); + recset.set_var("#ACODFASE", TVariant(_mask->get(F_ACODFASE))); + } + + //per il conto va gestito il fatto che il conto è contabile e non analitico ed è 0-filled + TString contone; + + int gruppo = _mask->get_int(F_GRUPPOINI); + int conto = _mask->get_int(F_CONTOINI); + long sottoconto = _mask->get_long(F_SOTTOCINI); + contone.format("%03d%03d%06ld", gruppo, conto, sottoconto); + recset.set_var("#DACODCONTO", contone); + + gruppo = _mask->get_int(F_GRUPPOFIN); + if (gruppo == 0) + gruppo = 999; + conto = _mask->get_int(F_CONTOFIN); + if (conto == 0) + conto = 999; + sottoconto = _mask->get_long(F_SOTTOCFIN); + if (sottoconto == 0) + sottoconto = 999999L; + contone.format("%03d%03d%06ld", gruppo, conto, sottoconto); + recset.set_var("#ACODCONTO", contone); + + //e alla fine le decisivissime date (che sono l'intervallo di scelta più importante) + recset.set_var("#DADATA", _mask->get_date(F_DATAINI)); + recset.set_var("#ADATA", _mask->get_date(F_DATAFIN)); + + //se ci sono record che soddisfano le pesanti richieste dell'utonto... + const long recset_items = recset.items(); + if (recset_items > 0) + { + //E crea pure la progind.. + TProgind pi(recset_items, TR("Elaborazione dati per la stampa..."), true, true); + + //Scansione del recordset trovato + for (bool ok = recset.move_first(); ok; ok = recset.move_next()) + { + if (!pi.addstatus(1)) + break; + //scrive sul CSV i campi che servono al report + printset->aggiungi_riga(recset); + } + } + + return printset; +} + + +//fantastico metodo per gestire stampa o anteprima +void TPrint_contixcms::print_or_preview(const bool stampa) +{ + if (_mask->check_fields()) + { + //l'utonto può scegliere che report usare (personalizzato!) + TString rep_name = _mask->get(F_REPORT); + //se il rep non è selezionato usa quello standard + if (rep_name.empty()) + rep_name << "ca1800a.rep"; + + TPrint_contixcms_report rep; + rep.load(rep_name); + + //metodo per la generazione del recordset che contiene tutti i dati da stampare + //insomma, il vero programma! + TPrint_contixcms_recordset* printset = elabora(); + + //appioppa il recordset al report + rep.set_recordset(printset); + + //setta i valori della maschera sul report (dopo la set_recordset, sennò.. + //..sarebbero sovrascritti dalla set_recordset) + rep.mask2report(*_mask); + + //se l'utonto vuole il dettaglio sottocontesco + if (_mask->get_bool(F_HIDESOTT)) + rep.section('B', 1).hide(); + + TReport_book book; + book.add(rep); + + if (stampa) + book.print(); + else + book.preview(); + } +} + +void TPrint_contixcms::print() +{ + print_or_preview(true); +} + +void TPrint_contixcms::preview() +{ + print_or_preview(false); +} + +void TPrint_contixcms::main_loop() +{ + _mask = new TPrint_contixcms_mask; + _mask->run(); + delete _mask; + _mask = NULL; +} + +bool TPrint_contixcms::create() +{ + //controlla se la chiave ha il modulo CA (e non solo CM) NON è ammesso CA E CM + _has_ca = dongle().active(CAAUT); + //in tal caso il programma è utilizzabile solo se si ha il piano dei conti contabile.. + if (_has_ca) + { + TConfig& cfg = ca_config(); + const bool usepdcc = cfg.get_bool("UsePdcc"); + if (!usepdcc) + return error_box(TR("Il programma non è utilizzabile con la corrente configurazione CA!")); + } + + return TSkeleton_application::create(); +} + +int ca1800(int argc, char* argv[]) +{ + TPrint_contixcms a; + a.run(argc, argv, TR("Stampa conti per commessa")); + return 0; } \ No newline at end of file diff --git a/src/ca/ca1800a.h b/src/ca/ca1800a.h index 85389049d..d3c7edc8a 100755 --- a/src/ca/ca1800a.h +++ b/src/ca/ca1800a.h @@ -1,34 +1,35 @@ -// campi per la maschera ca1800a - -#define F_CODDITTA 101 -#define F_RAGSOC 102 -#define F_ANNO 103 -#define F_DATAINI 104 -#define F_DATAFIN 105 - -#define F_DACODCMS 106 -#define F_DADESCMS 107 -#define F_ACODCMS 108 -#define F_ADESCMS 109 - -#define F_DACODFASE 110 -#define F_DADESFASE 111 -#define F_ACODFASE 112 -#define F_ADESFASE 113 - -#define F_CODCMS 114 -#define F_DESCMS 115 - -#define F_GRUPPOINI 118 -#define F_CONTOINI 119 -#define F_SOTTOCINI 120 -#define F_DESCRINI 121 -#define F_GRUPPOFIN 122 -#define F_CONTOFIN 123 -#define F_SOTTOCFIN 124 -#define F_DESCRFIN 125 - -#define F_HIDESOTT 130 - -#define F_REPORT 131 - +// campi per la maschera ca1800a + +#define F_CODDITTA 101 +#define F_RAGSOC 102 +#define F_ANNO 103 +#define F_DATAINI 104 +#define F_DATAFIN 105 + +#define F_DACODCMS 106 +#define F_DADESCMS 107 +#define F_ACODCMS 108 +#define F_ADESCMS 109 + +#define F_DACODFASE 110 +#define F_DADESFASE 111 +#define F_ACODFASE 112 +#define F_ADESFASE 113 + +#define F_CODCMS 114 +#define F_DESCMS 115 + +#define F_GRUPPOINI 118 +#define F_CONTOINI 119 +#define F_SOTTOCINI 120 +#define F_DESCRINI 121 +#define F_GRUPPOFIN 122 +#define F_CONTOFIN 123 +#define F_SOTTOCFIN 124 +#define F_DESCRFIN 125 +#define F_TIPOMOV 126 + +#define F_HIDESOTT 130 + +#define F_REPORT 131 + diff --git a/src/ca/ca1800a.uml b/src/ca/ca1800a.uml index f5a5bbd76..926e472d4 100755 --- a/src/ca/ca1800a.uml +++ b/src/ca/ca1800a.uml @@ -1,361 +1,369 @@ -#include "ca1800a.h" - -TOOLBAR "topbar" 0 0 0 2 - -BUTTON DLG_PREVIEW 2 2 -BEGIN - PROMPT 1 1 "~Anteprima" - PICTURE TOOL_PREVIEW -END - -#include - -ENDPAGE - -PAGE "Conti per CDC/Commessa" 0 2 0 0 - -GROUPBOX DLG_NULL 79 3 -BEGIN - PROMPT 1 0 "@bDitta" -END - -NUMBER F_CODDITTA 5 -BEGIN - PROMPT 2 1 "Codice " - FLAGS "DF" - USE LF_NDITTE - INPUT CODDITTA F_CODDITTA - DISPLAY "Codice" CODDITTA - DISPLAY "Ragione sociale@50" RAGSOC - OUTPUT F_RAGSOC RAGSOC - CHECKTYPE REQUIRED -END - -STRING F_RAGSOC 50 -BEGIN - PROMPT 17 1 "Rag. Soc. " - FLAGS "D" -END - -GROUPBOX DLG_NULL 79 4 -BEGIN - PROMPT 1 3 "@bPeriodo" -END - -NUMBER F_ANNO 4 -BEGIN - PROMPT 2 4 "Codice esercizio " - HELP "Codice esercizio per cui si vuole la lista" - USE ESC - INPUT CODTAB F_ANNO - DISPLAY "Codice" CODTAB - DISPLAY "Data inizio esercizio" D0 - DISPLAY "Data fine esercizio" D1 - OUTPUT F_ANNO CODTAB - OUTPUT F_DATAINI D0 - OUTPUT F_DATAFIN D1 - FLAGS "RZ" - ADD RUN cg0 -5 esc - CHECKTYPE NORMAL - WARNING "Codice esercizio assente" - FIELD #ANNO -END - -DATE F_DATAINI -BEGIN - PROMPT 2 5 "Dalla data " - FIELD #DATAINI -END - -DATE F_DATAFIN -BEGIN - PROMPT 50 5 "alla data " - VALIDATE DATE_CMP_FUNC >= F_DATAINI - WARNING "La data finale deve essere succeviva a quella iniziale" - FIELD #DATAFIN -END - -GROUPBOX DLG_NULL 79 4 -BEGIN - PROMPT 1 7 "@bSelezione commesse" -END - -STRING F_DACODCMS 20 -BEGIN - PROMPT 2 8 "Da " - FLAGS "UZ" - USE COMMESSE - INPUT CODCMS F_DACODCMS - DISPLAY "Codice@20" CODCMS - DISPLAY "Descrizione@50" DESCRIZ - OUTPUT F_DACODCMS CODCMS - OUTPUT F_DADESCMS DESCRIZ - CHECKTYPE SEARCH - FIELD #DACODCMS - GROUP 1 -END - -STRING F_DADESCMS 50 48 -BEGIN - PROMPT 29 8 "" - USE COMMESSE KEY 2 - INPUT DESCRIZ F_DADESCMS - DISPLAY "Descrizione@50" DESCRIZ - DISPLAY "Codice@20" CODCMS - COPY OUTPUT F_DACODCMS - CHECKTYPE NORMAL - GROUP 1 -END - -STRING F_ACODCMS 20 -BEGIN - PROMPT 2 9 "A " - FLAGS "UZ" - COPY USE F_DACODCMS - INPUT CODCMS F_ACODCMS - COPY DISPLAY F_DACODCMS - OUTPUT F_ACODCMS CODCMS - OUTPUT F_ADESCMS DESCRIZ - CHECKTYPE SEARCH - FIELD #ACODCMS - GROUP 1 -END - -STRING F_ADESCMS 50 48 -BEGIN - PROMPT 29 9 "" - COPY USE F_DADESCMS - INPUT DESCRIZ F_ADESCMS - COPY DISPLAY F_DADESCMS - COPY OUTPUT F_ACODCMS - CHECKTYPE NORMAL - GROUP 1 -END - -//campo solo per CA -STRING F_CODCMS 20 -BEGIN - PROMPT 2 8 "" - FLAGS "UZ" - USE COMMESSE - INPUT CODCMS F_CODCMS - DISPLAY "Codice@20" CODCMS - DISPLAY "Descrizione@50" DESCRIZ - OUTPUT F_CODCMS CODCMS - OUTPUT F_DESCMS DESCRIZ - CHECKTYPE SEARCH - FIELD #CODCMS - GROUP 2 -END - -//campo solo per CA -STRING F_DESCMS 50 48 -BEGIN - PROMPT 29 8 "" - USE COMMESSE KEY 2 - INPUT DESCRIZ F_DESCMS - DISPLAY "Descrizione@50" DESCRIZ - DISPLAY "Codice@20" CODCMS - COPY OUTPUT F_CODCMS - CHECKTYPE NORMAL - GROUP 2 -END - -//campo solo per CA -TEXT DLG_NULL -BEGIN - PROMPT 2 9 "Non selezionare alcuna commessa per stamparle tutte" - GROUP 2 -END - -GROUPBOX DLG_NULL 79 4 -BEGIN - PROMPT 1 11 "@bSelezione fasi" - GROUP 3 -END - -STRING F_DACODFASE 10 -BEGIN - PROMPT 2 12 "Da " - FLAGS "UZ" - USE FASI - INPUT CODFASE F_DACODFASE - DISPLAY "Codice@20" CODFASE - DISPLAY "Descrizione@50" DESCRIZ - OUTPUT F_DACODFASE CODFASE - OUTPUT F_DADESFASE DESCRIZ - CHECKTYPE SEARCH - FIELD #DACODFASE - GROUP 3 -END - -STRING F_DADESFASE 50 -BEGIN - PROMPT 19 12 "" - USE FASI KEY 2 - INPUT DESCRIZ F_DADESFASE - DISPLAY "Descrizione@50" DESCRIZ - DISPLAY "Codice@20" CODFASE - COPY OUTPUT F_DACODFASE - CHECKTYPE NORMAL - GROUP 3 -END - -STRING F_ACODFASE 10 -BEGIN - PROMPT 2 13 "A " - FLAGS "UZ" - COPY USE F_DACODFASE - INPUT CODFASE F_ACODFASE - COPY DISPLAY F_DACODFASE - OUTPUT F_ACODFASE CODFASE - OUTPUT F_ADESFASE DESCRIZ - CHECKTYPE SEARCH - FIELD #ACODFASE - GROUP 3 -END - -STRING F_ADESFASE 50 -BEGIN - PROMPT 19 13 "" - COPY USE F_DADESFASE - INPUT DESCRIZ F_ADESFASE - COPY DISPLAY F_DADESFASE - COPY OUTPUT F_ACODFASE - CHECKTYPE NORMAL - GROUP 3 -END - -GROUPBOX DLG_NULL 79 6 -BEGIN - PROMPT 1 15 "@bSelezione conti (solo conti di costo/ricavo)" -END - -NUMBER F_GRUPPOINI 3 -BEGIN - PROMPT 2 16 "Da Gruppo - Conto - Sottoconto " -END - -NUMBER F_CONTOINI 3 -BEGIN - PROMPT 39 16 "" - USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="") - INPUT GRUPPO F_GRUPPOINI - INPUT CONTO F_CONTOINI - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Descrizione@50" DESCR - DISPLAY "Tipo" TMCF - OUTPUT F_GRUPPOINI GRUPPO - OUTPUT F_CONTOINI CONTO - OUTPUT F_DESCRINI DESCR - CHECKTYPE NORMAL - WARNING "Conto inesistente o mancante" - VALIDATE REQIF_FUNC 1 F_SOTTOCINI -END - -NUMBER F_SOTTOCINI 6 -BEGIN - PROMPT 46 16 "" - USE LF_PCON SELECT SOTTOCONTO!="" - INPUT GRUPPO F_GRUPPOINI - INPUT CONTO F_CONTOINI - INPUT SOTTOCONTO F_SOTTOCINI - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT F_GRUPPOINI GRUPPO - OUTPUT F_CONTOINI CONTO - OUTPUT F_SOTTOCINI SOTTOCONTO - OUTPUT F_DESCRINI DESCR - CHECKTYPE SEARCH - //ADD RUN cg0 -0 -END - -STRING F_DESCRINI 50 -BEGIN - PROMPT 2 17 "Descrizione " - USE LF_PCON KEY 2 - INPUT DESCR F_DESCRINI - DISPLAY "Descrizione@50" DESCR - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - COPY OUTPUT F_SOTTOCINI - CHECKTYPE NORMAL - //ADD RUN cg0 -0 -END - -NUMBER F_GRUPPOFIN 3 -BEGIN - PROMPT 2 18 "A Gruppo - Conto - Sottoconto " -END - -NUMBER F_CONTOFIN 3 -BEGIN - PROMPT 39 18 "" - USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="") - INPUT GRUPPO F_GRUPPOFIN - INPUT CONTO F_CONTOFIN - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Descrizione@50" DESCR - DISPLAY "Tipo" TMCF - OUTPUT F_GRUPPOFIN GRUPPO - OUTPUT F_CONTOFIN CONTO - OUTPUT F_DESCRFIN DESCR - CHECKTYPE NORMAL - VALIDATE REQIF_FUNC 1 F_SOTTOCFIN - WARNING "Conto inesistente o mancante" -END - -NUMBER F_SOTTOCFIN 6 -BEGIN - PROMPT 46 18 "" - USE LF_PCON SELECT SOTTOCONTO!="" - INPUT GRUPPO F_GRUPPOFIN - INPUT CONTO F_CONTOFIN - INPUT SOTTOCONTO F_SOTTOCFIN - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT F_GRUPPOFIN GRUPPO - OUTPUT F_CONTOFIN CONTO - OUTPUT F_SOTTOCFIN SOTTOCONTO - OUTPUT F_DESCRFIN DESCR - CHECKTYPE SEARCH - WARNING "Sottoconto inesistente o mancante" - //ADD RUN cg0 -0 -END - -STRING F_DESCRFIN 50 -BEGIN - PROMPT 2 19 "Descrizione " - USE LF_PCON KEY 2 - CHECKTYPE NORMAL - INPUT DESCR F_DESCRFIN - DISPLAY "Descrizione@50" DESCR - DISPLAY "Gruppo" GRUPPO - DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" SOTTOCONTO - COPY OUTPUT F_SOTTOCFIN - //ADD RUN cg0 -0 -END - -BOOLEAN F_HIDESOTT -BEGIN - PROMPT 1 21 "Nascondi sottoconti" -END - -STRING F_REPORT 50 -BEGIN - PROMPT 1 22 "Report personalizzato " - RSELECT "" - CHECKTYPE NORMAL -END - -ENDPAGE - -ENDMASK +#include "ca1800a.h" + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_PREVIEW 2 2 +BEGIN + PROMPT 1 1 "~Anteprima" + PICTURE TOOL_PREVIEW +END + +#include + +ENDPAGE + +PAGE "Conti per CDC/Commessa" 0 2 0 0 + +GROUPBOX DLG_NULL 79 3 +BEGIN + PROMPT 1 0 "@bDitta" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 2 1 "Codice " + FLAGS "DF" + USE LF_NDITTE + INPUT CODDITTA F_CODDITTA + DISPLAY "Codice" CODDITTA + DISPLAY "Ragione sociale@50" RAGSOC + OUTPUT F_RAGSOC RAGSOC + CHECKTYPE REQUIRED +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 17 1 "Rag. Soc. " + FLAGS "D" +END + +GROUPBOX DLG_NULL 79 4 +BEGIN + PROMPT 1 3 "@bPeriodo" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 2 4 "Codice esercizio " + HELP "Codice esercizio per cui si vuole la lista" + USE ESC + INPUT CODTAB F_ANNO + DISPLAY "Codice" CODTAB + DISPLAY "Data inizio esercizio" D0 + DISPLAY "Data fine esercizio" D1 + OUTPUT F_ANNO CODTAB + OUTPUT F_DATAINI D0 + OUTPUT F_DATAFIN D1 + FLAGS "RZ" + ADD RUN cg0 -5 esc + CHECKTYPE NORMAL + WARNING "Codice esercizio assente" + FIELD #ANNO +END + +DATE F_DATAINI +BEGIN + PROMPT 2 5 "Dalla data " + FIELD #DATAINI +END + +DATE F_DATAFIN +BEGIN + PROMPT 50 5 "alla data " + VALIDATE DATE_CMP_FUNC >= F_DATAINI + WARNING "La data finale deve essere succeviva a quella iniziale" + FIELD #DATAFIN +END + +GROUPBOX DLG_NULL 79 4 +BEGIN + PROMPT 1 7 "@bSelezione commesse" +END + +STRING F_DACODCMS 20 +BEGIN + PROMPT 2 8 "Da " + FLAGS "UZ" + USE COMMESSE + INPUT CODCMS F_DACODCMS + DISPLAY "Codice@20" CODCMS + DISPLAY "Descrizione@50" DESCRIZ + OUTPUT F_DACODCMS CODCMS + OUTPUT F_DADESCMS DESCRIZ + CHECKTYPE SEARCH + FIELD #DACODCMS + GROUP 1 +END + +STRING F_DADESCMS 50 48 +BEGIN + PROMPT 29 8 "" + USE COMMESSE KEY 2 + INPUT DESCRIZ F_DADESCMS + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Codice@20" CODCMS + COPY OUTPUT F_DACODCMS + CHECKTYPE NORMAL + GROUP 1 +END + +STRING F_ACODCMS 20 +BEGIN + PROMPT 2 9 "A " + FLAGS "UZ" + COPY USE F_DACODCMS + INPUT CODCMS F_ACODCMS + COPY DISPLAY F_DACODCMS + OUTPUT F_ACODCMS CODCMS + OUTPUT F_ADESCMS DESCRIZ + CHECKTYPE SEARCH + FIELD #ACODCMS + GROUP 1 +END + +STRING F_ADESCMS 50 48 +BEGIN + PROMPT 29 9 "" + COPY USE F_DADESCMS + INPUT DESCRIZ F_ADESCMS + COPY DISPLAY F_DADESCMS + COPY OUTPUT F_ACODCMS + CHECKTYPE NORMAL + GROUP 1 +END + +//campo solo per CA +STRING F_CODCMS 20 +BEGIN + PROMPT 2 8 "" + FLAGS "UZ" + USE COMMESSE + INPUT CODCMS F_CODCMS + DISPLAY "Codice@20" CODCMS + DISPLAY "Descrizione@50" DESCRIZ + OUTPUT F_CODCMS CODCMS + OUTPUT F_DESCMS DESCRIZ + CHECKTYPE SEARCH + FIELD #CODCMS + GROUP 2 +END + +//campo solo per CA +STRING F_DESCMS 50 48 +BEGIN + PROMPT 29 8 "" + USE COMMESSE KEY 2 + INPUT DESCRIZ F_DESCMS + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Codice@20" CODCMS + COPY OUTPUT F_CODCMS + CHECKTYPE NORMAL + GROUP 2 +END + +//campo solo per CA +TEXT DLG_NULL +BEGIN + PROMPT 2 9 "Non selezionare alcuna commessa per stamparle tutte" + GROUP 2 +END + +GROUPBOX DLG_NULL 79 4 +BEGIN + PROMPT 1 11 "@bSelezione fasi" + GROUP 3 +END + +STRING F_DACODFASE 10 +BEGIN + PROMPT 2 12 "Da " + FLAGS "UZ" + USE FASI + INPUT CODFASE F_DACODFASE + DISPLAY "Codice@20" CODFASE + DISPLAY "Descrizione@50" DESCRIZ + OUTPUT F_DACODFASE CODFASE + OUTPUT F_DADESFASE DESCRIZ + CHECKTYPE SEARCH + FIELD #DACODFASE + GROUP 3 +END + +STRING F_DADESFASE 50 +BEGIN + PROMPT 19 12 "" + USE FASI KEY 2 + INPUT DESCRIZ F_DADESFASE + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Codice@20" CODFASE + COPY OUTPUT F_DACODFASE + CHECKTYPE NORMAL + GROUP 3 +END + +STRING F_ACODFASE 10 +BEGIN + PROMPT 2 13 "A " + FLAGS "UZ" + COPY USE F_DACODFASE + INPUT CODFASE F_ACODFASE + COPY DISPLAY F_DACODFASE + OUTPUT F_ACODFASE CODFASE + OUTPUT F_ADESFASE DESCRIZ + CHECKTYPE SEARCH + FIELD #ACODFASE + GROUP 3 +END + +STRING F_ADESFASE 50 +BEGIN + PROMPT 19 13 "" + COPY USE F_DADESFASE + INPUT DESCRIZ F_ADESFASE + COPY DISPLAY F_DADESFASE + COPY OUTPUT F_ACODFASE + CHECKTYPE NORMAL + GROUP 3 +END + +GROUPBOX DLG_NULL 79 6 +BEGIN + PROMPT 1 15 "@bSelezione conti (solo conti di costo/ricavo)" +END + +NUMBER F_GRUPPOINI 3 +BEGIN + PROMPT 2 16 "Da Gruppo - Conto - Sottoconto " +END + +NUMBER F_CONTOINI 3 +BEGIN + PROMPT 39 16 "" + USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="") + INPUT GRUPPO F_GRUPPOINI + INPUT CONTO F_CONTOINI + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + DISPLAY "Tipo" TMCF + OUTPUT F_GRUPPOINI GRUPPO + OUTPUT F_CONTOINI CONTO + OUTPUT F_DESCRINI DESCR + CHECKTYPE NORMAL + WARNING "Conto inesistente o mancante" + VALIDATE REQIF_FUNC 1 F_SOTTOCINI +END + +NUMBER F_SOTTOCINI 6 +BEGIN + PROMPT 46 16 "" + USE LF_PCON SELECT SOTTOCONTO!="" + INPUT GRUPPO F_GRUPPOINI + INPUT CONTO F_CONTOINI + INPUT SOTTOCONTO F_SOTTOCINI + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPOINI GRUPPO + OUTPUT F_CONTOINI CONTO + OUTPUT F_SOTTOCINI SOTTOCONTO + OUTPUT F_DESCRINI DESCR + CHECKTYPE SEARCH + //ADD RUN cg0 -0 +END + +STRING F_DESCRINI 50 +BEGIN + PROMPT 2 17 "Descrizione " + USE LF_PCON KEY 2 + INPUT DESCR F_DESCRINI + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + COPY OUTPUT F_SOTTOCINI + CHECKTYPE NORMAL + //ADD RUN cg0 -0 +END + +NUMBER F_GRUPPOFIN 3 +BEGIN + PROMPT 2 18 "A Gruppo - Conto - Sottoconto " +END + +NUMBER F_CONTOFIN 3 +BEGIN + PROMPT 39 18 "" + USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="") + INPUT GRUPPO F_GRUPPOFIN + INPUT CONTO F_CONTOFIN + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Descrizione@50" DESCR + DISPLAY "Tipo" TMCF + OUTPUT F_GRUPPOFIN GRUPPO + OUTPUT F_CONTOFIN CONTO + OUTPUT F_DESCRFIN DESCR + CHECKTYPE NORMAL + VALIDATE REQIF_FUNC 1 F_SOTTOCFIN + WARNING "Conto inesistente o mancante" +END + +NUMBER F_SOTTOCFIN 6 +BEGIN + PROMPT 46 18 "" + USE LF_PCON SELECT SOTTOCONTO!="" + INPUT GRUPPO F_GRUPPOFIN + INPUT CONTO F_CONTOFIN + INPUT SOTTOCONTO F_SOTTOCFIN + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_GRUPPOFIN GRUPPO + OUTPUT F_CONTOFIN CONTO + OUTPUT F_SOTTOCFIN SOTTOCONTO + OUTPUT F_DESCRFIN DESCR + CHECKTYPE SEARCH + WARNING "Sottoconto inesistente o mancante" + //ADD RUN cg0 -0 +END + +STRING F_DESCRFIN 50 +BEGIN + PROMPT 2 19 "Descrizione " + USE LF_PCON KEY 2 + CHECKTYPE NORMAL + INPUT DESCR F_DESCRFIN + DISPLAY "Descrizione@50" DESCR + DISPLAY "Gruppo" GRUPPO + DISPLAY "Conto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO + COPY OUTPUT F_SOTTOCFIN + //ADD RUN cg0 -0 +END + +BOOLEAN F_HIDESOTT +BEGIN + PROMPT 1 21 "Nascondi sottoconti" +END + +LIST F_TIPOMOV 24 +BEGIN + PROMPT 32 21 "Selezione movimenti " + ITEM " |Qualsiasi" + ITEM "N|Normale" + ITEM "P|Preventivo e variazione" +END + +STRING F_REPORT 50 +BEGIN + PROMPT 1 22 "Report personalizzato " + RSELECT "" + CHECKTYPE NORMAL +END + +ENDPAGE + +ENDMASK diff --git a/src/ca/ca2100.cpp b/src/ca/ca2100.cpp index ad66b1858..7f8818a38 100755 --- a/src/ca/ca2100.cpp +++ b/src/ca/ca2100.cpp @@ -11,6 +11,10 @@ #include "calib01.h" #include "../cg/cglib01.h" +#include "../ve/velib.h" +#include "../mg/umart.h" +#include + #include #include @@ -93,9 +97,14 @@ protected: void write_rows(const TMask& m); void read_rows(const TMask& m); + void write_doc(const TMask& m); + void remove_doc(); + + virtual bool protected_record(TRectype& rec); virtual int write(const TMask& m); virtual int rewrite(const TMask& m); + virtual bool remove(); virtual int read(TMask& m); virtual void ini2sheet(TConfig& ini, TSheet_field& sheet); @@ -193,9 +202,17 @@ TToken_string& TMovanal_msk::get_rip_row(const TRectype& rrip) rmov.put(RMOVANA_CODCMS, keyrip.get()); rmov.put(RMOVANA_CODFASE, keyrip.get()); rmov.put(RMOVANA_CODCONTO, keyrip.get()); - if (ci) + + TToken_string& row = rec2row(rmov, -1); + + if (ci) + { rmov.put(RMOVANA_CODART, keyrip.get()); - TToken_string& row = rec2row(rmov, -1); + + TArticolo & art = cached_article(rmov.get(RMOVANA_CODART)); + + row.add(art.get(ANAMAG_DESCR), sheet.cid2index(S_DESCART)); + } return row; } @@ -205,14 +222,15 @@ void TMovanal_msk::split_cg_row(const TRectype& row, const TAnal_ripartizioni_ba TGeneric_distrib distrib(row.get_real(RMV_IMPORTO), TCurrency::get_firm_dec()); // Calcolo tutte le percentuali da ripartire - for (int i = 1; i <= rrip.rows(); i++) + int i; + for (i = 1; i <= rrip.rows(); i++) { const real quota = rrip[i].get_real(RRIP_RIPARTO); distrib.add(quota); } TString80 desc; // Variabile di appoggio per descrizione riga - for (int i = 1; i <= rrip.rows(); i++) + for (i = 1; i <= rrip.rows(); i++) { TToken_string& riga = get_rip_row(rrip[i]); // Cerca o crea la riga cui sommare la quota TImporto impriga; row2imp(riga, impriga); // Legge l'importo della riga @@ -380,6 +398,7 @@ void TMovanal_msk::load_cg_row(const TRectype& row) str = row.get(RMV_CONTO); str.right_just(3, '0'); riga.add(str, pos-1); str = row.get(RMV_SOTTOCONTO); str.right_just(6, '0'); riga.add(str, pos); } + sheet.check_row(sheet.items() - 1); } //else di rrip_items > 0... } //if(zio.is_analitico(... } @@ -672,8 +691,28 @@ bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly else o.set(datacomp.string()); //se la data fine competenza viene lasciata vuota -> e' uguale alla datacomp } - break; + case F_CODCAUS: + if ((e== fe_init || e == fe_modify) && !query_mode()) + { + TSheet_field & s = sfield(F_RIGHE); + const TRectype & caus = cache().get(LF_CAUSALI, (const char *) o.get()); + + s.enable_column(s.cid2index(S_CODART), caus.get_bool(CAU_MOVCGIND)); + s.enable_column(s.cid2index(S_DESCART), caus.get_bool(CAU_MOVCGIND)); + if (!caus.get_bool(CAU_MOVCGIND)) + { + for (int r = 0; r < s.items(); r++ ) + { + TToken_string & row = s.row(r); + + row.add("", s.cid2index(S_CODART)); + row.add("", s.cid2index(S_DESCART)); + } + } + s.force_update(); + } + break; case DLG_USER: if (e == fe_button) display_rmov_comp(); @@ -818,8 +857,25 @@ bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly const bool vuoto = o.empty(); enable(-5, vuoto); if (!vuoto) + { + TSheet_field & s = sfield(F_RIGHE); + const TRectype & caus = cache().get(LF_CAUSALI, o.mask().get(F_CODCAUS)); + + s.enable_column(s.cid2index(S_CODART), caus.get_bool(CAU_MOVCGIND)); + s.enable_column(s.cid2index(S_DESCART), caus.get_bool(CAU_MOVCGIND)); + if (!caus.get_bool(CAU_MOVCGIND)) + { + for (int r = 0; r < s.items(); r++ ) + { + TToken_string & row = s.row(r); + + row.add("", s.cid2index(S_CODART)); + row.add("", s.cid2index(S_DESCART)); + } + } load_cg_mov(); } + } break; case F_BLOCCATO: if (e == fe_modify) @@ -939,7 +995,7 @@ TToken_string& TMovanal_msk::rec2row(const TRectype& rec, int r) const row.add(fr->read(rec), idx); } } - + sheet.check_row(r); return row; } @@ -1078,9 +1134,10 @@ int TMovanal_msk::create_sheet_fields(int lf, int& y, short& dlg, bool required) { TSheet_field& sf = sfield(F_RIGHE); TMask& sm = sf.sheet_mask(); - const int h = ca_create_fields(sm, 0, lf, 1, y, dlg, dlg+50); + const bool pcon = lf == LF_PCON || lf == LF_PCONANA; + const int h = ca_create_fields(sm, 0, lf, 1, y, dlg, dlg+50, 0x0, NULL, 0, pcon); - for (int i = 0; i < h; i++) + for (int i = 0; i < h + pcon; i++) { TEdit_field& fld = sm.efield(dlg+i); int logic = lf; @@ -1098,14 +1155,17 @@ int TMovanal_msk::create_sheet_fields(int lf, int& y, short& dlg, bool required) if (logic == LF_PCON) { const TFieldref* f = fld.field(); - const TString& fieldname = f->name(); + if (f != NULL) + { + const TString& fieldname = f->name(); - if (fieldname == "GRUPPO") - fld.set_field("CODCONTO[1,3]"); else - if (fieldname == "CONTO") - fld.set_field("CODCONTO[4,6]"); else - if (fieldname == "SOTTOCONTO") - fld.set_field("CODCONTO[7,12]"); + if (fieldname == "GRUPPO") + fld.set_field("CODCONTO[1,3]"); else + if (fieldname == "CONTO") + fld.set_field("CODCONTO[4,6]"); else + if (fieldname == "SOTTOCONTO") + fld.set_field("CODCONTO[7,12]"); + } } else { @@ -1118,13 +1178,17 @@ int TMovanal_msk::create_sheet_fields(int lf, int& y, short& dlg, bool required) default : fieldname = RMOVANA_CODCONTO; break; } TFieldref* f = (TFieldref*)fld.field(); + if (f != NULL) f->set_name(fieldname); } fld.check_type(required ? CHECK_REQUIRED : CHECK_NORMAL); - TEdit_field& dfld = sm.efield(dlg+50+i); - dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output! + if (i < h) + { + TEdit_field& dfld = sm.efield(pcon && i == h - 1 ? dlg + h: dlg+50+i); + dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output! + } } y += h+1; @@ -1145,7 +1209,7 @@ void TMovanal_msk::create_sheet() TConfig& ini = ca_config(); const bool fsc_req = ini.get_bool("FscRequired"); - int y = 4; + int y = 3; short dlg = S_CDC1+100; // id del primo campo da generare _cdc_start = _cdc_end = -1; _cms_start = _cms_end = -1; @@ -1245,6 +1309,162 @@ bool TMovanal_app::get_next_key(TToken_string& key) return true; } +void TMovanal_app::write_doc(const TMask& m) +{ + + const TRectype & caus = cache().get(LF_CAUSALI, (const char *) m.get(F_CODCAUS)); + + if (caus.get_bool(CAU_MOVCGIND)) + { + TAnal_mov& movana = (TAnal_mov&)_rel->curr(); + long ndoc = movana.get_long(MOVANA_DNDOC); + const TDate datadoc = movana.get_date(MOVANA_DATAREG); + + if (ndoc == 0L) + { + movana.put(MOVANA_DPROVV, "D"); + + movana.put(MOVANA_DATADOC, datadoc); + movana.put(MOVANA_DCODNUM, ini_get_string(CONFIG_DITTA, "CI", "NumCGInd")); + movana.put(MOVANA_DANNO, datadoc.year()); + } + + const char provv = movana.get_char(MOVANA_DPROVV); + const int anno = movana.get_int(MOVANA_DANNO); + const TString8 codnum(movana.get(MOVANA_DCODNUM)); + + TDocumento doc(provv, anno, codnum, ndoc); + + doc.put(DOC_PROVV, provv); + doc.put(DOC_ANNO, anno); + doc.put(DOC_CODNUM, codnum); + doc.put(DOC_NDOC, ndoc); + + const long codcf = m.get_long(F_CODCF); + + if (codcf > 0L) + { + doc.put(DOC_TIPOCF, m.get(F_TIPOCF)); + doc.put(DOC_CODCF, codcf); + } + + doc.put(DOC_DATADOC, datadoc); + doc.put(DOC_DATADOCRIF, movana.get_date(MOVANA_DATADOC)); + doc.put(DOC_NUMDOCRIF, movana.get_date(MOVANA_NUMDOC)); + doc.put(DOC_DATACOMP, movana.get_date(MOVANA_DATACOMP)); + doc.put(DOC_DATAFCOMP, movana.get_date(MOVANA_DATAFCOMP)); + doc.put(DOC_TIPODOC, ini_get_string(CONFIG_DITTA, "CI", "TipCGInd")); + if (ndoc == 0L) + doc.put(DOC_STATO, "1"); + doc.destroy_rows(); + + const int rows = movana.body().rows(); + + for (int r = 1; r <= rows; r++) + { + const TRectype & rmovana = movana.body().row(r); + TRiga_documento & rdoc = doc.new_row("01"); + const TString codart(rmovana.get(RMOVANA_CODART)); + real valore(rmovana.get(RMOVANA_IMPORTO)); + + if (rmovana.get(RMOVANA_SEZIONE) == "A") + valore = -valore; + real prezzo = valore; + rdoc.put(RDOC_CODART, codart); + rdoc.put(RDOC_CODARTMAG, codart); + rdoc.put(RDOC_CHECKED, "X"); + + if (codart.full()) + { + const TArticolo & art = cached_article(codart); + + rdoc.put(RDOC_DESCR, rmovana.get(RMOVANA_DESCR).full() ? rmovana.get(RMOVANA_DESCR) : art.get(ANAMAG_DESCR)); + rdoc.put(RDOC_UMQTA, art.first_um()); + prezzo = art.um()[1].get_real(UMART_PREZZO); + if (prezzo.is_zero()) + prezzo = valore; + } + if (r == 1) + { + doc.put(DOC_CODCMS, rmovana.get(RMOVANA_CODCMS)); + doc.put(DOC_FASCMS, rmovana.get(RMOVANA_CODFASE)); + doc.put(DOC_CODCOSTO, rmovana.get(RMOVANA_CODCCOSTO)); + } + rdoc.put(RDOC_CODCMS, rmovana.get(RMOVANA_CODCMS)); + rdoc.put(RDOC_FASCMS, rmovana.get(RMOVANA_CODFASE)); + rdoc.put(RDOC_CODCOSTO, rmovana.get(RMOVANA_CODCCOSTO)); + + real qta = valore / prezzo; + + qta.round(5); + rdoc.put(RDOC_QTA, qta); + rdoc.put(RDOC_PREZZO, prezzo); + rdoc.put(RDOC_CODIVA, ini_get_string(CONFIG_DITTA, "CI", "IVACGInd")); + } + + const int err = doc.write(true); + + ndoc = doc.get_long(DOC_NDOC); + movana.put(MOVANA_DNDOC, ndoc); + + if (err == NOERR) + { + TFilename ininame; ininame.temp(); + + { + TConfig ini(ininame, "Transaction"); + ini.set("Action", "Modify"); + + TString8 para; + para.format("%d", LF_DOC); + ini.set_paragraph(para); + 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)); + } + + TString appname("ve0 -0"); appname << " /i" << ininame; + TExternal_app app(appname); + const bool ok = app.run() == 0; + + if (ininame.exist()) + ::remove(ininame); + } + else + error_box(FR("Errore %d in scrittura del documenton.ro %ld"), err, ndoc); + } +} + +void TMovanal_app::remove_doc() +{ + const TRectype & caus = cache().get(LF_CAUSALI, (const char *) _msk->get(F_CODCAUS)); + + if (caus.get_bool(CAU_MOVCGIND)) + { + TRectype & movana = _rel->lfile().curr(); + long ndoc = movana.get_long(MOVANA_DNDOC); + + if (ndoc > 0L) + { + char provv = movana.get_char(MOVANA_DPROVV); + int anno = movana.get_int(MOVANA_DANNO); + TString8 codnum(movana.get(MOVANA_DCODNUM)); + TDocumento doc(provv, anno, codnum, ndoc); + + if (ndoc == doc.get_long(DOC_NDOC)) + { + const int err = doc.remove(); + + if (err == NOERR) + message_box(FR("Cancellato il documento n.ro %ld "), ndoc); + else + error_box(FR("Errore %d in eliminazione del documenton.ro %ld"), err, ndoc); + } + } + } +} + void TMovanal_app::write_rows(const TMask& m) { TAnal_mov& mov = (TAnal_mov&)_rel->curr(); @@ -1316,24 +1536,61 @@ bool TMovanal_app::protected_record(TRectype& rec) int TMovanal_app::write(const TMask& m) { - m.autosave(*_rel); + bool ci = has_module(CIAUT); + + m.autosave(*_rel); + if (_rel->lfile().get_long(MOVANA_DNDOC) == 0) + { + const TString key = _rel->lfile().get(MOVANA_NUMREGCG); + const TRectype & rec = cache().get(LF_MOV, key); + + _rel->lfile().put(MOVANA_DPROVV, rec.get(MOV_DPROVV)); + _rel->lfile().put(MOVANA_DANNO, rec.get(MOV_DANNO)); + _rel->lfile().put(MOVANA_DCODNUM, rec.get(MOV_DCODNUM)); + _rel->lfile().put(MOVANA_DNDOC, rec.get(MOV_DNDOC)); + } write_rows(m); - const int err = _rel->write(); - if (err == NOERR) + if (ci) + write_doc(m); + const int err = _rel->write(); + if (ci && err == NOERR) link_ci(m); return err; } int TMovanal_app::rewrite(const TMask& m) { + bool ci = has_module(CIAUT); + m.autosave(*_rel); + if (_rel->lfile().get_long(MOVANA_DNDOC) == 0) + { + const TString key = _rel->lfile().get(MOVANA_NUMREGCG); + const TRectype & rec = cache().get(LF_MOV, key); + + _rel->lfile().put(MOVANA_DPROVV, rec.get(MOV_DPROVV)); + _rel->lfile().put(MOVANA_DANNO, rec.get(MOV_DANNO)); + _rel->lfile().put(MOVANA_DCODNUM, rec.get(MOV_DCODNUM)); + _rel->lfile().put(MOVANA_DNDOC, + rec.get(MOV_DNDOC)); + } write_rows(m); + if (ci) + write_doc(m); const int err = _rel->rewrite(); - if (err == NOERR) + if (ci && err == NOERR) link_ci(m); return err; } +bool TMovanal_app::remove() +{ + bool ci = has_module(CIAUT); + if (ci) + remove_doc(); + return TRelation_application::remove(); +} + int TMovanal_app::read(TMask& m) { const int err = TRelation_application::read(m); diff --git a/src/ca/ca2100a.h b/src/ca/ca2100a.h index b7984065b..353e9969b 100755 --- a/src/ca/ca2100a.h +++ b/src/ca/ca2100a.h @@ -1,55 +1,56 @@ -#define F_NUMREG 201 -#define F_ANNOES 202 -#define F_DESCR 203 -#define F_DATAREG 204 -#define F_DATACOMP 205 -#define F_DATADOC 206 -#define F_AUTOFCOMP 207 -#define F_TIPODOC 209 -#define F_SEZIONE 210 -#define F_TOTDOC 211 -#define F_NUMREGCG 212 -#define F_CODCAUS 213 -#define F_DESCAUS 214 -#define F_DARE 215 -#define F_AVERE 216 -#define F_BLOCCATO 217 -#define F_TIPO 218 -#define F_NUMDOC 219 -#define F_RESET 220 -#define F_TIPOCF 221 -#define F_CODCF 222 -#define F_RAGSOCCF 223 -#define F_DATAFCOMP 224 - -#define F_NUMREG2 301 -#define F_ANNOES2 302 -#define F_DATAREG2 303 -#define F_DESCR2 304 -#define F_RIGHE 400 - -#define S_DARE 101 -#define S_AVERE 102 -#define S_DESCR 103 -#define S_CDC1 104 -#define S_CDC2 105 -#define S_CDC3 106 -#define S_CDC4 107 -#define S_CMS1 108 -#define S_CMS2 109 -#define S_CMS3 110 -#define S_CMS4 111 -#define S_FAS1 112 -#define S_FAS2 113 -#define S_FAS3 114 -#define S_FAS4 115 -#define S_CON1 116 -#define S_CON2 117 -#define S_CON3 118 -#define S_CON4 119 -#define S_CODART 120 -#define S_DESCART 121 -#define S_CDC_ORI 122 -#define S_CMS_ORI 123 -#define S_FAS_ORI 124 -#define S_CON_ORI 125 +#define F_NUMREG 201 +#define F_ANNOES 202 +#define F_DESCR 203 +#define F_DATAREG 204 +#define F_DATACOMP 205 +#define F_DATADOC 206 +#define F_AUTOFCOMP 207 +#define F_TIPODOC 209 +#define F_SEZIONE 210 +#define F_TOTDOC 211 +#define F_NUMREGCG 212 +#define F_CODCAUS 213 +#define F_DESCAUS 214 +#define F_DARE 215 +#define F_AVERE 216 +#define F_BLOCCATO 217 +#define F_TIPO 218 +#define F_NUMDOC 219 +#define F_RESET 220 +#define F_TIPOCF 221 +#define F_CODCF 222 +#define F_RAGSOCCF 223 +#define F_DATAFCOMP 224 + +#define F_NUMREG2 301 +#define F_ANNOES2 302 +#define F_DATAREG2 303 +#define F_DESCR2 304 +#define F_RIGHE 400 + +#define S_DARE 101 +#define S_AVERE 102 +#define S_DESCR 103 +#define S_CDC1 104 +#define S_CDC2 105 +#define S_CDC3 106 +#define S_CDC4 107 +#define S_CMS1 108 +#define S_CMS2 109 +#define S_CMS3 110 +#define S_CMS4 111 +#define S_FAS1 112 +#define S_FAS2 113 +#define S_FAS3 114 +#define S_FAS4 115 +#define S_CON1 116 +#define S_CON2 117 +#define S_CON3 118 +#define S_CON4 119 +#define S_DES_CON 120 +#define S_CODART 121 +#define S_DESCART 122 +#define S_CDC_ORI 123 +#define S_CMS_ORI 124 +#define S_FAS_ORI 125 +#define S_CON_ORI 126 diff --git a/src/ca/ca2100a.uml b/src/ca/ca2100a.uml index ef295c124..f61744edc 100755 --- a/src/ca/ca2100a.uml +++ b/src/ca/ca2100a.uml @@ -1,537 +1,571 @@ -#include "ca2100a.h" - -TOOLBAR "topbar" 0 0 0 2 - -#include - -ENDPAGE - -PAGE "Testata" 0 0 0 2 - -GROUPBOX DLG_NULL 78 7 -BEGIN - PROMPT 1 1 "@bTestata" -END - -LIST F_TIPO 1 25 -BEGIN - PROMPT 2 2 "Tipo movimento " - ITEM " |Normale" - ITEM "P|Preventivo" - ITEM "V|Variazione preventivo" - FIELD TIPOMOV -END - -DATE F_DATAREG -BEGIN - PROMPT 2 3 "Data di registrazione " - CHECKTYPE REQUIRED - FIELD DATAREG - FLAGS "A" - WARNING "La data di registrazione non appartiene ad un esercizio valido" - GROUP 5 - MESSAGE COPY,F_DATAREG2 -END - -NUMBER F_NUMREG 7 -BEGIN - PROMPT 54 2 "Movimento n. " - USE LF_MOVANA SELECT TIPOMOV==#F_TIPO - INPUT NUMREG F_NUMREG - DISPLAY "Numero@7" NUMREG - DISPLAY "Tipo" TIPOMOV - DISPLAY "Data reg.@10" DATAREG - DISPLAY "Data comp.@10" DATACOMP - DISPLAY "Eser." ANNOES - DISPLAY "P. nota" NUMREGCG - DISPLAY "Caus." CODCAUS - DISPLAY "Descrizione@50" DESCR - OUTPUT F_NUMREG NUMREG - CHECKTYPE REQUIRED - KEY 1 - FIELD NUMREG - FLAGS "G" - MESSAGE COPY,F_NUMREG2 -END - -DATE F_DATACOMP -BEGIN - PROMPT 2 4 "Data di competenza " - FIELD DATACOMP - CHECKTYPE REQUIRED - WARNING "La data di competenza non appartiene ad un esercizio valido" -END - -DATE F_DATAFCOMP -BEGIN - PROMPT 43 4 "Data di fine competenza " - FIELD DATAFCOMP - WARNING "La data di fine competenza non puo' essere anteriore alla data di competenza" -END - -NUMBER F_ANNOES 4 -BEGIN - PROMPT 54 3 "Esercizio " - FIELD ANNOES - MESSAGE COPY,F_ANNOES2 - FLAGS "DG" -END - -BOOLEAN F_AUTOFCOMP -BEGIN - PROMPT 2 5 "Fine competenza coincidente con fine commessa di ogni riga" - MESSAGE FALSE ENABLE,F_DATAFCOMP - MESSAGE TRUE CLEAR,F_DATAFCOMP - FIELD AUTOFCOMP -END - -STRING F_DESCR 50 -BEGIN - PROMPT 2 6 "Descrizione " - FIELD DESCR - MESSAGE COPY,F_DESCR2 -END - -GROUPBOX DLG_NULL 78 7 -BEGIN - PROMPT 1 8 "@bDati contabili" -END - -STRINGA F_CODCAUS 3 -BEGIN - PROMPT 2 9 "Causale " - USE LF_CAUSALI SELECT MOVIND!='' - INPUT CODCAUS F_CODCAUS - DISPLAY "Codice" CODCAUS - DISPLAY "Descrizione@50" DESCR - DISPLAY "Industriale@C" MOVCGIND - OUTPUT F_CODCAUS CODCAUS - OUTPUT F_DESCAUS DESCR - CHECKTYPE REQUIRED - FLAGS "UG" - FIELD CODCAUS - GROUP 5 - ADD RUN cg0 -4 -END - -STRINGA F_DESCAUS 50 40 -BEGIN - PROMPT 20 9 "" - USE LF_CAUSALI KEY 2 SELECT MOVIND!='' - INPUT DESCR F_DESCAUS - DISPLAY "Descrizione@50" DESCR - DISPLAY "Codice" CODCAUS - DISPLAY "Industriale@C" MOVCGIND - COPY OUTPUT F_CODCAUS - CHECKTYPE REQUIRED - GROUP 5 - ADD RUN cg0 -4 -END - -STRING F_TIPODOC 2 -BEGIN - PROMPT 2 10 "Documento: Tipo " - USE %TPD - INPUT CODTAB F_TIPODOC - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@60" S0 - OUTPUT F_TIPODOC CODTAB - CHECKTYPE NORMAL - FIELD TIPODOC - GROUP 5 -END - -STRING F_NUMDOC 7 -BEGIN - PROMPT 28 10 "Numero " - CHECKTYPE NORMAL - FIELD NUMDOC - GROUP 5 -END - -DATE F_DATADOC -BEGIN - PROMPT 47 10 "Data " - FIELD DATADOC - GROUP 5 -END - -NUMBER F_NUMREGCG 7 -BEGIN - PROMPT 2 11 "N. reg. contabile " - FLAGS "DG" - FIELD NUMREGCG - MESSAGE EMPTY ENABLE,F_TIPO|HIDE,F_RESET - MESSAGE DISABLE,F_TIPO|SHOW,F_RESET -END - -LIST F_TIPOCF 1 11 -BEGIN - PROMPT 2 12 "Tipo " - FLAGS "DG" - ITEM "C|Clienti" - ITEM "F|Fornitori" -END - -NUMBER F_CODCF 6 -BEGIN - PROMPT 25 12 "Codice " - FLAGS "DG" - USE LF_CLIFO - INPUT TIPOCF F_TIPOCF SELECT - INPUT CODCF F_CODCF - OUTPUT F_TIPOCF TIPOCF - OUTPUT F_CODCF CODCF - OUTPUT F_RAGSOCCF RAGSOC - CHECKTYPE NORMAL -END - -STRING F_RAGSOCCF 50 -BEGIN - PROMPT 2 13 "Ragione Sociale " - FLAGS "D" -END - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 16 "@bMovimento" -END - -CURRENCY F_TOTDOC 18 -BEGIN - PROMPT 2 17 "Totale documento " - FIELD TOTDOC - GROUP 5 -END - -LISTBOX F_SEZIONE 1 5 -BEGIN - PROMPT 39 17 "" - ITEM "D|Dare" - ITEM "A|Avere" - FIELD SEZIONE - GROUP 5 -END - -BOOLEAN F_BLOCCATO -BEGIN - PROMPT 2 20 "Movimento bloccato" - FIELD BLOCCATO -END - -ENDPAGE - -PAGE "Righe" 0 2 0 0 - -GROUPBOX DLG_NULL 78 4 -BEGIN - PROMPT 1 0 "@bMovimento" -END - -NUMBER F_NUMREG2 7 -BEGIN - PROMPT 2 1 "Numero " - FLAGS "D" -END - -DATE F_DATAREG2 -BEGIN - PROMPT 22 1 "Data registrazione " - FLAGS "D" -END - -NUMBER F_ANNOES2 4 -BEGIN - PROMPT 59 1 "Esercizio " - FLAGS "D" -END - -STRING F_DESCR2 50 -BEGIN - PROMPT 2 2 "Descrizione " - FLAGS "D" -END - -CURRENCY F_DARE 18 -BEGIN - PROMPT 2 4 "Saldo riga corrente: Dare " - FLAGS "D" -END - -CURRENCY F_AVERE 18 -BEGIN - PROMPT 52 4 "Avere " - FLAGS "D" -END - -SPREADSHEET F_RIGHE -1 -2 -BEGIN - PROMPT 0 5 "" - ITEM "Dare@15" - ITEM "Avere@15" - ITEM "Descrizione@30" - ITEM "Cdc 1" - ITEM "Cdc 2" - ITEM "Cdc 3" - ITEM "Cdc 4" - ITEM "Cms 1" - ITEM "Cms 2" - ITEM "Cms 3" - ITEM "Cms 4" - ITEM "Fas 1" - ITEM "Fas 2" - ITEM "Fas 3" - ITEM "Fas 4" - ITEM "Con 1" - ITEM "Con 2" - ITEM "Con 3" - ITEM "Con 4" - ITEM "Articolo@20" - ITEM "Descrizione@30" - ITEM "Cdc.Orig." - ITEM "Cms.Orig." - ITEM "Fase Orig." - ITEM "Conto Orig." -END - -BUTTON F_RESET 78 2 -BEGIN - PROMPT -11 -1 "Rigenera le righe in base alle tabelle di ripartizione" - FLAGS "H" -END - -ENDPAGE - -ENDMASK - -TOOLBAR "topbar" 0 0 0 2 - -BUTTON DLG_OK 10 2 -BEGIN - PROMPT -14 -1 "" -END - -BUTTON DLG_USER 10 2 -BEGIN - PROMPT -24 -1 "Ripartizione" - PICTURE TOOL_MULTISEL -END - -BUTTON DLG_DELREC 10 2 -BEGIN - PROMPT -34 -1 "" -END - -BUTTON DLG_CANCEL 10 2 -BEGIN - PROMPT -44 -1 "" -END - -ENDPAGE - -PAGE "Riga" 0 2 0 0 - -CURRENCY S_DARE 15 -BEGIN - PROMPT 8 0 "Dare " -END - -CURRENCY S_AVERE 15 -BEGIN - PROMPT 42 0 "Avere " -END - -STRING S_DESCR 50 -BEGIN - PROMPT 1 1 "Descrizione " - FIELD DESCR -END - -STRING S_CODART 20 -BEGIN - PROMPT 1 2 "Articolo " - USE LF_ANAMAG - INPUT CODART S_CODART - DISPLAY "Codice@20" CODART - DISPLAY "Descrizione@50" DESCR - OUTPUT S_CODART CODART - OUTPUT S_DESCART DESCR - CHECKTYPE NORMAL - FIELD CODART -END - -STRING S_DESCART 50 35 -BEGIN - PROMPT 38 2 "" - USE LF_ANAMAG KEY 2 - INPUT DESCR S_DESCART - DISPLAY "Descrizione@50" DESCR - DISPLAY "Codice@20" CODART - COPY OUTPUT S_CODART - CHECKTYPE NORMAL -END - -STRING S_CDC1 20 -BEGIN - PROMPT 1 4 "Cdc 1" - USE LF_CDC - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC2 20 -BEGIN - PROMPT 21 5 "Cdc 2" - COPY USE S_CDC1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC3 20 -BEGIN - PROMPT 41 6 "Cdc 3" - COPY USE S_CDC1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC4 20 -BEGIN - PROMPT 61 7 "Cdc 4" - COPY USE S_CDC1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CMS1 20 -BEGIN - PROMPT 1 8 "Cms 1" - USE LF_COMMESSE - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CMS2 20 -BEGIN - PROMPT 21 9 "Cms 2" - COPY USE S_CMS1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CMS3 20 -BEGIN - PROMPT 41 10 "Cms 3" - COPY USE S_CMS1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CMS4 20 -BEGIN - PROMPT 61 11 "Cms 4" - COPY USE S_CMS1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_FAS1 20 -BEGIN - PROMPT 1 12 "Fas 1" - USE LF_FASI - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_FAS2 20 -BEGIN - PROMPT 21 13 "Fas 2" - COPY USE S_FAS1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_FAS3 20 -BEGIN - PROMPT 41 14 "Fas 3" - COPY USE S_FAS1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_FAS4 20 -BEGIN - PROMPT 61 15 "Fas 4" - COPY USE S_FAS1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CON1 20 -BEGIN - PROMPT 1 16 "Con 1" - USE LF_PCON - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CON2 20 -BEGIN - PROMPT 21 17 "Con 2" - COPY USE S_CON1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CON3 20 -BEGIN - PROMPT 41 18 "Con 3" - COPY USE S_CON1 - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CON4 20 -BEGIN - PROMPT 61 19 "Con 4" - COPY USE S_CON1 - CHECKTYPE NORMAL - GROUP 1 -END - -TEXT DLG_NULL -BEGIN - PROMPT 1 20 "@bValori originali pre-ripartizione" -END - -STRING S_CDC_ORI 20 -BEGIN - PROMPT 1 21 "Cdc " - FLAGS "D" - FIELD CODCCORI -END - -STRING S_CMS_ORI 20 -BEGIN - PROMPT 27 21 "Cms " - FLAGS "D" - FIELD CODCMSORI -END - -STRING S_FAS_ORI 20 -BEGIN - PROMPT 53 21 "Fase " - FLAGS "D" - FIELD CODFASEORI -END - -STRING S_CON_ORI 20 -BEGIN - PROMPT 1 22 "Conto " - FLAGS "D" - FIELD CODCONTORI -END - -ENDPAGE - -ENDMASK +#include "ca2100a.h" + +TOOLBAR "topbar" 0 0 0 2 + +#include + +ENDPAGE + +PAGE "Testata" 0 0 0 2 + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 1 "@bTestata" +END + +LIST F_TIPO 1 25 +BEGIN + PROMPT 2 2 "Tipo movimento " + ITEM " |Normale" + ITEM "P|Preventivo" + ITEM "V|Variazione preventivo" + FIELD TIPOMOV +END + +DATE F_DATAREG +BEGIN + PROMPT 2 3 "Data di registrazione " + CHECKTYPE REQUIRED + FIELD DATAREG + FLAGS "A" + WARNING "La data di registrazione non appartiene ad un esercizio valido" + GROUP 5 + MESSAGE COPY,F_DATAREG2 +END + +NUMBER F_NUMREG 7 +BEGIN + PROMPT 54 2 "Movimento n. " + USE LF_MOVANA SELECT TIPOMOV==#F_TIPO + INPUT NUMREG F_NUMREG + DISPLAY "Numero@7" NUMREG + DISPLAY "Tipo" TIPOMOV + DISPLAY "Data reg.@10" DATAREG + DISPLAY "Data comp.@10" DATACOMP + DISPLAY "Eser." ANNOES + DISPLAY "P. nota" NUMREGCG + DISPLAY "Caus." CODCAUS + DISPLAY "Descrizione@50" DESCR + OUTPUT F_NUMREG NUMREG + CHECKTYPE REQUIRED + KEY 1 + FIELD NUMREG + FLAGS "G" + MESSAGE COPY,F_NUMREG2 +END + +DATE F_DATACOMP +BEGIN + PROMPT 2 4 "Data di competenza " + FIELD DATACOMP + CHECKTYPE REQUIRED + WARNING "La data di competenza non appartiene ad un esercizio valido" +END + +DATE F_DATAFCOMP +BEGIN + PROMPT 43 4 "Data di fine competenza " + FIELD DATAFCOMP + WARNING "La data di fine competenza non puo' essere anteriore alla data di competenza" +END + +NUMBER F_ANNOES 4 +BEGIN + PROMPT 54 3 "Esercizio " + FIELD ANNOES + MESSAGE COPY,F_ANNOES2 + FLAGS "DG" +END + +BOOLEAN F_AUTOFCOMP +BEGIN + PROMPT 2 5 "Fine competenza coincidente con fine commessa di ogni riga" + MESSAGE FALSE ENABLE,F_DATAFCOMP + MESSAGE TRUE CLEAR,F_DATAFCOMP + FIELD AUTOFCOMP +END + +STRING F_DESCR 50 +BEGIN + PROMPT 2 6 "Descrizione " + FIELD DESCR + MESSAGE COPY,F_DESCR2 +END + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 8 "@bDati contabili" +END + +STRINGA F_CODCAUS 3 +BEGIN + PROMPT 2 9 "Causale " + USE LF_CAUSALI SELECT MOVIND!='' + INPUT CODCAUS F_CODCAUS + DISPLAY "Codice" CODCAUS + DISPLAY "Descrizione@50" DESCR + DISPLAY "Industriale@C" MOVCGIND + OUTPUT F_CODCAUS CODCAUS + OUTPUT F_DESCAUS DESCR + CHECKTYPE REQUIRED + FLAGS "UG" + FIELD CODCAUS + GROUP 5 + ADD RUN cg0 -4 +END + +STRINGA F_DESCAUS 50 40 +BEGIN + PROMPT 20 9 "" + USE LF_CAUSALI KEY 2 SELECT MOVIND!='' + INPUT DESCR F_DESCAUS + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice" CODCAUS + DISPLAY "Industriale@C" MOVCGIND + COPY OUTPUT F_CODCAUS + CHECKTYPE REQUIRED + GROUP 5 + ADD RUN cg0 -4 +END + +STRING F_TIPODOC 2 +BEGIN + PROMPT 2 10 "Documento: Tipo " + USE %TPD + INPUT CODTAB F_TIPODOC + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@60" S0 + OUTPUT F_TIPODOC CODTAB + CHECKTYPE NORMAL + FIELD TIPODOC + GROUP 5 +END + +STRING F_NUMDOC 7 +BEGIN + PROMPT 28 10 "Numero " + CHECKTYPE NORMAL + FIELD NUMDOC + GROUP 5 +END + +DATE F_DATADOC +BEGIN + PROMPT 47 10 "Data " + FIELD DATADOC + GROUP 5 +END + +NUMBER F_NUMREGCG 7 +BEGIN + PROMPT 2 11 "N. reg. contabile " + FLAGS "DG" + FIELD NUMREGCG + MESSAGE EMPTY ENABLE,F_TIPO|HIDE,F_RESET + MESSAGE DISABLE,F_TIPO|SHOW,F_RESET +END + +LIST F_TIPOCF 1 11 +BEGIN + PROMPT 2 12 "Tipo " + FLAGS "DG" + ITEM "C|Clienti" + ITEM "F|Fornitori" +END + +NUMBER F_CODCF 6 +BEGIN + PROMPT 25 12 "Codice " + FLAGS "DG" + USE LF_CLIFO + INPUT TIPOCF F_TIPOCF SELECT + INPUT CODCF F_CODCF + OUTPUT F_TIPOCF TIPOCF + OUTPUT F_CODCF CODCF + OUTPUT F_RAGSOCCF RAGSOC + CHECKTYPE NORMAL +END + +STRING F_RAGSOCCF 50 +BEGIN + PROMPT 2 13 "Ragione Sociale " + FLAGS "D" +END + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 16 "@bMovimento" +END + +CURRENCY F_TOTDOC 18 +BEGIN + PROMPT 2 17 "Totale documento " + FIELD TOTDOC + GROUP 5 +END + +LISTBOX F_SEZIONE 1 5 +BEGIN + PROMPT 39 17 "" + ITEM "D|Dare" + ITEM "A|Avere" + FIELD SEZIONE + GROUP 5 +END + +BOOLEAN F_BLOCCATO +BEGIN + PROMPT 2 20 "Movimento bloccato" + FIELD BLOCCATO +END + +ENDPAGE + +PAGE "Righe" 0 2 0 0 + +GROUPBOX DLG_NULL 78 4 +BEGIN + PROMPT 1 0 "@bMovimento" +END + +NUMBER F_NUMREG2 7 +BEGIN + PROMPT 2 1 "Numero " + FLAGS "D" +END + +DATE F_DATAREG2 +BEGIN + PROMPT 22 1 "Data registrazione " + FLAGS "D" +END + +NUMBER F_ANNOES2 4 +BEGIN + PROMPT 59 1 "Esercizio " + FLAGS "D" +END + +STRING F_DESCR2 50 +BEGIN + PROMPT 2 2 "Descrizione " + FLAGS "D" +END + +CURRENCY F_DARE 18 +BEGIN + PROMPT 2 4 "Saldo riga corrente: Dare " + FLAGS "D" +END + +CURRENCY F_AVERE 18 +BEGIN + PROMPT 52 4 "Avere " + FLAGS "D" +END + +SPREADSHEET F_RIGHE -1 -2 +BEGIN + PROMPT 0 5 "" + ITEM "Dare@15" + ITEM "Avere@15" + ITEM "Descrizione@30" + ITEM "Cdc 1" + ITEM "Cdc 2" + ITEM "Cdc 3" + ITEM "Cdc 4" + ITEM "Cms 1" + ITEM "Cms 2" + ITEM "Cms 3" + ITEM "Cms 4" + ITEM "Fas 1" + ITEM "Fas 2" + ITEM "Fas 3" + ITEM "Fas 4" + ITEM "Con 1" + ITEM "Con 2" + ITEM "Con 3" + ITEM "Con 4" + ITEM "Descrizione conto@50" + ITEM "Articolo@20" + ITEM "Descrizione@30" + ITEM "Cdc.Orig." + ITEM "Cms.Orig." + ITEM "Fase Orig." + ITEM "Conto Orig." +END + +BUTTON F_RESET 78 2 +BEGIN + PROMPT -11 -1 "Rigenera le righe in base alle tabelle di ripartizione" + FLAGS "H" +END + +ENDPAGE + +ENDMASK + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -14 -1 "" +END + +BUTTON DLG_USER 10 2 +BEGIN + PROMPT -24 -1 "Ripartizione" + PICTURE TOOL_MULTISEL +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -34 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -44 -1 "" +END + +ENDPAGE + +PAGE "Riga" 0 2 0 0 + +CURRENCY S_DARE 15 +BEGIN + PROMPT 8 0 "Dare " +END + +CURRENCY S_AVERE 15 +BEGIN + PROMPT 42 0 "Avere " +END + +STRING S_DESCR 50 +BEGIN + PROMPT 1 1 "Descrizione " + FIELD DESCR +END + +STRING S_CDC1 50 +BEGIN + PROMPT 1 4 "Cdc 1" + USE LF_CDC + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC2 50 +BEGIN + PROMPT 21 5 "Cdc 2" + COPY USE S_CDC1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC3 50 +BEGIN + PROMPT 41 6 "Cdc 3" + COPY USE S_CDC1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC4 50 +BEGIN + PROMPT 61 7 "Cdc 4" + COPY USE S_CDC1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CMS1 50 +BEGIN + PROMPT 1 8 "Cms 1" + USE LF_COMMESSE + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CMS2 50 +BEGIN + PROMPT 21 9 "Cms 2" + COPY USE S_CMS1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CMS3 50 +BEGIN + PROMPT 41 10 "Cms 3" + COPY USE S_CMS1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CMS4 50 +BEGIN + PROMPT 61 11 "Cms 4" + COPY USE S_CMS1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_FAS1 50 +BEGIN + PROMPT 1 12 "Fas 1" + USE LF_FASI + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_FAS2 50 +BEGIN + PROMPT 21 13 "Fas 2" + COPY USE S_FAS1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_FAS3 50 +BEGIN + PROMPT 41 14 "Fas 3" + COPY USE S_FAS1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_FAS4 50 +BEGIN + PROMPT 61 15 "Fas 4" + COPY USE S_FAS1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CON1 50 +BEGIN + PROMPT 1 16 "Con 1" + USE LF_PCON + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CON2 50 +BEGIN + PROMPT 21 17 "Con 2" + COPY USE S_CON1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CON3 50 +BEGIN + PROMPT 41 18 "Con 3" + COPY USE S_CON1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CON4 50 +BEGIN + PROMPT 61 19 "Con 4" + COPY USE S_CON1 + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_DES_CON 50 +BEGIN + PROMPT 61 19 "" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CODART 20 +BEGIN + PROMPT 1 2 "Articolo " + USE LF_ANAMAG + INPUT CODART S_CODART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT S_CODART CODART + OUTPUT S_DESCART DESCR + CHECKTYPE NORMAL + FIELD CODART +END + +STRING S_DESCART 50 35 +BEGIN + PROMPT 38 2 "" + USE LF_ANAMAG KEY 2 + INPUT DESCR S_DESCART + DISPLAY "Descrizione@50" DESCR + DISPLAY "Codice@20" CODART + COPY OUTPUT S_CODART + CHECKTYPE NORMAL +END + +TEXT DLG_NULL +BEGIN + PROMPT 1 20 "@bValori originali pre-ripartizione" +END + +STRING S_CDC_ORI 20 +BEGIN + PROMPT 1 21 "Cdc " + FLAGS "D" + FIELD CODCCORI +END + +STRING S_CMS_ORI 20 +BEGIN + PROMPT 27 21 "Cms " + FLAGS "D" + FIELD CODCMSORI +END + +STRING S_FAS_ORI 20 +BEGIN + PROMPT 53 21 "Fase " + FLAGS "D" + FIELD CODFASEORI +END + +STRING S_CON_ORI 20 +BEGIN + PROMPT 1 22 "Conto " + FLAGS "D" + FIELD CODCONTORI +END + +STRING S_ART 20 +BEGIN + PROMPT 2 23 "Articolo " + USE LF_ANAMAG + INPUT CODART S_ART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT S_ART CODART + OUTPUT S_DES_ART DESCR + CHECKTYPE NORMAL + FIELD CODART + MODULE CI +END + +STRING S_DES_ART 50 40 +BEGIN + PROMPT 35 23 "" + USE LF_ANAMAG KEY 2 + INPUT DESCR S_DES_ART + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + COPY OUTPUT S_ART + CHECKTYPE SEARCH + MODULE CI +END + +ENDPAGE + +ENDMASK diff --git a/src/ca/ca3100a.rep b/src/ca/ca3100a.rep index 4a1e9a23c..519db804b 100755 --- a/src/ca/ca3100a.rep +++ b/src/ca/ca3100a.rep @@ -1,214 +1,218 @@ - - - Movimenti CA per numero registrazione - -
- - #ESERCIZIO @ -0 E; -IF - 121 122 SCAMBIA_CAMPI -THEN -; - - - #SYSTEM.RAGSOC - - - #SYSTEM.DATE - - - #REPORT.PAGE - - - - - #DANUMREG - - - - - #ANUMREG - - - - - - - - - - - - - - - -
-
- MESSAGE RESET,F1.101 -MESSAGE RESET,F1.102 - - - -
-
- NUMREG - - MOVANA.NUMREG - - - MOVANA.DATADOC - - - MOVANA.NUMREGCG - - - MOVANA.NUMDOC - - - MOVANA.TIPODOC - - - MOVANA.DESCR - - - MOVANA.CODCAUS - - - MESSAGE ISAMREAD,CAUS,CODCAUS=MOVANA.CODCAUS,DESCR - - - MOVANA.TIPOMOV - - - MOVANA.TOTDOC - "MOVANA.SEZIONE" @ -"A" = -IF -0 #THIS ! -THEN - - - - MOVANA.TOTDOC - "MOVANA.SEZIONE" @ -"D" = -IF -0 #THIS ! -THEN - - - - - - - - - - - - - DATAREG - - - MOVANA.DATAREG - - - MOVANA.DATACOMP - -
-
-
- #ESERCIZIO @ -0 E; -IF - 121 122 SCAMBIA_CAMPI -THEN -; - - NUMRIG - - - CODCCOSTO - CA_FORMAT_COSTO - - - CODCMS - CA_FORMAT_COMMESSA - - - CODFASE - CA_FORMAT_FASE - - - CODCONTO - CA_FORMAT_CONTO - - - DESCR - - - IMPORTO - "RMOVANA.SEZIONE" @ -"A" = -IF -0 #THIS ! -THEN - - MESSAGE ADD,F1.101 - - - IMPORTO - "RMOVANA.SEZIONE" @ -"D" = -IF -0 #THIS ! -THEN - - MESSAGE ADD,F1.102 - -
-
-
- - - - - - - - - - -
-
- USE RMOVANA -JOIN MOVANA INTO NUMREG==NUMREG - : SCAMBIA_CAMPI ( F1 F2 -- ) - VARIABLE _X1 \ coordinate del campo F1 - VARIABLE _Y1 - VARIABLE _X2 \ coordinate del campo F2 - VARIABLE _Y2 - - 2DUP \ duplica i campi F1 F2 sullo stack - GET_POS \ prende le coordinate del campo F2 - _Y2 ! \ e le mette in _Y2 e _X2 - _X2 ! - GET_POS \ prende le coordinate del campo F1 - _Y1 ! \ e le mette in _Y1 e _X1 - _X1 ! - - _X1 @ \ legge le coordinate di F1 - _Y1 @ - ROT - SET_POS \ mette le coord in F2 - - _X2 @ - _Y2 @ - ROT - SET_POS -; - - + + + Movimenti CA per numero registrazione + +
+ + #ESERCIZIO @ +0 E; +IF + 121 122 SCAMBIA_CAMPI +THEN +; + + + #SYSTEM.RAGSOC + + + #SYSTEM.DATE + + + #REPORT.PAGE + + + + + #DANUMREG + + + + + #ANUMREG + + + + + + + + + + + + + + + + +
+
+ MESSAGE RESET,F1.101 +MESSAGE RESET,F1.102 + + + +
+
+ NUMREG + + MOVANA.NUMREG + + + MOVANA.DATAFCOMP + + + MOVANA.NUMREGCG + + + MOVANA.NUMDOC + + + MOVANA.TIPODOC + + + MOVANA.DESCR + + + MOVANA.CODCAUS + + + MESSAGE ISAMREAD,CAUS,CODCAUS=MOVANA.CODCAUS,DESCR + + + MOVANA.TIPOMOV + + + MOVANA.TOTDOC + "MOVANA.SEZIONE" @ +"A" = +IF +0 #THIS ! +THEN + + + + MOVANA.TOTDOC + "MOVANA.SEZIONE" @ +"D" = +IF +0 #THIS ! +THEN + + + + MOVANA.DATADOC + + + + + + + + + + + + DATAREG + + + MOVANA.DATAREG + + + MOVANA.DATACOMP + +
+
+
+ #ESERCIZIO @ +0 E; +IF + 121 122 SCAMBIA_CAMPI +THEN +; + + NUMRIG + + + CODCCOSTO + CA_FORMAT_COSTO + + + CODCMS + CA_FORMAT_COMMESSA + + + CODFASE + CA_FORMAT_FASE + + + CODCONTO + CA_FORMAT_CONTO + + + DESCR + + + IMPORTO + "RMOVANA.SEZIONE" @ +"A" = +IF +0 #THIS ! +THEN + + MESSAGE ADD,F1.101 + + + IMPORTO + "RMOVANA.SEZIONE" @ +"D" = +IF +0 #THIS ! +THEN + + MESSAGE ADD,F1.102 + +
+
+
+ + + + + + + + + + +
+
+ USE RMOVANA +JOIN MOVANA INTO NUMREG==NUMREG + : SCAMBIA_CAMPI ( F1 F2 -- ) + VARIABLE _X1 \ coordinate del campo F1 + VARIABLE _Y1 + VARIABLE _X2 \ coordinate del campo F2 + VARIABLE _Y2 + + 2DUP \ duplica i campi F1 F2 sullo stack + GET_POS \ prende le coordinate del campo F2 + _Y2 ! \ e le mette in _Y2 e _X2 + _X2 ! + GET_POS \ prende le coordinate del campo F1 + _Y1 ! \ e le mette in _Y1 e _X1 + _X1 ! + + _X1 @ \ legge le coordinate di F1 + _Y1 @ + ROT + SET_POS \ mette le coord in F2 + + _X2 @ + _Y2 @ + ROT + SET_POS +; + + \ No newline at end of file diff --git a/src/ca/ca3100b.rep b/src/ca/ca3100b.rep index 8e1ceb0ba..044dc9eea 100755 --- a/src/ca/ca3100b.rep +++ b/src/ca/ca3100b.rep @@ -1,225 +1,229 @@ - - - Movimenti CA per data - -
- - #ESERCIZIO @ -0 E; -IF - 121 122 SCAMBIA_CAMPI -THEN -; - - - #SYSTEM.RAGSOC - - - #SYSTEM.DATE - - - #REPORT.PAGE - - - - - #DADATA - - - - - #ADATA - - - - - - - - - - - - - - - -
-
- MESSAGE RESET,F1.101 -MESSAGE RESET,F1.102 - - - -
-
- IF (#ANNO E; 0,MOVANA.DATACOMP,MOVANA.DATAREG) - MESSAGE RESET,F2.131 -MESSAGE RESET,F2.132 -
-
- NUMREG - - MOVANA.NUMREG - - - MOVANA.DATADOC - - - MOVANA.NUMREGCG - - - MOVANA.NUMDOC - - - MOVANA.TIPODOC - - - MOVANA.DESCR - - - MOVANA.CODCAUS - - - MESSAGE ISAMREAD,CAUS,CODCAUS=MOVANA.CODCAUS,DESCR - - - MOVANA.TIPOMOV - - - MOVANA.TOTDOC - "MOVANA.SEZIONE" @ -"A" = -IF -0 #THIS ! -THEN - - - - MOVANA.TOTDOC - "MOVANA.SEZIONE" @ -"D" = -IF -0 #THIS ! -THEN - - - - - - - - - - - - - MOVANA.DATAREG - - - MOVANA.DATACOMP - -
-
-
- #ESERCIZIO @ -0 E; -IF - 121 122 SCAMBIA_CAMPI -THEN -; - - NUMRIG - - - CODCCOSTO - CA_FORMAT_COSTO - - - CODCMS - CA_FORMAT_COMMESSA - - - CODFASE - CA_FORMAT_FASE - - - CODCONTO - CA_FORMAT_CONTO - - - DESCR - - - IMPORTO - "RMOVANA.SEZIONE" @ -"A" = -IF -0 #THIS ! -THEN - - MESSAGE ADD,F1.101 -MESSAGE ADD,F2.131 - - - IMPORTO - "RMOVANA.SEZIONE" @ -"D" = -IF -0 #THIS ! -THEN - - MESSAGE ADD,F1.102 -MESSAGE ADD,F2.132 - -
-
-
- - - - - - - - - - -
-
- - - - -
-
- USE RMOVANA -JOIN MOVANA INTO NUMREG==NUMREG -BY MOVANA-E;#DATAORD - : SCAMBIA_CAMPI ( F1 F2 -- ) - VARIABLE _X1 \ coordinate del campo F1 - VARIABLE _Y1 - VARIABLE _X2 \ coordinate del campo F2 - VARIABLE _Y2 - - 2DUP \ duplica i campi F1 F2 sullo stack - GET_POS \ prende le coordinate del campo F2 - _Y2 ! \ e le mette in _Y2 e _X2 - _X2 ! - GET_POS \ prende le coordinate del campo F1 - _Y1 ! \ e le mette in _Y1 e _X1 - _X1 ! - - _X1 @ \ legge le coordinate di F1 - _Y1 @ - ROT - SET_POS \ mette le coord in F2 - - _X2 @ - _Y2 @ - ROT - SET_POS -; - - + + + Movimenti CA per data + +
+ + #ESERCIZIO @ +0 E; +IF + 121 122 SCAMBIA_CAMPI +THEN +; + + + #SYSTEM.RAGSOC + + + #SYSTEM.DATE + + + #REPORT.PAGE + + + + + #DADATA + + + + + #ADATA + + + + + + + + + + + + + + + + +
+
+ MESSAGE RESET,F1.101 +MESSAGE RESET,F1.102 + + + +
+
+ IF (#ANNO E; 0,MOVANA.DATACOMP,MOVANA.DATAREG) + MESSAGE RESET,F2.131 +MESSAGE RESET,F2.132 +
+
+ NUMREG + + MOVANA.NUMREG + + + MOVANA.DATAFCOMP + + + MOVANA.NUMREGCG + + + MOVANA.NUMDOC + + + MOVANA.TIPODOC + + + MOVANA.DESCR + + + MOVANA.CODCAUS + + + MESSAGE ISAMREAD,CAUS,CODCAUS=MOVANA.CODCAUS,DESCR + + + MOVANA.TIPOMOV + + + MOVANA.TOTDOC + "MOVANA.SEZIONE" @ +"A" = +IF +0 #THIS ! +THEN + + + + MOVANA.TOTDOC + "MOVANA.SEZIONE" @ +"D" = +IF +0 #THIS ! +THEN + + + + MOVANA.DATADOC + + + + + + + + + + + + MOVANA.DATAREG + + + MOVANA.DATACOMP + +
+
+
+ #ESERCIZIO @ +0 E; +IF + 121 122 SCAMBIA_CAMPI +THEN +; + + NUMRIG + + + CODCCOSTO + CA_FORMAT_COSTO + + + CODCMS + CA_FORMAT_COMMESSA + + + CODFASE + CA_FORMAT_FASE + + + CODCONTO + CA_FORMAT_CONTO + + + DESCR + + + IMPORTO + "RMOVANA.SEZIONE" @ +"A" = +IF +0 #THIS ! +THEN + + MESSAGE ADD,F1.101 +MESSAGE ADD,F2.131 + + + IMPORTO + "RMOVANA.SEZIONE" @ +"D" = +IF +0 #THIS ! +THEN + + MESSAGE ADD,F1.102 +MESSAGE ADD,F2.132 + +
+
+
+ + + + + + + + + + +
+
+ + + + +
+
+ USE RMOVANA +JOIN MOVANA INTO NUMREG==NUMREG +BY MOVANA-E;#DATAORD + : SCAMBIA_CAMPI ( F1 F2 -- ) + VARIABLE _X1 \ coordinate del campo F1 + VARIABLE _Y1 + VARIABLE _X2 \ coordinate del campo F2 + VARIABLE _Y2 + + 2DUP \ duplica i campi F1 F2 sullo stack + GET_POS \ prende le coordinate del campo F2 + _Y2 ! \ e le mette in _Y2 e _X2 + _X2 ! + GET_POS \ prende le coordinate del campo F1 + _Y1 ! \ e le mette in _Y1 e _X1 + _X1 ! + + _X1 @ \ legge le coordinate di F1 + _Y1 @ + ROT + SET_POS \ mette le coord in F2 + + _X2 @ + _Y2 @ + ROT + SET_POS +; + + \ No newline at end of file diff --git a/src/ca/ca3200.cpp b/src/ca/ca3200.cpp index da9b2ecfd..65fb60b67 100755 --- a/src/ca/ca3200.cpp +++ b/src/ca/ca3200.cpp @@ -1,730 +1,740 @@ -#include -#include -#include -#include -#include - -#include "../cg/cglib01.h" - -#include "commesse.h" -#include "pconana.h" -#include "movana.h" -#include "rmovana.h" - -#include "ca3.h" -#include "ca3200.h" -#include "calib01.h" -#include "calib02.h" -#include "camask.h" - -//////////////////////////////////////////////////////// -// MASCHERA -//////////////////////////////////////////////////////// -class TPrint_mastrini_ca_mask : public TAnal_report_mask -{ -protected: - bool on_field_event(TOperable_field& o, TField_event e, long jolly); - const TString& get_report_class() const; - bool test_compatible_report(); - -public: - TPrint_mastrini_ca_mask(); - virtual ~TPrint_mastrini_ca_mask() {} -}; - -const TString& TPrint_mastrini_ca_mask::get_report_class() const -{ - TString& classe = get_tmp_string(); - classe = "ca3200a"; -// const int stp = get_int(F_TIPOCONTI); -// classe << (stp == 1 ? 'a' : 'b'); // tipo di report da usare in caso di report multipli - return classe; -} - -bool TPrint_mastrini_ca_mask::test_compatible_report() -{ - TFilename lib = get_report_class(); - const TString& name = get(F_REPORT); - bool ok = name.not_empty(); - if (ok) - { - TReport rep; - ok = rep.load(name); - if (ok) - { - const TString& classe = rep.get_class(); - ok = classe == lib; - } - } - if (!ok) - { - set(F_REPORT, lib); - lib.ext("rep"); - ok = lib.custom_path(); - } - return ok; -} - -bool TPrint_mastrini_ca_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) -{ - switch (o.dlg()) - { - case DLG_PRINT: - if (e == fe_button) - { - main_app().print(); - return false; - } - break; - case DLG_PREVIEW: - if (e == fe_button) - { - main_app().preview(); - return false; - } - break; - case F_TIPOCONTI: - if (e == fe_init || e == fe_modify) - { - test_compatible_report(); //in base al tipo di conti da stampare setta i report compatibili (solo nel caso di rep multipli) - } - break; - case F_REPORT: - if (e == fe_button) - { - const TString8 lib = get_report_class(); - TFilename path = o.get(); - if (select_custom_file(path, "rep", lib)) - { - path = path.name(); - path.ext(""); - o.set(path); - } - } else - if (e == fe_close) - { - if (!test_compatible_report()) - return error_box(TR("Impossibile trovare un report compatibile")); - } - break; - case F_ANNO: - if (e == fe_modify && !o.empty()) - { - TEsercizi_contabili esc; - TDate inies, fines; - if (esc.code2range(atoi(o.get()), inies, fines)) - { - set(F_DATAINI, inies); - set(F_DATAFIN, fines); - } - } - break; - case F_DATAINI: - case F_DATAFIN: - if (e == fe_close) - { - const int anno = get_int(F_ANNO); - if (anno > 0) //se viene selezionato un esercizio.. - { - TEsercizi_contabili esc; //..le date devono essere incluse nell'esercizio selezionato! - const TDate data = o.get(); - if (!data.empty() && esc.date2esc(data) != anno) - return error_box(TR("La data deve appartenere all'anno selezionato")); - } - else //se l'esercizio è vuoto le date diventano obbligatorie!! - { - if (o.empty()) - return error_box(TR("La data è obbligatoria in quanto manca l'esercizio")); - } - } - break; - default: break; - } - return true; -} - - -TPrint_mastrini_ca_mask::TPrint_mastrini_ca_mask() - : TAnal_report_mask("ca3200") -{ - TConfig& cfg = ca_config(); - const bool use_pdcc = cfg.get_bool("UsePdcc"); - - const int logicnum = use_pdcc ? LF_PCON : LF_PCONANA; - const int nfields = ca_create_fields(*this, 1, logicnum, 2, 4, F_CDC1_INI, F_DES1_INI, 0x0, "#DACONTO"); - ca_create_fields(*this, 1, logicnum, 2, 10, F_CDC1_FIN, F_DES1_FIN, 0x0, "#ACONTO"); - - for (int i = 0; i < nfields; i++) - { - TMask_field& daconto = field(F_CDC1_INI + i); - daconto.set_group(1); - daconto.check_type(CHECK_NORMAL); - TMask_field& aconto = field(F_CDC1_FIN + i); - aconto.set_group(2); - aconto.check_type(CHECK_NORMAL); - } - // creazione dei campi della seconda pagina della maschera - create_sheet(F_RIGHE); -} - - -/////////////////////////////////////////////////////////////// -// RECORDSET PRINCIPALE (caso standard: conti movimentati) -/////////////////////////////////////////////////////////////// - -class TPrint_mastrini_ca_recordset : public TISAM_recordset -{ -protected: - int _anno; - int _tipoconti; - int _tipimov; - TDate _dadata, _adata; - long _danumreg, _anumreg; - TString _daconto, _aconto, _codcosto, _codcms, _codfas; - -protected: //da libreria - virtual const TVariant& get(const char* column_name) const; - -protected: - static bool mov_filter(const TRelation* rel); - bool valid_record(const TRelation& rel) const; - virtual void set_custom_filter(TCursor& cur) const; - const TImporto& saldo_iniziale(const char* conto) const; - -public: - virtual void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); - TPrint_mastrini_ca_recordset(const TString& sql) : TISAM_recordset(sql) { } -}; - -static const TPrint_mastrini_ca_recordset* myself = NULL; - -//metodo per riconoscere se il record corrente soddisfa i filtri della maschera...strafighissimo! -bool TPrint_mastrini_ca_recordset::valid_record(const TRelation& rel) const -{ - //prima controlla la testata... - const TRectype& mov = rel.curr(LF_MOVANA); - - const char tipomov = mov.get_char(MOVANA_TIPOMOV); - int tipomov_int = 0; - switch (tipomov) - { - case 'P': tipomov_int = 2; break; - case 'V': tipomov_int = 4; break; - default : tipomov_int = 1; break; - } - if ((_tipimov & tipomov_int) == 0) - return false; - - //aggiunta 01/12/08; se non si specifica l'esercizio si DEVE tener conto della DATAREG e non della DATACOMP; quindi.. - //..deve effettuare tale controllo e controllare se la datareg rientra nell'intervallo di date selezionato sulla maschera - if (_anno <= 0) - { - const TDate datareg = mov.get_date(MOVANA_DATAREG); - if (_dadata.ok() && datareg < _dadata) - return false; - if (_adata.ok() && datareg > _adata) - return false; - } - else - { - const TDate datacomp = mov.get_date(MOVANA_DATACOMP); - if (_dadata.ok() && datacomp < _dadata) - return false; - if (_adata.ok() && datacomp > _adata) - return false; - - const TDate datafcomp = mov.get_date(MOVANA_DATAFCOMP); - if (datafcomp.ok() && _dadata.ok() && datafcomp < _dadata) - return false; - } - - //..poi le righe (devono comparire solo le righe con cdc/cms/fsc che appaiono nello sheet) - const TRectype& rmov = rel.curr(LF_RMOVANA); - - if (_codcosto.not_empty()) - { - const TString& cos = rmov.get(RMOVANA_CODCCOSTO); - if (cos != _codcosto) - return false; - } - if (_codcms.not_empty()) - { - const TString& cms = rmov.get(RMOVANA_CODCMS); - if (cms != _codcms) - return false; - } - if (_codfas.not_empty()) - { - const TString& fas = rmov.get(RMOVANA_CODFASE); - if (fas != _codfas) - return false; - } - - return true; -} - -bool TPrint_mastrini_ca_recordset::mov_filter(const TRelation* rel) -{ - return myself->valid_record(*rel); -} - -void TPrint_mastrini_ca_recordset::set_custom_filter(TCursor& cur) const -{ - //filtro sui conti selezionati sulla maschera - TRectype darec(cur.curr()), arec(cur.curr()); //record corrente (rmovana (solo movimentati)) - - if (_daconto.full()) - darec.put(RMOVANA_CODCONTO, _daconto); - - if (_aconto.full()) - arec.put(RMOVANA_CODCONTO, _aconto); - - cur.setregion(darec, arec); - - myself = this; - cur.set_filterfunction(mov_filter, true); //questa gestirà le date -} - -const TImporto& TPrint_mastrini_ca_recordset::saldo_iniziale(const char* conto) const -{ - TAnal_bill bill(conto, _codcosto, _codcms, _codfas); - const TSaldanal& saldo = ca_saldo(bill, _dadata, _adata, _tipimov); - return saldo._ini; -} - - -const TVariant& TPrint_mastrini_ca_recordset::get(const char* column_name) const -{ - if (strncmp(column_name, "SALDOINI:", 9) == 0) - { - const TString16 sub_field = column_name+9; - const TString& conto = get(RMOVANA_CODCONTO).as_string(); - const TImporto& saldo_ini = saldo_iniziale(conto); - - TVariant& var = get_tmp_var(); - if (sub_field == "DARE") - var = saldo_ini.sezione() == 'D' ? saldo_ini.valore() : ZERO; - else - var = saldo_ini.sezione() == 'A' ? saldo_ini.valore() : ZERO; - return var; - } - - if (strcmp(column_name, "#COSTO") == 0) - { - TVariant& var = get_tmp_var(); - var = _codcosto; - return var; - } - if (strcmp(column_name, "#COMMESSA") == 0) - { - TVariant& var = get_tmp_var(); - var = _codcms; - return var; - } - if (strcmp(column_name, "#FASE") == 0) - { - TVariant& var = get_tmp_var(); - var = _codfas; - return var; - } - return TISAM_recordset::get(column_name); -} - -//metodo per caricare i valori nel recordset dalla maschera...fighissimo!! -void TPrint_mastrini_ca_recordset::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) -{ - _daconto, _aconto, _codcosto = _codcms = _codfas = ""; - if (cms_row >= 0) - { - TSheet_field& sf = msk.sfield(F_RIGHE); - TMask& sm = sf.sheet_mask(); - sf.update_mask(cms_row); - TRelation rel(LF_RMOVANA); - sm.autosave(rel); - _codcosto = rel.curr().get(RMOVANA_CODCCOSTO); - _codcms = rel.curr().get(RMOVANA_CODCMS); - _codfas = rel.curr().get(RMOVANA_CODFASE); - } - - for (int i = 0; msk.id2pos(F_CDC1_INI+i) > 0; i++) - { - _daconto << msk.get(F_CDC1_INI+i); - _aconto << msk.get(F_CDC1_FIN+i); - } - - _anno = msk.get_int(F_ANNO); - _dadata = msk.get_date(F_DATAINI); - _adata = msk.get_date(F_DATAFIN); - - _tipimov = 0; - switch (msk.get(F_TIPIMOV)[0]) - { - case 'N': _tipimov = 1; break; - case 'P': _tipimov = 6; break; - default: _tipimov = 7; break; - } - _tipoconti = msk.get_int(F_TIPOCONTI); -} - - -///////////////////////////////////////////////////////////////////////////////// -// RECORDSET SECONDARIO (casi alternativi: conti con saldo != 0 e tutti i conti) -///////////////////////////////////////////////////////////////////////////////// - -class TPrint_mastrini_ca_alternative_recordset : public TPrint_mastrini_ca_recordset -{ - TIsamtempfile* _tmp_rmovana; -protected: - const TImporto& saldo_finale(const char* conto) const; - virtual void set_custom_filter(TCursor& cur) const; - -public: - virtual void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); - TPrint_mastrini_ca_alternative_recordset(const TString& sql); - ~TPrint_mastrini_ca_alternative_recordset() { delete _tmp_rmovana; } -}; - -TPrint_mastrini_ca_alternative_recordset::TPrint_mastrini_ca_alternative_recordset(const TString& sql) - : TPrint_mastrini_ca_recordset(sql) -{ - _tmp_rmovana = NULL; -} - - -const TImporto& TPrint_mastrini_ca_alternative_recordset::saldo_finale(const char* conto) const -{ - TAnal_bill bill(conto, _codcosto, _codcms, _codfas); - const TSaldanal& saldo = ca_saldo(bill, _dadata, _adata, _tipimov); - return saldo._fin; -} - -void TPrint_mastrini_ca_alternative_recordset::set_custom_filter(TCursor& cur) const -{ - //crea un file temporaneo che non viene distrutto ad inizio stampa effettiva - TIsamtempfile* tmp = new TIsamtempfile(LF_RMOVANA, "anal", false, false); - relation()->replace(tmp); //sostituisce il vero file rmovana con quello temporaneo -} - -void TPrint_mastrini_ca_alternative_recordset::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) -{ - //se esiste non vuoto il file temporano con tracciato rmovana lo cancella e lo ricrea vuoto - if (_tmp_rmovana != NULL) - delete _tmp_rmovana; - - _tmp_rmovana = new TIsamtempfile(LF_RMOVANA, "anal", true, true); - - //prende un po' di dati dalla maschera - _daconto, _aconto, _codcosto = _codcms = _codfas = ""; - if (cms_row >= 0) - { - TSheet_field& sf = msk.sfield(F_RIGHE); - TMask& sm = sf.sheet_mask(); - sf.update_mask(cms_row); - TRelation rel(LF_RMOVANA); - sm.autosave(rel); - _codcosto = rel.curr().get(RMOVANA_CODCCOSTO); - _codcms = rel.curr().get(RMOVANA_CODCMS); - _codfas = rel.curr().get(RMOVANA_CODFASE); - } - - for (int i = 0; msk.id2pos(F_CDC1_INI+i) > 0; i++) - { - _daconto << msk.get(F_CDC1_INI+i); - _aconto << msk.get(F_CDC1_FIN+i); - } - - _dadata = msk.get_date(F_DATAINI); - _adata = msk.get_date(F_DATAFIN); - // Riempie le date con valori sensati - if (!_dadata.ok() || !_adata.ok()) - { - TEsercizi_contabili esc; - const int codes = msk.get_int(F_ANNO); - if (esc.exist(codes)) - { - const TEsercizio& esercizio = esc[codes]; - if (!_dadata.ok()) - _dadata = esercizio.inizio(); - if (!_adata.ok()) - _adata = esercizio.fine(); - } - else - { - if (!_adata.ok()) - _adata = TDate(31, 12, 9999); - } - } - - _tipimov = 0; - switch (msk.get(F_TIPIMOV)[0]) - { - case 'N': _tipimov = 1; break; - case 'P': _tipimov = 6; break; - default: _tipimov = 7; break; - } - - _tipoconti = msk.get_int(F_TIPOCONTI); - - //scandisce il piano dei conti analitico creando un cursore con i conti nell'intervallo scelto sulla maschera - TPconana_recordset pconana; - - pconana.set_filter(' ', _daconto, _aconto, _codcosto, _codcms, _codfas, - _dadata, _adata, _tipimov, _tipoconti==1, _tipoconti==2); - - const long pconana_items = pconana.items(); - TProgind pi(pconana_items, TR("Scansione conti...")); - - TRelation rel_rmovana(LF_RMOVANA); - rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere i tipi mov. - - TRectype da_rmovana(LF_RMOVANA); - da_rmovana.put(RMOVANA_DATACOMP, _dadata); - TRectype a_rmovana(LF_RMOVANA); - a_rmovana.put(RMOVANA_DATACOMP, _adata); - - TString filtro; - if (_codcosto.not_empty()) - filtro << "(" << RMOVANA_CODCCOSTO << "?=\"" << _codcosto << "*\")"; - if (_codcms.not_empty()) - { - if (filtro.not_empty()) - filtro << "&&"; - filtro << "(" << RMOVANA_CODCMS << "?=\"" << _codcms << "*\")"; - } - if (_codfas.not_empty()) - { - if (filtro.not_empty()) - filtro << "&&"; - filtro << "(" << RMOVANA_CODFASE << "?=\"" << _codfas << "*\")"; - } - - //scandisce il piano dei conti.. - for (bool pok = pconana.move_first(); pok; pok = pconana.move_next()) - { - if (!pi.addstatus(1)) - break; - const TString& conto = pconana.get(PCONANA_CODCONTO).as_string(); - - //..crea un cursore su rmovana per vedere se i conti selezionati hanno veri movimenti che soddisfano - //i parametri del filtro sulla maschera - da_rmovana.put(RMOVANA_CODCONTO, conto); - a_rmovana.put(RMOVANA_CODCONTO, conto); - - TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana); - const long rmovana_items = cur_rmovana.items(); - bool almeno_uno_aggiunto = false; - if (rmovana_items > 0) - { - cur_rmovana.freeze(); - for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) - { - //deve coincidere anche il tipomov! sarebbe stato troppo semplice... - const char tipomov = rel_rmovana.curr(LF_MOVANA).get_char(MOVANA_TIPOMOV); - int tipomov_int = 0; - switch (tipomov) - { - case 'P': tipomov_int = 2; break; - case 'V': tipomov_int = 4; break; - default: tipomov_int = 1; break; - } - if ((_tipimov & tipomov_int) != 0) - { - _tmp_rmovana->write(cur_rmovana.curr()); // aggiunge i record al file temporaneo - almeno_uno_aggiunto = true; - } - } - cur_rmovana.freeze(false); - } - //se non ha aggiunto nemmeno un record valido.. - //crea un record di rmovana con il solo conto,datacomp e lo aggiunge al file temporaneo - if (!almeno_uno_aggiunto) - { - TRectype fake_rmovana_rec(LF_RMOVANA); - fake_rmovana_rec.put(RMOVANA_CODCONTO, conto); - fake_rmovana_rec.put(RMOVANA_DATACOMP, _dadata); - _tmp_rmovana->write(fake_rmovana_rec); - } - - } //end for su pconana_items - -} - -//////////////////////////////////////////////////////// -// REPORT -//////////////////////////////////////////////////////// -class TPrint_mastrini_ca_rep : public TAnal_report -{ -protected: - virtual bool set_recordset(const TString& sql); - -public: - void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); -}; - -bool TPrint_mastrini_ca_rep::set_recordset(const TString& sql) -{ - TPrint_mastrini_ca_recordset* rs = new TPrint_mastrini_ca_recordset(sql); - return TReport::set_recordset(rs); -} - -void TPrint_mastrini_ca_rep::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) -{ - TReport::set_recordset(NULL); //forza azzeramento file anal.dbf prima di ricostruirlo - - const int tipoconti = msk.get_int(F_TIPOCONTI); - - TPrint_mastrini_ca_recordset* recset = NULL; - - const char* const query ="USE RMOVANA KEY 2\nJOIN MOVANA INTO NUMREG==NUMREG\nJOIN MOV TO MOVANA INTO NUMREG==NUMREGCG"; - switch (tipoconti) - { - case 1: - recset = new TPrint_mastrini_ca_recordset(query); - break; - default: - recset = new TPrint_mastrini_ca_alternative_recordset(query); - break; - } - recset->set_filter(msk, cms_row); - TAnal_report::set_recordset(recset); -} - -//////////////////////////////////////////////////////// -// APPLICAZIONE -//////////////////////////////////////////////////////// -class TPrint_mastrini_ca : public TSkeleton_application -{ - TPrint_mastrini_ca_mask* _mask; - -protected: - virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM - - void print_or_preview(const bool stampa); - virtual void print(); - virtual void preview(); - - virtual void main_loop(); -}; - -void TPrint_mastrini_ca::print() -{ - print_or_preview(true); -} - -void TPrint_mastrini_ca::preview() -{ - print_or_preview(false); -} - -void TPrint_mastrini_ca::print_or_preview(const bool stampa) -{ - //report e book dei report - TReport_book book; - TString path = _mask->get(F_REPORT); - if (path.empty()) - path = "ca3200a"; - TPrint_mastrini_ca_rep rep; - rep.load(path); - - TSheet_field& sheet = _mask->sfield(F_RIGHE); - TString video_string; //stringa che compare nella progind - if (sheet.empty()) //se non ci sono righe sullo sheet (selezione su tutte le cms/cdc)... - { - TToken_string& row = sheet.row(-1); //crea la prima riga dello sheet - - //stabilisce quale è il primo livello (tra CDC e CMS).. - const TMultilevel_code_info& liv1 = *ca_multilevel_code_info_by_index(0); - const int logic1 = liv1.logic(); - - TAssoc_array codici_buoni; - TString query; - query << "USE RMOVANA KEY 2\n"; - query << "FROM CODCONTO=#DACONTO\n"; - query << "TO CODCONTO=#ACONTO"; - TISAM_recordset rmovana(query); - TString80 daconto, aconto; - for (int i = 0; _mask->id2pos(F_CDC1_INI+i) > 0; i++) - { - daconto << _mask->get(F_CDC1_INI+i); - aconto << _mask->get(F_CDC1_FIN+i); - } - rmovana.set_var("#DACONTO", daconto); - rmovana.set_var("#ACONTO", aconto); - const long items = rmovana.items(); - if (items > 0) - { - TProgind po(items, "Analisi righe movimento analitiche...", true, true); - - for (bool ok = rmovana.move_first(); ok; ok = rmovana.move_next()) - { - if (!po.addstatus(1)) - break; - - const TString& codice = rmovana.get(logic1 == LF_COMMESSE ? RMOVANA_CODCMS : RMOVANA_CODCCOSTO).as_string(); - codici_buoni.add(codice); - } - } - - TISAM_recordset set(logic1 == LF_CDC ? "USE CDC" : "USE COMMESSE"); //..e di conseguenza scrive la use giusta - - bool skip_closed = false; - if (logic1 == LF_COMMESSE) - skip_closed = !yesno_box(TR("E' stata richiesta la stampa di tutte le commesse:\n" - "Si desidera includere anche le commesse chiuse?")); - - TProgind pi(set.items(), video_string, true, true); - for (bool sok = set.move_first(); sok; sok = set.move_next()) //fighissimo metodo per scandire un file in 1 riga! - { - if (!pi.addstatus(1)) - break; - - if (skip_closed && set.get(COMMESSE_CHIUSA).as_bool()) - continue; - - row = set.get(0u).as_string(); //prende il valore del primo campo del file (CDC o CMS code) - if (!codici_buoni.is_key(row)) - continue; - - //completa la stringa da visualizzare sulla progind - video_string.cut(0) << row << '\n' << set.get(1u); - pi.set_text(video_string); - - for (int l = liv1.levels()-2; l >= 0; l--) //se la struttura è a più livelli costruisce la tokenstring - row.insert("|", liv1.total_len(l)); - - rep.set_filter(*_mask, 0); //fa la set filter sulla prima riga (che è quella usata) - book.add(rep); - } - sheet.destroy(); //cancella le commesse aggiunte in automatico sullo sheet - } - else - { - FOR_EACH_SHEET_ROW(sheet, r, row) - { - rep.set_filter(*_mask, r); - book.add(rep); - } - } - - if (stampa) - book.print(); //stampa il book dei report - else - book.preview(); //anteprima - -} - - -void TPrint_mastrini_ca::main_loop() -{ - _mask = new TPrint_mastrini_ca_mask; - _mask->run(); - delete _mask; - _mask = NULL; -} - -int ca3200(int argc, char* argv[]) -{ - TPrint_mastrini_ca a; - a.run(argc, argv, TR("Stampa mastrini")); - return 0; +#include +#include +#include +#include +#include + +#include "../cg/cglib01.h" + +#include "commesse.h" +#include "pconana.h" +#include "movana.h" +#include "rmovana.h" + +#include "ca3.h" +#include "ca3200.h" +#include "calib01.h" +#include "calib02.h" +#include "camask.h" + +//////////////////////////////////////////////////////// +// MASCHERA +//////////////////////////////////////////////////////// +class TPrint_mastrini_ca_mask : public TAnal_report_mask +{ +protected: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); + const TString& get_report_class() const; + bool test_compatible_report(); + +public: + TPrint_mastrini_ca_mask(); + virtual ~TPrint_mastrini_ca_mask() {} +}; + +const TString& TPrint_mastrini_ca_mask::get_report_class() const +{ + TString& classe = get_tmp_string(); + classe = "ca3200a"; +// const int stp = get_int(F_TIPOCONTI); +// classe << (stp == 1 ? 'a' : 'b'); // tipo di report da usare in caso di report multipli + return classe; +} + +bool TPrint_mastrini_ca_mask::test_compatible_report() +{ + TFilename lib = get_report_class(); + const TString& name = get(F_REPORT); + bool ok = name.not_empty(); + if (ok) + { + TReport rep; + ok = rep.load(name); + if (ok) + { + const TString& classe = rep.get_class(); + ok = classe == lib; + } + } + if (!ok) + { + set(F_REPORT, lib); + lib.ext("rep"); + ok = lib.custom_path(); + } + return ok; +} + +bool TPrint_mastrini_ca_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_PRINT: + if (e == fe_button) + { + main_app().print(); + return false; + } + break; + case DLG_PREVIEW: + if (e == fe_button) + { + main_app().preview(); + return false; + } + break; + case F_TIPOCONTI: + if (e == fe_init || e == fe_modify) + { + test_compatible_report(); //in base al tipo di conti da stampare setta i report compatibili (solo nel caso di rep multipli) + } + break; + case F_REPORT: + if (e == fe_button) + { + const TString8 lib = get_report_class(); + TFilename path = o.get(); + if (select_custom_file(path, "rep", lib)) + { + path = path.name(); + path.ext(""); + o.set(path); + } + } else + if (e == fe_close) + { + if (!test_compatible_report()) + return error_box(TR("Impossibile trovare un report compatibile")); + } + break; + case F_ANNO: + if (e == fe_modify && !o.empty()) + { + TEsercizi_contabili esc; + TDate inies, fines; + if (esc.code2range(atoi(o.get()), inies, fines)) + { + set(F_DATAINI, inies); + set(F_DATAFIN, fines); + } + } + break; + case F_DATAINI: + case F_DATAFIN: + if (e == fe_close) + { + const int anno = get_int(F_ANNO); + if (anno > 0) //se viene selezionato un esercizio.. + { + TEsercizi_contabili esc; //..le date devono essere incluse nell'esercizio selezionato! + const TDate data = o.get(); + if (!data.empty() && esc.date2esc(data) != anno) + return error_box(TR("La data deve appartenere all'anno selezionato")); + } + else //se l'esercizio è vuoto le date diventano obbligatorie!! + { + if (o.empty()) + return error_box(TR("La data è obbligatoria in quanto manca l'esercizio")); + } + } + break; + default: break; + } + return true; +} + + +TPrint_mastrini_ca_mask::TPrint_mastrini_ca_mask() + : TAnal_report_mask("ca3200") +{ + TConfig& cfg = ca_config(); + const bool use_pdcc = cfg.get_bool("UsePdcc"); + + const int logicnum = use_pdcc ? LF_PCON : LF_PCONANA; + const int nfields = ca_create_fields(*this, 1, logicnum, 2, 4, F_CDC1_INI, F_DES1_INI, 0x0, "#DACONTO"); + ca_create_fields(*this, 1, logicnum, 2, 10, F_CDC1_FIN, F_DES1_FIN, 0x0, "#ACONTO"); + + for (int i = 0; i < nfields; i++) + { + TMask_field& daconto = field(F_CDC1_INI + i); + daconto.set_group(1); + daconto.check_type(CHECK_NORMAL); + TMask_field& aconto = field(F_CDC1_FIN + i); + aconto.set_group(2); + aconto.check_type(CHECK_NORMAL); + } + // creazione dei campi della seconda pagina della maschera + create_sheet(F_RIGHE); +} + + +/////////////////////////////////////////////////////////////// +// RECORDSET PRINCIPALE (caso standard: conti movimentati) +/////////////////////////////////////////////////////////////// + +class TPrint_mastrini_ca_recordset : public TISAM_recordset +{ +protected: + int _anno; + int _tipoconti; + int _tipimov; + TDate _dadata, _adata; + long _danumreg, _anumreg; + TString _daconto, _aconto, _codcosto, _codcms, _codfas; + +protected: //da libreria + virtual const TVariant& get(const char* column_name) const; + +protected: + static bool mov_filter(const TRelation* rel); + bool valid_record(const TRelation& rel) const; + virtual void set_custom_filter(TCursor& cur) const; + const TImporto& saldo_iniziale(const char* conto) const; + +public: + virtual void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); + TPrint_mastrini_ca_recordset(const TString& sql) : TISAM_recordset(sql) { } +}; + +static const TPrint_mastrini_ca_recordset* myself = NULL; + +//metodo per riconoscere se il record corrente soddisfa i filtri della maschera...strafighissimo! +bool TPrint_mastrini_ca_recordset::valid_record(const TRelation& rel) const +{ + //prima controlla la testata... + const TRectype& mov = rel.curr(LF_MOVANA); + + const char tipomov = mov.get_char(MOVANA_TIPOMOV); + int tipomov_int = 0; + switch (tipomov) + { + case 'P': tipomov_int = 2; break; + case 'V': tipomov_int = 4; break; + default : tipomov_int = 1; break; + } + if ((_tipimov & tipomov_int) == 0) + return false; + + //aggiunta 01/12/08; se non si specifica l'esercizio si DEVE tener conto della DATAREG e non della DATACOMP; quindi.. + //..deve effettuare tale controllo e controllare se la datareg rientra nell'intervallo di date selezionato sulla maschera + if (_anno <= 0) + { + const TDate datareg = mov.get_date(MOVANA_DATAREG); + if (_dadata.ok() && datareg < _dadata) + return false; + if (_adata.ok() && datareg > _adata) + return false; + } + else + { + const TDate datacomp = mov.get_date(MOVANA_DATACOMP); + if (_dadata.ok() && datacomp < _dadata) + return false; + if (_adata.ok() && datacomp > _adata) + return false; + + const TDate datafcomp = mov.get_date(MOVANA_DATAFCOMP); + if (datafcomp.ok() && _dadata.ok() && datafcomp < _dadata) + return false; + } + + //..poi le righe (devono comparire solo le righe con cdc/cms/fsc che appaiono nello sheet) + const TRectype& rmov = rel.curr(LF_RMOVANA); + + if (_codcosto.not_empty()) + { + const TString& cos = rmov.get(RMOVANA_CODCCOSTO); + if (cos != _codcosto) + return false; + } + if (_codcms.not_empty()) + { + const TString& cms = rmov.get(RMOVANA_CODCMS); + if (cms != _codcms) + return false; + } + if (_codfas.not_empty()) + { + const TString& fas = rmov.get(RMOVANA_CODFASE); + if (fas != _codfas) + return false; + } + + return true; +} + +bool TPrint_mastrini_ca_recordset::mov_filter(const TRelation* rel) +{ + return myself->valid_record(*rel); +} + +void TPrint_mastrini_ca_recordset::set_custom_filter(TCursor& cur) const +{ + //filtro sui conti selezionati sulla maschera + TRectype darec(cur.curr()), arec(cur.curr()); //record corrente (rmovana (solo movimentati)) + + if (_daconto.full()) + darec.put(RMOVANA_CODCONTO, _daconto); + + if (_aconto.full()) + arec.put(RMOVANA_CODCONTO, _aconto); + + cur.setregion(darec, arec); + + myself = this; + cur.set_filterfunction(mov_filter, true); //questa gestirà le date +} + +const TImporto& TPrint_mastrini_ca_recordset::saldo_iniziale(const char* conto) const +{ + TAnal_bill bill(conto, _codcosto, _codcms, _codfas); + const TSaldanal& saldo = ca_saldo(bill, _dadata, _adata, _tipimov); + return saldo._ini; +} + + +const TVariant& TPrint_mastrini_ca_recordset::get(const char* column_name) const +{ + if (strncmp(column_name, "SALDOINI:", 9) == 0) + { + const TString16 sub_field = column_name+9; + const TString& conto = get(RMOVANA_CODCONTO).as_string(); + const TImporto& saldo_ini = saldo_iniziale(conto); + + TVariant& var = get_tmp_var(); + if (sub_field == "DARE") + var = saldo_ini.sezione() == 'D' ? saldo_ini.valore() : ZERO; + else + var = saldo_ini.sezione() == 'A' ? saldo_ini.valore() : ZERO; + return var; + } + + if (strcmp(column_name, "#COSTO") == 0) + { + TVariant& var = get_tmp_var(); + var = _codcosto; + return var; + } + if (strcmp(column_name, "#COMMESSA") == 0) + { + TVariant& var = get_tmp_var(); + var = _codcms; + return var; + } + if (strcmp(column_name, "#FASE") == 0) + { + TVariant& var = get_tmp_var(); + var = _codfas; + return var; + } + return TISAM_recordset::get(column_name); +} + +//metodo per caricare i valori nel recordset dalla maschera...fighissimo!! +void TPrint_mastrini_ca_recordset::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) +{ + _daconto, _aconto, _codcosto = _codcms = _codfas = ""; + if (cms_row >= 0) + { + TSheet_field& sf = msk.sfield(F_RIGHE); + TMask& sm = sf.sheet_mask(); + sf.update_mask(cms_row); + TRelation rel(LF_RMOVANA); + sm.autosave(rel); + _codcosto = rel.curr().get(RMOVANA_CODCCOSTO); + _codcms = rel.curr().get(RMOVANA_CODCMS); + _codfas = rel.curr().get(RMOVANA_CODFASE); + } + + for (int i = 0; msk.id2pos(F_CDC1_INI+i) > 0; i++) + { + _daconto << msk.get(F_CDC1_INI+i); + _aconto << msk.get(F_CDC1_FIN+i); + } + + _anno = msk.get_int(F_ANNO); + _dadata = msk.get_date(F_DATAINI); + _adata = msk.get_date(F_DATAFIN); + + _tipimov = 0; + switch (msk.get(F_TIPIMOV)[0]) + { + case 'N': _tipimov = 1; break; + case 'P': _tipimov = 6; break; + default: _tipimov = 7; break; + } + _tipoconti = msk.get_int(F_TIPOCONTI); +} + + +///////////////////////////////////////////////////////////////////////////////// +// RECORDSET SECONDARIO (casi alternativi: conti con saldo != 0 e tutti i conti) +///////////////////////////////////////////////////////////////////////////////// + +class TPrint_mastrini_ca_alternative_recordset : public TPrint_mastrini_ca_recordset +{ + TIsamtempfile* _tmp_rmovana; +protected: + const TImporto& saldo_finale(const char* conto) const; + virtual void set_custom_filter(TCursor& cur) const; + +public: + virtual void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); + TPrint_mastrini_ca_alternative_recordset(const TString& sql); + ~TPrint_mastrini_ca_alternative_recordset() { delete _tmp_rmovana; } +}; + +TPrint_mastrini_ca_alternative_recordset::TPrint_mastrini_ca_alternative_recordset(const TString& sql) + : TPrint_mastrini_ca_recordset(sql) +{ + _tmp_rmovana = NULL; +} + + +const TImporto& TPrint_mastrini_ca_alternative_recordset::saldo_finale(const char* conto) const +{ + TAnal_bill bill(conto, _codcosto, _codcms, _codfas); + const TSaldanal& saldo = ca_saldo(bill, _dadata, _adata, _tipimov); + return saldo._fin; +} + +void TPrint_mastrini_ca_alternative_recordset::set_custom_filter(TCursor& cur) const +{ + //crea un file temporaneo che non viene distrutto ad inizio stampa effettiva + TIsamtempfile* tmp = new TIsamtempfile(LF_RMOVANA, "anal", false, false); + relation()->replace(tmp); //sostituisce il vero file rmovana con quello temporaneo +} + +void TPrint_mastrini_ca_alternative_recordset::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) +{ + //se esiste non vuoto il file temporano con tracciato rmovana lo cancella e lo ricrea vuoto + if (_tmp_rmovana != NULL) + delete _tmp_rmovana; + + _tmp_rmovana = new TIsamtempfile(LF_RMOVANA, "anal", true, true); + + //prende un po' di dati dalla maschera + _daconto, _aconto, _codcosto = _codcms = _codfas = ""; + if (cms_row >= 0) + { + TSheet_field& sf = msk.sfield(F_RIGHE); + TMask& sm = sf.sheet_mask(); + sf.update_mask(cms_row); + TRelation rel(LF_RMOVANA); + sm.autosave(rel); + _codcosto = rel.curr().get(RMOVANA_CODCCOSTO); + _codcms = rel.curr().get(RMOVANA_CODCMS); + _codfas = rel.curr().get(RMOVANA_CODFASE); + } + + for (int i = 0; msk.id2pos(F_CDC1_INI+i) > 0; i++) + { + _daconto << msk.get(F_CDC1_INI+i); + _aconto << msk.get(F_CDC1_FIN+i); + } + + _dadata = msk.get_date(F_DATAINI); + _adata = msk.get_date(F_DATAFIN); + // Riempie le date con valori sensati + if (!_dadata.ok() || !_adata.ok()) + { + TEsercizi_contabili esc; + const int codes = msk.get_int(F_ANNO); + if (esc.exist(codes)) + { + const TEsercizio& esercizio = esc[codes]; + if (!_dadata.ok()) + _dadata = esercizio.inizio(); + if (!_adata.ok()) + _adata = esercizio.fine(); + } + else + { + if (!_adata.ok()) + _adata = TDate(31, 12, 9999); + } + } + + _tipimov = 0; + switch (msk.get(F_TIPIMOV)[0]) + { + case 'N': _tipimov = 1; break; + case 'P': _tipimov = 6; break; + default: _tipimov = 7; break; + } + + _tipoconti = msk.get_int(F_TIPOCONTI); + + //scandisce il piano dei conti analitico creando un cursore con i conti nell'intervallo scelto sulla maschera + if (cms_row >= 0) + { + TPconana_recordset pconana; + + pconana.set_filter(' ', _daconto, _aconto, _codcosto, _codcms, _codfas, + _dadata, _adata, _tipimov, _tipoconti==1, _tipoconti==2); + + const long pconana_items = pconana.items(); + TProgind pi(pconana_items, TR("Scansione conti...")); + + TRelation rel_rmovana(LF_RMOVANA); + rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere i tipi mov. + + TRectype da_rmovana(LF_RMOVANA); + da_rmovana.put(RMOVANA_DATACOMP, _dadata); + TRectype a_rmovana(LF_RMOVANA); + a_rmovana.put(RMOVANA_DATACOMP, _adata); + + TString filtro; + if (_codcosto.not_empty()) + filtro << "(" << RMOVANA_CODCCOSTO << "?=\"" << _codcosto << "*\")"; + if (_codcms.not_empty()) + { + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(" << RMOVANA_CODCMS << "?=\"" << _codcms << "*\")"; + } + if (_codfas.not_empty()) + { + if (filtro.not_empty()) + filtro << "&&"; + filtro << "(" << RMOVANA_CODFASE << "?=\"" << _codfas << "*\")"; + } + + //scandisce il piano dei conti.. + for (bool pok = pconana.move_first(); pok; pok = pconana.move_next()) + { + if (!pi.addstatus(1)) + break; + const TString& conto = pconana.get(PCONANA_CODCONTO).as_string(); + + //..crea un cursore su rmovana per vedere se i conti selezionati hanno veri movimenti che soddisfano + //i parametri del filtro sulla maschera + da_rmovana.put(RMOVANA_CODCONTO, conto); + a_rmovana.put(RMOVANA_CODCONTO, conto); + + TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana); + const long rmovana_items = cur_rmovana.items(); + bool almeno_uno_aggiunto = false; + if (rmovana_items > 0) + { + cur_rmovana.freeze(); + for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana) + { + //deve coincidere anche il tipomov! sarebbe stato troppo semplice... + const char tipomov = rel_rmovana.curr(LF_MOVANA).get_char(MOVANA_TIPOMOV); + int tipomov_int = 0; + switch (tipomov) + { + case 'P': tipomov_int = 2; break; + case 'V': tipomov_int = 4; break; + default: tipomov_int = 1; break; + } + if ((_tipimov & tipomov_int) != 0) + { + _tmp_rmovana->write(cur_rmovana.curr()); // aggiunge i record al file temporaneo + almeno_uno_aggiunto = true; + } + } + cur_rmovana.freeze(false); + } + //se non ha aggiunto nemmeno un record valido.. + //crea un record di rmovana con il solo conto,datacomp e lo aggiunge al file temporaneo + if (!almeno_uno_aggiunto) + { + TRectype fake_rmovana_rec(LF_RMOVANA); + fake_rmovana_rec.put(RMOVANA_CODCONTO, conto); + fake_rmovana_rec.put(RMOVANA_DATACOMP, _dadata); + _tmp_rmovana->write(fake_rmovana_rec); + } + + } //end for su pconana_items + } +} + +//////////////////////////////////////////////////////// +// REPORT +//////////////////////////////////////////////////////// +class TPrint_mastrini_ca_rep : public TAnal_report +{ +protected: + virtual bool set_recordset(const TString& sql); + +public: + void set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row); +}; + +bool TPrint_mastrini_ca_rep::set_recordset(const TString& sql) +{ + TPrint_mastrini_ca_recordset* rs = new TPrint_mastrini_ca_recordset(sql); + return TReport::set_recordset(rs); +} + +void TPrint_mastrini_ca_rep::set_filter(const TPrint_mastrini_ca_mask& msk, int cms_row) +{ + TReport::set_recordset(NULL); //forza azzeramento file anal.dbf prima di ricostruirlo + + const int tipoconti = msk.get_int(F_TIPOCONTI); + + TPrint_mastrini_ca_recordset* recset = NULL; + + const char* const query ="USE RMOVANA KEY 2\nJOIN MOVANA INTO NUMREG==NUMREG\nJOIN MOV TO MOVANA INTO NUMREG==NUMREGCG"; + switch (tipoconti) + { + case 1: + recset = new TPrint_mastrini_ca_recordset(query); + break; + default: + recset = new TPrint_mastrini_ca_alternative_recordset(query); + break; + } + recset->set_filter(msk, cms_row); + TAnal_report::set_recordset(recset); +} + +//////////////////////////////////////////////////////// +// APPLICAZIONE +//////////////////////////////////////////////////////// +class TPrint_mastrini_ca : public TSkeleton_application +{ + TPrint_mastrini_ca_mask* _mask; + +protected: + virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM + + void print_or_preview(const bool stampa); + virtual void print(); + virtual void preview(); + + virtual void main_loop(); +}; + +void TPrint_mastrini_ca::print() +{ + print_or_preview(true); +} + +void TPrint_mastrini_ca::preview() +{ + print_or_preview(false); +} + +void TPrint_mastrini_ca::print_or_preview(const bool stampa) +{ + //report e book dei report + TReport_book book; + TString path = _mask->get(F_REPORT); + if (path.empty()) + path = "ca3200a"; + TPrint_mastrini_ca_rep rep; + rep.load(path); + + TSheet_field& sheet = _mask->sfield(F_RIGHE); + TString video_string; //stringa che compare nella progind + if (sheet.empty()) //se non ci sono righe sullo sheet (selezione su tutte le cms/cdc)... + { + if (_mask->get_bool(F_PERCONTO)) + { + rep.set_filter(*_mask, -1); //fa la set filter sulla prima riga (che è quella usata) + book.add(rep); + } + else + { + TToken_string& row = sheet.row(-1); //crea la prima riga dello sheet + + //stabilisce quale è il primo livello (tra CDC e CMS).. + const TMultilevel_code_info& liv1 = *ca_multilevel_code_info_by_index(0); + const int logic1 = liv1.logic(); + + TAssoc_array codici_buoni; + TString query; + query << "USE RMOVANA KEY 2\n"; + query << "FROM CODCONTO=#DACONTO\n"; + query << "TO CODCONTO=#ACONTO"; + TISAM_recordset rmovana(query); + TString80 daconto, aconto; + for (int i = 0; _mask->id2pos(F_CDC1_INI+i) > 0; i++) + { + daconto << _mask->get(F_CDC1_INI+i); + aconto << _mask->get(F_CDC1_FIN+i); + } + rmovana.set_var("#DACONTO", daconto); + rmovana.set_var("#ACONTO", aconto); + const long items = rmovana.items(); + if (items > 0) + { + TProgind po(items, "Analisi righe movimento analitiche...", true, true); + + for (bool ok = rmovana.move_first(); ok; ok = rmovana.move_next()) + { + if (!po.addstatus(1)) + break; + + const TString& codice = rmovana.get(logic1 == LF_COMMESSE ? RMOVANA_CODCMS : RMOVANA_CODCCOSTO).as_string(); + codici_buoni.add(codice); + } + } + + TISAM_recordset set(logic1 == LF_CDC ? "USE CDC" : "USE COMMESSE"); //..e di conseguenza scrive la use giusta + + bool skip_closed = false; + if (logic1 == LF_COMMESSE) + skip_closed = !yesno_box(TR("E' stata richiesta la stampa di tutte le commesse:\n" + "Si desidera includere anche le commesse chiuse?")); + + TProgind pi(set.items(), video_string, true, true); + for (bool sok = set.move_first(); sok; sok = set.move_next()) //fighissimo metodo per scandire un file in 1 riga! + { + if (!pi.addstatus(1)) + break; + + if (skip_closed && set.get(COMMESSE_CHIUSA).as_bool()) + continue; + + row = set.get(0u).as_string(); //prende il valore del primo campo del file (CDC o CMS code) + if (!codici_buoni.is_key(row)) + continue; + + //completa la stringa da visualizzare sulla progind + video_string.cut(0) << row << '\n' << set.get(1u); + pi.set_text(video_string); + + for (int l = liv1.levels()-2; l >= 0; l--) //se la struttura è a più livelli costruisce la tokenstring + row.insert("|", liv1.total_len(l)); + + rep.set_filter(*_mask, 0); //fa la set filter sulla prima riga (che è quella usata) + book.add(rep); + } + sheet.destroy(); //cancella le commesse aggiunte in automatico sullo sheet + } + } + else + { + FOR_EACH_SHEET_ROW(sheet, r, row) + { + rep.set_filter(*_mask, r); + book.add(rep); + } + } + + if (stampa) + book.print(); //stampa il book dei report + else + book.preview(); //anteprima + +} + + +void TPrint_mastrini_ca::main_loop() +{ + _mask = new TPrint_mastrini_ca_mask; + _mask->run(); + delete _mask; + _mask = NULL; +} + +int ca3200(int argc, char* argv[]) +{ + TPrint_mastrini_ca a; + a.run(argc, argv, TR("Stampa mastrini")); + return 0; } \ No newline at end of file diff --git a/src/ca/ca3200.h b/src/ca/ca3200.h index b546c677d..d6c80aa78 100755 --- a/src/ca/ca3200.h +++ b/src/ca/ca3200.h @@ -1,44 +1,45 @@ -#ifndef __CA3200_H -#define __CA3200_H - -//pag. stampa mastrini -#define F_CODDITTA 201 -#define F_RAGSOC 202 -#define F_DATASTAMPA 203 -#define F_ANNO 204 -#define F_REPORT 205 - -//campi generati dal pdc -#define F_CDC1_INI 206 -#define F_CDC4_INI 209 -#define F_CDC1_FIN 216 -#define F_CDC4_FIN 219 -#define F_DES1_INI 226 -#define F_DES4_INI 229 -#define F_DES1_FIN 236 -#define F_DES4_FIN 239 - -//campi sulla maschera -#define F_DATAINI 250 -#define F_DATAFIN 251 -#define F_TIPOCONTI 252 -#define F_TIPIMOV 253 - -//sheet di pagina 2 -#define F_RIGHE 260 - -#define S_CDC1 101 -#define S_CDC2 102 -#define S_CDC3 103 -#define S_CDC4 104 -#define S_CDC5 105 -#define S_CDC6 106 -#define S_CDC7 107 -#define S_CDC8 108 -#define S_CDC9 109 -#define S_CDC10 110 -#define S_CDC11 111 -#define S_CDC12 112 - -#endif // __CA3200_H - +#ifndef __CA3200_H +#define __CA3200_H + +//pag. stampa mastrini +#define F_CODDITTA 201 +#define F_RAGSOC 202 +#define F_DATASTAMPA 203 +#define F_ANNO 204 +#define F_REPORT 205 + +//campi generati dal pdc +#define F_CDC1_INI 206 +#define F_CDC4_INI 209 +#define F_CDC1_FIN 216 +#define F_CDC4_FIN 219 +#define F_DES1_INI 226 +#define F_DES4_INI 229 +#define F_DES1_FIN 236 +#define F_DES4_FIN 239 + +//campi sulla maschera +#define F_DATAINI 250 +#define F_DATAFIN 251 +#define F_TIPOCONTI 252 +#define F_TIPIMOV 253 +#define F_PERCONTO 254 + +//sheet di pagina 2 +#define F_RIGHE 260 + +#define S_CDC1 101 +#define S_CDC2 102 +#define S_CDC3 103 +#define S_CDC4 104 +#define S_CDC5 105 +#define S_CDC6 106 +#define S_CDC7 107 +#define S_CDC8 108 +#define S_CDC9 109 +#define S_CDC10 110 +#define S_CDC11 111 +#define S_CDC12 112 + +#endif // __CA3200_H + diff --git a/src/ca/ca3200.uml b/src/ca/ca3200.uml index 68a838731..a8e006e90 100755 --- a/src/ca/ca3200.uml +++ b/src/ca/ca3200.uml @@ -1,263 +1,268 @@ -#include "ca3200.h" -#include "camask.h" - -TOOLBAR "topbar" 0 0 0 2 -#include -ENDPAGE - -TOOLBAR "bottombar" 0 -2 0 1 - -STRING F_REPORT 256 66 -BEGIN - PROMPT 1 -2 "Report " - FLAGS "B" - CHECKTYPE REQUIRED -END - -STRING DLG_PROFILE 50 -BEGIN - PROMPT 1 -1 "Profilo " - PSELECT -END - -ENDPAGE - -PAGE "Selezioni" 0 0 0 2 - -GROUPBOX DLG_NULL 78 3 -BEGIN - PROMPT 1 0 "@bDitta" -END - -NUMBER F_CODDITTA 5 -BEGIN - PROMPT 2 1 "Ditta " - FLAGS "FRD" - USE LF_NDITTE KEY 1 - CHECKTYPE REQUIRED - INPUT CODDITTA F_CODDITTA - DISPLAY "Codice" CODDITTA - DISPLAY "Ragione sociale @50" RAGSOC - OUTPUT F_CODDITTA CODDITTA - OUTPUT F_RAGSOC RAGSOC -END - -STRING F_RAGSOC 50 -BEGIN - PROMPT 19 1 "" - FLAGS "D" -END - -DATE F_DATASTAMPA -BEGIN - PROMPT 2 3 "Data di stampa " - FLAGS "A" -END - -NUMBER F_ANNO 4 -BEGIN - PROMPT 52 3 "Esercizio " - USE ESC - INPUT CODTAB F_ANNO - DISPLAY "Codice Esercizio" CODTAB - DISPLAY "Data inizio esercizio" D0 - DISPLAY "Data fine esercizio " D1 - OUTPUT F_ANNO CODTAB - CHECKTYPE NORMAL - CHECKTYPE NORMAL - FLAGS "RZ" - ADD NONE -END - -GROUPBOX DLG_NULL 78 6 -BEGIN - PROMPT 1 5 "@bOpzioni stampa" -END - -TEXT 96 -BEGIN - PROMPT 2 6 "Dalla data competenza " -END - -TEXT 97 -BEGIN - PROMPT 40 6 "Alla data competenza " -END - -DATE F_DATAINI -BEGIN - PROMPT 26 6 "" -END - -DATE F_DATAFIN -BEGIN - PROMPT 62 6 "" -END - -LIST F_TIPOCONTI 24 -BEGIN - PROMPT 2 8 "Selezione conti " - ITEM "1|Movimentati nel periodo" - ITEM "2|Con saldo diverso da 0" - ITEM "3|Tutti" -END - -LIST F_TIPIMOV 24 -BEGIN - PROMPT 2 9 "Selezione movimenti " - ITEM " |Qualsiasi" - ITEM "N|Normale" - ITEM "P|Preventivo e variazione" -END - -SPREADSHEET F_RIGHE -1 -1 -BEGIN - PROMPT 0 11 "" - ITEM "Cdc1" - ITEM "Cdc2" - ITEM "Cdc3" - ITEM "Cdc4" - ITEM "Cdc5" - ITEM "Cdc6" - ITEM "Cdc7" - ITEM "Cdc8" - ITEM "Cdc9" - ITEM "Cdc10" - ITEM "Cdc11" - ITEM "Cdc12" -END - -ENDPAGE - -PAGE "Conti" -1 -1 78 20 - -GROUPBOX DLG_NULL 76 6 -BEGIN - PROMPT 1 3 "@bDa:" -END - -GROUPBOX DLG_NULL 76 6 -BEGIN - PROMPT 1 9 "@bA:" -END - -ENDPAGE - -ENDMASK - -PAGE "Riga" -1 -1 78 19 - -STRING S_CDC1 20 -BEGIN - PROMPT 1 2 "Cdc1" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC2 20 -BEGIN - PROMPT 21 2 "Cdc2" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC3 20 -BEGIN - PROMPT 41 2 "Cdc3" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC4 20 -BEGIN - PROMPT 61 2 "Cdc4" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC5 20 -BEGIN - PROMPT 1 3 "Cdc5" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC6 20 -BEGIN - PROMPT 21 3 "Cdc6" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC7 20 -BEGIN - PROMPT 41 3 "Cdc7" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC8 20 -BEGIN - PROMPT 61 3 "Cdc8" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC9 20 -BEGIN - PROMPT 1 4 "Cdc9" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC10 20 -BEGIN - PROMPT 21 4 "Cdc10" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC11 20 -BEGIN - PROMPT 41 4 "Cdc11" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -STRING S_CDC12 20 -BEGIN - PROMPT 61 4 "Cdc12" - FLAGS "B" - CHECKTYPE NORMAL - GROUP 1 -END - -BUTTON DLG_OK 10 2 -BEGIN - PROMPT -13 -1 "" -END - -BUTTON DLG_DELREC 10 2 -BEGIN - PROMPT -23 -1 "" -END - -BUTTON DLG_CANCEL 10 2 -BEGIN - PROMPT -33 -1 "" -END - -ENDPAGE - -ENDMASK +#include "ca3200.h" +#include "camask.h" + +TOOLBAR "topbar" 0 0 0 2 +#include +ENDPAGE + +TOOLBAR "bottombar" 0 -2 0 1 + +STRING F_REPORT 256 66 +BEGIN + PROMPT 1 -2 "Report " + FLAGS "B" + CHECKTYPE REQUIRED +END + +STRING DLG_PROFILE 50 +BEGIN + PROMPT 1 -1 "Profilo " + PSELECT +END + +ENDPAGE + +PAGE "Selezioni" 0 0 0 2 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 0 "@bDitta" +END + +NUMBER F_CODDITTA 5 +BEGIN + PROMPT 2 1 "Ditta " + FLAGS "FRD" + USE LF_NDITTE KEY 1 + CHECKTYPE REQUIRED + INPUT CODDITTA F_CODDITTA + DISPLAY "Codice" CODDITTA + DISPLAY "Ragione sociale @50" RAGSOC + OUTPUT F_CODDITTA CODDITTA + OUTPUT F_RAGSOC RAGSOC +END + +STRING F_RAGSOC 50 +BEGIN + PROMPT 19 1 "" + FLAGS "D" +END + +DATE F_DATASTAMPA +BEGIN + PROMPT 2 3 "Data di stampa " + FLAGS "A" +END + +NUMBER F_ANNO 4 +BEGIN + PROMPT 52 3 "Esercizio " + USE ESC + INPUT CODTAB F_ANNO + DISPLAY "Codice Esercizio" CODTAB + DISPLAY "Data inizio esercizio" D0 + DISPLAY "Data fine esercizio " D1 + OUTPUT F_ANNO CODTAB + CHECKTYPE NORMAL + CHECKTYPE NORMAL + FLAGS "RZ" + ADD NONE +END + +GROUPBOX DLG_NULL 78 7 +BEGIN + PROMPT 1 5 "@bOpzioni stampa" +END + +TEXT 96 +BEGIN + PROMPT 2 6 "Dalla data competenza " +END + +TEXT 97 +BEGIN + PROMPT 40 6 "Alla data competenza " +END + +DATE F_DATAINI +BEGIN + PROMPT 26 6 "" +END + +DATE F_DATAFIN +BEGIN + PROMPT 62 6 "" +END + +LIST F_TIPOCONTI 24 +BEGIN + PROMPT 2 8 "Selezione conti " + ITEM "1|Movimentati nel periodo" + ITEM "2|Con saldo diverso da 0" + ITEM "3|Tutti" +END + +LIST F_TIPIMOV 24 +BEGIN + PROMPT 2 9 "Selezione movimenti " + ITEM " |Qualsiasi" + ITEM "N|Normale" + ITEM "P|Preventivo e variazione" +END + +BOOLEAN F_PERCONTO +BEGIN + PROMPT 2 10 "Non suddivisi per Commessa/CDC " +END + +SPREADSHEET F_RIGHE -1 -1 +BEGIN + PROMPT 0 12 "" + ITEM "Cdc1" + ITEM "Cdc2" + ITEM "Cdc3" + ITEM "Cdc4" + ITEM "Cdc5" + ITEM "Cdc6" + ITEM "Cdc7" + ITEM "Cdc8" + ITEM "Cdc9" + ITEM "Cdc10" + ITEM "Cdc11" + ITEM "Cdc12" +END + +ENDPAGE + +PAGE "Conti" -1 -1 78 20 + +GROUPBOX DLG_NULL 76 6 +BEGIN + PROMPT 1 3 "@bDa:" +END + +GROUPBOX DLG_NULL 76 6 +BEGIN + PROMPT 1 9 "@bA:" +END + +ENDPAGE + +ENDMASK + +PAGE "Riga" -1 -1 78 19 + +STRING S_CDC1 20 +BEGIN + PROMPT 1 2 "Cdc1" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC2 20 +BEGIN + PROMPT 21 2 "Cdc2" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC3 20 +BEGIN + PROMPT 41 2 "Cdc3" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC4 20 +BEGIN + PROMPT 61 2 "Cdc4" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC5 20 +BEGIN + PROMPT 1 3 "Cdc5" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC6 20 +BEGIN + PROMPT 21 3 "Cdc6" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC7 20 +BEGIN + PROMPT 41 3 "Cdc7" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC8 20 +BEGIN + PROMPT 61 3 "Cdc8" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC9 20 +BEGIN + PROMPT 1 4 "Cdc9" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC10 20 +BEGIN + PROMPT 21 4 "Cdc10" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC11 20 +BEGIN + PROMPT 41 4 "Cdc11" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +STRING S_CDC12 20 +BEGIN + PROMPT 61 4 "Cdc12" + FLAGS "B" + CHECKTYPE NORMAL + GROUP 1 +END + +BUTTON DLG_OK 10 2 +BEGIN + PROMPT -13 -1 "" +END + +BUTTON DLG_DELREC 10 2 +BEGIN + PROMPT -23 -1 "" +END + +BUTTON DLG_CANCEL 10 2 +BEGIN + PROMPT -33 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/src/ca/ca3200b.rep b/src/ca/ca3200b.rep new file mode 100644 index 000000000..59bf84e55 --- /dev/null +++ b/src/ca/ca3200b.rep @@ -0,0 +1,286 @@ + + + Mastrini CA per conto + +
+ +
+
+ + MESSAGE RESET,F1.101 +MESSAGE RESET,F1.102 + + + + + + #SYSTEM.RAGSOC + + + + #SYSTEM.DATE + + + + + #COSTO + CA_FORMAT_COSTO + + + + MESSAGE ISAMREAD,CDC,CODCOSTO=RMOVANA.CODCCOSTO,DESCRIZ + + + + + #COMMESSA + CA_FORMAT_COMMESSA + + + + MESSAGE ISAMREAD,COMMESSE,CODCMS=RMOVANA.CODCMS,DESCRIZ + + + + + #FASE + CA_FORMAT_FASE + + + + MESSAGE ISAMREAD,FASI,CODFASE=RMOVANA.CODFASE,DESCRIZ + + +
+
+ CODCONTO + + MESSAGE RESET,F2.101 +MESSAGE RESET,F2.102 +MESSAGE RESET,F2.201 +MESSAGE RESET,F2.202 + + + + + + + CODCONTO + CA_FORMAT_CONTO + + + + CODCONTO + CA_FORMAT_CONTO_DESCR + + + + + + + + + + + + + + + + SALDOINI:DARE + MESSAGE COPY,B1.103 + + + + SALDOINI:AVERE + #THIS @ +DUP +0 E; IF + -1 * + "B1.103" +! +ELSE + DROP +THEN + +
+
+ DATACOMP + MESSAGE RESET,F3.103 +
+
+
+ NUMREG != 0 + + + DATACOMP + MESSAGE COPY,F3.131 + + + NUMREG + + + + NUMRIG + + + + DESCR + + + MOVANA.NUMREGCG + + + MOVANA.DATADOC + + + MOVANA.NUMDOC + + + MOVANA.CODCAUS + + + + MESSAGE ISAMREAD,CAUS,CODCAUS=MOVANA.CODCAUS,DESCR + + + IMPORTO + "RMOVANA.SEZIONE" @ +"A" = +IF +0 #THIS ! +ELSE +#THIS @ +"B1.103" ++! +THEN + + + MESSAGE ADD,F2.101 + + + + IMPORTO + "RMOVANA.SEZIONE" @ +"D" = +IF +0 #THIS ! +ELSE +#THIS @ +-1 * +"B1.103" ++! +THEN + + MESSAGE ADD,F2.102 + + + + MESSAGE COPY,F3.103 + + + MOV.TIPO + + + MOV.CODCF + + + + MESSAGE ISAMREAD,CLIFO,TIPOCF=#104!CODCF=#105,RAGSOC + +
+
+ + + + + #REPORT.PAGE + +
+
+ + + + + + + + + + + + + #101-#102 + +
+
+ + + + + + + + + + MESSAGE ADD,F1.101 + + + + MESSAGE ADD,F1.102 + + + + #101+#H2.201 + + + + #102+#H2.202 + + + + #201-#202 + +
+
+ #103 != 0 + + + + + + + + + + +
+ USE RMOVANA KEY 2 +JOIN MOVANA INTO NUMREG==NUMREG +JOIN MOV TO MOVANA INTO NUMREG==NUMREGCG + : SCAMBIA_CAMPI ( F1 F2 -- ) + VARIABLE _X1 \ coordinate del campo F1 + VARIABLE _Y1 + VARIABLE _X2 \ coordinate del campo F2 + VARIABLE _Y2 + + 2DUP \ duplica i campi F1 F2 sullo stack + GET_POS \ prende le coordinate del campo F2 + _Y2 ! \ e le mette in _Y2 e _X2 + _X2 ! + GET_POS \ prende le coordinate del campo F1 + _Y1 ! \ e le mette in _Y1 e _X1 + _X1 ! + + _X1 @ \ legge le coordinate di F1 + _Y1 @ + ROT + SET_POS \ mette le coord in F2 + + _X2 @ + _Y2 @ + ROT + SET_POS +; + + + \ No newline at end of file diff --git a/src/ca/ca3300.cpp b/src/ca/ca3300.cpp index 4e78668e7..7c72f1914 100755 --- a/src/ca/ca3300.cpp +++ b/src/ca/ca3300.cpp @@ -6,9 +6,11 @@ #include "cdc.h" #include "commesse.h" +#include "fasi.h" #include "movana.h" -#include "pconana.h" #include "rmovana.h" +#include "pconana.h" +#include "saldana.h" #include "../cg/cglib01.h" #include "ca3.h" @@ -30,6 +32,7 @@ protected: public: TPrint_bilancio_ca_mask(); + virtual ~TPrint_bilancio_ca_mask() {} }; const TString& TPrint_bilancio_ca_mask::get_report_class() const @@ -411,6 +414,7 @@ class TRecordset_sezioni_contrapposte : public TRecordset { char _tipo_piano; TAnal_bill _filter; + TArray _cdc_cms_fas; TDate _da_data, _a_data; word _tipimov; bool _movimentati, _nonnulli; @@ -539,26 +543,176 @@ void TRecordset_sezioni_contrapposte::add_conto(int indbil, const TString& b) TAnal_bill bill(_filter); bill.set_conto(b); - if ((_tipimov & _saldanal_qualsiasi) == _saldanal_qualsiasi) // Bilancio a sezioni contrapposte di raffronto + TString query; + TString select; + + query = "USE "; query << LF_SALDANA << " KEY 2\n"; + + if (_filter.costo().full() || _filter.commessa().full() || _filter.fase().full()) { - const TSaldanal& sp = ca_saldo(bill, _da_data, _a_data, _saldanal_preventivi); - const TSaldanal& sc = ca_saldo(bill, _da_data, _a_data, _saldanal_consuntivo); - if (!sp._fin.is_zero() || !sc._fin.is_zero()) + TString select; + + if (_filter.costo().full()) { - TArray& a = conti(indbil); - TImporto s = sp._fin; s -= sc._fin; s.normalize(); - add_conto(b, s, sp._fin, sc._fin, a); + int len = _filter.costo().len(); + const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_CDC); + const int max = mci.levels(); + + for (int i = 0; i < max; i++) + if (len <= mci.total_len(i)) + { + len = mci.total_len(i); + break; + } + select << "(TRIM(" << SALDANA_COSTO << "[1," << len << "])==\"" << _filter.costo() << "\") "; } + if (_filter.commessa().full()) + { + int len = _filter.commessa().len(); + const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_COMMESSE); + const int max = mci.levels(); + + for (int i = 0; i < max; i++) + if (len <= mci.total_len(i)) + { + len = mci.total_len(i); + break; + } + select << (select.full() ? "&&" : "") << "(TRIM(" << SALDANA_COMMESSA << "[1," << len << "])==\"" << _filter.commessa() << "\") "; + } + if (_filter.fase().full()) + { + int len = _filter.fase().len(); + int start = 0; + int offset = 0; + const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_FASI); + const int max = mci.levels(); + + if (mci.parent() != 0) + { + const TMultilevel_code_info& parinfo = ca_multilevel_code_info(mci.parent()); + + start = parinfo.levels(); + offset = parinfo.total_len(parinfo.levels() -1); + } + for (int i = start; i < max; i++) + { + if (len <= mci.total_len(i) - offset) + { + len = mci.total_len(i) - offset; + break; + } + } + select << (select.full() ? "&&" : "") << "(TRIM(" << SALDANA_FASE << "[1," << len << "])==\"" << _filter.fase() << "\") "; + } + if (select.full()) + query << "SELECT " << select; + query << "\nFROM " << SALDANA_CONTO << "='" << b << "' "; + if (_da_data.ok()) + query << SALDANA_ANNO << "='" << _da_data.year() << "'"; + query << "\nTO " << SALDANA_CONTO << "='" << b << "' "; + if (_a_data.ok()) + query << SALDANA_ANNO << "='" << _a_data.year() << "'"; + query << "\n"; + + TISAM_recordset sal(query); + TAssoc_array codes; + TToken_string code; + + for (bool ok = sal.move_first(); ok; ok =sal.move_next()) + { + code.cut(0); + code.add(sal.get(SALDANA_COSTO).as_string()); + code.add(sal.get(SALDANA_COMMESSA).as_string()); + code.add(sal.get(SALDANA_FASE).as_string()); + + if (codes.objptr(code) == NULL) + codes.add(code, code); + } + if ((_tipimov & _saldanal_qualsiasi) == _saldanal_qualsiasi) // Bilancio a sezioni contrapposte di raffronto + { + TSaldanal sp; + TSaldanal sc; + + FOR_EACH_ASSOC_OBJECT(codes, obj, key, item) + { + TToken_string code(key); + TString c(code.get()); + + bill.set_costo(c.blank() ? "~" : c); + c = code.get(); + bill.set_commessa(c.blank() ? "~" : c); + c = code.get(); + bill.set_fase(c.blank() ? "~" : c); + + + const TSaldanal& wsp = ca_saldo(bill, _da_data, _a_data, _saldanal_preventivi); + const TSaldanal& wsc = ca_saldo(bill, _da_data, _a_data, _saldanal_consuntivo); + + sp += wsp; + sc += wsc; + } + if (!sp._fin.is_zero() || !sc._fin.is_zero()) + { + TArray& a = conti(indbil); + TImporto s = sp._fin; s -= sc._fin; s.normalize(); + + add_conto(b, s, sp._fin, sc._fin, a); + } + } + else + { + TSaldanal sa; + + FOR_EACH_ASSOC_OBJECT(codes, obj, key, item) + { + TToken_string code(key); + TString c(code.get()); + + bill.set_costo(c.blank() ? "~" : c); + c = code.get(); + bill.set_commessa(c.blank() ? "~" : c); + c = code.get(); + bill.set_fase(c.blank() ? "~" : c); + + const TSaldanal& wsa = ca_saldo(bill, _da_data, _a_data, _tipimov); + + sa += wsa; + } + if (!sa._fin.is_zero()) + { + const TImporto zero; + TArray& a = conti(indbil); + add_conto(b, sa._fin, zero, zero, a); + } + } } else { - const TSaldanal& sa = ca_saldo(bill, _da_data, _a_data, _tipimov); - if (!sa._fin.is_zero()) + if ((_tipimov & _saldanal_qualsiasi) == _saldanal_qualsiasi) // Bilancio a sezioni contrapposte di raffronto { - const TImporto zero; - TArray& a = conti(indbil); - add_conto(b, sa._fin, zero, zero, a); - } + const TSaldanal sp = ca_saldo(bill, _da_data, _a_data, _saldanal_preventivi); + const TSaldanal sc = ca_saldo(bill, _da_data, _a_data, _saldanal_consuntivo); + + if (!sp._fin.is_zero() || !sc._fin.is_zero()) + { + TArray& a = conti(indbil); + TImporto s = sp._fin; s -= sc._fin; s.normalize(); + + add_conto(b, s, sp._fin, sc._fin, a); + } + } + else + { + const TSaldanal sa = ca_saldo(bill, _da_data, _a_data, _tipimov); + + if (!sa._fin.is_zero()) + { + const TImporto zero; + TArray& a = conti(indbil); + add_conto(b, sa._fin, zero, zero, a); + } + } } } } @@ -968,7 +1122,7 @@ class TPrint_bilancio_ca : public TSkeleton_application TPrint_bilancio_ca_mask* _mask; protected: - virtual const char * extra_modules() const { return "cm"; } // funziona anche con autorizzazione CM + virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM bool commessa_buona(const TRectype& cms, const TDate& dadata, const TDate& adata) const; bool buon_cdc(const TRectype& cdc, const TDate& dadata, const TDate& adata) const; @@ -1055,9 +1209,12 @@ bool TPrint_bilancio_ca::commessa_buona(const TRectype& cms, const TDate& dadata TString query; query = "USE RMOVANA KEY 4\nBY CODCMS DATACOMP\n"; - query << "FROM CODCMS=#CMS\nTO CODCMS=#CMS"; + query << "FROM CODCMS=#CMS\nTO CODCMS=#CMS1"; TISAM_recordset rmovana(query); - rmovana.set_var("#CMS", cms.get(COMMESSE_CODCMS)); + TString codcms(cms.get(COMMESSE_CODCMS)); + rmovana.set_var("#CMS", codcms); + codcms << "ZZZ"; + rmovana.set_var("#CMS1", codcms); if (!rmovana.move_first()) return false; // Ignora commesse non movimentate diff --git a/src/ca/ca3300.uml b/src/ca/ca3300.uml index 454232a7a..321e51c4d 100755 --- a/src/ca/ca3300.uml +++ b/src/ca/ca3300.uml @@ -21,7 +21,7 @@ END ENDPAGE -PAGE "Stampa bilancio" 0 2 0 0 +PAGE "Stampa bilancio" 0 0 0 2 GROUPBOX DLG_NULL 78 3 BEGIN diff --git a/src/ca/ca3700.cpp b/src/ca/ca3700.cpp index 2e7128ae2..059dd1009 100755 --- a/src/ca/ca3700.cpp +++ b/src/ca/ca3700.cpp @@ -4,11 +4,15 @@ #include #include #include +#include +#include #include #include +#include #include "../cg/cg2103.h" #include "../cg/cglib01.h" #include "../ve/velib04.h" +#include "..\cg\cgsaldac.h" #include "cdc.h" #include "commesse.h" @@ -23,6 +27,26 @@ #include "calib01.h" #include "calib02.h" +#define REND_CODCMS "CODCMS" +#define REND_CODCOSTO "CODCOSTO" +#define REND_CODFASE "CODFASE" +#define REND_CODCONTO "CODCONTO" +#define REND_IMPEGNATO "IMPEGNATO" +#define REND_FATTURATO "FATTURATO" +#define REND_MATURATO "MATURATO" +#define REND_PAGATO "PAGATO" +#define REND_ORDCONT "ORDCONT" +#define REND_CONTO "CONTO" + +#define RIEP_CODCMS "CODCMS" +#define RIEP_CODCOSTO "CODCOSTO" +#define RIEP_CODFASE "CODFASE" +#define RIEP_CODCONTO "CODCONTO" +#define RIEP_DATA "DATA" +#define RIEP_ORDCONT "ORDCONT" +#define RIEP_DESCONTO "DESCONTO" +#define RIEP_BUDGET "BUDGET" + //////////////////////////////////////////////////////// // MASCHERA //////////////////////////////////////////////////////// @@ -333,6 +357,7 @@ class TPrint_rendiconto_ca_recordset : public TISAM_recordset TString_array _num_fdr; TString_array _num_par; TRiclass _ricl; + TDate _pagato_al; protected: int _anno; @@ -354,11 +379,14 @@ protected: void crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log); void crea_trr(const TFilename& trr) const; + void calc_pagato(TRectype& tmprec, const TRectype& rmovana, const TRectype& movana, const TDocumento * doc, bool fatturato, int indbil); void scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana, const TDocumento* doc, TLog_report& log); void scrive_riga_speciale(TLocalisamfile& tmp, const TDocumento* doc, const TString_array& special_docs); int sort_indbil(int indbil) const; + bool test_swap(TCausale& caus, bool ritsoc) const; + real totale_documento(const TRectype& mov) const; const TString& riclassifica(const TBill& zio, TRectype& tmpcurr) const; const TString& riclassifica(const TString& contone, TRectype& tmpcurr) const; bool is_causale_rateo_risconto(const char* codcaus) const; @@ -373,7 +401,8 @@ public: real get_budget_print(const TString& conto, char tipo) const; //per la stampa void get_budget_export(const TString& codcdc, const TString& codcms, const TString& codfase, TImporto& att, TImporto& pas, TImporto& cos, TImporto& ric) const; //per l'esportazione - + real get_budget_batch(const TString& codcdc, const TString& codcms, const TString& codfase, + const TString& conto, char tipo) const; // per l'elaborazione batch TPrint_rendiconto_ca_recordset(const TString& sql); ~TPrint_rendiconto_ca_recordset(); @@ -516,6 +545,44 @@ void TPrint_rendiconto_ca_recordset::get_budget_export(const TString& codcdc, co ric.normalize('A'); } +real TPrint_rendiconto_ca_recordset::get_budget_batch(const TString& codcdc, const TString& codcms, const TString& codfase, + const TString& conto, char tipo) const +{ + //data del cazzo che però serve per costruire il conto analitico + const TDate null_date; + //ecco il conto analitico... + TAnal_bill zio(conto, codcdc, codcms, codfase); + //..adesso si necessita del saldo del conto analitico appena creato.. + word tipo_movimento = 0; + switch (tipo) + { + case 'P': tipo_movimento |= _saldanal_preventivo; break; + case 'V': tipo_movimento |= _saldanal_variazione; break; + default: tipo_movimento |= _saldanal_consuntivo; break; + } + + if (_riclassificato) + tipo_movimento |= _saldanal_riclassify; + //..ecco quindi il saldo.. + const TSaldanal& saldo = ca_saldo(zio, null_date, null_date, tipo_movimento); + //..che deve essere normalizzato in base alla sua sezione ed all'indicatore di bilancio del conto + TImporto imp = saldo._fin; + switch (zio.indicatore_bilancio()) + { + case 1: + case 3: + imp.normalize('D'); + break; + case 2: + case 4: + imp.normalize('A'); + break; + default: + break; + } + return imp.valore(); +} + //sconvolgente metodo per la normalizzazione dei conti real TPrint_rendiconto_ca_recordset::get_budget_print(const TString& conto, char tipo) const { @@ -692,6 +759,35 @@ const TString& TPrint_rendiconto_ca_recordset::riclassifica(const TBill& zio, TR return get_tmp_string() = conto_riclassificato; } +bool TPrint_rendiconto_ca_recordset::test_swap(TCausale& caus, bool ritsoc) const +{ + const char sez = ritsoc ? caus.sezione_ritsoc() : caus.sezione_clifo(); + const bool s = (caus.iva() == iva_vendite) ^ (sez == 'D'); + return s; +} + +real TPrint_rendiconto_ca_recordset::totale_documento(const TRectype& mov) const +{ + real tot = mov.get_real(MOV_TOTDOC); // Legge totale + const real ritfis = mov.get_real(MOV_RITFIS); + tot += ritfis; // Somma ritenute fiscali + + const real ritsoc = mov.get_real(MOV_RITSOC); + + if (!ritsoc.is_zero()) + { + TCausale caus(mov.get(MOV_CODCAUS)); + const bool swapt = test_swap(caus, false); // Totale invertito ? + const bool swaps = test_swap(caus, true); // Ritenute sociali invertite ? + if (swapt ^ swaps) // Somma ritenute sociali con segno + tot -= ritsoc; + else + tot += ritsoc; + } + + return tot; +} + const TString& TPrint_rendiconto_ca_recordset::riclassifica(const TString& contone, TRectype& tmpcurr) const { CHECK(contone.len() == 12, "Conto di lunghezza assurda"); @@ -756,6 +852,141 @@ int TPrint_rendiconto_ca_recordset::ricava_tipo_documento (const TDocumento& doc return tipo_documento; } +void TPrint_rendiconto_ca_recordset::calc_pagato(TRectype& tmprec, const TRectype& rmovana, const TRectype& movana, const TDocumento * doc, bool fatturato, int indbil) +{ + const long nregcg = movana.get_long(MOVANA_NUMREGCG); + real pagato; + char sezione_normale = ' '; + + if (nregcg > 0L) + { + TToken_string cms_cdc_fsc_to_calc; + + cms_cdc_fsc_to_calc.add(rmovana.get(RMOVANA_CODCMS)); + cms_cdc_fsc_to_calc.add(rmovana.get(RMOVANA_CODCCOSTO)); + cms_cdc_fsc_to_calc.add(rmovana.get(RMOVANA_CODFASE)); + cms_cdc_fsc_to_calc.add(rmovana.get(RMOVANA_CODCONTO)); + + const TAnal_mov anal_mov(movana); + const TRectype & head = cache().get(LF_MOV, nregcg); + const TCausale & caus = cached_causale(head.get(MOV_CODCAUS), head.get_date(MOV_DATACOMP).year()); + const TipoIVA tipoiva = caus.iva(); //tipo iva legato alla causale (codcaus e' letto ad inizio procedura) + + TRecord_array& anal_rows = anal_mov.body(); + + real totdoc_cms; + real totdoc, totdoc_netto; + TPartite_array arr; + + arr.add_numreg(nregcg); + if (arr.items() > 0) + { + TAssoc_array commesse; + const TRectype& movfat = cache().get(LF_MOV, nregcg); + + if (tipoiva == iva_vendite) + sezione_normale = 'A'; + else + if (tipoiva == iva_acquisti) + sezione_normale = 'D'; + else + if (caus.tipomov() > 0 && caus.tipomov() < 3) //solo causali Fattura e Nota di Credito! + { + if (caus.sezione_clifo() == 'D') + sezione_normale = 'A'; + else + sezione_normale = 'D'; + } + if (sezione_normale > ' ') + { + totdoc = totale_documento(movfat); //tot doc con ritenute fiscali + ritenute sociali (da stampare) + //Movimenti CON SALDACONTO + //se movimento IVA.. + //trova le RMOVANA del MOVANA corrente che hanno il conto = a quello della i-esima rigaiva + for (int k = 1; k <= anal_rows.rows(); k++) //scansiona righe analitiche.. + { + TToken_string cms_cdc_fsc; + TImporto importo(anal_rows[k].get_char(RMOVANA_SEZIONE), anal_rows[k].get_real(RMOVANA_IMPORTO)); + + importo.normalize(sezione_normale); + cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODCMS)); + cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODCCOSTO)); + cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODFASE)); + cms_cdc_fsc.add(anal_rows[k].get(RMOVANA_CODCONTO)); + + real* imp = (real*)commesse.objptr(cms_cdc_fsc); + //aggiunge un elemento all'assoc_array... + if (imp == NULL) + commesse.add(cms_cdc_fsc, imp = new real); + *imp += importo.valore(); + totdoc_cms += importo.valore(); + } + totdoc_netto = movfat.get_real(MOV_TOTDOC); //questo si usa solo per il calcolo del residuo + + //parte comune a movimenti IVA e non (vengono anche qui considerate le ritenute fiscali + //e sociali perche' possono essere state inserite direttamente nella partita e non nel movimento + //(quindi non si puo' in questo caso applicare la totale_documento() + //Le ritenute fiscali vanno sempre sommate.. + + TRiga_partite * riga_fatt = arr.mov2rig(nregcg, 1); + + if (riga_fatt != NULL) + { + TImporto tot = riga_fatt->calcola_pagato_al(false, _pagato_al, _pagato_al, _pagato_al, 0x15); + + tot.normalize(sezione_normale); + const real totpagato = tot.valore(); + const real percentuale = totpagato / totdoc; + + //calcolo del residuo (solo movimenti saldacontati) + //mi servono,dalla riga partita che viene passata,i valori dei campi per la chiave del + //file delle scadenze + + TGeneric_distrib distributore(totdoc_cms * percentuale, TCurrency::get_firm_dec()); + { + FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp) + { + const real& impcms = *(real*)imp; + + distributore.add(impcms); + } + } + + FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp) + { + const real& impcms = *(real*)imp; + const real imppag = distributore.get(); + + if (cms_cdc_fsc_to_calc == k) + pagato += imppag; + } //FOR_EACH_... + } + } + else + if (fatturato) + { + TImporto importo(rmovana.get_char(RMOVANA_SEZIONE), rmovana.get_real(RMOVANA_IMPORTO)); + const TString c = rmovana.get(RMOVANA_CODCONTO); + TBill conto(atoi(c.left(3)), atoi(c.mid(3,3)), atol(c.right(6))); + const int indbil = conto.indicatore_bilancio(); + + sezione_normale = indbil == 1 || indbil == 3 ? 'D' : 'A'; + importo.normalize(sezione_normale); + pagato = importo.valore(); + } + TImporto p(sezione_normale, pagato); + + if (indbil == 1 || indbil == 3) //attivita' e costi sono in DARE + sezione_normale = 'D'; + else //passivita' e ricavi sono in AVERE + sezione_normale = 'A'; + p.normalize(sezione_normale); + pagato = p.valore(); + } + } + tmprec.put(REND_PAGATO, pagato); +} + //compila i campi del file temporaneo che sara' poi stampato void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana, const TDocumento* doc, TLog_report& log) @@ -822,13 +1053,7 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRec //---- DOC D'ORIGINE DELL' ANALMOV ----// //tipo movimento CONSUNTIVO (o TEMPORANEO); per i movimenti di budget (P o V) vedi l'else const char tipomov = movana.get_char(MOVANA_TIPOMOV); -#ifdef DBG - const long movana_numreg = movana.get_long(MOVANA_NUMREG); - if (movana_numreg == 19571) - const int cazzone = 1; -#endif - - //serve un documento da cui ricavare i parametri di stampa + //serve un documento da cui ricavare i parametri di stampa TDocumento* original_doc = (TDocumento*)doc; bool should_delete = false; if (original_doc == NULL && movana.get_long(MOVANA_DNDOC) > 0) @@ -1092,11 +1317,11 @@ F=IMF*/ //riempie i record del file temporaneo nel caso di rmovana con documento di origine if (selettore & FATTURATO) - tmpcurr.put("FATTURATO", imp.valore()); + tmpcurr.put(REND_FATTURATO, imp.valore()); if (selettore & MATURATO) - tmpcurr.put("MATURATO", imp.valore()); + tmpcurr.put(REND_MATURATO, imp.valore()); if (selettore & IMPEGNATO) - tmpcurr.put("IMPEGNATO", imp.valore()); + tmpcurr.put(REND_IMPEGNATO, imp.valore()); //campi comuni a rmovana e rdoc senza particolari operazioni TString descr = movana.get(MOVANA_DESCR); @@ -1106,6 +1331,9 @@ F=IMF*/ descr.ltrim(pos+1); descr.trim(); } + + // calcolo pagato + calc_pagato(tmpcurr, rmovana, movana, original_doc, (selettore & FATTURATO) > 0, indbil); //----Scrittura Conti sul file----// //Scrittura dei conti (i valori delle variabili sono stati settati nella parte iniziale del metodo) @@ -1308,12 +1536,12 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(TLocalisamfile& tmp, c imp.normalize(sezione_normale); //i documenti speciali vanno SOLO in FATTURATO - tmpcurr.put("FATTURATO", imp.valore()); + tmpcurr.put(REND_FATTURATO, imp.valore()); } else //if(codcaus.full() { //i documenti speciali vanno SOLO in FATTURATO - tmpcurr.put("FATTURATO", importo); + tmpcurr.put(REND_FATTURATO, importo); } tmp.write(); @@ -1681,7 +1909,7 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const { ofstream of(trr); of << 1000 << endl; - of << 22 << endl; + of << 23 << endl; of << "ORDCONT|1|1|0|Ordinatore in base a indicatore di bilancio" << endl; of << "CONTO|1|20|0|Conto analitico" << endl; of << "DATA|5|8|0|Data movimento o documento" << endl; @@ -1702,6 +1930,7 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const of << "FATTURATO|4|18|5|Fatturato" << endl; of << "MATURATO|4|18|5|Maturato" << endl; of << "IMPEGNATO|4|18|5|Impegnato" << endl; + of << "PAGATO|4|18|5|Pagato" << endl; of << "CONTOCG|1|12|0|Conto contabile" << endl; of << "HIDDEN|8|1|0|Record nascosto" << endl; of << 3 << endl; @@ -1784,9 +2013,16 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& _implode_rows = msk.get_bool(F_IMPLODE_ROWS); //c'e' un fottuto range di date? oppure si va a vita intera? + TDate dal, al; + _dadata = msk.get_date(F_DATAINI); - _adata = msk.get_date(F_DATAFIN); + _adata = _pagato_al = msk.get_date(F_DATAFIN); _vitaintera = msk.get_bool(F_VITAINTERA); + calcola_date_da_maschera(msk, dal, al); + if (!_pagato_al.ok()) + _pagato_al = al; + if (!_pagato_al.ok()) + _pagato_al = eotime; //metodi per riempire il file da cui generare il report //dati estratti dalle righe movimenti di contabilita' analitica @@ -1846,8 +2082,10 @@ protected: virtual void print(); void esporta_csv_row(ostream& file_to_date, const int first_level, const TString& cod_cms_cdc, const real importi[5][4], real importi_totali[5][4]); - void esporta_csv(TPrint_rendiconto_ca_recordset& rendy, const int r); + void esporta_csv(TPrint_rendiconto_ca_recordset& rendy, const int r, TReport_book book, bool reset); void incrementa(TToken_string& riga, const int col, const real& valore) const; + void crea_trr(const TFilename& trr) const; + void export_rendiconto(); public: const TMultilevel_code_info& get_first_level() const; @@ -1937,7 +2175,7 @@ void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int firs } //metodo di alto livello per l'esportazione dei dati di totale in un file per excel -void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, const int r) +void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, const int r, TReport_book book, bool reset) { //primo livello di configurazione const int first_level = get_first_level().logic(); @@ -1950,6 +2188,10 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co path.lower(); path.add("rendiconto.xls"); ofstream file_to_date(path, ios::app); + TFilename paths = _msk->get(F_PATH); + paths.lower(); + paths.add("rend.xls"); + ofstream file_to_print(paths, reset ? ios::trunc : ios::app); const bool invert_cosric = _msk->get_bool(F_REV_COSRIC); @@ -1985,7 +2227,10 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co //lo schema è questo: budget\impegnato\maturato\fatturato\da impegnare\da maturare\da fatturare //controlla se last_codice sia pieno per non aggiungere una inutile riga di zeri all'inizio if (last_codice.full()) + { esporta_csv_row(file_to_date, first_level, last_codice, importi, importi_totali); + esporta_csv_row(file_to_print, first_level, last_codice, importi, importi_totali); + } memset(importi, 0, sizeof(importi)); //Allah! Azzeratore dell'array con i totali per commessa (o cdc) last_codice = curr_codice; //memorizza il cambio codice (cms/cdc) @@ -2010,9 +2255,9 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co const bool hidden = rendy.get("HIDDEN").as_bool(); if (!hidden) { - const real impegnato = rendy.get("IMPEGNATO").as_real(); - const real fatturato = rendy.get("FATTURATO").as_real(); - const real maturato = rendy.get("MATURATO").as_real(); + const real impegnato = rendy.get(REND_IMPEGNATO).as_real(); + const real fatturato = rendy.get(REND_FATTURATO).as_real(); + const real maturato = rendy.get(REND_MATURATO).as_real(); //occhio all'inversione ricavi/costi, che causa il ribaltamento del significato di ordcont int indbil = rendy.get("ORDCONT").as_int(); @@ -2032,6 +2277,7 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co { //SCRIVE L'ULTIMA RIGA RELATIVA A CMS/CDC SUL FILE DA ESPORTARE esporta_csv_row(file_to_date, first_level, last_codice, importi, importi_totali); + esporta_csv_row(file_to_print, first_level, last_codice, importi, importi_totali); //AGGIUNGE L'EVENTUALE RIGA DEI TOTALI TToken_string str_tot = _msk->sfield(F_RIGHE).row(r); @@ -2050,7 +2296,6 @@ void TPrint_rendiconto_ca::esporta_csv(TPrint_rendiconto_ca_recordset& rendy, co file_to_date << endl << endl; } } //if(last_codice.full()) - } //metodo per accattarsi o' primo livello della configurazione CA @@ -2061,12 +2306,282 @@ const TMultilevel_code_info& TPrint_rendiconto_ca::get_first_level() const return ca_multilevel_code_info(logic); } +void TPrint_rendiconto_ca::crea_trr(const TFilename& trr) const +{ + ofstream of(trr); + of << 1000 << endl; + of << 12 << endl; + of << "CODCMS|1|20|0|Codice commessa" << endl; + of << "CODCOSTO|1|20|0|Codice centro di costo" << endl; + of << "CODFASE|1|20|0|Codice fase (eventualmente legato a CODCMS)" << endl; + of << "ORDCONT|1|1|0|Ordinatore in base a indicatore di bilancio" << endl; + of << "CODCONTO|1|20|0|Conto analitico" << endl; + of << "DATA|5|8|0|Data" << endl; + of << "DESCONTO|1|50|0|Descrizione conto" << endl; + of << "BUDGET|4|18|5|Preventivo" << endl; + of << "FATTURATO|4|18|5|Fatturato" << endl; + of << "MATURATO|4|18|5|Maturato" << endl; + of << "IMPEGNATO|4|18|5|Impegnato" << endl; + of << "PAGATO|4|18|5|Pagato" << endl; + of << 1 << endl; + of << "CODCMS+CODCOSTO+CODFASE+ORDCONT+CONTO+DATA" << endl; +} + + +void TPrint_rendiconto_ca::export_rendiconto() +{ + TFilename dir(argv(2) + 2); + TFilename pubdir(argv(3) + 2); + TDate oggi(TODAY); + const long firm = atol(argv(5)); + const long oldfirm = prefix().get_codditta(); + + if (firm > 0L) + prefix().set_codditta(firm); + dir.add(format("%04d", oggi.year())); + if (!dir.exist()) + make_dir(dir); + dir.add(format("%02d", oggi.month())); + if (!dir.exist()) + make_dir(dir); + dir.add(format("%02d", oggi.day())); + if (!dir.exist()) + make_dir(dir); + int profile = atoi(argv(4)); + _msk->load_profile(profile); + dir.add(format("%03d", profile)); + if (!dir.exist()) + make_dir(dir); + + TSheet_field& sheet = _msk->sfield(F_RIGHE); sheet.destroy(); + TToken_string& row = sheet.row(-1); //crea la prima riga dello sheet + + TString repname = _msk->get(F_REPORT); + + if (repname.empty()) + repname = "ca3700a"; + TPrint_rendiconto_ca_rep rep; + rep.load(repname); + + //log report con segnalazioni su errori (tipo conti inesistenti o robaccia simile..) + TLog_report log(TR("Errori rilevati")); + log.kill_duplicates(); + + TString video_string; //stringa che compare nella progind + TEsercizi_contabili esc; + TDate dataini, datafin; + const int anno = _msk->get_int(F_ANNO); + int recset_key = 1; + const bool attive = _msk->get_bool(F_ATTIVA); + + if (anno > 0) //se non è stata specificata alcuna dataini, ma è stato specificato un anno di esercizio... + esc.code2range(anno, dataini, datafin); + if (!_msk->field(F_DATAINI).empty()) + dataini = _msk->get_date(F_DATAINI); + if (!_msk->field(F_DATAFIN).empty()) + datafin = _msk->get_date(F_DATAFIN); + + const TMultilevel_code_info& liv1 = get_first_level(); //stabilisce quale è il primo livello (tra CDC e CMS).. + const bool is_cms = liv1.logic() == LF_COMMESSE; + TISAM_recordset set(is_cms ? "USE COMMESSE" : "USE CDC"); //..e di conseguenza scrive la use giusta + + TFilename trr; trr.tempdir(); trr.add("rendiconto"); trr.ext("trr"); //file tracciato record + TFilename riepname(dir); riepname.add("rendiconto"); riepname.ext("dbf"); + + //crea il file .trr in base ai parametri del metodo + crea_trr(trr); + + //crea in memoria il nuovo file temporaneo e lo azzera (non si sa mai..) + TExternisamfile riep(riepname, trr, true); + + riep.zap(); + TProgind pi(set.items(), video_string, true, true); + for (int i = 0; set.move_to(i); i++) //fighissimo metodo per scandire un file in 1 riga! + { + if (!pi.addstatus(1)) + break; + + TReport_book * book = new TReport_book(); + + //Filtro sulle date + //DATE VALIDE STRETTAMENTE PER COMMESSE + //per prima cosa controlla se veramente la commessa rientri nei parametri temporali impostati sulla maschera + //Se infatti è completamente al di fuori di tale intervallo, che cavolo la controlla a fare + row = set.get((unsigned int)0).as_string(); //prende il valore del primo campo del file (CDC o CMS code) + + if (is_cms) + { + if (attive) + { + const TRectype& rec_commesse = set.cursor()->curr(); + + if (!ca_commessa_attiva(rec_commesse, dataini, datafin)) + continue; + } + else + if (dataini.ok() || datafin.ok()) + { + const TRectype& rec_commesse = set.cursor()->curr(); + TDate datainicms, datafcomp; + ca_durata_commessa(rec_commesse, datainicms, datafcomp); + if ((dataini.ok() && datafcomp < dataini) || (datafin.ok() && datainicms > datafin)) + continue; + } + } + + + video_string = TR("Scansione"); + video_string << " " << row; //completa la stringa da visualizzare sulla progind + pi.set_text(video_string); + + for (int l = liv1.levels()-2; l >= 0; l--) //se la struttura è a più livelli costruisce la tokenstring + row.insert("|", liv1.total_len(l)); + + rep.set_filter(*_msk, 0, recset_key, log); //fa la set filter sulla prima riga (che è quella usata) + + //se stampa o anteprima.. + book->add(rep); + + TPrint_rendiconto_ca_recordset & recset = (TPrint_rendiconto_ca_recordset &) *rep.recordset(); + TString80 codcms; + TString80 codcosto; + TString16 codfase; + TString16 codconto; + + for (int j = 0; recset.move_to(j); j++) //fighissimo metodo per scandire un file in 1 riga! + { + codcms = recset.get(REND_CODCMS).as_string(); + codcosto = recset.get(REND_CODCOSTO).as_string(); + codfase = recset.get(REND_CODFASE).as_string(); + codconto = recset.get(REND_CONTO).as_string(); + + riep.put(RIEP_CODCMS, codcms); + riep.put(RIEP_CODCOSTO, codcosto); + riep.put(RIEP_CODFASE, codfase); + riep.put(RIEP_CODCONTO, codconto); + riep.put(RIEP_DATA, oggi); + + if (riep.read() != NOERR) + { + riep.zero(); + riep.put(RIEP_CODCMS, codcms); + riep.put(RIEP_CODCOSTO, codcosto); + riep.put(RIEP_CODFASE, codfase); + riep.put(RIEP_CODCONTO, codconto); + riep.put(RIEP_DATA, oggi); + riep.put(RIEP_DESCONTO, cache().get(LF_PCONANA, codconto, PCONANA_DESCR)); + riep.put(RIEP_ORDCONT, recset.get(REND_ORDCONT).as_int()); + + real budget = recset.get_budget_batch(codcosto, codcms, codfase, codconto, 'P'); + + budget += recset.get_budget_batch(codcosto, codcms, codfase, codconto, 'V'); + riep.put(RIEP_BUDGET, budget); + riep.write(); + } + riep.curr().add(REND_FATTURATO, recset.get(REND_FATTURATO).as_real()); + riep.curr().add(REND_MATURATO, recset.get(REND_MATURATO).as_real()); + riep.curr().add(REND_IMPEGNATO, recset.get(REND_IMPEGNATO).as_real()); + riep.curr().add(REND_PAGATO, recset.get(REND_PAGATO).as_real()); + riep.rewrite(); + } + + TFilename filename(dir); + TString codice(set.get(COMMESSE_CODCMS).as_string()); + + codice.replace('.', '_'); + codice.replace('\\', '_'); + codice.replace('/', '_'); + filename.add(codice); + filename.ext("pdf"); + book->export_pdf(filename, false); + delete book; + book = NULL; + + if (filename.exist()) + { + TFilename dest(pubdir); + + dest.add(codice); + dest.ext("pdf"); + fcopy(filename, dest, false, true); + } + } + if (firm > 0L) + prefix().set_codditta(oldfirm); + +// if (oggi.is_end_month()) + { + TDate del(oggi); + + del.addmonth(-1); + del.set_end_month(); + + const int last = del.day(); + TFilename base(argv(2) + 2); + + base.add(format("%04d", del.year())); + base.add(format("%02d", del.month())); + + for (int d = 1; d < last; d++) + { + TString_array dirs; + TFilename dirsdir(base); + + dirsdir.add(format("%02d", d)); + + if (dirsdir.exist()) + { + TFilename mask(dirsdir); + + mask.add("*.*"); + list_files(mask, dirs); + + const int diritems = dirs.items(); + + for (int i = 0; i < diritems; i ++) + { + TString_array files; + TFilename filesdir(dirsdir); + + if (filesdir.exist()) + { + filesdir.add(dirs.row(i)); + + mask = filesdir; + mask.add("*.*"); + list_files(mask, files); + + const int items = files.items(); + + for (int j = 0; i < items; j ++) + { + TFilename file(filesdir); + + file.add(files.row(j)); + file.fremove(); + } + remove_file(filesdir); + } + } + } + } + } +} + void TPrint_rendiconto_ca::main_loop() { _msk = new TPrint_rendiconto_ca_mask; TPrint_rendiconto_ca_mask& mask = *_msk; - const int first_level = get_first_level().logic(); //primo livello nella configurazione CA + const int first_level = get_first_level().logic(); //primo livello nella configurazione CA + TString arg(argv(2)); + TEsercizi_contabili esc; + arg.lower(); + if (arg.starts_with("-b")) + { + export_rendiconto(); + return; + } while (true) { //il programma deve cominciare l'eleaborazione solo nel caso di Stampa/Anteprima (K_ENTER) o Esportazione CSV (K_F6) @@ -2159,14 +2674,16 @@ void TPrint_rendiconto_ca::main_loop() TSheet_field& sheet = mask.sfield(F_RIGHE); TString video_string; //stringa che compare nella progind - if (sheet.empty()) //se non ci sono righe sullo sheet (selezione su tutte le cms/cdc)... + TDate dataini, datafin; + const int anno = mask.get_int(F_ANNO); + const bool attive = mask.get_bool(F_ATTIVA); + + if (sheet.empty()) //se non ci sono righe sullo sheet (selezione su tutte le cms/cdc)... { TToken_string& row = sheet.row(-1); //crea la prima riga dello sheet //si amplia il range di ricerca temporale di 1 anno nel passato perchè i movana.. //..preventivi possono essere stati decisi prima dell'inizio effettivo commessa - TDate dataini, datafin; - const int anno = mask.get_int(F_ANNO); if (anno > 0) //se non è stata specificata alcuna dataini, ma è stato specificato un anno di esercizio... { TEsercizi_contabili esc; @@ -2193,13 +2710,24 @@ void TPrint_rendiconto_ca::main_loop() //Se infatti è completamente al di fuori di tale intervallo, che cavolo la controlla a fare row = set.get((unsigned int)0).as_string(); //prende il valore del primo campo del file (CDC o CMS code) - if (is_cms && (dataini.ok() || datafin.ok())) + if (is_cms) { - const TRectype& rec_commesse = set.cursor()->curr(); - TDate datainicms, datafcomp; - ca_durata_commessa(rec_commesse, datainicms, datafcomp); - if ((dataini.ok() && datafcomp < dataini) || (datafin.ok() && datainicms > datafin)) - continue; + if (attive) + { + const TRectype& rec_commesse = set.cursor()->curr(); + + if (!ca_commessa_attiva(rec_commesse, dataini, datafin)) + continue; + } + else + if (dataini.ok() || datafin.ok()) + { + const TRectype& rec_commesse = set.cursor()->curr(); + TDate datainicms, datafcomp; + ca_durata_commessa(rec_commesse, datainicms, datafcomp); + if ((dataini.ok() && datafcomp < dataini) || (datafin.ok() && datainicms > datafin)) + continue; + } } video_string = TR("Scansione"); @@ -2213,7 +2741,7 @@ void TPrint_rendiconto_ca::main_loop() //se stampa o anteprima.. if (key == K_F6) - esporta_csv((TPrint_rendiconto_ca_recordset&)*rep.recordset(), 0); //esportazione in excel + esporta_csv((TPrint_rendiconto_ca_recordset&)*rep.recordset(), 0, book, i == 0); //esportazione in excel else book.add(rep); } @@ -2227,7 +2755,7 @@ void TPrint_rendiconto_ca::main_loop() //..temporaneo i cui dati riempiranno il report //se stampa o anteprima if (key == K_F6) //esportazione in excel - esporta_csv((TPrint_rendiconto_ca_recordset&)*rep.recordset(), r); //il recordset è del tipo TPrint_rendiconto + esporta_csv((TPrint_rendiconto_ca_recordset&)*rep.recordset(), r, book, r == 0); //il recordset è del tipo TPrint_rendiconto else book.add(rep); //aggiunge il report relativo alla cdc/cms corrente al book } @@ -2236,6 +2764,54 @@ void TPrint_rendiconto_ca::main_loop() if (log.recordset()->items() > 0) log.preview(); + TReport rep_xls; + + path = "ca3700b"; + rep_xls.load(path); + + if (key == K_F6) + { + TCSV_recordset xls_source("CSV(\"\t\")"); + TCSV_recordset * xls_dest = new TCSV_recordset("CSV(\"\t\")"); + TFilename paths = _msk->get(F_PATH); + TString val; + + paths.lower(); + paths.add("rend.xls"); + xls_source.load_file(paths); + + const TEsercizio & e = esc.esercizio(anno == 0 ? (datafin.ok() ? datafin.year() : dataini.year()) : anno); + const int ncols = xls_source.columns(); + + for (bool ok = xls_source.move_first(); ok; ok = xls_source.move_next()) + { + TString codcms = xls_source.get(0).as_string(); + const TRectype & rec = cache().get(LF_COMMESSE, codcms); + bool okc = !rec.empty(); + + okc &= rec.get_date(COMMESSE_DATAINIZIO) <= e.fine(); + if (okc & rec.get_date(COMMESSE_PROROGA).ok()) + okc &= rec.get_date(COMMESSE_PROROGA) >= e.inizio(); + else + okc &= rec.get_date(COMMESSE_DATAFINE) >= e.inizio(); + if (okc) + { + TToken_string riga(512, '\t'); + + for (int col = 0; col < ncols; col++) + { + val = xls_source.get(col).as_string(); + if (col >= 5) + val.replace(',', '.'); + riga.add(val, col); + } + xls_dest->new_rec(riga); + } + } + rep_xls.TReport::set_recordset(xls_dest); + book.add(rep_xls); + } + if (key == K_ENTER) book.print(); //stampa il book dei report else diff --git a/src/ca/ca3700.h b/src/ca/ca3700.h index c30d12034..0d53585d2 100755 --- a/src/ca/ca3700.h +++ b/src/ca/ca3700.h @@ -13,6 +13,7 @@ #define F_IMPLODE_ROWS 259 #define F_VITAINTERA 261 #define F_PATH 262 +#define F_ATTIVA 263 //campi generati dai piani dei conti #define F_PIANO 319 diff --git a/src/ca/ca3700.uml b/src/ca/ca3700.uml index 05d1e745b..85f1e41ac 100755 --- a/src/ca/ca3700.uml +++ b/src/ca/ca3700.uml @@ -101,6 +101,11 @@ BEGIN PROMPT 36 9 "Alla data " END +BOOLEAN F_ATTIVA +BEGIN + PROMPT 60 9 "Solo commesse attive" +END + TEXT DLG_NULL BEGIN PROMPT 2 10 "Digitare o selezionare attraverso la ricerca la cartella in cui creare il file rendiconto.xls. E' necessario indicare l'intero percorso!" diff --git a/src/ca/ca3700a.rep b/src/ca/ca3700a.rep index ef06407e4..6e52876ce 100755 --- a/src/ca/ca3700a.rep +++ b/src/ca/ca3700a.rep @@ -1,8 +1,8 @@ Rendiconto CA - -
+ +
@@ -22,26 +22,27 @@ - + - - - - + + + + +
-
+
MESSAGE RESET,F1 - + @@ -55,7 +56,7 @@ MESSAGE ISAMREAD,CDC,CODCOSTO=#COSTO,DESCRIZ - + MESSAGE ISAMREAD,COMMESSE,CODCMS=#COMMESSA,ANNO @@ -74,7 +75,7 @@ MESSAGE ISAMREAD,COMMESSE,CODCMS=#COMMESSA,DESCRIZ - + MESSAGE ISAMREAD,COMMESSE,CODCMS=#COMMESSA,DATAINIZIO @@ -94,7 +95,7 @@ MESSAGE ISAMREAD,FASI,CODFASE=#FASE,DESCRIZ - + MESSAGE ISAMREAD,COMMESSE,CODCMS=#COMMESSA,DATAFINE @@ -122,7 +123,7 @@ CA_FORMAT_CONTO - + MESSAGE ISAMREAD,COMMESSE,CODCMS=#COMMESSA,DATAPROR @@ -142,27 +143,27 @@ MESSAGE ISAMREAD,CLIFO,TIPOCF=C!CODCF=#101,RAGSOC
-
+
ORDCONT+CONTO MESSAGE RESET,F2 - + CONTO CA_FORMAT_CONTO - + CONTO CA_FORMAT_CONTO_DESCR - + - + #VARIAZIONE #THIS @ \ prende il proprio valore @@ -174,7 +175,7 @@ +! \ esegue la ADD sul campo di destinazione - + #PREVENTIVO #THIS @ \ prende il proprio valore @@ -187,7 +188,7 @@
-
+
CODNUM+ANNO+NUMRD
-
-
+
+
HIDDEN!='X' NUMREG @@ -217,20 +218,23 @@ DATADOCRIF - + DESC - + NRIGA - + DESCRIGA - + DOCORIG + + PAGATO + FATTURATO MESSAGE ADD,F2.400 @@ -271,7 +275,7 @@ NUMRD
-
+
@@ -292,7 +296,7 @@ CA_FORMAT_FASE
-
+
@@ -439,7 +443,7 @@ #304-#804
-
+
@@ -491,7 +495,7 @@ #H2.700+#H2.800-#800
-
+
0 #B1.100 !
- \ No newline at end of file + diff --git a/src/ca/ca3700b.rep b/src/ca/ca3700b.rep new file mode 100644 index 000000000..fe082caaa --- /dev/null +++ b/src/ca/ca3700b.rep @@ -0,0 +1,228 @@ + + + Rendiconto CA per esportazione excel + +
+ + + + + + #SYSTEM.RAGSOC + + + + + + #SYSTEM.DATE + + + + + + #REPORT.PAGE + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ MESSAGE RESET,F1 +
+
+
+ + + A + #THIS @ +"" += +IF +#102 +HIDE +ELSE +#102 +SHOW +THEN + + + M + MESSAGE ADD,F1.102 + + + N + MESSAGE ADD,F1.104 + + + O + MESSAGE ADD,F1.106 + + + P + MESSAGE ADD,F1.108 + + + Q + MESSAGE ADD,F1.110 + + + R + MESSAGE ADD,F1.112 + + + T + MESSAGE ADD,F1.114 + + + F + MESSAGE ADD,F1.101 + + + G + MESSAGE ADD,F1.103 + + + H + MESSAGE ADD,F1.105 + + + I + MESSAGE ADD,F1.107 + + + J + MESSAGE ADD,F1.109 + + + K + MESSAGE ADD,F1.111 + + + L + MESSAGE ADD,F1.113 + + + C + + + D + + + E + + + B + +
+
+
+ + + + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + + + MESSAGE ADD,F2.400 + +
+ \ No newline at end of file diff --git a/src/ca/ca3800a.rep b/src/ca/ca3800a.rep index 2b93ebc4b..6fa2751d4 100755 --- a/src/ca/ca3800a.rep +++ b/src/ca/ca3800a.rep @@ -2,7 +2,7 @@ Bilancio commessa CA -
+
#SYSTEM.RAGSOC @@ -38,21 +38,28 @@ "MARGINE CONTRIBUZIONE"
-
- +
+ - + - + ANNO - + - + + + DAL + + + + + TIPOSTIMA @@ -72,24 +79,40 @@
  • - + - + VITAINTERA - + - + + + INCLUDE_DOCUMENTI + + + + + + + AL + + DATAFINE + + + + + FASESPEC - + - + CDCSPEC @@ -106,10 +129,10 @@
  • -
    +
    (LEVELC;2)||(LEVEL=4) - + LEVEL
  • @@ -119,7 +142,7 @@
  • - + ANNO @@ -132,7 +155,7 @@ MESSAGE COPY,F2.102
  • -
    +
    LEVEL @@ -151,7 +174,7 @@ MESSAGE COPY,F3.101
    -