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:
parent
30e9c1876a
commit
baef2bfba4
@ -1,3 +1,3 @@
|
||||
4
|
||||
1
|
||||
%tabcom|0|0|1210|0|Tabelle comuni|1500||
|
||||
%tabcom|0|0|1280|0|Tabelle comuni|1500||
|
||||
|
@ -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|
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user