#include #include #include #include #include #include #include "co1.h" #include "co1300a.h" #include "socicoop.h" #include "..\ve\velib.h" #include "..\ve\velib07.h" //////////////////////////////////////////////////////// // MASCHERA //////////////////////////////////////////////////////// class TEstrattoConto_mask : public TAutomask { protected: bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TEstrattoConto_mask(); virtual ~TEstrattoConto_mask() {}; }; TEstrattoConto_mask::TEstrattoConto_mask() :TAutomask ("co1300a") { } bool TEstrattoConto_mask::on_field_event(TOperable_field& f, TField_event e, long jolly) { switch (f.dlg()) { case F_DATAINI: case F_DATAFIN: if (e == fe_init || e == fe_modify) { const TDate ini = get_date(F_DATAINI); const TDate fin = get_date(F_DATAFIN); if (ini.year() == fin.year() && ini.month() == fin.month() && ini.day() == 1 && fin.is_end_month()) enable(F_CHIUSURA); else { disable(F_CHIUSURA); reset(F_CHIUSURA); } } break; default: break; } return true; } //////////////////////////////////////////////////////// // REPORT //////////////////////////////////////////////////////// class TEstrattoConto_rep : public TDocument_report { int _riga; long _socio; real _saldocred; real _saldodeb; real _ritenuta; TString _numchi; TString _tiporit; TString _sprit; TString _tipochi; TString _tipoass; TString _spchi; TString _spass; bool _chiusura; protected: virtual bool use_mask() {return false;} virtual bool set_usr_val(const TString& name, const TVariant& var); bool incr_field(int idx, const TVariant& var); void chiudi_mese() ; public: TEstrattoConto_rep(bool chiusura); }; bool TEstrattoConto_rep::incr_field(int idx, const TVariant& var) { if (_riga > 0) { TReport_section& f1 = section('F',1); TReport_field* rf = f1.find_field(_riga * 1000 + 100 + idx); if (rf != NULL) { TVariant v = rf->get(); v += var; rf->set(v); return true; } } return false; } bool TEstrattoConto_rep::set_usr_val(const TString& name, const TVariant& var) { if(name == "#EC_TIPOMOV") { TReport_section& f1 = section('F',1); TReport_field* rf = NULL; int id; for (id = 1100; ; id += 1000) { rf = f1.find_field(id); if (rf == NULL) break; const TVariant& rfv = rf->get(); if (rfv == var) break; if (rfv.is_empty()) { rf->set(var); break; } } if (rf != NULL) _riga = id / 1000; else _riga = 0; return true; } if (name == "#EC_QTA") { incr_field(2, var); return true; } if (name == "#EC_MER") { incr_field(5, var); return true; } if (name == "#EC_ACC") { incr_field(6, var); return true; } if (name == "#EC_IMPCRE") { incr_field(7, var); return true; } if (name == "#EC_IMPDEB") { incr_field(8, var); return true; } if (name == "#EC_IMPO") { incr_field(9, var); return true; } if (name == "#EC_SOCIO") { _socio = var.as_int(); return true; } if (name == "#EC_CRED") { const real val = var.as_real(); _saldocred += val; TVariant cod; get_record_field(RDOC_CODART, cod); if (_sprit == cod.as_string() && val != ZERO) { _chiusura = false; TVariant totrit; get_usr_val("#F1.98", totrit); real v = totrit.as_real() + val; totrit = v; set_usr_val("#F1.98", totrit); } return true; } if (name == "#EC_DEB") { const real val = var.as_real(); _saldodeb += val; TVariant cod; get_record_field(RDOC_CODART, cod); if (_sprit == cod.as_string() && val != ZERO) { _chiusura = false; TVariant totrit; get_usr_val("#F1.98", totrit); real v = totrit.as_real() - val; totrit = v; set_usr_val("#F1.98", totrit); } return true; } if (name == "#EC_RIT") { _ritenuta += var.as_real(); return true; } if (name == "#EC_CHIUDI") { chiudi_mese(); return true; } return TDocument_report::set_usr_val(name,var); } void TEstrattoConto_rep::chiudi_mese() { const TRecordset * recset = recordset(); if (_chiusura) { TRecordset* r = recordset(); const TDate datachi = r->get_var("#DATAFIN").as_date(); if (_ritenuta != ZERO) // create ritenute { TDocumento doc('D', datachi.year(), _numchi, 0L); doc.set_tipo(_tiporit); doc.stato(doc.tipo().stato_finale_inserimento()); doc.put(DOC_DATADOC, datachi); doc.put(DOC_TIPOCF, "F"); doc.put(DOC_CODCF, _socio); TSpesa_prest sp(_sprit); TRiga_documento & row = doc.new_row(sp.tipo_riga()); row.put(RDOC_CODART, sp.codice()); row.put(RDOC_CHECKED, "X"); row.put(RDOC_DESCR,sp.descrizione()); row.put(RDOC_UMQTA, sp.um()); row.put(RDOC_QTA, UNO); row.put(RDOC_PREZZO, _ritenuta); row.put(RDOC_CODIVA, sp.cod_iva()); doc.write(); } real saldo = _saldocred - _ritenuta - _saldodeb; if (saldo > ZERO) // assegno { TDocumento doc('D', datachi.year(), _numchi, 0L); doc.set_tipo(_tipoass); doc.stato(doc.tipo().stato_finale_inserimento()); doc.put(DOC_DATADOC, datachi); doc.put(DOC_TIPOCF, "F"); doc.put(DOC_CODCF, _socio); TSpesa_prest sp(_spass); TRiga_documento & row = doc.new_row(sp.tipo_riga()); row.put(RDOC_CODART, sp.codice()); row.put(RDOC_CHECKED, "X"); row.put(RDOC_DESCR,sp.descrizione()); row.put(RDOC_UMQTA, sp.um()); row.put(RDOC_QTA, UNO); row.put(RDOC_PREZZO, saldo); row.put(RDOC_CODIVA, sp.cod_iva()); doc.write(); } else if (saldo < ZERO) // chiusura { TDocumento doc('D', datachi.year(), _numchi, 0L); doc.set_tipo(_tipochi); doc.stato(doc.tipo().stato_finale_inserimento()); doc.put(DOC_DATADOC, datachi); doc.put(DOC_TIPOCF, "F"); doc.put(DOC_CODCF, _socio); TSpesa_prest sp(_spchi); TRiga_documento & row = doc.new_row(sp.tipo_riga()); row.put(RDOC_CODART, sp.codice()); row.put(RDOC_CHECKED, "X"); row.put(RDOC_DESCR,sp.descrizione()); row.put(RDOC_UMQTA, sp.um()); row.put(RDOC_QTA, UNO); row.put(RDOC_PREZZO, saldo); row.put(RDOC_CODIVA, sp.cod_iva()); doc.write(); TDate dataap(datachi); dataap += 1L; saldo = - saldo; TDocumento docap('D', dataap.year(), _numchi, 0L); docap.set_tipo(_tipochi); docap.stato(docap.tipo().stato_finale_inserimento()); docap.put(DOC_DATADOC, dataap); docap.put(DOC_TIPOCF, "F"); docap.put(DOC_CODCF, _socio); sp.read(_spchi); TRiga_documento & rowap = docap.new_row(sp.tipo_riga()); rowap.put(RDOC_CODART, sp.codice()); rowap.put(RDOC_CHECKED, "X"); rowap.put(RDOC_DESCR,sp.descrizione()); rowap.put(RDOC_UMQTA, sp.um()); rowap.put(RDOC_QTA, UNO); rowap.put(RDOC_PREZZO, saldo); rowap.put(RDOC_CODIVA, sp.cod_iva()); docap.write(); } } _socio = 0L, _saldocred = ZERO; _saldodeb = ZERO; _ritenuta = ZERO; } TEstrattoConto_rep::TEstrattoConto_rep(bool chiusura) : _chiusura(chiusura), _saldocred(), _saldodeb(ZERO), _ritenuta(ZERO) { load("co1300a"); TReport_section& b11 = section('B',11); TReport_section& f1 = section('F',1); long y = 400; for (int i = 1000; i <= 8000; i += 1000) { for (int j = 100; j <= 109; ++j) { if (j == 101 || j == 103 || j == 104) continue; TReport_field* rf_b11 = b11.find_field(j); TReport_field* rf_f1 = new TReport_field(*rf_b11); f1.add(rf_f1); const int id = rf_f1->id() + i; rf_f1->set_id(id); rf_f1->set_row(y); rf_f1->set_postscript(""); rf_f1->set_prescript(""); rf_f1->set_field(""); } y += 100; } TConfig c(CONFIG_DITTA); _numchi = c.get("NumChi"); _tiporit = c.get("TipoRit"); _sprit = c.get("SpRitChi"); _tipochi = c.get("TipoChi"); _spchi = c.get("SpChi"); _tipoass = c.get("TipoAss"); _spass = c.get("SpAss"); } //////////////////////////////////////////////////////// // APPLICAZIONE //////////////////////////////////////////////////////// class TEstrattoConto : public TSkeleton_application { public: virtual void main_loop(); }; void TEstrattoConto::main_loop() { TEstrattoConto_mask m; while (m.run() == K_ENTER) { TReport_book book; TEstrattoConto_rep rep(m.get_bool(F_CHIUSURA)); const TDate dataini = m.get_date(F_DATAINI); const TDate datafin = m.get_date(F_DATAFIN); const int anno = dataini.year(); // creo recordset dei soci da stampare TISAM_recordset soci("USE SOCICOOP\nFROM CODCF=#DASOCIO\nTO CODCF=#ASOCIO"); soci.set_var("#DASOCIO", m.get_long(F_DASOCIO)); soci.set_var("#ASOCIO", m.get_long(F_ASOCIO)); for (bool ok = soci.move_first(); ok; ok = soci.move_next()) { TRecordset* r = rep.recordset(); long codcf = soci.get(SC_CODCF).as_int(); r->set_var("#SOCIO", soci.get("CODCF")); r->set_var("#ANNO", TVariant(long(anno))); r->set_var("#DATAINI", dataini); r->set_var("#DATAFIN", datafin); book.add(rep); } book.print_or_preview(); } } int co1300(int argc, char* argv[]) { TEstrattoConto a; a.run(argc, argv, TR("Stampa estratto conto")); return 0; }