diff --git a/cfdi40/cfdi40_ns_test.go b/cfdi40/cfdi40_ns_test.go index 80b179b..57eaab7 100644 --- a/cfdi40/cfdi40_ns_test.go +++ b/cfdi40/cfdi40_ns_test.go @@ -57,7 +57,7 @@ func TestNamespaces(t *testing.T) { "xmlns:cfdi": "http://www.sat.gob.mx/cfd/4", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns:cartaporte20": "http://www.sat.gob.mx/CartaPorte20", - "xmlns:pagos20": "http://www.sat.gob.mx/Pagos20", + "xmlns:pago20": "http://www.sat.gob.mx/Pagos20", "xmlns:cce11": "http://www.sat.gob.mx/ComercioExterior11", }, expectedLocations: "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd http://www.sat.gob.mx/Pagos20 http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos20.xsd http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd", @@ -71,7 +71,7 @@ func TestNamespaces(t *testing.T) { "xmlns:cfdi": "http://www.sat.gob.mx/cfd/4", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns:cartaporte20": "", - "xmlns:pagos20": "", + "xmlns:pago20": "", "xmlns:cce11": "", }, expectedLocations: "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd", @@ -87,13 +87,13 @@ func TestNamespaces(t *testing.T) { "xmlns:cfdi": "http://www.sat.gob.mx/cfd/4", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns:cartaporte20": "http://www.sat.gob.mx/CartaPorte20", - "xmlns:pagos20": "", + "xmlns:pago20": "", "xmlns:cce11": "", }, expectedLocations: "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd", }, { - name: "pagos20", + name: "pago20", c: &Comprobante{ Complemento: &Complemento{ Pagos20: &pagos20.Pagos{}, @@ -103,7 +103,7 @@ func TestNamespaces(t *testing.T) { "xmlns:cfdi": "http://www.sat.gob.mx/cfd/4", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns:cartaporte20": "", - "xmlns:pagos20": "http://www.sat.gob.mx/Pagos20", + "xmlns:pago20": "http://www.sat.gob.mx/Pagos20", "xmlns:cce11": "", }, expectedLocations: "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/Pagos20 http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos20.xsd", @@ -119,7 +119,7 @@ func TestNamespaces(t *testing.T) { "xmlns:cfdi": "http://www.sat.gob.mx/cfd/4", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns:cartaporte20": "", - "xmlns:pagos20": "", + "xmlns:pago20": "", "xmlns:cce11": "http://www.sat.gob.mx/ComercioExterior11", }, expectedLocations: "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd", @@ -136,7 +136,7 @@ func TestNamespaces(t *testing.T) { "xmlns:cfdi": "http://www.sat.gob.mx/cfd/4", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xmlns:cartaporte20": "http://www.sat.gob.mx/CartaPorte20", - "xmlns:pagos20": "", + "xmlns:pago20": "", "xmlns:cce11": "http://www.sat.gob.mx/ComercioExterior11", }, expectedLocations: "http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/CartaPorte20 http://www.sat.gob.mx/sitio_internet/cfd/CartaPorte/CartaPorte20.xsd http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd", diff --git a/complemento/comext11/comext11_encode.go b/complemento/comext11/comext11_encode.go index 47bc9da..b146e44 100644 --- a/complemento/comext11/comext11_encode.go +++ b/complemento/comext11/comext11_encode.go @@ -109,6 +109,9 @@ func encodeMercanciasMercancia(enc *encoder.Encoder, m *Mercancia) { } func encodeEmisor(enc *encoder.Encoder, emisor *Emisor) { + if emisor == nil { + return + } enc.StartElem(comext11XS.Elem("Emisor")) defer enc.EndElem("Emisor") diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e9c73b3 --- /dev/null +++ b/readme.md @@ -0,0 +1,90 @@ +# cfdi-go + +Implementacion del Estándar de Comprobante Fiscal Digital por Internet 4.0 (CFDI). + +## CFDI 4.0 + +```go +package main + +import ( + "fmt" + + "github.com/shopspring/decimal" + "github.com/veyronifs/cfdi-go/cfdi40" + "github.com/veyronifs/cfdi-go/types" +) + +func main() { + c := &cfdi40.Comprobante{ + Version: cfdi40.Version, + Moneda: types.MonedaMXN, + TipoDeComprobante: types.ComprobanteI, + Exportacion: types.Exportacion01, + LugarExpedicion: "20000", + Serie: "Serie", + Folio: "Folio", + Fecha: types.NewFechaHNow(), + Emisor: &cfdi40.Emisor{ + Rfc: "KAHO641101B39", + Nombre: "OSCAR KALA HAAK", + RegimenFiscal: types.RegimenFiscal612, + }, + Receptor: &cfdi40.Receptor{ + Rfc: "BAR011108CC6", + Nombre: "BARCEL", + DomicilioFiscalReceptor: "52000", + RegimenFiscalReceptor: "601", + UsoCFDI: types.UsoCFDICP01, + }, + Conceptos: cfdi40.Conceptos{ + { + ObjetoImp: types.ObjetoImp02, + Cantidad: decimal.NewFromFloat(1), + ClaveProdServ: "50192100", + ClaveUnidad: "XBX", + Descripcion: "Cacahuate", + Importe: decimal.NewFromFloat(1000), + NoIdentificacion: "1", + ValorUnitario: decimal.NewFromFloat(1000), + Impuestos: &cfdi40.ConceptoImpuestos{ + Traslados: cfdi40.ConceptoImpuestosTraslados{ + { + Base: decimal.NewFromFloat(1000), + Impuesto: types.ImpuestoIVA, + TipoFactor: types.TipoFactorTasa, + TasaOCuota: decimal.NewFromFloat(0.16), + Importe: decimal.NewFromFloat(160), + }, + }, + }, + }, + }, + } + c.Impuestos = cfdi40.NewImpuestos(*c) + c.SubTotal, c.Descuento, c.Total = cfdi40.CalcularTotales(*c) + + // Marshal CFDI 4.0 + xml, err := cfdi40.Marshal(c) + if err != nil { + panic(err) + } + + fmt.Println(string(xml)) + + // Unmarshal CFDI 4.0 + c2, err := cfdi40.Unmarshal(xml) + if err != nil { + panic(err) + } + fmt.Println(c2) +} + +``` + +*XML Generado:* + + +```xml + +``` \ No newline at end of file