campo-sirio/src/tf/tf0500.cpp
Mattia Tollari d894071ebd Patch level : 12.0 738
Files correlati     : tf
Commento            :
- Tolto controllo fornitore bolla doganale
- Sistemati filtri maschera spesometro
- Invertito ordine "Sogg. Fatt. Elettr" e Esteri in fornitori (era diverso rispetto ai clienti)
- Refactor dei nomi generale
2019-03-19 11:21:48 +01:00

351 lines
10 KiB
C++
Raw Blame History

#include "tf0500a.h"
#include <applicat.h>
#include <automask.h>
#include <config.h>
#include <progind.h>
#include <recarray.h> // cache()
#include <textset.h> // TCSV_recordset
#include <golem.h> // goto_url()
#include <utility.h> // get_iva_sirio()
#define TIPO_FILE "DF"
#define TFBASE "ModuliSirio"
#define CODICE_FORNITURA "IVP"
class TIva_send_msk : public TAutomask
{
bool _mese;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
bool check_variables();
bool is_mese() const { return _mese; }
TIva_send_msk() : TAutomask("tf0500a"){}
};
// Definizione per chiamare metodo send dalla maschera
class TIva_send_app : public TSkeleton_application
{
void generate_n_send(TIva_send_msk& msk) { generate(msk) && send(); }
bool generate(TIva_send_msk& msk);
TToken_string get_testata(TIva_send_msk& msk);
public:
bool send();
virtual void main_loop();
};
TIva_send_app& app() { return (TIva_send_app&)main_app(); }
const TRectype get_anag_ditta()
{
TString codanagr = cache().get(LF_NDITTE, prefix().firm().codice(), "TIPOA");
codanagr << "|" << cache().get(LF_NDITTE, prefix().firm().codice(), "CODANAGR");
return cache().get(LF_ANAG, codanagr);
}
// Ritorna il record richiesto di tabcom.LIM
const TRectype get_lim(int anno, int mese)
{
TString key; key << anno;
if(mese < 10)
key << "0" << mese;
else
key << mese;
return cache().get("LIM", key);
}
// Ritorna il record richiesto di ivaliq
const TRectype get_liq(int anno, int mese)
{
TString key; key << anno << "|";
if(mese < 10)
key << "0";
key << mese << "|U";
return cache().get(LF_IVALIQ, key);
}
// Ritorna il record richiesto di tabcom.LIA
const TRectype get_lia(int anno)
{
TString key; key << format("%05d", prefix().firm().codice()) << anno; // %05d Crea un numero di 5 cifre partendo dal codice e mettendoci 0 davanti
return cache().get("%LIA", key);
}
TString format_currency(const TString& value)
{
const real app(value);
if(app == ZERO)
return ",00";
else
return TCurrency(app).string();
}
bool TIva_send_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch(o.dlg())
{
case F_PATH:
if(e == fe_init)
{
set(F_PATH, ini_get_string(CONFIG_STUDIO, "tf", "path_invio"));
}
case F_ANNO:
if(e == fe_modify)
{
TString cod = get(F_CODDITTA); cod << get_int(F_ANNO);
if(cache().get("%LIA", cod).empty())
{
warning_box("Attenzione anno di liquidazione non presente");
set(F_ANNO, "");
break;
}
if(cache().get("%LIA", cod, "S7") == "M")
{
_mese = true;
enable(F_DAMESE);
enable(F_AMESE);
disable(F_DATRIMESTRE);
disable(F_ATRIMESTRE);
}
else
{
_mese = false;
disable(F_DAMESE);
disable(F_AMESE);
enable(F_DATRIMESTRE);
enable(F_ATRIMESTRE);
}
}
else if(e == fe_init)
{
// Per trovare un valore tento per 5 anni di vedere se c'<27> una liquidazione aperta, cos<6F> da valorizzare tutta la roba
int year = TDate(TODAY).year();
for(int i = year; i >= year - 5; i--)
{
TString cod = get(F_CODDITTA);
cod << i;
if(cache().get("%LIA", cod).empty()) continue;
if(cache().get("%LIA", cod, "S7") == "M")
{
set(F_ANNO, i);
_mese = true;
enable(F_DAMESE);
enable(F_AMESE);
disable(F_DATRIMESTRE);
disable(F_ATRIMESTRE);
break;
}
else
{
set(F_ANNO, i);
_mese = false;
disable(F_DAMESE);
disable(F_AMESE);
enable(F_DATRIMESTRE);
enable(F_ATRIMESTRE);
break;
}
}
}
break;
case F_DAMESE:
if(e == fe_modify)
set(F_AMESE, get_int(F_DAMESE)+2);
break;
case F_DATRIMESTRE:
if(e == fe_modify)
set(F_ATRIMESTRE, get_int(F_DATRIMESTRE));
break;
case DLG_EMAIL:
if(e == fe_button)
app().send();
break;
}
return true;
}
bool TIva_send_msk::check_variables()
{
if(get(F_ANNO).empty())
{
error_box("Inserire un anno di liquidazione");
return false;
}
if((_mese && get(F_DAMESE).empty() && get(F_AMESE).empty()) || (!_mese && get(F_DATRIMESTRE).empty() && get(F_ATRIMESTRE).empty()))
{
error_box("Inserisci un periodo");
return false;
}
if((_mese && (get_int(F_DAMESE) > get_int(F_AMESE))) || (!_mese &&(get_int(F_DATRIMESTRE) > get_int(F_ATRIMESTRE))))
{
error_box("Date immesse non corrette");
return false;
}
return true;
}
bool TIva_send_app::generate(TIva_send_msk& msk)
{
if(!msk.check_variables())
return false;
ofstream file;
TFilename path(msk.get(F_PATH));
TRectype row_lia = get_lia(msk.get_int(F_ANNO));
// Decido di utilizzare I10 come numero progressivo di trasmissione
int prog = row_lia.get_int("I14");
if(prog == 0)
{
prog = get_lia(msk.get_int(F_ANNO) - 1).get_int("I14");
}
prog++;
TString nome_file; nome_file << "IT" << get_anag_ditta().get("PAIV") << TIPO_FILE << prog << ".csv";
path.add(nome_file);
file.open(path, ios::out);
if(!file.is_open())
error_box(TR("Impossibile aprire il file alla posizione %s"), path);
else
ini_set_string(CONFIG_STUDIO, "tf", "path_invio", msk.get(F_PATH));
const TToken_string testata(get_testata(msk));
int start = msk.is_mese() ? msk.get_int(F_DAMESE) : (((msk.get_int(F_DATRIMESTRE)) * 3));
const int end = msk.is_mese() ? msk.get_int(F_AMESE) : (((msk.get_int(F_ATRIMESTRE)) * 3));
for(; start <= end; start++)
{
TRectype row_lim = get_lim(msk.get_int(F_ANNO), start); // row_lim viene gi<67> usata sopra
TRectype row_liq = get_liq(msk.get_int(F_ANNO), start);
TToken_string riga(testata);
if(msk.is_mese())
{
riga.add(start); // Mese
riga.add(""); // Trimestre
}
else
{
riga.add(""); // Mese
riga.add(row_liq.get_int("TRIMESTRE") == 4 ? "5" : row_liq.get("TRIMESTRE")); // Trimestre
}
const char subfor = row_liq.get_bool("SUBFOR") ? 'X' : '\0';
riga.add(subfor); // Flag Subfornitura
riga.add(""); // Eventi eccezionali
riga.add(format_currency(row_liq.get("TOTOPATT"))); // Totale operazioni attive (al netto dell'IVA)
riga.add(format_currency(row_liq.get("TOTOPPAS"))); // Totale operazioni passive (al netto dell'IVA)
riga.add(format_currency(row_liq.get("IVAES"))); // IVA esigibile
riga.add(format_currency(row_liq.get("IVADET"))); // IVA detratta
riga.add(format_currency(row_liq.get("IVADOV"))); // IVA dovuta
riga.add(format_currency(row_liq.get("IVADOVC"))); // IVA a credito VP6 col 2
riga.add(format_currency(row_liq.get("DEBPREC"))); // Debito periodo precedente
riga.add(format_currency(row_liq.get("CREPREC"))); // Credito periodo precedente
riga.add(format_currency(row_liq.get("CREAPREC"))); // Credito anno precedente
riga.add(format_currency(row_liq.get("VEAUE"))); // Versamenti auto UE
riga.add(format_currency(row_liq.get("CREIMP"))); // Crediti di imposta
riga.add(format_currency(row_liq.get("INTLIQTRI"))); // Interessi dovuti per liquidazioni trimestrali
riga.add(format_currency(row_liq.get("ACCDOV"))); // Acconto dovuto
riga.add(format_currency(row_liq.get("IVAVER"))); // IVA da versare
riga.add(format_currency(row_liq.get("IVAVERC"))); // IVA a credito VP14 col 2
riga.add(prog); // Numero interno trasmissione
riga.add(""); // Flag trasmesso
riga.add(""); // Flag accettato
// Appendo al file
file << riga << "\n";
}
file.close();
// Aggiorno l'univoco
row_lia.put("I14", prog);
if(row_lia.rewrite(TLocalisamfile(LF_TABCOM)) != NOERR)
{
error_box("Errore aggiornamento progressivo");
return false;
}
return true;
}
TToken_string TIva_send_app::get_testata(TIva_send_msk& msk)
{
TToken_string testata; // Token string di virgole
TString cod_forn = CODICE_FORNITURA; cod_forn << msk.get(F_ANNO).right(2);
testata.add(cod_forn); // Codice Fornitura
testata.add(""); // Cod.Fisc. Sost. Dich.
testata.add(""); // Cod. Carica Sost. Dich.
testata.add(msk.get_int(F_ANNO)); // Anno comunicazione
testata.add(""); // Mese comunicazione
TRectype ana_ditta = get_anag_ditta();
testata.add(ana_ditta.get("COFI")); // Codice fiscale
testata.add(ana_ditta.get("PAIV")); // Partita IVA
testata.add(""); // P.IVA Controllante
testata.add(""); // Flag Liq. gruppo
testata.add(""); // Flag firma comunicazione
const int codice_carica = atoi(prefix().firm().get("CARRAPP"));
if(codice_carica > 0)
{
TString key = "F|"; key << prefix().firm().get("RAPPR");
const TString cod_fisc = cache().get(LF_ANAG, key, "COFI");
testata.add(cod_fisc); // Cod.Fisc. Dichiarante
testata.add(codice_carica); // Cod.Carica Dichiarante
}
else
{
testata.add(""); // Cod.Fisc. Dichiarante
testata.add(""); // Cod.Carica Dichiarante
}
testata.add(""); // Cod.Fisc. Soc. Dichiarante
testata.add(""); // Cod.Fisc. Intermediario
testata.add(""); // Flag Impegno
testata.add(""); // Data Impegno
testata.add(""); // Flag Firma Intermediario
testata.add(""); // Flag Conferma
testata.add(get_iva_sirio());
// Ricorda! Il programma di Leo vuole true = 'S', false = '' !
return testata;
}
bool TIva_send_app::send()
{
TFilename tmp = TFBASE"\\ModuliSirio.jar";
tmp.make_absolute_path();
DIRECTORY old_dir; xvt_fsys_get_dir(&old_dir);
DIRECTORY new_dir; xvt_fsys_convert_str_to_dir(tmp.path(), &new_dir);
xvt_fsys_set_dir(&new_dir);
const bool good = goto_url(tmp);
if (good)
{
xvt_sys_sleep(3000);
}
else
{
error_box(FR("Impossibile eseguire Java -jar %s"), static_cast<const char*>(tmp));
}
xvt_fsys_set_dir(&old_dir);
return true;
}
void TIva_send_app::main_loop()
{
TIva_send_msk msk;
while(msk.run() == K_ENTER)
{
generate_n_send(msk);
}
}
int tf0500(int argc, char* argv[])
{
TIva_send_app app;
app.run(argc, argv, TR("Invio dati liquidazione IVA"));
return 0;
}