diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index e5e83b425..659fa30b8 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -1,1092 +1,1093 @@ -#include -#include -#include -#include -#include - -#include "pagament.h" - -#include "cg2100.h" -#include "cg2102.h" -#include "cg21sld.h" - -// Nomi dei campi -#include -#include -#include - -TPrimanota_application::TPrimanota_application() -: _rel(NULL), _lastreg(0), _mode(0), _iva(nessuna_iva), _causale(NULL), _giornale(NULL) -{ - memset(_msk, 0, sizeof(_msk)); -} - - -TMask* TPrimanota_application::load_mask(int n) -{ - if (_msk[n] != NULL) - return _msk[n]; - - if (n == 1 || n == 2) - { - const int d = 3-n; - if (_msk[d] != NULL) - { - delete _msk[d]; - _msk[d] = NULL; - } - } - - TFilename name("cg2100"); name << char(n == 3 ? 'o' : 'a'+n); - TMask* m = new TMask(name); - - switch (n) - { - case 0: - if (m) - { - m->set_handler(F_NUMREG, num_handler); - m->set_handler(F_CODCAUS, caus_query_handler); - m->set_handler(F_DATAREG, datareg_handler); - m->set_handler(F_DATACOMP, datacomp_handler); - - TConfig c(CONFIG_STUDIO, "cg"); - - // Scelta primo campo col focus - _firstfocus = c.get_bool("PoCuDr") ? F_DATAREG : F_CODCAUS; - m->first_focus(_firstfocus); - - // Registra e inserisci immediatamente un nuovo movimento - _savenew = !c.get_bool("Cg21SN"); - } - break; - case 2: - if (m) - { - m->set_handler(F_DATADOC, doc_handler); - m->set_handler(F_NUMDOC, doc_handler); - m->set_handler(F_DATA74TER, data74ter_handler); - m->set_handler(F_PROTIVA, protiva_handler); - m->set_handler(F_CLIENTE, clifo_handler); - m->set_handler(F_FORNITORE, clifo_handler); - m->set_handler(F_TOTALE, totale_handler); - m->set_handler(F_RITFIS, ritfis_handler); - m->set_handler(F_RITSOC, ritsoc_handler); - m->set_handler(F_CORRLIRE, corrlire_handler); - m->set_handler(F_CORRVALUTA, corrvaluta_handler); - m->set_handler(F_CODIVA, main_codiva_handler); - m->set_handler(F_OCCASEDIT, occas_handler); - m->set_handler(F_SOLAIVA, solaiva_handler); - m->set_handler(F_SHEETIVA, iva_handler); - m->set_handler(F_CODPAG, codpag_handler); - - TSheet_field& is = (TSheet_field&)m->field(F_SHEETIVA); - is.set_notify(iva_notify); - TMask& ism = is.sheet_mask(); - ism.set_handler(101, imponibile_handler); - ism.set_handler(102, codiva_handler); - ism.set_handler(103, detrazione_handler); - ism.set_handler(104, imposta_handler); - ism.set_handler(109, iva_sottoconto_handler); - ism.set_handler(209, sheet_clifo_handler); - ism.set_handler(309, sheet_clifo_handler); - - // add saldaconto - TSheet_field& ps = (TSheet_field&)m->field(FS_RATESHEET); - ps.set_notify(pag_notify); - - } - _iva_showed = FALSE; - case 1: - if (m) - { - m->first_focus(_firstfocus); - m->set_handler(F_DATAREG, datareg_handler); - m->set_handler(F_DATACOMP, datacomp_handler); - m->set_handler(F_DESCR, descr_handler); - m->set_handler(F_CODCAUS, caus_modify_handler); - m->set_handler(F_SHEETCG, cg_handler); - m->set_handler(F_CAMBIO, cambio_handler); - m->set_handler(F_VISVAL, visval_handler); - - TSheet_field& cg = (TSheet_field&)m->field(F_SHEETCG); - cg.set_notify(cg_notify); - TMask& cgm = cg.sheet_mask(); - - if (n == 1) // movimento non IVA - { - m->set_handler(S_TOTDOC, totdoc_handler); - m->set_handler(S_SPESE, speserimb_handler); - m->set_handler(S_ALSPESE, altrespese_handler); - m->set_handler(S_ABBATT, abbatt_handler); - m->set_handler(S_ABBPASS, abbpass_handler); - m->set_handler(S_RITPROF, ritprof_handler); - m->set_handler(S_DIFFCAMB, diffcamb_handler); - } - - cgm.set_handler(101, dareavere_handler); - cgm.set_handler(102, dareavere_handler); - cgm.set_handler(105, cg_conto_handler); - cgm.set_handler(106, suspended_handler); - cgm.set_handler(206, sheet_clifo_handler); - cgm.set_handler(306, sheet_clifo_handler); - cgm.set_handler(112, suspended_handler); - cgm.set_handler(113, suspended_handler); - cgm.set_handler(213, sheet_clifo_handler); - cgm.set_handler(313, sheet_clifo_handler); - } - break; - case 3: - m->set_handler(O_CODICE, occas_code_handler); - break; - default: - CHECKD(0, "Che cavolo di maschera e' la ", n); - break; - } - - return _msk[n] = m; -} - - -bool TPrimanota_application::user_create() -{ - _tabcom = new TLocalisamfile(LF_TABCOM); - _tab = new TLocalisamfile(LF_TAB); - _caus = new TLocalisamfile(LF_CAUSALI); - _rcaus = new TLocalisamfile(LF_RCAUSALI); - _clifo = new TLocalisamfile(LF_CLIFO); - _pcon = new TLocalisamfile(LF_PCON); - _attiv = new TLocalisamfile(LF_ATTIV); - _saldo = new TLocalisamfile(LF_SALDI); - _comuni = new TLocalisamfile(LF_COMUNI); - _occas = new TLocalisamfile(LF_OCCAS); - _nditte = new TLocalisamfile(LF_NDITTE); - _scadenze = new TLocalisamfile(LF_SCADENZE); - - _rel = new TMovimentoPN; - _rel->add(LF_PARTITE, "NREG=NUMREG", 2); - - _causale = new TCausale(); - _giornale = new TLibro_giornale(); - - set_search_field(F_NUMREG); // Set field for default search - - _pag = NULL; - _pag_rows = NULL; - _is_saldaconto = FALSE; - - load_mask(0); - - return TRUE; -} - - -bool TPrimanota_application::save_and_new() const -{ return _savenew; } - - -bool TPrimanota_application::user_destroy() -{ - for (int m = 3; m >= 0; m--) - if (_msk[m] != NULL) delete _msk[m]; - - if (_pag) delete _pag; - - delete _giornale; - delete _causale; - delete _rel; - - delete _scadenze; - delete _nditte; - delete _occas; - delete _comuni; - delete _saldo; - delete _attiv; - delete _pcon; - delete _clifo; - delete _rcaus; - delete _caus; - delete _tab; - delete _tabcom; - - - return TRUE; -} - -// Legge la causale di codice cod ed il relativo registro dell'anno year -// Certified 99% -bool TPrimanota_application::read_caus(const char* cod, int year) -{ - bool ok = TRUE; - - if (cod != NULL) - ok = causale().read(cod, year); - - bool nob = FALSE, dob = FALSE; - TipoIVA iva = nessuna_iva; - _is_saldaconto = FALSE; - - if (ok) - { - _is_saldaconto = gestione_saldaconto() && causale().saldaconto(); - dob = _is_saldaconto | causale().data_doc(); - nob = _is_saldaconto | causale().num_doc(); - iva = causale().iva(); - } - - TMask* m = _msk[iva == nessuna_iva ? 1 : 2]; - if (m == NULL) return TRUE; - - const bool ins = m->insert_mode(); - - m->efield(F_NUMDOC).check_type(nob ? CHECK_REQUIRED : CHECK_NORMAL); // Num. doc. obbligatorio - m->efield(F_DATADOC).check_type(dob ? CHECK_REQUIRED : CHECK_NORMAL); // Data doc. obbligatoria - - if (iva == nessuna_iva) - { - TMask& cgm = cgs().sheet_mask(); - cgm.set_handler(100, _is_saldaconto ? showpartite_handler : NULL); // bottoncino riga - cgm.enable(100, _is_saldaconto); - } - else - { - m->enable_page(2, _is_saldaconto); - - m->efield(F_CODPAG).check_type(_is_saldaconto ? CHECK_REQUIRED : CHECK_NORMAL);// Cod. pag. obbligatorio - - m->show(F_ANNORIF, _is_saldaconto); // Mostra/nasconde anno e riferimento partita - m->show(F_NUMRIF, _is_saldaconto); - - m->enable(F_ANNORIF, ins); // Dis/abilita anno e riferimento partita - m->enable(F_NUMRIF, ins); - m->field(F_NUMRIF).set_justify(iva == iva_acquisti ? _num_for : _num_cli); - - const bool av = causale().reg().agenzia_viaggi(); - m->show(F_DATA74TER, av); - if (!av) m->reset(F_DATA74TER); - - if (ins) - { - const long protiva = causale().reg().protocol() + 1; - m->set(F_PROTIVA, protiva); // Aggiorna protocollo IVA - } - } - - if (ins && !ci_sono_importi()) - { - cgs().reset(); - for (int i = 1; i < causale().size(); i++) - { - const TRectype* rcaus = (TRectype*)causale().objptr(i); - if (rcaus == NULL) continue; // Evita eventuali righe nulle - - const int nriga = rcaus->get_int(RCA_NRIGA); - if (nriga < 1) continue; // Considera solo righe reali (non riempimenti) - - TBill tc; causale().bill(nriga, tc); - if (tc.gruppo() < 1) continue; // Considera solo gruppi validi - - if (tc.tipo() > ' ' && tc.ok()) - { - const TBill clifo(0, 0, tc.sottoconto(), tc.tipo()); - if (clifo.conto() != 0) - tc = clifo; - } - - int err = 0; - if (tc.descrizione() == "Sconosciuto") err = 1; else - if (tc.sospeso()) err = 2; - - if (err) - { - error_box("Il conto della riga %d della causale e' %s", - i, err == 1 ? "sconosciuto" : "sospeso"); - continue; - } - - const char sezione = rcaus->get_char(RCA_SEZIONE); - const TImporto zero('D', ZERO); - const TString80 desc(causale().desc_agg(i)); - - if (nriga == 1) m->set(F_DESCR, desc); - - if (iva == nessuna_iva) - { - char tipr = ' '; - if (_is_saldaconto) - { - if (nriga < 8) continue; // non si cagano gli importi totali - switch(nriga) - { - case 8: - tipr = 'P'; break; - case 9: - tipr = 'A'; break; - case 10: - tipr = 'G'; break; - case 11: - tipr = 'R'; break; - default: - tipr = ' '; break; - } - } - const int pos = set_cgs_row(-1,zero,tc,desc,tipr); - if (sezione > ' ') - cgs().disable_cell(pos, sezione == 'A' ? 0 : 1); - } - else - { - if (nriga >= 2 && nriga <= 9) - continue; // Conti per IVA detraibile e non, ritenute sociali e fiscali - - const char tipo = nriga == 1 ? 'T' : ' '; - if (nriga == 1 && tc.tipo() > ' ' && tc.ok()) - m->set(tc.tipo() == 'C' ? F_CLIENTE : F_FORNITORE, tc.sottoconto()); - set_cgs_row(-1,zero,tc,desc,tipo); - } - } - fill_sheet(*m); - } - - return ok; -} - - -// Certified 100% -void TPrimanota_application::print() -{ - TExternal_app stampa("cg3 -0"); - stampa.run(); -} - - -bool TPrimanota_application::changing_mask(int mode) -{ - if (mode == MODE_QUERY) - { - const bool flag = _mode != MODE_QUERY; - -#if XVT_OS == XVT_OS_WIN - if (flag && _iva != nessuna_iva && !_iva_showed) - { - WINDOW w = ivas().parent(); -#if XVT_OS == 400 - xvt_vobj_set_visible(w, TRUE); - xvt_vobj_raise(w); - xvt_app_process_pending_events(); - xvt_vobj_set_visible(w, FALSE); -#else - show_window(w, TRUE); - set_front_window(w); - process_events(); - show_window(w, FALSE); -#endif - _iva_showed = TRUE; - } -#endif - return flag; - } - _iva = iva_errata; - return TRUE; -} - - -TMask* TPrimanota_application::get_mask(int mode) -{ - int annoes = 0, annoiva = 0; - TString16 caus; - - _mode = mode; - - switch (mode) - { - case MODE_INS: - annoes = _msk[0]->get_int(F_ANNOES); - annoiva = _msk[0]->get_int(F_ANNOIVA); - caus = _msk[0]->get(F_CODCAUS); - break; - case MODE_MOD: - annoes = _rel->lfile().get_int("ANNOES"); - annoiva = _rel->lfile().get_int("ANNOIVA"); - caus = _rel->lfile().get("CODCAUS"); - break; - default: - return load_mask(0); - } - - if (giornale().year() != annoes) - giornale().read(annoes); - - if (caus != causale().codice() || causale().reg().year() != annoiva) - causale().read(caus, annoiva); - _iva = causale().iva(); - - return load_mask(_iva == nessuna_iva ? 1 : 2); -} - - -void TPrimanota_application::on_firm_change() -{ - _rel->lfile().last(); - _lastreg = _rel->lfile().get_long(MOV_NUMREG); // Init last registration number -} - -void TPrimanota_application::on_config_change() -{ - TConfig cnf(CONFIG_DITTA); - _ges_val = cnf.get_bool("GesVal"); - _ges_sal = cnf.get_bool("GesSal"); - _num_cli = cnf.get_bool("NrCliDx"); - _num_for = cnf.get_bool("NrForDx"); -} - - -void TPrimanota_application::init_mask(TMask& m) -{ - disable_menu_item(M_FILE_PRINT); - - read_caus(NULL, 0); // Setta campi obbligatori - fill_sheet(m); - - const bool valintra = causale().valintra(); - const bool corrisp = causale().corrispettivi(); - - if (_iva == nessuna_iva) - { - m.enable(-5, _is_saldaconto); // Abilita campi saldaconto - } - else - { - char clig, forg; - if (_iva == iva_acquisti) - { - forg = 's'; - clig = 'h'; - } - else - { - forg = 'h'; - clig = corrisp ? 'h' : 's'; - } - m.send_key(K_SHIFT+K_CTRL+clig, -1); // GROUP 1 (clienti) - m.send_key(K_SHIFT+K_CTRL+forg, -2); // GROUP 2 (fornitori) - if (corrisp) m.hide(F_STATOPAIV); - - // Show/Hide campi valuta: F_VALUTAINTRA, F_CAMBIOINTRA, F_CORRLIRE, F_CORRVAL (GROUP 4) - m.show(-4, valintra); - - m.show(F_CODIVA, m.mode() == MODE_INS); // Codice IVA standard - } - - // Show/Hide campi valuta: F_VALUTA, F_CAMBIO, F_VISVAL (GROUP 3) - const bool valuta = _ges_val && causale().valuta(); - m.show(-3, valuta); -} - -void TPrimanota_application::init_query_mode(TMask& m) -{ - enable_menu_item(M_FILE_PRINT); -} - - -void TPrimanota_application::fill_sheet(TMask& m) const -{ - TSheet_field& cgs = (TSheet_field&)m.field(F_SHEETCG); - for (int r = cgs.items(); r < 16; r++) cgs.row(r); - - if (_iva != nessuna_iva) - { - TSheet_field& ivas = (TSheet_field&)m.field(F_SHEETIVA); - for (r = ivas.items(); r < 16; r++) ivas.row(r); - ivas.enable_column(2, _iva == iva_acquisti); // Tipo detrazione - ivas.enable_column(4, _iva == iva_acquisti); // Tipo costo ricavo - } -} - - -// Ritorna il prossimo numero di registrazione libero -// Certified 100% -const char* TPrimanota_application::get_next_key() -{ - TToken_string k(80); - k.add(F_NUMREG); k.add(_lastreg+1); - - if (_rel->good()) // Not reinsert - { - TMask& m = curr_mask(); - if (m.insert_mode()) - { - k.add(F_CODCAUS); k.add(m.get(F_CODCAUS)); // Ricopia causale - k.add(F_DATAREG); k.add(m.get(F_DATAREG)); // data operazione - k.add(F_DATACOMP); k.add(m.get(F_DATACOMP)); // competenza - - if (iva() == iva_vendite) - { - k.add(F_DATADOC); k.add(m.get(F_DATADOC)); // Ricopia data documento - - const long n = m.get_long(F_NUMDOC); - if (n > 0) - { k.add(F_NUMDOC); k.add(n+1); } // incrementa numero documento - } - } - } - - return strcpy(__tmp_string, k); -} - - -void TPrimanota_application::init_insert_mode(TMask& m) -{ - init_mask(m); - - m.first_focus(_firstfocus); - - if (causale().reg().agenzia_viaggi()) - m.set(F_DATA74TER, m.get(F_DATAREG)); - - if (iva() != nessuna_iva) - { - occas_mask().reset(); - - const TString16 dt(m.get(F_DATAREG)); - set_pagamento(NULL,dt); - set_scadenze(m); - } - else - _partite.destroy(); - - _saldi.reset(); // Inizializza saldi -} - - -void TPrimanota_application::init_modify_mode(TMask& m) -{ - init_mask(m); - calcola_saldo(); // Verifica eventuali sbilanci contabili - if (iva() != nessuna_iva) - calcola_imp(); // Calcola totale imponibile ed imposte - else - _partite.destroy(); -} - -// Controlla sulla causale se il segno del totale documento (ritsoc=FALSE) -// o quello delle ritenute sociali (ritsoc=TRUE) e' invertito rispetto al normale -bool TPrimanota_application::test_swap(bool ritsoc) -{ - bool s = FALSE; - - const char sez = ritsoc ? causale().sezione_ritsoc() : causale().sezione_clifo(); - s = (iva() == iva_vendite) ^ sez == 'D'; - return s; -} - - -int TPrimanota_application::read(TMask& m) -{ - m.autoload(_rel); - - cgs().reset(); - - if (iva() != nessuna_iva) - { - ivas().reset(); - - const TString16 occode(_rel->lfile().get("OCFPI")); - occas_mask().set(O_CODICE, occode); - - const char clifo = _rel->lfile().get_char("TIPO"); - if (_iva == iva_acquisti && clifo == 'C') - error_box("Registrazione di acquisto attribuita ad un cliente"); else - if (_iva == iva_vendite && clifo == 'F') - error_box("Registrazione di vendita attribuita ad un fornitore"); - } - - // Inizializza cambio - real cambio(_rel->lfile().get("CAMBIO")); - if (cambio < 1.0) cambio = 1.0; - m.set_exchange(FALSE, cambio); - - _saldi.reset(); // Azzera saldi - _saldi.set_movprovv(_rel->lfile().get_char("PROVVIS") > ' '); - _saldi.set_movap(causale().apertura()); - _saldi.set_anno_es(m.get_int(F_ANNOES)); - _saldi.set_num_ulmov(m.get_long(F_NUMREG)); - _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); - - for (int i = 0; i < _rel->cg_items(); i++) - { - const TRectype& r = _rel->cg(i); - TToken_string& riga = cgs().row(i); // Vuota la riga - - TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO")); - import.add_to(riga); // Dare/Avere 101-102 - - TBill conto; conto.get(r); - riga.add(conto.string(0x3)); // Conto 103-107 - - _saldi.aggiorna(conto, import, FALSE); - - riga.add(""); // Codice descrizione 108 - riga.add(r.get("DESCR")); // Descrizione riga 109 - - conto.get(r, TRUE); - riga.add(conto.string(0x3)); // Contropartita 110-114 - riga.add(r.get("NUMGIO")); - const char tipo = r.get_char("ROWTYPE"); - riga.add(tipo); // Tipo di riga 115 - - disable_cgs_cells(i, tipo); - } - - if (_iva == nessuna_iva) - return _rel->status(); - - const bool solaiva = i == 0; - m.set(F_SOLAIVA, solaiva ? "X" : " "); - m.field(F_SOLAIVA).on_hit(); - - const bool to_swap = test_swap(FALSE); - if (to_swap) - { - real totdoc(m.get(F_TOTALE)); - totdoc = -totdoc; - m.set(F_TOTALE, totdoc.string()); - } - for (i = 0; i < _rel->iva_items(); i++) - { - TRectype& r = _rel->iva(i); - TToken_string& riga = ivas().row(i); - - real imponibile(r.get("IMPONIBILE")); - if (to_swap) imponibile = -imponibile; - riga.add(imponibile.string()); // Imponibile 101 - - riga.add(r.get("CODIVA")); // IVA 102 - riga.add(r.get("TIPODET")); // Detrazione 103 - - real imposta(r.get("IMPOSTA")); - if (to_swap) imposta = -imposta; - if (imponibile.sign() * imposta.sign() < 0) - { - warning_box("Registrazione con imponibile e imposta con segni discordi:\n" - "assegnato il segno dell'imponibile"); - imposta = -imposta; - } - riga.add(imposta.string()); // Imposta 104 - - TBill c; c.get(r); - c.add_to(riga, 4, 0x7); // Conto 105-110 - } - - TString16 dt(m.get(F_DATAREG)); - set_pagamento(m.get(F_CODPAG), dt); - if (!read_scadenze(m)) - set_scadenze(m); - - return _rel->status(); -} - - -// Trasferisce i dati da maschera a movimento di prima nota -void TPrimanota_application::mask2rel(const TMask& m) -{ - m.autosave(_rel); - - const long numreg = m.get_long(F_NUMREG); - const TDate datareg(m.get(F_DATAREG)); - const int annoes = m.get_int(F_ANNOES); - - _saldi.set_movprovv(m.get(F_PROVVISORIO)[0] > ' '); - _saldi.set_movap(causale().apertura()); - _saldi.set_anno_es(annoes); - _saldi.set_num_ulmov(numreg); - _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); - - _rel->destroy_rows(numreg); // Destroy all records - cgs_pack(); // Destroy all null rows - - TArray& rows = cgs().rows_array(); - - // Controlla se e' un movimento con righe contabili - if (iva() == nessuna_iva || !m.get_bool(F_SOLAIVA)) - { - for (int i = 0; i < rows.items(); i++) - { - TToken_string& row = (TToken_string&)rows[i]; - - TImporto n; n = row; - const TBill conto(row, 2, 0x3); - _saldi.aggiorna(conto, n, TRUE); - - TRectype &r = _rel->cg(i); - r.zero(); - - r.put("NUMREG", numreg); // Numero registrazione - r.put("ANNOES", annoes); // Anno esercizio - r.put("DATAREG", datareg); // Data di registrazione - r.put("NUMRIG", i+1); // Numero riga - - r.put("SEZIONE", n.sezione()); // Sezione - r.put("IMPORTO", n.valore()); // Importo - conto.put(r); // Conto - - row.get(); // Codice descrizione - r.put("DESCR", row.get()); // Descrizione riga - - r.put("TIPOCC", row.get()); // Contropartita - r.put("GRUPPOC", row.get()); - r.put("CONTOC", row.get()); - r.put("SOTTOCONTC", row.get()); - row.get(); // Descrizione contropartita - r.put("NUMGIO", row.get()); // Numero riga giornale - r.put("ROWTYPE", row.get()); // Tipo riga - } - } - - if (_iva == nessuna_iva) return; - - if (causale().corrispettivi()) - { - TRectype& rec = _rel->lfile().curr(); - rec.put("TIPO", ""); - rec.put("CODCF", ""); // Azzera il cliente nei movimenti dei corrispettivi - } - else - { - _rel->lfile().put("TIPO", clifo()); - - int err = ~NOERR; - if (m.field(F_OCCASEDIT).active()) // Se e' un occasionale - { - TRelation occas(LF_OCCAS); - const TMask& om = occas_mask(); - om.autosave(&occas); // Salva i dati anagrafici - - err = occas.write(); - if (err == _isreinsert) - err = occas.rewrite(); - - if (err == NOERR) - _rel->lfile().put("OCFPI", occas_mask().get(O_CODICE)); - else - error_box("Errore di scrittura sul file dei clienti/fornitori occasionali: %d", err); - } - if (err) _rel->lfile().zero("OCFPI"); - } - - const bool intra = causale().intra(); - const bool to_swap = test_swap(FALSE); - if (to_swap) - { - real totale = _rel->lfile().get("TOTDOC"); - totale = -totale; - _rel->lfile().put("TOTDOC", totale); - } - - ivas_pack(); - TArray& irows = ivas().rows_array(); - for (int i = 0; i < irows.items(); i++) - { - TToken_string& row = (TToken_string&)irows[i]; - - TRectype &r = _rel->iva(i); - r.zero(); - r.put("ANNOES", annoes); // Anno d'esercizio della testata (che ca$$ata!) - r.put("NUMREG", numreg); - r.put("INTRA", intra); // Causale intra (che ca$$ata!) - r.put("NUMRIG", i+1); - - real imponibile(row.get(0)); - if (to_swap) imponibile = -imponibile; - r.put("IMPONIBILE", imponibile); - - r.put("CODIVA", row.get()); - r.put("TIPODET", row.get()); - - real imposta(row.get()); - if (to_swap) imposta = -imposta; - r.put("IMPOSTA", imposta); - - r.put("TIPOCR", row.get()); - - const TBill c(row, -1, 0x1); - const int rimp = bill2pos(c, 'I')+1; - r.put("RIGAIMP", rimp); - c.put(r); - } -} - - -void TPrimanota_application::check_saldi() -{ - TString_array& rows = cgs().rows_array(); - const int anno = _rel->lfile().get_int("ANNOES"); - - for (int i = 0; i < rows.items(); i++) - { - TToken_string& row = (TToken_string&)rows[i]; - TBill conto(row, 2, 0x3); - conto.find(); - const char sez = conto.sezione(); - if (sez > ' ') - { - const TConto* c = _saldi.find(conto, anno); - if (c && !c->saldo_finale().is_zero() && c->saldo_finale().sezione() != sez) - warning_box("Il conto della riga %i ha un saldo finale in %s, " - "contrariamente a quanto indicato sul piano dei conti", - i+1, sez == 'A' ? "dare" : "avere"); - } - } -} - - -int TPrimanota_application::write(const TMask& m) -{ - static int lasterr = NOERR; - - const long numreg = m.get_long(F_NUMREG); - if (numreg > _lastreg) _lastreg = numreg; // Aggiorna ultima registrazione - - mask2rel(m); - const int err = _rel->write(TRUE); - if (err == NOERR) - { - _saldi.registra(); - check_saldi(); - - if (iva() != nessuna_iva) - { - causale().reg().reread(); // Aggiorna protocollo IVA - if (_is_saldaconto) - write_scadenze(m); - else - if (!m.get_bool(F_SOLAIVA)) - { - const TString16 causimm(causale().causale_inc_imm()); - if (causimm.not_empty()) - genera_incasso(causimm); - } - } - else - { - if (_is_saldaconto) - { - const long nreg = numreg - (lasterr == _isreinsert ? 1 : 0); - _partite.update_reg_num(nreg, _rel->lfile().curr()); - _partite.write(); - } - } - } - - lasterr = err; - return err; -} - - -int TPrimanota_application::rewrite(const TMask& m) -{ - mask2rel(m); - const int err = _rel->rewrite(TRUE); - if (err == NOERR) - { - _saldi.registra(); - check_saldi(); - } - - if (_is_saldaconto) - { - if (iva() != nessuna_iva) - write_scadenze(m); - else - _partite.rewrite(); - } - return err; -} - - -bool TPrimanota_application::remove() -{ - const bool ok = TRelation_application::remove(); - if (ok) - { - _saldi.registra(); - check_saldi(); - - if (_is_saldaconto && iva() == nessuna_iva) - { - notify_cgline_deletion(0); // Notify deletion of all cg lines - _partite.rewrite(); - } - } - return ok; -} - - -HIDDEN bool incasso_handler(TMask_field& f, KEY k) -{ - if (k == K_ENTER) - { - TMask& m = f.mask(); - TImporto tot(m.get(I_SEZIONE1)[0], (real)m.get(F_TOTALE)); - - for (int i = 2; i < 5; i++) - { - const int sid = i == 2 ? I_SEZIONE2 : (i == 3 ? I_SEZIONE3 : I_SEZIONE4); - const real val(m.get(sid+1)); - const TImporto imp(m.get(sid)[0], val); - tot += imp; - } - if (!tot.is_zero()) - return f.error_box("Il movimento e' sbilaciato di %s", tot.valore().string(".")); - } - return TRUE; -} - - -void TPrimanota_application::genera_incasso(const char* causimm) -{ - TMask m("cg2100i"); - if (iva() == iva_acquisti) m.set_caption("Movimento di pagamento immediato"); - - m.set_handler(F_DATAREG, datareg_handler); - m.set_handler(F_DATACOMP, datacomp_handler); - m.set_handler(F_TOTALE, incasso_handler); - - TCausale caus(causimm); // Causale da usare - - if (caus.data_doc()) m.efield(F_DATADOC).check_type(CHECK_REQUIRED); - if (caus.num_doc()) m.efield(F_NUMDOC).check_type(CHECK_REQUIRED); - - m.set(F_DATAREG, curr_mask().get(F_DATAREG)); - m.set(F_DATACOMP, curr_mask().get(F_DATACOMP)); - m.set(F_DATADOC, curr_mask().get(F_DATADOC)); - m.set(F_NUMDOC, curr_mask().get(F_NUMDOC)); - m.set(F_NUMREG, _lastreg+1); // Incrementa numero di registrazione - m.set(F_DESCR, caus.desc_agg(1)); // Descrizione - m.set(F_CODCAUS, causimm); // Cambia causale - m.set(F_DESCRCAUS, caus.descrizione()); - - m.set(I_SEZIONE1, caus.sezione_clifo() == 'D' ? "D" : "A"); - m.set(F_TOTALE, curr_mask().get(F_TOTALE)); - - m.set(F_CLIFO, _rel->cg(0).get("TIPOC")); - m.set(F_GRUPPOCLIFO, _rel->cg(0).get("GRUPPO")); - m.set(F_CONTOCLIFO, _rel->cg(0).get("CONTO")); - const TString& clifo = _rel->cg(0).get("SOTTOCONTO"); - m.set(F_CLIENTE, clifo); m.set(F_FORNITORE, clifo); m.set(I_SOTTOCONTO, clifo); - - TBill conto; caus.bill(2, conto); // Conto della seconda riga della causale - m.set(I_SEZIONE2, caus.sezione_clifo() == 'D' ? "A" : "D"); - m.set(I_IMPORTO2, curr_mask().get(F_TOTALE)); - m.set(I_GRUPPO2, conto.gruppo()); - m.set(I_CONTO2, conto.conto()); - m.set(I_SOTTOCONTO2, conto.sottoconto()); - - if (m.run() == K_SAVE) - { - TMovimentoPN inc; // Nuovo movimento di incasso immediato - - m.autosave(&inc); - inc.lfile().put("TIPODOC", caus.tipo_doc()); // Tipo documento - inc.lfile().put("REG", caus.reg().name()); // Registro - - const int annoes = m.get_int(F_ANNOES); - const TString16 datareg = m.get(F_DATAREG); - long num = m.get_long(F_NUMREG); - - TRectype& r = inc.cg(0); - r.zero(); - r.put("NUMREG", num); - r.put("NUMRIG", 1); - r.put("DATAREG", datareg); - r.put("ANNOES", annoes); - r.put("SEZIONE", m.get(I_SEZIONE1)); - r.put("IMPORTO", m.get(F_TOTALE)); - r.put("TIPOC", m.get(F_CLIFO)); - r.put("GRUPPO", m.get(F_GRUPPOCLIFO)); - r.put("CONTO", m.get(F_CONTOCLIFO)); - - short clifo_id; - switch (m.get(F_CLIFO)[0]) - { - case 'C': - clifo_id = F_CLIENTE; break; - case 'F': - clifo_id = F_FORNITORE; break; - default : - clifo_id = I_SOTTOCONTO; break; - } - r.put("SOTTOCONTO", m.get(clifo_id)); - r.put("DESCR", m.get(F_DESCR)); - r.put("TIPOCC", " "); - r.put("GRUPPOC", m.get(I_GRUPPO2)); - r.put("CONTOC", m.get(I_CONTO2)); - r.put("SOTTOCONTC", m.get(I_SOTTOCONTO2)); - - r.put("ROWTYPE", " "); - - for (int i = 2; i < 5; i++) - { - const int sid = i == 2 ? I_SEZIONE2 : (i == 3 ? I_SEZIONE3 : I_SEZIONE4); - const char* imp = m.get(sid+1); - if (*imp == '\0') break; - - TRectype& r = inc.cg(i-1); - r.zero(); - r.put("IMPORTO", imp); - r.put("NUMREG", num); - r.put("NUMRIG", i); - r.put("DATAREG", datareg); - r.put("ANNOES", annoes); - r.put("SEZIONE", m.get(sid)); - r.put("TIPOC", ' '); - r.put("GRUPPO", m.get(sid+2)); - r.put("CONTO", m.get(sid+3)); - r.put("SOTTOCONTO", m.get(sid+4)); - if (i == 2) - r.put("DESCR", caus.desc_agg(2)); - - r.put("TIPOCC", m.get(F_CLIFO)); - r.put("GRUPPOC", m.get(F_GRUPPOCLIFO)); - r.put("CONTOC", m.get(F_CONTOCLIFO)); - r.put("SOTTOCONTC", m.get(clifo_id)); - - r.put("ROWTYPE", " "); - } - - while (inc.write() == _isreinsert) // In caso di riscrittura - { - num++; // Incrementa numero registrazione - inc.lfile().put("NUMREG", num); - } - - if (inc.good()) - { - if (num > _lastreg) _lastreg = num; - - _saldi.reset(); // Inizializza saldi - _saldi.set_movprovv(FALSE); - _saldi.set_movap(FALSE); - _saldi.set_anno_es(m.get_int(F_ANNOES)); - _saldi.set_num_ulmov(_lastreg); - _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); - for (int r = 0; r < i; r++) - { - const TRectype& rec = inc.cg(r); - TBill c; c.get(rec); - const TImporto im(rec.get_char("SEZIONE"), rec.get_real("IMPORTO")); - _saldi.aggiorna(c, im, TRUE); - } - _saldi.registra(); - check_saldi(); - } - } -} - - -int cg2100 (int argc, char** argv) -{ - TPrimanota_application a; - a.run(argc, argv, "Prima nota"); - return 0; -} +#include +#include +#include +#include +#include + +#include "pagament.h" + +#include "cg2100.h" +#include "cg2102.h" +#include "cg21sld.h" + +// Nomi dei campi +#include +#include +#include + +TPrimanota_application::TPrimanota_application() +: _rel(NULL), _lastreg(0), _mode(0), _iva(nessuna_iva), _causale(NULL), _giornale(NULL) +{ + memset(_msk, 0, sizeof(_msk)); +} + + +TMask* TPrimanota_application::load_mask(int n) +{ + if (_msk[n] != NULL) + return _msk[n]; + + if (n == 1 || n == 2) + { + const int d = 3-n; + if (_msk[d] != NULL) + { + delete _msk[d]; + _msk[d] = NULL; + } + } + + TFilename name("cg2100"); name << char(n == 3 ? 'o' : 'a'+n); + TMask* m = new TMask(name); + + switch (n) + { + case 0: + if (m) + { + m->set_handler(F_NUMREG, num_handler); + m->set_handler(F_CODCAUS, caus_query_handler); + m->set_handler(F_DATAREG, datareg_handler); + m->set_handler(F_DATACOMP, datacomp_handler); + + TConfig c(CONFIG_STUDIO, "cg"); + + // Scelta primo campo col focus + _firstfocus = c.get_bool("PoCuDr") ? F_DATAREG : F_CODCAUS; + m->first_focus(_firstfocus); + + // Registra e inserisci immediatamente un nuovo movimento + _savenew = !c.get_bool("Cg21SN"); + } + break; + case 2: + if (m) + { + m->set_handler(F_DATADOC, doc_handler); + m->set_handler(F_NUMDOC, doc_handler); + m->set_handler(F_DATA74TER, data74ter_handler); + m->set_handler(F_PROTIVA, protiva_handler); + m->set_handler(F_CLIENTE, clifo_handler); + m->set_handler(F_FORNITORE, clifo_handler); + m->set_handler(F_TOTALE, totale_handler); + m->set_handler(F_RITFIS, ritfis_handler); + m->set_handler(F_RITSOC, ritsoc_handler); + m->set_handler(F_CORRLIRE, corrlire_handler); + m->set_handler(F_CORRVALUTA, corrvaluta_handler); + m->set_handler(F_CODIVA, main_codiva_handler); + m->set_handler(F_OCCASEDIT, occas_handler); + m->set_handler(F_SOLAIVA, solaiva_handler); + m->set_handler(F_SHEETIVA, iva_handler); + m->set_handler(F_CODPAG, codpag_handler); + + TSheet_field& is = (TSheet_field&)m->field(F_SHEETIVA); + is.set_notify(iva_notify); + TMask& ism = is.sheet_mask(); + ism.set_handler(101, imponibile_handler); + ism.set_handler(102, codiva_handler); + ism.set_handler(103, detrazione_handler); + ism.set_handler(104, imposta_handler); + ism.set_handler(109, iva_sottoconto_handler); + ism.set_handler(209, sheet_clifo_handler); + ism.set_handler(309, sheet_clifo_handler); + + // add saldaconto + TSheet_field& ps = (TSheet_field&)m->field(FS_RATESHEET); + ps.set_notify(pag_notify); + + } + _iva_showed = FALSE; + case 1: + if (m) + { + m->first_focus(_firstfocus); + m->set_handler(F_DATAREG, datareg_handler); + m->set_handler(F_DATACOMP, datacomp_handler); + m->set_handler(F_DESCR, descr_handler); + m->set_handler(F_CODCAUS, caus_modify_handler); + m->set_handler(F_SHEETCG, cg_handler); + m->set_handler(F_CAMBIO, cambio_handler); + m->set_handler(F_VISVAL, visval_handler); + + TSheet_field& cg = (TSheet_field&)m->field(F_SHEETCG); + cg.set_notify(cg_notify); + TMask& cgm = cg.sheet_mask(); + + if (n == 1) // movimento non IVA + { + m->set_handler(S_TOTDOC, totdoc_handler); + m->set_handler(S_SPESE, speserimb_handler); + m->set_handler(S_ALSPESE, altrespese_handler); + m->set_handler(S_ABBATT, abbatt_handler); + m->set_handler(S_ABBPASS, abbpass_handler); + m->set_handler(S_RITPROF, ritprof_handler); + m->set_handler(S_DIFFCAMB, diffcamb_handler); + } + + cgm.set_handler(101, dareavere_handler); + cgm.set_handler(102, dareavere_handler); + cgm.set_handler(105, cg_conto_handler); + cgm.set_handler(106, suspended_handler); + cgm.set_handler(206, sheet_clifo_handler); + cgm.set_handler(306, sheet_clifo_handler); + cgm.set_handler(112, suspended_handler); + cgm.set_handler(113, suspended_handler); + cgm.set_handler(213, sheet_clifo_handler); + cgm.set_handler(313, sheet_clifo_handler); + } + break; + case 3: + m->set_handler(O_CODICE, occas_code_handler); + break; + default: + CHECKD(0, "Che cavolo di maschera e' la ", n); + break; + } + + return _msk[n] = m; +} + + +bool TPrimanota_application::user_create() +{ + _tabcom = new TLocalisamfile(LF_TABCOM); + _tab = new TLocalisamfile(LF_TAB); + _caus = new TLocalisamfile(LF_CAUSALI); + _rcaus = new TLocalisamfile(LF_RCAUSALI); + _clifo = new TLocalisamfile(LF_CLIFO); + _pcon = new TLocalisamfile(LF_PCON); + _attiv = new TLocalisamfile(LF_ATTIV); + _saldo = new TLocalisamfile(LF_SALDI); + _comuni = new TLocalisamfile(LF_COMUNI); + _occas = new TLocalisamfile(LF_OCCAS); + _nditte = new TLocalisamfile(LF_NDITTE); + _scadenze = new TLocalisamfile(LF_SCADENZE); + + _rel = new TMovimentoPN; + _rel->add(LF_PARTITE, "NREG=NUMREG", 2); + + _causale = new TCausale(); + _giornale = new TLibro_giornale(); + + set_search_field(F_NUMREG); // Set field for default search + + _pag = NULL; + _pag_rows = NULL; + _is_saldaconto = FALSE; + + load_mask(0); + + return TRUE; +} + + +bool TPrimanota_application::save_and_new() const +{ return _savenew; } + + +bool TPrimanota_application::user_destroy() +{ + for (int m = 3; m >= 0; m--) + if (_msk[m] != NULL) delete _msk[m]; + + if (_pag) delete _pag; + + delete _giornale; + delete _causale; + delete _rel; + + delete _scadenze; + delete _nditte; + delete _occas; + delete _comuni; + delete _saldo; + delete _attiv; + delete _pcon; + delete _clifo; + delete _rcaus; + delete _caus; + delete _tab; + delete _tabcom; + + + return TRUE; +} + +// Legge la causale di codice cod ed il relativo registro dell'anno year +// Certified 99% +bool TPrimanota_application::read_caus(const char* cod, int year) +{ + bool ok = TRUE; + + if (cod != NULL) + ok = causale().read(cod, year); + + bool nob = FALSE, dob = FALSE; + TipoIVA iva = nessuna_iva; + _is_saldaconto = FALSE; + + if (ok) + { + _is_saldaconto = gestione_saldaconto() && causale().saldaconto(); + dob = _is_saldaconto | causale().data_doc(); + nob = _is_saldaconto | causale().num_doc(); + iva = causale().iva(); + } + + TMask* m = _msk[iva == nessuna_iva ? 1 : 2]; + if (m == NULL) return TRUE; + + const bool ins = m->insert_mode(); + + m->efield(F_NUMDOC).check_type(nob ? CHECK_REQUIRED : CHECK_NORMAL); // Num. doc. obbligatorio + m->efield(F_DATADOC).check_type(dob ? CHECK_REQUIRED : CHECK_NORMAL); // Data doc. obbligatoria + + if (iva == nessuna_iva) + { + TMask& cgm = cgs().sheet_mask(); + cgm.set_handler(100, _is_saldaconto ? showpartite_handler : NULL); // bottoncino riga + cgm.enable(100, _is_saldaconto); + } + else + { + m->enable_page(2, _is_saldaconto); + + m->efield(F_CODPAG).check_type(_is_saldaconto ? CHECK_REQUIRED : CHECK_NORMAL);// Cod. pag. obbligatorio + + m->show(F_ANNORIF, _is_saldaconto); // Mostra/nasconde anno e riferimento partita + m->show(F_NUMRIF, _is_saldaconto); + + m->enable(F_ANNORIF, ins); // Dis/abilita anno e riferimento partita + m->enable(F_NUMRIF, ins); + m->field(F_NUMRIF).set_justify(iva == iva_acquisti ? _num_for : _num_cli); + + const bool av = causale().reg().agenzia_viaggi(); + m->show(F_DATA74TER, av); + if (!av) m->reset(F_DATA74TER); + + if (ins) + { + const long protiva = causale().reg().protocol() + 1; + m->set(F_PROTIVA, protiva); // Aggiorna protocollo IVA + } + } + + if (ins && !ci_sono_importi()) + { + cgs().reset(); + for (int i = 1; i < causale().size(); i++) + { + const TRectype* rcaus = (TRectype*)causale().objptr(i); + if (rcaus == NULL) continue; // Evita eventuali righe nulle + + const int nriga = rcaus->get_int(RCA_NRIGA); + if (nriga < 1) continue; // Considera solo righe reali (non riempimenti) + + TBill tc; causale().bill(nriga, tc); + if (tc.gruppo() < 1) continue; // Considera solo gruppi validi + + if (tc.tipo() > ' ' && tc.ok()) + { + const TBill clifo(0, 0, tc.sottoconto(), tc.tipo()); + if (clifo.conto() != 0) + tc = clifo; + } + + int err = 0; + if (tc.descrizione() == "Sconosciuto") err = 1; else + if (tc.sospeso()) err = 2; + + if (err) + { + error_box("Il conto della riga %d della causale e' %s", + i, err == 1 ? "sconosciuto" : "sospeso"); + continue; + } + + const char sezione = rcaus->get_char(RCA_SEZIONE); + const TImporto zero('D', ZERO); + const TString80 desc(causale().desc_agg(i)); + + if (nriga == 1) m->set(F_DESCR, desc); + + if (iva == nessuna_iva) + { + char tipr = ' '; + if (_is_saldaconto) + { + if (nriga < 8) continue; // non si cagano gli importi totali + switch(nriga) + { + case 8: + tipr = 'P'; break; + case 9: + tipr = 'A'; break; + case 10: + tipr = 'G'; break; + case 11: + tipr = 'R'; break; + default: + tipr = ' '; break; + } + } + const int pos = set_cgs_row(-1,zero,tc,desc,tipr); + if (sezione > ' ') + cgs().disable_cell(pos, sezione == 'A' ? 0 : 1); + } + else + { + if (nriga >= 2 && nriga <= 9) + continue; // Conti per IVA detraibile e non, ritenute sociali e fiscali + + const char tipo = nriga == 1 ? 'T' : ' '; + if (nriga == 1 && tc.tipo() > ' ' && tc.ok()) + m->set(tc.tipo() == 'C' ? F_CLIENTE : F_FORNITORE, tc.sottoconto()); + set_cgs_row(-1,zero,tc,desc,tipo); + } + } + fill_sheet(*m); + } + + return ok; +} + + +// Certified 100% +void TPrimanota_application::print() +{ + TExternal_app stampa("cg3 -0"); + stampa.run(); +} + + +bool TPrimanota_application::changing_mask(int mode) +{ + if (mode == MODE_QUERY) + { + const bool flag = _mode != MODE_QUERY; + +#if XVT_OS == XVT_OS_WIN + if (flag && _iva != nessuna_iva && !_iva_showed) + { + WINDOW w = ivas().parent(); +#if XVT_OS == 400 + xvt_vobj_set_visible(w, TRUE); + xvt_vobj_raise(w); + xvt_app_process_pending_events(); + xvt_vobj_set_visible(w, FALSE); +#else + show_window(w, TRUE); + set_front_window(w); + process_events(); + show_window(w, FALSE); +#endif + _iva_showed = TRUE; + } +#endif + return flag; + } + _iva = iva_errata; + return TRUE; +} + + +TMask* TPrimanota_application::get_mask(int mode) +{ + int annoes = 0, annoiva = 0; + TString16 caus; + + _mode = mode; + + switch (mode) + { + case MODE_INS: + annoes = _msk[0]->get_int(F_ANNOES); + annoiva = _msk[0]->get_int(F_ANNOIVA); + caus = _msk[0]->get(F_CODCAUS); + break; + case MODE_MOD: + annoes = _rel->lfile().get_int("ANNOES"); + annoiva = _rel->lfile().get_int("ANNOIVA"); + caus = _rel->lfile().get("CODCAUS"); + break; + default: + return load_mask(0); + } + + if (giornale().year() != annoes) + giornale().read(annoes); + + if (caus != causale().codice() || causale().reg().year() != annoiva) + causale().read(caus, annoiva); + _iva = causale().iva(); + + return load_mask(_iva == nessuna_iva ? 1 : 2); +} + + +void TPrimanota_application::on_firm_change() +{ + _rel->lfile().last(); + _lastreg = _rel->lfile().get_long(MOV_NUMREG); // Init last registration number +} + +void TPrimanota_application::on_config_change() +{ + TConfig cnf(CONFIG_DITTA); + _ges_val = cnf.get_bool("GesVal"); + _ges_sal = cnf.get_bool("GesSal"); + _num_cli = cnf.get_bool("NrCliDx"); + _num_for = cnf.get_bool("NrForDx"); +} + + +void TPrimanota_application::init_mask(TMask& m) +{ + disable_menu_item(M_FILE_PRINT); + + read_caus(NULL, 0); // Setta campi obbligatori + fill_sheet(m); + + const bool valintra = causale().valintra(); + const bool corrisp = causale().corrispettivi(); + + if (_iva == nessuna_iva) + { + m.enable(-5, _is_saldaconto); // Abilita campi saldaconto + } + else + { + char clig, forg; + if (_iva == iva_acquisti) + { + forg = 's'; + clig = 'h'; + } + else + { + forg = 'h'; + clig = corrisp ? 'h' : 's'; + } + m.send_key(K_SHIFT+K_CTRL+clig, -1); // GROUP 1 (clienti) + m.send_key(K_SHIFT+K_CTRL+forg, -2); // GROUP 2 (fornitori) + if (corrisp) m.hide(F_STATOPAIV); + + // Show/Hide campi valuta: F_VALUTAINTRA, F_CAMBIOINTRA, F_CORRLIRE, F_CORRVAL (GROUP 4) + m.show(-4, valintra); + + m.show(F_CODIVA, m.mode() == MODE_INS); // Codice IVA standard + } + + // Show/Hide campi valuta: F_VALUTA, F_CAMBIO, F_VISVAL (GROUP 3) + const bool valuta = _ges_val && causale().valuta(); + m.show(-3, valuta); +} + +void TPrimanota_application::init_query_mode(TMask& m) +{ + enable_menu_item(M_FILE_PRINT); +} + + +void TPrimanota_application::fill_sheet(TMask& m) const +{ + TSheet_field& cgs = (TSheet_field&)m.field(F_SHEETCG); + for (int r = cgs.items(); r < 16; r++) cgs.row(r); + + if (_iva != nessuna_iva) + { + TSheet_field& ivas = (TSheet_field&)m.field(F_SHEETIVA); + for (r = ivas.items(); r < 16; r++) ivas.row(r); + ivas.enable_column(2, _iva == iva_acquisti); // Tipo detrazione + ivas.enable_column(4, _iva == iva_acquisti); // Tipo costo ricavo + } +} + + +// Ritorna il prossimo numero di registrazione libero +// Certified 100% +const char* TPrimanota_application::get_next_key() +{ + TToken_string k(80); + k.add(F_NUMREG); k.add(_lastreg+1); + + if (_rel->good()) // Not reinsert + { + TMask& m = curr_mask(); + if (m.insert_mode()) + { + k.add(F_CODCAUS); k.add(m.get(F_CODCAUS)); // Ricopia causale + k.add(F_DATAREG); k.add(m.get(F_DATAREG)); // data operazione + k.add(F_DATACOMP); k.add(m.get(F_DATACOMP)); // competenza + + if (iva() == iva_vendite) + { + k.add(F_DATADOC); k.add(m.get(F_DATADOC)); // Ricopia data documento + + const long n = m.get_long(F_NUMDOC); + if (n > 0) + { k.add(F_NUMDOC); k.add(n+1); } // incrementa numero documento + } + } + } + + return strcpy(__tmp_string, k); +} + + +void TPrimanota_application::init_insert_mode(TMask& m) +{ + init_mask(m); + + m.first_focus(_firstfocus); + + if (causale().reg().agenzia_viaggi()) + m.set(F_DATA74TER, m.get(F_DATAREG)); + + if (iva() != nessuna_iva) + { + occas_mask().reset(); + + const TString16 dt(m.get(F_DATAREG)); + set_pagamento(NULL,dt); + set_scadenze(m); + } + else + _partite.destroy(); + + _saldi.reset(); // Inizializza saldi +} + + +void TPrimanota_application::init_modify_mode(TMask& m) +{ + init_mask(m); + calcola_saldo(); // Verifica eventuali sbilanci contabili + if (iva() != nessuna_iva) + calcola_imp(); // Calcola totale imponibile ed imposte + else + _partite.destroy(); +} + +// Controlla sulla causale se il segno del totale documento (ritsoc=FALSE) +// o quello delle ritenute sociali (ritsoc=TRUE) e' invertito rispetto al normale +bool TPrimanota_application::test_swap(bool ritsoc) +{ + bool s = FALSE; + + const char sez = ritsoc ? causale().sezione_ritsoc() : causale().sezione_clifo(); + s = (iva() == iva_vendite) ^ sez == 'D'; + return s; +} + + +int TPrimanota_application::read(TMask& m) +{ + m.autoload(_rel); + + cgs().reset(); + + if (iva() != nessuna_iva) + { + ivas().reset(); + + const TString16 occode(_rel->lfile().get("OCFPI")); + occas_mask().set(O_CODICE, occode); + + const char clifo = _rel->lfile().get_char("TIPO"); + if (_iva == iva_acquisti && clifo == 'C') + error_box("Registrazione di acquisto attribuita ad un cliente"); else + if (_iva == iva_vendite && clifo == 'F') + error_box("Registrazione di vendita attribuita ad un fornitore"); + } + + // Inizializza cambio + real cambio(_rel->lfile().get("CAMBIO")); + if (cambio < 1.0) cambio = 1.0; + m.set_exchange(FALSE, cambio); + + _saldi.reset(); // Azzera saldi + _saldi.set_movprovv(_rel->lfile().get_char("PROVVIS") > ' '); + _saldi.set_movap(causale().apertura()); + _saldi.set_anno_es(m.get_int(F_ANNOES)); + _saldi.set_num_ulmov(m.get_long(F_NUMREG)); + _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); + + for (int i = 0; i < _rel->cg_items(); i++) + { + const TRectype& r = _rel->cg(i); + TToken_string& riga = cgs().row(i); // Vuota la riga + + TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO")); + import.add_to(riga); // Dare/Avere 101-102 + + TBill conto; conto.get(r); + riga.add(conto.string(0x3)); // Conto 103-107 + + _saldi.aggiorna(conto, import, FALSE); + + riga.add(""); // Codice descrizione 108 + riga.add(r.get("DESCR")); // Descrizione riga 109 + + conto.get(r, TRUE); + riga.add(conto.string(0x3)); // Contropartita 110-114 + riga.add(r.get("NUMGIO")); + const char tipo = r.get_char("ROWTYPE"); + riga.add(tipo); // Tipo di riga 115 + + disable_cgs_cells(i, tipo); + } + + if (_iva == nessuna_iva) + return _rel->status(); + + const bool solaiva = i == 0; + m.set(F_SOLAIVA, solaiva ? "X" : " "); + m.field(F_SOLAIVA).on_hit(); + + const bool to_swap = test_swap(FALSE); + if (to_swap) + { + real totdoc(m.get(F_TOTALE)); + totdoc = -totdoc; + m.set(F_TOTALE, totdoc.string()); + } + for (i = 0; i < _rel->iva_items(); i++) + { + TRectype& r = _rel->iva(i); + TToken_string& riga = ivas().row(i); + + real imponibile(r.get("IMPONIBILE")); + if (to_swap) imponibile = -imponibile; + riga.add(imponibile.string()); // Imponibile 101 + + riga.add(r.get("CODIVA")); // IVA 102 + riga.add(r.get("TIPODET")); // Detrazione 103 + + real imposta(r.get("IMPOSTA")); + if (to_swap) imposta = -imposta; + if (imponibile.sign() * imposta.sign() < 0) + { + warning_box("Registrazione con imponibile e imposta con segni discordi:\n" + "assegnato il segno dell'imponibile"); + imposta = -imposta; + } + riga.add(imposta.string()); // Imposta 104 + + TBill c; c.get(r); + c.add_to(riga, 4, 0x7); // Conto 105-110 + } + + TString16 dt(m.get(F_DATAREG)); + set_pagamento(m.get(F_CODPAG), dt); + if (!read_scadenze(m)) + set_scadenze(m); + + return _rel->status(); +} + + +// Trasferisce i dati da maschera a movimento di prima nota +void TPrimanota_application::mask2rel(const TMask& m) +{ + m.autosave(_rel); + + const long numreg = m.get_long(F_NUMREG); + const TDate datareg(m.get(F_DATAREG)); + const int annoes = m.get_int(F_ANNOES); + + _saldi.set_movprovv(m.get(F_PROVVISORIO)[0] > ' '); + _saldi.set_movap(causale().apertura()); + _saldi.set_anno_es(annoes); + _saldi.set_num_ulmov(numreg); + _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); + + _rel->destroy_rows(numreg); // Destroy all records + cgs_pack(); // Destroy all null rows + + TArray& rows = cgs().rows_array(); + + // Controlla se e' un movimento con righe contabili + if (iva() == nessuna_iva || !m.get_bool(F_SOLAIVA)) + { + for (int i = 0; i < rows.items(); i++) + { + TToken_string& row = (TToken_string&)rows[i]; + + TImporto n; n = row; + const TBill conto(row, 2, 0x3); + _saldi.aggiorna(conto, n, TRUE); + + TRectype &r = _rel->cg(i); + r.zero(); + + r.put("NUMREG", numreg); // Numero registrazione + r.put("ANNOES", annoes); // Anno esercizio + r.put("DATAREG", datareg); // Data di registrazione + r.put("NUMRIG", i+1); // Numero riga + + r.put("SEZIONE", n.sezione()); // Sezione + r.put("IMPORTO", n.valore()); // Importo + conto.put(r); // Conto + + row.get(); // Codice descrizione + r.put("DESCR", row.get()); // Descrizione riga + + r.put("TIPOCC", row.get()); // Contropartita + r.put("GRUPPOC", row.get()); + r.put("CONTOC", row.get()); + r.put("SOTTOCONTC", row.get()); + row.get(); // Descrizione contropartita + r.put("NUMGIO", row.get()); // Numero riga giornale + r.put("ROWTYPE", row.get()); // Tipo riga + } + } + + if (_iva == nessuna_iva) return; + + if (causale().corrispettivi()) + { + TRectype& rec = _rel->lfile().curr(); + rec.put("TIPO", ""); + rec.put("CODCF", ""); // Azzera il cliente nei movimenti dei corrispettivi + } + else + { + _rel->lfile().put("TIPO", clifo()); + + int err = ~NOERR; + if (m.field(F_OCCASEDIT).active()) // Se e' un occasionale + { + TRelation occas(LF_OCCAS); + const TMask& om = occas_mask(); + om.autosave(&occas); // Salva i dati anagrafici + + err = occas.write(); + if (err == _isreinsert) + err = occas.rewrite(); + + if (err == NOERR) + _rel->lfile().put("OCFPI", occas_mask().get(O_CODICE)); + else + error_box("Errore di scrittura sul file dei clienti/fornitori occasionali: %d", err); + } + if (err) _rel->lfile().zero("OCFPI"); + } + + const bool intra = causale().intra(); + const bool to_swap = test_swap(FALSE); + if (to_swap) + { + real totale = _rel->lfile().get("TOTDOC"); + totale = -totale; + _rel->lfile().put("TOTDOC", totale); + } + + ivas_pack(); + TArray& irows = ivas().rows_array(); + for (int i = 0; i < irows.items(); i++) + { + TToken_string& row = (TToken_string&)irows[i]; + + TRectype &r = _rel->iva(i); + r.zero(); + r.put("ANNOES", annoes); // Anno d'esercizio della testata (che ca$$ata!) + r.put("NUMREG", numreg); + r.put("INTRA", intra); // Causale intra (che ca$$ata!) + r.put("NUMRIG", i+1); + + real imponibile(row.get(0)); + if (to_swap) imponibile = -imponibile; + r.put("IMPONIBILE", imponibile); + + r.put("CODIVA", row.get()); + r.put("TIPODET", row.get()); + + real imposta(row.get()); + if (to_swap) imposta = -imposta; + r.put("IMPOSTA", imposta); + + r.put("TIPOCR", row.get()); + + const TBill c(row, -1, 0x1); + const int rimp = bill2pos(c, 'I')+1; + r.put("RIGAIMP", rimp); + c.put(r); + } +} + + +void TPrimanota_application::check_saldi() +{ + TString_array& rows = cgs().rows_array(); + const int anno = _rel->lfile().get_int("ANNOES"); + + for (int i = 0; i < rows.items(); i++) + { + TToken_string& row = (TToken_string&)rows[i]; + TBill conto(row, 2, 0x3); + conto.find(); + const char sez = conto.sezione(); + if (sez > ' ') + { + const TConto* c = _saldi.find(conto, anno); + if (c && !c->saldo_finale().is_zero() && c->saldo_finale().sezione() != sez) + warning_box("Il conto della riga %i ha un saldo finale in %s, " + "contrariamente a quanto indicato sul piano dei conti", + i+1, sez == 'A' ? "dare" : "avere"); + } + } +} + + +int TPrimanota_application::write(const TMask& m) +{ + static int lasterr = NOERR; + + const long numreg = m.get_long(F_NUMREG); + if (numreg > _lastreg) _lastreg = numreg; // Aggiorna ultima registrazione + + mask2rel(m); + const int err = _rel->write(TRUE); + if (err == NOERR) + { + _saldi.registra(); + check_saldi(); + + if (iva() != nessuna_iva) + { + causale().reg().reread(); // Aggiorna protocollo IVA + if (_is_saldaconto) + write_scadenze(m); + else + if (!m.get_bool(F_SOLAIVA)) + { + const TString16 causimm(causale().causale_inc_imm()); + if (causimm.not_empty()) + genera_incasso(causimm); + } + } + else + { + if (_is_saldaconto) + { + const long nreg = numreg - (lasterr == _isreinsert ? 1 : 0); + _partite.update_reg_num(nreg, _rel->lfile().curr()); + _partite.write(); + } + } + } + + lasterr = err; + return err; +} + + +int TPrimanota_application::rewrite(const TMask& m) +{ + mask2rel(m); + const int err = _rel->rewrite(TRUE); + if (err == NOERR) + { + _saldi.registra(); + check_saldi(); + } + + if (_is_saldaconto) + { + if (iva() != nessuna_iva) + write_scadenze(m); + else + _partite.rewrite(); + } + return err; +} + + +bool TPrimanota_application::remove() +{ + const bool ok = TRelation_application::remove(); + if (ok) + { + _saldi.registra(); + check_saldi(); + + if (_is_saldaconto && iva() == nessuna_iva) + { + notify_cgline_deletion(0); // Notify deletion of all cg lines + _partite.rewrite(); + } + } + return ok; +} + + +HIDDEN bool incasso_handler(TMask_field& f, KEY k) +{ + if (k == K_ENTER) + { + TMask& m = f.mask(); + TImporto tot(m.get(I_SEZIONE1)[0], (real)m.get(F_TOTALE)); + + for (int i = 2; i < 5; i++) + { + const int sid = i == 2 ? I_SEZIONE2 : (i == 3 ? I_SEZIONE3 : I_SEZIONE4); + const real val(m.get(sid+1)); + const TImporto imp(m.get(sid)[0], val); + tot += imp; + } + if (!tot.is_zero()) + return f.error_box("Il movimento e' sbilaciato di %s", tot.valore().string(".")); + } + return TRUE; +} + + +void TPrimanota_application::genera_incasso(const char* causimm) +{ + TMask m("cg2100i"); + if (iva() == iva_acquisti) m.set_caption("Movimento di pagamento immediato"); + + m.set_handler(F_DATAREG, datareg_handler); + m.set_handler(F_DATACOMP, datacomp_handler); + m.set_handler(F_TOTALE, incasso_handler); + + TCausale caus(causimm); // Causale da usare + + if (caus.data_doc()) m.efield(F_DATADOC).check_type(CHECK_REQUIRED); + if (caus.num_doc()) m.efield(F_NUMDOC).check_type(CHECK_REQUIRED); + + m.set(F_DATAREG, curr_mask().get(F_DATAREG)); + m.set(F_DATACOMP, curr_mask().get(F_DATACOMP)); + m.set(F_DATADOC, curr_mask().get(F_DATADOC)); + m.set(F_NUMDOC, curr_mask().get(F_NUMDOC)); + m.set(F_NUMREG, _lastreg+1); // Incrementa numero di registrazione + m.set(F_DESCR, caus.desc_agg(1)); // Descrizione + m.set(F_CODCAUS, causimm); // Cambia causale + m.set(F_DESCRCAUS, caus.descrizione()); + + m.set(I_SEZIONE1, caus.sezione_clifo() == 'D' ? "D" : "A"); + m.set(F_TOTALE, curr_mask().get(F_TOTALE)); + + m.set(F_CLIFO, _rel->cg(0).get("TIPOC")); + m.set(F_GRUPPOCLIFO, _rel->cg(0).get("GRUPPO")); + m.set(F_CONTOCLIFO, _rel->cg(0).get("CONTO")); + const TString& clifo = _rel->cg(0).get("SOTTOCONTO"); + m.set(F_CLIENTE, clifo); m.set(F_FORNITORE, clifo); m.set(I_SOTTOCONTO, clifo); + + TBill conto; caus.bill(2, conto); // Conto della seconda riga della causale + m.set(I_SEZIONE2, caus.sezione_clifo() == 'D' ? "A" : "D"); + m.set(I_IMPORTO2, curr_mask().get(F_TOTALE)); + m.set(I_GRUPPO2, conto.gruppo()); + m.set(I_CONTO2, conto.conto()); + m.set(I_SOTTOCONTO2, conto.sottoconto()); + + if (m.run() == K_SAVE) + { + TMovimentoPN inc; // Nuovo movimento di incasso immediato + + inc.lfile().zero(); + m.autosave(&inc); + inc.lfile().put("TIPODOC", caus.tipo_doc()); // Tipo documento + inc.lfile().put("REG", caus.reg().name()); // Registro + + const int annoes = m.get_int(F_ANNOES); + const TString16 datareg = m.get(F_DATAREG); + long num = m.get_long(F_NUMREG); + + TRectype& r = inc.cg(0); + r.zero(); + r.put("NUMREG", num); + r.put("NUMRIG", 1); + r.put("DATAREG", datareg); + r.put("ANNOES", annoes); + r.put("SEZIONE", m.get(I_SEZIONE1)); + r.put("IMPORTO", m.get(F_TOTALE)); + r.put("TIPOC", m.get(F_CLIFO)); + r.put("GRUPPO", m.get(F_GRUPPOCLIFO)); + r.put("CONTO", m.get(F_CONTOCLIFO)); + + short clifo_id; + switch (m.get(F_CLIFO)[0]) + { + case 'C': + clifo_id = F_CLIENTE; break; + case 'F': + clifo_id = F_FORNITORE; break; + default : + clifo_id = I_SOTTOCONTO; break; + } + r.put("SOTTOCONTO", m.get(clifo_id)); + r.put("DESCR", m.get(F_DESCR)); + r.put("TIPOCC", " "); + r.put("GRUPPOC", m.get(I_GRUPPO2)); + r.put("CONTOC", m.get(I_CONTO2)); + r.put("SOTTOCONTC", m.get(I_SOTTOCONTO2)); + + r.put("ROWTYPE", " "); + + for (int i = 2; i < 5; i++) + { + const int sid = i == 2 ? I_SEZIONE2 : (i == 3 ? I_SEZIONE3 : I_SEZIONE4); + const char* imp = m.get(sid+1); + if (*imp == '\0') break; + + TRectype& r = inc.cg(i-1); + r.zero(); + r.put("IMPORTO", imp); + r.put("NUMREG", num); + r.put("NUMRIG", i); + r.put("DATAREG", datareg); + r.put("ANNOES", annoes); + r.put("SEZIONE", m.get(sid)); + r.put("TIPOC", ' '); + r.put("GRUPPO", m.get(sid+2)); + r.put("CONTO", m.get(sid+3)); + r.put("SOTTOCONTO", m.get(sid+4)); + if (i == 2) + r.put("DESCR", caus.desc_agg(2)); + + r.put("TIPOCC", m.get(F_CLIFO)); + r.put("GRUPPOC", m.get(F_GRUPPOCLIFO)); + r.put("CONTOC", m.get(F_CONTOCLIFO)); + r.put("SOTTOCONTC", m.get(clifo_id)); + + r.put("ROWTYPE", " "); + } + + while (inc.write() == _isreinsert) // In caso di riscrittura + { + num++; // Incrementa numero registrazione + inc.lfile().put("NUMREG", num); + } + + if (inc.good()) + { + if (num > _lastreg) _lastreg = num; + + _saldi.reset(); // Inizializza saldi + _saldi.set_movprovv(FALSE); + _saldi.set_movap(FALSE); + _saldi.set_anno_es(m.get_int(F_ANNOES)); + _saldi.set_num_ulmov(_lastreg); + _saldi.set_data_ulmov((TDate)m.get(F_DATAREG)); + for (int r = 0; r < i; r++) + { + const TRectype& rec = inc.cg(r); + TBill c; c.get(rec); + const TImporto im(rec.get_char("SEZIONE"), rec.get_real("IMPORTO")); + _saldi.aggiorna(c, im, TRUE); + } + _saldi.registra(); + check_saldi(); + } + } +} + + +int cg2100 (int argc, char** argv) +{ + TPrimanota_application a; + a.run(argc, argv, "Prima nota"); + return 0; +}