Merge branch 'R_10_00' of http://10.65.20.17:7990/scm/campo/campo into R_10_00
This commit is contained in:
commit
9db0586bc8
9
cd/test/ca0686.txt
Normal file
9
cd/test/ca0686.txt
Normal file
@ -0,0 +1,9 @@
|
||||
ca3.exe
|
||||
ca3900a.rep
|
||||
|
||||
L'esportazione della stampa stima ricavi perdeva alcune colonne.
|
||||
|
||||
Può influire anche su :
|
||||
1) stampa pagato per CdC/Commessa/Fase
|
||||
2) stampa rendiconto
|
||||
3) stampa bilancio di commessa per esercizio
|
28
cd/test/ca0686a.ini
Normal file
28
cd/test/ca0686a.ini
Normal file
@ -0,0 +1,28 @@
|
||||
[Main]
|
||||
Demo=0
|
||||
|
||||
[ca1]
|
||||
Edit_106 = ca0 -3
|
||||
Edit_107 = ca2 -0
|
||||
Edit_146 = ca0 -4
|
||||
Edit_147 = ca0 -5
|
||||
Edit_148 = ca0 -6
|
||||
Edit_149 = ca0 -7
|
||||
File(27) = ca3.exe|X
|
||||
File(48) = ca3900a.rep|X
|
||||
Patch = 686
|
||||
Versione = 21511200
|
||||
|
||||
[ca]
|
||||
Data = 29-01-2019
|
||||
Descrizione = Contabilita' Analitica
|
||||
Dischi = 1
|
||||
Moduli = ba,cg
|
||||
OEM =
|
||||
Patch = 686
|
||||
PostProcess =
|
||||
PreProcess =
|
||||
Prezzo(1) =
|
||||
Prezzo(2) =
|
||||
Versione = 21511200
|
||||
|
BIN
cd/test/ca0686a1.zip
Normal file
BIN
cd/test/ca0686a1.zip
Normal file
Binary file not shown.
@ -1,3 +1,4 @@
|
||||
fp0.exe
|
||||
|
||||
Sistemata pulizia filtri doc impostati
|
||||
Sistemata pulizia filtri doc impostati
|
||||
Aggiornata gestione vettori
|
Binary file not shown.
4
cd/test/fp0686.txt
Normal file
4
cd/test/fp0686.txt
Normal file
@ -0,0 +1,4 @@
|
||||
fp0.exe
|
||||
|
||||
- Aggiunto controllo preventivo fatture accompagnatorie
|
||||
- Aggiunta gestione righe omaggi
|
19
cd/test/fp0686a.ini
Normal file
19
cd/test/fp0686a.ini
Normal file
@ -0,0 +1,19 @@
|
||||
[Main]
|
||||
Demo=0
|
||||
|
||||
[fp1]
|
||||
File(0) = fp0.exe|X
|
||||
Patch = 686
|
||||
Versione = 21511200
|
||||
|
||||
[fp]
|
||||
Data = 28-01-2019
|
||||
Descrizione = Fattura Elettronica
|
||||
Dischi = 1
|
||||
Moduli = cg,ve
|
||||
OEM =
|
||||
Patch = 686
|
||||
PostProcess =
|
||||
PreProcess =
|
||||
Versione = 21511200
|
||||
|
BIN
cd/test/fp0686a1.zip
Normal file
BIN
cd/test/fp0686a1.zip
Normal file
Binary file not shown.
8
cd/test/fp0688.txt
Normal file
8
cd/test/fp0688.txt
Normal file
@ -0,0 +1,8 @@
|
||||
fp0.exe
|
||||
fp0300a.msk
|
||||
|
||||
- Sistemato nome flag maschera
|
||||
- Implementata gestione righe omaggio
|
||||
- Aggiunto controllo per non far scartare l'xml in caso di nome vuoto
|
||||
- Aggiunta gestione righe merce con prezzo a zero
|
||||
- Implementata possibilità di scontare tutte le righe non solo le tipo merci
|
20
cd/test/fp0688a.ini
Normal file
20
cd/test/fp0688a.ini
Normal file
@ -0,0 +1,20 @@
|
||||
[Main]
|
||||
Demo=0
|
||||
|
||||
[fp1]
|
||||
File(0) = fp0.exe|X
|
||||
File(3) = fp0300a.msk|X
|
||||
Patch = 688
|
||||
Versione = 21511200
|
||||
|
||||
[fp]
|
||||
Data = 30-01-2019
|
||||
Descrizione = Fattura Elettronica
|
||||
Dischi = 1
|
||||
Moduli = cg,ve
|
||||
OEM =
|
||||
Patch = 688
|
||||
PostProcess =
|
||||
PreProcess =
|
||||
Versione = 21511200
|
||||
|
BIN
cd/test/fp0688a1.zip
Normal file
BIN
cd/test/fp0688a1.zip
Normal file
Binary file not shown.
@ -312,7 +312,7 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
break;
|
||||
case F_DATAINI:
|
||||
if (e == fe_init)
|
||||
o.set(ini_get_string(CONFIG_DITTA, "fp", "LastXML", "01-01-2018"));
|
||||
o.set(ini_get_string(CONFIG_DITTA, "fp", "LastXML", "01-01-2019"));
|
||||
else if (e == fe_close)
|
||||
ini_set_string(CONFIG_DITTA, "fp", "LastXML", o.get());
|
||||
break;
|
||||
|
@ -56,7 +56,7 @@ BEGIN
|
||||
ITEM "X|XML Generato"
|
||||
ITEM "N|Notificato"
|
||||
ITEM "E|In errore"
|
||||
ITEM "D|Pronto"
|
||||
ITEM "D|Diag."
|
||||
FLAGS "Z"
|
||||
END
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <reputils.h>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
|
||||
#define SQL_FLD "sql/"
|
||||
#define CARATTERI_SPECIALI "àèéìòù°'\\"
|
||||
@ -100,9 +101,20 @@ private:
|
||||
TString _bfatt; // Codice univoco di 20 caratteri del documento
|
||||
TString _conai_str;
|
||||
|
||||
// Classe interna per gestire gli omaggi
|
||||
class TOmaggio_info
|
||||
{
|
||||
public:
|
||||
real imponibile;
|
||||
real imposta;
|
||||
TOmaggio_info() : imponibile(ZERO), imposta(ZERO){}
|
||||
};
|
||||
|
||||
std::map<TString, TOmaggio_info> _omaggi;
|
||||
|
||||
struct
|
||||
{
|
||||
bool _is_valuta_estera; // Se il documento è in valuta estera
|
||||
bool _is_valuta_estera {false}; // Se il documento è in valuta estera
|
||||
TString4 _cod_val;
|
||||
real _cambio;
|
||||
} _doc_cambio;
|
||||
|
@ -853,6 +853,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
}
|
||||
#endif
|
||||
TAnagrafica clifo(doc.clifor().tipo(), doc.clifor().codice());
|
||||
TRectype rec_clifo(LF_CLIFO);
|
||||
rec_clifo.put(CLI_TIPOCF, doc.clifor().tipo());
|
||||
rec_clifo.put(CLI_CODCF, doc.clifor().codice());
|
||||
rec_clifo.read(TLocalisamfile(LF_CLIFO));
|
||||
TString8 coddest;
|
||||
TString pec;
|
||||
#ifndef DBG
|
||||
@ -979,7 +983,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
paf0400f.set("P4_FISCIVAPAESE", "IT");
|
||||
paf0400f.set("P4_FISCIVACOD", "00261170039");
|
||||
#endif
|
||||
if (cliente.fisica())
|
||||
if (cliente.fisica() && cliente.nome().full())
|
||||
{
|
||||
paf0400f.set("P4_ANANOME", cliente.nome());
|
||||
paf0400f.set("P4_ANACOGNOME", cliente.cognome());
|
||||
@ -1063,7 +1067,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
remove(paf2700f);
|
||||
// Disabilitata la scrittura del totale del documento, questo causa problemi se è presente uno sconto in testata e l'addebito del bollo.
|
||||
// Campo calcola prima il totale, poi lo sconta e ci applica il bollo mentre lo SDI sconta a bollo già applicato.
|
||||
// paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc());
|
||||
#ifndef DBG
|
||||
if(!((doc.get_bool("ADDBOLLI") && doc.get_real("BOLLI") > ZERO) && doc.get(DOC_SCONTOPERC)))
|
||||
#endif
|
||||
paf2700f.set("PQ_IMPTOTDOC", doc.totale_doc());
|
||||
const TRectype& cont_conv_off = cco(doc);
|
||||
TString causale = cont_conv_off.get("S1");
|
||||
if (causale.full())
|
||||
@ -1170,6 +1177,10 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
paf2000f.set("PJ_KEYHEADERFATT", _hfatt);
|
||||
paf2000f.set("PJ_KEYBODYFATT", _bfatt);
|
||||
remove(paf2000f); // Cancella tutti gli sconti di riga
|
||||
TPaf_record paf2100f("PAF2100F");
|
||||
paf2100f.set("PK_KEYHEADERFATT", _hfatt);
|
||||
paf2100f.set("PK_KEYBODYFATT", _bfatt);
|
||||
remove(paf2000f); // Cancella tutti i "altri dati gestionali"
|
||||
TPaf_record paf1900f("PAF1900F");
|
||||
paf1900f.set("PY_KEYHEADERFATT", _hfatt);
|
||||
paf1900f.set("PY_KEYBODYFATT", _bfatt);
|
||||
@ -1239,87 +1250,65 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
}
|
||||
else if (rdoc->is_merce())
|
||||
{
|
||||
if (rdoc->get(RDOC_QTA).is_zero())
|
||||
{
|
||||
TString msg;
|
||||
msg.format("La riga merce %d ha quantità nulla", riga);
|
||||
log(1, msg);
|
||||
}
|
||||
set_qta_prezzo(paf1800f, rdoc);
|
||||
if (rdoc->get(RDOC_QTA).is_zero())
|
||||
{
|
||||
TString msg;
|
||||
msg.format("La riga merce %d ha quantità nulla", riga);
|
||||
log(1, msg);
|
||||
}
|
||||
set_qta_prezzo(paf1800f, rdoc);
|
||||
if(rdoc->iva().codice().empty())
|
||||
{
|
||||
set_IVA(codivadefault, paf1800f);
|
||||
}
|
||||
else
|
||||
set_IVA(*rdoc, paf1800f);
|
||||
/*
|
||||
const TDate data = doc.get(DOC_DATADOC);
|
||||
paf1800f.set("PI_DTINIZIOPER", data);
|
||||
paf1800f.set("PI_DTFINEPER", data);
|
||||
*/
|
||||
// <ScontoMaggiorazione>
|
||||
sconto_expr = rdoc->get(RDOC_SCONTO);
|
||||
if (parse_sconto(sconto_expr, sconti))
|
||||
/*
|
||||
const TDate data = doc.get(DOC_DATADOC);
|
||||
paf1800f.set("PI_DTINIZIOPER", data);
|
||||
paf1800f.set("PI_DTFINEPER", data);
|
||||
*/
|
||||
|
||||
/*
|
||||
* Ogni riga si può rifare a un DDT/Ordine diverso, per questo devo inserire i dati da qua e non in testata
|
||||
*/
|
||||
TArray ancestors;
|
||||
find_ancestors(*rdoc, ancestors);
|
||||
for (int i = ancestors.last(); i > 0; i = ancestors.pred(i))
|
||||
{
|
||||
has_bolla |= true;
|
||||
const TAncestor& a = (const TAncestor&)ancestors[i];
|
||||
if (i == 1)
|
||||
{
|
||||
long nlin_sconto = 0;
|
||||
FOR_EACH_TOKEN(sconti, str)
|
||||
{
|
||||
const real perc = str;
|
||||
if (!perc.is_zero())
|
||||
{
|
||||
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
|
||||
paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto);
|
||||
if (perc > ZERO)
|
||||
{
|
||||
paf2000f.set("PJ_TIPOSCONTO", "SC");
|
||||
paf2000f.set("PJ_PERCSCONTO", perc);
|
||||
}
|
||||
else
|
||||
{
|
||||
paf2000f.set("PJ_TIPOSCONTO", "MG");
|
||||
paf2000f.set("PJ_PERCSCONTO", -perc);
|
||||
}
|
||||
paf2000f.set("PJ_GESTIONE", "D");
|
||||
ok &= insert(paf2000f);
|
||||
}
|
||||
}
|
||||
// <DatiDDT>
|
||||
TPaf_record paf1600f("PAF1600F");
|
||||
paf1600f.reset();
|
||||
paf1600f.set("PF_KEYHEADERFATT", _hfatt);
|
||||
paf1600f.set("PF_KEYBODYFATT", _bfatt);
|
||||
paf1600f.set("PF_RIFNUMLINEA", (long)r);
|
||||
paf1600f.set("PF_NUMDDDT", a._numdoc);
|
||||
paf1600f.set("PF_DATADDT", a._datadoc);
|
||||
paf1600f.set("PF_GESTIONE", "D");
|
||||
ok &= insert(paf1600f);
|
||||
// </DatiDDT>
|
||||
}
|
||||
// </ScontoMaggiorazione>
|
||||
/*
|
||||
* Ogni riga si può rifare a un DDT/Ordine diverso, per questo devo inserire i dati da qua e non in testata
|
||||
*/
|
||||
TArray ancestors;
|
||||
find_ancestors(*rdoc, ancestors);
|
||||
for (int i = ancestors.last(); i > 0; i = ancestors.pred(i))
|
||||
else if (i == 3)
|
||||
{
|
||||
has_bolla |= true;
|
||||
const TAncestor& a = (const TAncestor&)ancestors[i];
|
||||
if (i == 1)
|
||||
{
|
||||
// <DatiDDT>
|
||||
TPaf_record paf1600f("PAF1600F");
|
||||
paf1600f.reset();
|
||||
paf1600f.set("PF_KEYHEADERFATT", _hfatt);
|
||||
paf1600f.set("PF_KEYBODYFATT", _bfatt);
|
||||
paf1600f.set("PF_RIFNUMLINEA", (long)r);
|
||||
paf1600f.set("PF_NUMDDDT", a._numdoc);
|
||||
paf1600f.set("PF_DATADDT", a._datadoc);
|
||||
paf1600f.set("PF_GESTIONE", "D");
|
||||
ok &= insert(paf1600f);
|
||||
// </DatiDDT>
|
||||
}
|
||||
else if (i == 3)
|
||||
{
|
||||
// <DatiOrdineAcquisto>
|
||||
TPaf_record paf1000f("PAF1000F");
|
||||
paf1000f.set("P0_KEYHEADERFATT", _hfatt);
|
||||
paf1000f.set("P0_KEYBODYFATT", _bfatt);
|
||||
paf1000f.set("P0_RIFNUMLINEA", (long)r);
|
||||
paf1000f.set("P0_IDDOC", a._numdoc);
|
||||
paf1000f.set("P0_DATADOC", a._datadoc);
|
||||
paf1000f.set("P0_COMMCONVENZ", com);
|
||||
paf1000f.set("P0_CODCUP", cup);
|
||||
paf1000f.set("P0_CODCIG", cig);
|
||||
paf1000f.set("P0_GESTIONE", "D");
|
||||
ok &= insert(paf1000f);
|
||||
// </DatiOrdineAcquisto>
|
||||
}
|
||||
// <DatiOrdineAcquisto>
|
||||
TPaf_record paf1000f("PAF1000F");
|
||||
paf1000f.set("P0_KEYHEADERFATT", _hfatt);
|
||||
paf1000f.set("P0_KEYBODYFATT", _bfatt);
|
||||
paf1000f.set("P0_RIFNUMLINEA", (long)r);
|
||||
paf1000f.set("P0_IDDOC", a._numdoc);
|
||||
paf1000f.set("P0_DATADOC", a._datadoc);
|
||||
paf1000f.set("P0_COMMCONVENZ", com);
|
||||
paf1000f.set("P0_CODCUP", cup);
|
||||
paf1000f.set("P0_CODCIG", cig);
|
||||
paf1000f.set("P0_GESTIONE", "D");
|
||||
ok &= insert(paf1000f);
|
||||
// </DatiOrdineAcquisto>
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (rdoc->is_spese())
|
||||
{
|
||||
@ -1355,14 +1344,14 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
prz = price.get_value();
|
||||
}
|
||||
}
|
||||
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(qta_inverse ? -prz : prz));
|
||||
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(qta_inverse ? -abs(prz) : abs(prz)));
|
||||
paf1800f.set("PI_PRZTOTALE", converti_prezzo(imp));
|
||||
set_IVA(*rdoc, paf1800f);
|
||||
// Controllo se è una ritenuta fiscale
|
||||
// <DatiRitenuta>
|
||||
if (sp.tipo_ritenuta() == 'F')
|
||||
{
|
||||
paf0700f.set("P7_TIPORITENUTA", cliente.fisica() ? "RT01" : "RT02");
|
||||
paf0700f.set("P7_TIPORITENUTA", rec_clifo.get_char(CLI_TIPOPERS) == 'F' ? "RT01" : "RT02");
|
||||
paf0700f.set("P7_IMPORTORIT", converti_prezzo(doc.imponibile() * sp.perc() / CENTO));
|
||||
paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale());
|
||||
static TString caus770; caus770.cut(0); caus770.format("%02d", sp.caus_770());
|
||||
@ -1386,7 +1375,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
log(2, msg);
|
||||
return false;
|
||||
}
|
||||
else if(rdoc->is_omaggio())
|
||||
else if (rdoc->is_omaggio())
|
||||
{
|
||||
if (rdoc->get(RDOC_QTA).is_zero())
|
||||
{
|
||||
@ -1394,29 +1383,82 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
msg.format("La riga omaggi %d ha quantità nulla", riga);
|
||||
log(1, msg);
|
||||
}
|
||||
|
||||
paf1800f.set("PI_TIPOCESSPREST", "AB");
|
||||
set_qta_prezzo(paf1800f, rdoc);
|
||||
set_IVA(*rdoc, paf1800f);
|
||||
|
||||
// <ScontoMaggiorazione>
|
||||
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
|
||||
paf2000f.set("PJ_KEYNLINAR", 1L);
|
||||
paf2000f.set("PJ_TIPOSCONTO", "SC");
|
||||
if(rdoc->get_bool(RDOC_ADDIVA))
|
||||
paf2100f.set("PK_KEYNLINEA", static_cast<long>(r));
|
||||
paf2100f.set("PK_KEYNLINAR", 1L);
|
||||
paf2100f.set("PK_TIPODATO", "AswTRiga");
|
||||
|
||||
|
||||
if (rdoc->get_bool(RDOC_ADDIVA))
|
||||
{
|
||||
paf2000f.set("PJ_IMPORTOSCONTO", converti_prezzo(rdoc->importo(true, false) - rdoc->imposta()));
|
||||
paf2100f.set("PK_RIFDATO", "Omaggio con rivalsa");
|
||||
|
||||
// Metto i dati come si trattasse di una riga normalissima
|
||||
paf1800f.set("PI_UNITAMISURA", rdoc->get(RDOC_UMQTA));
|
||||
paf1800f.set("PI_QUANTITA", rdoc->get_real(RDOC_QTA));
|
||||
paf1800f.set("PI_PREZZOUNIT", converti_prezzo(rdoc->prezzo(false, false)));
|
||||
paf1800f.set("PI_PRZTOTALE", converti_prezzo(rdoc->prezzo(false, false) * rdoc->get_real(RDOC_QTA)));
|
||||
|
||||
TOmaggio_info& omaggio_info = _omaggi[rdoc->iva().codice()];
|
||||
omaggio_info.imponibile += rdoc->imponibile_omaggio(2);
|
||||
omaggio_info.imposta += rdoc->iva_omaggio(8, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
paf2000f.set("PJ_IMPORTOSCONTO", converti_prezzo(rdoc->importo(true, false)));
|
||||
paf2100f.set("PK_RIFDATO", "Omaggio senza rivalsa");
|
||||
|
||||
// Aggiungo uno sconto
|
||||
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
|
||||
paf2000f.set("PJ_KEYNLINAR", 1L);
|
||||
paf2000f.set("PJ_TIPOSCONTO", "SC");
|
||||
// Applico uno sconto del 100% portando l'importo a zero
|
||||
paf2000f.set("PJ_PERCSCONTO", CENTO);
|
||||
paf1800f.set("PI_PRZTOTALE", ZERO);
|
||||
paf2000f.set("PJ_GESTIONE", "D");
|
||||
ok &= insert(paf2000f);
|
||||
}
|
||||
paf2000f.set("PJ_GESTIONE", "D");
|
||||
ok &= insert(paf2000f);
|
||||
|
||||
ok &= insert(paf2100f);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Salto tutte le altre righe
|
||||
continue;
|
||||
}
|
||||
|
||||
// <ScontoMaggiorazione>
|
||||
sconto_expr = rdoc->get(RDOC_SCONTO);
|
||||
if (parse_sconto(sconto_expr, sconti))
|
||||
{
|
||||
long nlin_sconto = 0;
|
||||
FOR_EACH_TOKEN(sconti, str)
|
||||
{
|
||||
const real perc = str;
|
||||
if (!perc.is_zero())
|
||||
{
|
||||
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
|
||||
paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto);
|
||||
if (perc > ZERO)
|
||||
{
|
||||
paf2000f.set("PJ_TIPOSCONTO", "SC");
|
||||
paf2000f.set("PJ_PERCSCONTO", perc);
|
||||
}
|
||||
else
|
||||
{
|
||||
paf2000f.set("PJ_TIPOSCONTO", "MG");
|
||||
paf2000f.set("PJ_PERCSCONTO", -perc);
|
||||
}
|
||||
paf2000f.set("PJ_GESTIONE", "D");
|
||||
ok &= insert(paf2000f);
|
||||
}
|
||||
}
|
||||
}
|
||||
// </ScontoMaggiorazione>
|
||||
|
||||
paf1800f.set("PI_GESTIONE", "D");
|
||||
ok &= insert(paf1800f) && insert(paf3000f);
|
||||
}
|
||||
@ -1540,6 +1582,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
// </DatiDDT>
|
||||
// Salvo la testata
|
||||
ok &= insert(paf0700f);
|
||||
|
||||
// <DatiRiepilogo>
|
||||
TPaf_record paf2200f("PAF2200F");
|
||||
paf2200f.set("PL_KEYHEADERFATT", _hfatt);
|
||||
@ -1559,16 +1602,29 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
paf2200f.set("PL_KEYBODYFATT", _bfatt);
|
||||
const TRiepilogo_iva& riva = *dynamic_cast<const TRiepilogo_iva*>(itm);
|
||||
const real aliquota = riva.cod_iva().percentuale();
|
||||
const TString& cod_aliquota = riva.cod_iva().codice();
|
||||
const TOmaggio_info& omaggio_info = _omaggi[cod_aliquota];
|
||||
|
||||
// Aliquota
|
||||
paf2200f.set("PL_ALIQUOTAIVA", aliquota);
|
||||
|
||||
// Natura
|
||||
if (aliquota.is_zero())
|
||||
paf2200f.set("PL_NATURA", natura(riva.cod_iva().codice()));
|
||||
paf2200f.set("PL_IMPONIBILE", converti_prezzo(riva.imponibile()));
|
||||
|
||||
// Imponibile
|
||||
paf2200f.set("PL_IMPONIBILE", converti_prezzo(riva.imponibile() + omaggio_info.imponibile));
|
||||
|
||||
// Imposta, per gli omaggi con addebito ho già l'imposta
|
||||
paf2200f.set("PL_IMPOSTA", converti_prezzo(riva.imposta()));
|
||||
|
||||
// Esigibilità IVA
|
||||
paf2200f.set("PL_ESIGIVA", eiva);
|
||||
if (*eiva == 'S')
|
||||
paf2200f.set("PL_RIFNORMATIVO", "Scissione pagamenti art.17-ter DPR 633/72");
|
||||
else
|
||||
paf2200f.set("PL_RIFNORMATIVO", riva.cod_iva().descrizione());
|
||||
|
||||
paf2200f.set("PL_GESTIONE", "D");
|
||||
ok &= insert(paf2200f);
|
||||
}
|
||||
@ -1619,9 +1675,9 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
int rp = nr < pag.n_rate() ? nr : 0;
|
||||
static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp);
|
||||
paf2500f.set("PO_MODALITAPAGAM", cache().get("%CLR", key_class, "S12")); // Si assicura che il numero riga sia accettabile
|
||||
TToken_string& riga = scad.row(nr); // Data|Importo
|
||||
paf2500f.set("PO_DATASCADENZA", TDate(riga.get(0))); // Data scadenza
|
||||
paf2500f.set("PO_IMPORTO", converti_prezzo(real(riga.get()))); // Importo rata
|
||||
TToken_string& riga_scadenze = scad.row(nr); // Data|Importo
|
||||
paf2500f.set("PO_DATASCADENZA", TDate(riga_scadenze.get(0))); // Data scadenza
|
||||
paf2500f.set("PO_IMPORTO", converti_prezzo(real(riga_scadenze.get()))); // Importo rata
|
||||
paf2500f.set("PO_GESTIONE", "D");
|
||||
ok &= insert(paf2500f);
|
||||
}
|
||||
@ -1710,7 +1766,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
|
||||
pafw300f.set("PW_CODICE", cliente.codice_fiscale_estero());
|
||||
pafw300f.set("PW_CFISCA", cliente.codice_fiscale());
|
||||
pafw300f.set("PW_DENOM", cliente.ragione_sociale());
|
||||
if (cliente.fisica())
|
||||
if (cliente.fisica() && cliente.nome().full())
|
||||
{
|
||||
pafw300f.set("PW_NOME", cliente.nome());
|
||||
pafw300f.set("PW_COGN", cliente.cognome());
|
||||
@ -1746,10 +1802,12 @@ bool TDoc_fp::doc_to_paf(const TFilename& ini)
|
||||
const TDoc_key key(anno, codnum, ndoc);
|
||||
return doc_to_paf(key);
|
||||
}
|
||||
|
||||
bool TDoc_fp::doc_to_paf()
|
||||
{
|
||||
return _doc_rec != nullptr ? doc_to_paf(*_doc_rec) : false;
|
||||
}
|
||||
|
||||
TRectype& TDoc_fp::key_to_doc(const TDoc_key& key)
|
||||
{
|
||||
if(_doc_rec != nullptr)
|
||||
|
@ -88,41 +88,6 @@ const TString& TODBC_recordset::query_text() const
|
||||
return _sql;
|
||||
}
|
||||
|
||||
const TString& TODBC_recordset::query_text_var() const
|
||||
{
|
||||
|
||||
// INSERT INTO POPPO (COL1, COL2) VALUES (SELECT COL3, COL4 FROM PAPPO WHERE COL5 = #VAR4)
|
||||
// INSERT INTO POPPO (COL1, COL2) VALUES (SELECT COL3, COL4 FROM PAPPO WHERE COL5 = '#VAR4')
|
||||
// #VAR4')
|
||||
|
||||
// Conto quanti separatori ho
|
||||
int num_sep = 0;
|
||||
int pos = _sql.find(query_text_separator());
|
||||
for (; pos > 0; pos = _sql.find(query_text_separator(), pos + 1))
|
||||
num_sep++;
|
||||
|
||||
if(num_sep == 0 || num_sep % 2 != 0)
|
||||
{
|
||||
return _sql;
|
||||
}
|
||||
|
||||
// Se sono pari tolgo dalla mia query tutte le variabili all'interno dei separatori per non farle chiedere all'utente
|
||||
TString& sql = get_tmp_string();
|
||||
TString wrk_sql = _sql;
|
||||
sql.cut(0);
|
||||
|
||||
// cerco il primo query_text_separator(), nel nostro caso è l'apice e mi sposto
|
||||
for (int qts = wrk_sql.find(query_text_separator()); qts > 0; qts = wrk_sql.find(query_text_separator())) // Cerco tutti i separatori
|
||||
{
|
||||
sql << wrk_sql.left(qts - 1);
|
||||
wrk_sql.ltrim(qts);
|
||||
qts = wrk_sql.find(query_text_separator());
|
||||
wrk_sql.ltrim(qts);
|
||||
}
|
||||
|
||||
return sql;
|
||||
}
|
||||
|
||||
const TString& TODBC_recordset::driver_version() const
|
||||
{
|
||||
TString& tmp = get_tmp_string(50);
|
||||
@ -752,7 +717,6 @@ void TODBC_recordset::set(const char* sql)
|
||||
|
||||
TODBC_recordset::TODBC_recordset(const char* sql, const bool freezed) : _freezed(freezed), _loaded(false)
|
||||
{
|
||||
TRecordset::set_query_text_separator('\'');
|
||||
set(sql);
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,6 @@ public:
|
||||
virtual TRecnotype current_row() const;
|
||||
virtual void requery();
|
||||
virtual const TString& query_text() const;
|
||||
virtual const TString& query_text_var() const;
|
||||
virtual const TString& driver_version() const;
|
||||
virtual void freeze(const bool on) { _freezed = on; }
|
||||
|
||||
|
@ -623,7 +623,7 @@ void TRecordset::find_and_reset_vars()
|
||||
_var.destroy();
|
||||
_varnames.destroy();
|
||||
|
||||
const TString& sql = query_text_var();
|
||||
const TString& sql = query_text();
|
||||
int diesis = sql.find('#'); // cerco il primo #
|
||||
for ( ; diesis > 0; diesis = sql.find('#', diesis+1)) // Cerco tutti i #
|
||||
{
|
||||
@ -716,6 +716,9 @@ bool ask_variable(const char* name, TVariant& var)
|
||||
|
||||
bool TRecordset::ask_variables(bool all)
|
||||
{
|
||||
if (_disable_variables)
|
||||
return true;
|
||||
|
||||
const bool ok = variables().items() > 0;
|
||||
if (ok) // Se ci sono variabili faccio le sostituzioni
|
||||
{
|
||||
@ -737,7 +740,7 @@ bool TRecordset::ask_variables(bool all)
|
||||
const TString& TRecordset::driver_version() const
|
||||
{ return EMPTY_STRING; }
|
||||
|
||||
TRecordset::TRecordset() : _parentset(NULL), _text_separator('\t')
|
||||
TRecordset::TRecordset() : _parentset(NULL), _text_separator('\t'), _disable_variables(false)
|
||||
{ }
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
|
@ -63,7 +63,7 @@ class TRecordset : public TObject
|
||||
TString_array _varnames;
|
||||
const TRecordset* _parentset;
|
||||
char _text_separator;
|
||||
char _query_text_separator;
|
||||
bool _disable_variables;
|
||||
|
||||
protected:
|
||||
virtual bool save_as_html(const char* path);
|
||||
@ -85,14 +85,10 @@ public: // Absolutely needed methods
|
||||
virtual void requery() pure;
|
||||
bool empty() const { return items() == 0; }
|
||||
virtual const TString& query_text() const pure;
|
||||
virtual const TString& query_text_var() const { return query_text(); }
|
||||
virtual const TString& driver_version() const;
|
||||
|
||||
virtual char text_separator() const { return _text_separator;}
|
||||
virtual void set_text_separator(char sep) { _text_separator = sep;}
|
||||
|
||||
virtual char query_text_separator() const { return _query_text_separator; }
|
||||
virtual void set_query_text_separator(char sep) { _query_text_separator = sep; }
|
||||
|
||||
virtual void freeze() {}
|
||||
virtual bool move_first() { return move_to(0); }
|
||||
@ -121,6 +117,11 @@ public: // Absolutely needed methods
|
||||
// mode = 0|1=append 2=update 3=update|append 4=zap before writing
|
||||
virtual bool save_as(const char* path, TRecordsetExportFormat fmt = fmt_unknown, int mode = 0);
|
||||
|
||||
// gestione per abilitare o disabilitare variabili
|
||||
virtual void disable_variables() { _disable_variables = true; }
|
||||
virtual void enable_variables() { _disable_variables = false; }
|
||||
|
||||
|
||||
void set_parent(const TRecordset* rs) { _parentset = rs; }
|
||||
TRecordset();
|
||||
virtual ~TRecordset() { }
|
||||
|
@ -82,6 +82,8 @@ protected:
|
||||
bool test() const;
|
||||
//bool o01b(const TString& DSN) const; Messa in pausa
|
||||
|
||||
void log_to_file(TString func, TString msg) const;
|
||||
|
||||
public:
|
||||
virtual void main_loop();
|
||||
void setTable(TToken_string s) { tables = s; }
|
||||
@ -163,6 +165,7 @@ bool TCampass_app::setParameters(TString dsn, TString utente, TString password)
|
||||
TString TCampass_app::startExport(TString prefixTables) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return "";
|
||||
@ -181,6 +184,7 @@ TString TCampass_app::startExport(TString prefixTables) const
|
||||
void TCampass_app::endExport(TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
sqlset.connect(DSN, usr, psw);
|
||||
//Preparo la query
|
||||
TString sqlQuery; sqlQuery << "UPDATE RunImp SET DWEND = CURRENT_TIMESTAMP WHERE IDRUNIMP = '" << id << "'";
|
||||
@ -191,6 +195,7 @@ void TCampass_app::endExport(TString id) const
|
||||
bool TCampass_app::emptyTables(const TString& DSN, const TString& usr, const TString& psw) const
|
||||
{
|
||||
TODBC_recordset sqlset("");
|
||||
sqlset.disable_variables();
|
||||
TString table;
|
||||
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
@ -222,6 +227,7 @@ TString TCampass_app::esporta(const TString& DSN, const TString& usr, const TStr
|
||||
logFile << getTime() << " - Test connessione\n";
|
||||
|
||||
TODBC_recordset sqlset("");
|
||||
sqlset.disable_variables();
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return "Connessione fallita!";
|
||||
|
||||
@ -254,7 +260,7 @@ TString TCampass_app::esporta(const TString& DSN, const TString& usr, const TStr
|
||||
endExport(p02);
|
||||
|
||||
logFile << getTime() << " - Fine esportazione P02!\n";
|
||||
|
||||
|
||||
// INIZIO P01
|
||||
|
||||
logFile << getTime() << " - Inizio esportazione P01:\n";
|
||||
@ -265,10 +271,11 @@ TString TCampass_app::esporta(const TString& DSN, const TString& usr, const TStr
|
||||
else
|
||||
logFile << getTime() << " - Esportata tabella P01A\n";
|
||||
|
||||
|
||||
if(!p01b(p01)) errors << "ERRORE TABELLA: P01B\n"; // P01B
|
||||
else
|
||||
logFile << getTime() << " - Esportata tabella P01B\n";
|
||||
|
||||
|
||||
if(!p01c(p01)) errors << "ERRORE TABELLA: P01C\n"; // O01A
|
||||
else
|
||||
logFile << getTime() << " - Esportata tabella P01C\n";
|
||||
@ -276,7 +283,7 @@ TString TCampass_app::esporta(const TString& DSN, const TString& usr, const TStr
|
||||
endExport(p01);
|
||||
|
||||
logFile << getTime() << " - Fine esportazione P01!\n";
|
||||
|
||||
|
||||
// INIZIO O02
|
||||
|
||||
logFile << getTime() << " - Inizio esportazione O02:\n";
|
||||
@ -338,6 +345,7 @@ TString TCampass_app::esporta(const TString& DSN, const TString& usr, const TStr
|
||||
endExport(a01);
|
||||
|
||||
logFile << getTime() << " - Fine esportazione A01!\n";
|
||||
|
||||
}
|
||||
|
||||
if(m->get_bool(B_IMPORT))
|
||||
@ -359,6 +367,7 @@ TString TCampass_app::esporta(const TString& DSN, const TString& usr, const TStr
|
||||
bool TCampass_app::test() const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -410,11 +419,24 @@ bool TCampass_app::test() const
|
||||
return true;
|
||||
}
|
||||
|
||||
void TCampass_app::log_to_file(TString func, TString msg) const
|
||||
{
|
||||
ofstream log_file;
|
||||
log_file.open("Campass_error_log.txt", ios::app);
|
||||
if (!log_file.is_open())
|
||||
return;
|
||||
|
||||
log_file << getTime() << " - " << func << " - " << msg << "\n";
|
||||
|
||||
log_file.close();
|
||||
}
|
||||
|
||||
|
||||
// Non sono molto sicuro del suo funzionamento
|
||||
bool TCampass_app::a01a(const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -493,6 +515,7 @@ bool TCampass_app::o01a(const TString id) const
|
||||
{
|
||||
long totalItems = 0;
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -589,6 +612,7 @@ bool TCampass_app::o01c(const TString id) const
|
||||
{
|
||||
long totalItems = 0;
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -655,6 +679,7 @@ bool TCampass_app::o01c(const TString id) const
|
||||
bool TCampass_app::o01e(const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -713,6 +738,7 @@ bool TCampass_app::o01e(const TString id) const
|
||||
bool TCampass_app::o02a(const TString CodNum, const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -776,6 +802,7 @@ bool TCampass_app::o02a(const TString CodNum, const TString id) const
|
||||
bool TCampass_app::o02c(const TString CodNum, const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -835,6 +862,7 @@ bool TCampass_app::o02c(const TString CodNum, const TString id) const
|
||||
bool TCampass_app::o03a(const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -871,6 +899,7 @@ bool TCampass_app::o03a(const TString id) const
|
||||
bool TCampass_app::p01a(const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -976,48 +1005,51 @@ bool TCampass_app::p01a(const TString id) const
|
||||
bool TCampass_app::p01b(const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
TRelation anamag(LF_ANAMAG), tab(LF_TAB);
|
||||
TString msg("Esportazione tabella "); msg << "P01B";
|
||||
TString msg("Esportazione tabella P01B");
|
||||
// Anamag
|
||||
TCursor curAna(&anamag);
|
||||
const int items = curAna.items();
|
||||
TISAM_recordset isamrec_ana("USE ANAMAG");
|
||||
|
||||
const int items = isamrec_ana.items();
|
||||
|
||||
// Tab
|
||||
|
||||
|
||||
TProgress_monitor p(items, msg);
|
||||
|
||||
bool ok = true;
|
||||
|
||||
// Adesso inserisco tutta la bella roba
|
||||
for (curAna = 0; curAna.pos() < items && !p.is_cancelled(); ++curAna)
|
||||
|
||||
for (bool ok = isamrec_ana.move_first(); isamrec_ana.cursor()->pos() < items; isamrec_ana.move_next())
|
||||
{
|
||||
int num = curAna.pos();
|
||||
// Aggiorno il Progress Monitor
|
||||
if (!p.add_status())
|
||||
break;
|
||||
p.add_status();
|
||||
|
||||
// Prendo la riga di TAB
|
||||
TRectype rowAna = curAna.curr();
|
||||
|
||||
// Dichiaro la stringa
|
||||
TString sqlQuery;
|
||||
static TString sqlQuery;
|
||||
sqlQuery.cut(0);
|
||||
|
||||
if(rowAna.get("USER3") != "")
|
||||
if (!isamrec_ana.get("USER3").is_empty())
|
||||
{
|
||||
TString cparam; cparam << toNumber(rowAna.get("USER3")) << "x" << toNumber(rowAna.get("USER4"));
|
||||
TString cparam; cparam << toNumber(isamrec_ana.get("USER3").as_string()) << "x" << toNumber(isamrec_ana.get("USER4").as_string());
|
||||
// Inserisco Tutto
|
||||
sqlQuery << "INSERT INTO P01B ( IKRUNIMP, CStr, CART, CPARAM, CPARVAL ) \
|
||||
VALUES('" << id << "','DBS','" << toEscape(rowAna.get("CODART")) << "','MISREA','" << toEscape(cparam) << "');";
|
||||
VALUES('" << id << "','DBS','" << toEscape(isamrec_ana.get("CODART").as_string()) << "','MISREA','" << toEscape(cparam) << "');";
|
||||
}
|
||||
|
||||
// Inizio a eseguire quello che ho qua
|
||||
if(sqlQuery != "" && sqlset.exec(sqlQuery) != 1)
|
||||
return false;
|
||||
if (sqlQuery.full() && sqlset.exec(sqlQuery) != 1)
|
||||
{
|
||||
TString msg = "Impossibile esportare l'articolo "; msg << isamrec_ana.get("CODART").as_string();
|
||||
log_to_file("p01b - MISREA", msg);
|
||||
}
|
||||
|
||||
sqlQuery.cut(0);
|
||||
TString anamagCod(rowAna.get("CODART")), filtroCodTab;
|
||||
|
||||
TString anamagCod(isamrec_ana.get("CODART").as_string()), filtroCodTab;
|
||||
filtroCodTab << "3" << anamagCod.sub(6,12);
|
||||
// Tab *******************************************************************************************************************************************************
|
||||
// Filtri
|
||||
@ -1028,29 +1060,32 @@ bool TCampass_app::p01b(const TString id) const
|
||||
TCursor curTab(&tab, "", 1, &filtroTab, &filtroTab);
|
||||
// Items
|
||||
const int itemsTab = curTab.items();
|
||||
if (itemsTab > 0)
|
||||
bool yeah = true;
|
||||
|
||||
for (curTab = 0; curTab.pos() < itemsTab && !p.is_cancelled(); ++curTab)
|
||||
{
|
||||
TRectype rowTab = curTab.curr();
|
||||
sqlQuery << "INSERT INTO P01B ( IKRUNIMP, CStr, CART, CPARAM, CPARVAL ) \
|
||||
VALUES('" << id << "','DBS','" << toEscape(rowAna.get("CODART")) << "','FORING','" << rowTab.get("S0") << "');";
|
||||
VALUES('" << id << "','DBS','" << toEscape(isamrec_ana.get("CODART").as_string()) << "','FORING','" << rowTab.get("S0") << "');";
|
||||
|
||||
// Per ogni giro lancio una exec altrimenti rischio di sfondare il limite di caratteri
|
||||
if(sqlQuery != "" && sqlset.exec(sqlQuery) != 1)
|
||||
return false;
|
||||
|
||||
if (sqlQuery != "" && sqlset.exec(sqlQuery) != 1)
|
||||
{
|
||||
TString msg = "Impossibile esportare l'articolo "; msg << isamrec_ana.get("CODART").as_string();
|
||||
log_to_file("p01b - FORING", msg);
|
||||
}
|
||||
sqlQuery.cut(0);
|
||||
}
|
||||
return sqlset.commit() != -1;
|
||||
|
||||
ok &= sqlset.commit() != -1;
|
||||
}
|
||||
|
||||
return sqlset.commit() != -1;
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TCampass_app::p02a(const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -1091,6 +1126,7 @@ bool TCampass_app::p02a(const TString id) const
|
||||
bool TCampass_app::p01c(const TString id) const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
// Controllo la connessione
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
@ -1145,6 +1181,7 @@ bool TCampass_app::p01c(const TString id) const
|
||||
bool TCampass_app::c09a() const
|
||||
{
|
||||
TODBC_recordset sqlset("", true);
|
||||
sqlset.disable_variables();
|
||||
if (!sqlset.connect(DSN, usr, psw))
|
||||
return false;
|
||||
TString sqlQuery = "SELECT TOP 1 * \
|
||||
|
Loading…
x
Reference in New Issue
Block a user