Skip to content

Commit

Permalink
tests timbrado; Ajustes encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
jtorz committed Mar 7, 2022
1 parent f431b0a commit 7a63220
Show file tree
Hide file tree
Showing 24 changed files with 1,713 additions and 115 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,7 @@ go.work

.idea/
gen/
outtests/
outtests/


*.env
6 changes: 6 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"go.testEnvFile": "${workspaceFolder}/test.env",
"files.associations": {
"*.env_": "dotenv"
},
}
28 changes: 21 additions & 7 deletions cfdi40/cfdi40_encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"reflect"

"github.com/veyronifs/cfdi-go/encoder"
"github.com/veyronifs/cfdi-go/types"
)

// Unmarshal parses the XML-encoded data and creates a Comprobante valuenc.
Expand Down Expand Up @@ -99,7 +100,7 @@ func encodeHeader(enc *encoder.Encoder, c *Comprobante) {
enc.WriteAttrStrZ("Confirmacion", c.Confirmacion)
enc.WriteAttrDecimalCurr("SubTotal", c.SubTotal, moneda)
enc.WriteAttrDecimalCurr("Total", c.Total, moneda)
enc.WriteAttrDecimalCurr("Descuento", c.Descuento, moneda)
enc.WriteAttrDecimalCurrZ("Descuento", c.Descuento, moneda)
enc.WriteAttrDecimalZ("TipoCambio", c.TipoCambio, 6)
}

Expand Down Expand Up @@ -221,7 +222,7 @@ func encodeConceptoImpuestos(enc *encoder.Encoder, impuestos *ConceptoImpuestos,
}
enc.EndElem("Traslados")
}
if len(impuestos.Traslados) > 0 {
if len(impuestos.Retenciones) > 0 {
enc.StartElem(cfdiXS.Elem("Retenciones"))
for _, impuesto := range impuestos.Retenciones {
encodeConceptoImpuestosRetenciones(enc, impuesto, moneda)
Expand All @@ -236,8 +237,10 @@ func encodeConceptoImpuestosTraslados(enc *encoder.Encoder, impuestos *ConceptoI
enc.WriteAttrDecimalCurr("Base", impuestos.Base, moneda)
enc.WriteAttrStrZ("Impuesto", string(impuestos.Impuesto))
enc.WriteAttrStrZ("TipoFactor", string(impuestos.TipoFactor))
enc.WriteAttrDecimal("TasaOCuota", impuestos.TasaOCuota, 6)
enc.WriteAttrDecimalCurr("Importe", impuestos.Importe, moneda)
if impuestos.TipoFactor != types.TipoFactorExento {
enc.WriteAttrDecimal("TasaOCuota", impuestos.TasaOCuota, 6)
enc.WriteAttrDecimalCurr("Importe", impuestos.Importe, moneda)
}
}
func encodeConceptoImpuestosRetenciones(enc *encoder.Encoder, impuestos *ConceptoImpuestosRetencion, moneda string) {
enc.StartElem(cfdiXS.Elem("Retencion"))
Expand Down Expand Up @@ -314,11 +317,14 @@ func encodeImpuestosTraslados(enc *encoder.Encoder, tras ImpuestosTraslados, mon
defer enc.EndElem("Traslados")
for _, r := range tras {
enc.StartElem(cfdiXS.Elem("Traslado"))
enc.WriteAttrDecimalCurr("Base", r.Importe, moneda)
enc.WriteAttrDecimalCurr("Base", r.Base, moneda)
enc.WriteAttrStr("Impuesto", string(r.Impuesto))
enc.WriteAttrStr("TipoFactor", string(r.TipoFactor))
enc.WriteAttrDecimal("TasaOCuota", r.TasaOCuota, 6)
enc.WriteAttrDecimalCurr("Importe", r.Importe, moneda)
if r.TipoFactor != types.TipoFactorExento {
enc.WriteAttrDecimal("TasaOCuota", r.TasaOCuota, 6)
enc.WriteAttrDecimalCurr("Importe", r.Importe, moneda)
}

enc.EndElem("Traslado")
}
}
Expand All @@ -332,8 +338,16 @@ func encodeComplemento(enc *encoder.Encoder, c *Comprobante) {
if c.Complemento.CartaPorte20 != nil {
c.Complemento.CartaPorte20.MarshalComplemento(enc, string(c.Moneda))
}
if c.Complemento.Pagos20 != nil {
c.Complemento.Pagos20.MarshalComplemento(enc)
}

if c.Complemento.CCE11 != nil {
c.Complemento.CCE11.MarshalComplemento(enc)
}

if c.Complemento.TFD11 != nil {
c.Complemento.TFD11.MarshalComplemento(enc)
}

}
113 changes: 113 additions & 0 deletions cfdi40/cfdi40_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -613,3 +613,116 @@ func TestAcentos(t *testing.T) {
err = cfdi40.CompareEqual(comprobanteOriginal, comprobanteUnmarshaled)
assert.NoError(t, err)
}

func TestPago20Honoraios(t *testing.T) {
cfdiPago := cfdi40.NewComprobantePago()
cfdiPago.LugarExpedicion = "20000"
cfdiPago.Serie = "Serie"
cfdiPago.Folio = "Folio"
cfdiPago.Fecha, _ = types.NewFechaH("2021-12-16T00:18:10")
cfdiPago.Emisor = &cfdi40.Emisor{
Rfc: "IXS7607092R5",
Nombre: "INTERNACIONAL XIMBO Y SABORES SA DE CV",
RegimenFiscal: "601",
}
cfdiPago.Receptor = &cfdi40.Receptor{
Rfc: "BAR011108CC6",
Nombre: "BARCEL",
DomicilioFiscalReceptor: "52000",
RegimenFiscalReceptor: "601",
UsoCFDI: "S01",
}
fechaPago, _ := types.NewFechaH("2021-12-15T00:00:00")
cfdiPago.Complemento = &cfdi40.Complemento{
Pagos20: &pagos20.Pagos{
Version: "2.0",
Totales: &pagos20.Totales{
MontoTotalPagos: decimal.NewFromFloat(1000),
TotalRetencionesIVA: decimal.NewNullDecimal(decimal.NewFromFloat(106.67)),
TotalRetencionesISR: decimal.NewNullDecimal(decimal.NewFromFloat(100)),
TotalTrasladosBaseIVA16: decimal.NewNullDecimal(decimal.NewFromFloat(1000)),
TotalTrasladosImpuestoIVA16: decimal.NewNullDecimal(decimal.NewFromFloat(160)),
},
Pago: []*pagos20.Pago{
{
FechaPago: fechaPago,
FormaDePagoP: types.FormaPago01,
MonedaP: types.MonedaMXN,
Monto: decimal.NewFromFloat(953.33),
TipoCambioP: decimal.NewFromFloat(1),
DoctoRelacionado: []*pagos20.DoctoRelacionado{
{
IdDocumento: "bfc36522-4b8e-45c4-8f14-d11b289f9eb7",
MonedaDR: types.MonedaMXN,
NumParcialidad: 1,
ImpSaldoAnt: decimal.NewFromFloat(953.33),
ImpPagado: decimal.NewFromFloat(953.33),
ImpSaldoInsoluto: decimal.NewFromFloat(0),
ObjetoImpDR: types.ObjetoImp01,
EquivalenciaDR: decimal.NewFromFloat(1),
ImpuestosDR: &pagos20.ImpuestosDR{
RetencionesDR: pagos20.RetencionesDR{
{
BaseDR: decimal.NewFromFloat(1000),
ImpuestoDR: types.ImpuestoISR,
TipoFactorDR: types.TipoFactorCuota,
TasaOCuotaDR: decimal.NewFromFloat(0.10),
ImporteDR: decimal.NewFromFloat(100),
},
{
BaseDR: decimal.NewFromFloat(1000),
ImpuestoDR: types.ImpuestoIVA,
TipoFactorDR: types.TipoFactorCuota,
TasaOCuotaDR: decimal.NewFromFloat(0.106666),
ImporteDR: decimal.NewFromFloat(106.67),
},
},
TrasladosDR: pagos20.TrasladosDR{
{
BaseDR: decimal.NewFromFloat(1000),
ImpuestoDR: types.ImpuestoIVA,
TipoFactorDR: types.TipoFactorCuota,
TasaOCuotaDR: decimal.NewFromFloat(0.16),
ImporteDR: decimal.NewFromFloat(160),
},
},
},
},
},
ImpuestosP: &pagos20.ImpuestosP{
RetencionesP: pagos20.RetencionesP{
{
ImpuestoP: types.ImpuestoISR,
ImporteP: decimal.NewFromFloat(100),
},
{
ImpuestoP: types.ImpuestoIVA,
ImporteP: decimal.NewFromFloat(106.67),
},
},
TrasladosP: pagos20.TrasladosP{
{
BaseP: decimal.NewFromFloat(1000),
ImpuestoP: types.ImpuestoIVA,
TipoFactorP: types.TipoFactorCuota,
TasaOCuotaP: decimal.NewFromFloat(0.16),
ImporteP: decimal.NewFromFloat(160),
},
},
},
},
},
},
}
bytez, err := cfdi40.Marshal(cfdiPago)
if err != nil {
t.Fatal(err)
}

cfdiPagoUnmarshal, err := cfdi40.Unmarshal(bytez)
if err != nil {
t.Fatal(err)
}
err = cfdi40.CompareEqual(cfdiPago, cfdiPagoUnmarshal)
assert.NoError(t, err)
}
57 changes: 57 additions & 0 deletions cfdi40/tests/egreso_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package tests_test

import (
"testing"

"github.com/shopspring/decimal"
"github.com/veyronifs/cfdi-go/cfdi40"
"github.com/veyronifs/cfdi-go/types"
)

func TestEgresoIva16(t *testing.T) {
c := &cfdi40.Comprobante{
Version: cfdi40.Version,
Moneda: types.MonedaMXN,
TipoDeComprobante: types.ComprobanteE,
Exportacion: types.Exportacion01,
LugarExpedicion: "20000",
Serie: "Serie",
Folio: "Folio",
Fecha: types.NewFechaHNow(),
Emisor: emisor16_8_0,
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)

testTimbrar(t, c)
}
Loading

0 comments on commit 7a63220

Please sign in to comment.