diff --git a/ca/ca0300a.h b/ca/ca0300a.h index 5f9a6b902..384f50cff 100755 --- a/ca/ca0300a.h +++ b/ca/ca0300a.h @@ -41,3 +41,8 @@ #define F_PDCI_4 136 #define F_DESPDCI_4 137 #define F_USE_PDCC 138 + +#define F_CDCREQ 140 +#define F_CMSREQ 141 +#define F_FSCREQ 142 +#define F_PDCREQ 143 diff --git a/ca/ca0300a.uml b/ca/ca0300a.uml index 9e34fbe59..1d0cf0733 100755 --- a/ca/ca0300a.uml +++ b/ca/ca0300a.uml @@ -61,24 +61,28 @@ BEGIN FIELD FathFasi END -GROUPBOX DLG_NULL 78 7 +ENDPAGE + +PAGE "Pagina 2" -1 -1 78 10 + +GROUPBOX DLG_NULL 78 8 BEGIN - PROMPT 1 8 "@bCentro di costo" + PROMPT 1 1 "@bCentro di costo" END TEXT -1 BEGIN - PROMPT 4 9 "Formato codice" + PROMPT 4 2 "Formato codice" END TEXT -1 BEGIN - PROMPT 27 9 "Descrizione" + PROMPT 27 2 "Descrizione" END STRING F_CDC_1 20 BEGIN - PROMPT 2 10 "1 " + PROMPT 2 3 "1 " MESSAGE EMPTY CLEAR,F_CDC_2|CLEAR,F_DESCDC_2|K_TAB,F_CDC_2|RESET,F_DESCDC_1 MESSAGE ENABLE,F_CDC_2|ENABLE,F_DESCDC_2 FIELD CdC(1) @@ -86,13 +90,13 @@ END STRING F_DESCDC_1 50 BEGIN - PROMPT 27 10 "" + PROMPT 27 3 "" FIELD CdCDes(1) END STRING F_CDC_2 20 BEGIN - PROMPT 2 11 "2 " + PROMPT 2 4 "2 " MESSAGE EMPTY CLEAR,F_CDC_3|CLEAR,F_DESCDC_3|K_TAB,F_CDC_3|RESET,F_DESCDC_2 MESSAGE ENABLE,F_CDC_3|ENABLE,F_DESCDC_3 FLAGS "G" @@ -101,13 +105,13 @@ END STRING F_DESCDC_2 50 BEGIN - PROMPT 27 11 "" + PROMPT 27 4 "" FIELD CdCDes(2) END STRING F_CDC_3 20 BEGIN - PROMPT 2 12 "3 " + PROMPT 2 5 "3 " MESSAGE EMPTY CLEAR,F_CDC_4|CLEAR,F_DESCDC_4|K_TAB,F_CDC_4|RESET,F_DESCDC_3 MESSAGE ENABLE,F_CDC_4|ENABLE,F_DESCDC_4 FLAGS "G" @@ -116,13 +120,13 @@ END STRING F_DESCDC_3 50 BEGIN - PROMPT 27 12 "" + PROMPT 27 5 "" FIELD CdCDes(3) END STRING F_CDC_4 20 BEGIN - PROMPT 2 13 "4 " + PROMPT 2 6 "4 " MESSAGE EMPTY RESET,F_DESCDC_4 FLAGS "G" FIELD CdC(4) @@ -130,28 +134,34 @@ END STRING F_DESCDC_4 50 BEGIN - PROMPT 27 13 "" + PROMPT 27 6 "" FIELD CdCDes(4) END -GROUPBOX DLG_NULL 78 7 +BOOLEAN F_CDCREQ BEGIN - PROMPT 1 15 "@bCommessa" + PROMPT 2 7 "Obbligatorio nelle righe dei movimenti" + FIELD CdcRequired +END + +GROUPBOX DLG_NULL 78 8 +BEGIN + PROMPT 1 9 "@bCommessa" END TEXT -1 BEGIN - PROMPT 4 16 "Formato codice" + PROMPT 4 10 "Formato codice" END TEXT -1 BEGIN - PROMPT 27 16 "Descrizione" + PROMPT 27 10 "Descrizione" END STRING F_CMS_1 20 BEGIN - PROMPT 2 17 "1 " + PROMPT 2 11 "1 " MESSAGE EMPTY CLEAR,F_CMS_2|CLEAR,F_DESCMS_2|K_TAB,F_CMS_2|RESET,F_DESCMS_1 MESSAGE ENABLE,F_CMS_2|ENABLE,F_DESCMS_2 FIELD Cms(1) @@ -159,13 +169,13 @@ END STRING F_DESCMS_1 50 BEGIN - PROMPT 27 17 "" + PROMPT 27 11 "" FIELD CmsDes(1) END STRING F_CMS_2 20 BEGIN - PROMPT 2 18 "2 " + PROMPT 2 12 "2 " MESSAGE EMPTY CLEAR,F_CMS_3|CLEAR,F_DESCMS_3|K_TAB,F_CMS_3|RESET,F_DESCMS_2 MESSAGE ENABLE,F_CMS_3|ENABLE,F_DESCMS_3 FLAGS "G" @@ -174,13 +184,13 @@ END STRING F_DESCMS_2 50 BEGIN - PROMPT 27 18 "" + PROMPT 27 12 "" FIELD CmsDes(2) END STRING F_CMS_3 20 BEGIN - PROMPT 2 19 "3 " + PROMPT 2 13 "3 " MESSAGE EMPTY CLEAR,F_CMS_4|CLEAR,F_DESCMS_4|K_TAB,F_CMS_4|RESET,F_DESCMS_3 MESSAGE ENABLE,F_CMS_4|ENABLE,F_DESCMS_4 FLAGS "G" @@ -189,13 +199,13 @@ END STRING F_DESCMS_3 50 BEGIN - PROMPT 27 19 "" + PROMPT 27 13 "" FIELD CmsDes(3) END STRING F_CMS_4 20 BEGIN - PROMPT 2 20 "4 " + PROMPT 2 14 "4 " MESSAGE EMPTY RESET,F_DESCMS_4 FLAGS "G" FIELD Cms(4) @@ -203,15 +213,21 @@ END STRING F_DESCMS_4 50 BEGIN - PROMPT 27 20 "" + PROMPT 27 14 "" FIELD CmsDes(4) END +BOOLEAN F_CMSREQ +BEGIN + PROMPT 2 15 "Obbligatorio nelle righe dei movimenti" + FIELD CmsRequired +END + ENDPAGE -PAGE "Pagina 2" -1 -1 78 10 +PAGE "Pagina 3" -1 -1 78 10 -GROUPBOX DLG_NULL 78 7 +GROUPBOX DLG_NULL 78 8 BEGIN PROMPT 1 1 "@bFase" END @@ -284,85 +300,108 @@ BEGIN FIELD FscDes(4) END -GROUPBOX DLG_NULL 78 8 +BOOLEAN F_FSCREQ BEGIN - PROMPT 1 8 "@bPiano dei conti industriale" + PROMPT 2 7 "Obbligatorio nelle righe dei movimenti" + FIELD FscRequired +END + +GROUPBOX DLG_NULL 78 9 +BEGIN + PROMPT 1 10 "@bPiano dei conti industriale" END BOOLEAN F_USE_PDCC BEGIN - PROMPT 2 9 "Utilizza il piano dei conti contabile" - MESSAGE TRUE CLEAR,F_PDCI_1|CLEAR,F_DESPDCI_1 - MESSAGE FALSE ENABLE,F_PDCI_1|ENABLE,F_DESPDCI_1 + PROMPT 2 11 "Utilizza il piano dei conti contabile" + MESSAGE TRUE HIDE,5@ + MESSAGE FALSE SHOW,5@ FIELD UsePdcc END TEXT -1 BEGIN - PROMPT 4 10 "Formato codice" + PROMPT 4 12 "Formato codice" + GROUP 5 END TEXT -1 BEGIN - PROMPT 27 10 "Descrizione" + PROMPT 27 12 "Descrizione" + GROUP 5 END STRING F_PDCI_1 20 BEGIN - PROMPT 2 11 "1 " + PROMPT 2 13 "1 " MESSAGE EMPTY CLEAR,F_PDCI_2|CLEAR,F_DESPDCI_2|K_TAB,F_PDCI_2|RESET,F_DESPDCI_1 MESSAGE ENABLE,F_PDCI_2|ENABLE,F_DESPDCI_2 FIELD Pdci(1) + GROUP 5 END STRING F_DESPDCI_1 50 BEGIN - PROMPT 27 11 "" + PROMPT 27 13 "" FIELD PdciDes(1) + GROUP 5 END STRING F_PDCI_2 20 BEGIN - PROMPT 2 12 "2 " + PROMPT 2 14 "2 " MESSAGE EMPTY CLEAR,F_PDCI_3|CLEAR,F_DESPDCI_3|K_TAB,F_PDCI_3|RESET,F_DESPDCI_2 MESSAGE ENABLE,F_PDCI_3|ENABLE,F_DESPDCI_3 FLAGS "G" FIELD Pdci(2) + GROUP 5 END STRING F_DESPDCI_2 50 BEGIN - PROMPT 27 12 "" + PROMPT 27 14 "" FIELD PdciDes(2) + GROUP 5 END STRING F_PDCI_3 20 BEGIN - PROMPT 2 13 "3 " + PROMPT 2 15 "3 " MESSAGE EMPTY CLEAR,F_PDCI_4|CLEAR,F_DESPDCI_4|K_TAB,F_PDCI_4|RESET,F_DESPDCI_3 MESSAGE ENABLE,F_PDCI_4|ENABLE,F_DESPDCI_4 FLAGS "G" FIELD Pdci(3) + GROUP 5 END STRING F_DESPDCI_3 50 BEGIN - PROMPT 27 13 "" + PROMPT 27 15 "" FIELD PdciDes(3) + GROUP 5 END STRING F_PDCI_4 20 BEGIN - PROMPT 2 14 "4 " + PROMPT 2 16 "4 " MESSAGE EMPTY RESET,F_DESPDCI_4 FLAGS "G" FIELD Pdci(4) + GROUP 5 END STRING F_DESPDCI_4 50 BEGIN - PROMPT 27 14 "" + PROMPT 27 16 "" FIELD PdciDes(4) + GROUP 5 +END + +BOOLEAN F_PDCREQ +BEGIN + PROMPT 2 17 "Obbligatorio nelle righe dei movimenti" + FIELD PdciRequired + GROUP 5 END ENDPAGE diff --git a/ca/ca0800a.uml b/ca/ca0800a.uml index 92dcd04f1..1a01cf84b 100755 --- a/ca/ca0800a.uml +++ b/ca/ca0800a.uml @@ -32,10 +32,10 @@ BEGIN USE LF_RIP INPUT TIPO F_TIPO SELECT INPUT CODICE F_CODICE_I - DISPLAY "Codice " CODICE + DISPLAY "Codice@8" CODICE DISPLAY "Gruppo" GRUPPO DISPLAY "Conto" CONTO - DISPLAY "Sottoconto" CONTO + DISPLAY "Sottoconto" SOTTOCONTO DISPLAY "Descrizione@50" DESCRIZ OUTPUT F_CODICE_I CODICE OUTPUT F_DESCRIZ_I DESCRIZ diff --git a/ca/ca2100.cpp b/ca/ca2100.cpp index c00b671a2..d255510af 100755 --- a/ca/ca2100.cpp +++ b/ca/ca2100.cpp @@ -1,7 +1,9 @@ #include #include #include +#include #include +#include #include "ca2.h" #include "ca2100a.h" @@ -9,24 +11,80 @@ #include "../cg/cglib01.h" +#include +#include + #include "movana.h" #include "rmovana.h" +#include "saldana.h" class TMovanal_msk : public TAutomask { + TAssoc_array _saldi; + protected: virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly); virtual bool can_be_closed() const; virtual bool on_key(KEY key); + const TToken_string& rec2key(const TRectype& rec) const; + void aggiorna_saldo_riga(int r); + const TString& somma_campi(TToken_string& row, int first) const; + + // Lettura movimento contabile + TToken_string& get_rip_row(const TRectype& rrip); + void split_cg_row(const TRectype& row, const TRecord_array& rrip); + void load_cg_row(const TRectype& row); + void load_cg_mov(); + public: + void reset_saldi(); + TImporto& saldo(const TRectype& row); void show_locked_buttons(); + bool row2rec(int row, TRectype& rec) const; + + void row2imp(const TToken_string& row, TImporto& imp) const; + bool row2imp(int r, TImporto& imp) const; + void imp2row(const TImporto& imp, TToken_string& row) const; + + void spezza_campo(const TString& str, TToken_string& row, int first) const; TMovanal_msk(); virtual ~TMovanal_msk() { } }; +class TMovanal_app : public TRelation_application +{ + TRelation* _rel; + TMovanal_msk* _msk; + +protected: + virtual bool user_create(); + virtual bool user_destroy(); + virtual TMask* get_mask(int); + virtual TRelation* get_relation() const; + virtual bool get_next_key(TToken_string& key); + + void write_rows(const TMask& m); + void read_rows(const TMask& m); + + virtual bool protected_record(TRectype& rec); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + virtual int read(TMask& m); + + virtual void init_query_mode(TMask& m); + virtual void init_insert_mode(TMask& m); + virtual void init_modify_mode(TMask& m); +}; + +static TMovanal_app& app() { return (TMovanal_app&)main_app(); } + +/////////////////////////////////////////////////////////// +// TMovanal_msk +/////////////////////////////////////////////////////////// + bool TMovanal_msk::can_be_closed() const { return mode() != MODE_MOD || !get_bool(F_BLOCCATO); @@ -46,11 +104,147 @@ void TMovanal_msk::show_locked_buttons() { const bool editmode = mode() == MODE_MOD; const bool unlocked = can_be_closed(); + const bool is_trans = app().is_transaction(); show (F_BLOCCATO, editmode); enable(F_BLOCCATO, unlocked); - enable(DLG_SAVEREC, unlocked && edit_mode()); // Abilito il "Registra" solo in modo modifica + enable(DLG_SAVEREC, unlocked && (editmode || mode() == MODE_INS)); enable(DLG_DELREC, unlocked && editmode); - enable(DLG_QUIT, unlocked); + enable(DLG_QUIT, unlocked && !is_trans); + enable(DLG_CANCEL, mode() == MODE_QUERY || !is_trans); + enable(F_RESET, unlocked); +} + +TToken_string& TMovanal_msk::get_rip_row(const TRectype& rrip) +{ + TSheet_field& sheet = sfield(F_RIGHE); + const int pos_cdc = sheet.cid2index(S_CDC1); + const int pos_cms = sheet.cid2index(S_CMS1); + const int pos_fas = sheet.cid2index(S_FAS1); + const int pos_con = sheet.cid2index(S_CON1); + + TToken_string keyrip, keyrow; + keyrip.add(rrip.get("CODCOSTO")); + keyrip.add(rrip.get("CODCMS")); + keyrip.add(rrip.get("CODFASE")); + keyrip.add(rrip.get("CODCONTO")); + + if (sheet.items() > 0) + { + FOR_EACH_SHEET_ROW(sheet, i, row) + { + keyrow = somma_campi(*row, pos_cdc); + keyrow.add(somma_campi(*row, pos_cms)); + keyrow.add(somma_campi(*row, pos_fas)); + keyrow.add(somma_campi(*row, pos_con)); + if (keyrow == keyrip) + return *row; + } + } + + TToken_string& row = sheet.row(-1); + spezza_campo(keyrip.get(0), row, pos_cdc); + spezza_campo(keyrip.get(1), row, pos_cms); + spezza_campo(keyrip.get(2), row, pos_fas); + spezza_campo(keyrip.get(3), row, pos_con); + + return row; +} + +void TMovanal_msk::split_cg_row(const TRectype& row, const TRecord_array& rrip) +{ + // Importo totale da distribuire arrotondato ai decimali della valuta di conto + TGeneric_distrib distrib(row.get_real(RMV_IMPORTO), TCurrency::get_firm_dec()); + + // Calcolo tutte le percentuali da ripartire + int i; + for (i = 1; i <= rrip.rows(); i++) + distrib.add(rrip[i].get_real("RIPARTO")); + + 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 + const TImporto imp(row.get_char(RMV_SEZIONE), distrib.get()); // Legge la quota da distribuire + impriga += imp; impriga.normalize(); // Incrementa l'importo della riga e lo normalizza + imp2row(impriga, riga); // Aggiorna la riga + + TString80 desc; riga.get(2); // Legge descrizione riga corrente + if (desc.blank()) // Se e' vuota allora ... + riga.add(row.get(RMV_DESCR), 2); // ... ci copio la descrizione della riga contabile + } +} + +void TMovanal_msk::load_cg_row(const TRectype& row) +{ + // Cerco la ripartizione del sottoconto, se non la trovo uso quella del conto o del gruppo + for (int i = 3; i > 0; i--) + { + TString query = "USE RIP SELECT"; + query << " (GRUPPO=" << row.get(RMV_GRUPPO) << ')'; // Il gruppo c'e' sempre + if (i > 1) + query << "&&(CONTO=" << row.get(RMV_CONTO) << ')'; // Il conto c'e' per i = 2 o 3 + if (i > 2) + query << "&&(SOTTOCONTO=" << row.get(RMV_SOTTOCONTO) << ')'; // Il sottoconto c'e' per i = 3 + query << "\nFROM TIPO='I'\nTO TIPO='I'"; + TISAM_recordset rs(query); + if (rs.items() > 0) // Ho trovato la ripartizione: evviva! + { + TString16 codice = rs.get("CODICE").as_string(); + codice.insert("I|"); + TRecord_array rrip(codice, LF_RRIP); // Carico le righe di ripartizione + if (rrip.rows() > 0) + { + split_cg_row(row, rrip); + break; + } + } + } + if (i == 0) // Non ho trovato nessuno schema di riaprtizione valido + { + // Creo una riga nuova + TToken_string& riga = sfield(F_RIGHE).row(-1); + const TImporto imp(row.get_char(RMV_SEZIONE), row.get_real(RMV_IMPORTO)); + imp2row(imp, riga); // Ci copio l'importo + riga.add(row.get(RMV_DESCR), 2); // e la descrizione della riga contabile + } + + statbar_set_title(TASK_WIN, NULL); // Restore mask mode deleted by query stats +} + +// A partire dal movimento contabile calcola il totale documento ed eventualmente prepara lo sheet +void TMovanal_msk::load_cg_mov() +{ + const TString& numregcg = get(F_NUMREGCG); + const TRectype& mov = cache().get(LF_MOV, numregcg); + set(F_DATAREG, mov.get(MOV_DATAREG)); + if (mode() == MODE_INS) + { + set(F_DATACOMP, mov.get(MOV_DATACOMP)); + set(F_DESCR, mov.get(MOV_DESCR)); + } + set(F_CODCAUS, mov.get(MOV_CODCAUS), 0x2); + set(F_NUMDOC, mov.get(MOV_NUMDOC)); + set(F_DATADOC, mov.get(MOV_DATADOC)); + set(F_TIPODOC, mov.get(MOV_TIPODOC)); + + TImporto totdoc; + TRecord_array cg(numregcg, LF_RMOV); + const bool autoinsert = sfield(F_RIGHE).items() == 0; + for (int i = 1; i <= cg.rows(); i++) + { + const TRectype& row = cg.row(i); + const TBill zio(row); + if (zio.is_analitico()) + { + const TImporto imp(row.get_char(RMV_SEZIONE), row.get_real(RMV_IMPORTO)); + totdoc += imp; + if (autoinsert) + load_cg_row(row); + } + } + set(F_TOTDOC, totdoc.valore()); + const char sez[2] = { totdoc.sezione(), '\0' }; + set(F_SEZIONE, sez); } bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) @@ -91,42 +285,246 @@ bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly return error_box(FR("La data di competenza deve appartenere all'esercizio in corso o al precedente")); } break; - case F_TOTDOC: + case F_RIGHE: + if (e == se_enter) + { + const int r = int(jolly); + aggiorna_saldo_riga(r); + } if (e == fe_close) { - const real imp = o.get(); - const char sez = get(F_SEZIONE)[0]; - const TImporto totdoc(sez, imp); + const TImporto totdoc(get(F_SEZIONE)[0], get_real(F_TOTDOC)); TImporto totrig; TSheet_field& sf = sfield(F_RIGHE); FOR_EACH_SHEET_ROW(sf, i, row) { - const real dare = row->get(0); - const real avere = row->get(); - TImporto imp; - if (dare.is_zero()) - imp.set('A', avere); - else - imp.set('D', dare); + TImporto imp; row2imp(*row, imp); totrig += imp; } if (totrig != totdoc) - return error_box(FR("Il totale delle righe e' %s %s"), - totrig.valore().string(), - totrig.sezione() == 'D' ? TR("Dare") : TR("Avere")); + return error_box(FR("Il totale delle righe e' %s %s, mentre il totale documento e' %s %s"), + totrig.valore().string(), totrig.sezione() == 'D' ? TR("Dare") : TR("Avere"), + totdoc.valore().string(), totdoc.sezione() == 'D' ? TR("Dare") : TR("Avere")); + } + break; + case S_DARE: + case S_AVERE: + if (e == fe_modify) + { + TSheet_field& sf = sfield(F_RIGHE); + if (!o.empty()) + o.mask().reset(o.dlg() == S_DARE ? S_AVERE : S_DARE); + const int r = sfield(F_RIGHE).selected(); + sf.update_row(r); + aggiorna_saldo_riga(r); + } + break; + case F_NUMREGCG: + if (e == fe_init) + { + const bool vuoto = o.empty(); + enable(-5, vuoto); + if (!vuoto) + load_cg_mov(); } break; case F_BLOCCATO: if (e == fe_modify) - show_locked_buttons(); + { + enable(DLG_SAVEREC); // Altrimenti non riesco a registrare la variazione di stato + } + break; + case F_RESET: + if (e == fe_button) + { + TSheet_field& sf = sfield(F_RIGHE); + sf.destroy(); + load_cg_mov(); + sf.force_update(); + } break; default: + if (e == fe_modify && o.dlg() >= S_CDC1 && o.dlg() <= S_CON4) + { + TSheet_field& sf = sfield(F_RIGHE); + const int r = sf.selected(); + sf.update_row(r); + aggiorna_saldo_riga(r); + } break; } return true; } +const TString& TMovanal_msk::somma_campi(TToken_string& row, int first) const +{ + TSheet_field& sheet = sfield(F_RIGHE); + TMask& m = sheet.sheet_mask(); + + const short id = S_DARE + 100 + first; + TString& str = get_tmp_string(20); + TString80 token; + for (int i = 0; i < 4; i++) + { + if (m.id2pos(id+i) < 0) + break; + const TEdit_field& fld = m.efield(id+i); + token = row.get(first+i); + token.left_just(fld.size()); + str << token; + } + return str; +} + +void TMovanal_msk::spezza_campo(const TString& str, TToken_string& row, int first) const +{ + TSheet_field& sheet = sfield(F_RIGHE); + 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; + } +} + +// Prende dalla riga r dello sheet i dati da scrivere nel record rec dei movimenti analitici +bool TMovanal_msk::row2rec(int r, TRectype& rec) const +{ + TSheet_field& sheet = sfield(F_RIGHE); + if (r < 0 || r >= sheet.items()) + return false; + + TToken_string& row = sheet.row(r); + rec.put(RMOVANA_ANNOES, get(F_ANNOES)); + rec.put(RMOVANA_DATAREG, get(F_DATAREG)); + rec.put(RMOVANA_DESCR, row.get(sheet.cid2index(S_DESCR))); + + const real dare = row.get(sheet.cid2index(S_DARE)), avere = row.get(); + if (dare.is_zero()) + { + rec.put(RMOVANA_SEZIONE, 'A'); + rec.put(RMOVANA_IMPORTO, avere); + } + else + { + rec.put(RMOVANA_SEZIONE, 'D'); + rec.put(RMOVANA_IMPORTO, dare); + } + rec.put(RMOVANA_CODCCOSTO, somma_campi(row, sheet.cid2index(S_CDC1))); + rec.put(RMOVANA_CODCMS, somma_campi(row, sheet.cid2index(S_CMS1))); + rec.put(RMOVANA_CODFASE, somma_campi(row, sheet.cid2index(S_FAS1))); + rec.put(RMOVANA_CODCONTO, somma_campi(row, sheet.cid2index(S_CON1))); + + return true; +} + +void TMovanal_msk::imp2row(const TImporto& imp, TToken_string& row) const +{ + row.add(imp.sezione() == 'D' ? imp.valore().string() : "", 0); + row.add(imp.sezione() == 'A' ? imp.valore().string() : "", 1); +} + + +void TMovanal_msk::row2imp(const TToken_string& row, TImporto& imp) const +{ + real dare; row.get(0, dare); + real avere; row.get(1, avere); + if (dare.is_zero()) + imp.set('A', avere); + else + imp.set('D', dare); +} + +bool TMovanal_msk::row2imp(int r, TImporto& imp) const +{ + TSheet_field& sf = sfield(F_RIGHE); + if (r >= 0 && r < sf.items()) + { + const TToken_string& row = sf.row(r); + row2imp(row, imp); + } + else + imp.set('D', ZERO); + return !imp.is_zero(); +} + +const TToken_string& TMovanal_msk::rec2key(const TRectype& rec) const +{ + TToken_string& key = get_tmp_string(); + key = get(F_TIPO); + key.add(rec.get(RMOVANA_ANNOES)); + key.add(rec.get(RMOVANA_CODCCOSTO)); + key.add(rec.get(RMOVANA_CODCMS)); + key.add(rec.get(RMOVANA_CODFASE)); + key.add(rec.get(RMOVANA_CODCONTO)); + return key; +} + +void TMovanal_msk::reset_saldi() +{ + _saldi.destroy(); +} + +TImporto& TMovanal_msk::saldo(const TRectype& rec) +{ + const TToken_string& key = rec2key(rec); + TImporto* imp = (TImporto*)_saldi.objptr(key); + if (imp == NULL) + { + const TRectype& saldo = cache().get(LF_SALDANA, key); + const char* fld_sez = NULL; + const char* fld_val = NULL; + switch (get(F_TIPO)[0]) + { + case 'P': fld_sez = SALDANA_SEZIONEP; fld_val = SALDANA_SALDOP; break; + case 'V': fld_sez = SALDANA_SEZIONEV; fld_val = SALDANA_SALDOV; break; + default : fld_sez = SALDANA_SEZIONE; fld_val = SALDANA_SALDO; break; + } + imp = new TImporto(saldo.get_char(fld_sez), saldo.get_real(fld_val)); + _saldi.add(key, imp); + } + return *imp; +} + +void TMovanal_msk::aggiorna_saldo_riga(int r) +{ + TRectype rec(LF_RMOVANA); + row2rec(r, rec); + const TToken_string& key = rec2key(rec); + + TImporto sld = saldo(rec); + + TSheet_field& sheet = sfield(F_RIGHE); + FOR_EACH_SHEET_ROW(sheet, i, row) + { + row2rec(i, rec); + const TToken_string& k = rec2key(rec); + if (k == key) + { + real dare; row->get(0, dare); + real avere; row->get(1, avere); + if (dare.is_zero()) + sld += TImporto('A', avere); + else + sld += TImporto('D', dare); + } + } + + sld.normalize(); + set(F_DARE, sld.sezione() == 'D' ? sld.valore() : ZERO); + set(F_AVERE, sld.sezione() == 'A' ? sld.valore() : ZERO); +} + TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a") { TSheet_field& sf = sfield(F_RIGHE); @@ -157,6 +555,36 @@ TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a") 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); + + switch (100+(f.dlg()%100)) + { + case S_CDC1: + case S_CDC2: + case S_CDC3: + case S_CDC4: + f.check_type(ini.get_bool("CdcRequired") ? CHECK_REQUIRED : CHECK_NORMAL); + break; + case S_CMS1: + case S_CMS2: + case S_CMS3: + case S_CMS4: + f.check_type(ini.get_bool("CmsRequired") ? CHECK_REQUIRED : CHECK_NORMAL); + break; + case S_FAS1: + case S_FAS2: + case S_FAS3: + case S_FAS4: + f.check_type(ini.get_bool("FscRequired") ? CHECK_REQUIRED : CHECK_NORMAL); + break; + case S_CON1: + case S_CON2: + case S_CON3: + case S_CON4: + f.check_type(ini.get_bool("PdciRequired") ? CHECK_REQUIRED : CHECK_NORMAL); + break; + default: + break; + } } else { @@ -165,31 +593,9 @@ TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a") } } -class TMovanal_app : public TRelation_application -{ - TRelation* _rel; - TMovanal_msk* _msk; - -protected: - virtual bool user_create(); - virtual bool user_destroy(); - virtual TMask* get_mask(int); - virtual TRelation* get_relation() const; - - const TString& somma_campi(TToken_string& row, int first) const; - void spezza_campo(const TString& str, TToken_string& row, int first) const; - int write_rows(const TMask& m); - void read_rows(const TMask& m); - - virtual bool protected_record(TRectype& rec); - virtual int write(const TMask& m); - virtual int rewrite(const TMask& m); - virtual int read(TMask& m); - - virtual void init_query_mode(TMask& m); - virtual void init_insert_mode(TMask& m); - virtual void init_modify_mode(TMask& m); -}; +/////////////////////////////////////////////////////////// +// TMovanal_app +/////////////////////////////////////////////////////////// TMask* TMovanal_app::get_mask(int) { @@ -201,82 +607,31 @@ TRelation* TMovanal_app::get_relation() const return _rel; } -const TString& TMovanal_app::somma_campi(TToken_string& row, int first) const -{ - TSheet_field& sheet = _msk->sfield(F_RIGHE); - 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); - token.left_just(fld.size()); - str << token; - } - return str; +bool TMovanal_app::get_next_key(TToken_string& key) +{ + long num = 1; + TLocalisamfile movana(LF_MOVANA); + if (movana.last() == NOERR) + num += movana.get_long(MOVANA_NUMREG); + key.format("%d|%ld", F_NUMREG, num); + return true; } -int TMovanal_app::write_rows(const TMask& m) +void TMovanal_app::write_rows(const TMask& m) { TAnal_mov& mov = (TAnal_mov&)_rel->curr(); mov.destroy_rows(); - TSheet_field& sheet = _msk->sfield(F_RIGHE); - - // Calcola le posizioni dei campi multilivello generati - const int pos_cdc = sheet.cid2index(S_CDC1); - const int pos_cms = sheet.cid2index(S_CMS1); - const int pos_fas = sheet.cid2index(S_FAS1); - const int pos_con = sheet.cid2index(S_CON1); - // Scandisce lo sheet e riempie il recarray + TSheet_field& sheet = _msk->sfield(F_RIGHE); FOR_EACH_SHEET_ROW(sheet, i, row) { - TRectype& rec = mov.new_row(); // Crea una riga nuova - rec.put(RMOVANA_ANNOES, m.get(F_ANNOES)); - rec.put(RMOVANA_DATAREG, m.get(F_DATAREG)); - rec.put(RMOVANA_DESCR, row->get(sheet.cid2index(S_DESCR))); - const real dare = row->get(0), avere = row->get(); - if (!avere.is_zero()) - { - rec.put(RMOVANA_SEZIONE, 'A'); - rec.put(RMOVANA_IMPORTO, avere); - } - else - { - rec.put(RMOVANA_SEZIONE, 'D'); - rec.put(RMOVANA_IMPORTO, dare); - } - rec.put(RMOVANA_CODCCOSTO, somma_campi(*row, pos_cdc)); - rec.put(RMOVANA_CODCMS, somma_campi(*row, pos_cms)); - rec.put(RMOVANA_CODFASE, somma_campi(*row, pos_fas)); - rec.put(RMOVANA_CODCONTO, somma_campi(*row, pos_con)); - } - return NOERR; -} - -void TMovanal_app::spezza_campo(const TString& str, TToken_string& row, int first) const -{ - TSheet_field& sheet = _msk->sfield(F_RIGHE); - 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; + if (dare.is_zero() && avere.is_zero()) // Scarta righe vuote + continue; + + TRectype& rec = mov.new_row(); // Crea una riga nuova + _msk->row2rec(i, rec); } } @@ -287,14 +642,13 @@ void TMovanal_app::read_rows(const TMask& m) TSheet_field& sheet = m.sfield(F_RIGHE); sheet.destroy(); + _msk->reset_saldi(); for (int i = 1; i <= a.rows(); i++) { const TRectype& rec = a.row(i); TToken_string& row = sheet.row(i-1); - const char sez = rec.get_char(RMOVANA_SEZIONE); - const real imp = rec.get(RMOVANA_IMPORTO); - row.add(sez == 'D' ? imp.string() : ""); - row.add(sez == 'A' ? imp.string() : ""); + const TImporto imp(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO)); + _msk->imp2row(imp, row); row.add(rec.get(RMOVANA_DESCR)); // Calcola le posizioni dei campi multilivello generati @@ -302,10 +656,13 @@ void TMovanal_app::read_rows(const TMask& m) const int pos_cms = sheet.cid2index(S_CMS1); const int pos_fas = sheet.cid2index(S_FAS1); const int pos_con = sheet.cid2index(S_CON1); - spezza_campo(rec.get(RMOVANA_CODCCOSTO), row, pos_cdc); - spezza_campo(rec.get(RMOVANA_CODCMS), row, pos_cms); - spezza_campo(rec.get(RMOVANA_CODFASE), row, pos_fas); - spezza_campo(rec.get(RMOVANA_CODCONTO), row, pos_con); + _msk->spezza_campo(rec.get(RMOVANA_CODCCOSTO), row, pos_cdc); + _msk->spezza_campo(rec.get(RMOVANA_CODCMS), row, pos_cms); + _msk->spezza_campo(rec.get(RMOVANA_CODFASE), row, pos_fas); + _msk->spezza_campo(rec.get(RMOVANA_CODCONTO), row, pos_con); + + TImporto& sld = _msk->saldo(rec); + sld -= imp; } } @@ -316,24 +673,14 @@ bool TMovanal_app::protected_record(TRectype& rec) int TMovanal_app::write(const TMask& m) { - int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR; - if (err == NOERR) - { - write_rows(m); - err = TRelation_application::write(m); - } - return err; + write_rows(m); + return TRelation_application::write(m); } int TMovanal_app::rewrite(const TMask& m) { - int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR; - if (err == NOERR) - { - write_rows(m); - err = TRelation_application::rewrite(m); - } - return err; + write_rows(m); + return TRelation_application::rewrite(m); } int TMovanal_app::read(TMask& m) diff --git a/ca/ca2100a.h b/ca/ca2100a.h index 0e802eabc..2a86ec7d1 100755 --- a/ca/ca2100a.h +++ b/ca/ca2100a.h @@ -1,27 +1,29 @@ -#define F_NUMREG 101 -#define F_ANNOES 102 -#define F_DESCR 103 -#define F_DATAREG 104 -#define F_DATACOMP 105 -#define F_DATADOC 106 -#define F_CODDITTA 107 -#define F_RAGSOC 108 -#define F_TIPODOC 109 -#define F_SEZIONE 110 -#define F_TOTDOC 111 -#define F_NUMREGCG 112 -#define F_CODCAUS 113 -#define F_DESCAUS 114 -#define F_DARE 115 -#define F_AVERE 116 -#define F_BLOCCATO 117 -#define F_TIPO 118 +#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_CODDITTA 207 +#define F_RAGSOC 208 +#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_NUMREG2 201 -#define F_ANNOES2 202 -#define F_DATAREG2 203 -#define F_DESCR2 204 -#define F_RIGHE 300 +#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 diff --git a/ca/ca2100a.uml b/ca/ca2100a.uml index 2cfee9c63..addcc160f 100755 --- a/ca/ca2100a.uml +++ b/ca/ca2100a.uml @@ -15,9 +15,9 @@ END NUMBER F_CODDITTA 5 BEGIN - PROMPT 3 2 "Codice " + PROMPT 2 2 "" FLAGS "DFR" - USE LF_NDITTE KEY 1 + USE LF_NDITTE INPUT CODDITTA F_CODDITTA OUTPUT F_RAGSOC RAGSOC CHECKTYPE NORMAL @@ -25,7 +25,7 @@ END STRING F_RAGSOC 50 52 BEGIN - PROMPT 17 2 "" + PROMPT 9 2 "Ragione sociale " FLAGS "D" END @@ -34,25 +34,37 @@ BEGIN PROMPT 1 4 "@bTestata" END +LIST F_TIPO 1 25 +BEGIN + PROMPT 2 5 "Tipo movimento " + ITEM " |Normale" + ITEM "P|Preventivo" + ITEM "V|Variazione preventivo" + FIELD TIPOMOV +END + DATE F_DATAREG BEGIN - PROMPT 2 5 "Data di registrazione " + PROMPT 2 6 "Data di registrazione " CHECKTYPE REQUIRED MESSAGE COPY,F_DATAREG2 FIELD DATAREG FLAGS "A" WARNING "La data di registrazione non appartiene ad un esercizio valido" + GROUP 5 END NUMBER F_NUMREG 7 BEGIN - PROMPT 52 5 "Movimento n. " + PROMPT 52 6 "Movimento n. " USE LF_MOVANA 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 "Descrizione@50" DESCR OUTPUT F_NUMREG NUMREG CHECKTYPE REQUIRED @@ -63,37 +75,19 @@ END DATE F_DATACOMP BEGIN - PROMPT 2 6 "Data di competenza " + PROMPT 2 7 "Data di competenza " FIELD DATACOMP WARNING "La data di competenza non appartiene ad un esercizio valido" END NUMBER F_ANNOES 4 BEGIN - PROMPT 52 6 "Esercizio " + PROMPT 52 7 "Esercizio " FIELD ANNOES MESSAGE COPY,F_ANNOES2 FLAGS "DG" END -DATE F_DATADOC -BEGIN - PROMPT 2 7 "Data del documento " - FIELD DATADOC -END - -STRING F_TIPODOC 2 -BEGIN - PROMPT 42 7 "Tipo documento " - USE %TPD - INPUT CODTAB F_TIPODOC - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@60" S0 - OUTPUT F_TIPODOC CODTAB - CHECKTYPE NORMAL - FIELD TIPODOC -END - STRING F_DESCR 50 BEGIN PROMPT 2 8 "Descrizione " @@ -109,14 +103,16 @@ END NUMBER F_NUMREGCG 7 BEGIN PROMPT 2 11 "Numero " - FLAGS "D" + FLAGS "DG" FIELD NUMREGCG + MESSAGE EMPTY ENABLE,F_TIPO|HIDE,F_RESET + MESSAGE DISABLE,F_TIPO|SHOW,F_RESET END STRINGA F_CODCAUS 3 BEGIN PROMPT 19 11 "Causale " - USE LF_CAUSALI + USE LF_CAUSALI SELECT MOVIND!='' INPUT CODCAUS F_CODCAUS DISPLAY "Codice" CODCAUS DISPLAY "Descrizione@50" DESCR @@ -124,17 +120,47 @@ BEGIN OUTPUT F_DESCAUS DESCR CHECKTYPE REQUIRED FIELD CODCAUS + GROUP 5 END STRINGA F_DESCAUS 50 40 BEGIN PROMPT 34 11 "" - USE LF_CAUSALI KEY 2 + USE LF_CAUSALI KEY 2 SELECT MOVIND!='' INPUT DESCR F_DESCAUS DISPLAY "Descrizione@50" DESCR DISPLAY "Codice" CODCAUS COPY OUTPUT F_CODCAUS CHECKTYPE REQUIRED + GROUP 5 +END + +STRING F_TIPODOC 2 +BEGIN + PROMPT 2 12 "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 5 +BEGIN + PROMPT 27 12 "Numero " + CHECKTYPE NORMAL + FIELD NUMDOC + GROUP 5 +END + +DATE F_DATADOC +BEGIN + PROMPT 48 12 "Data " + FIELD DATADOC + GROUP 5 END GROUPBOX DLG_NULL 78 4 @@ -142,27 +168,20 @@ BEGIN PROMPT 1 14 "@bMovimento" END -LIST F_TIPO 1 25 -BEGIN - PROMPT 2 15 "Tipo " - ITEM " |Normale" - ITEM "P|Preventivo" - ITEM "V|Variazione preventivo" - FIELD TIPOMOV -END - CURRENCY F_TOTDOC 18 BEGIN - PROMPT 2 16 "Totale documento " + PROMPT 2 15 "Totale documento " FIELD TOTDOC + GROUP 5 END LISTBOX F_SEZIONE 1 5 BEGIN - PROMPT 39 16 "" + PROMPT 39 15 "" ITEM "D|Dare" ITEM "A|Avere" FIELD SEZIONE + GROUP 5 END BOOLEAN F_BLOCCATO @@ -177,48 +196,48 @@ PAGE "Righe" -1 -1 80 20 GROUPBOX DLG_NULL 78 4 BEGIN - PROMPT 1 1 "@bMovimento" + PROMPT 1 0 "@bMovimento" END NUMBER F_NUMREG2 7 BEGIN - PROMPT 2 2 "Numero " + PROMPT 2 1 "Numero " FLAGS "D" END NUMBER F_DATAREG2 7 BEGIN - PROMPT 22 2 "Data registrazione " + PROMPT 22 1 "Data registrazione " FLAGS "D" END NUMBER F_ANNOES2 7 BEGIN - PROMPT 59 2 "Esercizio " + PROMPT 59 1 "Esercizio " FLAGS "D" END STRING F_DESCR2 50 BEGIN - PROMPT 2 3 "Descrizione " + PROMPT 2 2 "Descrizione " FLAGS "D" END CURRENCY F_DARE 18 BEGIN - PROMPT 1 5 "Saldo riga corrente: Dare " + PROMPT 2 4 "Saldo riga corrente: Dare " FLAGS "D" END CURRENCY F_AVERE 18 BEGIN - PROMPT 41 5 "Avere " + PROMPT 52 4 "Avere " FLAGS "D" END -SPREADSHEET F_RIGHE +SPREADSHEET F_RIGHE -1 -2 BEGIN - PROMPT 0 6 "" + PROMPT 0 5 "" ITEM "Dare@15" ITEM "Avere@15" ITEM "Descrizione@30" @@ -240,6 +259,12 @@ BEGIN ITEM "Con 4" END +BUTTON F_RESET 78 2 +BEGIN + PROMPT -11 -1 "Rigenera le righe in base alle tabelle di ripartizione" + FLAGS "H" +END + ENDPAGE ENDMASK diff --git a/ca/calib01.cpp b/ca/calib01.cpp index 62b1b4bfd..411b34779 100755 --- a/ca/calib01.cpp +++ b/ca/calib01.cpp @@ -1,9 +1,10 @@ -#include "calib01.h" -#include "calibmsk.h" - +#include #include #include +#include "calib01.h" +#include "calibmsk.h" + #include "movana.h" #include "rmovana.h" #include "saldana.h" @@ -959,6 +960,7 @@ void TAnal_mov::load_saldi(bool reset) if (reset) _saldi.destroy(); + const int dec = TCurrency::get_firm_dec(); const TRecord_array& a = body(LF_RMOVANA); for (int i = a.last_row(); i > 0; i--) { @@ -969,6 +971,7 @@ void TAnal_mov::load_saldi(bool reset) sld -= imp; else sld += imp; + sld.valore().round(dec); } } @@ -985,12 +988,12 @@ void TAnal_mov::update_saldi(bool kill) load_saldi(true); } -void TAnal_mov::save_saldi() +bool TAnal_mov::save_saldi() { TLocalisamfile saldi(LF_SALDANA); FOR_EACH_ASSOC_OBJECT(_saldi, h, k, o) { - const TImporto& imp = (const TImporto&)o; + const TImporto& imp = *(const TImporto*)o; if (!imp.is_zero()) { TToken_string key = k; @@ -1009,26 +1012,33 @@ void TAnal_mov::save_saldi() saldi.put(SALDANA_COMMESSA, key.get()); saldi.put(SALDANA_FASE, key.get()); saldi.put(SALDANA_CONTO, key.get()); - saldi.write(); + err = saldi.write(); } - const char* fld_sez = NULL; - const char* fld_val = NULL; - switch (tipo) + if (err == NOERR) { - case 'P': fld_sez = SALDANA_SEZIONEP; fld_val = SALDANA_SEZIONEP; break; - case 'V': fld_sez = SALDANA_SEZIONEV; fld_val = SALDANA_SEZIONEV; break; - default : fld_sez = SALDANA_SEZIONE; fld_val = SALDANA_SEZIONE; break; - } - TImporto saldo(saldi.get_char(fld_sez), saldi.get_real(fld_val)); - saldo += imp; - saldo.normalize(); + const char* fld_sez = NULL; + const char* fld_val = NULL; + switch (tipo) + { + case 'P': fld_sez = SALDANA_SEZIONEP; fld_val = SALDANA_SALDOP; break; + case 'V': fld_sez = SALDANA_SEZIONEV; fld_val = SALDANA_SALDOV; break; + default : fld_sez = SALDANA_SEZIONE; fld_val = SALDANA_SALDO; break; + } + TImporto saldo(saldi.get_char(fld_sez), saldi.get_real(fld_val)); + saldo += imp; + saldo.normalize(); - saldi.put(fld_sez, saldo.sezione()); - saldi.put(fld_val, saldo.valore()); - saldi.rewrite(); + saldi.put(fld_sez, saldo.sezione()); + saldi.put(fld_val, saldo.valore()); + err = saldi.rewrite(); + } + + if (err != NOERR) + return error_box(TR("Impossibile aggiornare i saldi")); } } + return true; } int TAnal_mov::readat(TBaseisamfile& f, TRecnotype nrec, word lockop) @@ -1059,9 +1069,7 @@ int TAnal_mov::rewrite(TBaseisamfile& f) const { const int err = TMultiple_rectype::rewrite(f); if (err == NOERR) - { ((TAnal_mov*)this)->update_saldi(false); - } return err; } @@ -1081,7 +1089,7 @@ int TAnal_mov::read(long numreg, word lock) TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA) { - add_file(LF_RMOVANA, "NUMRIG"); + add_file(LF_RMOVANA, RMOVANA_NUMRIG); if (numreg > 0) read(numreg); } diff --git a/ca/calib01.h b/ca/calib01.h index b2f8d1e35..8d2f9b33c 100755 --- a/ca/calib01.h +++ b/ca/calib01.h @@ -119,7 +119,7 @@ protected: TImporto& saldo(const TRectype& rec); void load_saldi(bool reset); void update_saldi(bool kill); - void save_saldi(); + bool save_saldi(); public: virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop); diff --git a/ca/f107.dir b/ca/f107.dir index 8e19be4c4..05e170bf5 100755 --- a/ca/f107.dir +++ b/ca/f107.dir @@ -1,3 +1,3 @@ 107 0 -$movana|1|1|152|0|Movimenti di Analitica||| +$movana|1|2|152|0|Movimenti di Analitica||| diff --git a/ca/f107.trr b/ca/f107.trr index 7a3c12403..0a866613d 100755 --- a/ca/f107.trr +++ b/ca/f107.trr @@ -17,6 +17,7 @@ CAMBIO|4|15|6|Cambio della valuta TOTDOC|4|18|3|Totale documento SEZIONE|1|1|0|Sezione del totale documento BLOCCATO|8|1|0|Movimento bloccato -2 +3 NUMREG| DATAREG+NUMREG|X +NUMREGCG| diff --git a/ca/saldana.h b/ca/saldana.h index 449b55a8f..6b6743386 100755 --- a/ca/saldana.h +++ b/ca/saldana.h @@ -2,10 +2,10 @@ #define __SALDANA_H #define SALDANA_ANNO "ANNO" -#define SALDANA_COSTO "CODCCOSTO" -#define SALDANA_COMMESSA "CODCMS" -#define SALDANA_FASE "CODFASE" -#define SALDANA_CONTO "CODCONTO" +#define SALDANA_COSTO "COSTO" +#define SALDANA_COMMESSA "COMMESSA" +#define SALDANA_FASE "FASE" +#define SALDANA_CONTO "CONTO" #define SALDANA_SEZIONE "SEZIONE" #define SALDANA_SALDO "SALDO"