#include #include #include #include #include #include #include #include #include #include #include #include #include "../cg/cglib.h" #include "../cg/conto.h" #include "../cg/saldacon.h" #include "sc1200.h" class TCreatepart_app : public TApplication { TEsercizi_contabili _esc; bool _num_cli, _num_for; TString _desccl, _descfo; TDate _today; TLocalisamfile* _conti; protected: // Applicat virtual void on_firm_change(); virtual void on_config_change(); virtual bool create(); virtual bool destroy(); virtual bool menu(MENU_TAG m); protected: void zap_file(int logicnum) const; bool zap_partite() const; int crea_partite(int anno_es, int anno_rif, int next_anno_es); public: char is_clifo(int g, int c, long s, int& indbil); TCreatepart_app() : _today(TODAY) {} virtual ~TCreatepart_app() {} }; bool TCreatepart_app::create() { TApplication::create(); _conti = new TLocalisamfile(LF_PCON); dispatch_e_menu(BAR_ITEM(1)); return TRUE; } bool TCreatepart_app::destroy() { delete _conti; return TApplication::destroy(); } void TCreatepart_app::on_firm_change() { _esc.update(); } void TCreatepart_app::on_config_change() { TConfig cd(CONFIG_DITTA, "cg"); _num_cli = cd.get_bool("NrCliDx"); _num_for = cd.get_bool("NrForDx"); TPartita::carica_allineamento(); } void TCreatepart_app::zap_file(int logicnum) const { TDir dir; dir.get(logicnum, _lock, _nordir, _sysdirop); dir.eod() = 0; dir.put(logicnum, _nordir, _sysdirop); TSystemisamfile f(logicnum); f.pack(); } bool TCreatepart_app::zap_partite() const { bool ok = TRUE; TSystemisamfile partite(LF_PARTITE); partite.open(); bool zap = partite.items() != 0; partite.close(); if (zap) { zap = yesno_box("Il saldaconto non e' vuoto.\n" "La procedura lo azzera completamente.\n" "Si desidera proseguire?"); if (zap) zap = yesno_box("Confermare l'azzeramento del saldaconto esistente"); if (zap) { zap_file(LF_PARTITE); zap_file(LF_SCADENZE); zap_file(LF_PAGSCA); } else ok = FALSE; } return ok; } char TCreatepart_app::is_clifo(int g, int c, long s, int& indbil) { _conti->zero(); _conti->put(PCN_GRUPPO, g); _conti->put(PCN_CONTO, c); if (_conti->read() != NOERR) { warning_box("Archivio saldi disallineato con il piano dei conti\n record saldi non elaborato : gruppo %d conto %d sottoconto %ld", g, c, s); return '\0'; } const char cf = _conti->get_char(PCN_TMCF); indbil = _conti->get_int(PCN_INDBIL); return cf; } int TCreatepart_app::crea_partite(int anno_es, int anno_rif, int next_anno_es) { const bool check = anno_es != next_anno_es; TRelation saldi(LF_SALDI); saldi.curr().put(SLD_ANNOES, anno_es); TCursor cur(&saldi, "", 1, &saldi.curr(), &saldi.curr()); const long items = cur.items(); if (items == 0) return 0; begin_wait(); // Apre i files per usarli con l'oggetto TPartita TLocalisamfile partite(LF_PARTITE); TLocalisamfile scadenze(LF_SCADENZE); TLocalisamfile pagamenti(LF_PAGSCA); int n_part = 0; TProgind prind(items, "Creazione saldaconto", FALSE, TRUE, 45); for (cur = 0; cur.pos() < items; ++cur) { const int gruppo = cur.curr().get_int(SLD_GRUPPO); const int conto = cur.curr().get_int(SLD_CONTO); const long sottoc = cur.curr().get_long(SLD_SOTTOCONTO); int indbil; const char cf = is_clifo(gruppo, conto, sottoc, indbil); if (check) { TLocalisamfile work_saldi(LF_SALDI); work_saldi.zero(); work_saldi.put(SLD_GRUPPO, gruppo); work_saldi.put(SLD_CONTO, conto); work_saldi.put(SLD_SOTTOCONTO, sottoc); work_saldi.put(SLD_ANNOES, next_anno_es); work_saldi.put(SLD_FLSCA, ""); if (work_saldi.read() == NOERR) continue; } if (cf > ' ') { TSaldo sld; real s; // ciuccia il saldo e vedi se e' movimentato nell'esercizio corrente if (!sld.ultima_immissione_verifica(anno_es, gruppo, conto, sottoc, indbil, 1)) { // non movimentato: se e' conto patrimoniale.... if (!(indbil == 1 || indbil == 2 || indbil == 5)) { prind.addstatus(1); continue; } // .. vedi saldo esercizio precedente, altrimenti inkul s = sld.saldofin_esprec(anno_es, gruppo, conto, sottoc); } else s = sld.saldo(); // genera importo con sezione appropriata TImporto saldo('D', s); saldo.normalize(); // Non togliere, serve per stabilire fattura/nota credito if (!saldo.is_zero()) { const TBill clifo(gruppo, conto, sottoc, cf); TString16 numero("*"); if ((cf == 'C' && _num_cli) || (cf == 'F' && _num_for)) numero.right_just(7); TPartita game(clifo, anno_rif, numero); /* if (check) { for (int p = game.last(); p > 0; p = game.pred(p)) { const TRiga_partite& riga = game.riga(p); const int g = riga.get_int(PART_GRUPPOCL); const int c = riga.get_int(PART_CONTOCL); if (gruppo == g && conto == c) break; // Esiste gia' una riga con questo conto } if (p > 0) // Il cliente esiste gia', per cui ignoro il saldo continue; } */ TRiga_partite& riga = game.new_row(); riga.put(PART_DATAREG, _today); riga.put(PART_DATADOC, _today); riga.put(PART_SEZ, saldo.sezione()); riga.put(PART_IMPORTO, saldo.valore()); riga.put(PART_IMPTOTDOC,saldo.valore()); riga.put(PART_DESCR, cf == 'C' ? _desccl : _descfo); // cazzata dare/avere/fare/baciare/cagare const tipo_movimento tipo = (cf == 'C') ^ (saldo.sezione() == 'A') ? tm_fattura : tm_nota_credito; riga.put(PART_TIPOMOV, (int)tipo); if (tipo == tm_fattura) { TRiga_scadenze& scad = riga.new_row(); scad.put(SCAD_IMPORTO, saldo.valore()); scad.put(SCAD_DATASCAD, _today); scad.put(SCAD_TIPOPAG, 1); // rimessa diretta } else { riga.put(PART_DATAPAG, _today); const int r = riga.get_int(PART_NRIGA); TRectype& unas = game.unassigned().row(r, TRUE); unas.put(PAGSCA_IMPORTO, saldo.valore()); unas.put(PAGSCA_ACCSAL, 'A'); } if (game.write()) n_part++; else { error_box("Impossibile scrivere la partita %d %s", anno_rif, (const char *)numero); break; } } } prind.addstatus(1); } end_wait(); return n_part; } bool TCreatepart_app::menu(MENU_TAG) { TMask m("sc1200a"); _desccl << "Apertura clienti al " << _today; _descfo << "Apertura fornitori al " << _today; m.set(F_DESCCL, _desccl); m.set(F_DESCFO, _descfo); m.set(F_ANNO, _esc.last()); while (m.run() == K_ENTER) { const int anno_es = m.get_int(F_ANNO); _desccl = m.get(F_DESCCL); _descfo = m.get(F_DESCFO); // sputtana tutto il saldaculo if (!zap_partite()) continue; const TEsercizio& selected_es = _esc.esercizio(anno_es); const int anno_rif = selected_es.inizio().year(); int n_part = crea_partite(anno_es, anno_rif, selected_es.codice()); const int pred_es = _esc.pred(anno_es); if (pred_es > 0) { const int p = crea_partite(pred_es, anno_rif, selected_es.codice()); if (p > 0) n_part += p; } if (n_part > 0) { TString msg(80); msg << "Sono state create " << n_part << " partite"; message_box(msg); break; } } // while run return FALSE; } int sc1200(int argc, char** argv) { TCreatepart_app a; a.run(argc, argv, "Apertura scadenze da saldi"); return 0; }