// dear emacs, this is -*-C++-*- // Questa e' la famosa palla della liquidazione IVA #ifndef __MASK_H #include #endif #ifndef __PRINTAPP_H #include #endif #ifndef __TABUTIL_H #include #endif #ifndef __CGLIB03_H #include "cglib03.h" #endif class TProgind; // ------------------------------------------------------------------ // Parametri modificabili // ------------------------------------------------------------------ // Fucked aliases to complain with new agricoltural rules #define AGR_PCON1 201 #define AGR_PCON2 202 // picture default per i reali // in caso di inflazione polacca occorrera' modificare la lunghezza // e quindi cambiare le set_row in cg4304.cpp onde evitare overlap #define REAL_PICTURE "###.###.###.###" // IVA a debito da non pagare ma riportare al mese successivo // #define IVA_DA_RIPORTARE real(50500.0) // detrazione per detraibili 6% #define DETRAZIONE_6PERCENTO real(0.06) // soglia che da' diritto alla liquidazione trimestrale per servizi // currently trecentsesantamiliu' #define SOGLIA_TRIM_SERVIZI real(360000000.0) // soglia che da' diritto alla liquidazione trimestrale per altri // currently un miliardun #define SOGLIA_TRIM_ALTRE real(1000000000.0) // minima percentuale di operazioni esenti per aver diritto al rimborso // infrannuale #define MIN_PARTE_ESENTE real(0.25) // percentuale degli imponibili da usare nel calcolo aliquota // media acquisti e vendite per controllo diritto al rimborso // infraanuuale secondo norme 1994 // ANNULLATO ANCOR PRIMA DI ESISTERE; LO LASCIO PER MEMORIA FUTURA // (due giorni di lavoro) #define PERC_IMP_RIMBORSABILE real(0.51) // NUOVO ENNESIMO CRITERIO RIMBORSO; mi si scusera' un minimo di // risentimento #define SOGLIA_MAGGIORE_ALIQUOTA_DEL_CAZZO_PER_AVER_DIRITTO_AL_RIMBORSO real(0.1) // Macro per riconoscere una eventuale percentuale pro-rata non presente in tabella // Siccome le % vanno da 0 a 100 vengono usati numeri a piacere. #define INVALID_PRORATA real(1999.0) // A Guy piacciono gli 883... a me piace Spazio 1999 #define INVALID_PRORATA_ASSERT real(883.0) // ...A little tribute 2 Max Pezzali // // ------------------------------------------------------------------ // Fine parametri modificabili // do not change below this line if you want me to work // and you to keep your fucking ass healty // ------------------------------------------------------------------ // per il campo I0 di pim #define NETTO "1" #define LORDO "2" enum recalc { needed = 1, one = 2, ever = 3, never = 4 }; enum wht { all = 1, mnt = 2, trimestre = 3}; enum tbc { precedente = 1, incorso = 2}; enum tiporeg { vendita = 1, acquisto = 2 }; enum tipo_sospensione { nessuna, normale, vol_affari, liquidazione }; // flags per gli items di stampa #define CHG_PARMS 1 // cambiato qualcosa (attivita', ditta...) #define PIM_ROW 2 // riga totali parziali per codiva #define PLAFOND 3 // prospetto plafond #define THE_END 4 // riepilogo finale #define TOT_ROW 5 // totale dei pim (plm) #define MISC_LIQ 6 // altri dati dichiarazione (ptm) #define SET_FIRM 7 // dati ditta (senza attivita') #define ANNUAL 8 // prospetto annuale (prorata etc.) #define VENTILA 9 // prospetto ventilazione #define REGAGR 10 // prospetto regime agricolo #define REGVIA 11 // prospetto agenzie viaggio #define RIMBORSO 12 // prospetto rimborso infraannuale #define ACCONTO 13 // riga prospetto acconti #define ACCHEAD 14 // header prospetto acconti #define DELDEB 15 // righe tabulato deleghe ditte a debito #define DELCRED 16 // header tabulato deleghe ditte a credito #define DELEGA 17 // descrizione versamenti #define PIM_HEAD 18 // bytes sprecati per far vedere l'intestazione pim #define LIQACC 19 // prospetto liquidazione acconto #define PROGAGR 20 // progressivi per prospetto agricolo dal 1998 #define PIS_HEAD 21 // intestazione per i PIS (stampa cappelletto iniziale) #define PIS_ROW 22 // riga totali parziali per codiva (tabella progressivi di cui da periodo successivo) // ............................................................... // support structs // ............................................................... class _VentItem : public TObject { public: // non e' bello, ma non e' bello neanche dover fare un // TObject per poter mettere una struct in un TArray real _imposta; // per comodita' real _aliquota; // aliquota iva real _totale; // totale acquisti TString _codiva; // codice iva TString _other; // codice iva a cui ventilare _VentItem() : _imposta(0.0), _totale(0.0) {} virtual ~_VentItem() {} }; class _VendItem : public TObject { public: // vedi sopra per le fisime morali real _totale; // totale vendite per registro/tipo det. TString _codreg; // codice registro int _month; // mese int _tipodet; // tipo detraibilita' _VendItem() : _codreg(5) {} virtual ~_VendItem() {} }; class _CorrItem : public TObject { public: // vedi sopra per le fisime morali real _totale; // totale vendite per registro real _totale_vf; // usato nella describe_pim(), per includere TUTTI i movimenti anche quelli validi solo per Vol. affari TString _codreg; // codice registro int _month; // mese real _aliquota; // aliquota iva TString _codiva; // codice iva TString _codatt; // codice attivita' int _tipodet; // tipo detraibilita' virtual TObject* dup() const { return new _CorrItem(*this); } _CorrItem() : _codreg(5) {} virtual ~_CorrItem() {} }; class _DescrItem : public TObject // Sembra triste e brutto esattamente come i files tabella // Ma la verita' e' che non e' affatto inefficiente // e che mi piace, nei limiti dell'entusiasmo concessomi, moltissimo { public: word _flags; word _f0, _f1, _f2, _f3; TString _s0, _s1, _s2, _s3, _s4, _s5, _s6; real _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11, _r12, _r13, _r14, _r15, _r16, _r17, _r18, _r19, _r20; TArray _arr; TDate _d0; _DescrItem(word f) : _f0(0), _f1(0), _f2(0) { _flags = f; } virtual ~_DescrItem() { } }; class _ErrItem : public TObject { public: TString _err; TString _att; TString _firm; _ErrItem(const char* err, const char* att, const char* firm) { _err = err; _att = att; _firm = firm; } virtual ~_ErrItem() {} }; // _Iva11Item serve per memorizzare gli elementi da trasferire su tab1100 class _Iva11Item : public TObject { real _value; int _file; public: virtual TObject* dup() const { return new _Iva11Item(*this); } real& value() { return _value; } int& file() { return _file; } void zero() { _value = 0.0; _file = LF_TAB1100A; } _Iva11Item() { _file = LF_TAB1100A; } virtual ~_Iva11Item() {} }; // Definisco solo i metodi add e sub, per aggiungere elementi _Iva11Item // per il resto e' un normalissimo TAssoc_array class _Iva11Array : public TAssoc_array { public: bool add(const real& val, const char* fld_name, int num_file = LF_TAB1100A); bool sub(const real& val, const char* fld_name, int num_file = LF_TAB1100A); void zero(const char* fld_name); _Iva11Array() {} virtual ~_Iva11Array() {} }; // _ProrataItem serve per calcolare prorata dal 1998 // E' un po' bruttino, perche' il caricamento delle percentuali // e' obbligato a farlo dentro all'applicazione. class _ProrataItem : public TObject { TAssoc_array _percentuali; // Elenco delle percentuali prorata memorizzate per anno public: TAssoc_array& perc_array() { return _percentuali; } real calc_prorata(const real& acq, const char * year); real percentuale(const char * year); _ProrataItem() {} virtual ~_ProrataItem() {} }; // ------------------------------------------------------------------------ // Application // ------------------------------------------------------------------------ class TLiquidazione_app : public TPrint_application { TArray_sheet* _ditte; wht _what; TBit_array _selected; int _menu; // 1 = Liquidazione, 2 = Deleghe, 3 = Acconti TString16 _year; // anno di calcolo int _month; // mese da calcolare TDate _date; // data di stampa bool _isprint; // vuoi stampare o no? bool _canprint; // PUOI stampare o no? bool _printonly; // calcolo definitivo recalc _recalc; // tipo ricalcolo scelto bool _isplafond; // plafond importatori abituali bool _isvent; // ventilazione bool _isagricolo; // regime agricolo bool _isviaggio; // regime agenzie viaggio bool _isbenzinaro; // regime benzinaro bool _gest4; // gestione 4° trim. per benzinaro bool _isannual; // dichiarazione annuale bool _mixed; // attivita' mista bool _isriepilogo; // 13a liq bool _isendliq; // annuale o riepilogo bool _isservizio; // servizi, professionisti, artisti bool _isrimborso; // vuole il rimborso infraannuale bool _isricacq; // ricalcolo imposte acq. riv (par. ditta) bool _isdifferita; // liquidazione differita e mese != 13 bool _isdiffacc; // liq. differita (usato per stampa registri) bool _isagr98; // TRUE se l'anno e' > 1997 e si sta calcolando una attivita' agricola bool _recalc_only; // solo ricalcolo progressivi bool _recalc_regis; // solo ricalcolo progressivi per registri bool _calcall; // tutte le ditte nessuna esclusa bool _isbase; // stampa base di calcolo acconto bool _isfinal; // stampa definitiva (su registro bollato) bool _isregis; // stampa per registro bool _isintr; // calcola interessi per trimestrali bool _stampa_vers; // stampa trafiletto versamento; bool _stampa_acc; // stampa trafiletto saldo/acconto bool _riepilogo; // stampa riepilogo sul registro bool _sind11; // somma imposte non detraibili in trasferimento IVA11 (da configurazione dati studio) tbc _basecalc; // tipo base di calcolo acconto TString16 _freqviva; // frequenza versamenti (M|T) long _n_ditte; // numero ditte bool _comp_acconto; // stiamo calcolando l'acconto TArray _nomiditte; // array descr. ditte per sheet TProgind* _prind; int _row; TArray _vend_arr; // tabella vendite per ventilazione TArray _corr_arr; // tabella corrispettivi TArray _vent_arr; // tabella acquisti per ventilazione TArray _descr_arr; // things to be printed TArray _errors; // errors to notify TAssoc_array _codiva_arr; // cache dei codici IVA. TAssoc_array _reg_arr; // cache dei registri. TAssoc_array _iva11_arr; // array contenente le informazioni da trasferire. // La chiave di ordinamento e' sul codice attivita'. // Ogni elemento dell'array e' un _Iva11Array // La cui chiave e' a sua volta sul nome campo // totali vari per attivita' real _p8, _p8b, _p9; // totali plafond _ProrataItem _prorata; // Mini cazzetto per calcoli prorata long __firm; // ditta selezionata all'inizio bool _is_interactive; // lanciata da menu o da altro prog bool _is_visliq; // lanciata da visualizzazione liquidazione int _monthinatt; // mese inizio attivita' (serve per differita) static real CENTO; // main cursor TRelation* _rel; TCursor* _cur; // files, tables TRelation* _tab11; // un giorno tab1100a e tab1100b saranno un unico file! TRelation* _nditte; TLocalisamfile* _mov; TLocalisamfile* _rmoviva; TLocalisamfile* _pcon_1; TLocalisamfile* _pcon_2; TInteressi_IVA_table* _ver; TTable* _pim; TTable* _pis; TTable* _prm; TTable* _prp; TTable* _pum; TTable* _pam; TTable* _pom; TTable* _plm; TTable* _pia; TTable* _lim; TTable* _lam; TTable* _pla; TTable* _ppa; TTable* _reg; TTable* _iva; TTable* _del; TTable* _lia; // a reference rectype per file/table TRectype* _mov_r; TRectype* _rmoviva_r; TRectype* _pcon_1_r; TRectype* _pcon_2_r; TRectype* _iva_r; TRectype* _pim_r; TRectype* _pis_r; TRectype* _prm_r; TRectype* _prp_r; TRectype* _pum_r; TRectype* _pam_r; TRectype* _pom_r; TRectype* _reg_r; TRectype* _nditte_r; TRectype* _pla_r; TRectype* _plm_r; TRectype* _pia_r; TRectype* _ppa_r; TRectype* _lim_r; TRectype* _lam_r; TRectype* _del_r; TRectype* _att_r; // recfields for each stronz codtab TRecfield* _pim_anno; TRecfield* _pim_codatt; TRecfield* _pim_codreg; TRecfield* _pim_mese; TRecfield* _pim_tipocr; TRecfield* _pim_codiva; TRecfield* _pim_tipodet; TRecfield* _pis_anno; TRecfield* _pis_codatt; TRecfield* _pis_codreg; TRecfield* _pis_mese; TRecfield* _pis_tipocr; TRecfield* _pis_codiva; TRecfield* _pis_tipodet; TRecfield* _prm_anno; TRecfield* _prm_codatt; TRecfield* _prm_codreg; TRecfield* _prm_mese; TRecfield* _prm_tipocr; TRecfield* _prm_codiva; TRecfield* _prm_tipodet; TRecfield* _prp_anno; TRecfield* _prp_codatt; TRecfield* _prp_codreg; TRecfield* _prp_mese; TRecfield* _prp_tipocr; TRecfield* _prp_codiva; TRecfield* _prp_tipodet; TRecfield* _pum_anno; TRecfield* _pum_codatt; TRecfield* _pum_mese; TRecfield* _pam_anno; TRecfield* _pam_codatt; TRecfield* _pam_mese; TRecfield* _pom_anno; TRecfield* _pom_codatt; TRecfield* _pom_mese; TRecfield* _ppa_year; TRecfield* _ppa_codatt; TRecfield* _ppa_month; TRecfield* _ppa_kind; TRecfield* _plm_anno; TRecfield* _plm_codatt; TRecfield* _plm_mese; TRecfield* _pia_anno; TRecfield* _pia_codatt; TRecfield* _pia_mese; TRecfield* _pia_codord; TRecfield* _pia_codcom; TRecfield* _pla_ditta; TRecfield* _pla_anno; TRecfield* _pla_codatt; TRecfield* _del_ditta; TRecfield* _del_anno; TRecfield* _del_mese; TRecfield* _del_tipo; TRecfield* _lim_anno; TRecfield* _lim_mese; TRecfield* _lam_anno; TRecfield* _lam_mese; // supporto per l'ultima figata int _firm_bookmark; int _att_bookmark; protected: long select_firm_range(long from, long to, wht freq); static bool ch_year_handler(TMask_field& f, KEY key); static bool to_ditt_handler(TMask_field& f, KEY key); static bool fr_ditt_handler(TMask_field& f, KEY key); static bool what_freq_handler(TMask_field& f, KEY key); static bool lst_tm_handler(TMask_field& f, KEY key); static bool select_button(TMask_field& f, KEY key); static bool reset_button(TMask_field& f, KEY key); static bool chk_final_handler(TMask_field& f, KEY key); static TLiquidazione_app& app() { return (TLiquidazione_app&)main_app(); } public: virtual bool user_create(); virtual bool user_destroy(); virtual bool set_print(int i); // cazzatelle per handlers TArray_sheet* get_ditte_sheet() { return _ditte; } TBit_array& get_selected() { return _selected; } void build_ditte_sheet(wht); void reset_choices(TMask&); void set_choice_limits(TMask&); void build_nomiditte(TProgind* pnd = NULL); void set_year(const char* y) { _year = y; } void set_month(const int m) { _month = m; } bool set_liquidazione(); bool recalc_all(); // ricalcolo progressivi mese bool update_firm (int month, bool recalc = TRUE); bool update_att (int month, const char* codatt, bool recalc = TRUE); void zero_att (int month, const char* codatt); void zero_annual (int month); void recalc_att (int month, const char* codatt); void recalc_annual (const char* codatt); _DescrItem* recalc_rimborso(int month, const char* codatts, bool print); // Le funzioni che hanno come prefisso iva11 sono per creare il file di trasferimento per IVA11 // Viene chiamata quando vengono scorsi tutti i movimenti, settando gli elementi di _iva11_arr. void iva11_set_arr_phase_1 (const TString& codatt); // Scorre tutti i PIM della ditta, per completare _iva11_arr prima di chiamare write_IVA11() void iva11_set_arr_phase_2 (const TString& codatt); // Scrive per la ditta/attivita' corrente, i dati relativi al trasferimento IVA11 // Se viene passato TRUE come parametro, azzera i campi R1 ed R2. void iva11_write (bool reset_r1r2 = FALSE); // ricalcolo liquidazioni dai progressivi mensili void write_liq (int month, const char* atts); // ritorna l'eventuale ma sempre appropriato debito (< 50.000) real debt_prec(int month); // ritorna il risultato della liquidazione del mese // non considera il conguaglio prorata (annuale) real result_liq(int month); // ritorna l'appropriato credito precedente al mese in corso real credito_prec(int month); // ritorna l'appropriato credito di costo precedente al mese in corso // (travel agency only) real credito_costo_prec(int month); // ritorna i versamenti effettuati nel mese per // i tipi delega passati (stile tokenstring) sommando // gli interessi se interesse = TRUE real versamenti_IVA(int month, const char* types, bool interesse = FALSE); // Ritorna il valore dell'iva da riportare (solitamente 50500) real iva_da_riportare(int month); // Funzione personale di arrotondamento alle 1000 LIRE o all'euro. // Risolve il seguente problema: da 0 a 500 lire arrotonda alle mille inferiori // da 501 a 999 arrotonda alle mille superiori. void round_imposta(real& d) const; // Funzione personale di arrotondamento alla lira o centesimo di euro. void round_alla_lira(real& d, bool superiore = FALSE); // supporto stampa void describe_firm(int month); void describe_att(int month, const char* codatt, bool isresult, char flags); void describe_name(int month, TToken_string& atts, char flags); void describe_plafond(int month, const char* codatt); void describe_ventilation(int month, const char* codatt); void describe_agricolo(int month, const char* codatt); void describe_viaggio(int month, const char* codatt); void describe_pims(int month, const char* codatt, const bool describe_pis); void describe_liq(int month, const char* codatts, _DescrItem* d = NULL); void describe_error(const char* errstr, const char* codatt); void describe_annual(const char* codatt); void describe_consistence(const char* codatt); void describe_liqacc(); _DescrItem* describe_deleghe(int month); // corrispettivi void recalc_corrispettivi (int month, const char* codatt); // ventilasiun void recalc_ventilation (int month, const char* codatt); // ag. viaggio void recalc_viaggio (int month, const char* codatt); // plafond void zero_plafond (int month, const char* codatt); void add_plafond (int month, const char* codatt, int type, real& howmuch, bool intra); // Ritorna il parametro della liquidazione differita per la ditta corrente, cosi come // e' scritto sui parametri liquidazione (LIA) // Se si passa 0 (default) vede prende la ditta correntemente in corso di calcolo // Analogamente per l'anno bool TLiquidazione_app::is_differita(long firm = 0, int year = 0); // ritorna l'aliquota ordinaria dal // codice IVA apposito immesso nei parametri studio real aliquota_agvia(); // ritorna l'interesse per il mese in questione (dai parametri studio) real interesse_trimestrale(int month); // minchia di puro suino void add_vendite (int month, const char* codreg, int tipodet, real& r); void add_ventilation (real iva, real sum, const char* codiva, const char* other); void add_corrisp (int month, const char* codreg, real& r, real& p, int tipodet, const char* codiva, const char* codatt); //vergine immacolata, richiamata per scorporare l'iva nei corrispettivi peccatori void lordo2netto(const real& totale, real& imponibile, real& imposta, const real& aliquota); void lordo2netto(real& imponibile, real& imposta, const real& aliquota); // printappings virtual void set_page(int file, int counter); virtual bool preprocess_page(int file, int counter); virtual print_action postprocess_page(int file, int counter); // settaggio righe per ogni elemento di _descr_arr void set_plafond(_DescrItem& d); void set_ventila(_DescrItem& d); void set_regagr(_DescrItem& d); void set_viaggio(_DescrItem& d); void set_firm(_DescrItem& d); void set_att(_DescrItem& d); void set_pim(_DescrItem& d); void set_pumpam(_DescrItem& d); void set_plm(_DescrItem& d); bool set_annual(_DescrItem& d); void set_grand(_DescrItem& d); void set_grand_1999(_DescrItem& d, int &rw); void set_grand_2000(_DescrItem& d, int &rw); void set_pim_head(_DescrItem& d); void set_liqacc_1999(_DescrItem& d); void set_liqacc_2000(_DescrItem& d); // Utility per stampare nella colonna debito o credito void print_importo(int rw, const char* prompt, real imp, bool red = FALSE); // cercapalle in tabelle con opzione di creazione se serve bool look_pim(int m, const char* a, const char* r, const char* cr, const char* i, int tipodet = 0, bool create = FALSE); bool look_pis(int m, const char* a, const char* r, const char* cr, const char* i, int tipodet = 0, bool create = FALSE); bool look_prm(int m, const char* a, const char* r, const char* cr, const char* i, int tipodet = 0, bool create = FALSE); bool look_prp(int m, const char* a, const char* r, const char* cr, const char* i, int tipodet = 0, bool create = FALSE); bool look_pum(int m, const char* a, bool create = FALSE); bool look_pam(int m, const char* a, bool create = FALSE); bool look_pom(int m, const char* a, bool create = FALSE); bool look_plm(int m, const char* a, bool create = FALSE); bool look_pia(int m, const char* a, const char* cod1, const char* cod2, bool create = FALSE); bool look_lim(int m, bool create = FALSE); bool look_lam(int m, bool create = FALSE); bool look_pla(const char* a, bool create = FALSE); bool look_ppa(int m, const char* a, int t, bool create = FALSE); bool look_del(int month, int type, bool create = FALSE); bool look_iva(const char* cod); bool look_reg(const char* reg); bool look_lia(long ditta = 0l, bool create = FALSE, int anno = 0); // trova il mytical ufficio concessione da mettere nelle deleghe bool look_conc(TString& uffcon, TString& uffiva); _VendItem* look_vendita(int m, const char* codreg); _VentItem* look_ventilation(int m, const char* codreg); // tutti i controlli del mondo sui mesi da calcolare static bool is_trim (int x); // ritorna il mese corrispondente alla scadenza del trimestre relativo // senza considerare la frequenza versamenti int next_trim(int x); // is_month_ok controlla che il mese passato sia // da prendere in considerazione per la liquidazione // controllando il regime trimestrale o mensile e // il ricalcolo annuale bool is_month_ok(int x, int mtocalc); // is_month_ok_strict controlla che il mese sia OK per la // liquidazione, ma ritorna TRUE per le trimestrali solo // se il mese cade ESATTAMENTE su un trimestre bool is_month_ok_strict(int x, int month = -1); // questa e' la piu' semplice, per vedere se devo // calcolare il mese fottendomene dell'annuale bool is_month_plain(int x); // questa serve per i progressivi: la data passata va bene // se il movimento deve essere considerato in calcolo e riepilogo // per la liquidazione di month bool is_date_ok (const TDate& d, int month, int liqmonth, int year); bool is_in_liq_period(const TDate& d); bool is_first_month (int m); int liq_month(int x); int previous_month (int m); // Funzioni accessorie: estrazione deleghe bool set_deleghe(); bool extract_deleghe(); bool extract_delega(int m, TArray& desc); bool video_conferma(const real&, const real&, const real&, bool to_del = FALSE); // stampa void set_deltab(_DescrItem& d, bool iscred); // Funzioni accessorie: calcolo acconto dicembre // i real passati sono due cazzi di correzioni iva che // vanno settate nella maschera anche se non potranno // mai riguardare tutte le ditte bool set_acconto (real&, real&); bool recalc_acconti(real&, real&); bool recalc_acconto(real&, real&); // stampa void set_acconto_p(_DescrItem& d); void set_acchead_p(_DescrItem& d); real credito_utilizzato(int month, bool iva, bool f24) const; // cippiuppiu' TLiquidazione_app(int men); virtual ~TLiquidazione_app() {} };