Skip to content

Commit

Permalink
Use zone from config instead of supplier's tax ID
Browse files Browse the repository at this point in the history
  • Loading branch information
cavalle committed Mar 18, 2024
1 parent 795cf95 commit c98e6f0
Show file tree
Hide file tree
Showing 29 changed files with 90 additions and 110 deletions.
4 changes: 3 additions & 1 deletion cancel_document.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ type CancelDocument struct {
client *Client
}

func newCancelDocument(c *Client, env *gobl.Envelope) (*CancelDocument, error) {
// NewCancelDocument creates a new AnulaTicketBAI document from the provided
// GOBL Envelope.
func (c *Client) NewCancelDocument(env *gobl.Envelope) (*CancelDocument, error) {
d := new(CancelDocument)

// Set the client for later use
Expand Down
10 changes: 4 additions & 6 deletions document.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ type Document struct {
client *Client
}

func newDocument(c *Client, env *gobl.Envelope) (*Document, error) {
// NewDocument creates a new TicketBAI document from the provided GOBL Envelope.
// The envelope must contain a valid Invoice.
func (c *Client) NewDocument(env *gobl.Envelope) (*Document, error) {
d := new(Document)

// Set the client for later use
Expand All @@ -44,13 +46,9 @@ func newDocument(c *Client, env *gobl.Envelope) (*Document, error) {
if d.inv.Supplier.TaxID.Country != l10n.ES {
return nil, ErrNotSpanish
}
d.zone = d.inv.Supplier.TaxID.Zone
if d.zone == "" {
return nil, ErrInvalidZone
}

var err error
d.tbai, err = doc.NewTicketBAI(d.inv, c.CurrentTime(), c.issuerRole)
d.tbai, err = doc.NewTicketBAI(d.inv, c.CurrentTime(), c.issuerRole, c.zone)
if err != nil {
return nil, err
}
Expand Down
2 changes: 2 additions & 0 deletions examples_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

ticketbai "github.com/invopop/gobl.ticketbai"
"github.com/invopop/gobl.ticketbai/test"
"github.com/invopop/gobl/regimes/es"
"github.com/invopop/xmldsig"
"github.com/lestrrat-go/libxml2"
"github.com/lestrrat-go/libxml2/xsd"
Expand Down Expand Up @@ -111,6 +112,7 @@ func loadTBAIClient() (*ticketbai.Client, error) {
ticketbai.WithCertificate(cert),
ticketbai.WithCurrentTime(ts),
ticketbai.WithThirdPartyIssuer(),
ticketbai.WithZone(es.ZoneBI),
)
}

Expand Down
36 changes: 18 additions & 18 deletions internal/doc/breakdown_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func TestDesgloseConversion(t *testing.T) {
t.Run("should fill DesgloseFactura when customer is from Spain", func(t *testing.T) {
goblInvoice := invoiceFromCountry(l10n.ES)

invoice, err := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, err := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)
require.NoError(t, err)

factura := invoice.Factura
Expand All @@ -37,7 +37,7 @@ func TestDesgloseConversion(t *testing.T) {
goblInvoice, _ := test.LoadInvoice("sample-invoice.json")
goblInvoice.Customer = nil

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose
assert.NotNil(t, desglose.DesgloseFactura)
Expand All @@ -47,7 +47,7 @@ func TestDesgloseConversion(t *testing.T) {
func(t *testing.T) {
goblInvoice := invoiceFromCountry("GB")

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose
assert.NotNil(t, desglose.DesgloseTipoOperacion)
Expand All @@ -59,7 +59,7 @@ func TestDesgloseConversion(t *testing.T) {
goblInvoice.Lines[0].Taxes.Get(tax.CategoryVAT).Ext = tax.ExtMap{es.ExtKeyTBAIProduct: "goods"}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

details := invoice.Factura.TipoDesglose.DesgloseTipoOperacion
assert.NotNil(t, details.Entrega)
Expand All @@ -71,7 +71,7 @@ func TestDesgloseConversion(t *testing.T) {
goblInvoice := invoiceFromCountry("GB")
goblInvoice.Lines[0].Item.Key = cbc.KeyEmpty

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

details := invoice.Factura.TipoDesglose.DesgloseTipoOperacion
assert.NotNil(t, details.PrestacionServicios)
Expand Down Expand Up @@ -130,7 +130,7 @@ func TestDesgloseConversion(t *testing.T) {
}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

details := invoice.Factura.TipoDesglose.DesgloseTipoOperacion
assert.Equal(t, 1, len(details.Entrega.NoSujeta.DetalleNoSujeta))
Expand Down Expand Up @@ -167,7 +167,7 @@ func TestDesgloseConversion(t *testing.T) {
}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

details := invoice.Factura.TipoDesglose.DesgloseTipoOperacion
goodsDetails := details.Entrega.Sujeta.NoExenta.DetalleNoExenta[0]
Expand All @@ -194,7 +194,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
assert.Equal(t, "900.00", desglose.NoSujeta.DetalleNoSujeta[0].Importe.String())
Expand All @@ -217,7 +217,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
assert.Equal(t, "RL", desglose.NoSujeta.DetalleNoSujeta[0].Causa)
Expand All @@ -240,7 +240,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseTipoOperacion
assert.Equal(t, "900.00", desglose.PrestacionServicios.NoSujeta.DetalleNoSujeta[0].Importe.String())
Expand All @@ -259,7 +259,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
desgloseIVA := desglose.Sujeta.NoExenta.DetalleNoExenta[0].DesgloseIVA
Expand All @@ -283,7 +283,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseTipoOperacion
desgloseIVA := desglose.PrestacionServicios.Sujeta.NoExenta.DetalleNoExenta[0].DesgloseIVA
Expand All @@ -304,7 +304,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
desgloseIVA := desglose.Sujeta.NoExenta.DetalleNoExenta[0].DesgloseIVA
Expand Down Expand Up @@ -339,7 +339,7 @@ func TestDesgloseConversion(t *testing.T) {
}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
desgloseIVA := desglose.Sujeta.NoExenta.DetalleNoExenta[0].DesgloseIVA
Expand All @@ -365,7 +365,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
assert.Equal(t, "1000.00", desglose.Sujeta.Exenta.DetalleExenta[0].BaseImponible)
Expand Down Expand Up @@ -411,7 +411,7 @@ func TestDesgloseConversion(t *testing.T) {
}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
e1 := findExemption(desglose.Sujeta.Exenta.DetalleExenta, "E1")
Expand All @@ -433,7 +433,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
desgloseIVA := desglose.Sujeta.NoExenta.DetalleNoExenta[0].DesgloseIVA
Expand All @@ -451,7 +451,7 @@ func TestDesgloseConversion(t *testing.T) {
}}
_ = goblInvoice.Calculate()

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

desglose := invoice.Factura.TipoDesglose.DesgloseFactura
assert.Equal(t, "S2", desglose.Sujeta.NoExenta.DetalleNoExenta[0].TipoNoExenta)
Expand Down
6 changes: 3 additions & 3 deletions internal/doc/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ type Cabecera struct {

// NewTicketBAI takes the GOBL Invoice and converts into a TicketBAI document
// ready to send to a regional API.
func NewTicketBAI(inv *bill.Invoice, ts time.Time, role IssuerRole) (*TicketBAI, error) {
err := validateInvoice(inv)
func NewTicketBAI(inv *bill.Invoice, ts time.Time, role IssuerRole, zone l10n.Code) (*TicketBAI, error) {
err := validate(inv, zone)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -124,7 +124,7 @@ func NewTicketBAI(inv *bill.Invoice, ts time.Time, role IssuerRole) (*TicketBAI,
return nil, err
}

doc.zone = inv.Supplier.TaxID.Zone
doc.zone = zone

return doc, nil
}
Expand Down
22 changes: 11 additions & 11 deletions internal/doc/doc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/invopop/gobl.ticketbai/internal/doc"
"github.com/invopop/gobl.ticketbai/test"
"github.com/invopop/gobl/l10n"
"github.com/invopop/gobl/regimes/es"
"github.com/invopop/gobl/tax"
"github.com/stretchr/testify/assert"
Expand All @@ -17,19 +18,18 @@ func TestInvoiceConversion(t *testing.T) {
require.NoError(t, err)
role := doc.IssuerRoleThirdParty

t.Run("fail when missing supplier locality", func(t *testing.T) {
t.Run("fail when missing zone", func(t *testing.T) {
inv, _ := test.LoadInvoice("sample-invoice.json")
inv.Supplier.TaxID.Zone = ""

_, err := doc.NewTicketBAI(inv, ts, role)
_, err := doc.NewTicketBAI(inv, ts, role, l10n.Code(""))
assert.Error(t, err)
assert.Contains(t, err.Error(), "supplier tax identity locality is required")
assert.Contains(t, err.Error(), "zone is required")
})

t.Run("should have the right version", func(t *testing.T) {
goblInvoice, _ := test.LoadInvoice("sample-invoice.json")

invoice, err := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, err := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

require.NoError(t, err)
assert.Equal(t, "1.2", invoice.Cabecera.IDVersionTBAI)
Expand All @@ -40,7 +40,7 @@ func TestInvoiceConversion(t *testing.T) {
goblInvoice.Supplier.TaxID.Code = "X34789654"
goblInvoice.Supplier.Name = "Fake Company SL"

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

assert.Equal(t, "Fake Company SL", invoice.Sujetos.Emisor.ApellidosNombreRazonSocial)
assert.Equal(t, "X34789654", invoice.Sujetos.Emisor.NIF)
Expand All @@ -49,7 +49,7 @@ func TestInvoiceConversion(t *testing.T) {
t.Run("should contain the issuer role code", func(t *testing.T) {
goblInvoice, _ := test.LoadInvoice("sample-invoice.json")

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, doc.IssuerRoleCustomer)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, doc.IssuerRoleCustomer, es.ZoneBI)

assert.Equal(t, "D", invoice.Sujetos.EmitidaPorTercerosODestinatario)
})
Expand All @@ -61,7 +61,7 @@ func TestInvoiceConversion(t *testing.T) {
goblInvoice.Customer.Addresses[0].Code = "50250"
goblInvoice.Customer.Addresses[0].PostOfficeBox = "PO-745"

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

assert.Equal(t, "17654245G", invoice.Sujetos.Destinatarios.IDDestinatario[0].NIF)
assert.Equal(t, "Spanish Co SL", invoice.Sujetos.Destinatarios.IDDestinatario[0].ApellidosNombreRazonSocial)
Expand All @@ -74,7 +74,7 @@ func TestInvoiceConversion(t *testing.T) {
goblInvoice.Customer.TaxID = &tax.Identity{Country: "GB", Code: "PP-123456-S"}
goblInvoice.Customer.Name = "Abroad Co LLC"

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

assert.Equal(t, "GB", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.CodigoPais)
assert.Equal(t, "PP-123456-S", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.ID)
Expand All @@ -88,7 +88,7 @@ func TestInvoiceConversion(t *testing.T) {
Country: "GB", Code: "PP-123456-S", Type: es.TaxIdentityTypeResident,
}

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

assert.Equal(t, "05", invoice.Sujetos.Destinatarios.IDDestinatario[0].IDOtro.IDType)
})
Expand All @@ -97,7 +97,7 @@ func TestInvoiceConversion(t *testing.T) {
goblInvoice, _ := test.LoadInvoice("sample-invoice.json")
goblInvoice.Customer = nil

invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, _ := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)

assert.Nil(t, invoice.Sujetos.Destinatarios)
})
Expand Down
3 changes: 2 additions & 1 deletion internal/doc/fingerprint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/invopop/gobl.ticketbai/internal/doc"
"github.com/invopop/gobl.ticketbai/test"
"github.com/invopop/gobl/regimes/es"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
Expand All @@ -29,7 +30,7 @@ func TestFingerprintGeneration(t *testing.T) {
ts, err := time.Parse(time.RFC3339, "2022-02-01T04:00:00Z")
require.NoError(t, err)
role := doc.IssuerRoleThirdParty
invoice, err := doc.NewTicketBAI(goblInvoice, ts, role)
invoice, err := doc.NewTicketBAI(goblInvoice, ts, role, es.ZoneBI)
require.NoError(t, err)
invoice.Sujetos.Emisor.NIF = test.NIF

Expand Down
Loading

0 comments on commit c98e6f0

Please sign in to comment.