Patch level : 12.0 no-patch

Files correlati     : f90.exe d181.des f181.dir f181.trr all-masks
Commento            :
- Corretto controllo annessi obligatori
- Aggiunto controllo per annesso prospetto rev. charge
- Corretta estrazione esclusi
- Aggiunto test per creazione prospetto integr.
This commit is contained in:
Simone Palacino 2020-06-15 20:33:02 +02:00
parent 1f6e110e68
commit 9118bff766
6 changed files with 341 additions and 26 deletions

View File

@ -156,8 +156,6 @@ int TEstrai_mask::estrai()
if (!progr->add_status())
break;
int numreg = recset_get_int(mov, MOV_NUMREG);
if (numreg == 96956)
bool simo = true;
TToken_string elab_f9(recset_get_string(mov, MOV_ELABF9), ';'); // Stringa del campo elaborazione f9 nel file mov
const bool escluso = !(elab_f9.items() == 3 && elab_f9.get(2)[0] != 'X' || elab_f9.empty());
@ -1253,7 +1251,7 @@ void TF9_app::fill_esclusi()
movimento_t TF9_app::escl2mov(TToken_string* row)
{
movimento_t t;
t.err = row->get(0)[0] == 'X';
t.err = false;
t.numreg = row->get_int(1);
t.datareg = row->get(2);
t.datadoc = row->get(3);
@ -1294,7 +1292,7 @@ bool TF9_app::estrai_escl_handler(TMask_field&, KEY key)
{
if (row->get(0)[0] == 'X')
{
const auto mov = escl2mov(row);
const movimento_t mov = escl2mov(row);
a._estr_escluso->add_mov(mov);
_stats = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
const int stato = a._estr_escluso->estrai();

View File

@ -122,11 +122,15 @@ bool TImport_msk::catdocann_handler(TMask_field& field, KEY key)
{
const char* s = annessi->row(annessi->selected()).get(0);
TCategorie_doc::annesso annesso;
categorie_doc().get_ann(s, annesso);
if (annesso.opcee != "RC")
msk.set(F_CATDOCANN, annesso.catdoc);
if (categorie_doc().get_ann(s, annesso))
{
if (annesso.opcee != "RC")
msk.set(F_CATDOCANN, annesso.catdoc);
else
warning_box("Impossibile importare un annesso cartaceo per un prospetto integrativo per Reverse Charge.");
}
else
warning_box("Impossibile importare un annesso cartaceo per un prospetto integrativo per Reverse Charge.");
warning_box("Errore nell'acquisire la categoria annesso");
}
}
else

View File

@ -3,6 +3,25 @@
#include "annessif9.h"
#include "applicat.h"
#include "f9lib01.h"
#include "report.h"
#include "reprint.h"
#include "sqlset.h"
#include "clifo.h"
#include "comuni.h"
#include "tabutil.h"
#include "mov.h"
#include "anagr.h"
class TReport_prosp : public TReport
{
public:
bool print(TReport_book& book)
{
set_copy(0, 1);
return book.add(*this);
}
TReport_prosp(const char* name) { load(name); }
};
/**
@ -16,6 +35,19 @@ public:
TF9_test_app() = default;
};
void format_string(TString& str_out, const TString& str)
{
str_out.cut(0) << "'" << str << "'";
}
void format_string(TString& str_out, const TDate& date)
{
TString dt; dt << date.date2ansi();
format_string(str_out, dt);
}
void TF9_test_app::main_loop()
{
TLocalisamfile f(LF_F9ANNESSI);
@ -37,7 +69,7 @@ void TF9_test_app::main_loop()
TF9_doccart d;
TString_array sa;
CHECK(d.mov2listann(search_numreg, sa) && sa.items() == 2, "COSA STAI LEGGENDO??");
//CHECK(d.mov2listann(search_numreg, sa) && sa.items() == 2, "COSA STAI LEGGENDO??");
FOR_EACH_ARRAY_ITEM(sa, nr, file)
{
TString namefile = (*(TToken_string*)file).get(1);
@ -151,13 +183,190 @@ void TF9_test_app::main_loop()
old_numreg.cut(0) << 95222; // Doppio annesso
bool movann = doccart.mov2listann(old_numreg, list_annessi);
CHECK(movann && list_annessi.items() == 2, "Error retriving list annessi from numreg %s", (const char*)old_numreg);
//CHECK(movann && list_annessi.items() == 2, "Error retriving list annessi from numreg %s", (const char*)old_numreg);
bool movannvect = doccart.mov2listann_vect(old_numreg, vect_annessi);
CHECK(movannvect && vect_annessi.size() == 2, "Error retriving vector annessi from numreg %s", (const char*)old_numreg);
//CHECK(movannvect && vect_annessi.size() == 2, "Error retriving vector annessi from numreg %s", (const char*)old_numreg);
/*TCategorie_doc::annesso annesso;
annesso.catdoc = "INTEGREV";
annesso.catdocpadre = "FATTREV";
annesso.descr = "Integrazione Rev. Charge";
annesso.opcee = "RC";
annesso.obblig = true;
TEstrazione::make_prosp_int_revc(96951, annesso);*/
TFilename freport; freport.currdir().slash_terminate() << "prosp.rep";
TReport_prosp rep(freport);
TReport_book book;
TFilename fprosp;
fprosp.tempdir().slash_terminate() << "prosp_rev.pdf";
TString numreg_acq, numreg_ven;
numreg_acq.cut(0) << "96951";
numreg_ven.cut(0) << "96952";
TLocalisamfile anagraf(LF_ANAG), clifo(LF_CLIFO), comuni(LF_COMUNI), mov_acq(LF_MOV), mov_ven(LF_MOV);
mov_acq.put(MOV_NUMREG, numreg_acq);
mov_acq.read();
anagraf.put(ANA_TIPOA, "G");
anagraf.put(ANA_CODANAGR, prefix().get_codditta());
anagraf.read();
TString* NUMREG = new TString;
TString* today = new TString;
TString* ragsoc = new TString;
TString* address = new TString;
TString* cap = new TString;
TString* citta = new TString;
TString* provin = new TString;
TString* codfisc = new TString;
TString* partiva = new TString;
TString* ndoc = new TString;
TString* datadoc = new TString;
TString* totdoc = new TString;
TString* codforn = new TString;
TString* ragsocforn = new TString;
TString* addrforn = new TString;
TString* capforn = new TString;
TString* cittaforn = new TString;
TString* provinforn = new TString;
TString* partivaforn = new TString;
TString* regacq = new TString;
TString* protivaacq = new TString;
TString* dataregacq = new TString;
TString* totale = new TString;
TString* totimponibile = new TString;
TString* totimposta = new TString;
format_string(*NUMREG, numreg_ven);
format_string(*today, TDate(TODAY));
// DATI SOCIETA':
format_string(*ragsoc, anagraf.get(ANA_RAGSOC));
format_string(*address, TString(anagraf.get(ANA_INDRES)) << ", " << anagraf.get(ANA_CIVRES));
format_string(*cap, anagraf.get(ANA_CAPRES));
comuni.put(COM_COM, anagraf.get(ANA_COMRES));
if(comuni.read() == NOERR)
{
format_string(*citta, comuni.get(COM_DENCOM));
format_string(*provin, comuni.get(COM_PROVCOM));
}
else
{
format_string(*citta, TString(""));
format_string(*provin, TString(""));
}
format_string(*codfisc, anagraf.get(ANA_COFI));
format_string(*partiva, anagraf.get(ANA_PAIV));
TString ndoc_s; ndoc_s << mov_acq.get(MOV_NUMDOCEXT);
if (ndoc_s.empty())
ndoc_s << mov_acq.get(MOV_NUMDOC);
format_string(*ndoc, ndoc_s);
format_string(*datadoc, mov_acq.get(MOV_DATADOC));
format_string(*totdoc, mov_acq.get(MOV_TOTDOC));
TString codforn_s; codforn_s << mov_acq.get(MOV_CODCF);
clifo.zero();
clifo.put(CLI_TIPOCF, "F");
clifo.put(CLI_CODCF, codforn_s);
bool ok = clifo.read() == NOERR;
format_string(*codforn, codforn_s);
format_string(*ragsocforn, ok ? clifo.get(CLI_RAGSOC) : "");
format_string(*addrforn, ok ? TString(clifo.get(CLI_INDCF)) << ", " << clifo.get(CLI_CIVCF) : "");
format_string(*capforn, ok ? clifo.get(CLI_CAPCF) : "");
if (ok)
{
comuni.zero();
comuni.put(COM_COM, clifo.get(CLI_COMCF));
comuni.read();
}
format_string(*cittaforn, ok ? comuni.get(COM_DENCOM) : "");
format_string(*provinforn, ok ? comuni.get(COM_PROVCOM) : "");
format_string(*partivaforn, ok ? clifo.get(CLI_PAIV) : "");
// Info registrazioni
format_string(*regacq, mov_acq.get(MOV_REG));
format_string(*protivaacq, mov_acq.get(MOV_PROTIVA));
format_string(*dataregacq, mov_acq.get(MOV_DATAREG));
// Calcolo dal rmoviva
format_string(*totale, TString(""));
format_string(*totimponibile, TString(""));
format_string(*totimposta, TString(""));
TString sql; sql << "SELECT COD, CODTAB, S0, R0,\n"
"B.GRUPPO, B.CONTO, B.SOTTOCONTO, B.DESCR,\n"
"B.NUMREG, B.CODIVA, B.IMPONIBILE, B.IMPOSTA, B.GRUPPO, B.CONTO, B.SOTTOCONTO, B.DATAREG, B.DATADOC, B.REG, B.PROTIVA, B.TOTDOC,\n"
<< *today << " AS TODAY, " << *ragsoc << " AS RAGSOC, " << *totdoc << " AS TOTDOC, " << *address << " AS ADDRSEDE, " << *cap << " AS CAP, " << *citta << " AS CITTA, " << *provin << " AS PROVIN,\n"
"" << *codfisc << " AS CODFISC, " << *partiva << " AS PARTIVA,\n"
"" << *ndoc << " AS NDOC, " << *datadoc << " AS DATADOC,\n"
"" << *codforn << " AS CODFORN, " << *ragsocforn << " AS RAGSOCFORN, " << *addrforn << " AS ADDRFORN, " << *capforn << " AS CAPFORN, " << *cittaforn << " AS CITTAFORN, " << *provinforn << " AS PROVINFORN, " << *partivaforn << " AS PARTIVAFORN,\n"
"" << *regacq << " AS REGACQ, " << *protivaacq << " AS PROTIVAACQ, " << *dataregacq << " AS DATAREGACQ,\n"
"" << *totale << " AS TOTALE, " << *totimponibile << " AS TOTIMPONIBILE, " << *totimposta << " AS TOTIMPOSTA\n"
"FROM(\n"
"\n"
" SELECT PCON.GRUPPO, PCON.CONTO, PCON.SOTTOCONTO, PCON.DESCR,\n"
" A.NUMREG AS NUMREG, A.CODIVA, A.IMPONIBILE, A.IMPOSTA, A.GRUPPO, A.CONTO, A.SOTTOCONTO, A.DATAREG, A.DATADOC, A.REG, A.PROTIVA, A.TOTDOC\n"
" FROM(\n"
" SELECT RMOVIVA.NUMREG AS NUMREG, CODIVA, IMPONIBILE, IMPOSTA, GRUPPO, CONTO, SOTTOCONTO, DATAREG, DATADOC, REG, PROTIVA, TOTDOC\n"
" FROM RMOVIVA\n"
" JOIN MOV\n"
" ON MOV.NUMREG = RMOVIVA.NUMREG\n"
" WHERE MOV.NUMREG = " << *NUMREG << "\n"
"\n"
" ) A\n"
" JOIN PCON\n"
" ON PCON.GRUPPO = A.GRUPPO AND PCON.CONTO = A.CONTO AND PCON.SOTTOCONTO = A.SOTTOCONTO\n"
") B\n"
"JOIN TABCOM\n"
"ON COD = 'IVA' AND CODTAB = B.CODIVA";
TSQL_recordset rs(sql);
int items = rs.items();
TString ragsoc_t = rs.get(rs.find_column("RAGSOC")).as_string();
rep.set_recordset(&rs);
rep.print(book);
book.export_pdf(fprosp, false);
delete NUMREG;
delete today;
delete ragsoc;
delete address;
delete cap;
delete citta;
delete provin;
delete codfisc;
delete partiva;
delete ndoc;
delete datadoc;
delete totdoc;
delete codforn;
delete ragsocforn;
delete addrforn;
delete capforn;
delete cittaforn;
delete provinforn;
delete partivaforn;
delete regacq;
delete protivaacq;
delete dataregacq;
delete totale;
delete totimponibile;
delete totimposta;
message_box("TESTS COMPLETELY SUCCESSFUL");
}
int f90400(const int argc, char* argv[])
{
TF9_test_app test_app;

View File

@ -9,6 +9,8 @@
#include "cg2103.h"
#include "mov.h"
#include "../fp/fplib.h"
#include "annessif9.h"
#include "printer.h"
#define MODE_SHEETS 0xC
@ -43,7 +45,7 @@ const char* TEstrazione::caus_sos(const TLocalisamfile& mov, const TipoIVA iva)
return "";
}
void TEstrazione::check_annessi(movimento_t& mov_i, const TString& numreg)
void TEstrazione::check_annessi(movimento_t& mov_i, const int numreg)
{
TToken_string ann_nexist;
if (!check_annessi_oblig(mov_i.catdoc->catdoc, numreg, ann_nexist))
@ -66,20 +68,21 @@ void TEstrazione::check_annessi(movimento_t& mov_i, const TString& numreg)
}
}
bool TEstrazione::check_annessi_oblig(const TString& catdoc, const TString& numreg, TToken_string& ann_nexist)
bool TEstrazione::check_annessi_oblig(const TString& catdoc, const int numreg, _Out_ TToken_string& ann_nexist)
{
ann_nexist.destroy(-1);
TCategorie_doc categorie;
const TString_array lista_cat_annessi = categorie.get_array_ann(catdoc); // Lista cat annessi
TF9_doccart file_cart;
std::vector<annesso_t> list_file_ann; // Lista file annessi
file_cart.mov2listann_vect(numreg, list_file_ann);
file_cart.mov2listann_vect(TString(numreg), list_file_ann);
bool ok_ann = true;
FOR_EACH_ARRAY_ITEM(lista_cat_annessi, nr, ann)
{
TCategorie_doc::annesso annesso;
const bool ok_cat = categorie.get_ann(*(TToken_string*)ann, annesso);
if (ok_cat && annesso.obblig)
// Ignoro il flag obbligatorio per il prospetto di reverse charge
if (ok_cat && annesso.obblig && annesso.opcee != "RC")
{
// Controllo che esista l'annesso per questo mov.
bool exist = false;
@ -95,6 +98,11 @@ bool TEstrazione::check_annessi_oblig(const TString& catdoc, const TString& numr
if (!exist)
ann_nexist.add(*(TToken_string*)ann);
}
else if(ok_cat && annesso.opcee == "RC")
{
// Generazione prospetto integrativo.
make_prosp_int_revc(numreg, annesso);
}
}
return ok_ann;
}
@ -247,6 +255,23 @@ bool TEstrazione::is_doc_xml(const TLocalisamfile& mov)
&& clifo.get(CLI_COMCF) != "B513"; // Campione d'Italia
}
bool TEstrazione::is_integr_rev(const int numreg, _Out_ TString& numreg_rev_vend)
{
TLocalisamfile mov(LF_MOV);
TLocalisamfile mov_rev(LF_MOV);
mov.put(MOV_NUMREG, numreg);
mov_rev.put(MOV_NUMREG, numreg + 1);
if(mov.read() == NOERR && mov_rev.read() == NOERR)
{
if(mov.get(MOV_DATADOC) == mov_rev.get(MOV_DATADOC) &&
(mov.get(MOV_NUMDOCEXT).full() && mov_rev.get(MOV_NUMDOCEXT).full() ?
mov.get(MOV_NUMDOCEXT) == mov_rev.get(MOV_NUMDOCEXT) : mov.get(MOV_NUMDOC) == mov_rev.get(MOV_NUMDOC)))
numreg_rev_vend = mov_rev.get(MOV_NUMREG);
return numreg_rev_vend.full();
}
return false;
}
bool TEstrazione::load_annessi(movimento_t& movimento)
{
TF9_doccart doccart;
@ -254,6 +279,75 @@ bool TEstrazione::load_annessi(movimento_t& movimento)
return doccart.mov2listann_vect(numreg, movimento.annessi);
}
bool TEstrazione::make_prosp_int_revc(const int numreg, TCategorie_doc::annesso& annesso)
{
TLocalisamfile mov(LF_MOV);
mov.put(MOV_NUMREG, numreg);
mov.read();
TString rev_vend = mov.get(MOV_MOVCOLL);
if(rev_vend.full() || is_integr_rev(numreg, rev_vend))
{
/* todo */
//////////////////
// Genero file /// todo
////////////////// todo
// [ NUMREG][ CAT.ANN.].pdf
// [0000000][AAAAAAAAAA].pdf
TFilename fileorig; // Nella temp
fileorig.tempdir().slash_terminate();
fileorig << format("%07d", numreg);
for(int i = 0; i < 10 - annesso.catdoc.len(); ++i)
fileorig << "_";
fileorig << annesso.catdoc << ".pdf";
// Testo che abbia scritto il file
if (!fileorig.exist())
bool simo = true;
// Sposto il file nella cartella dei documenti cartacei.
const TFilename newfile(TF9_doccart::get_full_path_file_cartaceo(fileorig.name()));
if(!newfile.exist())
CopyFile(fileorig, newfile, false);
else
{
// Rimpiazzo il file
DeleteFile(newfile);
CopyFile(fileorig, newfile, false);
}
// Controllo che non esista gia' altrimenti elimino il record
TF9_doccart doccart;
bool a;
TString numreg_old;
if (doccart.doc_already_exists(newfile, numreg_old, a))
{
TLocalisamfile lf_ann(LF_F9ANNESSI);
lf_ann.put(F9A_FILENAME, newfile.name());
lf_ann.read();
lf_ann.remove();
lf_ann.zero();
}
// Registro il file come annesso RC
TLocalisamfile lf_ann(LF_F9ANNESSI);
lf_ann.put(F9A_NUMREG, numreg);
lf_ann.put(F9A_FILENAME, newfile.name());
lf_ann.put(F9A_CATDOCPAD, annesso.catdocpadre);
lf_ann.put(F9A_CATDOCANN, annesso.catdoc);
lf_ann.put(F9A_LOADDATE, TDate(TODAY));
lf_ann.put(F9A_USER, user());
bool ok = lf_ann.write() == NOERR;
ok &= lf_ann.rewrite() == NOERR;
if(!ok)
return yesno_box("Impossibile creare il prospetto integrativo per la registrazione n. %s.\nContinuare con l'estrazione?", (const char*)numreg);
}
return false;
}
TString& TEstrazione::drd_attr()
{
static TString attr;
@ -446,7 +540,10 @@ const char* TEstrazione::diagnostica_mov()
break;
movimento_t& mov_i = *it;
#ifdef DBG
if (mov_i.numreg == 96953)
bool simo = true;
#endif
// Se escluso passo avanti
if (!mov_i.estratto && mov_i.descr_estr == movimento_t::escluso)
continue;
@ -506,8 +603,8 @@ const char* TEstrazione::diagnostica_mov()
else
{
ok &= false;
mov_i.err = true;
mov_i.estratto = false;
mov_i.err = true;
mov_i.estratto = false;
mov_i.descr_err = "Non associato a fattura elettr. abbinamento automatico non riuscito. Abbinare manualmente, o escludere";
}
default: break;
@ -540,9 +637,7 @@ const char* TEstrazione::diagnostica_mov()
TFilename file;
TString reg; reg << it->numreg;
if (filecart.mov2doc(reg, file) && file.exist())
{
mov_i.nomefilecart << file;
}
else
{
mov_i.err = true;
@ -618,7 +713,7 @@ const char* TEstrazione::diagnostica_mov()
mov_i.catdoc = cd;
if (mov_i.catdoc)
check_annessi(mov_i, numreg);
check_annessi(mov_i, mov_i.numreg);
if (!mov_i.catdoc)
++_stats.fv_nocatdoc;

View File

@ -1,7 +1,6 @@
#ifndef _F901001_H_
#define _F901001_H_
#include <list>
#include <map>
#include <set>
#include <vector>
@ -244,7 +243,7 @@ struct movimento_t
annesso_nexist // Un annesso obbligatorio e' mancante.
};
bool err;
bool err{ false };
int numreg;
TDate datareg;
TDate datadoc;
@ -343,8 +342,9 @@ class TEstrazione : public TObject
bool update_drd_stato_estr() const;
static const char* categoria_doc();
static const char* caus_sos(const TLocalisamfile& mov, TipoIVA iva);
static void check_annessi(movimento_t& mov_i, const TString& numreg); // Controllo se ci sono tutti gli annessi obbligatori.
static bool check_annessi_oblig(const TString& catdoc, const TString& numreg, TToken_string& ann_nexist);
static void check_annessi(movimento_t& mov_i, int numreg); // Controllo se ci sono tutti gli annessi obbligatori.
// Controllo se esistono tutti gli annessi cartacei obbligatori e se ci sono annessi reverse charge li genero.
static bool check_annessi_oblig(const TString& catdoc, int numreg, _Out_ TToken_string& ann_nexist);
static bool check_cartaceo_acq(const movimento_t& movimento);
static bool check_documento_vendita(const TLocalisamfile& mov, _Out_ bool& exist_doc);
/** CHECK RIFERIMENTO FPPRO
@ -363,7 +363,15 @@ class TEstrazione : public TObject
static void fill_id(TLocalisamfile& clifo, TString& statopaiv, TString& idfisc, TString& paiv, TString& codfis);
TipoIVA get_tipoiva() const { return _head.tipo_doc == 'A' ? iva_acquisti : iva_vendite; }
static bool is_doc_xml(const TLocalisamfile& mov);
static bool is_integr_rev(int numreg, _Out_ TString& numreg_rev_vend);
static bool load_annessi(movimento_t& movimento);
#ifdef DBG
public:
#endif
static bool make_prosp_int_revc(int numreg, TCategorie_doc::annesso& annesso);
#ifdef DBG
private:
#endif
static TString& drd_attr();
TString& drd_tovalues() const;
@ -467,6 +475,7 @@ class TF9_doccart
{
TLocalisamfile _tdocs;
TLocalisamfile _tannessi;
public:
bool doc_already_exists(const TFilename& file, _Out_ TString& numreg, _Out_ bool& annesso);
bool mov2doc(const TString& numreg, _Out_ TFilename& doc);

View File

@ -138,7 +138,7 @@ bool TF9_doccart::mov2listann(const TString& numreg, _Out_ TString_array& list_a
return ok;
}
bool TF9_doccart::mov2listann_vect(const TString& numreg, vector<annesso_t>& list_annessi)
bool TF9_doccart::mov2listann_vect(const TString& numreg, _Out_ vector<annesso_t>& list_annessi)
{
list_annessi.clear();
_tannessi.zero();