Patch level : 12.0 1140

Files correlati     : cg2.exe cg2100c.msk cg2100t.msk
Commento:
Nelle fatture intra l'identificativo SDI viene recuperato da FPPRO e scritto sulla fattura di acquisto e sulla regolarizzazione
This commit is contained in:
Alessandro Bonazzi 2022-05-03 00:34:38 +02:00
parent 45c2598cc7
commit 4d94988b54
7 changed files with 383 additions and 420 deletions

View File

@ -50,6 +50,8 @@ public:
TString4 _causale_originale;
TipoIVA _iva_originale;
TString_array _iva;
TString _idsdi;
TDate _datasdi;
};
///////////////////////////////////////////////////////////
@ -59,7 +61,7 @@ public:
TPrimanota_application::TPrimanota_application()
: _rel(nullptr), _mode(0), _iva(nessuna_iva), _causale(nullptr), _giornale(nullptr),
_lastreg(0), _last_dreg(TODAY), _last_dcom(TODAY), _automatico(nullptr), _swap_mask(false), _is_set_fpcheck(false), _f1_ini(false), _f1_liq(false),
_skip_giornale_check(false), _skip_bollato_check(false)
_skip_giornale_check(false), _skip_bollato_check(false), _pro_mask(nullptr)
{
memset(_msk, 0, sizeof(_msk));
}
@ -439,7 +441,7 @@ bool TPrimanota_application::read_caus(const char* cod, int year)
}
const char sezione = rcaus->get_char(RCA_SEZIONE);
const TImporto zero('D', ZERO);
TImporto zero('D', ZERO);
const TString80 desc(causale().desc_agg(i));
if (nriga == 1) m->set(F_DESCR, desc);
@ -697,7 +699,7 @@ void TPrimanota_application::init_mask(TMask& m)
_sal_dirty = false; // Azzero il flag di modifica del saldaconto
fill_sheet(m); // Riempe righe contabili coi conti della causale
m.hide(F_LINKDOC);
set_has_f1_db(&m);
has_f1_db(m);
}
void TPrimanota_application::init_query_mode(TMask& m)
@ -736,7 +738,7 @@ void TPrimanota_application::init_query_mode(TMask& m)
m.set(F_CODCAUS, ini.get(MOV_CODCAUS));
m.send_key(K_SPACE, DLG_NEWREC);
}
set_has_f1_db(&m);
has_f1_db(m);
}
@ -995,17 +997,19 @@ void TPrimanota_application::init_insert_mode(TMask& m)
m.enable(F_BOLLACODCLI, causale().tipo_doc() == "BD");
m.enable(F_BOLLARAGCLI, causale().tipo_doc() == "BD");
}
if (iva() != nessuna_iva)
f1_init(m, m.get_date(F_DATAREG) >= get_data_start_fatt());
}
void TPrimanota_application::f1_init_modify(TMask& m, const TRectype& mov)
void TPrimanota_application::f1_init(TMask& m, const bool fe_enabled, const bool f1_linked)
{
const bool after_data_inizio_fe = mov.get_date(MOV_DATADOC) >= get_data_start_fatt();
const bool reverse_charge = app().causale().reverse_charge_pubb();
m.field(F_IDDOCSDI).show(after_data_inizio_fe);
m.field(F_DATADOCSDI).show(after_data_inizio_fe);
m.field(F_COLFPPRO).show(after_data_inizio_fe);
m.field(DLG_LINK).enable(after_data_inizio_fe);
m.set(F_COLFPPRO, !after_data_inizio_fe || mov.get(MOV_KEYFPPRO).empty() ? " " : "X");
m.field(F_IDDOCSDI).show(fe_enabled && reverse_charge);
m.field(F_DATADOCSDI).show(fe_enabled && reverse_charge);
m.field(F_COLFPPRO).show(fe_enabled);
m.field(DLG_LINK).enable(fe_enabled);
m.set(F_COLFPPRO, fe_enabled && f1_linked, 0x3);
}
void TPrimanota_application::init_modify_mode(TMask& m)
@ -1116,7 +1120,7 @@ void TPrimanota_application::init_modify_mode(TMask& m)
m.enable(F_BOLLARAGCLI, causale().tipo_doc() == "BD");
}
if (iva() != nessuna_iva)
f1_init_modify(m, mov);
f1_init(m, mov.get_date(MOV_DATADOC) >= get_data_start_fatt(), mov.get(MOV_KEYFPPRO).full());
}
// Controlla sulla causale se il segno del totale documento (ritsoc=false)
@ -1488,18 +1492,14 @@ void TPrimanota_application::check_saldi()
void TPrimanota_application::write_fppro()
{
#ifdef DBG
if (!ini_get_bool(CONFIG_INSTALL, "Main", "SkipFPPRO"))
if (main_app().has_module(FPAUT) && !ini_get_bool(CONFIG_INSTALL, "Main", "SkipFPPRO"))
{
#endif
// Controllo se la registrazione ha avuto effetto anche su FPPRO allora salvo riferimento sul mov
if (save_fppro() > 0 && !save_dbmov())
message_box(
"ATTENZIONE: non e' stato possibile salvare i riferimenti del documento in ingresso per questo movimento.\n"
"Movimento registrato senza collegamento ai documenti in ingresso.");
#ifdef DBG
}
#endif
}
bool TPrimanota_application::has_tot_doc(TToken_string& fppro_keys)
@ -1556,7 +1556,7 @@ void TPrimanota_application::set_movcoll(const long movcoll, const long numreg)
}
int TPrimanota_application::controlli_f1(const TMask& m)
{
if (m.find_by_id(F_PROKEY) != nullptr && m.get(F_PROKEY).full() && has_f1_db((TMask*)&m) && fp_db().sq_is_connect() && check_causale(m.get(F_CODCAUS)))
if (iva_mask(m) && m.get(F_PROKEY).full() && has_f1_db(m) && fp_db().sq_is_connect() && check_causale(m.get(F_CODCAUS)))
{
TToken_string keys(m.get(F_PROKEY), ';');
const TDate dataoraric = fppro_db().set_keys(keys).get_dataorarioric();
@ -1717,10 +1717,19 @@ int TPrimanota_application::rewrite(const TMask& m)
if (caus.reverse_charge_pubb())
{
const long movcoll = m.get_long(F_MOVCOLL);
long movcoll = m.get_long(F_MOVCOLL);
if (movcoll == 0L)
find_movcoll(_rel->file().get_long(MOV_NUMREG));
movcoll = m.get_long(F_MOVCOLL);
if (movcoll > 0L)
{
TRectype & reccoll = (TRectype &) cache().get(LF_MOV, movcoll);
reccoll.put(MOV_IDDOCSDI, m.get(F_IDDOCSDI));
reccoll.put(MOV_DATADOCSDI, m.get(F_DATADOCSDI));
reccoll.rewrite();
}
}
mask2rel(m);
@ -1788,7 +1797,7 @@ void TPrimanota_application::clean_fppro()
// Controlli: solo in mod modifica; che abbia fp-f1 (no F8); che non sono in salvataggio
if (_mode != MODE_MOD
|| !has_f1_db(&msk)
|| !has_f1_db(msk)
|| last_key != K_DEL && last_key != K_SAVE && last_key != K_ELIMMAS && last_key != K_QUIT && !scollega())
return;
@ -1803,27 +1812,17 @@ void TPrimanota_application::clean_fppro()
fp_db().sq_commit();
}
void TPrimanota_application::set_has_f1_db(TMask* m)
bool TPrimanota_application::has_f1() const
{
if (m->find_by_id(F_DATAREG) != nullptr && !m->get(F_DATAREG).empty())
{
if (TDate(m->get(F_DATAREG)) >= TDate(get_data_start_fatt()))
_isf1 = has_module(F1AUT) && !get_db_indirizzo().empty();
else
_isf1 = false;
_is_set_fpcheck = true;
}
else if (!_is_set_fpcheck)
{
_isf1 = false;
_is_set_fpcheck = true;
}
return has_module(F1AUT) && get_db_indirizzo().full();
}
bool TPrimanota_application::has_f1_db(TMask* m)
bool TPrimanota_application::has_f1_db(const TMask & m)
{
set_has_f1_db(m);
return _isf1;
const TDate datareg = m.get_date(F_DATAREG);
_is_set_fpcheck = true;
return datareg.ok() && (datareg >= get_data_start_fatt()) && has_f1();
}
bool TPrimanota_application::remove()
@ -1892,6 +1891,8 @@ void TPrimanota_application::genera_automatico(int tipo, const char* causimm)
_automatico->_movcoll = m.get_long(F_NUMREG);
_automatico->_iva.destroy();
_automatico->_totale = ZERO;
_automatico->_idsdi = m.get(F_IDDOCSDI);
_automatico->_datasdi = m.get(F_DATADOCSDI);
for (int i = 0; i < items; i++)
{
TToken_string row = iva.row(i);
@ -1979,6 +1980,9 @@ void TPrimanota_application::genera_automatico(int tipo, const char* causimm)
const TString& clnt = cache().get(LF_CLIFO, forn, CLI_CODCFASS);
m.set(F_CODCLIFOR, clnt);
}
m.set(F_IDDOCSDI, _automatico->_idsdi);
m.set(F_DATADOCSDI, _automatico->_datasdi);
TSheet_field & iva = m.sfield(F_SHEETIVA);
const int items = _automatico->_iva.items();
@ -2672,7 +2676,7 @@ int TPrimanota_application::save_fppro()
TMask& msk = curr_mask();
// Provo a vedere se hanno l'FP: se c'è l'indirizzo controllo che non sia F8 se non c'è non hanno l'FP
if (!has_f1_db(&msk))
if (!has_f1_db(msk))
return pro_nofp;
// Anzitutto guardo la modalita' in cui sono
@ -2737,7 +2741,7 @@ int TPrimanota_application::save_fppro()
items = fp_db().sq_items();
}
if(has_f1_db(&msk) && items != 1)
if(has_f1_db(msk) && items != 1)
{
const bool forza = noyes_box("Attenzione, al movimento non e' stato abbinato nessun documento elettronico.\n"
"Per consentire una corretta archiviazione sostitutiva si consiglia di provvedere al controllo della registrazione e di procedere\n"
@ -2851,6 +2855,7 @@ bool TPrimanota_application::link_intra(const TMask& m, const char* action)
const BOOLEAN bModify = xvt_str_same(action, "Modify");
TFilename intrini;
intrini.tempdir();
intrini.add("ActIntra.ini");

View File

@ -91,11 +91,11 @@
#define F_REVCHARGE 184
#define F_MOVCOLL 185
#define F_GOCOLL 186
#define F_IDDOCSDI 187
#define F_DATADOCSDI 188
#define F_IDDOCSDI 187
#define F_DATADOCSDI 188
#define F_SHEETCG 190
#define F_SHEETIVA 191
#define F_SHEETIVA 191
// Sheet contabile

View File

@ -569,7 +569,7 @@ END
STRING F_PROKEY 80
BEGIN
PROMPT 1 19 "db key"
PROMPT 1 26 "DB key"
HELP "Chiave database"
FIELD KEYFPPRO
FLAGS "H"

View File

@ -13,12 +13,14 @@ BEGIN
PROMPT 2 1 "Contabilizzaz."
PICTURE TOOL_EXPORT
MODULE F1
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_LINK 2 2
BEGIN
PROMPT 3 1 "Collega in Prima nota"
PICTURE TOOL_LINK
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_QUIT 2 2

View File

@ -219,7 +219,10 @@ TSheet_field& TPrimanota_application::cgs() const
void TPrimanota_application::set_cgs_imp(int n, const TImporto& imp)
{
TSheet_field& s = cgs();
imp.add_to(s.row(n), 0);
TImporto i(imp);
i.normalize();
i.add_to(s.row(n), 0);
s.force_update(n);
}
@ -371,7 +374,7 @@ void TPrimanota_application::reset_sheet_row(TSheet_field& s, int n)
s.destroy(n); // Remove line n
}
int TPrimanota_application::set_cgs_row(int n, const TImporto& imp,
int TPrimanota_application::set_cgs_row(int n, TImporto& importo,
const TBill& conto, const char* desc,
char tipo, const char* cms, const char* fas)
{
@ -380,7 +383,8 @@ int TPrimanota_application::set_cgs_row(int n, const TImporto& imp,
TToken_string& row = cg.row(n);
row.cut(0);
imp.add_to(row, 0);
importo.normalize();
importo.add_to(row, 0);
row.add(conto.string(0x3));
row.add(""); // Codice decrizione
row.add(desc); // Descrizione aggiuntiva
@ -1536,7 +1540,7 @@ void TPrimanota_application::add2cg_row(TSheet_field& s, TToken_string & row, TS
{
const TBill conto(row, cid2index(IVA_TIPO), 0x1);
const int pos = bill2pos(conto, cgrowtype_imponibile); // Riga in cui andra' l'imponibile
const TImporto imp = a.real2imp(d > 0 ? imp_det : imp_ind, tipod); // Imponibile
TImporto imp = a.real2imp(d > 0 ? imp_det : imp_ind, tipod); // Imponibile
if (pos >= 0) // Se il conto esisteva anche prima ...
{
@ -1761,7 +1765,7 @@ bool TPrimanota_application::iva_notify(TSheet_field& s, int r, KEY k)
real pimponibile(pag.imponibile(inv));
pimponibile.round(pag.round(inv));
if ((pimposta != imposta || pimponibile != imponibile) && (!a._f1_ini && (a._pro_mask == nullptr || !a._pro_mask->should_bring_back())))
if ((pimposta != imposta || pimponibile != imponibile) && (!a._f1_ini && (a._pro_mask == nullptr || !a._pro_mask->da_riportare())))
a.set_scadenze(m); // Ricalcola rate
}
}
@ -2842,7 +2846,7 @@ void TPrimanota_application::add_cgs_tot(TMask& m)
TImporto imp = real2imp(m.get_real(F_TOTALE), cgrowtype_totale);
set_cgs_row(riga_totale, imp.normalize(), nuovo, descr, cgrowtype_totale);
set_cgs_row(riga_totale, imp, nuovo, descr, cgrowtype_totale);
}
calcola_imp(); // Ricalcola totale IVA
calcola_saldo(); // Ricalcola sbilanci
@ -3018,7 +3022,7 @@ bool TPrimanota_application::clifo_handler(TMask_field& f, KEY key)
ixc->set(ic ? "X" : "");
}
if(m.get(F_PROKEY).empty() && app().has_module(F1AUT))
fppro_mask(f, key);
a.fppro_mask(f, key);
}
}
return true;
@ -3562,21 +3566,11 @@ HIDDEN void inventa_cambio_intra(TMask& m)
{
const TString& codval = m.get(F_VALUTAINTRA);
if (codval.not_empty() && TCurrency::get_firm_val() != codval)
if (codval.full() && TCurrency::get_firm_val() != codval)
{
TTable cam("CAM");
const TRectype & cam =cache().get("CAM", codval);
cam.put("CODTAB", codval);
const int err = cam.read(_isgteq);
bool yes = err != NOERR;
if (!yes)
{
TString16 v = cam.get("CODTAB");
v.cut(3).rtrim();
yes = v != codval;
}
if (yes)
if (cam.full())
m.set(F_CAMBIOINTRA, cache().get("%VAL", codval, "S4"));
}
}
@ -3903,71 +3897,74 @@ bool TPrimanota_application::quadratura_handler(TMask_field& f, KEY key)
return true;
}
void TPrimanota_application::write_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
void TPrimanota_application::write_righe_iva_f1(TMask& cg_msk, const TPro_msk & msk)
{
TSheet_field& sf = cg_msk.sfield(F_SHEETIVA);
const vector<TPro_msk::riga_iva_s>& righe = msk->get_righeiva();
int i = 0;
const TString_array& righe = msk.get_righeiva();
for (auto it = righe.begin(); it != righe.end(); ++it)
FOR_EACH_ARRAY_ITEM( righe, r, obj)
{
if(it->imponibile != 0 || it->imposta != 0)
{
TToken_string& row = sf.row(i);
TToken_string & riga = STRING_TOKEN(obj);
const real imponibile = riga.get_real(FPRI_IMPONIBILE);
const real imposta = riga.get_real(FPRI_IMPOSTA);
sf.notify(i, K_SPACE);
row.add(it->imponibile, cid2index(IVA_IMPONIBILE));
row.add(it->imposta, cid2index(IVA_IMPOSTA));
row.add(it->aliquota, cid2index(IVA_PERCIVA));
row.add(it->natura, cid2index(IVA_NATURIVA));
sf.notify(i, K_ENTER);
i++;
if (imponibile != ZERO || imposta != ZERO)
{
TToken_string& row = sf.row(r);
sf.notify(r, K_SPACE);
sf.set_row_cell(IVA_IMPONIBILE, imponibile, r);
sf.set_row_cell(IVA_IMPOSTA, imposta, r);
sf.set_row_cell(IVA_PERCIVA, riga.get(FPRI_ALIQUOTA), r);
sf.set_row_cell(IVA_NATURIVA, riga.get(FPRI_NATURA), r);
sf.notify(r, K_ENTER);
}
}
}
bool TPrimanota_application::write_scad_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
bool TPrimanota_application::write_scad_f1(const TMask& cg_msk, const TPro_msk & msk)
{
TSheet_field& sf = cg_msk.sfield(FS_RATESHEET);
const int items = sf.items();
const vector<TPro_msk::scadenza_s>& righe = msk->get_scadenze();
int i = 0;
const TString_array & righe = msk.get_scadenze();
for (auto it = righe.begin(); it != righe.end(); ++it, ++i)
FOR_EACH_ARRAY_ITEM(righe, r, obj)
{
TToken_string& row = app().pags().row(i);
TToken_string& row = app().pags().row(r);
TToken_string & riga = STRING_TOKEN(obj);
if(i >= items)
pag_notify(sf, i, K_CTRL+K_INS);
pag_notify(sf, i, K_SPACE);
row.add(it->data, cid2index(101));
row.add(it->importo, cid2index(102));
pag_notify(sf, i, K_ENTER);
if (r >= items)
pag_notify(sf, r, K_CTRL+K_INS);
pag_notify(sf, r, K_SPACE);
sf.set_row_cell(101, riga.get_date(FPSC_DATA), r);
sf.set_row_cell(102, riga.get_real(FPSC_IMPORTO), r);
pag_notify(sf, r, K_ENTER);
}
return !righe.empty();
return righe.items() > 0;
}
void TPrimanota_application::write_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
void TPrimanota_application::write_clifo(TMask& cg_msk, const TPro_msk & msk)
{
bool ok = false;
TLocalisamfile clifo(LF_CLIFO);
TToken_string keys(msk->get_fpprokeys(), ';');
TString codforn = TFppro(keys).get_codforn();
TToken_string keys(msk.get_fpprokeys(), ';');
long codforn = TFppro(keys).get_codforn();
if (codforn.empty())
codforn = msk->get_codforn();
if (codforn.empty())
if (codforn == 0L)
codforn = msk.get_codforn();
if (codforn == 0L)
{
clifo.setkey(5);
clifo.put(CLI_TIPOCF, "F");
clifo.put(CLI_PAIV, msk->get_piva());
clifo.put(CLI_PAIV, msk.get_piva());
clifo.read();
ok = clifo.get(CLI_PAIV) == msk->get_piva();
ok = clifo.get(CLI_PAIV) == msk.get_piva();
if(!ok)
{
clifo.zero();
clifo.setkey(5);
clifo.put(CLI_TIPOCF, "F");
clifo.put(CLI_PAIV, msk->get_piva());
clifo.put(CLI_PAIV, msk.get_piva());
clifo.put(CLI_STATOPAIV, "IT");
clifo.read();
}
@ -3979,8 +3976,8 @@ void TPrimanota_application::write_clifo(TMask& cg_msk, const shared_ptr<TPro_ms
clifo.put(CLI_CODCF, codforn);
clifo.read();
}
ok = clifo.get(CLI_PAIV) == msk->get_piva();
if (ok && (cg_msk.get(F_CODCLIFOR).empty() || cg_msk.get(F_CODCLIFOR) != codforn))
ok = clifo.get(CLI_PAIV) == msk.get_piva();
if (ok && (cg_msk.get_long(F_CODCLIFOR) == 0 || cg_msk.get_long(F_CODCLIFOR) != codforn))
{
cg_msk.set(F_CODCLIFOR, clifo.get(CLI_CODCF));
cg_msk.set(F_RAGSOCCF, clifo.get(CLI_RAGSOC));
@ -3988,20 +3985,21 @@ void TPrimanota_application::write_clifo(TMask& cg_msk, const shared_ptr<TPro_ms
cg_msk.set(F_PIVA, clifo.get(CLI_PAIV));
cg_msk.set(F_COFI, clifo.get(CLI_COFI));
cg_msk.set(F_CODPAG, clifo.get(CLI_CODPAG));
TTable tab("%CPG"); tab.put("CODTAB", clifo.get(CLI_CODPAG));
tab.read();
const TRectype & tab = cache().get("%CPG", clifo.get(CLI_CODPAG));
cg_msk.set(F_DESPAG, tab.get("S0"));
}
}
void TPrimanota_application::set_totale(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
void TPrimanota_application::set_totale(TMask& cg_msk, TPro_msk & msk)
{
real totale = msk->get_totdoc();
real totale = msk.get_totdoc();
if(totale == ZERO)
if (totale == ZERO)
totale = app().calcola_imp();
const real rit = msk->get_ritenute();
const real rit = msk.get_ritenute();
if (rit != ZERO)
{
@ -4009,78 +4007,83 @@ void TPrimanota_application::set_totale(TMask& cg_msk, const shared_ptr<TPro_msk
cg_msk.set(F_RITFIS, rit);
app().add_cgs_ritenute(cgrowtype_ritfis);
}
else if (msk->is_doc_split())
totale = msk->get_tot_imp_riva();
else
if (msk.is_doc_split())
totale = msk.get_tot_imp_riva();
cg_msk.set(F_TOTALE, totale);
}
void TPrimanota_application::riporta_dati_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk)
void TPrimanota_application::riporta_dati_f1(TMask& cg_msk, TPro_msk & msk)
{
const bool bring = msk->should_bring_back();
const bool bring = msk.da_riportare();
if (bring)
{
if (msk->get_numdoc().full() && cg_msk.get(F_CODCLIFOR).empty())
write_clifo(cg_msk, msk);
write_righe_iva_f1(cg_msk, msk);
set_totale(cg_msk, msk);
TPrimanota_application & a = app();
if (msk.get_numdoc() != 0L && cg_msk.get(F_CODCLIFOR).empty())
a.write_clifo(cg_msk, msk);
a.write_righe_iva_f1(cg_msk, msk);
a.set_totale(cg_msk, msk);
cg_msk.set(FS_RECALC, ""); cg_msk.disable(FS_RDIFFER); cg_msk.disable(FS_MCOMM); cg_msk.disable(FS_NRATE);
if (write_scad_f1(cg_msk, msk))
app().set_scad_f1(cg_msk);
if (a.write_scad_f1(cg_msk, msk))
a.set_scad_f1(cg_msk);
}
// Li riporto anche con il collega in prima nota, e in quel caso solo se i campi non sono gia valorizzati
if (bring || cg_msk.get(F_NUMDOC).empty())
if (bring || cg_msk.get(F_NUMDOCEXT) != msk.get_str_numdoc())
{
cg_msk.set(F_NUMDOCEXT, msk->get_numdoc());
cg_msk.set(F_NUMDOC, msk->get_numdoc().right(7));
cg_msk.set(F_NUMDOCEXT, msk.get_str_numdoc());
cg_msk.set(F_NUMDOC, format("%-7ld", msk.get_numdoc()));
cg_msk.set(F_DATADOC, msk.get_datadoc());
cg_msk.set(F_IDDOCSDI, msk.get_str_numdoc());
cg_msk.set(F_DATADOCSDI, msk.get_datadoc());
cg_msk.disable(F_IDDOCSDI);
cg_msk.disable(F_DATADOCSDI);
}
if (bring || cg_msk.get(F_DATADOC).empty())
cg_msk.set(F_DATADOC, msk->get_datadoc());
}
void TPrimanota_application::insert_part_scad(TConfig& ini)
void TPrimanota_application::insert_part_scad(TConfig& ini) // che cazzo significa la partita 73/001
{
vector<TToken_string> rif_doc;
int i = 0;
ini.set_paragraph("23");
TArray rif_doc;
TString str = ini.get("NUMLINEA", "23", 0);
// Carico nel vettore
while(true)
for (int i = 0; str.full(); str = ini.get("NUMLINEA", "23", ++i))
{
TToken_string doc("", '|');
TString str; str << ini.get("NUMLINEA", nullptr, i, "NULL");
if (str != "NULL")
{
doc.add(str);
doc.add(ini.get("DOCRIF", nullptr, i, "NULL"));
doc.add(ini.get("DATADOCRIF", nullptr, i, "NULL"));
rif_doc.insert(rif_doc.end(), doc);
i++;
doc.add(str);
doc.add(ini.get("DOCRIF", "23", i));
doc.add(ini.get("DATADOCRIF", "23", i));
rif_doc.add(doc);
}
else
break;
}
// Agganciare alla partita del documento di riferimento
if(!rif_doc.empty())
if(rif_doc.items() > 0)
{
is_f1() = true;
TString query; query << "USE MOV\nSELECT (DATADOC==#DATADOC)";
TISAM_recordset rec(query);
rec.set_var("#DATADOC", TVariant(TDate(rif_doc[0].get(2))));
TString part;
do
FOR_EACH_ARRAY_ITEM(rif_doc, r, _obj)
{
if (rec.get(MOV_NUMDOC).as_string() == "73/001")
if (part.blank())
{
part = rec.get(MOV_PROTIVA).as_string();
rec.set_var("#DATADOC", ((TToken_string&)rif_doc[0]).get_date(2));
for (bool ok = rec.move_first(); ok; ok = rec.move_next())
{
if (rec.get_string(MOV_NUMDOC) == "73/001")
{
part = rec.get_string(MOV_PROTIVA);
break;
}
} while (rec.move_next());
}
}
_num_doc_rif_partite = part;
}
}
@ -4092,9 +4095,10 @@ bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key)
if (!app().has_module(FPAUT) || key != K_SPACE && key != K_TAB || !check_causale(cg_msk.get(F_CODCAUS)))
return true;
auto msk = std::make_shared<TPro_msk>(cg_msk);
app()._pro_mask = msk;
TPro_msk * msk = app()._pro_mask;
if (msk == nullptr)
app()._pro_mask = msk = new TPro_msk(cg_msk);
const TString datadoc = cg_msk.get(F_DATADOC);
@ -4104,16 +4108,13 @@ bool TPrimanota_application::fppro_mask(TMask_field& f, KEY key)
msk->field(F_DATESEARCH).show();
msk->set(F_DATESEARCH, datadoc);
}
if (msk->load_fppro_mask(msk.get()))
{
msk->run();
// Riporto dati FPPRO su maschera Prima Nota (solo se hai F1)
// Se non hai F1 collego senza riportarti i dati (solo le chiavi db)
riporta_dati_f1(cg_msk, msk);
riporta_dati_f1(cg_msk, *msk);
cg_msk.set(F_PROKEY, msk->get_fpprokeys());
is_collegato(cg_msk.field(F_COLFPPRO));
cg_msk.set(F_COLFPPRO, cg_msk.get(F_PROKEY).full());
cg_msk.set(F_ANNORIF, cg_msk.get(F_ANNOIVA));
}
return true;
}
@ -4132,11 +4133,11 @@ bool TPrimanota_application::scollega(const bool set)
bool TPrimanota_application::scollega_handler(TMask_field& f, KEY key)
{
if (app().has_module(FPAUT) && f.running_check(key))
{
TMask& cg_msk = f.mask();
if (!app().has_module(FPAUT) || key != K_SPACE && key != K_TAB || !check_causale(cg_msk.get(F_CODCAUS)))
return true;
if (cg_msk.get_bool(F_COLFPPRO))
if (check_causale(cg_msk.get(F_CODCAUS)) && cg_msk.get_bool(F_COLFPPRO))
{
scollega(true);
app().clean_fppro();
@ -4150,103 +4151,81 @@ bool TPrimanota_application::scollega_handler(TMask_field& f, KEY key)
}
message_box("Il movimento e' stato scollegato dalla fattura elettronica\nin ingresso, precedentemente associata.");
}
}
return true;
}
bool TPrimanota_application::is_collegato(TMask_field& f)
{
TMask& cg_msk = f.mask();
const bool has_prokey = !cg_msk.get(F_PROKEY).empty();
f.set(has_prokey ? "X" : " ");
return has_prokey;
}
bool TPro_msk::load_fppro_mask(TMask* msk, KEY k)
bool TPro_msk::load_fppro_mask(TMask & msk)
{
// Provo a vedere se hanno l'FP: se c'è l'indirizzo controllo che non sia F8 se non c'è non hanno l'FP
if (k != 32)
return false;
if (!fp_db().sq_is_connect())
{
message_box("Attenzione connessione al database non riuscita.\nImpossibile collegarsi ai documenti in entrata.");
return false;
}
const int forn = msk->get_int(F_CODCLIFORS);
const int forn = msk.get_int(F_CODCLIFORS);
if (forn == 0)
{
msk->set(F_ENABSEARCH, "X");
abilita_piva(msk);
msk.set(F_ENABSEARCH, "X");
abilita_piva();
//message_box("Inserire prima il fornitore");
//return false;
}
const TString& codfisc = msk->get(F_COFIS);
const TString& stato_piva = msk->get(F_STATOPAIVS);
const TString& piva = msk->get(F_PIVAS);
const TString& codfisc = msk.get(F_COFIS);
const TString& stato_piva = msk.get(F_STATOPAIVS);
const TString& piva = msk.get(F_PIVAS);
TString query;
TString date = "";
TDate date;
if (msk->get_bool(F_ENABDATE))
date = msk->get_date(F_DATESEARCH);
if(!msk->get_bool(F_ENABSEARCH))
query = query_fppro(msk->get(F_CODCLIFORS), date);
if (msk.get_bool(F_ENABDATE))
date = msk.get_date(F_DATESEARCH);
if(!msk.get_bool(F_ENABSEARCH))
query = query_fppro(msk.get(F_CODCLIFORS), date);
else
query = query_fppro(stato_piva, piva, date);
fp_db().sq_set_exec(query, false);
TSheet_field& sf = msk->sfield(F_SHEETFPPROS);
TSheet_field& sf = msk.sfield(F_SHEETFPPROS);
const bool show_all = msk.get_bool(F_SHOWALL);
sf.hide();
if (sf.items() > 0)
sf.destroy();
sf.reset();
while (fp_db().sq_next())
{
TString numreg = fp_db().sq_get("PZ_NUMREGCONT");
const bool show_all = msk->get_bool(F_SHOWALL);
const long numreg = fp_db().sq_get_long("PZ_NUMREGCONT");
if (numreg != "0" && !show_all)
continue;
TToken_string& row = sf.row(-1);
if (show_all || numreg == 0L)
{
TToken_string keys(fp_db().sq_get("PZ_KEYPRGINVIO"), ';');
keys.add(fp_db().sq_get("PZ_KEYHEADERFATT")); keys.add(fp_db().sq_get("PZ_KEYBODYFATT"));
row.add("", 0);
row.add(fp_db().sq_get("P7_TIPODOC"));
row.add(TDate(fp_db().sq_get_date("P1_DATAORARIC")));
row.add(TDate(fp_db().sq_get_date("PZ_DATA")));
row.add(fp_db().sq_get("PQ_IMPTOTDOC"));
row.add(fppro_db().set_keys(keys).get_ritenute());
row.add(fp_db().sq_get("PZ_NUMERO"));
row.add(fp_db().sq_get("P2_ANADENOMIN"));
row.add(fp_db().sq_get("P2_FISCIVAPAESE"));
row.add(fp_db().sq_get("P2_FISCIVACOD"));
row.add(fp_db().sq_get("P2_CODFISCALE"));
row.add(fp_db().sq_get("PZ_TIPOPROT"));
row.add(fp_db().sq_get("PZ_NUMPROT"));
row.add(keys);
const int r = sf.set_row_cell(F_SELFPPROS, "");
sf.set_row_cell(F_TIPODOCS, fp_db().sq_get("P7_TIPODOC"), r);
sf.set_row_cell(F_DATAORARICS, fp_db().sq_get_date("P1_DATAORARIC"), r);
sf.set_row_cell(F_DATAS, fp_db().sq_get_date("PZ_DATA"), r);
sf.set_row_cell(F_IMPTOTDOCS, fp_db().sq_get("PQ_IMPTOTDOC"), r);
sf.set_row_cell(F_RITENUTE, fppro_db().set_keys(keys).get_ritenute(), r);
sf.set_row_cell(F_NUMEROS, fp_db().sq_get("PZ_NUMERO"), r);
sf.set_row_cell(F_RAGXML, fp_db().sq_get("P2_ANADENOMIN"), r);
sf.set_row_cell(F_FISCIVAPAESES, fp_db().sq_get("P2_FISCIVAPAESE"), r);
sf.set_row_cell(F_FISCIVACODS, fp_db().sq_get("P2_FISCIVACOD"), r);
sf.set_row_cell(F_CODFISCALES, fp_db().sq_get("P2_CODFISCALE"), r);
sf.set_row_cell(F_TIPOPROTS, fp_db().sq_get("PZ_TIPOPROT"), r);
sf.set_row_cell(F_PROGRESSS, fp_db().sq_get("PZ_NUMPROT"), r);
sf.set_row_cell(F_KEYFPPROS, keys, r);
}
}
sf.force_update();
sf.show();
return true;
}
bool TPro_msk::fppro_handler(TMask_field& f, KEY k)
bool TPro_msk::riporta(TMask_field& f)
{
TMask& msk = f.mask();
const bool load = load_fppro_mask(&msk, k);
return load;
}
bool TPro_msk::riporta_handler(TMask_field& f, KEY k)
{
if (k != 32)
return true;
TMask& msk = f.mask();
//if (msk.curr_page() != 3)
//return true;
bool ok = false;
@ -4254,16 +4233,10 @@ bool TPro_msk::riporta_handler(TMask_field& f, KEY k)
FOR_EACH_SHEET_ROW(sf, nr, row)
{
if(*row->get(0) == 'X')
if(row->get_bool(0))
{
//TProtocollo protocollo(TDate(row->get(2)).year(), row->get(9), row->get(10));
app()._pro_mask->set_doc(row->get(cid2index(F_NUMEROS)), row->get(cid2index(F_DATAS)),
row->get(cid2index(F_IMPTOTDOCS)), row->get(cid2index(F_RITENUTE)), "", row->get(cid2index(F_KEYFPPROS)),
msk.get(F_CODCLIFORS), row->get(cid2index(F_FISCIVACODS)));
if (f.dlg() == DLG_OK)
app()._pro_mask->_riporta = true;
else
app()._pro_mask->_riporta = false;
app().pro_mask()->set_doc(sf, nr);
_riporta = f.dlg() == DLG_OK;
ok = true;
break;
}
@ -4277,67 +4250,56 @@ bool TPro_msk::riporta_handler(TMask_field& f, KEY k)
return true;
}
bool TPro_msk::collega_handler(TMask_field& f, KEY k)
{
return riporta_handler(f, k);
}
bool TPro_msk::piva_handler(TMask_field& f, KEY k)
{
TMask& msk = f.mask();
bool ok = true;
if(k == K_TAB && f.active() && f.focusdirty())
{
ok = load_fppro_mask(&msk, K_SPACE);
}
return ok;
}
bool TPro_msk::date_handler(TMask_field& f, KEY k)
{
TMask& msk = f.mask();
bool ok = true;
if (k == K_TAB && f.active() && f.focusdirty())
{
ok = load_fppro_mask(&msk, K_SPACE);
}
return ok;
}
void TPro_msk::fppro_selfatt() const
{
const TMask& mask = *this;
TSheet_field& sf = mask.sfield(F_SHEETFPPROS);
sf.hide();
FOR_EACH_SHEET_ROW(sf, nr, row)
{
if (*row->get(0) == 'X')
row->add("", 0);
}
if (sf.get_bool_row_cell(nr, F_SELFPPROS))
sf.set_row_cell(F_SELFPPROS, false, nr);
sf.force_update();
sf.show();
}
bool TPro_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
TMask & m = o.mask();
switch (o.dlg())
{
case DLG_CONFIG:
if (e == fe_button)
load_fppro_mask(m);
break;
case DLG_OK:
if (e == fe_button)
riporta(o);
break;
case DLG_LINK:
if (e == fe_button)
riporta(o);
break;
case F_PIVAS:
if (e == fe_modify)
load_fppro_mask(m);
break;
case F_DATESEARCH:
if (e == fe_modify)
load_fppro_mask(m);
break;
case F_SELFPPROS:
if (e == fe_modify)
fppro_selfatt();
break;
case F_SHOWALL:
if (e == fe_modify)
load_fppro_mask(this, K_SPACE);
load_fppro_mask(m);
break;
case F_ENABSEARCH:
if (e == fe_modify)
{
abilita_piva(this);
load_fppro_mask(this);
abilita_piva();
load_fppro_mask(m);
}
break;
case F_ENABDATE:
@ -4345,7 +4307,7 @@ bool TPro_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
field(F_DATESEARCH).show(o.mask().get_bool(F_ENABDATE));
if (!o.mask().get_bool(F_ENABDATE))
load_fppro_mask(this);
load_fppro_mask(m);
}
break;
default:
@ -4356,9 +4318,11 @@ bool TPro_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
bool TPro_msk::is_doc_split()
{
for(riga_iva_s const& riga : _righe_iva)
FOR_EACH_ARRAY_ITEM(_righe_iva, r, obj)
{
if (riga.esigibilita == 'S')
TToken_string & riga = STRING_TOKEN(obj);
if (riga.get(FPRI_ESIGIBILITA) == "S")
return true;
}
return false;
@ -4395,53 +4359,71 @@ void TPro_msk::set_scadenze(const char* fpprokeys)
}
}
void TPro_msk::set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* ritenute, const char* protfppro, const char* fpprokeys, const char* codforn, const char* piva)
void TPro_msk::set_doc(TSheet_field & s, int nrow)
//long numero, TDate datadoc, real totdoc, real ritenute, const char* protfppro, const char* fpprokeys, long codforn, const char* piva)
{
_numero = numero;
_datadoc = datadoc;
_totdoc = abs(totdoc);
_ritenute = ritenute;
_protfppro.sset(protfppro);
_numero = s.get_long_row_cell(nrow, F_NUMEROS);
_str_numero = s.get_str_row_cell(nrow, F_NUMEROS);
_datadoc = s.get_date_row_cell(nrow, F_DATAS);
_totdoc = abs(s.get_real_row_cell(nrow, F_IMPTOTDOCS));
_ritenute = s.get_real_row_cell(nrow, F_RITENUTE);
_protfppro.sset("");
const TString & fpprokeys = s.get_str_row_cell(nrow, F_KEYFPPROS);
_fpprokeys = fpprokeys;
_codforn = codforn;
_piva = piva;
set_righeiva(fpprokeys);
set_scadenze(fpprokeys);
set_scadenze(fpprokeys);
_codforn = s.get_long_row_cell(nrow, F_CODCLIFORS);
_piva = s.get_str_row_cell(nrow, F_FISCIVACODS);
}
real TPro_msk::get_tot_imp_riva()
{
real tot = ZERO;
real tot;
for(riga_iva_s const& riga : _righe_iva)
FOR_EACH_ARRAY_ITEM(_righe_iva, r, obj)
{
if (riga.imposta > ZERO)
tot += riga.imponibile;
TToken_string & riga = STRING_TOKEN(obj);
tot += riga.get_real(FPRI_IMPONIBILE);
}
return tot;
}
void TPro_msk::add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura, char esigib)
{
_righe_iva.insert(_righe_iva.end(), { imponibile, imposta, aliquota, natura, esigib });
TToken_string riga;
riga.add(imponibile, FPRI_IMPONIBILE);
riga.add(imposta, FPRI_IMPOSTA);
riga.add(aliquota, FPRI_ALIQUOTA);
riga.add(natura, FPRI_NATURA);
riga.add(esigib, FPRI_ESIGIBILITA);
_righe_iva.add(riga);
}
void TPro_msk::add_scad(const TDate& date, const real& importo)
{
_scadenze.insert(_scadenze.end(), { date, importo });
TToken_string riga;
riga.add(date, FPSC_DATA);
riga.add(importo, FPSC_IMPORTO);
_scadenze.add(riga);
}
TString& TPro_msk::query_fppro(const TString& codforn, const TString& date)
TString& TPro_msk::query_fppro(const TString& codforn, const TDate& date)
{
return query_fppro(codforn, "", "", "", date, "", "", "", true, false);
}
TString& TPro_msk::query_fppro(const TString& stato_piva, const TString& piva, const TString& date)
TString& TPro_msk::query_fppro(const TString& stato_piva, const TString& piva, const TDate& date)
{
return query_fppro("", stato_piva, piva, "", date, "", "", "", true, true);
}
TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TString& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order, bool piva_research)
TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TDate& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order, bool piva_research)
{
TString id_fornitore;
TString keys;
@ -4465,14 +4447,15 @@ TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva
id_fornitore << " (PZ_CLIFOR = '" << codforn << "') ";
}
static TString query;
query.cut(0) << query_string() << "WHERE ";
TString & query = query_string();
query << "WHERE ";
if (!id_fornitore.empty())
{
query << id_fornitore << " ";
if (!date.empty())
query << " AND PZ_DATA = '" << TDate(date).date2ansi() << "' ";
if (date.ok())
query << " AND PZ_DATA = '" << date.date2ansi() << "' ";
if (order)
query << "\nORDER BY P1_DATAORARIC ASC";
query << ";";
@ -4484,9 +4467,9 @@ TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva
query << " AND " << where_str;
query << ";";
}
else if (!date.empty())
else if (date.ok())
{
query << " PZ_DATA = '" << TDate(date).date2ansi() << "' ";
query << " PZ_DATA = '" << date.date2ansi() << "' ";
if (order)
query << "\nORDER BY P1_DATAORARIC ASC, PZ_TIPOPROT ASC, PZ_NUMPROT ASC";
query << ";";
@ -4501,9 +4484,9 @@ TString& TPro_msk::query_fppro(const TString& codforn, const TString& stato_piva
TString& TPro_msk::query_string()
{
static TString query;
TString & query = get_tmp_string(512);
query.cut(0) << "SELECT PZ_CLIFOR, PZ_DATA, CAST(P1_DATAORARIC AS DATE) AS P1_DATAORARIC, P7_TIPODOC, PQ_IMPTOTDOC, PZ_NUMERO, PZ_NUMREGCONT, PZ_TIPOPROT, " <<
query << "SELECT PZ_CLIFOR, PZ_DATA, CAST(P1_DATAORARIC AS DATE) AS P1_DATAORARIC, P7_TIPODOC, PQ_IMPTOTDOC, PZ_NUMERO, PZ_NUMREGCONT, PZ_TIPOPROT, " <<
"PZ_NUMPROT, P2_ANADENOMIN, P2_FISCIVAPAESE, P2_FISCIVACOD, P2_CODFISCALE, PZ_KEYPRGINVIO, PZ_KEYHEADERFATT, PZ_KEYBODYFATT\n" <<
"FROM PAA0200F \nJOIN FPPRO00F\n" << " ON P2_KEYPRGINVIO = PZ_KEYPRGINVIO AND P2_KEYHEADERFATT = PZ_KEYHEADERFATT AND P2_KEYBODYFATT = PZ_KEYBODYFATT\n" <<
"JOIN PAA0100F \nON P2_KEYPRGINVIO = P1_KEYPRGINVIO AND P2_KEYHEADERFATT = P1_KEYHEADERFATT AND P2_KEYBODYFATT = P1_KEYBODYFATT\n" <<
@ -4512,36 +4495,26 @@ TString& TPro_msk::query_string()
return query;
}
void TPro_msk::abilita_piva(TMask* msk)
void TPro_msk::abilita_piva()
{
if (msk->get_bool(F_ENABSEARCH))
{
msk->enable(F_PIVAS);
msk->enable(F_STATOPAIVS);
}
else
{
msk->enable(F_PIVAS, false);
msk->enable(F_STATOPAIVS, false);
}
const bool on = get_bool(F_ENABSEARCH);
enable(F_PIVAS, on);
enable(F_STATOPAIVS, on);
enable(F_COFIS, on);
}
TPro_msk::TPro_msk(TMask& cg_msk) : TAutomask("cg2100t"), _riporta(false), _codforn("")
TPro_msk::TPro_msk(TMask& cg_msk) : TAutomask("cg2100t"), _riporta(false), _codforn(0L), _numero(0L)
{
TMask::set_handler(DLG_CONFIG, fppro_handler);
TMask::set_handler(DLG_OK, riporta_handler);
if (!app().has_module(F1AUT))
field(DLG_OK).disable();
TMask::set_handler(DLG_LINK, collega_handler);
TMask::set_handler(F_PIVAS, piva_handler);
TMask::set_handler(F_DATESEARCH, date_handler);
TMask::set(F_CODCLIFORS, cg_msk.get(F_CODCLIFOR));
TMask::set(F_COFIS, cg_msk.get(F_COFI));
TMask::set(F_STATOPAIVS, cg_msk.get(F_STATOPAIV));
TMask::set(F_PIVAS, cg_msk.get(F_PIVA));
TMask::set(F_RAGSOCS, cg_msk.get(F_RAGSOCCF));
enable(DLG_OK, app().has_module(F1AUT));
set(F_CODCLIFORS, cg_msk.get(F_CODCLIFOR));
set(F_COFIS, cg_msk.get(F_COFI));
set(F_STATOPAIVS, cg_msk.get(F_STATOPAIV));
set(F_PIVAS, cg_msk.get(F_PIVA));
set(F_RAGSOCS, cg_msk.get(F_RAGSOCCF));
set(F_DATESEARCH, TDate(TODAY));
_righe_iva.clear();
_righe_iva.destroy();
_scadenze.destroy();
}
bool& is_f1()
@ -4549,3 +4522,4 @@ bool& is_f1()
static bool is_f1 = false;
return is_f1;
}

View File

@ -27,15 +27,78 @@
#include <automask.h>
#include "../f1/f1lib.h"
#include <vector>
#define K_ELIMMAS 0 // Key per eliminazione massima
class TPro_msk;
#define FPRI_IMPONIBILE 0
#define FPRI_IMPOSTA 1
#define FPRI_ALIQUOTA 2
#define FPRI_NATURA 3
#define FPRI_ESIGIBILITA 4
#define FPSC_DATA 0
#define FPSC_IMPORTO 1
class TDati_mov_auto;
enum CGMaskType { _query = 0, _no_iva = 1, _iva = 2, _occas = 3};
class TPro_msk : public TAutomask
{
long _numero;
TDate _datadoc;
real _totdoc;
real _ritenute;
TProtocollo _protfppro;
TString _fpprokeys;
TString _piva;
long _codforn;
TString_array _righe_iva;
TString_array _scadenze;
bool _riporta;
TString _str_numero;
// Non permette la selezione multipla
void fppro_selfatt() const;
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
public:
bool da_riportare() const { return _riporta; }
bool is_doc_split() ;
void set_righeiva(const char* fpprokeys);
void set_scadenze(const char* fpprokeys);
void set_doc(TSheet_field & s, int nrow);
const long get_numdoc() const { return _numero; }
const TString & get_str_numdoc() const { return _str_numero; }
const TDate & get_datadoc() const { return _datadoc; }
const real & get_totdoc() const { return _totdoc; }
const real & get_ritenute() const { return _ritenute; }
const TString & get_fpprokeys() const { return _fpprokeys; }
const long get_codforn() const { return _codforn; }
const TString & get_piva() const { return _piva; }
const TString_array& get_righeiva() const { return _righe_iva; }
const TProtocollo& get_protocollo() const { return _protfppro; }
const TString_array& get_scadenze() const { return _scadenze; }
real get_tot_imp_riva() ;
void add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura, char esigib);
void add_scad(const TDate& date, const real& importo);
static TString& query_fppro(const TString& codforn, const TDate& date);
static TString& query_fppro(const TString& stato_piva, const TString& piva, const TDate& date);
static TString& query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TDate& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order = true, bool piva_research = false);
static TString& query_string();
void abilita_piva();
// Carica documenti FPPRO sulla maschera
bool riporta(TMask_field& f);
bool load_fppro_mask(TMask & msk);
TPro_msk(TMask& cg_msk);
};
class TPrimanota_application : public TRelation_application
{
TMovimentoPN* _rel; // Relazione principale
@ -90,7 +153,7 @@ class TPrimanota_application : public TRelation_application
TAssoc_array _colori; // Colori delle righe
bool _isf1;
shared_ptr<TPro_msk> _pro_mask;
TPro_msk * _pro_mask;
bool _is_set_fpcheck;
int _last_date;
bool _f1_ini;
@ -181,20 +244,19 @@ class TPrimanota_application : public TRelation_application
// Gestione F1
static void write_righe_iva_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static bool write_scad_f1(const TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void write_clifo(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void set_totale(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
static void riporta_dati_f1(TMask& cg_msk, const shared_ptr<TPro_msk>& msk);
void write_righe_iva_f1(TMask& cg_msk, const TPro_msk & msk);
bool write_scad_f1(const TMask& cg_msk, const TPro_msk & msk);
void write_clifo(TMask& cg_msk, const TPro_msk & msk);
void set_totale(TMask& cg_msk, TPro_msk & msk);
static void riporta_dati_f1(TMask& cg_msk, TPro_msk & msk);
void insert_part_scad(TConfig& ini);
// Handlers per aggancio FPPRO
// Bottone per maschera FPPRO
static bool fppro_mask(TMask_field& f, KEY key);
static bool scollega_handler(TMask_field& f, KEY key);
static bool is_collegato(TMask_field& f);
static void fppromask_set_handl(TMask* msk);
static void load_list(TMask* msk, KEY k);
static void f1_init_modify(TMask& m, const TRectype& mov);
void load_list(TMask* msk, KEY k);
void f1_init(TMask& m, const bool fe_enabled, const bool f1_linked = false);
void reset_sheet_row(TSheet_field& s, int n);
int crea_somma_spese(TImporto& imp);
@ -223,9 +285,10 @@ protected: // TApplication
static bool scollega(bool set = false);
// Pulisce il mov e db dai firerimenti FPPRO (in MODE_MOD per edit/delete)
void clean_fppro();
// setta variabili prima del controllo has_f1_db
void set_has_f1_db(TMask* m);
bool has_f1_db(TMask* m);
// Ha f1 ?
bool has_f1() const;
// controlla il db
bool has_f1_db(const TMask & m);
// Controlli prima di write e rewrite
int controlli_f1(const TMask& m);
@ -321,7 +384,7 @@ protected:
real calcola_imp() const;
void add_cgs_tot(TMask& m);
int set_cgs_row(int n, const TImporto& importo, const TBill& conto, const char* desc, char tipo,
int set_cgs_row(int n, TImporto& importo, const TBill& conto, const char* desc, char tipo,
const char* cms = nullptr, const char* fas = nullptr);
void set_cgs_imp(int n, const TImporto& importo);
bool add_cgs_imp(int n, const TImporto& importo);
@ -400,98 +463,18 @@ public:
TString_array& pag_rows() { return _pag_rows; }
TImporto get_cgs_imp(int n) const;
TPro_msk * pro_mask() const { return _pro_mask; }
TImporto imposte_split_pay() const;
const TString& num_doc_rif() const { return _num_doc_rif_partite; }
TPrimanota_application();
virtual ~TPrimanota_application() { }
};
class TPro_msk : public TAutomask
{
public:
struct riga_iva_s;
struct scadenza_s;
private:
TString _numero;
TDate _datadoc;
real _totdoc;
real _ritenute;
TProtocollo _protfppro;
TString _fpprokeys;
TString _piva;
TString _codforn;
vector<riga_iva_s> _righe_iva;
vector<scadenza_s> _scadenze;
bool _riporta;
// Handlers per aggancio FPPRO
// Bottone carica documenti in maschera FPPRO
static bool fppro_handler(TMask_field& f, KEY k);
// Bottone riporta doc FPPRO in testata Prima Nota
static bool riporta_handler(TMask_field& f, KEY k);
static bool collega_handler(TMask_field& f, KEY k);
static bool piva_handler(TMask_field& f, KEY k);
static bool date_handler(TMask_field& f, KEY k);
// Non permette la selezione multipla
void fppro_selfatt() const;
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
public:
struct riga_iva_s
{
real imponibile;
real imposta;
real aliquota;
TString4 natura;
char esigibilita;
};
struct scadenza_s
{
TDate data;
real importo;
};
bool should_bring_back() const { return _riporta; }
bool is_doc_split();
void set_righeiva(const char* fpprokeys);
void set_scadenze(const char* fpprokeys);
void set_doc(const char* numero, const char* datadoc, const char* totdoc, const char* ritenute, const char* protfppro, const char* fpprokeys, const char* codforn, const char* piva);
TString get_numdoc() const { return _numero; }
TDate get_datadoc() const { return _datadoc; }
real get_totdoc() const { return _totdoc; }
real get_ritenute() const { return _ritenute; }
TString get_fpprokeys() const { return _fpprokeys; }
TString get_codforn() const { return _codforn; }
TString get_piva() const { return _piva; }
const vector<riga_iva_s>& get_righeiva() const { return _righe_iva; }
TProtocollo& get_protocollo() { return _protfppro; }
vector<scadenza_s>& get_scadenze() { return _scadenze; }
real get_tot_imp_riva();
void add_rigaiva(const real& imponibile, const real& imposta, const real& aliquota, const TString4& natura, char esigib);
void add_scad(const TDate& date, const real& importo);
static TString& query_fppro(const TString& codforn, const TString& date);
static TString& query_fppro(const TString& stato_piva, const TString& piva, const TString& date);
static TString& query_fppro(const TString& codforn, const TString& stato_piva, const TString& piva, const TString& where_str, const TString& date, const TString& keyprginvio, const TString& keyheaderfatt, const TString& keybodyfatt, bool order = true, bool piva_research = false);
static TString& query_string();
static void abilita_piva(TMask* msk);
// Carica documenti FPPRO sulla maschera
static bool load_fppro_mask(TMask* msk, KEY k = 32);
TPro_msk() = delete;
TPro_msk(TMask& cg_msk);
virtual ~TPrimanota_application() { safe_delete(_pro_mask); }
};
bool& is_f1();
TString& num_doc_rif();
#ifndef __EXTRA__
inline TPrimanota_application& app()

View File

@ -329,7 +329,7 @@ bool TPrimanota_application::codpag_handler(TMask_field& f, KEY key)
TMask& m = f.mask();
TPrimanota_application& a = app();
const bool set_scad = a.is_fattura() && m.page_enabled(2); // E' attiva pagina 3
if (key == K_ENTER && (!a._f1_ini && (a._pro_mask == nullptr || !a._pro_mask->should_bring_back())))
if (key == K_ENTER && (!a._f1_ini && (a._pro_mask == nullptr || !a._pro_mask->da_riportare())))
{
if (set_scad && f.empty())
{
@ -356,7 +356,7 @@ bool TPrimanota_application::codpag_handler(TMask_field& f, KEY key)
}
}
if (key == K_TAB && f.focusdirty() && m.insert_mode() && set_scad && (!a._f1_ini && (a._pro_mask == nullptr || !a._pro_mask->should_bring_back())))
if (key == K_TAB && f.focusdirty() && m.insert_mode() && set_scad && (!a._f1_ini && (a._pro_mask == nullptr || !a._pro_mask->da_riportare())))
a.set_scadenze(m);
return ok;
@ -1227,8 +1227,7 @@ bool TPrimanota_application::notify_edit_pagamento(TPartita& p, TRectype& new_pa
// Aggiornamento contopartita
const TImporto old_importo(controsez, old_pag.get_real(PAGSCA_IMPORTO));
TBill old_conto; old_conto.get(old_pag, true);
const TImporto new_importo(controsez, new_pag.get_real(PAGSCA_IMPORTO));
TImporto new_importo(controsez, new_pag.get_real(PAGSCA_IMPORTO));
if (old_importo != new_importo || old_conto != new_conto)
{
@ -1298,7 +1297,7 @@ bool TPrimanota_application::notify_edit_pagamento(TPartita& p, TRectype& new_pa
const real new_ritenute(new_pag.get(PAGSCA_RITENUTE));
if (old_ritenute != new_ritenute)
{
const TImporto grow_ritenute(causale().sezione_ritfis(), new_ritenute - old_ritenute);
TImporto grow_ritenute(causale().sezione_ritfis(), new_ritenute - old_ritenute);
const int riga = type2pos(cgrowtype_ritfis);
if (riga < 0)
@ -1319,7 +1318,7 @@ bool TPrimanota_application::notify_edit_pagamento(TPartita& p, TRectype& new_pa
const real new_ritsoc(new_pag.get(PAGSCA_RITSOC));
if (old_ritsoc != new_ritsoc)
{
const TImporto grow_ritenute(causale().sezione_ritsoc(), new_ritsoc-old_ritsoc);
TImporto grow_ritenute(causale().sezione_ritsoc(), new_ritsoc-old_ritsoc);
const int riga = type2pos(cgrowtype_ritsoc);
if (riga < 0)