public FECAEDetRequest Convertir( FeDetalle detalle, bool arreglar ) { FECAEDetRequest feCaeDet = new FECAEDetRequest(); feCaeDet.Concepto = (int)detalle.Concepto; feCaeDet.DocTipo = (int)detalle.DocumentoTipo; feCaeDet.DocNro = detalle.DocumentoNumero; feCaeDet.CbteDesde = detalle.ComprobanteDesde; feCaeDet.CbteHasta = detalle.ComprobanteDesde; feCaeDet.CbteFch = detalle.ComprobanteFecha; feCaeDet.ImpTotal = Redondeo.Aplicar(detalle.ImporteTotal); feCaeDet.ImpTotConc = Redondeo.Aplicar(detalle.ImporteNetoNoGravado); feCaeDet.ImpNeto = Redondeo.Aplicar(detalle.ImporteNeto); feCaeDet.ImpOpEx = Redondeo.Aplicar(detalle.ImporteExento); feCaeDet.ImpTrib = Redondeo.Aplicar(detalle.ImporteTributos); feCaeDet.FchServDesde = detalle.FechaServicioDesde; feCaeDet.FchServHasta = detalle.FechaServicioHasta; feCaeDet.FchVtoPago = detalle.FechaVencimientoDePago; feCaeDet.MonId = detalle.MonedaId; feCaeDet.MonCotiz = detalle.MonedaCotizacion; this.ConvertirComprobantesAsociados( detalle, feCaeDet ); this.ConvertirTributos( detalle, feCaeDet ); this.ConvertirIVA( detalle, feCaeDet ); feCaeDet.ImpIVA = this.CalcularIva( feCaeDet ); feCaeDet.ImpTrib = this.CalcularTributos( feCaeDet ); this.ConvertirDatosAdicionales( detalle, feCaeDet ); if ( arreglar ) { if ( !this.ValidarSumaImporteTotal( feCaeDet ) ) { this.TratarDeArreglarRedondeando( feCaeDet, detalle ); } if ( !this.ValidarSumaImporteTotal( feCaeDet ) ) { this.TratarDeArreglarCocinando( feCaeDet, detalle ); } if ( !this.ValidarSumaImporteTotal( feCaeDet ) ) { // fallo todo, dejo como estaba feCaeDet = this.Convertir( detalle, false ); } } return feCaeDet; }
private void ConvertirComprobantesAsociados( FeDetalle detalle, FECAEDetRequest feCaeDet ) { if ( detalle.ComprobantesAsociados.Count > 0 ) { int i = 0; feCaeDet.CbtesAsoc = new CbteAsoc[detalle.ComprobantesAsociados.Count]; WrapperComprobanteAsociadoFe wcaf = new WrapperComprobanteAsociadoFe(); foreach ( ComprobanteAsociado comprobante in detalle.ComprobantesAsociados ) { feCaeDet.CbtesAsoc[i] = wcaf.Convertir( comprobante ); i++; } } }
/// <summary> /// Pone los valores redondeados /// </summary> /// <param name="feCaeDet">detalle del request a la ADIP</param> /// <param name="detalle">detalle wrappeado, con los valores de Organic/Lince</param> private void TratarDeArreglarRedondeando( FECAEDetRequest feCaeDet, FeDetalle detalle ) { Decimal ivaOriginal = (Decimal)feCaeDet.ImpIVA; Decimal tributosOriginal = (Decimal)feCaeDet.ImpTrib; // Total no se toca // feCaeDet.ImpTotal = Redondeo.Aplicar( detalle.ImporteTotal ); feCaeDet.ImpTotConc = Redondeo.Redondear( detalle.ImporteNetoNoGravado ); feCaeDet.ImpNeto = Redondeo.Redondear( detalle.ImporteNeto ); feCaeDet.ImpOpEx = Redondeo.Redondear( detalle.ImporteExento ); feCaeDet.ImpTrib = Redondeo.Redondear( detalle.ImporteTributos ); feCaeDet.ImpIVA = Redondeo.Redondear( detalle.ImporteIVA ); #region Arreglo IVA. Si cambia, la suma de la coleccion debe dar lo mismo if ( (Decimal)feCaeDet.ImpIVA != ivaOriginal ) { // le pego a algun IVA para que no falle // validacion 10023 La suma de los campos <importe> en <IVA> debe ser igual al valor ingresado en ImpIVA. Decimal diferencia = (Decimal)feCaeDet.ImpIVA - ivaOriginal; try { feCaeDet.Iva[0].Importe = Redondeo.SumarDoubles( new double[] { feCaeDet.Iva[0].Importe, (double)diferencia } ); } finally { } } #endregion #region Arreglo Tributos. Si cambia, la suma de la coleccion debe dar lo mismo if ( (Decimal)feCaeDet.ImpTrib != tributosOriginal ) { // le pego a alguno para que no falle // validacion 10029 La suma de los importes en <Tributo> debe ser igual al valor ingresado en ImpTrib Decimal diferencia = (Decimal)feCaeDet.ImpTrib - tributosOriginal; try { feCaeDet.Tributos[0].Importe = Redondeo.SumarDoubles( new double[] { feCaeDet.Tributos[0].Importe, (double)diferencia } ); } finally { } } #endregion }
/// <summary> /// Cocina para que cierren los valores /// </summary> /// <param name="feCaeDet"></param> /// <param name="detalle"></param> private void TratarDeArreglarCocinando( FECAEDetRequest requestAfip, FeDetalle detalle ) { Decimal diferencia = this.ObtenerDiferenciaTotales( requestAfip ); // Tolerancia de 2 ctvos if ( Math.Abs( diferencia ) <= 0.02M ) { // Suma De Totales Es Menor al total if ( diferencia > 0 ) { if ( requestAfip.ImpIVA > 0 ) { // La ligó el IVA requestAfip.ImpIVA = Redondeo.SumarDoubles( new double[]{ requestAfip.ImpIVA , (double)diferencia } ); requestAfip.Iva[0].Importe = Redondeo.SumarDoubles( new double[] { requestAfip.Iva[0].Importe, (double)diferencia } ); } else if ( requestAfip.ImpTrib > 0 ) { // sin IVA, le pego a los impuestos... requestAfip.ImpTrib = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTrib, (double)diferencia } ); requestAfip.Tributos[0].Importe = Redondeo.SumarDoubles( new double[] { requestAfip.Tributos[0].Importe, (double)diferencia } ); } else if ( requestAfip.ImpOpEx > 0 ) { // nada, al exento requestAfip.ImpOpEx = Redondeo.SumarDoubles( new double[] { requestAfip.ImpOpEx, (double)diferencia } ); } else if ( requestAfip.ImpTotConc > 0 ) { // nada, al Neto NG requestAfip.ImpTotConc = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, (double)diferencia } ); } } // Suma De Totales Es Mayor al total if ( diferencia < 0 ) { if ( requestAfip.ImpOpEx > 0 ) { // Tiene exento, lo pongo ahi requestAfip.ImpOpEx = Redondeo.SumarDoubles( new double[] { requestAfip.ImpOpEx, (double)diferencia } ); } else if ( requestAfip.ImpTotConc > 0 ) { // Tiene Neto NG, lo pongo ahi requestAfip.ImpTotConc = Redondeo.SumarDoubles( new double[] { requestAfip.ImpTotConc, (double)diferencia } ); } else if ( requestAfip.ImpNeto > 0 ) { // Importe Neto requestAfip.ImpNeto = Redondeo.SumarDoubles( new double[] { requestAfip.ImpNeto, (double)diferencia } ); requestAfip.Iva[0].BaseImp = Redondeo.SumarDoubles( new double[] { requestAfip.Iva[0].BaseImp, (double)diferencia } ); } } } }
public FECAEDetRequest Convertir( FeDetalle detalle ) { return this.Convertir( detalle, true ); }
private void ConvertirTributos( FeDetalle detalle, FECAEDetRequest feCaeDet ) { if ( detalle.Tributos.Count > 0 ) { int i = 0; feCaeDet.Tributos = new Tributo[detalle.Tributos.Count]; WrapperTributoFe wtc = new WrapperTributoFe(); foreach ( TributoComprobante item in detalle.Tributos ) { feCaeDet.Tributos[i] = wtc.Convertir( item ); i++; } } }
private void ConvertirIVA( FeDetalle detalle, FECAEDetRequest feCaeDet ) { if ( detalle.Iva.Count > 0 ) { int i = 0; feCaeDet.Iva = new AlicIva[detalle.Iva.Count]; WrapperIvaFe wic = new WrapperIvaFe(); foreach ( IVA iva in detalle.Iva ) { feCaeDet.Iva[i] = wic.Convertir( iva ); i++; } } }
private void ConvertirDatosAdicionales(FeDetalle detalle, FECAEDetRequest feCaeDet) { if ( !String.IsNullOrEmpty( detalle.DA_NumeroDocumento ) && detalle.DA_NumeroDocumento != "0" ) { feCaeDet.Opcionales = new Opcional[4]; feCaeDet.Opcionales[0] = new Opcional(); feCaeDet.Opcionales[0].Id = "7"; feCaeDet.Opcionales[0].Valor = detalle.DA_CondicionTitular.ToString().PadLeft( 2, '0' ); feCaeDet.Opcionales[1] = new Opcional(); feCaeDet.Opcionales[1].Id = "61"; feCaeDet.Opcionales[1].Valor = detalle.DA_TipoDocumento.ToString().PadLeft(2, '0'); feCaeDet.Opcionales[2] = new Opcional(); feCaeDet.Opcionales[2].Id = "62"; feCaeDet.Opcionales[2].Valor = detalle.DA_NumeroDocumento.ToString(); feCaeDet.Opcionales[3] = new Opcional(); feCaeDet.Opcionales[3].Id = "5"; feCaeDet.Opcionales[3].Valor = detalle.DA_Motivo.ToString().PadLeft(2, '0'); } }
public List<Observacion> Comparar( CAEDetalleRespuesta comprobanteAfip, FeDetalle comprobante ) { BuscadorDeDiferencias buscador = new BuscadorDeDiferencias(); return buscador.Obtener( comprobanteAfip, comprobante ); }