/// <summary> /// Rutina para añadir las facturas rectificadas, en el caso de que estas lleguen informadas. /// </summary> /// <param name="_CamposReg"></param> /// <param name="_FacturaActual"></param> /// <returns></returns> private RegistroLRFacturasRecibidas AgregarFactRectifica(string[] _CamposReg, RegistroLRFacturasRecibidas _FacturaActual) { IDFactura factRectifica = new IDFactura { NumSerieFacturaEmisor = (_CamposReg[1]).Trim(), FechaExpedicionFacturaEmisor = _CamposReg[2] }; _FacturaActual.FacturaRecibida.FacturasRectificadas.Add(factRectifica); return(_FacturaActual); }
/// <summary> /// Devuelve el item del lote que se corresponde /// con los datos de identificación facilitados. /// </summary> /// <param name="batch">Lote en el que buscar.</param> /// <param name="idFactura">Datos de identificación.</param> /// <returns>Item coicidente o null.</returns> private static IBatchItem GetBatchItem(Batch batch, IDFactura idFactura) { foreach (var it in batch.BatchItems) { if ((it as IBatchItem)?.GetPartyKey() == idFactura.GetIDEmisorFactura() && (it as IBatchItem)?.GetItemKey() == idFactura.GetNumSerieFacturaEmisor() && (it as IBatchItem)?.GetItemDate() == idFactura.FechaExpedicionFacturaEmisor) { return(it as IBatchItem); } } return(null); }
/// <summary> /// Obtiene un objeto RegistroLRFacturasRecibidas, este objeto se utiliza /// para la serialización xml. /// </summary> /// <param name="updateInnerSII">Si es true, actualiza el objeto SII subyacente /// con el valor calculado.</param> /// <param name="skipErrors">Indica si hay que omitir las excepciones.</param> /// <returns>Nueva instancia del objeto para serialización /// xml RegistroLRFacturasEmitidas.</returns> public RegistroLRFacturasRecibidas ToSII(bool updateInnerSII = false, bool skipErrors = false) { if (InnerSII != null) { return(InnerSII); } RegistroLRFacturasRecibidas siiInvoice = new RegistroLRFacturasRecibidas(); if (IssueDate == null && !skipErrors) { throw new ArgumentNullException("IssueDate is null."); } if (PostingDate == null && !skipErrors) { throw new ArgumentNullException("PostingDate is null."); } if (RegisterDate == null && !skipErrors) { throw new ArgumentNullException("RegisterDate is null."); } if (!string.IsNullOrEmpty(ExternalReference) && !(Settings.Current.IDVersionSii.CompareTo("1.1") < 0)) { siiInvoice.FacturaRecibida.RefExterna = ExternalReference; } if (Settings.Current.IDVersionSii.CompareTo("1.1") < 0) { siiInvoice.PeriodoImpositivo.Ejercicio = (PostingDate ?? new DateTime(1, 1, 1)).ToString("yyyy"); siiInvoice.PeriodoImpositivo.Periodo = (PostingDate ?? new DateTime(1, 1, 1)).ToString("MM"); } else { siiInvoice.PeriodoLiquidacion.Ejercicio = (PostingDate ?? new DateTime(1, 1, 1)).ToString("yyyy"); siiInvoice.PeriodoLiquidacion.Periodo = (PostingDate ?? new DateTime(1, 1, 1)).ToString("MM"); } if (SellerParty == null && !skipErrors) { throw new ArgumentNullException("SellerParty is null."); } if (GrossAmount != 0) { siiInvoice.FacturaRecibida.ImporteTotal = SIIParser.FromDecimal(GrossAmount); } if (!(Settings.Current.IDVersionSii.CompareTo("1.1") < 0)) { if (GrossAmount > UpperLimit) { siiInvoice.FacturaRecibida.Macrodato = "S"; } } siiInvoice.IDFactura.NumSerieFacturaEmisor = InvoiceNumber; siiInvoice.IDFactura.FechaExpedicionFacturaEmisor = SIIParser.FromDate(IssueDate); /* B) Facturas Recibidas * * En un plazo de cuatro días naturales desde la fecha en que se produzca el registro * contable de la factura y, en todo caso, antes del día 16 del mes siguiente al periodo * de liquidación en que se hayan incluido las operaciones correspondientes * (período en que se deduce el IVA soportado). * Se entiende que el registro contable de la factura se produce en la fecha de entrada * en el sistema contable con independencia de la fecha reflejada en el asiento contable. */ siiInvoice.FacturaRecibida.FechaRegContable = SIIParser.FromDate(RegisterDate); if (OperationIssueDate != null) { siiInvoice.FacturaRecibida.FechaOperacion = SIIParser.FromDate(OperationIssueDate); } if (Settings.Current.IDVersionSii.CompareTo("1.1") >= 0 && TaxDate != null) { siiInvoice.FacturaRecibida.ADeducirEnPeriodoPosterior = "S"; siiInvoice.FacturaRecibida.EjercicioDeduccion = TaxDate?.ToString("yyyy"); siiInvoice.FacturaRecibida.PeriodoDeduccion = TaxDate?.ToString("MM");; } siiInvoice.FacturaRecibida.TipoFactura = InvoiceType.ToString(); siiInvoice.FacturaRecibida.ClaveRegimenEspecialOTrascendencia = ((int)ClaveRegimenEspecialOTrascendencia).ToString().PadLeft(2, '0'); siiInvoice.FacturaRecibida.DescripcionOperacion = InvoiceText; if (InvoiceType == InvoiceType.F5) { /* SII_Descripcion_ServicioWeb_v0.7.pdf (pag. 203) * 8.1.2.2.Ejemplo mensaje XML de alta de importación * En los datos identificativos correspondientes al proveedor se consignaran los del importador y titular del libro registro * Deberán consignarse, como número de factura y fecha de expedición, el número de referencia que figura en el propio DUA y la fecha de su * admisión por la Administración Aduanera respectivamente*/ SellerParty = BuyerParty; } siiInvoice.FacturaRecibida.Contraparte = GetContraparte(siiInvoice, skipErrors); // Tratamiento de las facturas rectificativas. if (InvoicesRectified.Count != 0) { siiInvoice.FacturaRecibida.TipoRectificativa = RectifiedType.ToString(); if (RectifiedBase != 0) { // Si consta el datos de importe rectificacion (tipo rectif 's'), lo ponemos ImporteRectificacion importeRectifica = new ImporteRectificacion(); importeRectifica.BaseRectificada = SIIParser.FromDecimal(RectifiedBase); importeRectifica.CuotaRectificada = SIIParser.FromDecimal(RectifiedAmount); importeRectifica.CuotaRecargoRectificado = SIIParser.FromDecimal(RectifiedEquivCharge); siiInvoice.FacturaRecibida.ImporteRectificacion = importeRectifica; } siiInvoice.FacturaRecibida.FacturasRectificadas = new List <IDFactura>(); foreach (var regRect in InvoicesRectified) { IDFactura FactRectificada = new IDFactura(); FactRectificada.NumSerieFacturaEmisor = regRect.RectifiedInvoiceNumber; FactRectificada.FechaExpedicionFacturaEmisor = SIIParser.FromDate(regRect.RectifiedIssueDate); // En este caso pongo a null IDEmisorFactura para que no serialice una etiqueta vacía. FactRectificada.IDEmisorFactura = null; siiInvoice.FacturaRecibida.FacturasRectificadas.Add(FactRectificada); } } else { if (InvoiceType.ToString().StartsWith("R") && !skipErrors) { throw new Exception("RectifiedInvoiceNumber for InvoiceType of kind 'R' must be not null."); } } // Desgloses DesgloseIVA desgloseIVA = GetDesgloseIVA(); if (IsInversionSujetoPasivo) { siiInvoice.FacturaRecibida.DesgloseFactura.InversionSujetoPasivo = desgloseIVA; } else { siiInvoice.FacturaRecibida.DesgloseFactura.DesgloseIVA = desgloseIVA; } decimal cuotaDeducible = 0; foreach (KeyValuePair <decimal, decimal[]> kvp in TaxesOutputs) { cuotaDeducible += kvp.Value[1]; } siiInvoice.FacturaRecibida.CuotaDeducible = SIIParser.FromDecimal(cuotaDeducible); if (updateInnerSII) { InnerSII = siiInvoice; } return(siiInvoice); }
/// <summary> /// Función para tratar el registro de factura que se acaba de leer. /// </summary> /// <param name="_CamposReg"></param> /// <returns></returns> private RegistroLRFacturasRecibidas TratarFactRecibida(string[] _CamposReg) { RegistroLRFacturasRecibidas _RegLRFactReciWRK = new RegistroLRFacturasRecibidas(); // Informamos el periodo impositivo. PeriodoImpositivo _PeriodoWrk = new PeriodoImpositivo { Ejercicio = _CamposReg[1], Periodo = _CamposReg[2] }; _RegLRFactReciWRK.PeriodoImpositivo = _PeriodoWrk; // Informamos el IDFactura. IDFactura _IDFactWrk = new IDFactura(); IDEmisorFactura _IDEmisorFact = new IDEmisorFactura(); Contraparte _ReceptorWrk = new Contraparte(); if (string.IsNullOrWhiteSpace(_CamposReg[4])) { _IDEmisorFact.NIF = _CamposReg[3]; _ReceptorWrk.NIF = _IDEmisorFact.NIF; } else { IDOtro _ProveedorExtWrk = new IDOtro { CodigoPais = _CamposReg[4], IDType = _CamposReg[5], ID = _CamposReg[3] }; _IDEmisorFact.IDOtro = _ProveedorExtWrk; _ReceptorWrk.IDOtro = _IDEmisorFact.IDOtro; } _IDFactWrk.IDEmisorFactura = _IDEmisorFact; _IDFactWrk.NumSerieFacturaEmisor = _CamposReg[6].Trim(); _IDFactWrk.FechaExpedicionFacturaEmisor = _CamposReg[7]; _RegLRFactReciWRK.IDFactura = _IDFactWrk; // Procedemos a tratar la factura actual. FacturaRecibida _FacturaActual = new FacturaRecibida { //Aquí indicamos si se trata de una factura 'normal' o es 'rectificativa'. TipoFactura = _CamposReg[8], ClaveRegimenEspecialOTrascendencia = _CamposReg[9], ImporteTotal = ((_CamposReg[10]).Trim()).Replace(',', '.'), FechaOperacion = _CamposReg[17] }; if (string.IsNullOrWhiteSpace(_CamposReg[11])) { _CamposReg[11] = "Hay que informar el concepto de la factura"; } _FacturaActual.DescripcionOperacion = _CamposReg[11].Trim(); // Informamos la contraparte, que según pruebas con el SOAP, este tiene que ser igual que el IDEmisorFactura _ReceptorWrk.NombreRazon = _CamposReg[12].Trim(); _FacturaActual.Contraparte = _ReceptorWrk; _FacturaActual.FechaRegContable = _CamposReg[13]; // Procedemos a informar los campos en el caso de que se trate del envio de una factura rectificativa. if (!string.IsNullOrWhiteSpace(_CamposReg[14])) { _FacturaActual.TipoRectificativa = _CamposReg[14]; ImporteRectificacion _ImpRectifWrk = new ImporteRectificacion { BaseRectificada = ((_CamposReg[15]).Trim()).Replace(',', '.'), CuotaRectificada = ((_CamposReg[16]).Trim()).Replace(',', '.') }; _FacturaActual.ImporteRectificacion = _ImpRectifWrk; } // Procedemos a informar la cuota deducible en el caso de que corresponda. // Si no viene informada la cuota deducible, pondremos '-1' con el fin de que al volver a generarse el lote // la ponga a cero, y si no la calcule. if (string.IsNullOrWhiteSpace(_CamposReg[18])) { _FacturaActual.CuotaDeducible = "-1"; } else { _FacturaActual.CuotaDeducible = ((_CamposReg[18]).Trim()).Replace(',', '.'); } _RegLRFactReciWRK.FacturaRecibida = _FacturaActual; return(_RegLRFactReciWRK); }
// Función para tratar el registro de factura que se acaba de leer. private RegistroLRDetOperacionIntracomunitaria TratarOperIntracom(string[] _CamposReg) { RegistroLRDetOperacionIntracomunitaria _RegLRFactIntraWrk = new RegistroLRDetOperacionIntracomunitaria(); // Informamos el periodo impositivo. PeriodoImpositivo _PeriodoWrk = new PeriodoImpositivo { Ejercicio = _CamposReg[1], Periodo = _CamposReg[2] }; _RegLRFactIntraWrk.PeriodoImpositivo = _PeriodoWrk; // // Informamos el IDFactura. // Por las pruebas que hemos podido realizar, en el SoapUI, dependiendo de si se trata de una factura intracomunitaria emitida o recibida // el emisor de la misma será o el titular o el proveedor/acreedor que nos haya remitido la factura. En nuestro caso, al tratarse de facturas // recibidas, el emisor de la misma será el proveedor/acreedor. Procedemos a modificar el código para que se genere correctamente el lote. // IDFactura _IDFactWrk = new IDFactura(); _IDFactWrk.IDEmisorFactura.NombreRazon = _CamposReg[3].Trim(); if (string.IsNullOrWhiteSpace(_CamposReg[5])) { _IDFactWrk.IDEmisorFactura.NIF = _CamposReg[4]; } else { IDOtro _EmisorExt = new IDOtro { ID = _CamposReg[4], CodigoPais = _CamposReg[5], IDType = _CamposReg[6] }; _IDFactWrk.IDEmisorFactura.IDOtro = _EmisorExt; } _IDFactWrk.NumSerieFacturaEmisor = _CamposReg[7].Trim(); _IDFactWrk.FechaExpedicionFacturaEmisor = _CamposReg[8]; _RegLRFactIntraWrk.IDFactura = _IDFactWrk; // // Informamos la contraparte, que, según la documentación y las pruebas realizadas, en nuestro caso tendremos que informar // los datos del titular del libro.. // Contraparte _ContraparteWrk = new Contraparte { NombreRazon = _CamposReg[9].Trim(), NIF = _CamposReg[10] }; _RegLRFactIntraWrk.Contraparte = _ContraparteWrk; // Informamos los datos correspondientes a la operación intracomunitaria. OperacionIntracomunitaria _OperIntraWrk = new OperacionIntracomunitaria { TipoOperacion = _CamposReg[11], ClaveDeclarado = _CamposReg[12], EstadoMiembro = _CamposReg[13], DescripcionBienes = _CamposReg[14], DireccionOperador = _CamposReg[15] }; _RegLRFactIntraWrk.OperacionIntracomunitaria = _OperIntraWrk; return(_RegLRFactIntraWrk); }
// Función para tratar el registro de factura que se acaba de leer. private RegistroLRFacturasEmitidas TratarFactEmitida(string[] _CamposReg) { RegistroLRFacturasEmitidas _RegLRFactEmitWRK = new RegistroLRFacturasEmitidas(); // Informamos el periodo impositivo. PeriodoImpositivo _PeriodoWrk = new PeriodoImpositivo { Ejercicio = _CamposReg[1], Periodo = _CamposReg[2] }; _RegLRFactEmitWRK.PeriodoImpositivo = _PeriodoWrk; // Informamos el IDFactura. IDFactura _IDFactWrk = new IDFactura(); _IDFactWrk.IDEmisorFactura.NIF = _CamposReg[3]; _IDFactWrk.NumSerieFacturaEmisor = _CamposReg[4].Trim(); _IDFactWrk.FechaExpedicionFacturaEmisor = _CamposReg[5]; // En caso de que se trate de una factura de Asiento Resumen, hay que informar la última factura // que se incluye en este envío. if (!string.IsNullOrWhiteSpace(_CamposReg[14])) { _IDFactWrk.NumSerieFacturaEmisorResumenFin = _CamposReg[14]; } _RegLRFactEmitWRK.IDFactura = _IDFactWrk; // Procedemos a tratar la factura actual. FacturaExpedida _FacturaActual = new FacturaExpedida { TipoFactura = _CamposReg[6], ClaveRegimenEspecialOTrascendencia = _CamposReg[7], ImporteTotal = ((_CamposReg[8]).Trim()).Replace(',', '.') }; if (string.IsNullOrWhiteSpace(_CamposReg[9])) { _CamposReg[9] = "Hay que informar el concepto de la factura"; } _FacturaActual.DescripcionOperacion = _CamposReg[9].Trim(); // Informamos la contraparte, que cambiará dependiendo de si se trata de un cliente nacional o extranjero Contraparte _ClienteWrk = new Contraparte { NombreRazon = _CamposReg[10].Trim() }; if (string.IsNullOrWhiteSpace(_CamposReg[12])) { _ClienteWrk.NIF = _CamposReg[11]; } else { IDOtro _ClienteExtWrk = new IDOtro { CodigoPais = _CamposReg[12], IDType = _CamposReg[13], ID = _CamposReg[11] }; _ClienteWrk.IDOtro = _ClienteExtWrk; } _FacturaActual.Contraparte = _ClienteWrk; // Indicamos la fecha de operación, en el caso de que venga informada if (!string.IsNullOrWhiteSpace(_CamposReg[15])) { _FacturaActual.FechaOperacion = _CamposReg[15]; } // Procedemos a informar los campos en el caso de que se trate del envio de una factura rectificativa. if (!string.IsNullOrWhiteSpace(_CamposReg[16])) { _FacturaActual.TipoRectificativa = _CamposReg[16]; ImporteRectificacion _ImpRectifWrk = new ImporteRectificacion { BaseRectificada = ((_CamposReg[17]).Trim()).Replace(',', '.'), CuotaRectificada = ((_CamposReg[18]).Trim()).Replace(',', '.') }; _FacturaActual.ImporteRectificacion = _ImpRectifWrk; } // Procedemos a tratar el caso de que se trate del deslgose no Sujeto TipoDesglose tipoDesglose = new TipoDesglose(); DesgloseFactura desgloseFactura = new DesgloseFactura(); NoSujeta noSujeta = new NoSujeta(); if (!string.IsNullOrWhiteSpace(_CamposReg[19]) || !string.IsNullOrWhiteSpace(_CamposReg[20])) { if (!string.IsNullOrWhiteSpace(_CamposReg[19])) { noSujeta.ImportePorArticulos7_14_Otros = ((_CamposReg[19]).Trim()).Replace(',', '.'); } if (!string.IsNullOrWhiteSpace(_CamposReg[20])) { noSujeta.ImporteTAIReglasLocalizacion = ((_CamposReg[20]).Trim()).Replace(',', '.'); } desgloseFactura.NoSujeta = noSujeta; tipoDesglose.DesgloseFactura = desgloseFactura; _FacturaActual.TipoDesglose = tipoDesglose; } _RegLRFactEmitWRK.FacturaExpedida = _FacturaActual; return(_RegLRFactEmitWRK); }