TRegistroFacturaStatus:
empezamos bien:
para que funcione correctamente el tema del status segun la automatizacion ejecutada por el componente, algo que puede venir bien para documentar el registro, hay que cambiar esto en
la unidad uverifactuFuncs (D10) y recompilar la DLL
El resto de funciones estan correctas. Este cambio y otros apareceran la semana que viene en el 3.1
Código:
procedure clearStatus(sesion, indice:integer);
begin
sesiones[sesion].status[indice].exenta :=false;
sesiones[sesion].status[indice].canarias :=false;
sesiones[sesion].status[indice].sujetoPasivo:=false;
sesiones[sesion].status[indice].cee :=false;
sesiones[sesion].status[indice].exporta :=false;
end;
y
Código:
function altafactura_F1_F2_R4_R5_verifactu( sesion:integer; cabecera:TVeriFactuInicio; indice:integer ): RegistroFacturaType;
var
Factura : RegistroFacturaType;
Destinatario : PersonaFisicaJuridicaType;
ListaDestinatarios : Destinatarios2;
ListaDesglose : DesgloseType;
DetalleDesglose : DetalleType;
XSDatetime : TXSDatetime;
FacturaRegistro : TRegistroFactura;
rectificadasArray : FacturasRectificadas2;
rectificada : IDFacturaARType;
j:integer;
begin
FacturaRegistro:=sesiones[sesion].facturas[indice];
clearStatus(sesion, indice);
Factura := RegistroFacturaType.Create;
Factura.RegistroAlta := RegistroAlta.Create;
Factura.RegistroAlta.IDVersion := SistemaFacturacion.VersionType(0);
Factura.RegistroAlta.NombreRazonEmisor := cabecera.emisor.NombreRazonEmisor;
Factura.RegistroAlta.IDFactura := IDFacturaExpedidaType.Create;
Factura.RegistroAlta.IDFactura.IDEmisorFactura := cabecera.emisor.nifEmisor;
Factura.RegistroAlta.IDFactura.NumSerieFactura := facturaRegistro.numSerieFactura;
Factura.RegistroAlta.IDFactura.FechaExpedicionFactura := verifactuFecha( facturaRegistro.fechafactura ) ; // (dd-mm-yyyy)
Factura.RegistroAlta.DescripcionOperacion := facturaRegistro.DescripcionOperacion;
if facturaRegistro.subsanacion then
Factura.RegistroAlta.Subsanacion:=SubsanacionType.S;
if facturaRegistro.rechazoPrevioExiste then
Factura.RegistroAlta.RechazoPrevio:=RechazoPrevioType.S;
if facturaRegistro.rechazoPrevioNoExiste then
Factura.RegistroAlta.RechazoPrevio:=RechazoPrevioType.X;
if facturaRegistro.refExterna<>'' then // informacion libre
Factura.RegistroAlta.RefExterna := facturaRegistro.refExterna;
// 1 destinatario (cliente):
if facturaRegistro.clienteNIF<>'' then // es una factura con destinatario TIPO F1
begin
if facturaRegistro.total<0 then
Factura.RegistroAlta.TipoFactura := ClaveTipoFacturaType.R4
else
Factura.RegistroAlta.TipoFactura := ClaveTipoFacturaType.F1;
Destinatario := PersonaFisicaJuridicaType.Create;
Destinatario.NombreRazon := facturaRegistro.cliente;
// si no es españa puede ser comunitario o exportacion
if facturaRegistro.clienteCodPais<>'ES' then
begin
Destinatario.IDOtro := IDOtroType.Create;
Destinatario.IDOtro.CodigoPais := verifactu_codigoPais( facturaRegistro.clienteCodPais );
if facturaRegistro.clientetipoNIF<>'' then
Destinatario.IDOtro.IdType := verifactu_tipoNIF ( facturaRegistro.clientetipoNIF )
else
begin
if CodpaisEuropea(facturaRegistro.clienteCodPais) then
Destinatario.IDOtro.IdType :=PersonaFisicaJuridicaIDTypeType._02
else
Destinatario.IDOtro.IdType :=PersonaFisicaJuridicaIDTypeType._06;
end;
Destinatario.IDOtro.ID := facturaRegistro.clienteNIF;
end
else
Destinatario.NIF := facturaRegistro.clienteNIF; // España
// El destinatario (cliente) a la lista (solo 1 cliente x factura)
ListaDestinatarios:= destinatarios2.Create();
SetLength(ListaDestinatarios, 1);
ListaDestinatarios[0] := Destinatario;
Factura.RegistroAlta.Destinatarios := ListaDestinatarios;
end
else // Es un ticket o factura F2 con el cliente sin identificar
begin
if facturaRegistro.total<0 then
Factura.RegistroAlta.TipoFactura := ClaveTipoFacturaType.R5
else
Factura.RegistroAlta.TipoFactura := ClaveTipoFacturaType.F2;
Factura.RegistroAlta.FacturaSinIdentifDestinatarioArt61d:=CompletaSinDestinatarioType.S;
end;
// Desglose de iva y exenciones: (Nacional, Comunitario, o Exportacion)
ListaDesglose := DesgloseType.Create();
// Exenciones
for j:=0 to facturaRegistro.nexentas-1 do // x cada exencion
begin
if (facturaRegistro.exenta[j].baseImp<>0)and(facturaRegistro.exenta[j].tipoExenta<>'') then
begin
DetalleDesglose:= DetalleType.Create;
if facturaRegistro.exenta[j].claveRegimen<>'' then
DetalleDesglose.ClaveRegimen :=codigoTrascendencia_verifactu( facturaRegistro.exenta[j].claveRegimen);
if facturaRegistro.exenta[j].calificacionOperacion<>'' then
DetalleDesglose.CalificacionOperacion:=codigoCalificacion_verifactu( facturaRegistro.exenta[j].calificacionOperacion );
DetalleDesglose.OperacionExenta :=codigoExenta_verifactu(facturaRegistro.exenta[j].tipoExenta);
DetalleDesglose.BaseImponibleOimporteNoSujeto := NumeroVeriFactu( facturaRegistro.exenta[j].baseImp );
sesiones[sesion].status[indice].exenta:=true;
// colocar el desglose en la lista
SetLength( ListaDesglose, Length(ListaDesglose) +1 );
ListaDesglose[ High(ListaDesglose ) ] := DetalleDesglose ;
end;
end;
// IVA
for j:=0 to facturaRegistro.nivas-1 do // x cada iva:
Begin
DetalleDesglose := DetalleType.Create;
DetalleDesglose.ClaveRegimen := IdOperacionesTrascendenciaTributariaType._01;
// Tipo de calificacion y exenta segun pais
if facturaRegistro.clienteCodPais='ES' then // España:
begin
if not facturaRegistro.canarias then // Si no es canarias:
begin
// ¿inversion del sujeto pasivo?
if NOT facturaRegistro.inversionSujetoPasivo then // Factura Normal
begin
DetalleDesglose.CalificacionOperacion := CalificacionOperacionType.S1;
DetalleDesglose.TipoImpositivo := NumeroVeriFactu( facturaRegistro.iva[j].iva );
DetalleDesglose.CuotaRepercutida := NumeroVeriFactu( facturaRegistro.iva[j].impiva );
if facturaRegistro.iva[j].req<>0 then // ¿ lleva recargo de equivalencia ?
begin
DetalleDesglose.ClaveRegimen :=IdOperacionesTrascendenciaTributariaType._18;
DetalleDesglose.TipoRecargoEquivalencia := NumeroVeriFactu( facturaRegistro.iva[j].req );
DetalleDesglose.CuotaRecargoEquivalencia := NumeroVeriFactu( facturaRegistro.iva[j].impreq );
end;
end
else // Con inversion del sujeto pasivo
begin
sesiones[sesion].status[indice].sujetopasivo :=true;
DetalleDesglose.CalificacionOperacion := CalificacionOperacionType.S2;
DetalleDesglose.TipoImpositivo := NumeroVeriFactu( 0 );
DetalleDesglose.CuotaRepercutida := NumeroVeriFactu( 0 );
end;
end
else // caso especifico Canarias ceuta y melilla entrega de bienes
begin
DetalleDesglose.ClaveRegimen := IdOperacionesTrascendenciaTributariaType._02;
DetalleDesglose.OperacionExenta := OperacionExentaType.E2;
end;
end
else // exportacion o comunidad Europea
begin
DetalleDesglose.OperacionExenta:= verifactu_tipoDesglose( facturaRegistro.clienteCodPais );
if DetalleDesglose.OperacionExenta=OperacionExentaType.E5 then // UE
begin
sesiones[sesion].status[indice].cee:=true;
DetalleDesglose.ClaveRegimen := IdOperacionesTrascendenciaTributariaType._01;
end;
if DetalleDesglose.OperacionExenta=OperacionExentaType.E2 then // Exportacion fuera de la UE
begin
sesiones[sesion].status[indice].exporta:=true;
DetalleDesglose.ClaveRegimen := IdOperacionesTrascendenciaTributariaType._02;
end;
end;
// Base Imponible
DetalleDesglose.BaseImponibleOimporteNoSujeto := NumeroVeriFactu( facturaRegistro.iva[j].baseImp );
// colocar el desglose en la lista
SetLength( ListaDesglose, Length(ListaDesglose) +1 );
ListaDesglose[ High(ListaDesglose ) ] := DetalleDesglose ;
end;
// asignar los desgloses de iva recien creados, al objeto de factura:
Factura.RegistroAlta.Desglose:= ListaDesglose;
// totales de factura ¿inversion sujeto pasivo?
if NOT facturaRegistro.inversionSujetoPasivo then // Factura Normal
begin
Factura.RegistroAlta.CuotaTotal := NumeroVeriFactu( facturaRegistro.cuotatotal ) ;
Factura.RegistroAlta.ImporteTotal := NumeroVeriFactu( facturaRegistro.total );
end
else
begin
Factura.RegistroAlta.CuotaTotal := NumeroVeriFactu( 0 ); // inversion sujeto pasivo
Factura.RegistroAlta.ImporteTotal := NumeroVeriFactu( facturaRegistro.iva[0].baseImp );
end;
// factura rectificada: (1 x factura)
if facturaRegistro.total <0 then
begin
setLength(rectificadasArray,1);
rectificada:=IDFacturaARType.Create;
rectificada.IDEmisorFactura :=cabecera.emisor.nifEmisor;
rectificada.NumSerieFactura :=facturaRegistro.facturaRectificada;
rectificada.FechaExpedicionFactura:=facturaRegistro.fechaFacturaRectificada;
rectificadasArray[0]:=rectificada;
Factura.RegistroAlta.FacturasRectificadas :=rectificadasArray;
Factura.RegistroAlta.TipoRectificativa :=ClaveTipoRectificativaType(1);
end;
// Encadenamiento con factura anterior
Factura.RegistroAlta.Encadenamiento := Encadenamiento3.Create;
// ¿ es el primer registro ?
if sesiones[sesion].facturas[indice-1].huella='' then Factura.RegistroAlta.Encadenamiento.PrimerRegistro:=PrimerRegistroCadenaType(0) // S
else
begin // no es el primer registro, colocar encadenamiento anterior
Factura.RegistroAlta.Encadenamiento.RegistroAnterior:=EncadenamientoFacturaAnteriorType.Create;
Factura.RegistroAlta.Encadenamiento.RegistroAnterior.IDEmisorFactura :=cabecera.emisor.nifEmisor;
Factura.RegistroAlta.Encadenamiento.RegistroAnterior.NumSerieFactura :=sesiones[sesion].facturas[indice-1].numSerieFactura;
Factura.RegistroAlta.Encadenamiento.RegistroAnterior.FechaExpedicionFactura :=sesiones[sesion].facturas[indice-1].fechaFactura;
Factura.RegistroAlta.Encadenamiento.RegistroAnterior.Huella :=sesiones[sesion].facturas[indice-1].huella;
end;
// sistemaInformatico
sistemaInformatico( cabecera, Factura );
// XSDatetime
XSDatetime := TXSDatetime.Create;
XSDatetime.UseZeroMilliseconds := False;
XSDatetime.AsDateTime := Now;
XSDatetime.Millisecond := 0;
XSDatetime.UseZeroMilliseconds := False;
XSDatetime.FractionalSeconds := 0;
Factura.RegistroAlta.FechaHoraHusoGenRegistro := XSDatetime; // Formato: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601)
// Huella
Factura.RegistroAlta.TipoHuella := TipoHuellaType._01;
Factura.RegistroAlta.Huella := GenerarHuella_alta_RegistroVerifactu(sesion,indice,Factura.RegistroAlta);
sesiones[sesion].facturas[indice].huella:=Factura.RegistroAlta.Huella;
// fin, devolver el objeto registroFacturaType.RegistroAlta creado desde la informacion contenida en el record TRegistroFactura (ver utiles.pas)
result:=factura;
end;