@palmabit/json2fatturapaxml
Version:
Crea una fattura elettronica partendo da un JSON
364 lines (346 loc) • 8.94 kB
JavaScript
'use strict'
const BaseJoi = require('joi')
const JoiCountryExtension = require('joi-country-extension')
const Joi = BaseJoi.extend(JoiCountryExtension)
const RegimiFiscaliValidi = [
'RF01',
'RF02',
'RF04',
'RF05',
'RF06',
'RF07',
'RF08',
'RF09',
'RF10',
'RF11',
'RF12',
'RF13',
'RF14',
'RF15',
'RF16',
'RF17',
'RF18',
'RF19',
'RF20',
]
const IdPaeseSchema = Joi.string().country()
const IdCodiceSchema = Joi.string()
.alphanum()
.min(2)
.max(28)
const EmailSchema = Joi.string()
.email()
.min(2)
.max(256)
const RiferimentoAmministrazioneSchema = Joi.string()
.min(1)
.max(20)
const IdFiscaleIVASchema = Joi.object().keys({
IdPaese: IdPaeseSchema.required(),
IdCodice: IdCodiceSchema.required()
})
const CodiceFiscaleSchema = Joi.string()
.alphanum()
.min(11)
.max(16)
const IndirizzoSchema = Joi.string()
.min(1)
.max(60)
const NumeroCivicoSchema = Joi.string()
.min(1)
.max(8)
const ContattiTrasmittenteSchema = Joi.object().keys({
Telefono: Joi.string()
.min(5)
.max(12), // 1.1.5.1
Email: EmailSchema // 1.1.5.2
})
const DatiTrasmissioneSchema = Joi.object()
.keys({
IdTrasmittente: Joi.object()
.keys({
IdPaese: IdPaeseSchema.required(),
IdCodice: Joi.string()
.alphanum()
.required()
.min(2)
.max(28)
})
.required(),
ProgressivoInvio: Joi.string()
.alphanum()
.required()
.min(1)
.max(10),
FormatoTrasmissione: Joi.valid('FPA12', 'FPR12').required(),
CodiceDestinatario: Joi.alternatives()
.when('FormatoTrasmissione', {
is: 'FPA12',
then: Joi.string()
.alphanum()
.length(6),
otherwise: Joi.string()
.alphanum()
.length(7)
})
.required(),
ContattiTrasmittente: ContattiTrasmittenteSchema, // 1.1.5
PECDestinatario: Joi.alternatives().when('CodiceDestinatario', {
// FIXME
is: '0000000',
then: EmailSchema.required(),
otherwise: Joi.forbidden()
})
})
.required()
const DatiAnagraficiCedentePrestatoreSchema = Joi.object()
.keys({
IdFiscaleIVA: IdFiscaleIVASchema.required(), // 1.2.1.1
CodiceFiscale: CodiceFiscaleSchema, // 1.2.1.2
Anagrafica: Joi.object()
.keys({
Denominazione: Joi.string()
.min(1)
.max(80), // 1.2.1.3.1
Nome: Joi.string()
.min(1)
.max(60), // 1.2.1.3.2
Cognome: Joi.string()
.min(1)
.max(60), // 1.2.1.3.3
Titolo: Joi.string()
.min(2)
.max(10), // 1.2.1.3.4
CodEORI: Joi.string()
.min(13)
.max(17) // 1.2.1.3.5
})
.required(),
AlboProfessionale: Joi.string()
.min(1)
.max(60), // 1.2.1.4
ProvinciaAlbo: Joi.string().length(2), // 1.2.1.5
NumeroIscrizioneAlbo: Joi.string()
.min(1)
.max(60), // 1.2.1.6
DataIscrizioneAlbo: Joi.string()
.isoDate()
.raw()
.notes('YYYY-MM-DD'), // 1.2.1.7
RegimeFiscale: Joi.valid(RegimiFiscaliValidi).required() // 1.2.1.8
})
.required()
const SedeCedentePrestatoreSchema = Joi.object()
.keys({
Indirizzo: IndirizzoSchema.required(),
NumeroCivico: Joi.string()
.min(1)
.max(8),
CAP: Joi.string()
.regex(/^\d{5}$/)
.required(),
Comune: Joi.string()
.min(1)
.max(60)
.required(),
Nazione: Joi.string()
.uppercase()
.length(2)
.required(),
Provincia: Joi.string().when('Nazione', {
is: 'IT',
then: Joi.string()
.uppercase()
.length(2)
.optional()
.allow(''),
otherwise: Joi.string()
.uppercase()
.length(2)
.optional()
.allow('')
})
})
.required()
const StabileOrganizzazioneSchema = Joi.object().keys({
Indirizzo: IndirizzoSchema.required(), // 1.2.3.1
NumeroCivico: NumeroCivicoSchema, // 1.2.3.2
CAP: Joi.string()
.regex(/^\d{5}$/)
.required(), // 1.2.3.3
Comune: Joi.string()
.min(1)
.max(60)
.required(), // 1.2.3.4
Provincia: Joi.string()
.uppercase()
.length(2), // 1.2.3.5
Nazione: Joi.string()
.uppercase()
.length(2)
.required() // 1.2.3.6
})
const IscrizioneREASchema = Joi.object().keys({
Ufficio: Joi.string()
.uppercase()
.length(2)
.required(), // 1.2.4.1
NumeroREA: Joi.string()
.alphanum()
.min(1)
.max(20)
.required(), // 1.2.4.2
CapitaleSociale: Joi.number()
.precision(2)
.positive(), // 1.2.4.3
SocioUnico: Joi.valid('SU', 'SM'), // 1.2.4.4
StatoLiquidazione: Joi.valid('LS', 'LN').required() // 1.2.4.5
})
const ContattiCedentePrestatoreSchema = Joi.object().keys({
Telefono: Joi.string()
.min(5)
.max(12), // 1.2.5.1
Fax: Joi.string()
.min(5)
.max(12), // 1.2.5.2
Email: EmailSchema // 1.2.5.3
})
const CedentePrestatoreSchema = Joi.object()
.keys({
DatiAnagrafici: DatiAnagraficiCedentePrestatoreSchema, // 1.2.1
Sede: SedeCedentePrestatoreSchema, // 1.2.2
StabileOrganizzazione: StabileOrganizzazioneSchema, // 1.2.3
IscrizioneREA: IscrizioneREASchema, // 1.2.4
Contatti: ContattiCedentePrestatoreSchema, // 1.2.5
RiferimentoAmministrazione: RiferimentoAmministrazioneSchema // 1.2.6
})
.required()
const RappresentanteFiscaleSchema = Joi.object().keys({
DatiAnagrafici: Joi.object()
.keys({
IdFiscaleIVA: IdFiscaleIVASchema.required(), // 1.3.1.1
CodiceFiscale: CodiceFiscaleSchema, // 1.3.1.2
Anagrafica: Joi.object()
.keys({
Denominazione: Joi.string()
.min(1)
.max(80),
Nome: Joi.string()
.min(1)
.max(60),
Cognome: Joi.string()
.min(1)
.max(60),
Titolo: Joi.string()
.min(2)
.max(10),
CodEORI: Joi.string()
.min(13)
.max(17)
})
.required()
})
.required() // 1.3.1
})
const CessionarioCommittenteSchema = Joi.object()
.keys({
DatiAnagrafici: Joi.object()
.keys({
IdFiscaleIVA: IdFiscaleIVASchema,
CodiceFiscale: CodiceFiscaleSchema,
Anagrafica: Joi.object()
.keys({
Denominazione: Joi.string()
.min(1)
.max(80),
Nome: Joi.string()
.min(1)
.max(60),
Cognome: Joi.string()
.min(1)
.max(60),
Titolo: Joi.string()
.min(2)
.max(10),
CodEORI: Joi.string()
.min(13)
.max(17)
})
.required()
})
.or('IdFiscaleIVA', 'CodiceFiscale')
.required(),
Sede: Joi.object()
.keys({
Indirizzo: IndirizzoSchema.required(),
NumeroCivico: NumeroCivicoSchema,
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()
})
.required(),
StabileOrganizzazione: StabileOrganizzazioneSchema, // 1.4.3
RappresentanteFiscale: Joi.object().keys({
IdFiscaleIVA: IdFiscaleIVASchema.required(),
Denominazione: Joi.string()
.min(1)
.max(80),
Nome: Joi.string()
.min(1)
.max(60),
Cognome: Joi.string()
.min(1)
.max(60)
})
})
.required()
const TerzoIntermediarioOSoggettoEmittenteSchema = Joi.object().keys({
DatiAnagrafici: Joi.object()
.keys({
IdFiscaleIVA: IdFiscaleIVASchema,
CodiceFiscale: CodiceFiscaleSchema,
Anagrafica: Joi.object()
.keys({
Denominazione: Joi.string()
.min(1)
.max(80),
Nome: Joi.string()
.min(1)
.max(60),
Cognome: Joi.string()
.min(1)
.max(60),
Titolo: Joi.string()
.min(2)
.max(10),
CodEORI: Joi.string()
.min(13)
.max(17)
})
.required()
})
.required()
})
const SoggettoEmittenteSchema = Joi.valid('CC', 'TZ')
const FatturaElettronicaHeaderSchema = Joi.object()
.keys({
DatiTrasmissione: DatiTrasmissioneSchema, // 1.1
CedentePrestatore: CedentePrestatoreSchema, // 1.2
RappresentanteFiscale: RappresentanteFiscaleSchema, // 1.3
CessionarioCommittente: CessionarioCommittenteSchema, // 1.4
TerzoIntermediarioOSoggettoEmittente: TerzoIntermediarioOSoggettoEmittenteSchema, // 1.5
SoggettoEmittente: SoggettoEmittenteSchema // 1.6
})
.required()
module.exports = FatturaElettronicaHeaderSchema