1 #define SuplidosDtosPortes 3 using System.Collections.Generic;
9 using Sage.
ES.TicketBAI.Entities;
11 using Sage.
ES.TicketBAI.Entities.ComModel.Common.V1_0;
12 using Sage.
ES.TicketBAI.Entities.ComModel.Invoice.V1_0;
13 using Sage.
ES.TicketBAI.Entities.ComModel.Annulation.V1_0;
14 using Sage.
ES.TicketBAI.Interfaces.Entities;
24 internal class CertificadorSage50_TBaiImpl : CertificadorSage50_Base
26 private Process _process = null;
29 public override bool CreateProcess(
string outputFilename,
string territorio200,
bool onlineSendFile,
bool isCancellation, ref
object _process, DateTime documentDate)
33 _process =
new Sage.
ES.TicketBAI.Entities.Process();
35 Sage.
ES.TicketBAI.Interfaces.Entities.IConfig config =
new Sage.
ES.TicketBAI.Entities.Config()
37 DeleteFiles = !_ActiveTraces,
39 TraceAdditionalInfo =
"{date} | pid:{pid} | t:{tid} | {assembly}",
41 TraceFile =
"C:\\Logs\\Sage.ES.TicketBAI\\traces.log",
42 TraceHeaderSeparator =
"",
43 TraceMaxArchivedFiles =
"7",
45 TracePatternDateTime =
"{LOCAL}dd/MM/yyyy HH:mm:ss.fff",
46 TraceRollSizeKB =
"10000" 49 if (UseCertificateFile)
51 config.CertificateFileName = CertificateName;
52 if (CertificatePassword != null)
53 config.CertificatePassword = CertificatePassword.ToString();
57 config.Certificate = CertificateName;
58 if (CertificatePassword != null)
59 config.CertificateThumbprint = CertificatePassword.ToString();
61 config.VersionXAd =
Sage.
ES.TicketBAI.Interfaces.Entities.VersionXAd.ver_EPES;
62 config.CertificateStore =
Sage.
ES.TicketBAI.Interfaces.Entities.CertificateStore.cert_MY;
63 config.SignatureAlgorithm =
Sage.
ES.TicketBAI.Interfaces.Entities.SignatureAlgorithm.alg_SHA256;
66 config.SigPolicyId_Description = GetSigPolicyId_Description(ConvertirTerritorioDe200A50(territorio200));
67 config.SigPolicyId_Identifier = GetSigPolicyId_Identifier(ConvertirTerritorioDe200A50(territorio200));
68 config.SigPolicyHash_DigestValue = GetSigPolicyHash_DigestValue(ConvertirTerritorioDe200A50(territorio200));
70 ((
Sage.
ES.TicketBAI.Entities.Process)_process).Config = config;
73 ((
Sage.
ES.TicketBAI.Entities.Process)_process).Config.UrlQR = GetCertificationQRURL(ConvertirTerritorioDe200A50(territorio200));
77 string URLEnvio = GetCertificationSendURL(ConvertirTerritorioDe200A50(territorio200), isCancellation, documentDate);
78 if (onlineSendFile && !
string.IsNullOrWhiteSpace(URLEnvio))
80 ((
Sage.
ES.TicketBAI.Entities.Process)_process).Config.SendFact =
new Sage.
ES.TicketBAI.Entities.SendFact
84 XmlFact = outputFilename
86 ((
Sage.
ES.TicketBAI.Entities.Process)_process).Config.EnvioDiferido =
true;
88 else if (!onlineSendFile)
90 ((
Sage.
ES.TicketBAI.Entities.Process)_process).Config.SendFact = null;
91 ((
Sage.
ES.TicketBAI.Entities.Process)_process).Config.EnvioDiferido =
true;
99 ((
Sage.
ES.TicketBAI.Entities.Process)_process).OutputFileName = outputFilename;
103 public override bool GenerateDataForInvoices(
string outputFilename, List<ewDocVentaTPV> listaDatosAlbaranes,
AsientosFacturasVentaGenerador datosFactura, TicketBai_XML_Parameters XML_generator_parameters)
105 return GenerateTicketBaiDataInternal(outputFilename, listaDatosAlbaranes, datosFactura, XML_generator_parameters);
108 public override bool GenerateDataForTickets(
string outputFilename,
ewDocVentaTPV datosTicket, TicketBai_XML_Parameters XML_generator_parameters)
110 return GenerateTicketBaiDataTicketsInternal(outputFilename, datosTicket, XML_generator_parameters);
113 public override bool GenerateDataForAnnulment(
string outputFilename, HuellaDetalle huellaFraOriginal)
115 return GenerateAnulationDataInternal(outputFilename, huellaFraOriginal);
118 private static string GetSigPolicyId_Identifier(
string territorio)
120 #region Validaciones previas 123 int territorio50 = Convert.ToInt32(territorio);
125 if (!territorio50.Equals(1) && !territorio50.Equals(2) && !territorio50.Equals(3))
126 throw new NotSupportedException($
"Territorio no soportado {territorio50}");
128 #endregion Validaciones previas 133 private static string GetSigPolicyHash_DigestValue(
string territorio)
135 #region Validaciones previas 138 int territorio50 = Convert.ToInt32(territorio);
140 if (!territorio50.Equals(1) && !territorio50.Equals(2) && !territorio50.Equals(3))
141 throw new NotSupportedException($
"Territorio no soportado {territorio50}");
143 #endregion Validaciones previas 148 private static string GetSigPolicyId_Description(
string territorio)
150 #region Validaciones previas 153 int territorio50 = Convert.ToInt32(territorio);
155 if (!territorio50.Equals(1) && !territorio50.Equals(2) && !territorio50.Equals(3))
156 throw new NotSupportedException($
"Territorio no soportado {territorio50}");
158 #endregion Validaciones previas 165 var baseIva = iva._Base;
166 var totalIva = iva._TotalIva;
167 var recargoIva = iva._TotalRecEquiv;
168 if (datosEntregas.HayEntregasDelTipoIva(iva._Codigo))
170 var infoEntrega = datosEntregas.GetEntregaDelTipoIva(iva._Codigo);
171 baseIva = iva._Base - infoEntrega.Base;
172 totalIva = iva._TotalIva - infoEntrega.ImporteIva;
173 recargoIva = iva._TotalRecEquiv - infoEntrega.ImporteRecargo;
176 var detalleIva =
new DetalleIVATypeCom
178 BaseImponible = TratarImporte(datosFactura, baseIva, _mascaraParaCertificacion),
179 TipoImpositivo = iva._PrcIva.ToString(_mascaraParaCertificacion),
180 CuotaImpuesto = TratarImporte(datosFactura, totalIva, _mascaraParaCertificacion)
182 if (iva._PrcRecEquiv != 0 || (iva._Iva0 && datosFactura.
_oCliente._Recargo))
184 detalleIva.TipoRecargoEquivalencia = iva._PrcRecEquiv.ToString(_mascaraParaCertificacion);
185 detalleIva.CuotaRecargoEquivalencia = TratarImporte(datosFactura, recargoIva, _mascaraParaCertificacion);
187 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificado =
"N";
188 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificadoSpecified =
true;
193 private SoftwareFacturacionTypeCom Generar_SoftwareFacturacionTypeCom()
195 SoftwareFacturacionDTO datosSoftware = ObtenerDatosSoftwareFacturacion();
196 var datosSoftwareTypeCom =
new SoftwareFacturacionTypeCom()
198 LicenciaTBAI = datosSoftware.Licencia,
199 EntidadDesarrolladora =
new EntidadDesarrolladoraTypeCom()
201 Item_NIF = datosSoftware.Nif,
203 Nombre = datosSoftware.Nombre,
204 Version = datosSoftware.Version
206 return datosSoftwareTypeCom;
209 private SoftwareFacturacionDTO ObtenerDatosSoftwareFacturacion()
226 var entorno = GetEntorno();
227 var territorio50 = Convert.ToInt32(GetTerritorioEnvioTBai(
false));
229 var datos = FACTUCERT.ObtenerDatosSoftwareFacturacion(entorno, territorio50);
242 private bool GenerateTicketBaiDataInternal(
string outputFilename, List<ewDocVentaTPV> listaDatosAlbaranes,
AsientosFacturasVentaGenerador datosFactura, TicketBai_XML_Parameters XML_generator_parameters)
245 TicketBaiCom ticketBaiCom = null;
246 GeneratedSignature =
"";
248 GenerateTrace(
"ExportadorFactuCertXML: Entrando en GenerateTicketBaiDataInternal");
253 ticketBaiCom =
new TicketBaiCom();
257 ticketBaiCom.Cabecera =
new CabeceraCom()
259 IDVersionTBAI =
"1.2" 262 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando sujeto");
264 ticketBaiCom.Sujetos =
new SujetosCom()
267 Emisor =
new EmisorCom()
269 NIF = NormalizarCaracteresNif(((ew.empresa.Empresa)EW_GLOBAL._Empresa)._CifTC),
270 ApellidosNombreRazonSocial = ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._ApellidosTC +
" " + ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._NombreTC.Trim()
273 VariosDestinatarios =
"N",
274 VariosDestinatariosSpecified =
true,
277 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Obteniendo datos de C_FACTUVEN");
279 DataRow facRow = GetRowCompletoTabla(
"GESTION",
"C_FACTUVEN",
"EMPRESA = '" + EW_GLOBAL._GetVariable(
"wc_empresa").ToString() +
"' AND NUMERO = '" + XML_generator_parameters.NumDocumentoBorrador +
"'");
281 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Comprobando SIITERCERO para datos Sujeto.EmitidaPor");
282 if (Convert.ToBoolean(facRow[
"SIITERCERO"]))
284 if (Convert.ToInt32(facRow[
"TBTERCERO"]) == 1)
285 ticketBaiCom.Sujetos.EmitidaPorTercerosODestinatario =
"T";
286 else if (Convert.ToInt32(facRow[
"TBTERCERO"]) == 2)
287 ticketBaiCom.Sujetos.EmitidaPorTercerosODestinatario =
"D";
289 ticketBaiCom.Sujetos.EmitidaPorTercerosODestinatario =
"";
293 ticketBaiCom.Sujetos.EmitidaPorTercerosODestinatario =
"N";
295 ticketBaiCom.Sujetos.EmitidaPorTercerosODestinatarioSpecified =
true;
298 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Generando destinatario");
300 var destinatario =
new IDDestinatarioCom();
302 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Obteniendo M_nombre2 de MODCONFI");
304 var resNombre2 = GetValoresTabla(
new string[] {
"M_nombre2" },
"GESTION",
"MODCONFI",
"EMPRESA = '" + EW_GLOBAL._GetVariable(
"wc_empresa").ToString() +
"'");
305 if (resNombre2 != null && resNombre2.Length > 0 && Convert.ToInt16(resNombre2[0]) == 1 && !
string.IsNullOrWhiteSpace(datosFactura.
_oCliente._RazonComercial))
307 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando destinatario con Razon Comercial",
"Razon Comercial Factura -> " + datosFactura.
_oCliente._RazonComercial.Trim());
308 destinatario.ApellidosNombreRazonSocial = datosFactura.
_oCliente._RazonComercial.Trim();
312 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando destinatario con Nombre",
"Nombre Factura -> " + datosFactura.
_oCliente._Nombre.Trim());
313 destinatario.ApellidosNombreRazonSocial = datosFactura.
_oCliente._Nombre.Trim();
316 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando Codigo Postal");
317 destinatario.CodigoPostal =
string.IsNullOrWhiteSpace(listaDatosAlbaranes.First()._Cabecera._DatosContado._CodPost) ? datosFactura.
_oCliente._CodPost.Trim() : listaDatosAlbaranes.First()._Cabecera._DatosContado._CodPost.Trim();
319 destinatario.Direccion =
string.IsNullOrWhiteSpace(listaDatosAlbaranes.First()._Cabecera._DatosContado._Direccion) ? datosFactura.
_oCliente._Direccion.Trim() : listaDatosAlbaranes.First()._Cabecera._DatosContado._Direccion.Trim();
323 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando ID. Buscamos Id_Fiscal");
324 var resModidfis = GetValoresTabla(
new string[] {
"Id_Fiscal" },
"GESTION",
"MODIDFIS",
"CUENTA = '" + datosFactura.
_oCliente._Codigo +
"'");
325 int idFiscal = (resModidfis != null && resModidfis.Length > 0) ? Convert.ToInt32(resModidfis[0]) : 0;
326 if (idFiscal == 1 || idFiscal == 0 || idFiscal == 7)
328 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Id_Fiscal Nif o similar");
329 destinatario.Item_NIF =
string.IsNullOrWhiteSpace(datosFactura.
_oCliente._NIF) ?
"" : NormalizarCaracteresNif(datosFactura.
_oCliente._NIF);
333 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Id_Fiscal Extranjero");
336 var paisCliente = GetValoresTabla(
new string[] {
"Letra" },
"COMUNES",
"PAISES",
"CODIGO = '" + datosFactura.
_oCliente._Pais +
"'");
338 var codigoPais = paisCliente[0].ToString().ToUpper().Trim();
341 if (codigoPais.__IsNumber())
343 ErrorMessage = $
"El pais con código {datosFactura._oCliente._Pais} tiene por sigla {codigoPais} y no pueden ser un número. Revise la codificación del país.";
347 var nifCliente =
string.IsNullOrWhiteSpace(datosFactura.
_oCliente._NIF) ?
"" : NormalizarCaracteresNif(datosFactura.
_oCliente._NIF);
350 nifCliente = FUNCTIONS.IncorporarPaisAlNif(codigoPais, nifCliente);
353 destinatario.Item_IDOtro =
new IDOtroCom()
355 CodigoPais = codigoPais,
356 CodigoPaisSpecified =
true,
357 IDType =
"Item0" + idFiscal.ToString().Trim(),
363 throw new NotSupportedException(
"Es necesario informar código de país para la cuenta de cliente " + datosFactura.
_oCliente._Codigo +
" debido al tipo de identificación fiscal que tiene asignado. Revise el país y tipo de identificación fiscal del cliente.");
368 bool tieneConsideracionDeSimplificada =
false;
369 if (Convert.ToBoolean(facRow[
"SIIF1NOID"]) ||
370 (facRow[
"SIINUMINI"] != null && facRow[
"SIINUMINI"] != DBNull.Value && !
string.IsNullOrWhiteSpace(facRow[
"SIINUMINI"].ToString()) && facRow[
"SIINUMFIN"] != null && facRow[
"SIINUMFIN"] != DBNull.Value && !
string.IsNullOrWhiteSpace(facRow[
"SIINUMFIN"].ToString()) && facRow[
"SIINUMINI"].ToString() == facRow[
"SIINUMFIN"].ToString()) ||
371 (
string.IsNullOrWhiteSpace(datosFactura.
_oCliente._NIF)))
373 tieneConsideracionDeSimplificada =
true;
376 if (!tieneConsideracionDeSimplificada)
377 ticketBaiCom.Sujetos.Destinatarios =
new IDDestinatarioCom[] { destinatario };
385 ticketBaiCom.Sujetos.Emisor.Territorio = GetTerritorioEnvioTBai(
true);
387 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Generando la cabecera de la Factura");
390 string serieFac = datosFactura.
_Factura.Substring(0, 2).Trim();
391 string numFac = datosFactura.
_Factura.Substring(2).Trim();
393 if (!
string.IsNullOrWhiteSpace((
string)(facRow[
"SIIFRAMOD"])))
396 if (facRow[
"SIIFRAMOD"].ToString().Trim().Length > 20)
397 numFac = facRow[
"SIIFRAMOD"].ToString().Trim().Substring(0, 20);
399 numFac = facRow[
"SIIFRAMOD"].ToString().Trim();
401 else if (Convert.ToInt32(facRow[
"OPERACION"]) == 12 && !
string.IsNullOrWhiteSpace((
string)(facRow[
"SIINUMDER"])))
404 numFac = facRow[
"SIINUMDER"].ToString().Trim();
409 ticketBaiCom.Factura =
new FacturaCom()
412 CabeceraFactura =
new ComModel.Invoice.V1_0.CabeceraFacturaTypeCom()
416 FechaExpedicionFactura = datosFactura.
_Fecha.ToString(
"dd-MM-yyyy"),
417 HoraExpedicionFactura = XML_generator_parameters.HoraCertificacion?.Trim(),
419 FacturaSimplificadaSpecified =
true,
420 FacturaEmitidaSustitucionSimplificada = Convert.ToInt32(facRow[
"OPERACION"]) == 28 ?
"S" :
"N",
421 FacturaEmitidaSustitucionSimplificadaSpecified =
true 425 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Viendo si es rectificativa a partir de SIIORIMOT");
427 if (facRow[
"SIIORIMOT"] != null && facRow[
"SIIORIMOT"] != DBNull.Value && !
string.IsNullOrWhiteSpace(facRow[
"SIIORIMOT"].ToString()))
429 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Es rectificativa, rellenamos datos");
430 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa =
new FacturaRectificativaTypeCom()
432 Codigo = facRow[
"SIIORIMOT"]?.ToString().Trim(),
433 Tipo = facRow[
"SIIORITIP"]?.ToString().Trim(),
438 if (Convert.ToString(facRow[
"SIIORITIP"]) ==
"S")
440 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa.ImporteRectificacionSustitutiva =
new ImporteRectificacionSustitutivaTypeCom()
442 BaseRectificada = Convert.ToDecimal(facRow[
"SIIORIBAS"]).ToString(_mascaraParaCertificacion).Trim(),
443 CuotaRectificada = Convert.ToDecimal(facRow[
"SIIORIIVA"]).ToString(_mascaraParaCertificacion).Trim(),
444 CuotaRecargoRectificada = Convert.ToDecimal(facRow[
"SIIORIREC"]).ToString(_mascaraParaCertificacion).Trim(),
450 if (Convert.ToInt32(facRow[
"OPERACION"]) == 11)
452 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Es Modificación factura inicial / Certificaciones obra AAPP, rellenamos datos");
453 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa =
new FacturaRectificativaTypeCom()
459 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa.ImporteRectificacionSustitutiva =
new ImporteRectificacionSustitutivaTypeCom()
461 BaseRectificada = Convert.ToDecimal(facRow[
"SIIDEVBAS"]).ToString(_mascaraParaCertificacion).Trim(),
462 CuotaRectificada = Convert.ToDecimal(facRow[
"SIIDEVCUO"]).ToString(_mascaraParaCertificacion).Trim(),
463 CuotaRecargoRectificada = Convert.ToDecimal(facRow[
"SIIDEVREC"]).ToString(_mascaraParaCertificacion).Trim(),
468 if (Convert.ToString(facRow[
"SIIORICAN"]) ==
"2")
471 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Datos facturas sustituidas a partir de D_FACTURECT");
475 List<IDFacturaRectificadaSustituidaTypeCom> lstSustituidas =
new List<IDFacturaRectificadaSustituidaTypeCom>();
477 decimal baseRectificada = decimal.Zero;
478 decimal cuotaRectificada = decimal.Zero;
479 decimal cuotaRecargoRectificada = decimal.Zero;
480 foreach (
DetalleFacturaRectificativaDTO fraRectificada
in ObtenerDatosRectificadasMultiplesFacturas(XML_generator_parameters.NumDocumentoBorrador))
483 baseRectificada += fraRectificada.
Base_iva;
484 cuotaRectificada += fraRectificada.
Iva;
485 cuotaRecargoRectificada += fraRectificada.
Recargo;
487 var fraSustituida =
new IDFacturaRectificadaSustituidaTypeCom
490 NumFactura = fraRectificada.
Factu_rect.Substring(2),
491 FechaExpedicionFactura = fraRectificada.
Fecha.ToString(
"dd-MM-yyyy")
493 lstSustituidas.Add(fraSustituida);
496 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa.ImporteRectificacionSustitutiva =
new ImporteRectificacionSustitutivaTypeCom()
498 BaseRectificada = baseRectificada.ToString(_mascaraParaTicketBAI).Trim(),
499 CuotaRectificada = cuotaRectificada.ToString(_mascaraParaTicketBAI).Trim(),
500 CuotaRecargoRectificada = cuotaRecargoRectificada.ToString(_mascaraParaTicketBAI).Trim(),
503 ticketBaiCom.Factura.CabeceraFactura.FacturasRectificadasSustituidas = lstSustituidas.ToArray();
508 if (Convert.ToInt32(facRow[
"OPERACION"]) != 28 && Convert.ToInt32(facRow[
"OPERACION"]) != 11)
510 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Datos facturas sustituidas a partir de SIIORIFRA");
512 if (facRow[
"SIIORIFRA"] != null && facRow[
"SIIORIFRA"] != DBNull.Value && !
string.IsNullOrWhiteSpace(facRow[
"SIIORIFRA"].ToString()))
514 ticketBaiCom.Factura.CabeceraFactura.FacturasRectificadasSustituidas =
new IDFacturaRectificadaSustituidaTypeCom[]
516 new IDFacturaRectificadaSustituidaTypeCom
518 SerieFactura = facRow[
"SIIORIFRA"].ToString().Substring(0, 2).Trim(),
519 NumFactura = facRow[
"SIIORIFRA"].ToString().Substring(2).Trim(),
520 FechaExpedicionFactura = (facRow[
"SIIORIFEC"] != null && facRow[
"SIIORIFEC"] != DBNull.Value) ? ((DateTime)facRow[
"SIIORIFEC"]).ToString(
"dd-MM-yyyy") :
"",
530 if (facRow[
"SIIDEVFRA"] != null && facRow[
"SIIDEVFRA"] != DBNull.Value && !
string.IsNullOrWhiteSpace(facRow[
"SIIDEVFRA"].ToString()))
532 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Datos facturas sustituidas a partir de SIIDEVFRA");
534 ticketBaiCom.Factura.CabeceraFactura.FacturasRectificadasSustituidas =
new IDFacturaRectificadaSustituidaTypeCom[]
536 new IDFacturaRectificadaSustituidaTypeCom
538 SerieFactura = facRow[
"SIIDEVFRA"].ToString().Substring(0, 2).Trim(),
539 NumFactura = facRow[
"SIIDEVFRA"].ToString().Substring(2).Trim(),
540 FechaExpedicionFactura = (facRow[
"SIIDEVFEC"] != null && facRow[
"SIIDEVFEC"] != DBNull.Value) ? ((DateTime)facRow[
"SIIDEVFEC"]).ToString(
"dd-MM-yyyy") :
"",
548 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Generando el cuerpo de la Factura");
552 EntregasEnFactura datosEntregas =
new EntregasEnFactura(datosFactura);
554 ticketBaiCom.Factura.DatosFactura =
new DatosFacturaTypeCom()
557 DescripcionFactura =
string.IsNullOrWhiteSpace(listaDatosAlbaranes.First()._Cabecera._DescFac) ?
"N/FRA " + datosFactura.
_Factura.Trim() +
" " + datosFactura.
_Nombre.Trim() : listaDatosAlbaranes.First()._Cabecera._DescFac.Trim(),
561 ImporteTotalFactura = TratarImporte(datosFactura, GetImporteTotalFactura(datosFactura, datosEntregas), _mascaraParaCertificacion),
562 RetencionSoportada = TratarImporte(datosFactura, GetImporteRetencionFiscal(datosFactura), _mascaraParaCertificacion),
567 if (facRow[
"SIIORIFOP"] != null && facRow[
"SIIORIFOP"] != DBNull.Value)
569 ticketBaiCom.Factura.DatosFactura.FechaOperacion = Convert.ToDateTime(facRow[
"SIIORIFOP"]).ToString(
"dd-MM-yyyy");
575 if (Convert.ToInt32(facRow[
"OPERACION"]) == 28 && facRow[
"SIIDEVFOP"] != null && facRow[
"SIIDEVFOP"] != DBNull.Value)
576 ticketBaiCom.Factura.DatosFactura.FechaOperacion = Convert.ToDateTime(facRow[
"SIIDEVFOP"]).ToString(
"dd-MM-yyyy");
579 var lineaDetalleIncluidas =
new List<IDDetalleFacturaTypeCom>();
581 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Generando las líneas a partir de los Albaranes");
583 foreach (var albaran
in listaDatosAlbaranes)
586 var hayPuntoVerde = Convert.ToBoolean(EW_GLOBAL._GetVariable(
"wl_pverde")) && !albaran._Cabecera._oCliente._NoApli_Impuesto_Artic;
588 #
if SuplidosDtosPortes
590 var lineasAlbaran = albaran._Lineas.Where(l => l._Suplido.Equals(
false)).ToList();
591 foreach (var linea
in lineasAlbaran)
593 foreach (var linea
in albaran._Lineas)
596 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Procesando línea albarán " + albaran._Numero +
"-" + linea._Linea);
601 if (!
string.IsNullOrWhiteSpace(linea._TipoIva))
603 var lineaAlb =
new IDDetalleFacturaTypeCom
605 DescripcionDetalle = linea._Definicion.Trim(),
606 ImporteUnitario = linea._Precio.ToString(_mascara8decimales),
614 decimal importeConRecargo = linea._ImporteIva;
615 decimal porcentajeRecargo = datosFactura.
_TipoIvaLineas.Where(TI => TI._Codigo == linea._TipoIva).Select(TI => TI._PrcRecEquiv).FirstOrDefault();
616 importeConRecargo += (linea._Importe * porcentajeRecargo / 100m);
618 lineaAlb.ImporteTotal = importeConRecargo.ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion));
622 lineaAlb.ImporteTotal = linea._ImporteIva.ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion));
636 switch (linea._TipoPrec)
640 if (linea._Peso != 0)
641 cantidad = linea._Peso;
643 cantidad = linea._Unidades;
646 cantidad = linea._Cajas;
649 if (linea._Peso != 0)
650 cantidad = linea._Peso / 1000m;
652 cantidad = linea._Unidades / 1000m;
656 throw new NotSupportedException(
"El tipo de precio de la línea no está soportado");
658 lineaAlb.Cantidad = cantidad.ToString(GetMascaraEspecificaPorTerritorio(
"Cantidad", _mascaraParaCertificacion));
660 if (linea._Dto1 != 0 || linea._Dto2 != 0)
661 lineaAlb.Descuento = ((cantidad * linea._Precio) - linea._Importe).ToString(GetMascaraEspecificaPorTerritorio(
"Descuento", _mascaraParaCertificacion));
663 lineaAlb.Descuento = 0.ToString(GetMascaraEspecificaPorTerritorio(
"Descuento", _mascaraParaCertificacion));
665 #if SuplidosDtosPortes 666 lineaDetalleIncluidas.Add(lineaAlb);
668 ticketBaiCom.Factura.DatosFactura.AddDetalleFactura(lineaAlb);
671 if (hayPuntoVerde && !linea._PuntoVerde.Equals(decimal.Zero) && !cantidad.Equals(decimal.Zero))
673 var literalPVerde = ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._TituloImpuestoArticulo.TrimEnd();
675 var lineaPVerde =
new IDDetalleFacturaTypeCom
677 DescripcionDetalle = literalPVerde,
678 Cantidad = (1).ToString(_mascara8decimales),
679 ImporteUnitario = linea._PuntoVerde.ToString(_mascara8decimales),
682 decimal porcentajeIva = datosFactura.
_TipoIvaLineas.Where(TI => TI._Codigo == linea._TipoIva).Select(TI => TI._PrcIva).FirstOrDefault();
683 decimal importeDelPuntoVerde = (linea._PuntoVerde * (1 + (porcentajeIva / 100m)));
687 decimal porcentajeRecargo = datosFactura.
_TipoIvaLineas.Where(TI => TI._Codigo == linea._TipoIva).Select(TI => TI._PrcRecEquiv).FirstOrDefault();
688 importeDelPuntoVerde += (linea._PuntoVerde * porcentajeRecargo / 100m);
691 lineaPVerde.ImporteTotal = (importeDelPuntoVerde).ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion));
693 #if SuplidosDtosPortes 694 lineaDetalleIncluidas.Add(lineaPVerde);
696 ticketBaiCom.Factura.DatosFactura.AddDetalleFactura(lineaPVerde);
703 #if SuplidosDtosPortes 707 var portes = albaran._Pie._Portes;
708 if (portes != null && !portes._Importe.Equals(decimal.Zero))
710 var importeUnitario = decimal.Zero;
711 var importeTotal = decimal.Zero;
712 ew.articulo.TipoIVA tipoIva =
new ew.articulo.TipoIVA
718 if (portes._Iva_Incluido)
721 importeUnitario = portes._Importe / ((100 + tipoIva._IVA) / 100);
722 importeTotal = portes._Importe;
727 importeUnitario = portes._Importe;
729 importeTotal = portes._Importe * ((100 + tipoIva._IVA) /100) ;
734 importeTotal += importeUnitario * (tipoIva._Recargo / 100);
736 var lineaPortes =
new IDDetalleFacturaTypeCom
738 DescripcionDetalle =
"PORTES",
739 ImporteUnitario = importeUnitario.ToString(_mascara8decimales),
740 Cantidad = 1d.ToString(GetMascaraEspecificaPorTerritorio(
"Cantidad", _mascaraParaCertificacion)),
741 Descuento = decimal.Zero.ToString(GetMascaraEspecificaPorTerritorio(
"Descuento", _mascaraParaCertificacion)),
742 ImporteTotal = importeTotal.ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion)),
744 lineaDetalleIncluidas.Add(lineaPortes);
758 var hayDtoProntoPago = listaDatosAlbaranes.Any(alb => !(alb._Pie._DtoPP.Equals(decimal.Zero)));
759 if (hayDtoProntoPago)
761 var importeUnitario = decimal.Zero;
762 var importeTotal = decimal.Zero;
766 var importesNoSujetos = decimal.Zero;
767 var importesSujetos = decimal.Zero;
768 var importeDetalle = decimal.Zero;
771 if (EsSujeta(ObtenerTipoOperacionFactura(XML_generator_parameters.NumDocumentoBorrador, iva._Codigo)))
773 importesSujetos += iva._Base;
777 importesNoSujetos += iva._Base + iva._TotalIva;
780 importeDetalle = lineaDetalleIncluidas.Sum(ld => ((_DeTextoADecimal(ld.Cantidad) * _DeTextoADecimal(ld.ImporteUnitario)) - _DeTextoADecimal(ld.Descuento)));
781 importeUnitario = ToMonedaEmpresa(datosFactura, (importesNoSujetos + importesSujetos)) - importeDetalle;
784 var impoteTotalDetallesIncluidos = lineaDetalleIncluidas.Sum(ld => _DeTextoADecimal(ld.ImporteTotal));
786 importeTotal = (ToMonedaEmpresa(datosFactura, GetImporteTotalFactura(datosFactura, datosEntregas)) - impoteTotalDetallesIncluidos);
788 if (!importeTotal.Equals(decimal.Zero) || !importeUnitario.Equals(decimal.Zero))
790 var lineaProntoPago =
new IDDetalleFacturaTypeCom
792 DescripcionDetalle =
"DESCUENTO PRONTO PAGO",
793 ImporteUnitario = importeUnitario.ToString(_mascara8decimales),
794 Cantidad = 1d.ToString(GetMascaraEspecificaPorTerritorio(
"Cantidad", _mascaraParaCertificacion)),
795 Descuento = decimal.Zero.ToString(GetMascaraEspecificaPorTerritorio(
"Descuento", _mascaraParaCertificacion)),
796 ImporteTotal = importeTotal.ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion))
798 lineaDetalleIncluidas.Add(lineaProntoPago);
802 #endregion Pronto Pago 805 #region Entregas a cuenta 808 if (datosEntregas.HayEntregasAplicadas)
811 foreach (EntregasEnFactura.EntregaEnFactura entrega in datosEntregas.Entregas)
813 var lineaEntrega =
new IDDetalleFacturaTypeCom
815 DescripcionDetalle = $
"ANTICIPO DESCONTADO TIPO IVA {entrega.CodigoIva}",
816 Cantidad = 1d.ToString(GetMascaraEspecificaPorTerritorio(
"Cantidad", _mascaraParaCertificacion)),
817 ImporteUnitario = (-1 * entrega.Base).ToString(_mascara8decimales),
818 Descuento = decimal.Zero.ToString(GetMascaraEspecificaPorTerritorio(
"Descuento", _mascaraParaCertificacion)),
819 ImporteTotal = (-1 * entrega.Importe).ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion))
821 lineaDetalleIncluidas.Add(lineaEntrega);
825 #endregion Entregas a cuenta 828 if (lineaDetalleIncluidas.Count > 1000)
830 ErrorMessage =
"Imposible certificar la factura. " + Environment.NewLine + Environment.NewLine +
831 "Se ha superado el número máximo de líneas de 1000, admitido para el envío a la Hacienda Foral. " + Environment.NewLine +
832 "Además de las líneas indicadas en el documento, se añaden líneas automáticas con portes, descuentos y ecotasas. " +
833 "Por favor, revise la factura para dividirla en varias. ";
838 lineaDetalleIncluidas.ForEach(ld => ticketBaiCom.Factura.DatosFactura.AddDetalleFactura(ld));
840 #region Identificando Regimen Especial Trascendencia 843 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Identificando Regimen Especial Trascendencia");
844 GenerarClaveRegimenEspecialTrascendencia(facRow, XML_generator_parameters,
846 lnComuni_c: Convert.ToInt32(datosFactura.
_oCliente._TipoCliente),
847 lcNif: NormalizarCaracteresNif(datosFactura.
_oCliente._NIF),
848 llCritCaja: datosFactura.
_Recc,
850 ClaveRegimenEspecialOTrascendencia: out
string ClaveRegimenIvaOpTrascendencia,
851 ClaveRegimenEspecialOTrascendenciaAdicional1: out
string ClaveRegimenIvaOpTrascendenciaAdicional);
852 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Resultado Regimen Especial Trascendencia " + ClaveRegimenIvaOpTrascendencia.ToString());
853 if (
string.IsNullOrWhiteSpace(ClaveRegimenIvaOpTrascendenciaAdicional))
855 ticketBaiCom.Factura.DatosFactura.Claves =
new IDClaveTypeCom[]
859 ClaveRegimenIvaOpTrascendencia =
"Item" + ClaveRegimenIvaOpTrascendencia.Trim()
865 ticketBaiCom.Factura.DatosFactura.Claves =
new IDClaveTypeCom[]
869 ClaveRegimenIvaOpTrascendencia =
"Item" + ClaveRegimenIvaOpTrascendencia.Trim()
873 ClaveRegimenIvaOpTrascendencia =
"Item" + ClaveRegimenIvaOpTrascendenciaAdicional.Trim()
878 #endregion Identificando Regimen Especial Trascendencia 881 bool RecargoFinancieroPendienteDeDescontar = datosFactura.
_TotalRecFinan != 0;
884 ticketBaiCom.Factura.TipoDesglose =
new TipoDesgloseTypeCom();
886 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Procesando Lineas de IVA Factura");
892 nifCli = destinatario.Item_NIF;
893 nifCli = NormalizarCaracteresNif(nifCli);
899 nifCli = destinatario.Item_IDOtro.ID;
904 var lnOperacion = Convert.ToInt16(facRow[
"operacion"]);
906 string TipoNoExenta =
"";
908 bool bloqueSIIEXENTAinsertado =
false;
910 bool tratamientoRebu = lnOperacion.Equals(15) && datosFactura.
_TipoIvaLineas.Count == 2 && datosFactura.
_TipoIvaLineas.Count(i => i._Iva0).Equals(1);
914 if (tratamientoRebu && iva._Iva0)
916 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Omitiendo registro para IVA " + iva._Codigo +
" (iva 0%) en tratamiento REBU ");
920 eTipoOperacionEmitidasSII tipoOpIva = ObtenerTipoOperacionFactura(XML_generator_parameters.NumDocumentoBorrador, iva._Codigo);
921 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: TipoOperacionSII obtenido para IVA " + iva._Codigo +
" -> " + tipoOpIva.ToString());
924 var lnComuni_c = Convert.ToInt32(datosFactura.
_oCliente._TipoCliente);
925 var comunitario = (lnComuni_c == 2);
926 var extracomunitario = (lnComuni_c == 3);
927 var llIvaNoCero = iva._PrcIva > 0;
928 var ivaPrestacionDeServicios = ObtenerSiiIva303(XML_generator_parameters.NumDocumentoBorrador,
"DEV_IS", iva._Codigo);
929 var llTratamientoNacinal = (nifCli.StartsWith(
"N") || lnComuni_c == 2 || lnComuni_c == 3) && (llIvaNoCero || ivaPrestacionDeServicios);
931 #region Evaluar condiciones IVA EUROPEO 934 var IvaEuropeoConDesgloseOperacion =
false;
935 var IvaEuropeoConDesgloseFactura =
false;
936 var noEsClienteNacional = (nifCli.StartsWith(
"N") || lnComuni_c == 2 || lnComuni_c == 3);
937 var clienteNacional = !noEsClienteNacional;
938 var facturaSinIdentificaciónDelDestinatario = Convert.ToBoolean(facRow[
"SIIF1NOID"]);
939 var destinatarioIdentificado = !facturaSinIdentificaciónDelDestinatario;
941 var IvaServicioSujeto = ivaPrestacionDeServicios && EsSujeta(tipoOpIva);
942 var IvaServicioNoSujeto = ivaPrestacionDeServicios && EsNoSujeta(tipoOpIva);
943 var IvaNoServicioSujeto = !ivaPrestacionDeServicios && EsSujeta(tipoOpIva);
944 var IvaNoServicioNoSujeto = !ivaPrestacionDeServicios && EsNoSujeta(tipoOpIva);
947 var IvaEuropeoDesgloseOperacion_ServioNoSujeto = (lnOperacion == 32 || lnOperacion == 33 || lnOperacion == 35) && noEsClienteNacional && IvaServicioNoSujeto;
950 var IvaEuropeoDesgloseOperacion_NoServicioNoSujeto = (lnOperacion == 32 || lnOperacion == 34 || lnOperacion == 35) && noEsClienteNacional && destinatarioIdentificado && IvaNoServicioNoSujeto;
952 IvaEuropeoConDesgloseOperacion = IvaEuropeoDesgloseOperacion_ServioNoSujeto || IvaEuropeoDesgloseOperacion_NoServicioNoSujeto;
955 var IvaEuropeoDesgloseFactura_NoServicioNoSujeto = (lnOperacion == 32 || lnOperacion == 34 || lnOperacion == 35) && noEsClienteNacional && facturaSinIdentificaciónDelDestinatario && IvaNoServicioNoSujeto;
958 var IvaEuropeoDesgloseFactura_ServicioSujeto = (lnOperacion == 32 || lnOperacion == 34) && clienteNacional && IvaServicioSujeto;
961 var IvaEuropeoDesgloseFactura_NoServicioSujeto = (lnOperacion == 32 || lnOperacion == 34) && clienteNacional && IvaNoServicioSujeto;
963 IvaEuropeoConDesgloseFactura = IvaEuropeoDesgloseFactura_NoServicioNoSujeto ||
964 IvaEuropeoDesgloseFactura_ServicioSujeto ||
965 IvaEuropeoDesgloseFactura_NoServicioSujeto;
968 IvaEuropeoConDesgloseOperacion =
false;
969 IvaEuropeoDesgloseOperacion_ServioNoSujeto =
false;
970 IvaEuropeoDesgloseOperacion_NoServicioNoSujeto =
false;
971 IvaEuropeoConDesgloseFactura =
false;
972 IvaEuropeoDesgloseFactura_NoServicioNoSujeto =
false;
973 IvaEuropeoDesgloseFactura_ServicioSujeto =
false;
974 IvaEuropeoDesgloseFactura_NoServicioSujeto =
false;
977 #endregion Evaluar condiciones IVA EUROPEO 979 if (((
string.IsNullOrEmpty(nifCli) || !nifCli.StartsWith(
"N"))
983 && !llTratamientoNacinal
984 && !IvaEuropeoConDesgloseOperacion
986 || IvaEuropeoConDesgloseFactura
987 || ((idFiscal == 1 || idFiscal == 0 || idFiscal == 7) && extracomunitario)
988 ||
string.IsNullOrEmpty(nifCli)
991 #region Desglose por factura 993 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType == null)
994 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType =
new DesgloseFacturaTypeCom();
996 !IvaEuropeoDesgloseFactura_NoServicioNoSujeto)
997 || IvaEuropeoDesgloseFactura_ServicioSujeto || IvaEuropeoDesgloseFactura_NoServicioSujeto
1002 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta == null)
1003 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta =
new SujetaTypeCom();
1005 !IvaEuropeoDesgloseFactura_ServicioSujeto &&
1006 !IvaEuropeoDesgloseFactura_NoServicioSujeto
1011 if (facRow[
"SIIEXENTA"] == null ||
string.IsNullOrWhiteSpace(facRow[
"SIIEXENTA"].ToString()))
1013 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por factura exento desde columna IVA");
1015 var causaExencion =
string.Empty;
1016 if (facRow[
"SIICASUEX"] == null ||
string.IsNullOrWhiteSpace(facRow[
"SIICASUEX"].ToString()))
1019 if (lnOperacion.Equals(19))
1020 causaExencion =
"E6";
1022 causaExencion =
"E1";
1026 causaExencion =
"E" + facRow[
"SIICASUEX"].ToString().Trim();
1029 var detalle =
new DetalleExentaTypeCom
1031 CausaExencion = causaExencion,
1032 BaseImponible = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas)
1034 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.AddExenta(detalle);
1038 if (!bloqueSIIEXENTAinsertado)
1040 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por factura exento desde columna SIIEXENTA");
1041 var causas = GetAllSimpleValuesFromXML(facRow[
"SIIEXENTA"].ToString(),
"causa");
1042 var bases = GetAllSimpleValuesFromXML(facRow[
"SIIEXENTA"].ToString(),
"base");
1043 bases = CalcularBasesExentasAplicandoEntregas(bases, datosFactura, datosEntregas);
1044 for (
int i = 0; i < bases.Count; i++)
1046 var detalle =
new DetalleExentaTypeCom();
1047 if (causas[i] ==
"7")
1048 detalle.CausaExencion =
"E6";
1050 detalle.CausaExencion =
"E" + causas[i].Trim();
1051 detalle.BaseImponible = bases[i].Trim();
1052 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.AddExenta(detalle);
1054 bloqueSIIEXENTAinsertado =
true;
1058 #endregion Iva exento 1062 #region Iva no exento 1064 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por factura regular desde columna IVA");
1067 if (IvaEuropeoDesgloseFactura_ServicioSujeto || IvaEuropeoDesgloseFactura_NoServicioSujeto)
1069 TipoNoExenta =
"S1";
1073 if (ivaPrestacionDeServicios)
1090 if (lnOperacion.Equals(19) || lnOperacion.Equals(36) || lnOperacion.Equals(37))
1092 TipoNoExenta =
"S1";
1096 TipoNoExenta =
"S2";
1111 TipoNoExenta =
"S1";
1116 DetalleNoExentaTypeCom detalle;
1117 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta == null ||
1118 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta.Length == 0 ||
1119 (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta.Length == 1 && ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0].TipoNoExenta != TipoNoExenta))
1121 detalle =
new DetalleNoExentaTypeCom
1123 TipoNoExenta = TipoNoExenta
1125 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.AddNoExenta(detalle);
1129 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0].TipoNoExenta == TipoNoExenta)
1130 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0] as DetalleNoExentaTypeCom;
1132 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[1] as DetalleNoExentaTypeCom;
1135 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Leidas bases de IVA. Rellenando DesgloseIVA componente");
1138 var detalleIva = GenerarDetalleIvaTypoCom(iva, datosFactura, datosEntregas);
1139 detalle.AddDesgloseIVA(detalleIva);
1141 #endregion Iva no exento 1144 #endregion Iva sujeto 1148 #region Iva no sujeto 1150 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por factura no sujeto desde columna IVA");
1152 var detalle =
new DetalleNoSujetaCom();
1154 if (IvaEuropeoDesgloseFactura_NoServicioNoSujeto)
1156 detalle.Causa =
"RL";
1157 detalle.Importe = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas);
1161 detalle.Causa = (Convert.ToInt16(facRow[
"SIICANOSU"]) - 1).ToString().Trim();
1162 detalle.Importe = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas);
1164 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.AddNoSujeta(detalle);
1166 #endregion Iva no sujeto 1169 #endregion Desglose por factura 1173 #region Desglose por tipo operación 1175 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType == null)
1177 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType =
new DesgloseTipoOperacionTypeCom();
1181 iva._IvaServicios ||
1182 ivaPrestacionDeServicios ||
1183 IvaEuropeoDesgloseOperacion_ServioNoSujeto)
1184 && !IvaEuropeoDesgloseOperacion_NoServicioNoSujeto)
1186 #region Iva de prestacion de servicios 1188 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios == null)
1189 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios =
new PrestacionServiciosCom();
1192 llTratamientoNacinal &&
1193 !IvaEuropeoDesgloseOperacion_ServioNoSujeto
1198 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta == null)
1199 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta =
new SujetaTypeCom();
1204 if (facRow[
"SIIEXENTA"] == null ||
string.IsNullOrWhiteSpace(facRow[
"SIIEXENTA"].ToString()))
1206 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por factura exento desde columna IVA");
1208 var causaExencion =
string.Empty;
1209 if (facRow[
"SIICASUEX"] == null ||
string.IsNullOrWhiteSpace(facRow[
"SIICASUEX"].ToString()))
1212 if (lnOperacion.Equals(19))
1213 causaExencion =
"E6";
1215 causaExencion =
"E1";
1219 causaExencion =
"E" + facRow[
"SIICASUEX"].ToString().Trim();
1222 var detalle =
new DetalleExentaTypeCom
1224 CausaExencion = causaExencion,
1225 BaseImponible = CalcularBaseIvaAplicandoEntregas(iva,datosFactura,datosEntregas)
1228 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.AddExenta(detalle);
1232 if (!bloqueSIIEXENTAinsertado)
1234 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por factura exento desde columna SIIEXENTA");
1235 var causas = GetAllSimpleValuesFromXML(facRow[
"SIIEXENTA"].ToString(),
"causa");
1236 var bases = GetAllSimpleValuesFromXML(facRow[
"SIIEXENTA"].ToString(),
"base");
1237 bases = CalcularBasesExentasAplicandoEntregas(bases, datosFactura, datosEntregas);
1238 for (
int i = 0; i < bases.Count; i++)
1240 var detalle =
new DetalleExentaTypeCom();
1241 if (causas[i] ==
"7")
1242 detalle.CausaExencion =
"E6";
1244 detalle.CausaExencion =
"E" + causas[i].Trim();
1245 detalle.BaseImponible = bases[i].Trim();
1246 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.AddExenta(detalle);
1248 bloqueSIIEXENTAinsertado =
true;
1252 #endregion Iva exento 1256 #region Iva no exento 1258 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por factura regular desde columna IVA");
1261 if (ivaPrestacionDeServicios)
1278 if (lnOperacion.Equals(19) || lnOperacion.Equals(36) || lnOperacion.Equals(37))
1280 TipoNoExenta =
"S1";
1284 TipoNoExenta =
"S2";
1300 TipoNoExenta =
"S1";
1303 DetalleNoExentaTypeCom detalle;
1304 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta == null ||
1305 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta.Length == 0 ||
1306 (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta.Length == 1 &&
1307 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta[0].TipoNoExenta != TipoNoExenta))
1309 detalle =
new DetalleNoExentaTypeCom
1311 TipoNoExenta = TipoNoExenta
1313 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.AddNoExenta(detalle);
1317 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta[0].TipoNoExenta == TipoNoExenta)
1318 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta[0] as DetalleNoExentaTypeCom;
1320 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta[1] as DetalleNoExentaTypeCom;
1323 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Leidas bases de IVA. Rellenando DesgloseIVA componente");
1326 var detalleIva = GenerarDetalleIvaTypoCom(iva, datosFactura, datosEntregas);
1327 detalle.AddDesgloseIVA(detalleIva);
1329 #endregion Iva no exento 1332 #endregion Iva sujeto 1337 #region Iva no sujeto 1339 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por operacion de servicios no sujeto desde columna IVA");
1341 var detalle =
new DetalleNoSujetaCom();
1343 if (IvaEuropeoDesgloseOperacion_ServioNoSujeto)
1345 detalle.Causa =
"RL";
1346 detalle.Importe = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas);
1350 detalle.Causa = (Convert.ToInt16(facRow[
"SIICANOSU"]) - 1).ToString().Trim();
1351 detalle.Importe = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas);
1355 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.AddNoSujeta(detalle);
1357 #endregion Iva no sujeto 1360 #endregion Iva de prestacion de servicios 1364 #region Iva de entrega de bienes 1366 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega == null)
1367 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega =
new EntregaCom();
1372 && !IvaEuropeoDesgloseOperacion_NoServicioNoSujeto)
1376 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta == null)
1377 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta =
new SujetaTypeCom();
1379 if (tipoOpIva !=
eTipoOperacionEmitidasSII.NacionalSujetaNoExenta && (comunitario || extracomunitario || NifClienteEsEspecialOperaciones(nifCli)))
1383 if (facRow[
"SIIEXENTA"] == null ||
string.IsNullOrWhiteSpace(facRow[
"SIIEXENTA"].ToString()))
1385 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por operacion de bienes exento desde columna IVA");
1386 var causaExencion =
string.Empty;
1387 if (facRow[
"SIICASUEX"] == null ||
string.IsNullOrWhiteSpace(facRow[
"SIICASUEX"].ToString()))
1390 if (lnOperacion.Equals(19))
1391 causaExencion =
"E6";
1393 causaExencion =
"E1";
1397 causaExencion =
"E" + facRow[
"SIICASUEX"].ToString().Trim();
1400 var detalle =
new DetalleExentaTypeCom
1402 CausaExencion = causaExencion,
1403 BaseImponible = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas)
1405 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.AddExenta(detalle);
1409 if (!bloqueSIIEXENTAinsertado)
1411 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por operacion de bienes exento desde columna SIIEXENTA");
1412 var causas = GetAllSimpleValuesFromXML(facRow[
"SIIEXENTA"].ToString(),
"causa");
1413 var bases = GetAllSimpleValuesFromXML(facRow[
"SIIEXENTA"].ToString(),
"base");
1414 bases = CalcularBasesExentasAplicandoEntregas(bases, datosFactura, datosEntregas);
1415 for (
int i = 0; i < bases.Count; i++)
1417 var detalle =
new DetalleExentaTypeCom();
1418 if (causas[i] ==
"7")
1419 detalle.CausaExencion =
"E6";
1421 detalle.CausaExencion =
"E" + causas[i].Trim();
1422 detalle.BaseImponible = bases[i].Trim();
1423 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.AddExenta(detalle);
1425 bloqueSIIEXENTAinsertado =
true;
1429 #endregion Iva exento 1433 #region Iva no exento 1437 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por tipo operación, Iva de entrega de bienes no exento");
1440 if (ivaPrestacionDeServicios)
1457 if (lnOperacion.Equals(19) || lnOperacion.Equals(36) || lnOperacion.Equals(37))
1459 TipoNoExenta =
"S1";
1463 TipoNoExenta =
"S2";
1479 TipoNoExenta =
"S1";
1483 DetalleNoExentaTypeCom detalle;
1484 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta == null ||
1485 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta.Length == 0 ||
1486 (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta.Length == 1 &&
1487 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta[0].TipoNoExenta != TipoNoExenta))
1489 detalle =
new DetalleNoExentaTypeCom
1491 TipoNoExenta = TipoNoExenta
1493 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.AddNoExenta(detalle);
1497 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta[0].TipoNoExenta == TipoNoExenta)
1498 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta[0] as DetalleNoExentaTypeCom;
1500 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta[1] as DetalleNoExentaTypeCom;
1503 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Leidas bases de IVA. Rellenando DesgloseIVA componente");
1506 var detalleIva = GenerarDetalleIvaTypoCom(iva, datosFactura, datosEntregas);
1507 detalle.AddDesgloseIVA(detalleIva);
1509 #endregion Iva no exento 1512 #endregion Iva no sujeto 1516 #region Iva no sujeto 1518 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Rellenando desglose IVA por operacion de bienes no sujeto desde columna IVA");
1519 var detalle =
new DetalleNoSujetaCom();
1521 if (IvaEuropeoDesgloseOperacion_NoServicioNoSujeto)
1523 detalle.Causa =
"RL";
1524 detalle.Importe = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas);
1528 detalle.Causa = (Convert.ToInt16(facRow[
"SIICANOSU"]) - 1).ToString().Trim();
1529 detalle.Importe = CalcularBaseIvaAplicandoEntregas(iva, datosFactura, datosEntregas);
1531 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.AddNoSujeta(detalle);
1533 #endregion Iva no sujeto 1536 #endregion Iva de entrega de bienes 1539 #endregion Desglose por tipo operación 1543 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Finalizado desglose IVA. Rellenando Huella TBAI");
1546 ticketBaiCom.HuellaTBAI =
new Sage.
ES.TicketBAI.Entities.ComModel.Invoice.V1_0.HuellaTBAICom();
1549 if (!
string.IsNullOrWhiteSpace(XML_generator_parameters.NumDocumentoAnterior) &&
1550 XML_generator_parameters.FechaDocumentoAnterior.HasValue &&
1551 !
string.IsNullOrWhiteSpace(XML_generator_parameters.FirmaDocumentoAnterior))
1554 ticketBaiCom.HuellaTBAI.EncadenamientoFacturaAnterior =
new EncadenamientoFacturaAnteriorTypeCom()
1556 SerieFacturaAnterior =
string.IsNullOrWhiteSpace(XML_generator_parameters.SerieDocumentoAnterior) ?
"" : XML_generator_parameters.SerieDocumentoAnterior.Trim(),
1557 NumFacturaAnterior =
string.IsNullOrWhiteSpace(XML_generator_parameters.NumDocumentoAnterior) ?
"" : XML_generator_parameters.NumDocumentoAnterior.Trim(),
1558 FechaExpedicionFacturaAnterior = (XML_generator_parameters.FechaDocumentoAnterior.HasValue) ? XML_generator_parameters.FechaDocumentoAnterior.Value.ToString(
"dd-MM-yyyy") :
"",
1559 SignatureValueFirmaFacturaAnterior = XML_generator_parameters.FirmaDocumentoAnterior.Trim()
1564 ticketBaiCom.HuellaTBAI.Software = Generar_SoftwareFacturacionTypeCom();
1566 ticketBaiCom.HuellaTBAI.NumSerieDispositivo = TerminalSerialNumber.Trim();
1569 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Creando la instancia del process del componente");
1571 var processObj = _process as object;
1572 var procesoCreado = CreateProcess(outputFilename, ticketBaiCom.Sujetos.Emisor.Territorio,
false,
false, ref processObj, Convert.ToDateTime(ticketBaiCom.Factura.CabeceraFactura.FechaExpedicionFactura));
1573 if (_process != null)
1575 _process.TicketBaiCom_V1_0 = ticketBaiCom;
1576 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Generando el XML desde el componente");
1577 if (_process.GenerateCom())
1580 GeneratedSignature = _process.SignatureString;
1581 GeneratedTBaiCode = _process.GetStringTBAI;
1582 GeneratedTBaiQR = _process.GetStringQR;
1583 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Todo correcto, devolviendo datos.");
1585 FacturasCreadasEstaSesionSinEnviar.Add(datosFactura.
_Factura.Trim());
1590 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Componente devuelve error: " + _process.MsgError);
1591 ErrorMessage =
"Proceso de generación terminado con incidencias. Consulta el fichero de Log para ver los detalles." + Environment.NewLine +
1592 Environment.NewLine +
"Error: " + _process.MsgError.Trim();
1596 catch (Exception ex)
1598 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataInternal: Excepción durante la generación." + ex.Message);
1599 DB.Registrar_Error(ex);
1600 ErrorMessage =
"Error durante el proceso de generación. Mensaje: " + ex.Message;
1604 if (ticketBaiCom != null)
1606 ticketBaiCom.Dispose();
1607 ticketBaiCom = null;
1621 private bool GenerateTicketBaiDataTicketsInternal(
string outputFilename,
ewDocVentaTPV datosTicket, TicketBai_XML_Parameters XML_generator_parameters)
1624 TicketBaiCom ticketBaiCom = null;
1625 GeneratedSignature =
"";
1627 GenerateTrace(
"ExportadorFactuCertXML: Entrando en GenerateTicketBaiDataTicketsInternal");
1632 ticketBaiCom =
new TicketBaiCom();
1636 ticketBaiCom.Cabecera =
new CabeceraCom()
1638 IDVersionTBAI =
"1.2" 1641 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando sujeto");
1643 ticketBaiCom.Sujetos =
new SujetosCom()
1646 Emisor =
new EmisorCom()
1648 NIF = NormalizarCaracteresNif(((ew.empresa.Empresa)EW_GLOBAL._Empresa)._CifTC),
1649 ApellidosNombreRazonSocial = ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._ApellidosTC +
" " + ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._NombreTC.Trim(),
1651 VariosDestinatarios =
"N",
1652 VariosDestinatariosSpecified =
true,
1653 EmitidaPorTercerosODestinatario =
"N",
1654 EmitidaPorTercerosODestinatarioSpecified =
true 1657 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Obteniendo datos de CONTADO");
1659 DataRow contadoRow = GetRowCompletoTabla(
"GESTION",
"CONTADO",
"EMPRESA = '" + EW_GLOBAL._GetVariable(
"wc_empresa").ToString() +
"' AND LETRA = '" + datosTicket.
_Letra +
"' AND NUMERO = '" + datosTicket.
_Numero +
"'");
1661 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Generando destinatario");
1663 var destinatario =
new IDDestinatarioCom
1665 ApellidosNombreRazonSocial = contadoRow != null && contadoRow[
"nombre"] != null && !
string.IsNullOrWhiteSpace(contadoRow[
"nombre"].ToString()) ? contadoRow[
"nombre"].ToString().Trim() :
"",
1666 CodigoPostal = contadoRow != null && contadoRow[
"codpost"] != null && !
string.IsNullOrWhiteSpace(contadoRow[
"codpost"].ToString()) ? contadoRow[
"codpost"].ToString().Trim() :
"",
1667 Direccion = contadoRow != null && contadoRow[
"direccion"] != null && !
string.IsNullOrWhiteSpace(contadoRow[
"direccion"].ToString()) ? contadoRow[
"direccion"].ToString().Trim() :
"",
1668 Item_NIF = contadoRow != null && contadoRow[
"CIF"] != null && !
string.IsNullOrWhiteSpace(contadoRow[
"CIF"].ToString()) ? NormalizarCaracteresNif(contadoRow[
"CIF"].ToString()) :
"" 1681 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Obtenemos datos de tabla FCTICKETS",
"Params: " + EW_GLOBAL._GetVariable(
"wc_empresa").ToString() +
" / " + EW_GLOBAL._GetVariable(
"wc_any").ToString().Trim() +
" / " + datosTicket.
_Letra +
" / " + datosTicket.
_Numero);
1682 DataRow fcTicketRow = GetRowCompletoTabla(FACTUCERT._NombreAddOn,
"FCTICKETS",
"EMPRESA = '" + EW_GLOBAL._GetVariable(
"wc_empresa").ToString() +
"' AND EJERCICIO = '" + EW_GLOBAL._GetVariable(
"wc_any").ToString().Trim() +
"' AND LETRA = '" + datosTicket.
_Letra +
"' AND NUMERO = '" + datosTicket.
_Numero +
"'");
1684 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Resultado consulta FCTICKETS -> " + (fcTicketRow != null).ToString());
1686 if (fcTicketRow == null)
1687 throw new Exception(
"No ha podido leerse correctamente la información de Factura Certificada del ticket " + datosTicket.
_Letra +
" / " + datosTicket.
_Numero);
1690 switch (fcTicketRow[
"territorio"].ToString())
1693 ticketBaiCom.Sujetos.Emisor.Territorio =
"2";
1696 ticketBaiCom.Sujetos.Emisor.Territorio =
"4";
1699 ticketBaiCom.Sujetos.Emisor.Territorio =
"3";
1702 ErrorMessage =
"El Ticket seleccionado para el envío no tiene correctamente especificado el Territorio de expedición. No es posible continuar con el envío.";
1705 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenado el territorio " + ticketBaiCom.Sujetos.Emisor.Territorio.ToString());
1707 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Generando la cabecera de la Factura");
1709 ticketBaiCom.Factura =
new FacturaCom()
1712 CabeceraFactura =
new ComModel.Invoice.V1_0.CabeceraFacturaTypeCom()
1715 NumFactura = datosTicket.
_Numero.Trim(),
1716 FechaExpedicionFactura = datosTicket.
_Fecha.ToString(
"dd-MM-yyyy"),
1717 HoraExpedicionFactura = XML_generator_parameters.HoraCertificacion?.Trim(),
1719 FacturaSimplificadaSpecified =
true,
1720 FacturaEmitidaSustitucionSimplificada =
"N",
1721 FacturaEmitidaSustitucionSimplificadaSpecified =
true 1725 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Viendo si es rectificativa a partir de SIIORIMOT");
1727 if (fcTicketRow[
"TBORITIP"] != null && fcTicketRow[
"TBORITIP"] != DBNull.Value && !
string.IsNullOrWhiteSpace(fcTicketRow[
"TBORITIP"].ToString()))
1729 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Es rectificativa, rellenamos datos");
1730 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa =
new FacturaRectificativaTypeCom()
1733 Tipo = fcTicketRow[
"TBORITIP"]?.ToString().Trim(),
1737 if (Convert.ToString(fcTicketRow[
"TBORITIP"]) ==
"S" && Convert.ToString(fcTicketRow[
"TBORICAN"]) ==
"2")
1740 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Datos facturas sustituidas a partir de D_TICKERECT");
1743 List<IDFacturaRectificadaSustituidaTypeCom> lstSustituidas =
new List<IDFacturaRectificadaSustituidaTypeCom>();
1745 decimal baseRectificada = decimal.Zero;
1746 decimal cuotaRectificada = decimal.Zero;
1747 decimal cuotaRecargoRectificada = decimal.Zero;
1751 baseRectificada += ticketRectificado.
Base_iva;
1752 cuotaRectificada += ticketRectificado.
Iva;
1753 cuotaRecargoRectificada += ticketRectificado.
Recargo;
1755 var fraSustituida =
new IDFacturaRectificadaSustituidaTypeCom
1759 FechaExpedicionFactura = ticketRectificado.
Fecha.ToString(
"dd-MM-yyyy")
1761 lstSustituidas.Add(fraSustituida);
1764 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa.ImporteRectificacionSustitutiva =
new ImporteRectificacionSustitutivaTypeCom()
1766 BaseRectificada = baseRectificada.ToString(_mascaraParaTicketBAI).Trim(),
1767 CuotaRectificada = cuotaRectificada.ToString(_mascaraParaTicketBAI).Trim(),
1768 CuotaRecargoRectificada = cuotaRecargoRectificada.ToString(_mascaraParaTicketBAI).Trim(),
1771 ticketBaiCom.Factura.CabeceraFactura.FacturasRectificadasSustituidas = lstSustituidas.ToArray();
1778 if (Convert.ToString(fcTicketRow[
"TBORITIP"]) ==
"S")
1780 ticketBaiCom.Factura.CabeceraFactura.FacturaRectificativa.ImporteRectificacionSustitutiva =
new ImporteRectificacionSustitutivaTypeCom()
1782 BaseRectificada = Convert.ToString(fcTicketRow[
"TBORITIP"]) ==
"S" ? Convert.ToDecimal(fcTicketRow[
"TBORIBAS"]).ToString(_mascaraParaCertificacion).Trim() :
"",
1783 CuotaRectificada = Convert.ToString(fcTicketRow[
"TBORITIP"]) ==
"S" ? Convert.ToDecimal(fcTicketRow[
"TBORIIVA"]).ToString(_mascaraParaCertificacion).Trim() :
"",
1784 CuotaRecargoRectificada = Convert.ToString(fcTicketRow[
"TBORITIP"]) ==
"S" ? Convert.ToDecimal(fcTicketRow[
"TBORIREC"]).ToString(_mascaraParaCertificacion).Trim() :
"",
1788 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Datos facturas sustituidas a partir de TBORIFRA");
1790 if (fcTicketRow[
"TBORIFRA"] != null && fcTicketRow[
"TBORIFRA"] != DBNull.Value && !
string.IsNullOrWhiteSpace(fcTicketRow[
"TBORIFRA"].ToString()))
1792 ticketBaiCom.Factura.CabeceraFactura.FacturasRectificadasSustituidas =
new IDFacturaRectificadaSustituidaTypeCom[]
1794 new IDFacturaRectificadaSustituidaTypeCom
1796 SerieFactura = (fcTicketRow[
"TBORIFRA"] != null && fcTicketRow[
"TBORIFRA"] != DBNull.Value && !
string.IsNullOrWhiteSpace(fcTicketRow[
"TBORIFRA"].ToString())) ? fcTicketRow[
"TBORIFRA"].ToString().Substring(0, 2).Trim() :
"",
1797 NumFactura = (fcTicketRow[
"TBORIFRA"] != null && fcTicketRow[
"TBORIFRA"] != DBNull.Value && !
string.IsNullOrWhiteSpace(fcTicketRow[
"TBORIFRA"].ToString())) ? fcTicketRow[
"TBORIFRA"].ToString().Substring(2).Trim() :
"",
1798 FechaExpedicionFactura = (fcTicketRow[
"TBORIFEC"] != null && fcTicketRow[
"TBORIFEC"] != DBNull.Value) ? ((DateTime)fcTicketRow[
"TBORIFEC"]).ToString(
"dd-MM-yyyy") :
"",
1805 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Generando el cuerpo de la Factura");
1807 ticketBaiCom.Factura.DatosFactura =
new DatosFacturaTypeCom()
1811 ImporteTotalFactura = GetImporteTotalFacturaTickets(datosTicket).ToString(_mascaraParaCertificacion),
1814 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Generando las líneas a partir de los Albaranes");
1818 var hayPuntoVerde = Convert.ToBoolean(EW_GLOBAL._GetVariable(
"wl_pverde")) && !datosTicket.
_Cabecera._oCliente._NoApli_Impuesto_Artic;
1820 #
if SuplidosDtosPortes
1822 var lineasTicket = datosTicket.
_Lineas.Where(l => l._Suplido.Equals(
false)).ToList();
1823 foreach (var linea
in lineasTicket)
1825 foreach (var linea
in datosTicket.
_Lineas)
1828 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Procesando línea albarán " + linea._Numero +
"-" + linea._Linea);
1830 if (!
string.IsNullOrWhiteSpace(linea._TipoIva))
1832 var lineaAlb =
new IDDetalleFacturaTypeCom
1834 DescripcionDetalle = linea._Definicion.Trim(),
1835 ImporteUnitario = linea._Precio.ToString(_mascara8decimales),
1836 ImporteTotal = linea._ImporteIva.ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion)),
1850 switch (linea._TipoPrec)
1854 if (linea._Peso != 0)
1855 cantidad = linea._Peso;
1857 cantidad = linea._Unidades;
1860 cantidad = linea._Cajas;
1863 if (linea._Peso != 0)
1864 cantidad = linea._Peso / 1000m;
1866 cantidad = linea._Unidades / 1000m;
1870 throw new NotSupportedException(
"El tipo de precio de la línea no está soportado");
1872 lineaAlb.Cantidad = cantidad.ToString(GetMascaraEspecificaPorTerritorio(
"Cantidad", _mascaraParaCertificacion));
1873 lineaAlb.Descuento = ((cantidad * linea._Precio) - linea._Importe).ToString(GetMascaraEspecificaPorTerritorio(
"Descuento", _mascaraParaCertificacion));
1875 ticketBaiCom.Factura.DatosFactura.AddDetalleFactura(lineaAlb);
1877 if (hayPuntoVerde && !linea._PuntoVerde.Equals(decimal.Zero) && !cantidad.Equals(decimal.Zero))
1879 var literalPVerde = ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._TituloImpuestoArticulo.TrimEnd();
1881 var lineaPVerde =
new IDDetalleFacturaTypeCom
1883 DescripcionDetalle = literalPVerde,
1884 Cantidad = (1).ToString(_mascara8decimales),
1885 ImporteUnitario = linea._PuntoVerde.ToString(_mascara8decimales),
1892 decimal porcentajeIva = tipoIva._IVA;
1894 decimal importeDelPuntoVerde = (linea._PuntoVerde * (1 + (porcentajeIva / 100m)));
1896 if (datosTicket.
_Cabecera._oCliente._Recargo)
1899 decimal porcentajeRecargo = tipoIva._Recargo;
1900 importeDelPuntoVerde += (linea._PuntoVerde * porcentajeRecargo / 100m);
1903 lineaPVerde.ImporteTotal = (importeDelPuntoVerde).ToString(GetMascaraEspecificaPorTerritorio(
"ImporteTotal", _mascaraParaCertificacion));
1905 ticketBaiCom.Factura.DatosFactura.AddDetalleFactura(lineaPVerde);
1913 string ClaveRegimenIvaOpTrascendencia = (datosTicket.
_Cabecera._Recc ?
"07" :
"01");
1914 string ClaveRegimenIvaOpTrascendenciaAdicional =
"";
1916 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando Regimen Especial Trascendencia 01 siempre");
1917 if (
string.IsNullOrWhiteSpace(ClaveRegimenIvaOpTrascendenciaAdicional))
1919 ticketBaiCom.Factura.DatosFactura.Claves =
new IDClaveTypeCom[]
1921 new IDClaveTypeCom()
1923 ClaveRegimenIvaOpTrascendencia =
"Item" + ClaveRegimenIvaOpTrascendencia
1929 ticketBaiCom.Factura.DatosFactura.Claves =
new IDClaveTypeCom[]
1931 new IDClaveTypeCom()
1933 ClaveRegimenIvaOpTrascendencia =
"Item" + ClaveRegimenIvaOpTrascendencia
1935 new IDClaveTypeCom()
1937 ClaveRegimenIvaOpTrascendencia =
"Item" + ClaveRegimenIvaOpTrascendenciaAdicional
1943 ticketBaiCom.Factura.TipoDesglose =
new TipoDesgloseTypeCom();
1945 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketInternal: Procesando Lineas de IVA Ticket");
1947 var codes = GetAllSimpleValuesFromJSON(fcTicketRow[
"IVA"].ToString(),
"_Codigo");
1948 var bases = GetAllSimpleValuesFromJSON(fcTicketRow[
"IVA"].ToString(),
"_Base");
1949 var ivas = GetAllSimpleValuesFromJSON(fcTicketRow[
"IVA"].ToString(),
"_PrcIva");
1950 var importes = GetAllSimpleValuesFromJSON(fcTicketRow[
"IVA"].ToString(),
"_ImpIva");
1951 var recargos = GetAllSimpleValuesFromJSON(fcTicketRow[
"IVA"].ToString(),
"_PrcRec");
1952 var importeRecargos = GetAllSimpleValuesFromJSON(fcTicketRow[
"IVA"].ToString(),
"_ImpRec");
1958 nifCli = destinatario.Item_NIF;
1959 nifCli = NormalizarCaracteresNif(nifCli);
1963 string TipoNoExenta =
"";
1965 for (
int i = 0; i < codes.Count; i++)
1967 string ivaCode = codes[i];
1968 decimal ivaPrc = Convert.ToDecimal(ivas[i]);
1971 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketInternal: TipoOperacionSII obtenido para IVA " + ivaCode +
" -> " + tipoOpIva.ToString());
1975 var llIvaNoCero = ivaPrc > decimal.Zero;
1976 var ivaPrestacionDeServicios = ObtenerSiiIva303(XML_generator_parameters.NumDocumentoBorrador,
"DEV_IS");
1977 var llTratamientoNacinal =
false;
1981 if (((
string.IsNullOrWhiteSpace(nifCli) || !nifCli.StartsWith(
"N"))
1986 ||
string.IsNullOrEmpty(nifCli)
1989 #region Desglose por factura 1991 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType == null)
1992 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType =
new DesgloseFacturaTypeCom();
1997 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta == null)
1998 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta =
new SujetaTypeCom();
2002 if (fcTicketRow[
"TBEXENTA"] == null ||
string.IsNullOrWhiteSpace(fcTicketRow[
"TBEXENTA"].ToString()))
2004 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por factura exento desde columna IVA");
2006 var detalle =
new DetalleExentaTypeCom
2008 CausaExencion =
"E" + fcTicketRow[
"TBCASUEX"].ToString().Trim(),
2009 BaseImponible = bases[i].Trim()
2011 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.AddExenta(detalle);
2015 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por factura exento desde columna TBEXENTA");
2016 var causas = GetAllSimpleValuesFromXML(fcTicketRow[
"TBEXENTA"].ToString(),
"causa");
2017 var basesEx = GetAllSimpleValuesFromXML(fcTicketRow[
"TBEXENTA"].ToString(),
"base");
2018 for (
int j = 0; j < basesEx.Count; j++)
2020 var detalle =
new DetalleExentaTypeCom();
2021 if (causas[j] ==
"7")
2022 detalle.CausaExencion =
"E6";
2024 detalle.CausaExencion =
"E" + causas[j].Trim();
2025 detalle.BaseImponible = basesEx[j].Trim();
2026 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.AddExenta(detalle);
2029 #endregion Iva exento 2033 #region Iva no exento 2034 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por factura regular desde columna IVA");
2037 if (ObtenerSiiIva303Ticket(datosTicket,
"DEV_IS"))
2046 TipoNoExenta =
"S2";
2056 TipoNoExenta =
"S1";
2061 DetalleNoExentaTypeCom detalle;
2062 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta == null ||
2063 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta.Length == 0 ||
2064 (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta.Length == 1 && ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0].TipoNoExenta != TipoNoExenta))
2066 detalle =
new DetalleNoExentaTypeCom
2068 TipoNoExenta = TipoNoExenta
2070 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.AddNoExenta(detalle);
2074 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0].TipoNoExenta == TipoNoExenta)
2075 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0] as DetalleNoExentaTypeCom;
2077 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[1] as DetalleNoExentaTypeCom;
2080 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Leidas bases de IVA. Rellenando DesgloseIVA componente");
2082 var detalleIva =
new DetalleIVATypeCom
2084 BaseImponible = bases[i].Trim(),
2085 TipoImpositivo = ivas[i].Trim(),
2086 CuotaImpuesto = importes[i].Trim()
2089 if (Convert.ToDecimal(recargos[i].Replace(
'.',
',')) != 0)
2091 detalleIva.TipoRecargoEquivalencia = recargos[i].Trim();
2092 detalleIva.CuotaRecargoEquivalencia = importeRecargos[i].Trim();
2096 if (datosTicket.
_Cabecera._oCliente._Recargo)
2102 if (tipoIva._IVA_Sujeto0)
2104 detalleIva.TipoRecargoEquivalencia = recargos[i].Trim();
2105 detalleIva.CuotaRecargoEquivalencia = importeRecargos[i].Trim();
2109 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificado =
"N";
2110 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificadoSpecified =
true;
2112 detalle.AddDesgloseIVA(detalleIva);
2114 #endregion Iva no exento 2117 #endregion Iva Sujeto 2121 #region Iva no sujeto 2123 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por factura no sujeto desde columna TBNOSUJE");
2125 var causas = GetAllSimpleValuesFromXML(fcTicketRow[
"TBNOSUJE"].ToString(),
"causa");
2126 var basesNS = GetAllSimpleValuesFromXML(fcTicketRow[
"TBNOSUJE"].ToString(),
"base");
2128 for (
int j = 0; j < basesNS.Count; j++)
2130 var detalle =
new DetalleNoSujetaCom
2132 Causa = (Convert.ToInt16(causas[j]) - 1).ToString().Trim(),
2133 Importe = basesNS[j].ToString().Trim()
2135 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.AddNoSujeta(detalle);
2138 #endregion Iva no sujeto 2141 #endregion Desglose por factura 2145 #region Desglose por tipo operación 2147 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType == null)
2148 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType =
new DesgloseTipoOperacionTypeCom();
2150 ObtenerSiiIva303Ticket(datosTicket,
"DEV_IS"))
2152 #region Iva de prestacion de servicios 2154 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios == null)
2155 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios =
new PrestacionServiciosCom();
2161 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta == null)
2162 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta =
new SujetaTypeCom();
2166 if (fcTicketRow[
"TBEXENTA"] == null ||
string.IsNullOrWhiteSpace(fcTicketRow[
"TBEXENTA"].ToString()))
2168 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA prestacion de servicios por factura exento desde columna IVA");
2170 var detalle =
new DetalleExentaTypeCom
2172 CausaExencion =
"E" + fcTicketRow[
"TBCASUEX"].ToString().Trim(),
2173 BaseImponible = bases[i].Trim()
2175 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.AddExenta(detalle);
2179 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA prestacion de servicios por factura exento desde columna TBEXENTA");
2180 var causas = GetAllSimpleValuesFromXML(fcTicketRow[
"TBEXENTA"].ToString(),
"causa");
2181 var basesEx = GetAllSimpleValuesFromXML(fcTicketRow[
"TBEXENTA"].ToString(),
"base");
2182 for (
int j = 0; j < basesEx.Count; j++)
2184 var detalle =
new DetalleExentaTypeCom();
2185 if (causas[j] ==
"7")
2186 detalle.CausaExencion =
"E6";
2188 detalle.CausaExencion =
"E" + causas[j].Trim();
2189 detalle.BaseImponible = basesEx[j].Trim();
2190 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.AddExenta(detalle);
2193 #endregion Iva exento 2197 #region Iva no exento 2198 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA prestacion de servicios por factura regular desde columna IVA");
2201 if (ObtenerSiiIva303Ticket(datosTicket,
"DEV_IS"))
2210 TipoNoExenta =
"S2";
2220 TipoNoExenta =
"S1";
2223 DetalleNoExentaTypeCom detalle;
2224 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta == null ||
2225 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta.Length == 0 ||
2226 (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta.Length == 1 && ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0].TipoNoExenta != TipoNoExenta))
2228 detalle =
new DetalleNoExentaTypeCom
2230 TipoNoExenta = TipoNoExenta
2232 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.AddNoExenta(detalle);
2236 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta[0].TipoNoExenta == TipoNoExenta)
2237 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta[0] as DetalleNoExentaTypeCom;
2239 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.Sujeta.NoExenta[1] as DetalleNoExentaTypeCom;
2242 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Leidas bases de IVA. Rellenando Desglose IVA prestacion de servicios componente");
2244 var detalleIva =
new DetalleIVATypeCom
2246 BaseImponible = bases[i].Trim(),
2247 TipoImpositivo = ivas[i].Trim(),
2248 CuotaImpuesto = importes[i].Trim()
2250 if (Convert.ToDecimal(recargos[i].Replace(
'.',
',')) != 0)
2252 detalleIva.TipoRecargoEquivalencia = recargos[i].Trim();
2253 detalleIva.CuotaRecargoEquivalencia = importeRecargos[i].Trim();
2257 if (datosTicket.
_Cabecera._oCliente._Recargo)
2263 if (tipoIva._IVA_Sujeto0)
2265 detalleIva.TipoRecargoEquivalencia = recargos[i].Trim();
2266 detalleIva.CuotaRecargoEquivalencia = importeRecargos[i].Trim();
2270 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificado =
"N";
2271 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificadoSpecified =
true;
2273 detalle.AddDesgloseIVA(detalleIva);
2275 #endregion Iva no exento 2278 #endregion Iva sujeto 2282 #region Iva no sujeto 2284 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por operacion de servicios no sujeto desde columna TBNOSUJE");
2285 var causas = GetAllSimpleValuesFromXML(fcTicketRow[
"TBNOSUJE"].ToString(),
"causa");
2286 var basesNS = GetAllSimpleValuesFromXML(fcTicketRow[
"TBNOSUJE"].ToString(),
"base");
2288 for (
int j = 0; j < basesNS.Count; j++)
2290 var detalle =
new DetalleNoSujetaCom
2292 Causa = (Convert.ToInt16(causas[j]) - 1).ToString().Trim(),
2293 Importe = basesNS[j].ToString().Trim()
2295 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.PrestacionServicios.AddNoSujeta(detalle);
2298 #endregion Iva no sujeto 2301 #endregion Iva de prestacion de servicios 2305 #region Iva de entrega de bienes 2307 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega == null)
2308 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega =
new EntregaCom();
2316 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta == null)
2317 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta =
new SujetaTypeCom();
2323 if (fcTicketRow[
"TBEXENTA"] == null ||
string.IsNullOrWhiteSpace(fcTicketRow[
"TBEXENTA"].ToString()))
2325 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por operacion de bienes exento desde columna IVA");
2326 var detalle =
new DetalleExentaTypeCom
2328 CausaExencion =
"E" + fcTicketRow[
"TBCASUEX"].ToString().Trim(),
2329 BaseImponible = bases[i].Trim()
2331 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.AddExenta(detalle);
2335 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por operacion de bienes exento desde columna TBEXENTA");
2336 var causas = GetAllSimpleValuesFromXML(fcTicketRow[
"TBEXENTA"].ToString(),
"causa");
2337 var basesEx = GetAllSimpleValuesFromXML(fcTicketRow[
"TBEXENTA"].ToString(),
"base");
2338 for (
int j = 0; j < basesEx.Count; j++)
2340 var detalle =
new DetalleExentaTypeCom();
2341 if (causas[j] ==
"7")
2342 detalle.CausaExencion =
"E6";
2344 detalle.CausaExencion =
"E" + causas[j].Trim();
2345 detalle.BaseImponible = basesEx[j].Trim();
2346 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.AddExenta(detalle);
2350 #endregion Iva exento 2355 #region Iva no exento 2358 if (ObtenerSiiIva303Ticket(datosTicket,
"DEV_IS"))
2367 TipoNoExenta =
"S2";
2377 TipoNoExenta =
"S1";
2380 DetalleNoExentaTypeCom detalle;
2381 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta == null ||
2382 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta.Length == 0 ||
2383 (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta.Length == 1 && ticketBaiCom.Factura.TipoDesglose.Item_DesgloseFacturaType.Sujeta.NoExenta[0].TipoNoExenta != TipoNoExenta))
2385 detalle =
new DetalleNoExentaTypeCom
2387 TipoNoExenta = TipoNoExenta
2389 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.AddNoExenta(detalle);
2393 if (ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta[0].TipoNoExenta == TipoNoExenta)
2394 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta[0] as DetalleNoExentaTypeCom;
2396 detalle = ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.Sujeta.NoExenta[1] as DetalleNoExentaTypeCom;
2399 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Leidas bases de IVA. Rellenando Desglose IVA entrega de bienes componente");
2401 var detalleIva =
new DetalleIVATypeCom
2403 BaseImponible = bases[i].Trim(),
2404 TipoImpositivo = ivas[i].Trim(),
2405 CuotaImpuesto = importes[i].Trim()
2407 if (Convert.ToDecimal(recargos[i].Replace(
'.',
',')) != 0)
2409 detalleIva.TipoRecargoEquivalencia = recargos[i].Trim();
2410 detalleIva.CuotaRecargoEquivalencia = importeRecargos[i].Trim();
2414 if (datosTicket.
_Cabecera._oCliente._Recargo)
2420 if (tipoIva._IVA_Sujeto0)
2422 detalleIva.TipoRecargoEquivalencia = recargos[i].Trim();
2423 detalleIva.CuotaRecargoEquivalencia = importeRecargos[i].Trim();
2427 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificado =
"N";
2428 detalleIva.OperacionEnRecargoDeEquivalenciaORegimenSimplificadoSpecified =
true;
2430 detalle.AddDesgloseIVA(detalleIva);
2432 #endregion Iva no exento 2436 #endregion Iva sujeto 2440 #region Iva no sujeto 2442 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Rellenando desglose IVA por operacion de bienes no sujeto desde columna TBNOSUJE");
2443 var causas = GetAllSimpleValuesFromXML(fcTicketRow[
"TBNOSUJE"].ToString(),
"causa");
2444 var basesNS = GetAllSimpleValuesFromXML(fcTicketRow[
"TBNOSUJE"].ToString(),
"base");
2446 for (
int j = 0; j < basesNS.Count; j++)
2448 var detalle =
new DetalleNoSujetaCom
2450 Causa = (Convert.ToInt16(causas[j]) - 1).ToString().Trim(),
2451 Importe = basesNS[j].ToString().Trim()
2453 ticketBaiCom.Factura.TipoDesglose.Item_DesgloseTipoOperacionType.Entrega.AddNoSujeta(detalle);
2456 #endregion Iva no sujeto 2459 #endregion Iva de entrega de bienes 2462 #endregion Desglose por tipo operación 2466 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Finalizado desglose IVA. Rellenando Huella TBAI");
2469 ticketBaiCom.HuellaTBAI =
new ComModel.Invoice.V1_0.HuellaTBAICom();
2471 if (!
string.IsNullOrWhiteSpace(XML_generator_parameters.SerieDocumentoAnterior) &&
2472 !
string.IsNullOrWhiteSpace(XML_generator_parameters.NumDocumentoAnterior) &&
2473 XML_generator_parameters.FechaDocumentoAnterior.HasValue &&
2474 !
string.IsNullOrWhiteSpace(XML_generator_parameters.FirmaDocumentoAnterior))
2477 ticketBaiCom.HuellaTBAI.EncadenamientoFacturaAnterior =
new EncadenamientoFacturaAnteriorTypeCom()
2479 SerieFacturaAnterior =
string.IsNullOrWhiteSpace(XML_generator_parameters.SerieDocumentoAnterior) ?
"" : XML_generator_parameters.SerieDocumentoAnterior.Trim(),
2480 NumFacturaAnterior =
string.IsNullOrWhiteSpace(XML_generator_parameters.NumDocumentoAnterior) ?
"" : XML_generator_parameters.NumDocumentoAnterior.Trim(),
2481 FechaExpedicionFacturaAnterior = (XML_generator_parameters.FechaDocumentoAnterior.HasValue) ? XML_generator_parameters.FechaDocumentoAnterior.Value.ToString(
"dd-MM-yyyy") :
"",
2482 SignatureValueFirmaFacturaAnterior = XML_generator_parameters.FirmaDocumentoAnterior.Trim()
2487 ticketBaiCom.HuellaTBAI.Software = Generar_SoftwareFacturacionTypeCom();
2489 ticketBaiCom.HuellaTBAI.NumSerieDispositivo = TerminalSerialNumber.Trim();
2492 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Creando la instancia del process del componente");
2494 var processObj = _process as object;
2495 CreateProcess(outputFilename, ticketBaiCom.Sujetos.Emisor.Territorio,
false,
false, ref processObj, Convert.ToDateTime(ticketBaiCom.Factura.CabeceraFactura.FechaExpedicionFactura));
2496 if (_process != null)
2498 _process.TicketBaiCom_V1_0 = ticketBaiCom;
2499 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Generando el XML desde el componente");
2500 if (_process.GenerateCom())
2503 GeneratedSignature = _process.SignatureString;
2504 GeneratedTBaiCode = _process.GetStringTBAI;
2505 GeneratedTBaiQR = _process.GetStringQR;
2506 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Todo correcto, devolviendo datos.");
2508 FacturasCreadasEstaSesionSinEnviar.Add(datosTicket.
_Letra + datosTicket.
_Numero);
2513 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Componente devuelve error." + _process.MsgError);
2514 ErrorMessage =
"Proceso de generación terminado con incidencias. Consulta el fichero de Log para ver los detalles." + Environment.NewLine +
2515 Environment.NewLine +
"Error: " + _process.MsgError.Trim();
2519 catch (Exception ex)
2521 GenerateTrace(
"ExportadorFactuCertXML.GenerateTicketBaiDataTicketsInternal: Excepción durante la generación." + ex.Message);
2522 DB.Registrar_Error(ex);
2523 ErrorMessage =
"Error durante el proceso de generación. Mensaje: " + ex.Message;
2527 if (ticketBaiCom != null)
2529 ticketBaiCom.Dispose();
2530 ticketBaiCom = null;
2543 private bool GenerateAnulationDataInternal(
string outputFilename, HuellaDetalle huellaFraOriginal)
2547 AnulaTicketBaiCom anulaTicketBaiCom = null;
2548 GeneratedSignature =
"";
2550 var nifEmisor = NormalizarCaracteresNif(((ew.empresa.Empresa)EW_GLOBAL._Empresa)._CifTC);
2555 #region Generar objeto COM Anulación 2558 anulaTicketBaiCom =
new AnulaTicketBaiCom()
2561 Cabecera =
new CabeceraCom()
2563 IDVersionTBAI =
"1.2" 2565 IDFactura =
new IDFacturaCom()
2568 Emisor =
new EmisorCom()
2571 ApellidosNombreRazonSocial = ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._ApellidosTC +
" " + ((ew.empresa.Empresa)EW_GLOBAL._Empresa)._NombreTC.Trim()
2574 CabeceraFactura =
new ComModel.Annulation.V1_0.CabeceraFacturaTypeCom()
2577 NumFactura = huellaFraOriginal.documento.TrimEnd(),
2578 FechaExpedicionFactura = Convert.ToDateTime(huellaFraOriginal.fecha).ToString(
"dd-MM-yyyy")
2583 HuellaTBAI =
new ComModel.Annulation.V1_0.HuellaTBAICom()
2586 Software = Generar_SoftwareFacturacionTypeCom(),
2587 NumSerieDispositivo = TerminalSerialNumber.Trim()
2591 #endregion Generar objeto COM Anulación 2593 #region Obtener la firma del componente 2596 var processObj = _process as object;
2597 CreateProcess(outputFilename, GetTerritorioEnvioTBai(
true),
false,
true, ref processObj, Convert.ToDateTime(anulaTicketBaiCom.IDFactura.CabeceraFactura.FechaExpedicionFactura));
2598 if (_process != null)
2602 _process.AnulaTicketBaiCom_V1_0 = anulaTicketBaiCom;
2603 if (_process.GenerateCom())
2606 GeneratedSignature = _process.SignatureString;
2607 GeneratedTBaiCode = _process.GetStringTBAI;
2608 GeneratedTBaiQR = _process.GetStringQR;
2610 GenerateTrace(
"ExportadorFactuCertXML.GenerateAnulationDataInternal: Todo correcto, devolviendo datos.");
2615 GenerateTrace(
"ExportadorFactuCertXML.GenerateAnulationDataInternal: Componente devuelve error." + _process.MsgError);
2616 ErrorMessage =
"Proceso de generación terminado con incidencias. Consulta el fichero de Log para ver los detalles." + Environment.NewLine + Environment.NewLine +
"Error: " + _process.MsgError.Trim();
2620 #endregion Obtener la firma del componente 2622 catch (Exception ex)
2624 DB.Registrar_Error(ex);
2625 ErrorMessage =
"Error durante el proceso de anulación. Mensaje: " + ex.Message;
2629 if (anulaTicketBaiCom != null)
2631 anulaTicketBaiCom.Dispose();
virtual string _Numero
Número del document
override string _Factura
Sobreescribimos la propiedad _Factura pues al cambiar su valor en funcion de si estamos en ventas o e...
bool _IvaIncluido
Flag para controlar si se trabaja con IVA INCLUIDO o no.
decimal Recargo
Importe de recargo
Este es el espacio de nombres de su módulo. Puede encontrar más información y ayuda en el fichero rea...
BindingList< TipoIvaLinea > _TipoIvaLineas
Lista de tipos de IVA de la factura que se está generando.
decimal Iva
Importe de Iva
decimal Recargo
Importe de recargo
Clase documento de venta TPV
Clase de negocio para Listado de retención soportada
string Ticket_rect
Ticket rectificado
Clase DTO para representar datos de facturas rectificativas
decimal Base_iva
Importe de base imponible
Es como el tipo de entrada asientos pero por negocio, sin formulario, pq quiero que me haga las propu...
decimal Base_iva
Importe de base imponible
virtual string _Letra
Lletra
Clase DTO para representar datos de facturas rectificativas
decimal Iva
Importe de Iva
Descripción de la factura
eTipoOperacionEmitidasSII
Enumeración con los distintos tipos de operaciones en el libro de facturas emitidas del SII ...
DateTime _Fecha
Fecha del documento (se crea por compatibilidad con la interficie IDivisaOperable ...
_TipoDocCab _Cabecera
Cabecera
BindingList< _TipoDocLin > _Lineas
Líneas
string Letra_rect
Letra del documento RECTIFICADO
DateTime _Fecha
Fecha del documento
string _Nombre
Nombre del cliente o proveedor según si estamos en generador de asientos de facturas de venta o de co...
Clase de negocio para generador de asientos de factura de venta, deriva de la clase AsientosFacturasG...
Clase para la gestión de configuraciones de territorio
Código(Cliente, Cuenta, Proveedor)
DateTime _Fecha_Operacion
Fecha de de operación
Cliente _oCliente
Objeto cliente
string Factu_rect
Serie y número de la factura rectificada
decimal _TotalRecFinan
Importe total de recargo financiero.
bool _Recc
Regimen especial de criterio de caja