@palmabit/json2fatturapaxml
Version:
Crea una fattura elettronica partendo da un JSON
638 lines (591 loc) • 15.6 kB
JavaScript
'use strict'
const BaseJoi = require('joi-currency-code')(require('joi'))
const JoiCountryExtension = require('joi-country-extension')
const Joi = BaseJoi.extend(JoiCountryExtension)
const TipiDocumentiValidi = [
'TD01',
'TD02',
'TD02',
'TD03',
'TD04',
'TD05',
'TD06',
'TD16',
'TD17',
'TD18',
'TD19',
'TD20',
'TD21',
'TD22',
'TD23',
'TD24',
'TD25',
'TD26',
'TD27',
'TD28',
'TD29',
]
const TipiRitenuteValide = [
'RT01',
'RT02',
'RT03',
'RT04',
'RT05',
'RT06',
]
const TipiCassaValidi = [
'TC01',
'TC02',
'TC03',
'TC04',
'TC05',
'TC06',
'TC07',
'TC08',
'TC09',
'TC10',
'TC11',
'TC12',
'TC13',
'TC14',
'TC15',
'TC16',
'TC17',
'TC18',
'TC19',
'TC20',
'TC21',
'TC22'
]
const NaturaValidi = [
'N1',
'N2',
'N2.1',
'N2.2',
'N3',
'N3.1',
'N3.2',
'N3.3',
'N3.4',
'N3.5',
'N3.6',
'N4',
'N5',
'N6',
'N6.1',
'N6.2',
'N6.3',
'N6.4',
'N6.5',
'N6.6',
'N6.7',
'N6.8',
'N6.9',
'N7',
]
const ModalitaPagamentoValidi = [
'MP01',
'MP02',
'MP03',
'MP04',
'MP05',
'MP06',
'MP07',
'MP08',
'MP09',
'MP10',
'MP11',
'MP12',
'MP13',
'MP14',
'MP15',
'MP16',
'MP17',
'MP18',
'MP19',
'MP20',
'MP21',
'MP22',
'MP23',
]
const IdPaeseSchema = Joi.string().country()
const IdCodiceSchema = Joi.string()
.alphanum()
.min(2)
.max(28)
const IdFiscaleIVASchema = Joi.object().keys({
IdPaese: IdPaeseSchema.required(),
IdCodice: IdCodiceSchema.required()
})
const CodiceFiscaleSchema = Joi.string()
.alphanum()
.min(11)
.max(16)
const PrezzoSchema = Joi.string().regex(/^[-]?\d{1,13}(\.\d{2,6})$/)
const AliquotaIVASchema = Joi.string().regex(/^\d{1,3}(\.\d{2,2})$/)
const DatiRitenutaSchema = Joi.array().items(Joi.object().keys({
TipoRitenuta: Joi.valid(TipiRitenuteValide).required(),
ImportoRitenuta: Joi.string()
.regex(/^[-]?\d{1,12}(\.\d{2,6})$/)
.required(), // min 4 max 15
AliquotaRitenuta: Joi.string()
.regex(/^[-]?\d{1,3}(\.\d{2,2})$/)
.required(),
CausalePagamento: Joi.string()
.min(1)
.max(2)
.required()
}))
const DatiBolloSchema = Joi.object().keys({
BolloVirtuale: Joi.valid('SI').required(),
ImportoBollo: Joi.string()
.regex(/^[-]?\d{1,12}(\.\d{2,6})$/)
.required()
})
const DatiCassaPrevidenzialeItemSchema = Joi.object()
.keys({
TipoCassa: Joi.valid(TipiCassaValidi).required(),
AlCassa: Joi.string()
.regex(/^\d{1,3}(\.\d{2,2})$/)
.required(),
ImportoContributoCassa: Joi.string()
.regex(/^[-]?\d{1,12}(\.\d{2,6})$/)
.required(),
ImponibileCassa: Joi.string().regex(/^[-]?\d{1,12}(\.\d{2,6})$/),
AliquotaIVA: AliquotaIVASchema.required(),
Ritenuta: Joi.valid('SI'),
Natura: Joi.valid(NaturaValidi),
RiferimentoAmministrazione: Joi.string()
.min(1)
.max(20)
})
.required()
const DatiCassaPrevidenzialeSchema = Joi.alternatives().try(
Joi.array().items(DatiCassaPrevidenzialeItemSchema),
DatiCassaPrevidenzialeItemSchema
)
const ScontoMaggiorazioneItemSchema = Joi.object()
.keys({
Tipo: Joi.valid('SC', 'MG').required(),
Percentuale: Joi.string().regex(/^\d{1,3}(\.\d{2,2})$/),
Importo: Joi.string().regex(/^[-]?\d{1,12}(\.\d{2,6})$/)
})
.required()
const ScontoMaggiorazioneSchema = Joi.alternatives().try(
Joi.array().items(ScontoMaggiorazioneItemSchema),
ScontoMaggiorazioneItemSchema
)
const ImportoTotaleDocumentoSchema = Joi.string().regex(
/^[-]?\d{1,12}(\.\d{2,6})$/
)
const ArrotondamentoSchema = Joi.string().regex(/^[-]?\d{1,12}(\.\d{2,6})$/)
const CausaleItemSchema = Joi.string()
.min(1)
.max(200)
const CausaleSchema = Joi.alternatives().try(
Joi.array().items(CausaleItemSchema),
CausaleItemSchema
)
const Art73Schema = Joi.valid('SI')
const DatiGeneraliDocumentoSchema = Joi.object().keys({
TipoDocumento: Joi.valid(TipiDocumentiValidi).required(), // 2.1.1.1
Divisa: Joi.string()
.currency()
.required(), // 2.1.1.2
Data: Joi.string()
.isoDate()
.raw()
.required(), // 2.1.1.3
Numero: Joi.string()
.max(20)
.required(), // 2.1.1.4
DatiRitenuta: DatiRitenutaSchema, // 2.1.1.5
DatiBollo: DatiBolloSchema, // 2.1.1.6
DatiCassaPrevidenziale: DatiCassaPrevidenzialeSchema, // 2.1.1.7
ScontoMaggiorazione: ScontoMaggiorazioneSchema, // 2.1.1.8
ImportoTotaleDocumento: ImportoTotaleDocumentoSchema, // 2.1.1.9
Arrotondamento: ArrotondamentoSchema, // 2.1.1.10
Causale: CausaleSchema, // 2.1.1.11
Art73: Art73Schema // 2.1.1.12
})
const RiferimentoNumeroLineaSchema = Joi.alternatives().try(
Joi.array().items(
Joi.number()
.min(1)
.max(9999)
),
Joi.number()
.min(1)
.max(9999)
)
const DatiOrdineAcquistoItemSchema = Joi.object()
.keys({
RiferimentoNumeroLinea: RiferimentoNumeroLineaSchema, // 2.1.2.1
IdDocumento: Joi.string()
.min(1)
.max(20)
.required(), // 2.1.2.2
Data: Joi.string()
.isoDate()
.raw(), // 2.1.2.3
NumItem: Joi.string()
.min(1)
.max(20), // 2.1.2.4
CodiceCommessaConvenzione: Joi.string()
.min(1)
.max(100), // 2.1.2.5
CodiceCUP: Joi.string()
.min(1)
.max(15), // 2.1.2.6
CodiceCIG: Joi.string()
.min(1)
.max(15) // 2.1.2.7
})
.required()
const DatiOrdineAcquistoSchema = Joi.alternatives().try(
Joi.array().items(DatiOrdineAcquistoItemSchema),
DatiOrdineAcquistoItemSchema
)
const DatiSALItemSchema = Joi.object()
.keys({
RiferimentoFase: Joi.number()
.min(1)
.max(999)
.required() // 2.1.7.1
})
.required()
const DatiSALSchema = Joi.alternatives().try(
Joi.array().items(DatiSALItemSchema),
DatiSALItemSchema
)
const DatiDDTItemSchema = Joi.object()
.keys({
NumeroDDT: Joi.string()
.min(1)
.max(20)
.required(), // 2.1.8.1
DataDDT: Joi.string()
.isoDate()
.raw()
.required(), // 2.1.8.2
RiferimentoNumeroLinea: RiferimentoNumeroLineaSchema // 2.1.8.3
})
.required()
const DatiDDTSchema = Joi.alternatives().try(
Joi.array().items(DatiDDTItemSchema),
DatiDDTItemSchema
)
const DatiAnagraficiVettoreSchema = Joi.object().keys({
IdFiscaleIVA: IdFiscaleIVASchema.required(), // 2.1.9.1.1
CodiceFiscale: CodiceFiscaleSchema, // 2.1.9.1.2
Anagrafica: Joi.object()
.keys({
Denominazione: Joi.string()
.alphanum()
.min(1)
.max(80),
Nome: Joi.string()
.alphanum()
.min(1)
.max(60),
Cognome: Joi.string()
.alphanum()
.min(1)
.max(60),
Titolo: Joi.string()
.min(2)
.max(10),
CodEORI: Joi.string()
.min(13)
.max(17)
})
.required(), // 2.1.9.1.3
NumeroLicenzaGuida: Joi.string()
.min(1)
.max(20) // 2.1.9.1.4
})
const IndirizzoResaSchema = Joi.object().keys({
Indirizzo: Joi.string()
.alphanum()
.min(1)
.max(60)
.required(),
NumeroCivico: Joi.string()
.alphanum()
.min(1)
.max(8),
CAP: Joi.string()
.regex(/^\d{5}$/)
.required(),
Comune: Joi.string()
.min(1)
.max(60)
.required(),
Provincia: Joi.string()
.uppercase()
.length(2),
Nazione: Joi.string()
.uppercase()
.length(2)
.required()
})
const DatiTrasportoSchema = Joi.object().keys({
DatiAnagraficiVettore: DatiAnagraficiVettoreSchema, // 2.1.9.1
MezzoTrasporto: Joi.string()
.min(1)
.max(80), // 2.1.9.2
CausaleTrasporto: Joi.string()
.min(1)
.max(100), // 2.1.9.3
NumeroColli: Joi.number()
.integer()
.min(1)
.max(9999), // 2.1.9.4
Descrizione: Joi.string()
.min(1)
.max(100), // 2.1.9.5
UnitaMisuraPeso: Joi.string()
.min(1)
.max(10), // 2.1.9.6
PesoLordo: Joi.string().regex(/^\d{1,4}(\.\d{2,2})$/), // 2.1.9.7
PesoNetto: Joi.string().regex(/^\d{1,4}(\.\d{2,2})$/), // 2.1.9.8
DataOraRitiro: Joi.string()
.isoDate()
.raw(), // 2.1.9.9
DataInizioTrasporto: Joi.string()
.isoDate()
.raw(), // 2.1.9.10
TipoResa: Joi.string().length(3), // 2.1.9.11
IndirizzoResa: IndirizzoResaSchema, // 2.1.9.12
DataOraConsegna: Joi.string()
.isoDate()
.raw() // 2.1.9.13
})
const FatturaPrincipaleSchema = Joi.object().keys({
NumeroFatturaPrincipale: Joi.string()
.min(1)
.max(20)
.required(), // 2.1.10.1
DataFatturaPrincipale: Joi.string()
.isoDate()
.raw() // 2.1.10.2
})
const DatiGeneraliSchema = Joi.object()
.keys({
DatiGeneraliDocumento: DatiGeneraliDocumentoSchema.required(), // 2.1.1
DatiOrdineAcquisto: DatiOrdineAcquistoSchema, // 2.1.2
DatiContratto: DatiOrdineAcquistoSchema, // 2.1.3
DatiConvenzione: DatiOrdineAcquistoSchema, // 2.1.4
DatiRicezione: DatiOrdineAcquistoSchema, // 2.1.5
DatiFattureCollegate: DatiOrdineAcquistoSchema, // 2.1.6
DatiSAL: DatiSALSchema, // 2.1.7
DatiDDT: DatiDDTSchema, // 2.1.8
DatiTrasporto: DatiTrasportoSchema, // 2.1.9
FatturaPrincipale: FatturaPrincipaleSchema // 2.1.10
})
.required()
const CodiceArticoloItemSchema = Joi.object().keys({
CodiceTipo: Joi.string()
.min(1)
.max(35)
.required(), // 2.2.1.3.1
CodiceValore: Joi.string()
.min(1)
.max(35)
.required() // 2.2.1.3.2
})
const CodiceArticoloSchema = Joi.alternatives().try(
Joi.array().items(CodiceArticoloItemSchema),
CodiceArticoloItemSchema
)
const AltriDatiGestionaliItemSchema = Joi.object().keys({
TipoDato: Joi.string()
.min(1)
.max(10)
.required(), // 2.2.1.16.1
RiferimentoTesto: Joi.string()
.min(1)
.max(60), // 2.2.1.16.2
RiferimentoNumero: Joi.string().regex(/^\d{1,18}(\.\d{2,2})$/), // 2.2.1.16.3
RiferimentoData: Joi.string()
.isoDate()
.raw() // 2.2.1.16.4
})
const AltriDatiGestionaliSchema = Joi.alternatives().try(
Joi.array().items(AltriDatiGestionaliItemSchema),
AltriDatiGestionaliItemSchema
)
const DettaglioLineeItemSchema = Joi.object()
.keys({
NumeroLinea: Joi.number()
.min(0)
.max(9999)
.required(), // 2.2.1.1
TipoCessionePrestazione: Joi.valid('SC', 'PR', 'AB', 'AC'), // 2.2.1.2
CodiceArticolo: CodiceArticoloSchema, // 2.2.1.3
Descrizione: Joi.string()
.min(1)
.max(1000)
.required(), // 2.2.1.4
Quantita: Joi.string().regex(/^\d{1,13}(\.\d{2,6})$/), // 2.2.1.5
UnitaMisura: Joi.string()
.min(1)
.max(10), // 2.2.1.6
DataInizioPeriodo: Joi.string()
.isoDate()
.raw(), // 2.2.1.7
DataFinePeriodo: Joi.string()
.isoDate()
.raw(), // 2.2.1.8
PrezzoUnitario: PrezzoSchema.required(), // 2.2.1.9
ScontoMaggiorazione: ScontoMaggiorazioneSchema, // 2.2.1.10
PrezzoTotale: PrezzoSchema.required(), // 2.2.1.11
AliquotaIVA: AliquotaIVASchema.required(), // 2.2.1.12
Ritenuta: Joi.valid('SI'), // 2.2.1.13
Natura: Joi.valid(NaturaValidi), // 2.2.1.14
RiferimentoAmministrazione: Joi.string()
.min(1)
.max(20), // 2.2.1.15
AltriDatiGestionali: AltriDatiGestionaliSchema // 2.2.1.16
})
.required()
const DettaglioLineeSchema = Joi.alternatives().try(
Joi.array().items(DettaglioLineeItemSchema),
DettaglioLineeItemSchema
)
const DatiRiepilogoItemSchema = Joi.object().keys({
AliquotaIVA: AliquotaIVASchema.required(), // 2.2.2.1
Natura: Joi.valid(NaturaValidi), // 2.2.2.2
SpeseAccessorie: Joi.string().regex(/^[-]?\d{1,12}(\.\d{2,6})$/), // 2.2.2.3
Arrotondamento: Joi.string().regex(/^[-]?\d{1,13}(\.\d{2,6})$/), // 2.2.2.4
ImponibileImporto: PrezzoSchema.required(), // 2.2.2.5
Imposta: PrezzoSchema.required(), // 2.2.2.6
EsigibilitaIVA: Joi.valid('I', 'D', 'S'), // 2.2.2.7
RiferimentoNormativo: Joi.string()
.min(1)
.max(100) // 2.2.2.8
})
const DatiRiepilogoSchema = Joi.alternatives().try(
Joi.array().items(DatiRiepilogoItemSchema),
DatiRiepilogoItemSchema
)
const DatiBeniServiziSchema = Joi.object().keys({
DettaglioLinee: DettaglioLineeSchema.required(), // 2.2.1
DatiRiepilogo: DatiRiepilogoSchema.required() // 2.2.2
})
const DatiVeicoliSchema = Joi.object().keys({
Data: Joi.string()
.isoDate()
.raw()
.required(), // 2.3.1
TotalePercorso: Joi.string()
.min(1)
.max(15)
.required() // 2.3.2
})
const DettaglioPagamentoItemSchema = Joi.object()
.keys({
Beneficiario: Joi.string()
.min(1)
.max(200), // 2.4.2.1
ModalitaPagamento: Joi.valid(ModalitaPagamentoValidi).required(), // 2.4.2.2
DataRiferimentoTerminiPagamento: Joi.string()
.isoDate()
.raw(), // 2.4.2.3
GiorniTerminiPagamento: Joi.number()
.integer()
.min(0)
.max(999), // 2.4.2.4 // 2.4.2.4
DataScadenzaPagamento: Joi.string()
.isoDate()
.raw(), // 2.4.2.5
ImportoPagamento: Joi.string()
.regex(/^[-]?\d{1,12}(\.\d{2,6})$/)
.required(), // 2.4.2.6
CodUfficioPostale: Joi.string()
.min(1)
.max(20), // 2.4.2.7
CognomeQuietanzante: Joi.string()
.min(1)
.max(60), // 2.4.2.8
NomeQuietanzante: Joi.string()
.min(1)
.max(60), // 2.4.2.9
CFQuietanzante: Joi.string().length(16), // 2.4.2.10
TitoloQuietanzante: Joi.string()
.min(2)
.max(10), // 2.4.2.11
IstitutoFinanziario: Joi.string()
.min(1)
.max(80), // 2.4.2.12
IBAN: Joi.string()
.min(15)
.max(34), // 2.4.2.13
ABI: Joi.string().length(5), // 2.4.2.14
CAB: Joi.string().length(5), // 2.4.2.15
BIC: Joi.string()
.min(8)
.max(11), // 2.4.2.16
ScontoPagamentoAnticipato: Joi.string().regex(/^[-]?\d{1,12}(\.\d{2,6})$/), // 2.4.2.17
DataLimitePagamentoAnticipato: Joi.string()
.isoDate()
.raw(), // 2.4.2.18
PenalitaPagamentiRitardati: Joi.string().regex(/^[-]?\d{1,12}(\.\d{2,6})$/), // 2.4.2.19
DataDecorrenzaPenale: Joi.string()
.isoDate()
.raw(), // 2.4.2.20
CodicePagamento: Joi.string()
.min(1)
.max(60) // 2.4.2.21
})
.required()
const DettaglioPagamentoSchema = Joi.alternatives().try(
Joi.array().items(DettaglioPagamentoItemSchema),
DettaglioPagamentoItemSchema
)
const DatiPagamentoItemSchema = Joi.object()
.keys({
CondizioniPagamento: Joi.valid('TP01', 'TP02', 'TP03').required(), // 2.4.1
DettaglioPagamento: DettaglioPagamentoSchema.required() // 2.4.2
})
.required()
const DatiPagamentoSchema = Joi.alternatives().try(
Joi.array().items(DatiPagamentoItemSchema),
DatiPagamentoItemSchema
)
const AllegatiItemSchema = Joi.object()
.keys({
NomeAttachment: Joi.string()
.min(1)
.max(60)
.required(), // 2.5.1
AlgoritmoCompressione: Joi.string()
.min(1)
.max(10), // 2.5.2
FormatoAttachment: Joi.string()
.min(1)
.max(10), // 2.5.3
DescrizioneAttachment: Joi.string()
.min(1)
.max(100), // 2.5.4
Attachment: Joi.string().required() // 2.5.5
})
.required()
const AllegatiSchema = Joi.alternatives().try(
Joi.array().items(AllegatiItemSchema),
AllegatiItemSchema
)
const FatturaElettronicaBodyItemSchema = Joi.object()
.keys({
DatiGenerali: DatiGeneraliSchema, // 2.1
DatiBeniServizi: DatiBeniServiziSchema.required(), // 2.2
DatiVeicoli: DatiVeicoliSchema, // 2.3
DatiPagamento: DatiPagamentoSchema, // 2.4
Allegati: AllegatiSchema // 2.5
})
.required()
const FatturaElettronicaBodySchema = Joi.alternatives().try(
Joi.array().items(FatturaElettronicaBodyItemSchema),
FatturaElettronicaBodyItemSchema
)
module.exports = FatturaElettronicaBodySchema.required()