Merge branch 'R_10_00' of http://10.65.20.17:7990/scm/campo/campo into R_10_00

This commit is contained in:
Simone Palacino 2019-02-11 14:39:59 +01:00
commit 96a68b0437
11 changed files with 220 additions and 57 deletions

View File

@ -35,6 +35,11 @@ bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString&
inline const TString& no_special(char a); inline const TString& no_special(char a);
const TString& tipo_doc_sdi(const TDocumento& doc); const TString& tipo_doc_sdi(const TDocumento& doc);
// Controlli comuni
bool is_fattura(const TRectype& doc);
// Si potrebbe standardizzare in TISAM_recordset
TString& add_filter(const TString& field, const TString& from, const TString& to);
// Contenitore di campi di un record di database MSSQLServer // Contenitore di campi di un record di database MSSQLServer
class TPaf_record : public TObject class TPaf_record : public TObject
{ {
@ -114,6 +119,7 @@ private:
bool _is_pa; bool _is_pa;
bool _has_bolla; bool _has_bolla;
TString _codivadefault; TString _codivadefault;
long _index_cassa_previdenziale;
// Classe interna per gestire righe aggiuntive in riepilogo // Classe interna per gestire righe aggiuntive in riepilogo
class TRiepilogo_agg class TRiepilogo_agg
@ -162,6 +168,7 @@ protected:
void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const; void set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const;
void add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const; void add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const;
bool add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva, const char* eiva, const real& imponibile = ZERO, const real& imposta = ZERO); bool add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva, const char* eiva, const real& imponibile = ZERO, const real& imposta = ZERO);
bool add_cassa_previdenziale(TRiga_documento& rdoc);
const TFirm& get_firm(); const TFirm& get_firm();

View File

@ -226,6 +226,38 @@ const TString& tipo_doc_sdi(const TDocumento& doc)
{ {
return doc.get(DOC_TIPODOCSDI).full() ? doc.get(DOC_TIPODOCSDI) : doc.tipo().tipo_doc_sdi(); return doc.get(DOC_TIPODOCSDI).full() ? doc.get(DOC_TIPODOCSDI) : doc.tipo().tipo_doc_sdi();
} }
bool is_fattura(const TRectype& doc)
{
const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC));
if (!td.is_fattura()) // Tengo per buone solo le fatture e le note di credito
return false;
const TCodice_numerazione& cn = cached_numerazione(doc.get(DOC_CODNUM));
return cn.tipo() == 2 && !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa da P.A.
}
TString& add_filter(const TString& field, const TString& from, const TString& to)
{
TString& query = get_tmp_string();
const TString qf = field.find('.') < 0 ? field : field.sub(field.find('.') + 1);
if (from.full() && to.full())
{
query << "&&(BETWEEN(" << field << ", #DA" << qf << ", #A" << qf << "))";
}
else if (from.full())
{
query << "&&(" << field << ">=#DA" << qf << ")";
}
else if (to.full())
{
query << "&&(" << field << "<=#A" << qf << ")";
}
return query;
}
/*************************************************************************** /***************************************************************************
* TPaf_record * TPaf_record
***************************************************************************/ ***************************************************************************/
@ -729,6 +761,9 @@ bool TDoc_fp::initialize(const TDocumentoEsteso& doc)
} }
} }
// Azzero indici
_index_cassa_previdenziale = 1;
return true; return true;
} }
@ -905,12 +940,8 @@ void TDoc_fp::set_qta_prezzo(TPaf_record& paf1800f, TRiga_documento* rdoc) const
paf1800f.set("PI_PRZTOTALE", converti_prezzo(prezzo_tot)); paf1800f.set("PI_PRZTOTALE", converti_prezzo(prezzo_tot));
} }
void TDoc_fp::add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const const real calc_ritenuta(const TDocumento& doc)
{ {
// <DatiRitenuta>
paf0700f.set("P7_TIPORITENUTA", _rec_clifo.get_char(CLI_TIPOPERS) == 'F' ? "RT01" : "RT02");
TString doc_imponibile = doc.imponibile().string();
real imponibile_prestazioni = ZERO; real imponibile_prestazioni = ZERO;
{ {
FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc)
@ -924,11 +955,22 @@ void TDoc_fp::add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp,
// Riciclo per sommare la % delle spese da sommare // Riciclo per sommare la % delle spese da sommare
FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc)
{ {
if (rdoc->is_spese() && rdoc->spesa().get_bool("B1")) if (rdoc->is_spese() && rdoc->spesa().spe_cal_rit())
imponibile += imponibile * rdoc->spesa().perc() / CENTO; imponibile += imponibile * rdoc->spesa().perc() / CENTO;
} }
} }
return imponibile;
}
void TDoc_fp::add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp, TPaf_record& paf0700f) const
{
// <DatiRitenuta>
paf0700f.set("P7_TIPORITENUTA", _rec_clifo.get_char(CLI_TIPOPERS) == 'F' ? "RT01" : "RT02");
TString doc_imponibile = doc.imponibile().string();
const real imponibile = calc_ritenuta(doc);
paf0700f.set("P7_IMPORTORIT", converti_prezzo(imponibile * sp.perc() / CENTO)); paf0700f.set("P7_IMPORTORIT", converti_prezzo(imponibile * sp.perc() / CENTO));
paf0700f.set("P7_ALIQUOTARIT", sp.perc()); paf0700f.set("P7_ALIQUOTARIT", sp.perc());
static TString caus_la; caus_la.cut(0); static TString caus_la; caus_la.cut(0);
@ -936,8 +978,7 @@ void TDoc_fp::add_ritenuta(const TDocumentoEsteso& doc, const TSpesa_prest& sp,
if (caus_la.empty()) if (caus_la.empty())
{ {
static TString caus770; caus770.cut(0); caus770.format("%02d", sp.caus_770()); caus_la << sp.rec_caus_770().get("S2");
caus_la << cache().get("%CA7", caus770, "S2");
} }
paf0700f.set("P7_CAUSPAGAM", caus_la); paf0700f.set("P7_CAUSPAGAM", caus_la);
@ -965,8 +1006,8 @@ bool TDoc_fp::add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva
// Imponibile // Imponibile
paf2200f.set("PL_IMPONIBILE", converti_prezzo(imponibile + riepilogo_agg.imponibile)); paf2200f.set("PL_IMPONIBILE", converti_prezzo(imponibile + riepilogo_agg.imponibile));
// Imposta, per gli omaggi con addebito ho già l'imposta // Imposta
paf2200f.set("PL_IMPOSTA", converti_prezzo(imposta)); paf2200f.set("PL_IMPOSTA", converti_prezzo(imposta + riepilogo_agg.imposta));
// Esigibilità IVA // Esigibilità IVA
paf2200f.set("PL_ESIGIVA", eiva); paf2200f.set("PL_ESIGIVA", eiva);
@ -984,6 +1025,47 @@ bool TDoc_fp::add_riepilogo_iva(TPaf_record& paf2200f, const TCodiceIVA& cod_iva
return insert(paf2200f); return insert(paf2200f);
} }
bool TDoc_fp::add_cassa_previdenziale(TRiga_documento& rdoc)
{
static TPaf_record paf0800f("PAF0800F");
paf0800f.reset();
if (_index_cassa_previdenziale == 1)
{
paf0800f.set("P8_KEYHEADERFATT", _hfatt);
paf0800f.set("P8_KEYBODYFATT", _bfatt);
remove(paf0800f);
}
// Chiavi
paf0800f.set("P8_KEYHEADERFATT", _hfatt);
paf0800f.set("P8_KEYBODYFATT", _bfatt);
paf0800f.set("P8_RIFNUMLINEA", _index_cassa_previdenziale++);
// Resto
const TSpesa_prest& sp = rdoc.spesa();
const real imponibile_ritenuta = calc_ritenuta(rdoc.doc());
const real importo_cassa = imponibile_ritenuta * sp.perc() / CENTO;
paf0800f.set("P8_TIPOCASSA", sp.cassa_previdenziale());
// Aliquota della cassa
paf0800f.set("P8_ALIQCASSA", sp.perc());
// Importo contributo cassa
paf0800f.set("P8_IMCONTRCASSA", converti_prezzo(importo_cassa));
// Imponibile cassa
paf0800f.set("P8_IMPONCASSA", converti_prezzo(imponibile_ritenuta));
// Aliquota applicata alla riga spesa
paf0800f.set("P8_ALIQIVA", rdoc.iva().percentuale());
if(sp.sogg_a_rit())
paf0800f.set("P8_RITENUTA", "SI");
paf0800f.set("P8_NATURA", rdoc.iva().natura());
// Inserisco il tutto nei dati riepilogo
TRiepilogo_agg& pop = _riepilogo_agg[rdoc.iva().codice()];
pop.imponibile += importo_cassa;
pop.imposta += importo_cassa * rdoc.iva().percentuale() / CENTO;
return insert(paf0800f);
}
const TFirm& TDoc_fp::get_firm() const TFirm& TDoc_fp::get_firm()
{ {
return prefix().firm(); return prefix().firm();
@ -1307,14 +1389,16 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf3000f.set("PT_KEYHEADERFATT", _hfatt); paf3000f.set("PT_KEYHEADERFATT", _hfatt);
paf3000f.set("PT_KEYBODYFATT", _bfatt); paf3000f.set("PT_KEYBODYFATT", _bfatt);
remove(paf3000f); remove(paf3000f);
long riga = 0; long riga = 1;
FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc) FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc)
{ {
bool skip_riga = false;
paf1800f.reset(); paf1800f.reset();
paf1800f.set("PI_KEYHEADERFATT", _hfatt); paf1800f.set("PI_KEYHEADERFATT", _hfatt);
paf1800f.set("PI_KEYBODYFATT", _bfatt); paf1800f.set("PI_KEYBODYFATT", _bfatt);
paf1800f.set("PI_NUMEROLINEA", ++riga); paf1800f.set("PI_NUMEROLINEA", riga);
const TString& descrizione_riga = descrizione(*rdoc); const TString& descrizione_riga = descrizione(*rdoc);
if (descrizione_riga.empty()) if (descrizione_riga.empty())
continue; continue;
@ -1420,47 +1504,58 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
} }
else if (rdoc->is_spese()) else if (rdoc->is_spese())
{ {
const TSpesa_prest& sp = rdoc->spesa(); const TSpesa_prest& sp = rdoc->spesa();
// Controllo se ha la cassa professionale lo metto in testata
if (sp.cassa_previdenziale().full())
{
ok &= add_cassa_previdenziale(*rdoc);
skip_riga = true;
}
// Altrimenti lo metto in riga
else
{
const real imp = rdoc->importo(true, false); const real imp = rdoc->importo(true, false);
real qta = UNO; real qta = UNO;
bool qta_inverse = false; bool qta_inverse = false;
if (sp.is_tipo()) if (sp.is_tipo())
{ {
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA)); paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
qta = rdoc->get_real(RDOC_QTA); qta = rdoc->get_real(RDOC_QTA);
if (qta.is_zero()) if (qta.is_zero())
{ {
TString msg; TString msg;
msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, static_cast<const char*>(rdoc->field_qta())); msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, static_cast<const char*>(rdoc->field_qta()));
log(1, msg); log(1, msg);
qta = UNO; qta = UNO;
} }
if(qta < ZERO) if (qta < ZERO)
{ {
qta = -qta; qta = -qta;
qta_inverse = true; qta_inverse = true;
} }
paf1800f.set("PI_QUANTITA", qta); paf1800f.set("PI_QUANTITA", qta);
} }
real prz = imp; real prz = imp;
if (qta != UNO) if (qta != UNO)
{ {
prz = rdoc->prezzo(true, false, 8); prz = rdoc->prezzo(true, false, 8);
if (prz.is_zero() && !imp.is_zero()) if (prz.is_zero() && !imp.is_zero())
{ {
const TPrice price(imp / qta); const TPrice price(imp / qta);
prz = price.get_value(); prz = price.get_value();
} }
} }
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(qta_inverse ? -abs(prz) : abs(prz))); paf1800f.set("PI_PREZZOUNIT", converti_prezzo(qta_inverse ? -abs(prz) : abs(prz)));
paf1800f.set("PI_PRZTOTALE", converti_prezzo(imp)); paf1800f.set("PI_PRZTOTALE", converti_prezzo(imp));
set_IVA(*rdoc, paf1800f); set_IVA(*rdoc, paf1800f);
// Controllo se è una ritenuta fiscale // Controllo se è una ritenuta fiscale
if (sp.tipo_ritenuta() == 'F') if (sp.tipo_ritenuta() == 'F')
{ {
add_ritenuta(doc, rdoc->spesa(), paf0700f); add_ritenuta(doc, rdoc->spesa(), paf0700f);
} }
}
} }
else if (rdoc->is_prestazione()) else if (rdoc->is_prestazione())
{ {
@ -1564,9 +1659,12 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
} }
// </ScontoMaggiorazione> // </ScontoMaggiorazione>
if (!skip_riga)
paf1800f.set("PI_GESTIONE", "D"); {
ok &= insert(paf1800f) && insert(paf3000f); paf1800f.set("PI_GESTIONE", "D");
ok &= insert(paf1800f) && insert(paf3000f);
riga++;
}
} }
// Controllo plafond // Controllo plafond
// Riga esenzione? // Riga esenzione?

View File

@ -687,6 +687,9 @@ bool TTrFa_app::create()
// Questa funzione crea/verifica il DB // Questa funzione crea/verifica il DB
verifyDB(create); verifyDB(create);
// Setto se ha il modulo FP
msk().set_has_fp(has_module(FPAUT));
return TSkeleton_application::create(); return TSkeleton_application::create();
} }

View File

@ -19,9 +19,13 @@
#define B_TIPO_BOLLADOG 413 #define B_TIPO_BOLLADOG 413
#define B_TIPO_STORDOC 414 #define B_TIPO_STORDOC 414
#define END_BOOLEAN 415 // Boolean filtri FP
#define B_ESTEROMETRO 416
#define B_PAF_SENT 417
#define B_PAF_NOT_SENT 418
#define B_REVCHARGE 419
#define F_ESTEROMETRO 416 #define END_BOOLEAN 419
#define END_MASK 421 #define END_MASK 421

View File

@ -165,9 +165,37 @@ BEGIN
FLAGS "" FLAGS ""
END END
GROUPBOX DLG_NULL 65 6
BEGIN
PROMPT 30 11 "Filtri clienti FP"
MODULE FP
END
BOOLEAN B_ESTEROMETRO BOOLEAN B_ESTEROMETRO
BEGIN BEGIN
PROMPT 1 10 "Esporta solo fatture attive non inviate con FP" PROMPT 31 12 "Modalità esterometro"
MESSAGE FALSE DISABLE,10@
MESSAGE TRUE ENABLE,10@
END
BOOLEAN B_PAF_SENT
BEGIN
PROMPT 31 13 "Fatture Inviate"
GROUP 10
FLAGS ""
END
BOOLEAN B_PAF_NOT_SENT
BEGIN
PROMPT 31 14 "Fatture non Inviate"
GROUP 10
FLAGS ""
END
BOOLEAN B_REVCHARGE
BEGIN
PROMPT 31 15 "Fatture in reverse charge"
GROUP 10
FLAGS "" FLAGS ""
END END

View File

@ -61,7 +61,10 @@ enum filter_fatt
#define SPESOMETROBASE "ModuliSirio" #define SPESOMETROBASE "ModuliSirio"
#define REG_ATT 1 #define REG_ATT 1
#define REG_PAS 2 #define REG_PAS 2
#ifndef CARATTERI_SPECIALI
#define CARATTERI_SPECIALI "àèéìòù°" #define CARATTERI_SPECIALI "àèéìòù°"
#endif
/* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza) /* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza)
* per avere l'inserimento nello sheet corretto */ * per avere l'inserimento nello sheet corretto */
@ -173,12 +176,13 @@ class TTrFa_cursors : TObject
bool _newCust; bool _newCust;
// Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string // Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string
TToken_string _alqCust; TToken_string _alqCust;
bool _has_fp;
TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento
TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom
bool checkEnabled(TISAM_recordset* origCur); bool checkEnabled(TISAM_recordset* origCur);
public: public:
//TTrFa_cursors(); TTrFa_cursors(bool has_fp) : c_rmoviva(nullptr), c_trasfatt(nullptr), _newMov(false), _newCust(false), _has_fp(has_fp){}
~TTrFa_cursors(); ~TTrFa_cursors();
long int getIvaItems() { return c_rmoviva->items(); } long int getIvaItems() { return c_rmoviva->items(); }
long int getIvaPos() { return c_rmoviva->cursor()->pos(); } long int getIvaPos() { return c_rmoviva->cursor()->pos(); }
@ -199,6 +203,7 @@ class TTrFa_mask : public TAutomask
TMaskmode _mode; TMaskmode _mode;
bool _sheet_dirty; bool _sheet_dirty;
bool _filter_changed; bool _filter_changed;
bool _has_fp;
protected: protected:
virtual void next_page(int p); virtual void next_page(int p);
@ -208,6 +213,7 @@ protected:
void openJava(); void openJava();
public: public:
void set_has_fp(bool has_fp) { _has_fp = has_fp; }
void setFilterChanged() { _filter_changed = true; } void setFilterChanged() { _filter_changed = true; }
void load_sheet(); void load_sheet();
TTrFa_mask(TString msk); TTrFa_mask(TString msk);

View File

@ -614,7 +614,7 @@ void TTrFa_mask::load_sheet()
static const TString pivaDitta = cache().get(LF_ANAG, key, "PAIV"); static const TString pivaDitta = cache().get(LF_ANAG, key, "PAIV");
static const TString cofiDitta = cache().get(LF_ANAG, key, "COFI"); static const TString cofiDitta = cache().get(LF_ANAG, key, "COFI");
TTrFa_cursors c; TTrFa_cursors c(_has_fp);
TSheet_field& sheet = sfield(F_RIGHE); TSheet_field& sheet = sfield(F_RIGHE);

View File

@ -75,7 +75,7 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf
// Se non è un movimento o il controllo fallisce mi sposto // Se non è un movimento o il controllo fallisce mi sposto
int tipoDoc = getTipoDoc(c_rmoviva->get("23.TIPODOC").as_string()); int tipoDoc = getTipoDoc(c_rmoviva->get("23.TIPODOC").as_string());
if(!newMov || !checkRecord(c_rmoviva) || tipoDoc == -1 || !msk().get_bool(tipoDoc)) if(!newMov || !checkRecord(c_rmoviva, _has_fp) || tipoDoc == -1 || !msk().get_bool(tipoDoc))
{ {
static TString codiva; static TString codiva;
do do
@ -93,7 +93,7 @@ TRectype TTrFa_cursors::_next(return_code& code, TString& tipocf, TString& codcf
codiva.cut(0) << c_rmoviva->get("25.CODIVA").as_string(); codiva.cut(0) << c_rmoviva->get("25.CODIVA").as_string();
} }
} // Ciclo finchè non trovo un nuovo movimento o trovo cod IVA già presi da cust } // Ciclo finchè non trovo un nuovo movimento o trovo cod IVA già presi da cust
while((!_newMov && _alqCust.get_pos(codiva) > -1) || !checkEnabled(c_rmoviva) || !checkRecord(c_rmoviva)); while((!_newMov && _alqCust.get_pos(codiva) > -1) || !checkEnabled(c_rmoviva) || !checkRecord(c_rmoviva, _has_fp));
} }
// Se ho cambiato movimento ritorno, leggerò poi al prossimo giro // Se ho cambiato movimento ritorno, leggerò poi al prossimo giro

View File

@ -7,7 +7,7 @@
#include <recset.h> #include <recset.h>
#include <recarray.h> // cache() #include <recarray.h> // cache()
#include "../fe/felib.h" // TAnagrafica #include "../fe/felib.h" // TAnagrafica
#include "modaut.h"
/**************************************************************************************************** /****************************************************************************************************
* TSpeCheck_msk * TSpeCheck_msk
@ -18,6 +18,7 @@ class TSpeCheck_msk : public TAutomask
private: private:
TAnagrafica _ditta; TAnagrafica _ditta;
bool _selected; bool _selected;
bool _has_fp;
void refresh(); void refresh();
void fillNoFilter(); void fillNoFilter();
@ -30,7 +31,9 @@ private:
void saveAll(); void saveAll();
void deleteAll(); void deleteAll();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public: public:
void set_has_fp(bool has_fp) { _has_fp = has_fp; }
TSpeCheck_msk(); TSpeCheck_msk();
virtual ~TSpeCheck_msk() {}; virtual ~TSpeCheck_msk() {};
}; };
@ -173,7 +176,7 @@ void TSpeCheck_msk::fillNoFilter()
for(bool ok = rset.move_first(); ok; ok = rset.move_next()) for(bool ok = rset.move_first(); ok; ok = rset.move_next())
{ {
// Devo prendere tutti quelli che non vanno bene di records // Devo prendere tutti quelli che non vanno bene di records
if(checkRecord(&rset)) continue; if(checkRecord(&rset, _has_fp)) continue;
TRectype clifo = getCli(rset.get("23.TIPO").as_string(), rset.get("23.CODCF").as_string(), rset.get("23.OCCAS").as_string()); TRectype clifo = getCli(rset.get("23.TIPO").as_string(), rset.get("23.CODCF").as_string(), rset.get("23.OCCAS").as_string());
TToken_string& row = s.row(-1); TToken_string& row = s.row(-1);
@ -641,6 +644,7 @@ TSpeCheck_app& app() { return (TSpeCheck_app&)main_app(); }
void TSpeCheck_app::main_loop() void TSpeCheck_app::main_loop()
{ {
TSpeCheck_msk msk; TSpeCheck_msk msk;
msk.set_has_fp(has_module(FPAUT));
msk.run(); msk.run();
} }

View File

@ -83,7 +83,7 @@ TString getRFSO(TString codrfso)
* Nota bene: viene sfruttato un puntatore di TISAM_Recordset per non creare nuovi oggetti e velocizzare la chiamata * Nota bene: viene sfruttato un puntatore di TISAM_Recordset per non creare nuovi oggetti e velocizzare la chiamata
* a questo punto il programma non ha ancora creato un record di $trasfatt con i dati che mi interessano * a questo punto il programma non ha ancora creato un record di $trasfatt con i dati che mi interessano
*/ */
bool checkRecord(TISAM_recordset* rec) bool checkRecord(TISAM_recordset* rec, bool has_fp)
{ {
// Il record non è valido se non è presente un cliente // Il record non è valido se non è presente un cliente
if(rec->get("23.TIPO").as_string()[0] == '\0' || rec->get("23.CODCF").as_int() == 0) if(rec->get("23.TIPO").as_string()[0] == '\0' || rec->get("23.CODCF").as_int() == 0)
@ -102,25 +102,38 @@ bool checkRecord(TISAM_recordset* rec)
{ {
// Tolgo tutti i movimenti di sola IVA e in reverse charge o di tipo 3 (Acquisto di beni e servizi di soggetti non residenti) // Tolgo tutti i movimenti di sola IVA e in reverse charge o di tipo 3 (Acquisto di beni e servizi di soggetti non residenti)
TCausale caus(rec->get("23.CODCAUS").as_string(), rec->get("23.DATAREG").as_date().year()); TCausale caus(rec->get("23.CODCAUS").as_string(), rec->get("23.DATAREG").as_date().year());
if(caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3)) const bool filter_revcharge = msk().get_bool(B_ESTEROMETRO) ? msk().get_bool(B_REVCHARGE) : false;
if(!filter_revcharge && caus.soloiva() && (caus.reverse_charge() || caus.regime_speciale() == 3))
return false; return false;
// controllo se la fattura non è già stata spedita con la fatt. elettronica // controllo se la fattura non è già stata spedita con la fatt. elettronica
static TPaf_record paf0100f("PAF0100F"); static TPaf_record paf0100f("PAF0100F");
// controllo se il movimento è agganciato a un documento // controllo se il movimento è agganciato a un documento
if(!rec->get("23.DPROVV").is_empty() && !rec->get("23.DANNO").is_empty() && !rec->get("23.DCODNUM").is_empty() && !rec->get("23.DNDOC").is_empty()) if(msk().get_bool(B_ESTEROMETRO) && !rec->get("23.DPROVV").is_empty() && !rec->get("23.DANNO").is_empty() && !rec->get("23.DCODNUM").is_empty() && !rec->get("23.DNDOC").is_empty())
{ {
TString hfatt, bfatt; // Controllo valido solo per utenti non F8
TRectype rdoc(LF_DOC); const bool check_paf_sent = msk().get_bool(B_PAF_SENT);
rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string()); const bool check_paf_not_sent = msk().get_bool(B_PAF_NOT_SENT);
rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string()); // Se l'utente ha il modulo FP e uno dei due filtri possibili non è stato selezionato, abilito il controllo sui paf
rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string()); if(has_fp && (!check_paf_sent || !check_paf_not_sent))
rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string());
// se riesco a generare la chiave, trovo il record e ha il flag di gestione in errore o un errore esterno, salto la fattura (solo se attivo flag in maschera)
if (msk().get_bool(F_ESTEROMETRO) && chiave_paf(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && (paf0100f.sq_get("P1_GESTIONE") == "E" || paf0100f.sq_get("P1_ERREST") == "*"))
{ {
return false; TString hfatt, bfatt;
TRectype rdoc(LF_DOC);
static TLocalisamfile doc(LF_DOC);
rdoc.put(DOC_PROVV, rec->get("23.DPROVV").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DANNO").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DCODNUM").as_string());
rdoc.put(DOC_PROVV, rec->get("23.DNDOC").as_string());
// Se riesco a generare la chiave, trovo il record e ha il flag di gestione in errore o un errore esterno, so che è stato inviato
const bool paf_sent = rdoc.read(doc) == NOERR && chiave_paf(rdoc, hfatt, bfatt) && paf0100f.search(nullptr, hfatt, bfatt) && paf0100f.sq_get("P1_GESTIONE") != "E" && paf0100f.sq_get("P1_ERREST") != "*";
// Se voglio solo quelli inviati e non è stato inviato, RUSPA!
if (check_paf_sent && !paf_sent)
return false;
// Se voglio solo quelli non inviati ed è stato inviato, RUSPA!
if (check_paf_not_sent && paf_sent)
return false;
} }
} }

View File

@ -22,4 +22,4 @@ TString revCharge(TString numreg, int year);
// Ritorna la ragione sociale del RFSO // Ritorna la ragione sociale del RFSO
TString getRFSO(TString codrfso); TString getRFSO(TString codrfso);
// Controllo che sia un record che mi interessa // Controllo che sia un record che mi interessa
bool checkRecord(TISAM_recordset* rec); bool checkRecord(TISAM_recordset* rec, bool has_fp);