From 9ec6c584c2f42a728f6927c46ae97146518f545b Mon Sep 17 00:00:00 2001 From: angelo Date: Tue, 1 Oct 1996 06:56:36 +0000 Subject: [PATCH] Prosegue la contabilizzazione: corretti i controlli di input e spostati solo all'uscita della maschera. Aggiunta la contabilizzazione di sconti/omaggi/spese/prestazioni. Manca ancora la contabilizzazione dei bolli/spese di'incasso. git-svn-id: svn://10.65.10.50/trunk@3689 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve6100.cpp | 305 +++++++++++++++++++++++++++++-------------------- ve/ve6100a.uml | 14 +-- 2 files changed, 185 insertions(+), 134 deletions(-) diff --git a/ve/ve6100.cpp b/ve/ve6100.cpp index 93a636cd2..3de4a707d 100755 --- a/ve/ve6100.cpp +++ b/ve/ve6100.cpp @@ -444,7 +444,7 @@ public: void zero(){ _imp = 0.0; _iva = 0.0; _ali = 0.0; } virtual TObject* dup() const { return new TIVA_element(*this); } TIVA_element& operator = (TIVA_element& a); - TIVA_element& operator += (TRiepilogo_Iva& a); + TIVA_element& operator += (const TRiga_documento& a); TIVA_element() {_imp = 0.0; _iva = 0.0; _ali = 0.0;} ~TIVA_element() {}; }; @@ -455,10 +455,10 @@ TIVA_element& TIVA_element::operator=(TIVA_element& a) return *this; } -TIVA_element& TIVA_element::operator+=(TRiepilogo_Iva& a) +TIVA_element& TIVA_element::operator+=(const TRiga_documento& a) // It's horrible, I know. { - _imp += a.imp(); _iva += a.iva(); _ali = a.ali(); + _imp += a.imponibile(); _iva += a.imposta(); _ali = a.iva().aliquota(); return *this; } @@ -478,6 +478,8 @@ class TContabilizzazione_app : public TApplication TRelation *_clifo; // relazione dei clienti e fornitori + cfven TLocalisamfile *_attiv, // file delle attivita' (per far funzionare TRegistro) *_fcaus, // file delle causale (per far funzionare TCausale) + *_docfile, // file dei documenti (per far funzionare TDocumento) + *_rdocfile, // file delle righe documento (per far funzionare TDocumento) *_frcaus, // file delle righe causali (per far funzionare TCausale) *_part, // file delle partite (per far funzionare TPartita) *_scad, // file delle scadenze (per far funzionare TPartita) @@ -489,6 +491,8 @@ class TContabilizzazione_app : public TApplication *_cve, // tabella categorie di vendita *_val, // tabella valute estere *_tri, // tabella tipi di riga + *_prs, // tabella prestazioni + *_spp, // tabella spese *_caa, // tabella categorie acquisto articoli *_cra, // tabella categorie ricavo articoli *_cco; // tabella categorie contabili @@ -519,12 +523,13 @@ class TContabilizzazione_app : public TApplication // Gli utlimi 6 fanno parte della ricerca per costi ricavi, in particolare AR,GM,SM e RF // non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non e' valida come stringa // di ricerca. + TBill _sco_perc_bill, _sco_imp_bill; // Conti per gli sconti a percentuale ed importi (dalla configurazione) protected: // TApplication bool sc_enabled() const ; // Funzione per ricercare il conto di costo/ricavo error_type search_costo_ricavo(TBill& conto, const TRiga_documento& r); // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva - error_type add_iva_row(const TBill& conto, TRiepilogo_Iva& ri); + error_type add_iva_row(const TBill& conto, const TRiga_documento& r); // Crea le righe iva su _movimento error_type create_iva_rows(); // Crea la riga di totale documento @@ -581,12 +586,13 @@ inline TContabilizzazione_app& app() { return (TContabilizzazione_app&) main_app bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k) { - if (f.to_check(k)) + if (k==K_ENTER && f.dirty()) { TMask& m = f.mask(); TDate da(m.get_date(F_DATA_INI)); TDate a(m.get_date(F_DATA_FIN)); - if (a == botime || da == botime) return TRUE; + m.field(F_DATA_REG).set_dirty(); + //if (a == botime || da == botime) return TRUE; if (a < da) { f.error_box("La data di inizio deve essere minore della data di fine."); @@ -603,13 +609,14 @@ bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k) bool TContabilizzazione_app::handle_data_reg(TMask_field& f, KEY k) { - if (f.to_check(k)) + if (k==K_ENTER && f.dirty()) { TMask& m = f.mask(); TDate data_reg(f.get()); if (data_reg == botime) return TRUE; TDate da(m.get_date(F_DATA_INI)); + //if (!da.ok()) return TRUE; if ((data_reg - da) > 15) { f.error_box("L'intervallo tra la data di registrazione e la data di inizio non puo' eccedere i 15 giorni."); @@ -730,10 +737,14 @@ bool TContabilizzazione_app::create() _msk->set_handler(DLG_USER,handle_select); _num_sheet = new TArray_sheet(-1,-1,-4,-4,"Codici numerazione", "@1|Cod. numerazione|Descrizione@50"); + _docfile = new TLocalisamfile(LF_DOC); + _rdocfile = new TLocalisamfile(LF_RIGHEDOC); _doc = new TDocumentoEsteso; _cpg = new TTable("%CPG"); _tri = new TTable("%TRI"); _val = new TTable("%VAL"); + _prs = new TTable("PRS"); + _spp = new TTable("SPP"); _caa = new TTable("CAA"); _cra = new TTable("CRA"); _gmc = new TTable("GMC"); @@ -750,17 +761,13 @@ bool TContabilizzazione_app::create() _attiv = new TLocalisamfile(LF_ATTIV); // Altrimenti TRegistro non va! _anamag = new TLocalisamfile(LF_ANAMAG); TConfig conf(CONFIG_DITTA); - TString val; + + _search_seq = conf.get("RICERCACR","ve"); // costruisce la stringa che controlla la ricerca del conto costo/ricavo // Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza // presuppone che il programma di configurazione abbia generato correttamente // il tutto. - for (int i=0; i<5;i++) - { - val = conf.get("RICERCACR","ve",i+1); - if (val.not_empty()) _search_seq.add(val); - } if (_search_seq.items() == 0) { @@ -769,6 +776,20 @@ bool TContabilizzazione_app::create() } _sc_enabled = conf.get_bool("GesSal","cg"); _nump_cfg = conf.get_bool("RifPro","cg"); + + int gr,co; + long so; + + gr = conf.get_int("SCOPRCODCON","ve",1); + co = conf.get_int("SCOPRCODCON","ve",2); + so = conf.get_long("SCOPRCODCON","ve",3); + _sco_perc_bill.set(gr,co,so); + + gr = conf.get_int("SCOIMCODCON","ve",1); + co = conf.get_int("SCOIMCODCON","ve",2); + so = conf.get_long("SCOIMCODCON","ve",3); + _sco_imp_bill.set(gr,co,so); + dispatch_e_menu(BAR_ITEM(1)); return TRUE; } @@ -777,6 +798,8 @@ bool TContabilizzazione_app::destroy() { if (_msk) delete _msk; if (_num_sheet) delete _num_sheet; + if (_docfile) delete _docfile; + if (_rdocfile) delete _rdocfile; if (_doc) delete _doc; if (_cpg) delete _cpg; if (_tri) delete _tri; @@ -785,6 +808,8 @@ bool TContabilizzazione_app::destroy() if (_rfa) delete _rfa; if (_cve) delete _cve; if (_cco) delete _cco; + if (_prs) delete _prs; + if (_spp) delete _spp; if (_caa) delete _caa; if (_cra) delete _cra; if (_fcaus) delete _fcaus; @@ -807,6 +832,7 @@ bool TContabilizzazione_app::menu(MENU_TAG mt) _data_fine = _msk->get_date(F_DATA_FIN); _data_reg = _msk->get_date(F_DATA_REG); _auto_data = _msk->get_bool(F_DATA_AUTO); + //_data_fine++; contabilize(); } return FALSE; @@ -820,99 +846,132 @@ error_type TContabilizzazione_app::search_costo_ricavo(TBill& conto, const TRiga bool skip_art_related = FALSE; bool skip_clifo = _clifo->bad(); TCodiceIVA codiva(r.get("CODIVA")); + const char t = r.tipo().tipo(); int gr,co; long so; - // posiziona l'anagrafica sull'articolo specificato sulla ..iga - _anamag->put("CODART",r.get("CODART")); - if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa. - skip_art_related = TRUE; - - // Scorre la stringa di ricerca - for (int i=0;good() && iIVA2bill(codiva,conto)) break; // se lo trova esce - } - else - if (tok == "AR") - { - if (skip_art_related) continue; - gr = _anamag->get_int(is_cli ? "GRUPPOV" : "GRUPPOA"); - co = _anamag->get_int(is_cli ? "CONTOV" : "CONTOA"); - so = _anamag->get_long(is_cli ? "SOTTOCV" : "SOTTOCA"); - conto.set(gr,co,so); - if (!conto.ok()) // se il conto non c'e' guarda la categoria acquisti/vendite - { - TTable *t = is_cli ? _cra : _caa; - - t->put("CODTAB",_anamag->get(is_cli ? "CATCONV" : "CATCONA")); - if (t->read() == NOERR) + // posiziona l'anagrafica sull'articolo specificato sulla ..iga + _anamag->put("CODART",r.get("CODART")); + if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa. + skip_art_related = TRUE; + + // Scorre la stringa di ricerca + for (int i=0;good() && iget("S1")); - co = atoi(t->get("S2")); - so = atol(t->get("S3")); + if (skip_clifo) continue; + gr = cli_file.get_int(CLI_GRUPPORIC); + co = cli_file.get_int(CLI_CONTORIC); + so = cli_file.get_long(CLI_SOTTOCRIC); conto.set(gr,co,so); + if (conto.ok()) break; // se lo trova esce (tutti != 0) + } + else + if (tok == "CA") + { + CHECK(_caus,"Orgggssbb..._caus pointer is NULL!"); + if (_caus->IVA2bill(codiva,conto)) break; // se lo trova esce + } + else + if (tok == "AR") + { + if (skip_art_related) continue; + gr = _anamag->get_int(is_cli ? "GRUPPOV" : "GRUPPOA"); + co = _anamag->get_int(is_cli ? "CONTOV" : "CONTOA"); + so = _anamag->get_long(is_cli ? "SOTTOCV" : "SOTTOCA"); + conto.set(gr,co,so); + if (!conto.ok()) // se il conto non c'e' guarda la categoria acquisti/vendite + { + TTable *t = is_cli ? _cra : _caa; + + t->put("CODTAB",_anamag->get(is_cli ? "CATCONV" : "CATCONA")); + if (t->read() == NOERR) + { + gr = atoi(t->get("S1")); + co = atoi(t->get("S2")); + so = atol(t->get("S3")); + conto.set(gr,co,so); + } + } + if (conto.ok()) break; + } + else + if (tok == "GM" || tok == "SM" || tok == "RF") + { + if (skip_art_related) continue; + const bool is_fis = tok == "RF"; + TTable * tab = is_fis ? _rfa : _gmc; + TString codtab(_anamag->get(is_fis ? "GRMERC" : "RAGGFIS")); + if (tok == "GM") + codtab.cut(2); // gli ultimi 2 si riferiscono al sottogruppo. + tab->put("CODTAB",codtab); + if (tab->read() == NOERR) + { + gr = tab->get_int(is_cli ? "I3" : "I0"); + co = tab->get_int(is_cli ? "I4" : "I1"); + so = tab->get_long(is_cli ? "I5" : "I2"); + conto.set(gr,co,so); + } + if (conto.ok()) break; + } + else + if (tok == "CV" || tok == "CC") + { + const bool is_cve = tok == "CV"; + if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione + TTable* t = is_cve ? _cve : _cco; + TString cod(is_cve ? _doc->get("CATVEN") : ""); + if (cod.empty()) + { + if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo + cod = _clifo->lfile(LF_CFVEN).get(is_cve ? CFV_CATVEN : CFV_CODCATC); + } + t->put("CODTAB",cod); + if (t->read() == NOERR) + { + const bool x =(is_cve || is_cli); + gr = t->get_int(x ? "I3" : "I0"); + co = t->get_int(x ? "I4" : "I1"); + so = t->get_long(x ? "I5": "I2"); + conto.set(gr,co,so); + } + if (conto.ok()) break; } } - if (conto.ok()) break; + break; // case 'M' } - else - if (tok == "GM" || tok == "SM" || tok == "RF") + case 'P': // righe prestazione + case 'S': // righe spese { - if (skip_art_related) continue; - const bool is_fis = tok == "RF"; - TTable * tab = is_fis ? _rfa : _gmc; - TString codtab(_anamag->get(is_fis ? "GRMERC" : "RAGGFIS")); - if (tok == "GM") - codtab.cut(2); // gli ultimi 2 si riferiscono al sottogruppo. - tab->put("CODTAB",codtab); - if (tab->read() == NOERR) + TTable* tab = t == 'P' ? _prs : _spp; + tab->put("CODTAB",r.get("CODART")); + if (tab->read()) { - gr = tab->get_int(is_cli ? "I3" : "I0"); - co = tab->get_int(is_cli ? "I4" : "I1"); - so = tab->get_long(is_cli ? "I5" : "I2"); + gr = tab->get_int(is_cli ? "I0" : "I3"); + co = tab->get_int(is_cli ? "I1" : "I4"); + so = tab->get_long(is_cli ? "I2" : "I5"); conto.set(gr,co,so); } - if (conto.ok()) break; + break; // case 'P','S' } - else - if (tok == "CV" || tok == "CC") - { - const bool is_cve = tok == "CV"; - if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione - TTable* t = is_cve ? _cve : _cco; - TString cod(is_cve ? _doc->get("CATVEN") : ""); - if (cod.empty()) - { - if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo - cod = _clifo->lfile(LF_CFVEN).get(is_cve ? CFV_CATVEN : CFV_CODCATC); - } - t->put("CODTAB",cod); - if (t->read() == NOERR) - { - const bool x =(is_cve || is_cli); - gr = t->get_int(x ? "I3" : "I0"); - co = t->get_int(x ? "I4" : "I1"); - so = t->get_long(x ? "I5": "I2"); - conto.set(gr,co,so); - } - if (conto.ok()) break; - } - } + case 'C': // righe sconti (TBI) (reperire l'imposta e l'imponibile normalizzare. Il conto e' nei parametri) + // quale sconto deve reperire dalla configurazione? Sconto ad importo o sconto a percentuale? + if (!r.get("SCONTO").empty()) // se c'e' la percentuale reperisce il conto dello sconto a percentuale + conto = _sco_perc_bill; + else // altrimenti quello dello sconto ad importo + conto = _sco_imp_bill; + break; // case 'C' + case 'D': // righe descrizioni (saltare) + default : + break; + } // end of switch if (good() && !conto.find()) _error = conto_error; return _error; @@ -1101,7 +1160,7 @@ error_type TContabilizzazione_app::compile_head_mov() if (registro.agenzia_viaggi()) mov_rec.put(MOV_DATA74TER,data_reg); mov_rec.put(MOV_NUMDOC,numdoc); mov_rec.put(MOV_TIPODOC,_caus->tipo_doc()); mov_rec.put(MOV_CODCAUS,_caus->codice()); mov_rec.put(MOV_DESCR,descr); - mov_rec.put(MOV_TIPOMOV,_caus->tipomov()+'0'); mov_rec.put(MOV_ANNOIVA,data_reg.year()); + mov_rec.put(MOV_TIPOMOV,char(_caus->tipomov()+'0')); mov_rec.put(MOV_ANNOIVA,data_reg.year()); mov_rec.put(MOV_REG,registro.name()); mov_rec.put(MOV_PROTIVA,ult_prot); mov_rec.put(MOV_CODVAL,codval); mov_rec.put(MOV_CAMBIO,cambio); mov_rec.put(MOV_TIPO,tipocf); @@ -1111,7 +1170,7 @@ error_type TContabilizzazione_app::compile_head_mov() if (_caus->intra()) { mov_rec.put(MOV_CODVALI,codval);mov_rec.put(MOV_CAMBIOI,cambio); - real corrval(_doc->tot_imponibili(1)); + real corrval(_doc->imponibile()); real corrlire = corrval*cambio; if (codval.not_empty() && codval != "LIT") { @@ -1120,7 +1179,7 @@ error_type TContabilizzazione_app::compile_head_mov() } else mov_rec.put(MOV_CORRLIRE,corrval); } - real totdocval(_doc->tot_documento()); + real totdocval(_doc->totale_doc()); real totdoclit = totdocval * cambio; if (codval.not_empty() && codval != "LIT") { @@ -1131,11 +1190,11 @@ error_type TContabilizzazione_app::compile_head_mov() return _error; } -error_type TContabilizzazione_app::add_iva_row(const TBill& conto, TRiepilogo_Iva& ri) +error_type TContabilizzazione_app::add_iva_row(const TBill& conto, const TRiga_documento& r) // Aggiunge le righe iva all'assoc_array di raggruppamento { TIVA_element el_tmp; - TString cod(ri.cod()); + TString cod(r.iva().codice()); const char tipo = conto.tipo(); const int gr = conto.gruppo(); const int co = conto.conto(); @@ -1144,7 +1203,7 @@ error_type TContabilizzazione_app::add_iva_row(const TBill& conto, TRiepilogo_Iv key.format("%-4s|%c|%3d|%3d|%6ld",(const char*)cod,tipo,gr,co,so); const bool exists = _righe_iva.is_key(key); TIVA_element& el = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp); - el += ri; + el += r; _righe_iva.add(key,el,exists); return no_error; } @@ -1275,7 +1334,6 @@ error_type TContabilizzazione_app::compile_rows_mov() // Compila le righe { const int rows = _doc->rows(); - const TArray& sum_arr = _doc->summary_array(); _righe_iva.destroy(); // resetta l'assoc_array delle righe di iva for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows @@ -1285,28 +1343,10 @@ error_type TContabilizzazione_app::compile_rows_mov() _tri->put("CODTAB",tiporiga); if (_tri->read() == NOERR) // controlla l'esistenza della riga { - char s4 = _tri->get("S4")[0]; - switch (s4) - { - case 'M': // righe merce - { - TBill conto; - search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro - if (good()) - { - TRiepilogo_Iva& ri = (TRiepilogo_Iva&) sum_arr[i]; - add_iva_row(conto,ri); - } - break; - } - case 'S': // righe spese (TBI) - break; - case 'C': // righe sconti (TBI) - break; - case 'D': - default : - break; - } + TBill conto; + search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro + if (good()) + add_iva_row(conto,r); } else _error = row_type_error; @@ -1332,9 +1372,9 @@ void TContabilizzazione_app::calc_pagament() TString16 codpag(head.get(MOV_CODPAG)); TString16 data(_doc->get("DATAINSC")); _pagamento = new TPagamento(codpag, data); - real totspese = _doc->tot_spese(); - real totimposte = _doc->tot_imposte(); - real totimponibili = _doc->tot_documento() - totimposte - totspese; + real totspese = _doc->spese(); + real totimposte = _doc->imposta(); + real totimponibili = _doc->totale_doc() - totimposte - totspese; const bool valuta = head.get(MOV_CODVAL).not_empty(); if (valuta) { @@ -1564,11 +1604,11 @@ void TContabilizzazione_app::display_error() break; case conto_error: msg.format("Rilevato un conto di costo/ricavo inesistente relativamente al documento %s/%ld." - "Verificare l'esistenza dei conti associati.",(const char*)_doc->numerazione(),_doc->numero()); + "Verificare l'esistenza dei conti associati alle righe.",(const char*)_doc->numerazione(),_doc->numero()); break; case movement_error: msg.format("Rilevato uno sbilancio nel movimento relativamente al documento %s/%ld." - "Verificare la correttezza degli importi.",(const char*)_doc->numerazione(),_doc->numero()); + "Verificare la correttezza degli importi delle righe.",(const char*)_doc->numerazione(),_doc->numero()); break; case mov_write_error: msg.format("Rilevato un errore in scrittura movimento relativamente al documento %s/%ld." @@ -1588,7 +1628,7 @@ void TContabilizzazione_app::contabilize_document() { _movimento = new TMovimentoPN_VE; - _doc->compile_summary(); // ricalcola il documento + //_doc->compile_summary(); // ricalcola il documento compile_head_mov(); if (good()) compile_rows_mov(); @@ -1613,6 +1653,8 @@ void TContabilizzazione_app::contabilize() TLocalisamfile righe_doc(LF_RIGHEDOC); TRectype da(LF_DOC),a(LF_DOC); const long items = _num_sheet->items(); + int year_from = _data_ini.year(); + int year_to = _data_fine.year(); TString16 codnum; TString msg; @@ -1623,11 +1665,20 @@ void TContabilizzazione_app::contabilize() { // istanzia un cursore per la numerazione corrente, con i limiti di data codnum = _num_sheet->row(i).get(1); da.put("DATADOC",_data_ini); + da.put("PROVV","D"); + da.put("ANNO",year_from); da.put("CODNUM",codnum); a.put("DATADOC",_data_fine); + a.put("PROVV","D"); + a.put("ANNO",year_to); a.put("CODNUM",codnum); TCursor doc_cur(&doc_rel,"",3,&da,&a); const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato + if (cur_items == 0) + { + warning_box("Non vi sono documenti da contabilizzare per il codice numerazione %s",(const char*)codnum); + continue; + } msg = "Contabilizzazione documenti "; msg << codnum << " dal "; msg << _data_ini.string() << " al "; diff --git a/ve/ve6100a.uml b/ve/ve6100a.uml index 7876f8d03..66e910c9f 100755 --- a/ve/ve6100a.uml +++ b/ve/ve6100a.uml @@ -9,7 +9,7 @@ BEGIN USE %ELD SELECT S3 == "TC" INPUT CODTAB F_CODICE_ELAB DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 + DISPLAY "Descrizione@55" S0 OUTPUT F_CODICE_ELAB CODTAB OUTPUT F_DESC_ELAB S0 CHECKTYPE REQUIRED @@ -20,11 +20,10 @@ STRING F_DESC_ELAB 50 39 BEGIN PROMPT 35 2 "" USE %ELD KEY 2 SELECT S3 == "TC" - INPUT S0 F_CODICE_ELAB - DISPLAY "Descrizione@50" S0 + INPUT S0 F_DESC_ELAB + DISPLAY "Descrizione@55" S0 DISPLAY "Codice" CODTAB - OUTPUT F_CODICE_ELAB CODTAB - OUTPUT F_DESC_ELAB S0 + COPY OUTPUT F_CODICE_ELAB END GROUPBOX DLG_NULL 32 4 @@ -36,14 +35,14 @@ DATE F_DATA_INI BEGIN PROMPT 2 5 "Inizio " VALIDATE NOT_EMPTY_FUNC - WARNING "La data di inizio e' obbligatoria" + WARNING "La data di inizio intervallo e' obbligatoria" END DATE F_DATA_FIN BEGIN PROMPT 2 6 "Fine " VALIDATE NOT_EMPTY_FUNC - WARNING "La data di fine e' obbligatoria" + WARNING "La data di fine intervallo e' obbligatoria" END BOOLEAN F_DATA_AUTO @@ -58,6 +57,7 @@ BEGIN PROMPT 42 6 "Data registrazione " FLAG "A" VALIDATE NOT_EMPTY_FUNC + WARNING "La data registrazione e' obbligatoria" END BUTTON DLG_OK 10 2