Patch level : 12.0 646

Files correlati     : ba,cg,fp
Commento            :
- Modificata tabella tabcom, aggiunto campo S13 per vettori
- Rifatta gestione vettori per fatture accompagnatorie
- Corretti errore pec in esportazione fp
- Aggiunta valorizzazione blocco fattura accompagnatoria
- Rifatta gestione filtri fattura elettronica con codice numerazione in riga dello sheet
- Aggiunte macro per non inviare più documenti a clienti
- Aggiunto controllo sullo stato del documento, se non è almeno stampato viene saltato
- Aggiunto salto righe con descrizione vuota
- Cambiato controllo che l'articolo sia corretto, la funzione ok() non verifica sta cosa
- Cambiata valorizzazione codiva per righe descrizione e plafond, così da evitare l'errore in DatiRiepilogoIVA
- Aggiunto controllo sul pagamento, adesso non escono più i warning indesiderati
This commit is contained in:
Mattia Tollari 2018-11-28 16:28:33 +01:00
parent 30e9c1876a
commit baef2bfba4
11 changed files with 289 additions and 149 deletions

View File

@ -1,3 +1,3 @@
4
1
%tabcom|0|0|1210|0|Tabelle comuni|1500||
%tabcom|0|0|1280|0|Tabelle comuni|1500||

View File

@ -1,5 +1,5 @@
4
89
90
COD|1|3|0|
CODTAB|1|25|0|
S0|1|70|0|
@ -15,6 +15,7 @@ S9|1|5|0|
S10|1|5|0|
S11|1|5|0|
S12|1|5|0|
S13|1|70|0|
I0|3|7|0|
I1|3|7|0|
I2|3|7|0|

View File

@ -1667,7 +1667,7 @@ END
STRING F_PADESTIN 7
BEGIN
PROMPT 2 19 "Destinatario "
FLAGS "U"
FLAGS ""
MODULES PA,FP
HELP "Codice ufficio dell destinatario della fattura elettronica"
FIELD LF_CFVEN->PADESTIN

View File

@ -8,6 +8,7 @@
#include "cgtbbnp.h"
#include "cgtbesc.h"
#include "cgtbnot.h"
#include "cgtbvet.h"
#include "cglib01.h"
@ -148,6 +149,13 @@ int CGTTable_application::read(TMask& m)
if (table_name == TAB_NOTECLI)
glue_string();
else if (table_name == "%VET" && err == NOERR)
{
// Prendo il vecchio campo della P.IVA e lo sbatto in quello nuovo
if(m.get(F_PAIV).empty())
m.set(F_PAIV, get_relation()->curr().get("S3").mid(20, 12));
}
return err;
}

View File

@ -2,6 +2,7 @@
#define F_CODVETT 101
#define F_RAGSO 102
#define F_RAGSOA 121
#define F_IND 103
#define F_TEL 104
#define F_PTEL 105
@ -16,11 +17,12 @@
#define F_DENCOM 114
#define F_NUM 115
#define F_PFAX 116
#define F_PTELEX 117
#define F_EORI 117
#define F_STATOPAIV 118
#define F_PAIV 119
#define F_ALBO 120
#define F_COFI 122
#define F_ISFISICA 123

View File

@ -28,37 +28,70 @@ OUTPUT F_RAGSO S0
KEY 1
END
STRING F_RAGSO 50
BOOLEAN F_ISFISICA
BEGIN
PROMPT 2 4 "Ragione sociale "
PROMPT 40 2 "Persona Fisica"
FIELD B0
HELPT "Indica se è una persona fisica"
END
STRING F_RAGSO 30
BEGIN
PROMPT 2 3 "Cognome/Ragione sociale "
HELP "Ragione sociale del vettore"
FIELD S0
FIELD S0[1,30]
USE %VET KEY 2
CHECKTYPE REQUIRED
INPUT S0 F_RAGSO
DISPLAY "Codice vettore" CODTAB
DISPLAY "Ragione sociale@50" S0
OUTPUT F_CODVETT CODTAB
OUTPUT F_RAGSO S0
OUTPUT F_RAGSO S0[1,30]
OUTPUT F_RAGSO S0[31,50]
KEY 2
END
STRING F_RAGSOA 20
BEGIN
PROMPT 2 4 "Nome/Seconda parte Rag. Soc."
FIELD S0[31,50]
USE %VET KEY 2
HELP "Seconda parte della ragione sociale o nome"
MESSAGE COPY,6@
END
STRING F_STATOPAIV 2
BEGIN
PROMPT 50 50 "Partita IVA "
FLAGS "H"
END
STRING F_PAIV 12
BEGIN
PROMPT 2 6 "Partita IVA "
FIELD S3[21,32]
HELP "Partita IVA del cliente/fornitore"
VALIDATE PI_FUNC F_STATOPAIV
CHECKTYPE NORMAL
FIELD S3[49,51]
HELP "Codice ISO dello stato"
FLAGS "U"
USE %SCE
INPUT CODTAB F_STATOPAIV
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_STATOPAIV CODTAB
CHECKTYPE REQUIRED
END
GROUPBOX DLG_NULL 75 7
STRING F_PAIV 28 16
BEGIN
PROMPT 20 6 ""
FIELD S13[1,28]
HELP "Partita IVA del vettore"
VALIDATE PI_FUNC F_STATOPAIV
CHECKTYPE REQUIRED
END
STRING F_COFI 16
BEGIN
PROMPT 38 6 "Ident. fiscale"
FIELD S13[29,45]
HELP "Codice fiscale del vettore"
END
GROUPBOX DLG_NULL 75 8
BEGIN
PROMPT 1 7 "Recapito"
FLAGS "R"
@ -165,15 +198,22 @@ BEGIN
FIELD S3[33,48]
END
GROUPBOX DLG_NULL 75 5
STRING F_EORI 17
BEGIN
PROMPT 1 14 "Numeri telefonici"
PROMPT 2 13 "Codice EORI "
FIELD S2[1,17]
CHECKTYPE REQUIRED
END
GROUPBOX DLG_NULL 75 4
BEGIN
PROMPT 1 15 "Numeri telefonici"
FLAGS "R"
END
STRING F_PTEL 10
BEGIN
PROMPT 2 15 "Telefono "
PROMPT 2 16 "Telefono "
HELP "Prefisso telefonico del vettore"
FIELD S5[1,10]
FLAGS "U"
@ -181,7 +221,7 @@ END
STRING F_TEL 20
BEGIN
PROMPT 30 15 ""
PROMPT 30 16 ""
HELP "Numero telefonico del vettore"
FIELD S3[1,20]
FLAGS "U"
@ -189,7 +229,7 @@ END
STRING F_PFAX 10
BEGIN
PROMPT 2 16 "Fax "
PROMPT 2 17 "Fax "
HELP "Numero di Fax del vettore"
FIELD S5[11,20]
FLAGS "U"
@ -197,29 +237,12 @@ END
STRING F_FAX 20
BEGIN
PROMPT 30 16 ""
PROMPT 30 17 ""
HELP "Numero di Fax del vettore"
FIELD S4
FLAGS "U"
END
STRING F_PTELEX 10
BEGIN
PROMPT 2 17 "Telex "
HELP "Numero di Telex del vettore"
FIELD S2[1,10]
FLAGS "U"
END
STRING F_TELEX 20
BEGIN
PROMPT 30 17 ""
HELP "Numero di Telex del vettore"
FIELD S2[11,30]
FLAGS "U"
END
ENDPAGE
ENDMASK

View File

@ -12,7 +12,7 @@
#include "fp0.h"
#include "fp0300a.h"
#include <memory>
#include <map>
/////////////////////////////////////////////////////////////////////////////////////
// Globals
@ -20,6 +20,7 @@
#define LEN_HFATT 20
#define LEN_BFATT 50
#define MAPPA_DOC_SCELTI map<TString,TToken_string>
/////////////////////////////////////////////////////////////////////////////////////
// TPa_mask
@ -28,12 +29,14 @@
class TPA_mask : public TAutomask
{
protected:
enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi};
void set_filter_changed();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void next_page(int p);
bool check_not_empty();
bool check_full_fields() const;
bool check_tipo_doc(const TTipo_documento& td);
bool check_doc_filter(const TDocumentoEsteso& td);
void fill();
void init();
bool is_fattura(const TRectype& doc) const;
@ -41,7 +44,7 @@ protected:
void load_all_fields();
bool _filter_changed;
unique_ptr<TToken_string> _tipi_doc_scelti;
unique_ptr<MAPPA_DOC_SCELTI> _doc_scelti;
public:
TPA_mask() : TAutomask("fp0300a"), _filter_changed(true)
@ -66,31 +69,56 @@ void TPA_mask::save_all_fields() const
{
ini_set_string(CONFIG_DITTA, "fp", "dataini", get(F_DATAINI));
ini_set_string(CONFIG_DITTA, "fp", "dataend", get(F_DATAEND));
ini_set_string(CONFIG_DITTA, "fp", "codnum", get(F_CODNUM));
TToken_string tipidocs = get_tmp_string();
TToken_string tipidocs(get_tmp_string(), ';');
FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r)
{
tipidocs.add(r->get(0));
TToken_string app;
// Prendo tutta la riga tranne il cod sdi
app.add(r->get(_codnum));
app.add(r->get(_tipodoc));
app.add(r->get(_dastato));
app.add(r->get(_astato));
tipidocs.add(app);
}
ini_set_string(CONFIG_DITTA, "fp", "tipodocs", tipidocs);
ini_set_string(CONFIG_DITTA, "fp", "accepted_docs", tipidocs);
}
void TPA_mask::load_all_fields()
{
set(F_DATAINI, ini_get_string(CONFIG_DITTA, "fp", "dataini"));
set(F_DATAEND, ini_get_string(CONFIG_DITTA, "fp", "dataend"));
set(F_CODNUM, ini_get_string(CONFIG_DITTA, "fp", "codnum"));
TToken_string tipidocs(ini_get_string(CONFIG_DITTA, "fp", "tipodocs"));
const TToken_string s_accepted_docs(ini_get_string(CONFIG_DITTA, "fp", "accepted_docs"), ';');
//
auto& sheet = sfield(F_DOCUMENTI_TIPO);
sheet.hide();
FOR_EACH_STR_TOKEN(tipidocs, tok)
if(s_accepted_docs.full())
{
TToken_string& row = sheet.row(-1);
row.add(tok);
row.add(TTipo_documento(tok).tipo_doc_sdi());
// Nuova gestione avanzata!
FOR_EACH_STR_TOKEN(s_accepted_docs, tok)
{
TToken_string& row = sheet.row(-1);
row.add(tok);
row.add(TTipo_documento(tok).tipo_doc_sdi());
}
}
else
{
// Vecchia gestione ):
const TString& codnum = ini_get_string(CONFIG_DITTA, "fp", "codnum");
TToken_string tipidocs(ini_get_string(CONFIG_DITTA, "fp", "tipodocs"));
FOR_EACH_STR_TOKEN(tipidocs, tok)
{
TToken_string& row = sheet.row(-1);
row.add(codnum);
row.add(tok);
// Considero 1 e 9 come stati default?
row.add(1);
row.add(9);
row.add(TTipo_documento(tok).tipo_doc_sdi());
}
}
sheet.force_update();
sheet.show();
@ -119,9 +147,8 @@ TString& add_filter(const TString& field, const TString& from, const TString& to
void TPA_mask::fill()
{
save_all_fields();
// Pulisco i tipi documento
_tipi_doc_scelti.reset();
_doc_scelti.reset();
TSheet_field& docs = sfield(F_DOCS);
TString_array& sht = docs.rows_array();
@ -130,6 +157,7 @@ void TPA_mask::fill()
sht.destroy();
const TDate dal = get(F_DATAINI);
const TDate al = get(F_DATAEND);
TString filter_selected = get(F_FATTSEL);
#ifdef DBG
@ -144,21 +172,18 @@ void TPA_mask::fill()
TString query;
query << "USE 33 KEY 3" <<
"\nSELECT (33.TIPOCF=='C')&&" <<
"(33.CODNUM==#CODNUM)";
query << "\nJOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC\n" <<
"FROM DATADOC=#DADATADOC\n" <<
"TO DATADOC=#ADATADOC";
query << "USE 33 KEY 3 \n" <<
"SELECT 33.TIPOCF==\"C\" \n" <<
"JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC \n" <<
"FROM DATADOC=#DADATADOC \n" <<
"TO DATADOC=#ADATADOC";
TISAM_recordset rec(query);
rec.set_var("#CODNUM", get(F_CODNUM));
rec.set_var("#DADATADOC", get_date(F_DATAINI));
rec.set_var("#ADATADOC", get_date(F_DATAEND));
rec.set_var("#DADATADOC", dal);
rec.set_var("#ADATADOC", al);
TProgress_monitor pi(rec.items(), nullptr);
@ -175,8 +200,10 @@ void TPA_mask::fill()
const TRectype& doc = rec.cursor()->curr();
const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC));
// Controllo che la numerazione sia tra quelle giuste
// Controllo che il tipo documento sia OK
if(!check_tipo_doc(td))
if(!check_doc_filter(doc))
continue;
bool sent = false;
@ -373,20 +400,30 @@ bool TPA_mask::check_full_fields() const
return true;
}
bool TPA_mask::check_tipo_doc(const TTipo_documento& td)
bool TPA_mask::check_doc_filter(const TDocumentoEsteso& d)
{
const TTipo_documento& td = cached_tipodoc(d.get(DOC_TIPODOC));
// Mi precarico la tabella dei documenti scelti
if(_tipi_doc_scelti == nullptr)
if(_doc_scelti == nullptr)
{
_tipi_doc_scelti.reset(new TToken_string());
_doc_scelti.reset(new MAPPA_DOC_SCELTI);
FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r)
{
_tipi_doc_scelti->add(r->get(0));
MAPPA_DOC_SCELTI & app = *_doc_scelti;
TToken_string& tipi = app[r->get(_codnum)];
if(tipi.find(r->get(_tipodoc)) < 0)
{
tipi.add(r->get(_tipodoc));
}
}
}
// Controllo innanzitutto che sia tra quelli scelti
return _tipi_doc_scelti->find(td.codice()) >= 0 && td.tipo_doc_sdi().full() && td.reg_fisc().full();
return
_doc_scelti->find(d.codice_numerazione().codice()) != _doc_scelti->end() && // Esiste il codice numerazione
(*_doc_scelti)[d.codice_numerazione().codice()].find(td.codice()) >= 0 && // Se esiste il tipo documento
td.reg_fisc().full(); // Se ha il regime fiscale
}

View File

@ -2,14 +2,16 @@
#define F_DATAINI 401
#define F_DATAEND 402
#define F_FATTSEL 403
#define F_CODNUM 404
#define END_MASK 499
#define F_DOCUMENTI_TIPO 301
#define S_TIPODOCSEL 101
#define S_TIPODOCSDI 102
#define S_SELCODNUM 101
#define S_TIPODOCSEL 102
#define S_DASTATO 103
#define S_ASTATO 104
#define S_TIPODOCSDI 105
#define F_DOCS 201

View File

@ -15,40 +15,29 @@ END
DATE F_DATAEND
BEGIN
PROMPT 40 1 "Data finale "
PROMPT 50 1 "Data finale "
VALIDATE DATE_CMP_FUNC >= F_DATAINI
WARNING "La data finale non può essere minore della data iniziale"
CHECKTYPE REQUIRED
END
RADIOBUTTON F_FATTSEL 3 35
RADIOBUTTON F_FATTSEL 3 80
BEGIN
PROMPT 1 2 "Fatture da visualizzare"
ITEM "|Da inviare"
ITEM "X|XML Generato"
ITEM "N|Notificato"
ITEM "E|In errore"
FLAGS "Z"
END
STRING F_CODNUM 4
SPREADSHEET F_DOCUMENTI_TIPO 80 5
BEGIN
PROMPT 40 2 "Numerazione "
HELP "Codice numerazione"
USE %NUM
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODNUM CODTAB
CHECKTYPE REQUIRED
FLAG "UPA"
WARNING "Numerazione assente"
KEY 1 2
END
SPREADSHEET F_DOCUMENTI_TIPO 25 5
BEGIN
PROMPT 40 3 ""
PROMPT 1 6 ""
ITEM "Cod Num"
ITEM "Tipo Doc"
ITEM "Stato Iniziale"
ITEM "Stato Finale"
ITEM "Tipo SDI"
END
@ -68,7 +57,7 @@ BEGIN
ITEM "Data\nDoc.@10"
ITEM "Cliente"
ITEM "Ragione Sociale@50"
ITEM "Codice destinatario"
ITEM "Codice destinatario@20"
ITEM "Riferimento\nAmministrazione@20"
ITEM "Codice Fiscale@16"
ITEM "Scissione\nPagamenti@9"
@ -79,11 +68,26 @@ END
ENDPAGE
ENDMASK
PAGE "Riga tipo doc" -1 -1 25 3
PAGE "Riga tipo doc" -1 -1 50 3
STRING S_SELCODNUM 4
BEGIN
PROMPT 1 1 "Numerazione "
HELP "Codice numerazione"
USE %NUM
INPUT CODTAB S_SELCODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT S_SELCODNUM CODTAB
CHECKTYPE REQUIRED
FLAG "UPA"
WARNING "Numerazione assente"
KEY 1 2
END
STRING S_TIPODOCSEL 4
BEGIN
PROMPT 1 1 "Tipo doc "
PROMPT 15 1 "Tipo doc "
HELP "Codice tipo documento"
USE %TIP
SELECT S3[37,40]!=""
@ -97,9 +101,31 @@ BEGIN
FLAG "UPA"
END
STRING S_DASTATO 1
BEGIN
PROMPT 1 2 "Da stato "
USE %STD
INPUT CODTAB S_DASTATO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT S_DASTATO CODTAB
FLAG "U"
END
STRING S_ASTATO 1
BEGIN
PROMPT 15 2 "A stato "
USE %STD
INPUT CODTAB S_ASTATO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT S_ASTATO CODTAB
FLAG "U"
END
STRING S_TIPODOCSDI 4
BEGIN
PROMPT 1 2 "Tipo Doc SDI"
PROMPT 30 1 "Tipo Doc SDI"
FLAG "D"
END
@ -181,7 +207,7 @@ BEGIN
FLAGS "D"
END
STRING S_UFFICIO 20
STRING S_UFFICIO 50 20
BEGIN
PROMPT 1 5 ""
FLAGS "D"

View File

@ -13,6 +13,7 @@
#include "../fe/felib.h"
#include "../cg/cglib03.h"
#include "../ve/velib04.h"
#include <anagiu.h>
#include <comuni.h>
@ -840,24 +841,37 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
_hfatt.cut(0);
_bfatt.cut(0);
if (!chiave_paf(doc, _hfatt, _bfatt))
return false;
log(-1, _bfatt);
#ifndef DBG
// Controllo se il documento è almeno in stato di stampa
if (doc.stato() < doc.tipo().stato_finale_stampa())
{
log(3, "Il documento non è stato ancora stampato, verrà saltato");
return false;
}
#endif
TAnagrafica clifo(doc.clifor().tipo(), doc.clifor().codice());
TString8 coddest = doc.clifor().vendite().get("PADESTIN");
TString pec = doc.clifor().get("PEC");
TString8 coddest;
TString pec;
const bool is_pa = doc.clifor().get_int("ALLEG") == 7;
#ifndef DBG
if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec))
return false;
#else
coddest = "WSUHKZ";
#endif
const bool enapec = coddest == "0000000" && pec.full();
const bool privato = coddest.len() != 6;
bool ok = true;
if (!chiave_paf(doc, _hfatt, _bfatt))
return false;
log(-1, _bfatt);
const TFirm& firm = prefix().firm();
const char* const paese = "IT";
TCausale caus = TCausale(doc.tipo().causale(), doc.anno());
@ -881,6 +895,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
ok &= insert(paf0100f);
// </DatiTrassmissione>
#ifndef DBG
if (enapec)
{
// <Datipec>
@ -892,6 +907,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
ok &= insert(paf3200f);
// </Datipec>
}
#endif
// <CedentePrestatore>
TPaf_record paf0200f("PAF0200F");
@ -972,12 +988,17 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf0400f.set("P4_KEYBODYFATT", _bfatt);
remove(paf0400f);
#ifndef DBG
if (cliente.partita_IVA().full())
{
paf0400f.set("P4_FISCIVAPAESE", cliente.stato_partita_IVA());
paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA());
}
paf0400f.set("P4_CODFISC", cliente.codice_fiscale());
#else
paf0400f.set("P4_FISCIVAPAESE", "IT");
paf0400f.set("P4_FISCIVACOD", "00261170039");
#endif
if (cliente.fisica())
{
@ -1179,6 +1200,34 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
log(1, "CIG e CUP assenti");
// <DatiBeniServizi>
// <DatiDDT>
TPaf_record paf1700f("PAF1700F");
paf1700f.set("PG_KEYHEADERFATT", _hfatt);
paf1700f.set("PG_KEYBODYFATT", _bfatt);
remove(paf1700f); // Cancella la riga del vettore
if(doc.get("CODVETT1").full())
{
TRectype vet = cache().get("%VET", doc.get("CODVETT1"));
paf1700f.set("PG_FISCIVAPAESE", vet.get("S3").mid(48,2));
paf1700f.set("PG_FISCIVACODICE", vet.get("S13").mid(0, 28));
paf1700f.set("PG_CODICEFISCALE", vet.get("S13").mid(28, 16));
if (vet.get_bool("B0"))
{
paf1700f.set("PG_ANANOME", vet.get("S0").mid(0, 30));
paf1700f.set("PG_ANACOGNOME", vet.get("S0").mid(30, 20));
}
else
paf1700f.set("PG_ANADENOMINAZ", vet.get("S0").mid(0, 50));
paf1700f.set("PG_ANACODEORI", vet.get("S2").mid(0, 17));
ok &= insert(paf1700f);
}
// </DatiDDT>
TPaf_record paf1800f("PAF1800F");
paf1800f.set("PI_KEYHEADERFATT", _hfatt);
paf1800f.set("PI_KEYBODYFATT", _bfatt);
@ -1217,6 +1266,9 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_KEYBODYFATT", _bfatt);
paf1800f.set("PI_NUMEROLINEA", ++riga);
if (descrizione(*rdoc).empty())
continue;
paf3000f.reset();
paf3000f.set("PT_KEYHEADERFATT", _hfatt);
paf3000f.set("PT_KEYBODYFATT", _bfatt);
@ -1227,12 +1279,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO);
paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione
// <CodiceArticolo>
long riga_art = 0;
TArticolo& art = rdoc->articolo();
if (art.ok())
if (art.full())
{
paf1900f.reset();
paf1900f.set("PY_KEYHEADERFATT", _hfatt);
@ -1433,7 +1484,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO);
paf1800f.set("PI_ALIQUOTAIVA", "22.00");
set_IVA(codivadefault, paf1800f);
ok &= insert(paf1800f) && insert(paf3000f);
}
}
@ -1501,25 +1552,12 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO);
paf1800f.set("PI_ALIQUOTAIVA", "22.00");
set_IVA(codivadefault, paf1800f);
ok &= insert(paf1800f) && insert(paf3000f);
}
// </DatiBeniServizi>
// <DatiTrasporto>
TString cod_vettore = doc.get("CODVETT1");
// É una fattura accompagnatoria!
if(cod_vettore.full())
{
TRectype vettore = cache().get("%VET", cod_vettore);
// Controllo di avere tutto quello che mi interessa
}
// </DatiTrasporto>
// Salvo la testata
ok &= insert(paf0700f);
@ -1583,6 +1621,9 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf2500f.set("PO_CONDPAGAMENTO", rateazione); // Condizione di pagamento PA
paf2500f.set("PO_CODICEPAGAM", pag.code()); // Condizione di pagamento CAMPO
TRectype cod_pag = cache().get("CPG", doc.pagamento().code());
const int tipo_pag = cod_pag.get_int("S4");
TString80 iban, istituto;
TString8 abi, cab;
if (get_bank(doc, iban, abi, cab, istituto))
@ -1593,21 +1634,20 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf2500f.set("PO_CAB", cab);
}
if (cab.blank())
if (tipo_pag == 3 && cab.blank()) // Ricevuta bancaria
log(2, TR("Non sono presenti ABI, CAB, IBAN per il pagamento"));
else if (iban.blank())
log(1, TR("Non è presente il codice IBAN per il pagamento"));
if ((tipo_pag == 8 || tipo_pag == 9) && iban.blank()) // R.I.D. o Bonifico
{
log(1, TR("Non è presente il codice IBAN per il pagamento"));
}
for (int nr = 0; nr < nrate; nr++)
{
paf2500f.set("PO_RIGA", long(nr + 1)); // Numero rata
int rp = nr < pag.n_rate() ? nr : 0;
static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp);
#ifdef DBG
bool tolla = true;
TString pop = cache().get("%CLR", key_class, "S12");
bool aaaa = true;
#endif
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
@ -1685,15 +1725,16 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
// </DatiPagamento>
// Tabella di non invio XML
TPaf_record pafw300f("PAFW300F");
pafw300f.set("PW_KEYHEADERFATT", _hfatt);
pafw300f.set("PW_KEYBODYFATT", _bfatt);
remove(pafw300f); // Cancella eventuali allegati
const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC));
const TString codsdi = !td.invio_xml() ? "**********" : (enapec ? pec : coddest);
pafw300f.set("PW_CODSDI", codsdi);
ok &= insert(pafw300f);
if (!cached_tipodoc(doc.get(DOC_TIPODOC)).invio_xml())
{
// Tabella di non invio XML
TPaf_record pafw300f("PAFW300F");
pafw300f.set("PW_KEYHEADERFATT", _hfatt);
pafw300f.set("PW_KEYBODYFATT", _bfatt);
remove(pafw300f);
pafw300f.set("PW_CODSDI", "**********");
ok &= insert(pafw300f);
}
return _to_commit = (ok && save_paf());
}

View File

@ -102,7 +102,7 @@ private:
protected:
bool parse_sconto(const TString& formula, TToken_string& sconti) const;
static bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban);
static bool get_bnp_iban(const TString& abi, const TString& cab, int prg, TString& iban);
bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const;
const TString& descrizione(const TRiga_documento& rdoc) const;
const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta