Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        // 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);
        }
Пример #6
0
        // 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);
        }