Código:
//creamos la factura paso a paso.
RegFactuSistemaFacturacion facAPresentar = new RegFactuSistemaFacturacion();
//rellenamos la cabecera
ServicioVerifactu.Cabecera cabecera = new ServicioVerifactu.Cabecera();
//creamos obligado presentador y se lo asignamos.
ServicioVerifactu.PersonaFisicaJuridicaESType yo = new ServicioVerifactu.PersonaFisicaJuridicaESType();
yo.NIF = Program.configTaller.Nif;
yo.NombreRazon = Program.configTaller.NombreTaller;
//se lo asignamos a la cabecera
cabecera.ObligadoEmision = yo;
//Creamos especificacion de remision voluntaria y la asignamos a la cabecera
ServicioVerifactu.CabeceraRemisionVoluntaria voluntaria = new ServicioVerifactu.CabeceraRemisionVoluntaria();
voluntaria.Incidencia = ServicioVerifactu.IncidenciaType.N;
voluntaria.FechaFinVeriFactu = "";
voluntaria.IncidenciaSpecified = true;
//voluntaria.IncidenciaSpecified = false;
cabecera.RemisionVoluntaria = voluntaria;
// Asignamos la cabecera a la factura.
facAPresentar.Cabecera = cabecera;
//creamos el registro de factura podrian ser varios, pero solo asignaremos uno.
ServicioVerifactu.RegistroFacturaType[] registroFactura = new ServicioVerifactu.RegistroFacturaType[1];
//Como vamos a dar de alta la factura , creamos el registro de alta
ServicioVerifactu.RegistroFacturacionAltaType altaFactura = new ServicioVerifactu.RegistroFacturacionAltaType();
//Asignamos el ID version
altaFactura.IDVersion = ServicioVerifactu.VersionType.Item10;//de momento la unica accesible
//Identificamos la factura y lo asignamos a el Alta
ServicioVerifactu.IDFacturaExpedidaType iDFactura = new ServicioVerifactu.IDFacturaExpedidaType();
iDFactura.FechaExpedicionFactura = fechaFactura.Text;//Fecha de presentacion de la factura.
iDFactura.IDEmisorFactura = Program.configTaller.Nif;//NIF del obligado emisor
iDFactura.NumSerieFactura = numFactura;//numeo de factura y serie
altaFactura.IDFactura = iDFactura;
Program.facturaSeleccionada.Fecha = fechaFactura.Text;
//asignamos nombre expedidor
altaFactura.NombreRazonEmisor = Program.configTaller.NombreTaller;
//Es por subsanacion ?
altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.N;
// Se havia rechazado ?
altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.N;
if(alta == "RECHAZO")
{
//Es por subsanacion ?
altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.S;
// Se havia rechazado ?
altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.X;
}
if (alta == "SUBSANACION")
{
//Es por subsanacion ?
altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.S;
// Se havia rechazado ?
altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.N;
}
if (alta == "RECHAZO_SUBSANACION")
{
//Es por subsanacion ?
altaFactura.Subsanacion = ServicioVerifactu.SubsanacionType.S;
// Se havia rechazado ?
altaFactura.RechazoPrevio = ServicioVerifactu.RechazoPrevioType.S;
}
//Que tipo de factura estamos creando?
altaFactura.TipoFactura = ServicioVerifactu.ClaveTipoFacturaType.F1;
/*
//Si es rectificativa lo indicamos y cumplimentamos los datos requeridos ya sea rectificada o sustituida son el mismo diseño
altaFactura.TipoRectificativa = ServicioVerifactu.ClaveTipoRectificativaType.I;
Program.FacturaSeleccionada.Tipo=
//aqui consignariamos los datos de las facturas para sutitucion y demas.
int numeroFaR = 1;
ServicioVerifactu.IDFacturaARType[] listFacturasRectificadas = new ServicioVerifactu.IDFacturaARType[numeroFaR];// creamos lista de facturas rectificadas.
ServicioVerifactu.IDFacturaARType facSust = new ServicioVerifactu.IDFacturaARType();//rellenamos la primera
facSust.FechaExpedicionFactura = "FECHA"; //Fecha de emision factura sustituida
facSust.IDEmisorFactura = Program.configTaller.Nif;//Nif expedidor.
facSust.NumSerieFactura = "Num Serie"; //Numero de serie factura sustituida
listFacturasRectificadas[1] = facSust; //le asignamos una por una las facturas rectificadas
altaFactura.FacturasSustituidas = listFacturasRectificadas; //Asignamos al mandato
//creamos desglose de la rectificacion con los totales a rectificar
ServicioVerifactu.DesgloseRectificacionType desgloseRectificacion = new ServicioVerifactu.DesgloseRectificacionType();
desgloseRectificacion.BaseRectificada = ""; // Cuota base a rectificar
desgloseRectificacion.CuotaRecargoRectificado = "";// Hay recargo equivalencia ??
desgloseRectificacion.CuotaRectificada = ""; //Cuota iva rectificada;
altaFactura.ImporteRectificacion = desgloseRectificacion; // asignamos importe de la rectificacion
*/
//Asignamos la fecha en que se izo la operacion si no es en la misma que se expide la factura, en este caso si es la misma, si fuera de reparacion puede variar
altaFactura.FechaOperacion = fechaFactura.Text.Replace("/", "-");
//Asignamos motivo descripcion de la operacion , en este caso venta de materiales;
altaFactura.DescripcionOperacion = "Venta de materiales servidos.";// en caso de reparacion de vehiculo asignar aqui la reparacion.
//Es factura simplificada s/n
altaFactura.FacturaSimplificadaArt7273 = ServicioVerifactu.SimplificadaCualificadaType.N;
//Es factura sin identificar destinatario? s/n
altaFactura.FacturaSinIdentifDestinatarioArt61d = ServicioVerifactu.CompletaSinDestinatarioType.N;
//por tercero ??
//altaFactura.EmitidaPorTerceroODestinatario = ServicioVerifactu.TercerosODestinatarioType.T;
/*
// aqui se consignaria todo lo de terceros.
ServicioVerifactu.PersonaFisicaJuridicaType Tercero = new ServicioVerifactu.PersonaFisicaJuridicaType();
Tercero.NombreRazon = "";
ServicioVerifactu.IDOtroType idTercero = new ServicioVerifactu.IDOtroType();
idTercero.CodigoPais = ServicioVerifactu.CountryType2.ES;
idTercero.ID = "nif"; //identificador
idTercero.IDType = ServicioVerifactu.PersonaFisicaJuridicaIDTypeType.Item02;
Tercero.Item = idTercero;
altaFactura.Tercero = Tercero;
*/
int numDestinatarios = 1;
ServicioVerifactu.PersonaFisicaJuridicaType[] destinatarios = new ServicioVerifactu.PersonaFisicaJuridicaType[numDestinatarios];//lista de destinatarios, para mi siempre 1
//primer destinatario
ServicioVerifactu.PersonaFisicaJuridicaType destinatario = new ServicioVerifactu.PersonaFisicaJuridicaType(); //creamos nuevo destinatario
if (cmbPais.Text != "ESPAÑA" || _documento.Text != "NIF-IVA")
{
ServicioVerifactu.IDOtroType idOtro = new ServicioVerifactu.IDOtroType();
destinatario.NombreRazon = nom.Text + " " + Apellido1.Text + " " + Apellido2.Text;
idOtro.CodigoPais = ServicioVerifactu.CountryType2.ES;// hallar el pais
idOtro.ID = Dni.Text;
idOtro.IDType = tipoPersona(_documento.SelectedIndex);
destinatario.Item = idOtro;
}
else
{
//ServicioVerifactu.PersonaFisicaJuridicaESType cliente = new ServicioVerifactu.PersonaFisicaJuridicaESType();
destinatario.NombreRazon = nom.Text + " " + Apellido1.Text + " " + Apellido2.Text;
//cliente.NIF = Dni.Text;
//cliente.NombreRazon = nom.Text + " " + Apellido1.Text + " " + Apellido2.Text;
destinatario.Item = Dni.Text; //cliente;
}
destinatarios[0] = destinatario;
//se los asignamos a la factura
altaFactura.Destinatarios = destinatarios;
// ahora creamos el desglose uno por tipo de iva
ServicioVerifactu.DetalleType[] desgloses = new ServicioVerifactu.DetalleType[numeroIvas];
//iva 21%
if (asignado21)
{
ServicioVerifactu.DetalleType tipo21 = new ServicioVerifactu.DetalleType();
tipo21.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
tipo21.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
tipo21.ClaveRegimenSpecified = true;
tipo21.Item = ServicioVerifactu.CalificacionOperacionType.S1;//no esta exenta ni es por inversion del sujeto pasivo...
tipo21.TipoImpositivo = "21.00";
tipo21.BaseImponibleOimporteNoSujeto = (base21 + totalPortes).ToString("F2").Replace(",", ".");// impon21.Text.Replace(",", ".").Replace(" €", "");
bases = bases + base21 + totalPortes;// float.Parse(impon21.Text.Replace(" €",""));
tipo21.CuotaRepercutida = float.Parse(cuota21.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// cuota21.Text.Replace(",", ".").Replace(" €", "");
cuotas = cuotas + float.Parse(cuota21.Text.Replace(" €", ""));
desgloses[numDetalle] = tipo21;
numDetalle++;
}
//iva10%
if (asignado10)
{
ServicioVerifactu.DetalleType tipo10 = new ServicioVerifactu.DetalleType();
tipo10.ClaveRegimenSpecified = true;
tipo10.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
tipo10.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
tipo10.Item = ServicioVerifactu.CalificacionOperacionType.S1;//no esta exenta ni es por inversion del sujeto pasivo...
tipo10.TipoImpositivo = "10.00";
tipo10.BaseImponibleOimporteNoSujeto = float.Parse(impon10.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// impon10.Text.Replace(",", ".").Replace(" €", "");
bases = bases + float.Parse(impon10.Text.Replace(" €", ""));
tipo10.CuotaRepercutida = float.Parse(cuota10.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// cuota10.Text.Replace(",", ".").Replace(" €", "");
cuotas = cuotas + float.Parse(cuota10.Text.Replace(" €", ""));
desgloses[numDetalle] = tipo10;
numDetalle++;
}
//Iva4%
if (asignado4)
{
ServicioVerifactu.DetalleType tipo04 = new ServicioVerifactu.DetalleType();
tipo04.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
tipo04.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
tipo04.ClaveRegimenSpecified = true;
tipo04.Item = ServicioVerifactu.CalificacionOperacionType.S1;//no esta exenta ni es por inversion del sujeto pasivo...
tipo04.TipoImpositivo = "04.00";
tipo04.BaseImponibleOimporteNoSujeto = float.Parse(impon4.Text.Replace(" €", "")).ToString("F2").Replace(",", "."); //impon4.Text.Replace(",", ".").Replace(" €", "");
bases = bases + float.Parse(impon4.Text.Replace(" €", ""));
tipo04.CuotaRepercutida = float.Parse(cuota10.Text.Replace(" €", "")).ToString("F2").Replace(",", "."); // cuota4.Text.Replace(",", ".").Replace(" €", "");
cuotas = cuotas + float.Parse(cuota4.Text.Replace(" €", ""));
desgloses[numDetalle] = tipo04;
numDetalle++;
}
//sin iva
if (asignado0)
{
ServicioVerifactu.DetalleType tipo0 = new ServicioVerifactu.DetalleType();
tipo0.Impuesto = ServicioVerifactu.ImpuestoType.Item01;
tipo0.ClaveRegimen = ServicioVerifactu.IdOperacionesTrascendenciaTributariaType.Item01;//Operaciones regimen general
tipo0.ClaveRegimenSpecified = true;
tipo0.Item = ServicioVerifactu.CalificacionOperacionType.N1;//si esta exenta
tipo0.TipoImpositivo = "0.00";
tipo0.BaseImponibleOimporteNoSujeto = float.Parse(impon0.Text.Replace(" €", "")).ToString("F2").Replace(",", ".");// impon0.Text.Replace(",", ".").Replace(" €", "");
bases = bases + float.Parse(impon0.Text.Replace(" €", ""));
//tipo0.CuotaRepercutida = cuota0.Text;
desgloses[numDetalle] = tipo0;
numDetalle++;
}
// se lo asignamos a la factura
altaFactura.Desglose = desgloses;
//asignamos total impuestos
altaFactura.CuotaTotal = cuotas.ToString("F2").Replace(",", ".");
total = cuotas + bases;
//asignamos total factura;
altaFactura.ImporteTotal = total.ToString("F2").Replace(",", ".");
//creamos el encadenamiento
ServicioVerifactu.RegistroFacturacionAltaTypeEncadenamiento cadenaFactura = new ServicioVerifactu.RegistroFacturacionAltaTypeEncadenamiento();
Huella huella = new Huella();
HuellaVerifactu huellaAnterior = new HuellaVerifactu();
string _huella = "";
if (huella.numeroHash() > 0)
{
ServicioVerifactu.EncadenamientoFacturaAnteriorType anterior = new ServicioVerifactu.EncadenamientoFacturaAnteriorType();
huellaAnterior = huella.huellaAnterior();
anterior.FechaExpedicionFactura = huellaAnterior.FechaFactura;
anterior.IDEmisorFactura = huellaAnterior.IdEmisor;
anterior.NumSerieFactura = huellaAnterior.NumFactura;
anterior.Huella = huellaAnterior.Huella;
_huella = huellaAnterior.Huella;
cadenaFactura.Item = anterior;
}
else
{
cadenaFactura.Item = ServicioVerifactu.PrimerRegistroCadenaType.S;
}
altaFactura.Encadenamiento = cadenaFactura;
//ahora identificamos el software
ServicioVerifactu.SistemaInformaticoType programaFacturacion = new ServicioVerifactu.SistemaInformaticoType();
programaFacturacion.NombreSistemaInformatico = "Facturas Taller 2024";//nombre programa
programaFacturacion.NombreRazon = " ";
programaFacturacion.Item = " ";
programaFacturacion.Version = Program.version;
programaFacturacion.IdSistemaInformatico = "A1";
programaFacturacion.NumeroInstalacion = Program.numeroInstalacion;//numero de instalacion
programaFacturacion.TipoUsoPosibleSoloVerifactu = ServicioVerifactu.SiNoType.S;//es verifactu
programaFacturacion.TipoUsoPosibleMultiOT = ServicioVerifactu.SiNoType.N;//varias empresas a la vez
programaFacturacion.IndicadorMultiplesOT = ServicioVerifactu.SiNoType.N;
//ServicioVerifactu.PersonaFisicaJuridicaType[] Destinatarios = new ServicioVerifactu.PersonaFisicaJuridicaType[1];
altaFactura.SistemaInformatico = programaFacturacion;//asignamos tipo systema
altaFactura.TipoHuella = ServicioVerifactu.TipoHuellaType.Item01;//solo se admite un tipo
var fechora = DateTime.Now;
timeStamp = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK");
altaFactura.FechaHoraHusoGenRegistro = timeStamp;// - new TimeSpan(0, 0, 0, 0, fechora.TimeOfDay.Milliseconds);
//timeStamp = fechora.ToString("yyyy-MM-dd'T'HH:mm:ssK");
altaFactura.Huella = huella.creaHuellaFactura(Program.configTaller.Nif, numFactura, fechaFactura.Text, tipoFactura, cuotas.ToString("F2").Replace(",", "."), total.ToString("F2").Replace(",", "."), _huella, timeStamp);//asignamos huella
//registroFactura[1].Item = altaFactura;
ServicioVerifactu.RegistroFacturaType[] fac = new ServicioVerifactu.RegistroFacturaType[1];
//fac.Initialize();
fac[0] = new ServicioVerifactu.RegistroFacturaType();
fac[0].Item = altaFactura;
facAPresentar.RegistroFactura = fac;
//ServicioVerifactu.RegFactuSistemaFacturacionRequest envio = new ServicioVerifactu.RegFactuSistemaFacturacionRequest();
//envio.RegFactuSistemaFacturacion = facAPresentar;
///////////////////////////// <--- Prueba de serializar la factura --->
XmlSerializer serializaFactura = new XmlSerializer(typeof(ServicioVerifactu.RegFactuSistemaFacturacion));
SoapAttributes soap = new SoapAttributes();
string facXml = "";
using (var xmlw = new StringWriter())
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.Encoding = Encoding.UTF8;
using (XmlWriter writter = XmlWriter.Create(xmlw, settings))
{
serializaFactura.Serialize(writter, facAPresentar);
facXml = xmlw.ToString();
}
}
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
RegFactuSistemaFacturacionResponse response = new ServicioVerifactu.RegFactuSistemaFacturacionResponse();
// response.RespuestaRegFactuSistemaFacturacion = respuesta;
ServicioVerifactu.RegFactuSistemaFacturacionRequest req = new ServicioVerifactu.RegFactuSistemaFacturacionRequest(facAPresentar);
req.RegFactuSistemaFacturacion.Cabecera = cabecera;
ServicioVerifactu.X509DataType x59 = new ServicioVerifactu.X509DataType();
ServicioVerifactu.RSAKeyValueType key = new ServicioVerifactu.RSAKeyValueType();
sfPortTypeVerifactuClient client = new ServicioVerifactu.sfPortTypeVerifactuClient(Program.enlaceVerifactu);
System.ServiceModel.Description.ClientCredentials credenciales = new System.ServiceModel.Description.ClientCredentials();
//client.ClientCredentials.UserName.UserName = Program.configTaller.Nif;
client.ClientCredentials.ClientCertificate.Certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);
client.ClientCredentials.UseIdentityConfiguration = true;
client.ClientCredentials.SupportInteractive = true;
//client.ClientCredentials.ServiceCertificate.DefaultCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Program.certificado, Program.passcertificado);
string test = "";
//client.Open();
RespuestaRegFactuSistemaFacturacionType retorno = new RespuestaRegFactuSistemaFacturacionType();
try
{
retorno = client.RegFactuSistemaFacturacion(facAPresentar);
}
Recuerden al importar el webservice cambiar en reference System.DateTyme por string, hay un fallo al serializar la fecha , incluye milisegundos lo que da error, esta mas o menos explicado.
Simplemente han de cambiar de donde rellenar los campos, y por ejemplo si envian varios registros a la vez tenerlño en cuenta.