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 4
1 1
%tabcom|0|0|1210|0|Tabelle comuni|1500|| %tabcom|0|0|1280|0|Tabelle comuni|1500||

View File

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

View File

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

View File

@ -8,6 +8,7 @@
#include "cgtbbnp.h" #include "cgtbbnp.h"
#include "cgtbesc.h" #include "cgtbesc.h"
#include "cgtbnot.h" #include "cgtbnot.h"
#include "cgtbvet.h"
#include "cglib01.h" #include "cglib01.h"
@ -148,6 +149,13 @@ int CGTTable_application::read(TMask& m)
if (table_name == TAB_NOTECLI) if (table_name == TAB_NOTECLI)
glue_string(); 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; return err;
} }

View File

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

View File

@ -28,37 +28,70 @@ OUTPUT F_RAGSO S0
KEY 1 KEY 1
END END
STRING F_RAGSO 50 BOOLEAN F_ISFISICA
BEGIN 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" HELP "Ragione sociale del vettore"
FIELD S0 FIELD S0[1,30]
USE %VET KEY 2 USE %VET KEY 2
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
INPUT S0 F_RAGSO INPUT S0 F_RAGSO
DISPLAY "Codice vettore" CODTAB DISPLAY "Codice vettore" CODTAB
DISPLAY "Ragione sociale@50" S0 DISPLAY "Ragione sociale@50" S0
OUTPUT F_CODVETT CODTAB OUTPUT F_CODVETT CODTAB
OUTPUT F_RAGSO S0 OUTPUT F_RAGSO S0[1,30]
OUTPUT F_RAGSO S0[31,50]
KEY 2 KEY 2
END 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 STRING F_STATOPAIV 2
BEGIN
PROMPT 50 50 "Partita IVA "
FLAGS "H"
END
STRING F_PAIV 12
BEGIN BEGIN
PROMPT 2 6 "Partita IVA " PROMPT 2 6 "Partita IVA "
FIELD S3[21,32] FIELD S3[49,51]
HELP "Partita IVA del cliente/fornitore" HELP "Codice ISO dello stato"
VALIDATE PI_FUNC F_STATOPAIV FLAGS "U"
CHECKTYPE NORMAL USE %SCE
INPUT CODTAB F_STATOPAIV
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_STATOPAIV CODTAB
CHECKTYPE REQUIRED
END 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 BEGIN
PROMPT 1 7 "Recapito" PROMPT 1 7 "Recapito"
FLAGS "R" FLAGS "R"
@ -165,15 +198,22 @@ BEGIN
FIELD S3[33,48] FIELD S3[33,48]
END END
GROUPBOX DLG_NULL 75 5 STRING F_EORI 17
BEGIN 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" FLAGS "R"
END END
STRING F_PTEL 10 STRING F_PTEL 10
BEGIN BEGIN
PROMPT 2 15 "Telefono " PROMPT 2 16 "Telefono "
HELP "Prefisso telefonico del vettore" HELP "Prefisso telefonico del vettore"
FIELD S5[1,10] FIELD S5[1,10]
FLAGS "U" FLAGS "U"
@ -181,7 +221,7 @@ END
STRING F_TEL 20 STRING F_TEL 20
BEGIN BEGIN
PROMPT 30 15 "" PROMPT 30 16 ""
HELP "Numero telefonico del vettore" HELP "Numero telefonico del vettore"
FIELD S3[1,20] FIELD S3[1,20]
FLAGS "U" FLAGS "U"
@ -189,7 +229,7 @@ END
STRING F_PFAX 10 STRING F_PFAX 10
BEGIN BEGIN
PROMPT 2 16 "Fax " PROMPT 2 17 "Fax "
HELP "Numero di Fax del vettore" HELP "Numero di Fax del vettore"
FIELD S5[11,20] FIELD S5[11,20]
FLAGS "U" FLAGS "U"
@ -197,29 +237,12 @@ END
STRING F_FAX 20 STRING F_FAX 20
BEGIN BEGIN
PROMPT 30 16 "" PROMPT 30 17 ""
HELP "Numero di Fax del vettore" HELP "Numero di Fax del vettore"
FIELD S4 FIELD S4
FLAGS "U" FLAGS "U"
END 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 ENDPAGE
ENDMASK ENDMASK

View File

@ -12,7 +12,7 @@
#include "fp0.h" #include "fp0.h"
#include "fp0300a.h" #include "fp0300a.h"
#include <memory> #include <memory>
#include <map>
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
// Globals // Globals
@ -20,6 +20,7 @@
#define LEN_HFATT 20 #define LEN_HFATT 20
#define LEN_BFATT 50 #define LEN_BFATT 50
#define MAPPA_DOC_SCELTI map<TString,TToken_string>
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
// TPa_mask // TPa_mask
@ -28,12 +29,14 @@
class TPA_mask : public TAutomask class TPA_mask : public TAutomask
{ {
protected: protected:
enum {_codnum, _tipodoc, _dastato, _astato, _tiposdi};
void set_filter_changed(); void set_filter_changed();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void next_page(int p); void next_page(int p);
bool check_not_empty(); bool check_not_empty();
bool check_full_fields() const; bool check_full_fields() const;
bool check_tipo_doc(const TTipo_documento& td); bool check_doc_filter(const TDocumentoEsteso& td);
void fill(); void fill();
void init(); void init();
bool is_fattura(const TRectype& doc) const; bool is_fattura(const TRectype& doc) const;
@ -41,7 +44,7 @@ protected:
void load_all_fields(); void load_all_fields();
bool _filter_changed; bool _filter_changed;
unique_ptr<TToken_string> _tipi_doc_scelti; unique_ptr<MAPPA_DOC_SCELTI> _doc_scelti;
public: public:
TPA_mask() : TAutomask("fp0300a"), _filter_changed(true) 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", "dataini", get(F_DATAINI));
ini_set_string(CONFIG_DITTA, "fp", "dataend", get(F_DATAEND)); 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) 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() void TPA_mask::load_all_fields()
{ {
set(F_DATAINI, ini_get_string(CONFIG_DITTA, "fp", "dataini")); set(F_DATAINI, ini_get_string(CONFIG_DITTA, "fp", "dataini"));
set(F_DATAEND, ini_get_string(CONFIG_DITTA, "fp", "dataend")); 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); auto& sheet = sfield(F_DOCUMENTI_TIPO);
sheet.hide(); sheet.hide();
FOR_EACH_STR_TOKEN(tipidocs, tok)
{
TToken_string& row = sheet.row(-1); if(s_accepted_docs.full())
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.force_update();
sheet.show(); sheet.show();
@ -119,9 +147,8 @@ TString& add_filter(const TString& field, const TString& from, const TString& to
void TPA_mask::fill() void TPA_mask::fill()
{ {
save_all_fields();
// Pulisco i tipi documento // Pulisco i tipi documento
_tipi_doc_scelti.reset(); _doc_scelti.reset();
TSheet_field& docs = sfield(F_DOCS); TSheet_field& docs = sfield(F_DOCS);
TString_array& sht = docs.rows_array(); TString_array& sht = docs.rows_array();
@ -130,6 +157,7 @@ void TPA_mask::fill()
sht.destroy(); sht.destroy();
const TDate dal = get(F_DATAINI); const TDate dal = get(F_DATAINI);
const TDate al = get(F_DATAEND);
TString filter_selected = get(F_FATTSEL); TString filter_selected = get(F_FATTSEL);
#ifdef DBG #ifdef DBG
@ -144,21 +172,18 @@ void TPA_mask::fill()
TString query; TString query;
query << "USE 33 KEY 3" << query << "USE 33 KEY 3 \n" <<
"\nSELECT (33.TIPOCF=='C')&&" << "SELECT 33.TIPOCF==\"C\" \n" <<
"(33.CODNUM==#CODNUM)"; "JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
query << "\nJOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << "JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC \n" <<
"JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" << "FROM DATADOC=#DADATADOC \n" <<
"JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC\n" << "TO DATADOC=#ADATADOC";
"FROM DATADOC=#DADATADOC\n" <<
"TO DATADOC=#ADATADOC";
TISAM_recordset rec(query); TISAM_recordset rec(query);
rec.set_var("#CODNUM", get(F_CODNUM)); rec.set_var("#DADATADOC", dal);
rec.set_var("#DADATADOC", get_date(F_DATAINI)); rec.set_var("#ADATADOC", al);
rec.set_var("#ADATADOC", get_date(F_DATAEND));
TProgress_monitor pi(rec.items(), nullptr); TProgress_monitor pi(rec.items(), nullptr);
@ -175,8 +200,10 @@ void TPA_mask::fill()
const TRectype& doc = rec.cursor()->curr(); const TRectype& doc = rec.cursor()->curr();
const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); 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 // Controllo che il tipo documento sia OK
if(!check_tipo_doc(td)) if(!check_doc_filter(doc))
continue; continue;
bool sent = false; bool sent = false;
@ -373,20 +400,30 @@ bool TPA_mask::check_full_fields() const
return true; return true;
} }
bool TPA_mask::check_tipo_doc(const TTipo_documento& td) bool TPA_mask::check_doc_filter(const TDocumentoEsteso& d)
{ {
// Mi precarico la tabella dei documenti scelti const TTipo_documento& td = cached_tipodoc(d.get(DOC_TIPODOC));
if(_tipi_doc_scelti == nullptr) // Mi precarico la tabella dei documenti scelti
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) 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 // 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_DATAINI 401
#define F_DATAEND 402 #define F_DATAEND 402
#define F_FATTSEL 403 #define F_FATTSEL 403
#define F_CODNUM 404
#define END_MASK 499 #define END_MASK 499
#define F_DOCUMENTI_TIPO 301 #define F_DOCUMENTI_TIPO 301
#define S_TIPODOCSEL 101 #define S_SELCODNUM 101
#define S_TIPODOCSDI 102 #define S_TIPODOCSEL 102
#define S_DASTATO 103
#define S_ASTATO 104
#define S_TIPODOCSDI 105
#define F_DOCS 201 #define F_DOCS 201

View File

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

View File

@ -13,6 +13,7 @@
#include "../fe/felib.h" #include "../fe/felib.h"
#include "../cg/cglib03.h" #include "../cg/cglib03.h"
#include "../ve/velib04.h"
#include <anagiu.h> #include <anagiu.h>
#include <comuni.h> #include <comuni.h>
@ -840,24 +841,37 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
_hfatt.cut(0); _hfatt.cut(0);
_bfatt.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()); TAnagrafica clifo(doc.clifor().tipo(), doc.clifor().codice());
TString8 coddest = doc.clifor().vendite().get("PADESTIN"); TString8 coddest;
TString pec = doc.clifor().get("PEC"); TString pec;
const bool is_pa = doc.clifor().get_int("ALLEG") == 7; const bool is_pa = doc.clifor().get_int("ALLEG") == 7;
#ifndef DBG
if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec)) if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec))
return false; return false;
#else
coddest = "WSUHKZ";
#endif
const bool enapec = coddest == "0000000" && pec.full(); const bool enapec = coddest == "0000000" && pec.full();
const bool privato = coddest.len() != 6; const bool privato = coddest.len() != 6;
bool ok = true; bool ok = true;
if (!chiave_paf(doc, _hfatt, _bfatt))
return false;
log(-1, _bfatt);
const TFirm& firm = prefix().firm(); const TFirm& firm = prefix().firm();
const char* const paese = "IT"; const char* const paese = "IT";
TCausale caus = TCausale(doc.tipo().causale(), doc.anno()); TCausale caus = TCausale(doc.tipo().causale(), doc.anno());
@ -881,6 +895,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
ok &= insert(paf0100f); ok &= insert(paf0100f);
// </DatiTrassmissione> // </DatiTrassmissione>
#ifndef DBG
if (enapec) if (enapec)
{ {
// <Datipec> // <Datipec>
@ -892,6 +907,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
ok &= insert(paf3200f); ok &= insert(paf3200f);
// </Datipec> // </Datipec>
} }
#endif
// <CedentePrestatore> // <CedentePrestatore>
TPaf_record paf0200f("PAF0200F"); TPaf_record paf0200f("PAF0200F");
@ -972,12 +988,17 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf0400f.set("P4_KEYBODYFATT", _bfatt); paf0400f.set("P4_KEYBODYFATT", _bfatt);
remove(paf0400f); remove(paf0400f);
#ifndef DBG
if (cliente.partita_IVA().full()) if (cliente.partita_IVA().full())
{ {
paf0400f.set("P4_FISCIVAPAESE", cliente.stato_partita_IVA()); paf0400f.set("P4_FISCIVAPAESE", cliente.stato_partita_IVA());
paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA()); paf0400f.set("P4_FISCIVACOD", cliente.partita_IVA());
} }
paf0400f.set("P4_CODFISC", cliente.codice_fiscale()); paf0400f.set("P4_CODFISC", cliente.codice_fiscale());
#else
paf0400f.set("P4_FISCIVAPAESE", "IT");
paf0400f.set("P4_FISCIVACOD", "00261170039");
#endif
if (cliente.fisica()) if (cliente.fisica())
{ {
@ -1179,6 +1200,34 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
log(1, "CIG e CUP assenti"); log(1, "CIG e CUP assenti");
// <DatiBeniServizi> // <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"); TPaf_record paf1800f("PAF1800F");
paf1800f.set("PI_KEYHEADERFATT", _hfatt); paf1800f.set("PI_KEYHEADERFATT", _hfatt);
paf1800f.set("PI_KEYBODYFATT", _bfatt); 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_KEYBODYFATT", _bfatt);
paf1800f.set("PI_NUMEROLINEA", ++riga); paf1800f.set("PI_NUMEROLINEA", ++riga);
if (descrizione(*rdoc).empty())
continue;
paf3000f.reset(); paf3000f.reset();
paf3000f.set("PT_KEYHEADERFATT", _hfatt); paf3000f.set("PT_KEYHEADERFATT", _hfatt);
paf3000f.set("PT_KEYBODYFATT", _bfatt); 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_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO); paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO); paf1800f.set("PI_PRZTOTALE", ZERO);
paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione
// <CodiceArticolo> // <CodiceArticolo>
long riga_art = 0; long riga_art = 0;
TArticolo& art = rdoc->articolo(); TArticolo& art = rdoc->articolo();
if (art.ok()) if (art.full())
{ {
paf1900f.reset(); paf1900f.reset();
paf1900f.set("PY_KEYHEADERFATT", _hfatt); 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_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO); paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO); paf1800f.set("PI_PRZTOTALE", ZERO);
paf1800f.set("PI_ALIQUOTAIVA", "22.00"); set_IVA(codivadefault, paf1800f);
ok &= insert(paf1800f) && insert(paf3000f); 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_QUANTITA", UNO);
paf1800f.set("PI_PREZZOUNIT", ZERO); paf1800f.set("PI_PREZZOUNIT", ZERO);
paf1800f.set("PI_PRZTOTALE", ZERO); paf1800f.set("PI_PRZTOTALE", ZERO);
paf1800f.set("PI_ALIQUOTAIVA", "22.00"); set_IVA(codivadefault, paf1800f);
ok &= insert(paf1800f) && insert(paf3000f); ok &= insert(paf1800f) && insert(paf3000f);
} }
// </DatiBeniServizi> // </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 // Salvo la testata
ok &= insert(paf0700f); 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_CONDPAGAMENTO", rateazione); // Condizione di pagamento PA
paf2500f.set("PO_CODICEPAGAM", pag.code()); // Condizione di pagamento CAMPO 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; TString80 iban, istituto;
TString8 abi, cab; TString8 abi, cab;
if (get_bank(doc, iban, abi, cab, istituto)) 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); 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")); 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++) for (int nr = 0; nr < nrate; nr++)
{ {
paf2500f.set("PO_RIGA", long(nr + 1)); // Numero rata paf2500f.set("PO_RIGA", long(nr + 1)); // Numero rata
int rp = nr < pag.n_rate() ? nr : 0; int rp = nr < pag.n_rate() ? nr : 0;
static TString key_class; key_class.cut(0) << pag.tipo_rata(rp) << pag.ulc_rata(rp); 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 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 TToken_string& riga = scad.row(nr); // Data|Importo
@ -1685,15 +1725,16 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
} }
// </DatiPagamento> // </DatiPagamento>
// Tabella di non invio XML if (!cached_tipodoc(doc.get(DOC_TIPODOC)).invio_xml())
TPaf_record pafw300f("PAFW300F"); {
pafw300f.set("PW_KEYHEADERFATT", _hfatt); // Tabella di non invio XML
pafw300f.set("PW_KEYBODYFATT", _bfatt); TPaf_record pafw300f("PAFW300F");
remove(pafw300f); // Cancella eventuali allegati pafw300f.set("PW_KEYHEADERFATT", _hfatt);
const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC)); pafw300f.set("PW_KEYBODYFATT", _bfatt);
const TString codsdi = !td.invio_xml() ? "**********" : (enapec ? pec : coddest); remove(pafw300f);
pafw300f.set("PW_CODSDI", codsdi); pafw300f.set("PW_CODSDI", "**********");
ok &= insert(pafw300f); ok &= insert(pafw300f);
}
return _to_commit = (ok && save_paf()); return _to_commit = (ok && save_paf());
} }

View File

@ -102,7 +102,7 @@ private:
protected: protected:
bool parse_sconto(const TString& formula, TToken_string& sconti) const; 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; bool get_bank(const TDocumento& doc, TString& iban, TString& abi, TString& cab, TString& istituto) const;
const TString& descrizione(const TRiga_documento& rdoc) const; const TString& descrizione(const TRiga_documento& rdoc) const;
const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta const TRectype& cco(const TRectype& doc) const; // Contratto/Convenzione/Offerta