private void SetearEnItemsEspecificacionesObligatoriasSegunComprobante( FeCabecera cabFe, ComprobanteType comprobante )
 {
     foreach ( ItemType item in comprobante.arrayItems )
     {
         item.importeIVASpecified = (cabFe.TipoComprobante >= 1 && cabFe.TipoComprobante <= 3);
     }
 }
        public CAEDetalleRespuesta ConvertirDetalle( ComprobanteType origen )
        {
            CAEDetalleRespuesta destino = new CAEDetalleRespuesta();

            destino.Cae = origen.codigoAutorizacion.ToString();
            destino.CaeFechaVencimiento = origen.fechaVencimiento.ToString( "yyyyMMdd" );
            destino.ComprobanteDesde = origen.numeroComprobante;
            destino.ComprobanteHasta = origen.numeroComprobante;
            destino.ComprobanteFecha = origen.fechaEmision.ToString( "yyyyMMdd" );
            destino.Concepto = origen.codigoConcepto;
            destino.DocumentoNumero = origen.numeroDocumento;
            destino.Resultado = origen.codigoTipoAutorizacion.ToString(); // ver si es este valor
            destino.TipoDocumento = origen.codigoTipoDocumento;
            destino.ImporteTotal = (double) origen.importeTotal;
            destino.ImporteExento = (double) origen.importeExento;
            destino.ImporteIVA = (double) origen.arraySubtotalesIVA.Sum( x => x.importe );
            destino.ImporteNeto = (double) origen.importeGravado;
            //destino.ImporteTotalConceptos = origen.impo;
            destino.ImporteTributos = (double) origen.importeOtrosTributos;
            destino.Observaciones = new List<Observacion>();
            if ( !string.IsNullOrEmpty( origen.observaciones ) )
            {
                destino.Observaciones.Add( new Observacion() { Mensaje = origen.observaciones } );
            }

            return destino;
        }
        public void GenerarBackupArchivoSerializado(SerializadorRequest serializador, ComprobanteType cabecera)
        {
            String ruta;

            ClasificacionDeComprobantes comprobantes = new ClasificacionDeComprobantes();

            ruta = Directory.GetCurrentDirectory() + "\\Log\\FacturacionElectronica\\" + comprobantes.ObtenerTipoYLetraDeComprobante(cabecera.codigoTipoComprobante) + "_" + cabecera.numeroPuntoVenta.ToString().PadLeft(4, '0') + "_" + cabecera.numeroComprobante.ToString().PadLeft(8, '0') +"_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xml";

            serializador.SerializadorConRuta<ComprobanteType>(cabecera, ruta);
        }
        public static ComprobanteType GetComprobanteType(Comprobante comprobante)
        {
            var req = new ComprobanteType( );

            if (comprobante.Tipo != null)
            {
                req.codigoTipoComprobante = (( ComprobanteTipo )comprobante.Tipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo;
            }

            if (comprobante.ConceptosIncluidos == ConceptosIncluidos.Otro)
            {
                throw new UserFriendlyException("La autorización electrónica por AFIP solo permite comprobantes de Productos, Servicios, o Prod. y Serv.");
            }

            req.codigoConcepto = ( short )comprobante.ConceptosIncluidos;

            req.numeroPuntoVenta   = ( short )comprobante.Sector;
            req.numeroComprobante  = comprobante.Numero;
            req.fechaEmision       = comprobante.Fecha;
            req.fechaServicioDesde = comprobante.InicioPrestacion;
            req.fechaServicioHasta = comprobante.FinPrestacion;

            if (comprobante.Vencimiento != null)
            {
                req.fechaVencimientoPago = comprobante.Vencimiento.Value;
            }

            req.cotizacionMoneda = comprobante.Cambio;

            if (comprobante.Especie != null)
            {
                req.codigoMoneda = (( Moneda )comprobante.Especie.Moneda.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo;
            }

            if (comprobante.IdentificacionTipo != null)
            {
                req.codigoTipoDocumento          = (( IdentificacionTipo )comprobante.IdentificacionTipo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)).Codigo;
                req.codigoTipoDocumentoSpecified = true;
            }
            if (!string.IsNullOrEmpty(comprobante.IdentificacionNro))
            {
                req.numeroDocumento          = Convert.ToInt64(comprobante.IdentificacionNro);
                req.numeroDocumentoSpecified = true;
            }

            decimal impGrav = 0, impIVA = 0, impTrib = 0, impNoGrav = 0, impExento = 0;

            var arraySubtotalesIVA = new List <SubtotalIVAType>( );
            var arrayOtrosTributos = new List <OtroTributoType>( );
            var arrayItems         = new List <ItemType>( );

            foreach (var item in comprobante.Items)
            {
                if (item.Concepto.Clase != ConceptoClase.Impuesto)
                {
                    var itemType = new ItemType( );
                    itemType.descripcion       = item.Detalle;
                    itemType.cantidad          = item.Cantidad;
                    itemType.cantidadSpecified = true;

                    if (comprobante.Tipo.DiscriminaImpuestos)
                    {
                        itemType.precioUnitario      = item.PrecioUnitario;
                        itemType.importeBonificacion = item.ImporteDescuento;
                        itemType.importeIVA          = Math.Round(item.ImporteImpuestos, 2);
                        itemType.importeIVASpecified = true;
                    }
                    else
                    {
                        itemType.precioUnitario      = item.PrecioUnitarioConImpuesto;
                        itemType.importeBonificacion = item.ImporteDescuentoConImpuesto;
                    }

                    itemType.precioUnitarioSpecified      = true;
                    itemType.importeBonificacionSpecified = true;

                    itemType.importeItem = Math.Round(item.ImporteTotalConImpuesto, 2);

                    itemType.codigoCondicionIVA = Convert.ToInt16(item.Concepto.AlicuotaImpuesto.GetMemberValue(AFIPModule.PropertyNameCodigoAfip));

                    if (item.UnidadMedida == null)
                    {
                        throw new UserFriendlyException("Debe indicar unidad de medida para todos los items.");
                    }

                    itemType.codigoUnidadMedida   = ( short )item.UnidadMedida.GetMemberValue(AFIPModule.PropertyNameCodigoAfip);
                    itemType.unidadesMtx          = ( int )item.UnidadMedida.UnidadesFraccionamiento;
                    itemType.unidadesMtxSpecified = true;

                    if (item.Articulo != null)
                    {
                        itemType.codigo    = item.Articulo.Codigo;
                        itemType.codigoMtx = item.Articulo.CodigoLegal;
                    }

                    if (string.IsNullOrEmpty(itemType.codigoMtx))
                    {
                        itemType.codigoMtx = item.Concepto.CodigoLegal;
                    }

                    arrayItems.Add(itemType);
                }

                switch (( ConceptosGrupos )item.Concepto.Grupo)
                {
                case ConceptosGrupos.NoGrav:
                    impNoGrav += item.ImporteTotal;
                    break;

                case ConceptosGrupos.Exento:
                    impExento += item.ImporteTotal;
                    break;

                case ConceptosGrupos.Grav0:
                case ConceptosGrupos.Grav105:
                case ConceptosGrupos.Grav21:
                case ConceptosGrupos.Grav27:
                    impGrav += item.ImporteTotal;
                    break;

                case ConceptosGrupos.IVA0:
                case ConceptosGrupos.IVA105:
                case ConceptosGrupos.IVA21:
                case ConceptosGrupos.IVA27:
                    impIVA += item.ImporteTotal;

                    arraySubtotalesIVA.Add(new SubtotalIVAType {
                        codigo = Convert.ToInt16(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), importe = Math.Round(item.ImporteTotal, 2)
                    });
                    break;

                default:
                    if (!string.IsNullOrWhiteSpace(Convert.ToString(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip))))
                    {
                        impTrib += item.ImporteTotal;
                        arrayOtrosTributos.Add(new OtroTributoType {
                            baseImponible = item.BaseImponible, codigo = Convert.ToInt16(item.Concepto.Grupo.GetMemberValue(AFIPModule.PropertyNameCodigoAfip)), importe = Math.Round(item.ImporteTotal, 2)
                        });
                    }
                    break;
                }
            }

            req.arrayItems         = arrayItems.Count > 0 ? arrayItems.ToArray( ) : null;
            req.arraySubtotalesIVA = arraySubtotalesIVA.Count > 0 ? arraySubtotalesIVA.ToArray( ) : null;
            req.arrayOtrosTributos = arrayOtrosTributos.Count > 0 ? arrayOtrosTributos.ToArray( ) : null;

            req.importeGravado            = Math.Round(impGrav, 2);
            req.importeGravadoSpecified   = true;
            req.importeNoGravado          = Math.Round(impNoGrav, 2);
            req.importeNoGravadoSpecified = true;
            req.importeExento             = Math.Round(impExento, 2);
            req.importeExentoSpecified    = true;
            req.importeSubtotal           = req.importeGravado + req.importeNoGravado + req.importeExento;

            req.importeOtrosTributos          = Math.Round(impTrib, 2);
            req.importeOtrosTributosSpecified = arrayOtrosTributos.Count > 0;

            req.importeTotal = req.importeSubtotal + req.importeOtrosTributos + Math.Round(impIVA, 2);

            return(req);
        }