diff --git a/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Factura_e_Modelo.cs b/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Factura_e_Modelo.cs index d763b04..bff4c20 100644 --- a/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Factura_e_Modelo.cs +++ b/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Factura_e_Modelo.cs @@ -122,12 +122,21 @@ namespace Exferia_Aplicacion.Modelos_Factura_E const string FACTURA_E_InvoiceHeader_NAME = "InvoiceHeader"; const string FACTURA_E_InvoiceNumber_NAME = "InvoiceNumber"; - const string FACTURA_E_InvoiceSeriesCode_NAME = "InvoiceSeriesCode"; + const string FACTURA_E_InvoiceSeriesCode_NAME = "InvoiceDocumentType"; + const string FACTURA_E_ReasonCode_NAME = "ReasonCode"; + const string FACTURA_E_ReasonCode = "01"; + + const string FACTURA_E_InvoiceDocumentType_NAME = "InvoiceDocumentType"; + const string FACTURA_E_InvoiceDocumentType = "FC"; + const string FACTURA_E_InvoiceClass_NAME = "InvoiceClass"; const string FACTURA_E_Corrective_NAME = "Corrective"; const string FACTURA_E_ReasonDescription_NAME = "ReasonDescription"; const string FACTURA_E_CorrectionMethodDescription_NAME = "CorrectionMethodDescription"; + const string FACTURA_E_CorrectionMethod_NAME = "CorrectionMethod"; + const string FACTURA_E_CorrectionMethod = "01"; + const string FACTURA_E_AdditionalReasonDescription_NAME = "AdditionalReasonDescription"; const string FACTURA_E_TaxPeriod_NAME = "TaxPeriod"; const string FACTURA_E_StartDate_NAME = "StartDate"; @@ -138,6 +147,13 @@ namespace Exferia_Aplicacion.Modelos_Factura_E const string FACTURA_E_IssueDate_NAME = "IssueDate"; const string FACTURA_E_TaxesOutputs_NAME = "TaxesOutputs"; + //const string FACTURA_E_InvoiceCurrencyCode_NAME = "InvoiceCurrencyCode"; + const string FACTURA_E_TaxCurrencyCode_NAME = "TaxCurrencyCode"; + const string FACTURA_E_LanguageName_NAME = "LanguageName"; + const string FACTURA_E_LanguageName = "es"; + + + //impuestos const string FACTURA_E_Tax_NAME = "Tax"; const string FACTURA_E_TaxTypeCode_NAME = "TaxTypeCode"; @@ -153,6 +169,11 @@ namespace Exferia_Aplicacion.Modelos_Factura_E const string FACTURA_E_TotalGeneralDiscounts_NAME = "TotalGeneralDiscounts"; const string FACTURA_E_TotalGrossAmountBeforeTaxes_NAME = "TotalGrossAmountBeforeTaxes"; const string FACTURA_E_TotalTaxOutputs_NAME = "TotalTaxOutputs"; + const string FACTURA_E_TotalTaxesWithheld_NAME = "TotalTaxesWithheld"; + const string FACTURA_E_TotalTaxesWithheld = "0.0"; + + + //const string FACTURA_E_TotalTaxesWithheld_NAME = "TotalTaxesWithheld"; //const string FACTURA_E_TotalOutstandingAmount_NAME = "TotalOutstandingAmount"; const string FACTURA_E_TotalPaymentsOnAccount_NAME = "TotalPaymentsOnAccount"; @@ -167,6 +188,9 @@ namespace Exferia_Aplicacion.Modelos_Factura_E const string FACTURA_E_DeliveryNoteDate_NAME = "DeliveryNoteDate"; const string FACTURA_E_ItemDescription_NAME = "ItemDescription"; const string FACTURA_E_Quantity_NAME = "Quantity"; + const string FACTURA_E_UnitOfMeasure_NAME = "UnitOfMeasure"; + const string FACTURA_E_UnitOfMeasure = "01"; + const string FACTURA_E_UnitPriceWithoutTax_NAME = "UnitPriceWithoutTax"; const string FACTURA_E_TotalCost_NAME = "TotalCost"; @@ -397,7 +421,77 @@ namespace Exferia_Aplicacion.Modelos_Factura_E } private string grabaLineasFactura(XmlDocument doc, XmlElement nodo) { - return null; + string res = null; + try + { + + XmlElement nbase = doc.CreateElement(string.Empty, FACTURA_E_Invoice_NAME, string.Empty); + //head + XmlElement nheader = doc.CreateElement(string.Empty, FACTURA_E_InvoiceHeader_NAME, string.Empty); + + XmlElement nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceNumber_NAME, string.Empty); + nod.InnerText = NumeroFactura.ToString(); + nheader.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceSeriesCode_NAME, string.Empty); + nod.InnerText = SerieDelegacion; + nheader.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceDocumentType_NAME, string.Empty); + nod.InnerText = FACTURA_E_InvoiceDocumentType; + nheader.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceClass_NAME, string.Empty); + nod.InnerText = FacturaOriginal?"OO":"OR"; + nheader.AppendChild(nod); + + if (!FacturaOriginal && Correcciones!=null) + { + res = grabaCorreccion(Correcciones, doc, nheader); + if (res != null) + return res; + } + nbase.AppendChild(nheader); + + res = grabaInvoiceIssueData(doc, nbase); + if (res != null) + return res; + + //TaxesOutputs + XmlElement nTaxesOutputs = doc.CreateElement(string.Empty, FACTURA_E_TaxesOutputs_NAME, string.Empty); + res = grabaImpuestos(Impuesto, doc, nTaxesOutputs); + if(res != null) + return res; + nbase.AppendChild(nTaxesOutputs); + //InvoiceTotals + res = grabaInvoiceTotals(doc, nbase); + if (res != null) + return res; + //Items + if(Items!= null && Items.Length>0) + { + XmlElement nItems = doc.CreateElement(string.Empty, FACTURA_E_Items_NAME, string.Empty); + + foreach( var item in Items) + { + res = grabaItem(item, doc, nItems); + if (res != null) + return res; + } + + nbase.AppendChild(nItems); + } + + nodo.AppendChild(nbase); + + + + } + catch (Exception e) + { + res = "Error en " + nameof(grabaPartesInvolucradas) + ": " + e.Message; + } + return res; } private string grabaTaxIdentification(INTERNO_Entidad_Factura_E_Modelo dat, XmlDocument doc, XmlElement nodo) @@ -553,6 +647,292 @@ namespace Exferia_Aplicacion.Modelos_Factura_E } return res; } + private string grabaCorreccion(INTERNO_Correcciones_Factura_E_Modelo dat, XmlDocument doc, XmlElement nodo) + { + string res = null; + try + { + XmlElement nbase = doc.CreateElement(string.Empty, FACTURA_E_Corrective_NAME, string.Empty); + + XmlElement nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceNumber_NAME, string.Empty); + nod.InnerText = dat.NumeroFactura.ToString(); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceSeriesCode_NAME, string.Empty); + nod.InnerText = dat.SerieDelegacion.ToString(); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_ReasonCode_NAME, string.Empty); + nod.InnerText = FACTURA_E_ReasonCode; + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_ReasonDescription_NAME, string.Empty); + nod.InnerText = dat.RazonCode; + nbase.AppendChild(nod); + + XmlElement nTaxPeriod = doc.CreateElement(string.Empty, FACTURA_E_TaxPeriod_NAME, string.Empty); + + nod = doc.CreateElement(string.Empty, FACTURA_E_StartDate_NAME, string.Empty); + nod.InnerText = toStr(dat.Inicio); + nTaxPeriod.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_EndDate_NAME, string.Empty); + nod.InnerText = toStr(dat.Fin); + nTaxPeriod.AppendChild(nod); + + nbase.AppendChild(nTaxPeriod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_CorrectionMethod_NAME, string.Empty); + nod.InnerText = FACTURA_E_CorrectionMethod; + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_CorrectionMethodDescription_NAME, string.Empty); + nod.InnerText = dat.RazonCorreccion; + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_AdditionalReasonDescription_NAME, string.Empty); + nod.InnerText = dat.Observaciones; + nbase.AppendChild(nod); + + + nodo.AppendChild(nbase); + } + catch (Exception e) + { + res = "Error en " + nameof(grabaCorreccion) + ": " + e.Message; + } + return res; + } + + private string grabaInvoiceIssueData(XmlDocument doc, XmlElement nodo) + { + string res = null; + try + { + XmlElement nbase = doc.CreateElement(string.Empty, FACTURA_E_InvoiceIssueData_NAME, string.Empty); + + XmlElement nod = doc.CreateElement(string.Empty, FACTURA_E_IssueDate_NAME, string.Empty); + nod.InnerText = toStr(Fecha); + nbase.AppendChild(nod); + XmlElement nbase2 = doc.CreateElement(string.Empty, FACTURA_E_InvoiceIssueData_NAME, string.Empty); + + nod = doc.CreateElement(string.Empty, FACTURA_E_InvoicingPeriod_NAME, string.Empty); + nod.InnerText = toStr(PeriodoInicio); + + nbase2.AppendChild(nod); + nod = doc.CreateElement(string.Empty, FACTURA_E_StartDate_NAME, string.Empty); + nod.InnerText = toStr(PeriodoInicio); + nbase2.AppendChild(nod); + nod = doc.CreateElement(string.Empty, FACTURA_E_EndDate_NAME, string.Empty); + nod.InnerText = toStr(PeriodoFin); + nbase2.AppendChild(nod); + nbase.AppendChild(nbase2); + + nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceCurrencyCode_NAME, string.Empty); + nod.InnerText = Moneda; + nbase.AppendChild(nod); + nod = doc.CreateElement(string.Empty, FACTURA_E_TaxCurrencyCode_NAME, string.Empty); + nod.InnerText = Moneda; + nbase.AppendChild(nod); + nod = doc.CreateElement(string.Empty, FACTURA_E_LanguageName_NAME, string.Empty); + nod.InnerText = FACTURA_E_LanguageName; + nbase.AppendChild(nod); + + nodo.AppendChild(nbase); + } + catch (Exception e) + { + res = "Error en " + nameof(grabaInvoiceIssueData) + ": " + e.Message; + } + return res; + } + private string grabaImpuestos(INTERNO_Impuestos_Factura_E_modelo dat, XmlDocument doc, XmlElement nodo) + { + string res = null; + try + { + + XmlElement nbase = doc.CreateElement(string.Empty, FACTURA_E_Tax_NAME, string.Empty); + + XmlElement nod = doc.CreateElement(string.Empty, FACTURA_E_TaxTypeCode_NAME, string.Empty); + nod.InnerText = toStr(dat.Tipo); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TaxRate_NAME, string.Empty); + nod.InnerText = toStr(dat.Porcentaje); + nbase.AppendChild(nod); + + XmlElement nbase2 = doc.CreateElement(string.Empty, FACTURA_E_TaxableBase_NAME, string.Empty); + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalAmount_NAME, string.Empty); + nod.InnerText = toStr(dat.Base); + nbase2.AppendChild(nod); + nbase.AppendChild(nbase2); + + nbase2 = doc.CreateElement(string.Empty, FACTURA_E_TaxAmount_NAME, string.Empty); + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalAmount_NAME, string.Empty); + nod.InnerText = toStr(dat.Importe); + nbase2.AppendChild(nod); + nbase.AppendChild(nbase2); + nodo.AppendChild(nbase); + } + catch (Exception e) + { + res = "Error en " + nameof(grabaImpuestos) + ": " + e.Message; + } + return res; + } + + private string grabaInvoiceTotals(XmlDocument doc, XmlElement nodo) + { + string res = null; + try + { + XmlElement nbase = doc.CreateElement(string.Empty, FACTURA_E_InvoiceTotals_NAME, string.Empty); + + XmlElement nod = doc.CreateElement(string.Empty, FACTURA_E_TotalGrossAmount_NAME, string.Empty); + nod.InnerText = toStr(TotalBruto); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalGeneralDiscounts_NAME, string.Empty); + nod.InnerText = toStr(TotalDescuento); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalGrossAmountBeforeTaxes_NAME, string.Empty); + nod.InnerText = toStr(TotalBase); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalTaxOutputs_NAME, string.Empty); + nod.InnerText = toStr(TotalImpuestos); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalTaxesWithheld_NAME, string.Empty); + nod.InnerText = FACTURA_E_TotalTaxesWithheld; + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_InvoiceTotals_NAME, string.Empty); + nod.InnerText = toStr(TotalFactura); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalOutstandingAmount_NAME, string.Empty); + nod.InnerText = toStr(TotalPendiente); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalPaymentsOnAccount_NAME, string.Empty); + nod.InnerText = toStr(TotalAnticipo); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalExecutableAmount_NAME, string.Empty); + nod.InnerText = toStr(TotalEjecutable); + nbase.AppendChild(nod); + + nodo.AppendChild(nbase); + } + catch (Exception e) + { + res = "Error en " + nameof(grabaInvoiceTotals) + ": " + e.Message; + } + return res; + } + private string grabaItem(INTERNO_Item_Factura_E_modelo dat, XmlDocument doc, XmlElement nodo) + { + string res = null; + try + { + XmlElement nbase = doc.CreateElement(string.Empty, FACTURA_E_InvoiceLine_NAME, string.Empty); + XmlElement nbase2 = doc.CreateElement(string.Empty, FACTURA_E_DeliveryNote_NAME, string.Empty); + + + XmlElement nod = doc.CreateElement(string.Empty, FACTURA_E_DeliveryNoteNumber, string.Empty); + nod.InnerText = dat.Codigo; + nbase2.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_DeliveryNoteDate_NAME, string.Empty); + nod.InnerText = toStr(dat.FechaAlbaran); + nbase2.AppendChild(nod); + + nbase.AppendChild(nbase2); + + nod = doc.CreateElement(string.Empty, FACTURA_E_ItemDescription_NAME, string.Empty); + nod.InnerText = dat.Descripcion; + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_Quantity_NAME, string.Empty); + nod.InnerText = toStr(dat.Cantidad); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_UnitOfMeasure_NAME, string.Empty); + nod.InnerText = FACTURA_E_UnitOfMeasure; + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_UnitPriceWithoutTax_NAME, string.Empty); + nod.InnerText = toStr(dat.Precio); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_TotalCost_NAME, string.Empty); + nod.InnerText = toStr(dat.Total); + nbase.AppendChild(nod); + + nbase2 = doc.CreateElement(string.Empty, FACTURA_E_DiscountsAndRebates_NAME, string.Empty); + var nbase3 = doc.CreateElement(string.Empty, FACTURA_E_Discount_NAME, string.Empty); + + nod = doc.CreateElement(string.Empty, FACTURA_E_DiscontReason_NAME, string.Empty); + nod.InnerText = dat.DescuentoRazon; + nbase3.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_DiscountRate_NAME, string.Empty); + nod.InnerText = toStr(dat.DescuentoPorcentaje); + nbase3.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_DiscountAmount_NAME, string.Empty); + nod.InnerText = toStr(dat.Descuentoimporte); + nbase3.AppendChild(nod); + + nbase2.AppendChild(nbase3); + nbase.AppendChild(nbase2); + + nod = doc.CreateElement(string.Empty, FACTURA_E_GrossAmount_NAME, string.Empty); + nod.InnerText = toStr(dat.ImporteBruto); + nbase.AppendChild(nod); + + res = grabaImpuestos(dat, doc, nbase); + if (res != null) + return res; + nod = doc.CreateElement(string.Empty, FACTURA_E_TransactionDate_NAME, string.Empty); + nod.InnerText = toStr(dat.FechaAlbaran); + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_AdditionalLineItemInformation_NAME, string.Empty); + nod.InnerText = dat.Adicional; + nbase.AppendChild(nod); + + nod = doc.CreateElement(string.Empty, FACTURA_E_AdditionalLineItemInformation_NAME, string.Empty); + nod.InnerText = dat.CodigoArticulo; + nbase.AppendChild(nod); + + nodo.AppendChild(nbase); + } + catch (Exception e) + { + res = "Error en " + nameof(grabaItem) + ": " + e.Message; + } + return res; + } + string toStr(DateTime t) + { + return t.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); + } + string toStr(int t) + { + return t.ToString(); + } + string toStr(float t) + { + return t.ToString(); + } + string toStr(double t) + { + return t.ToString(); + } #endregion #region LecturaXML private string leeXML(XmlNode factura) diff --git a/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Impuestos_Factura_E_modelo.cs b/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Impuestos_Factura_E_modelo.cs index e19c21a..60e4529 100644 --- a/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Impuestos_Factura_E_modelo.cs +++ b/Exferia_Aplicacion/Exferia_Aplicacion/Modelos_Factura_E/INTERNO_Impuestos_Factura_E_modelo.cs @@ -8,9 +8,9 @@ namespace Exferia_Aplicacion.Modelos_Factura_E { public class INTERNO_Impuestos_Factura_E_modelo { - public double Porcentaje { get; set; } + public float Porcentaje { get; set; } public int Tipo { get; set; } - public double Base { get; set; } + public float Base { get; set; } public double Importe { get; set; } } }