#include "cglib.h" #include "causali.h" #include enum tiporeg { vendita = 1, acquisto = 2, riepilogativo = 3, incassi = 4, giornale = 5, sociale = 6, cespiti = 7 }; /////////////////////////////////////////////////////////// // TRiepilogoIVA_report /////////////////////////////////////////////////////////// bool TRiepilogoIVA_report::set_recordset(TRecordset * set) { const bool ok = TReport::set_recordset(set); if (set != nullptr) { set->unfreeze(); set->requery(); set->freeze(); } return ok; } /////////////////////////////////////////////////////////// // TRiepilogoIVA_recordset /////////////////////////////////////////////////////////// class TRiepilogoIVA_record : public TObject { TString4 _cod; TArray _values; real & get_val(int index); TRiepilogoIVA_record & copy(const TRiepilogoIVA_record & r); public: virtual TObject* dup() const { return new TRiepilogoIVA_record(*this); } const TString & cod() const { return _cod; } real & impacq() { return get_val(0); } real & ivaacq() { return get_val(1); } real & impcorr() { return get_val(2); } real & ivacorr() { return get_val(3); } real & impven() { return get_val(4); } real & ivaven() { return get_val(5); } real & impacqind() { return get_val(6); } real & ivaacqind() { return get_val(7); } TRiepilogoIVA_record& operator= (const TRiepilogoIVA_record & rec) { return copy(rec);} TRiepilogoIVA_record(const TRiepilogoIVA_record & rec) { copy(rec); } TRiepilogoIVA_record(const char * cod) : _cod(cod) {} }; TRiepilogoIVA_record & TRiepilogoIVA_record::copy(const TRiepilogoIVA_record & r) { _cod = r._cod; _values = r._values; return *this; } real & TRiepilogoIVA_record::get_val(int index) { real * val = (real *)_values.objptr(index); if (val == nullptr) _values.add(val = new real, index); return *val; } void TRiepilogoIVA_recordset::requery() { if (not_frozen()) { TAssoc_array work_array; TISAM_recordset recset(query_text()); recset.set_var("#FROMDATE", from(), true); recset.set_var("#TODATE", to(), true); recset.set_var("#ANNO", (long)anno(), true); if (codatt().full()) recset.set_var("#CODATT", codatt(), true); recset.set_var("#DAMESE", (long)da_mese(), true); recset.set_var("#AMESE", (long)a_mese(), true); for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { TString cod = recset.get(RMI_CODIVA).as_string(); TRiepilogoIVA_record * rec = (TRiepilogoIVA_record *)work_array.objptr(cod); long gruppo = recset.get(RMI_GRUPPO).as_int(); long conto = recset.get(RMI_CONTO).as_int(); long sottoconto = recset.get(RMI_SOTTOCONTO).as_int(); int indetr = recset.get(RMI_TIPODET).as_int(); TRegistro reg(recset.get(FIELD_NAME(LF_MOV, MOV_REG)).as_string()); TipoIVA t = reg.iva(); TDate data = recset.get(FIELD_NAME(LF_MOV, MOV_DATAREG)).as_date(); const int meseliq = recset.get(FIELD_NAME(LF_MOV, MOV_MESELIQ)).as_int(); const TDate datadoc = recset.get(FIELD_NAME(LF_MOV, MOV_DATADOC)).as_date(); const TipoIVA tipo = reg.iva(); // 1=Vendite; 2=Acquisti const bool fatt_rit_2018 = recset.get(FIELD_NAME(LF_MOV, MOV_RITFATT)).as_bool() && (data.year() >= 2018); const int year_diff = data.year() - datadoc.year(); const bool fattritind = ((tipo == iva_acquisti) && fatt_rit_2018) && ((year_diff > 2) || ((year_diff >= 1) && data.month() >= 5)); const bool fattrit = ((tipo == iva_acquisti) && !fattritind && fatt_rit_2018) && (year_diff >= 1); if (is_competenza()) { if (meseliq != 0) { if (meseliq > data.month()) data.addyear(-1); data.set_month(meseliq); data.set_end_month(); } } if (fattrit) { data.addyear(-1); data.set_month(12); data.set_end_month(); } if (data.year() != anno() || (data.year() == anno() && (data.month() < da_mese() || data.month() > a_mese()))) continue; if (rec == nullptr) work_array.add(cod, rec = new TRiepilogoIVA_record(cod)); if (t == iva_acquisti) { if (indetr == 0) { real & r = rec->impacq(); r += recset.get(RMI_IMPONIBILE).as_real(); real & r1 = rec->ivaacq(); r1 += recset.get(RMI_IMPOSTA).as_real(); } else { real & r = rec->impacqind(); r += recset.get(RMI_IMPONIBILE).as_real(); real & r1 = rec->ivaacqind(); r1 += recset.get(RMI_IMPOSTA).as_real(); } } else if (t == iva_vendite) { if (reg.corrispettivi()) { real & r = rec->impcorr(); r += recset.get(RMI_IMPONIBILE).as_real(); real & r1 = rec->ivacorr(); r1 += recset.get(RMI_IMPOSTA).as_real(); } else { real & r = rec->impven(); r += recset.get(RMI_IMPONIBILE).as_real(); real & r1 = rec->ivaven(); r1 += recset.get(RMI_IMPOSTA).as_real(); } } } TString_array keys; work_array.get_keys(keys); _rows.destroy(); FOR_EACH_ARRAY_ITEM(keys, i, obj) { TString & key = (TString &)*obj; TRiepilogoIVA_record & row = (TRiepilogoIVA_record &)work_array.find(key); _rows.add(row); } } } bool TRiepilogoIVA_recordset::move_to(TRecnotype pos) { bool ok = (pos >= 0) && (pos < items()); if (_pos < 0) pos = 0; else if (_pos >= items()) _pos = items() - 1; else _pos = pos; return ok; } const TString& TRiepilogoIVA_recordset::query_text() const { TString & query = get_tmp_string(); // query << "USE " << LF_RMOVIVA << " KEY 1 SELECT BETWEEN(" << FIELD_NAME(LF_MOV, MOV_DATAREG) << ";" << '"' << "FROMDATE" << '"' << ";" << '"' << "TODATE" << '"' << ")"; query << "USE " << LF_RMOVIVA << " KEY 1 SELECT BETWEEN(" << FIELD_NAME(LF_MOV, MOV_DATAREG) << "; #FROMDATE; #TODATE)"; if (codatt().full()) { // query << "&&(" << FIELD_NAME(REG, "S8") << "==\"" << _codatt << "\")"; query << "&&(" << FIELD_NAME(REG, "S8") << "=#CODATT)"; query << "\nJOIN " << LF_MOV << " INTO " << MOV_NUMREG << "==" << RMI_NUMREG; query << "\nJOIN REG TO " << LF_MOV << " INTO CODTAB==" << MAIN_SUB_FIELD_NAME(MOV_DATAREG, 7, 10) << "+" << MOV_REG; } else query << "\nJOIN " << LF_MOV << " INTO " << MOV_NUMREG << "==" << RMI_NUMREG; // query << "USE " << LF_RMOVIVA << " KEY 1 SELECT BETWEEN(" << LF_MOV << "." << MOV_DATAREG << ";FROMDATE;TODATE) \nJOIN " << LF_MOV << " INTO NUMREG==NUMREG"; return query; } const TVariant& TRiepilogoIVA_recordset::get_field(int num, const char* field) const { if (*field != '#') { TVariant & val = get_tmp_var(); TRiepilogoIVA_record & row = (TRiepilogoIVA_record &) _rows[_pos]; if (xvt_str_compare_ignoring_case(field, IVAVEN) == 0) int i = 1; if (xvt_str_compare_ignoring_case(field, COD) == 0) { val = row.cod(); return val; } else if (xvt_str_compare_ignoring_case(field, DESC) == 0) { TCodiceIVA c(row.cod()); val = c.descrizione(); return val; } else if (xvt_str_compare_ignoring_case(field, IMPACQ) == 0) { val = row.impacq(); return val; } else if (xvt_str_compare_ignoring_case(field, IVAACQ) == 0) { val = row.ivaacq(); return val; } else if (xvt_str_compare_ignoring_case(field, IMPCORR) == 0) { val = row.impcorr(); return val; } else if (xvt_str_compare_ignoring_case(field, IVACORR) == 0) { val = row.ivacorr(); return val; } else if (xvt_str_compare_ignoring_case(field, IMPVEN) == 0) { val = row.impven(); return val; } else if (xvt_str_compare_ignoring_case(field, IVAVEN) == 0) { val = row.ivaven(); return val; } else if (xvt_str_compare_ignoring_case(field, IMPACQIND) == 0) { val = row.impacqind(); return val; } else if (xvt_str_compare_ignoring_case(field, IVAACQIND) == 0) { val = row.ivaacqind(); return val; } } return NULL_VARIANT; } void TRiepilogoIVA_recordset::add_field(TFieldtypes tipo, short id, int width, const char* name) { TRecordset_column_info* i = new TRecordset_column_info; TString& n = i->_name; if (name && *name) n = name; i->_type = tipo; i->_pos = id; i->_width = width; _info.add(i); } const TVariant& TRiepilogoIVA_recordset::get(unsigned int column) const { TVariant & v = get_tmp_var(); if (_pos >= 0 && _pos < items() && column >= 0 && column < columns()) { const TRecordset_column_info& info = column_info(column); v = get_field(0, info._name); } return v; } TRiepilogoIVA_recordset::TRiepilogoIVA_recordset() : TRecordset(), _pos(0), _annuale(false) { add_field(_alfafld, 101, 4, COD); add_field(_alfafld, 102, 50, DESC); add_field(_realfld, 103, 18, IMPACQ); add_field(_realfld, 104, 18, IVAACQ); add_field(_realfld, 105, 18, IMPCORR); add_field(_realfld, 106, 18, IVACORR); add_field(_realfld, 107, 18, IMPVEN); add_field(_realfld, 108, 18, IVAVEN); add_field(_realfld, 109, 18, IMPACQIND); add_field(_realfld, 110, 18, IVAACQIND); }