Add company’s default payment method

I had to use a deferrable foreign key because the payment methods have
a reference to the company, and the company now a circular reference to
payment method.
This commit is contained in:
jordi fita mas 2023-03-04 22:15:52 +01:00
parent 9894925742
commit 31ef3ea47a
28 changed files with 384 additions and 135 deletions

View File

@ -8,9 +8,19 @@ values ('demo@numerus', 'Demo User', 'demo', 'invoicer')
, ('admin@numerus', 'Demo Admin', 'admin', 'admin') , ('admin@numerus', 'Demo Admin', 'admin', 'admin')
; ;
set constraints "company_default_payment_method_id_fkey" deferred;
alter sequence company_company_id_seq restart; alter sequence company_company_id_seq restart;
insert into company (business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, legal_disclaimer) insert into company (business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id, legal_disclaimer)
values ('Juli Verd', 'ES40404040D', 'Pesebre', parse_packed_phone_number('972 50 60 70', 'ES'), 'info@numerus.cat', 'https://numerus.cat/', 'C/ de lHort', 'Castelló dEmpúries', 'Girona', '17486', 'ES', 'EUR', 'Juli Verd és responsable del tractament de les seves dades dacord amb el RGPD i la LOPDGDD, i les tracta per a mantenir una relació mercantil/comercial amb vostè. Les conservarà mentre es mantingui aquesta relació i no es comunicaran a tercers. Pot exercir els drets daccés, rectificació, portabilitat, supressió, limitació i oposició a Juli Verd, amb domicili Carrer de lHort 71, 17486 Castelló dEmpúries o enviant un correu electrònic a info@numerus.cat. Per a qualsevol reclamació pot acudir a agpd.es. Per a més informació pot consultar la nostra política de privacitat a numerus.cat.'); values ('Juli Verd', 'ES40404040D', 'Pesebre', parse_packed_phone_number('972 50 60 70', 'ES'), 'info@numerus.cat', 'https://numerus.cat/', 'C/ de lHort', 'Castelló dEmpúries', 'Girona', '17486', 'ES', 'EUR', 2, 'Juli Verd és responsable del tractament de les seves dades dacord amb el RGPD i la LOPDGDD, i les tracta per a mantenir una relació mercantil/comercial amb vostè. Les conservarà mentre es mantingui aquesta relació i no es comunicaran a tercers. Pot exercir els drets daccés, rectificació, portabilitat, supressió, limitació i oposició a Juli Verd, amb domicili Carrer de lHort 71, 17486 Castelló dEmpúries o enviant un correu electrònic a info@numerus.cat. Per a qualsevol reclamació pot acudir a agpd.es. Per a més informació pot consultar la nostra política de privacitat a numerus.cat.');
alter sequence payment_method_payment_method_id_seq restart;
insert into payment_method (company_id, name, instructions)
values (1, 'Efectiu', 'Pagament en efectiu al comptat.')
, (1, 'Transferència', E'Pagament per transferència bancària al compte:\n\nES0123456789012345678901\n\nBIC AAAABBCCDD')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (1, 1) values (1, 1)

View File

@ -0,0 +1,13 @@
-- Deploy numerus:company_default_payment_method to pg
-- requires: schema_numerus
-- requires: company
-- requires: payment_method
begin;
set search_path to numerus, public;
alter table company
add column default_payment_method_id integer not null references payment_method deferrable;
commit;

View File

@ -325,14 +325,14 @@ func HandleNewInvoiceAction(w http.ResponseWriter, r *http.Request, _ httprouter
} }
type invoiceForm struct { type invoiceForm struct {
locale *Locale locale *Locale
company *Company company *Company
Customer *SelectField Customer *SelectField
Number *InputField Number *InputField
Date *InputField Date *InputField
Notes *InputField Notes *InputField
Tax *SelectField PaymentMethod *SelectField
Products []*invoiceProductForm Products []*invoiceProductForm
} }
func newInvoiceForm(ctx context.Context, conn *Conn, locale *Locale, company *Company) *invoiceForm { func newInvoiceForm(ctx context.Context, conn *Conn, locale *Locale, company *Company) *invoiceForm {
@ -358,15 +358,16 @@ func newInvoiceForm(ctx context.Context, conn *Conn, locale *Locale, company *Co
Required: true, Required: true,
}, },
Notes: &InputField{ Notes: &InputField{
Name: "description", Name: "notes",
Label: pgettext("input", "Notes", locale), Label: pgettext("input", "Notes", locale),
Type: "textarea", Type: "textarea",
}, },
Tax: &SelectField{ PaymentMethod: &SelectField{
Name: "text", Name: "payment_method",
Label: pgettext("input", "Taxes", locale), Required: true,
Multiple: true, Label: pgettext("input", "Payment Method", locale),
Options: mustGetTaxOptions(ctx, conn, company), Selected: []string{conn.MustGetText(ctx, "", "select default_payment_method_id::text from company where company_id = $1", company.Id)},
Options: MustGetOptions(ctx, conn, "select payment_method_id::text, name from payment_method where company_id = $1", company.Id),
}, },
} }
} }
@ -380,11 +381,12 @@ func (form *invoiceForm) Parse(r *http.Request) error {
form.Date.FillValue(r) form.Date.FillValue(r)
form.Notes.FillValue(r) form.Notes.FillValue(r)
if _, ok := r.Form["product.id.0"]; ok { if _, ok := r.Form["product.id.0"]; ok {
taxOptions := mustGetTaxOptions(r.Context(), getConn(r), form.company)
for index := 0; true; index++ { for index := 0; true; index++ {
if _, ok := r.Form["product.id."+strconv.Itoa(index)]; !ok { if _, ok := r.Form["product.id."+strconv.Itoa(index)]; !ok {
break break
} }
productForm := newInvoiceProductForm(index, form.company, form.locale, form.Tax.Options) productForm := newInvoiceProductForm(index, form.company, form.locale, taxOptions)
if err := productForm.Parse(r); err != nil { if err := productForm.Parse(r); err != nil {
return err return err
} }
@ -401,7 +403,7 @@ func (form *invoiceForm) Validate() bool {
if validator.CheckRequiredInput(form.Date, gettext("Invoice date can not be empty.", form.locale)) { if validator.CheckRequiredInput(form.Date, gettext("Invoice date can not be empty.", form.locale)) {
validator.CheckValidDate(form.Date, gettext("Invoice date must be a valid date.", form.locale)) validator.CheckValidDate(form.Date, gettext("Invoice date must be a valid date.", form.locale))
} }
validator.CheckValidSelectOption(form.Tax, gettext("Selected tax is not valid.", form.locale)) validator.CheckValidSelectOption(form.PaymentMethod, gettext("Selected payment method is not valid.", form.locale))
allOK := validator.AllOK() allOK := validator.AllOK()
for _, product := range form.Products { for _, product := range form.Products {
@ -427,8 +429,9 @@ func (form *invoiceForm) AddProducts(ctx context.Context, conn *Conn, productsId
index := len(form.Products) index := len(form.Products)
rows := conn.MustQuery(ctx, "select product_id, name, description, to_price(price, decimal_digits), 1 as quantity, 0 as discount, array_remove(array_agg(tax_id), null) from product join company using (company_id) join currency using (currency_code) left join product_tax using (product_id) where product_id = any ($1) group by product_id, name, description, price, decimal_digits", productsId) rows := conn.MustQuery(ctx, "select product_id, name, description, to_price(price, decimal_digits), 1 as quantity, 0 as discount, array_remove(array_agg(tax_id), null) from product join company using (company_id) join currency using (currency_code) left join product_tax using (product_id) where product_id = any ($1) group by product_id, name, description, price, decimal_digits", productsId)
defer rows.Close() defer rows.Close()
taxOptions := mustGetTaxOptions(ctx, conn, form.company)
for rows.Next() { for rows.Next() {
product := newInvoiceProductForm(index, form.company, form.locale, form.Tax.Options) product := newInvoiceProductForm(index, form.company, form.locale, taxOptions)
if err := rows.Scan(product.ProductId, product.Name, product.Description, product.Price, product.Quantity, product.Discount, product.Tax); err != nil { if err := rows.Scan(product.ProductId, product.Name, product.Description, product.Price, product.Quantity, product.Discount, product.Tax); err != nil {
panic(err) panic(err)
} }

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: numerus\n" "Project-Id-Version: numerus\n"
"Report-Msgid-Bugs-To: jordi@tandem.blog\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n"
"POT-Creation-Date: 2023-03-03 16:38+0100\n" "POT-Creation-Date: 2023-03-04 22:11+0100\n"
"PO-Revision-Date: 2023-01-18 17:08+0100\n" "PO-Revision-Date: 2023-01-18 17:08+0100\n"
"Last-Translator: jordi fita mas <jordi@tandem.blog>\n" "Last-Translator: jordi fita mas <jordi@tandem.blog>\n"
"Language-Team: Catalan <ca@dodds.net>\n" "Language-Team: Catalan <ca@dodds.net>\n"
@ -69,28 +69,28 @@ msgstr "Preu"
msgid "No products added yet." msgid "No products added yet."
msgstr "No hi ha cap producte." msgstr "No hi ha cap producte."
#: web/template/invoices/products.gohtml:65 web/template/invoices/new.gohtml:60 #: web/template/invoices/products.gohtml:65 web/template/invoices/new.gohtml:61
msgctxt "action" msgctxt "action"
msgid "Add products" msgid "Add products"
msgstr "Afegeix productes" msgstr "Afegeix productes"
#: web/template/invoices/new.gohtml:41 web/template/invoices/view.gohtml:58 #: web/template/invoices/new.gohtml:42 web/template/invoices/view.gohtml:58
msgctxt "title" msgctxt "title"
msgid "Subtotal" msgid "Subtotal"
msgstr "Subtotal" msgstr "Subtotal"
#: web/template/invoices/new.gohtml:51 web/template/invoices/view.gohtml:62 #: web/template/invoices/new.gohtml:52 web/template/invoices/view.gohtml:62
#: web/template/invoices/view.gohtml:102 #: web/template/invoices/view.gohtml:102
msgctxt "title" msgctxt "title"
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: web/template/invoices/new.gohtml:63 #: web/template/invoices/new.gohtml:64
msgctxt "action" msgctxt "action"
msgid "Update" msgid "Update"
msgstr "Actualitza" msgstr "Actualitza"
#: web/template/invoices/new.gohtml:65 web/template/invoices/index.gohtml:13 #: web/template/invoices/new.gohtml:66 web/template/invoices/index.gohtml:13
msgctxt "action" msgctxt "action"
msgid "New invoice" msgid "New invoice"
msgstr "Nova factura" msgstr "Nova factura"
@ -408,44 +408,44 @@ msgstr "No podeu deixar la contrasenya en blanc."
msgid "Invalid user or password." msgid "Invalid user or password."
msgstr "Nom dusuari o contrasenya incorrectes." msgstr "Nom dusuari o contrasenya incorrectes."
#: pkg/products.go:165 pkg/invoices.go:469 #: pkg/products.go:165 pkg/invoices.go:472
msgctxt "input" msgctxt "input"
msgid "Name" msgid "Name"
msgstr "Nom" msgstr "Nom"
#: pkg/products.go:171 pkg/invoices.go:474 #: pkg/products.go:171 pkg/invoices.go:477
msgctxt "input" msgctxt "input"
msgid "Description" msgid "Description"
msgstr "Descripció" msgstr "Descripció"
#: pkg/products.go:176 pkg/invoices.go:478 #: pkg/products.go:176 pkg/invoices.go:481
msgctxt "input" msgctxt "input"
msgid "Price" msgid "Price"
msgstr "Preu" msgstr "Preu"
#: pkg/products.go:186 pkg/invoices.go:367 pkg/invoices.go:504 #: pkg/products.go:186 pkg/invoices.go:507
msgctxt "input" msgctxt "input"
msgid "Taxes" msgid "Taxes"
msgstr "Imposts" msgstr "Imposts"
#: pkg/products.go:206 pkg/profile.go:92 pkg/invoices.go:400 #: pkg/products.go:206 pkg/profile.go:92 pkg/invoices.go:402
#: pkg/invoices.go:540 #: pkg/invoices.go:543
msgid "Name can not be empty." msgid "Name can not be empty."
msgstr "No podeu deixar el nom en blanc." msgstr "No podeu deixar el nom en blanc."
#: pkg/products.go:207 pkg/invoices.go:541 #: pkg/products.go:207 pkg/invoices.go:544
msgid "Price can not be empty." msgid "Price can not be empty."
msgstr "No podeu deixar el preu en blanc." msgstr "No podeu deixar el preu en blanc."
#: pkg/products.go:208 pkg/invoices.go:542 #: pkg/products.go:208 pkg/invoices.go:545
msgid "Price must be a number greater than zero." msgid "Price must be a number greater than zero."
msgstr "El preu ha de ser un número major a zero." msgstr "El preu ha de ser un número major a zero."
#: pkg/products.go:210 pkg/invoices.go:404 pkg/invoices.go:550 #: pkg/products.go:210 pkg/invoices.go:553
msgid "Selected tax is not valid." msgid "Selected tax is not valid."
msgstr "Heu seleccionat un impost que no és vàlid." msgstr "Heu seleccionat un impost que no és vàlid."
#: pkg/products.go:211 pkg/invoices.go:551 #: pkg/products.go:211 pkg/invoices.go:554
msgid "You can only select a tax of each class." msgid "You can only select a tax of each class."
msgstr "Només podeu seleccionar un impost de cada classe." msgstr "Només podeu seleccionar un impost de cada classe."
@ -581,42 +581,51 @@ msgctxt "input"
msgid "Notes" msgid "Notes"
msgstr "Notes" msgstr "Notes"
#: pkg/invoices.go:401 #: pkg/invoices.go:368
msgctxt "input"
msgid "Payment Method"
msgstr "Mètode de pagament"
#: pkg/invoices.go:403
msgid "Invoice date can not be empty." msgid "Invoice date can not be empty."
msgstr "No podeu deixar la data de la factura en blanc." msgstr "No podeu deixar la data de la factura en blanc."
#: pkg/invoices.go:402 #: pkg/invoices.go:404
msgid "Invoice date must be a valid date." msgid "Invoice date must be a valid date."
msgstr "La data de facturació ha de ser vàlida." msgstr "La data de facturació ha de ser vàlida."
#: pkg/invoices.go:464 #: pkg/invoices.go:406
msgid "Selected payment method is not valid."
msgstr "Heu seleccionat un mètode de pagament que no és vàlid."
#: pkg/invoices.go:467
msgctxt "input" msgctxt "input"
msgid "Id" msgid "Id"
msgstr "Identificador" msgstr "Identificador"
#: pkg/invoices.go:487 #: pkg/invoices.go:490
msgctxt "input" msgctxt "input"
msgid "Quantity" msgid "Quantity"
msgstr "Quantitat" msgstr "Quantitat"
#: pkg/invoices.go:495 #: pkg/invoices.go:498
msgctxt "input" msgctxt "input"
msgid "Discount (%)" msgid "Discount (%)"
msgstr "Descompte (%)" msgstr "Descompte (%)"
#: pkg/invoices.go:544 #: pkg/invoices.go:547
msgid "Quantity can not be empty." msgid "Quantity can not be empty."
msgstr "No podeu deixar la quantitat en blanc." msgstr "No podeu deixar la quantitat en blanc."
#: pkg/invoices.go:545 #: pkg/invoices.go:548
msgid "Quantity must be a number greater than zero." msgid "Quantity must be a number greater than zero."
msgstr "La quantitat ha de ser un número major a zero." msgstr "La quantitat ha de ser un número major a zero."
#: pkg/invoices.go:547 #: pkg/invoices.go:550
msgid "Discount can not be empty." msgid "Discount can not be empty."
msgstr "No podeu deixar el descompte en blanc." msgstr "No podeu deixar el descompte en blanc."
#: pkg/invoices.go:548 #: pkg/invoices.go:551
msgid "Discount must be a percentage between 0 and 100." msgid "Discount must be a percentage between 0 and 100."
msgstr "El descompte ha de ser un percentatge entre 0 i 100." msgstr "El descompte ha de ser un percentatge entre 0 i 100."

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: numerus\n" "Project-Id-Version: numerus\n"
"Report-Msgid-Bugs-To: jordi@tandem.blog\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n"
"POT-Creation-Date: 2023-03-03 16:38+0100\n" "POT-Creation-Date: 2023-03-04 22:11+0100\n"
"PO-Revision-Date: 2023-01-18 17:45+0100\n" "PO-Revision-Date: 2023-01-18 17:45+0100\n"
"Last-Translator: jordi fita mas <jordi@tandem.blog>\n" "Last-Translator: jordi fita mas <jordi@tandem.blog>\n"
"Language-Team: Spanish <es@tp.org.es>\n" "Language-Team: Spanish <es@tp.org.es>\n"
@ -69,28 +69,28 @@ msgstr "Precio"
msgid "No products added yet." msgid "No products added yet."
msgstr "No hay productos." msgstr "No hay productos."
#: web/template/invoices/products.gohtml:65 web/template/invoices/new.gohtml:60 #: web/template/invoices/products.gohtml:65 web/template/invoices/new.gohtml:61
msgctxt "action" msgctxt "action"
msgid "Add products" msgid "Add products"
msgstr "Añadir productos" msgstr "Añadir productos"
#: web/template/invoices/new.gohtml:41 web/template/invoices/view.gohtml:58 #: web/template/invoices/new.gohtml:42 web/template/invoices/view.gohtml:58
msgctxt "title" msgctxt "title"
msgid "Subtotal" msgid "Subtotal"
msgstr "Subtotal" msgstr "Subtotal"
#: web/template/invoices/new.gohtml:51 web/template/invoices/view.gohtml:62 #: web/template/invoices/new.gohtml:52 web/template/invoices/view.gohtml:62
#: web/template/invoices/view.gohtml:102 #: web/template/invoices/view.gohtml:102
msgctxt "title" msgctxt "title"
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: web/template/invoices/new.gohtml:63 #: web/template/invoices/new.gohtml:64
msgctxt "action" msgctxt "action"
msgid "Update" msgid "Update"
msgstr "Actualizar" msgstr "Actualizar"
#: web/template/invoices/new.gohtml:65 web/template/invoices/index.gohtml:13 #: web/template/invoices/new.gohtml:66 web/template/invoices/index.gohtml:13
msgctxt "action" msgctxt "action"
msgid "New invoice" msgid "New invoice"
msgstr "Nueva factura" msgstr "Nueva factura"
@ -305,7 +305,7 @@ msgstr "Moneda"
#: web/template/tax-details.gohtml:37 #: web/template/tax-details.gohtml:37
msgctxt "title" msgctxt "title"
msgid "Invoicing" msgid "Invoicing"
msgstr "Facturació" msgstr "Facturación"
#: web/template/tax-details.gohtml:54 #: web/template/tax-details.gohtml:54
msgctxt "title" msgctxt "title"
@ -408,46 +408,46 @@ msgstr "No podéis dejar la contraseña en blanco."
msgid "Invalid user or password." msgid "Invalid user or password."
msgstr "Nombre de usuario o contraseña inválido." msgstr "Nombre de usuario o contraseña inválido."
#: pkg/products.go:165 pkg/invoices.go:469 #: pkg/products.go:165 pkg/invoices.go:472
msgctxt "input" msgctxt "input"
msgid "Name" msgid "Name"
msgstr "Nombre" msgstr "Nombre"
#: pkg/products.go:171 pkg/invoices.go:474 #: pkg/products.go:171 pkg/invoices.go:477
msgctxt "input" msgctxt "input"
msgid "Description" msgid "Description"
msgstr "Descripción" msgstr "Descripción"
#: pkg/products.go:176 pkg/invoices.go:478 #: pkg/products.go:176 pkg/invoices.go:481
msgctxt "input" msgctxt "input"
msgid "Price" msgid "Price"
msgstr "Precio" msgstr "Precio"
#: pkg/products.go:186 pkg/invoices.go:367 pkg/invoices.go:504 #: pkg/products.go:186 pkg/invoices.go:507
msgctxt "input" msgctxt "input"
msgid "Taxes" msgid "Taxes"
msgstr "Impuestos" msgstr "Impuestos"
#: pkg/products.go:206 pkg/profile.go:92 pkg/invoices.go:400 #: pkg/products.go:206 pkg/profile.go:92 pkg/invoices.go:402
#: pkg/invoices.go:540 #: pkg/invoices.go:543
msgid "Name can not be empty." msgid "Name can not be empty."
msgstr "No podéis dejar el nombre en blanco." msgstr "No podéis dejar el nombre en blanco."
#: pkg/products.go:207 pkg/invoices.go:541 #: pkg/products.go:207 pkg/invoices.go:544
msgid "Price can not be empty." msgid "Price can not be empty."
msgstr "No podéis dejar el precio en blanco." msgstr "No podéis dejar el precio en blanco."
#: pkg/products.go:208 pkg/invoices.go:542 #: pkg/products.go:208 pkg/invoices.go:545
msgid "Price must be a number greater than zero." msgid "Price must be a number greater than zero."
msgstr "El precio tiene que ser un número mayor a cero." msgstr "El precio tiene que ser un número mayor a cero."
#: pkg/products.go:210 pkg/invoices.go:404 pkg/invoices.go:550 #: pkg/products.go:210 pkg/invoices.go:553
msgid "Selected tax is not valid." msgid "Selected tax is not valid."
msgstr "Habéis escogido un impuesto que no es válido." msgstr "Habéis escogido un impuesto que no es válido."
#: pkg/products.go:211 pkg/invoices.go:551 #: pkg/products.go:211 pkg/invoices.go:554
msgid "You can only select a tax of each class." msgid "You can only select a tax of each class."
msgstr "Solo podéis escojer un impuesto de cada clase." msgstr "Solo podéis escoger un impuesto de cada clase."
#: pkg/company.go:98 #: pkg/company.go:98
msgctxt "input" msgctxt "input"
@ -581,44 +581,53 @@ msgctxt "input"
msgid "Notes" msgid "Notes"
msgstr "Notas" msgstr "Notas"
#: pkg/invoices.go:401 #: pkg/invoices.go:368
msgctxt "input"
msgid "Payment Method"
msgstr "Método de pago"
#: pkg/invoices.go:403
msgid "Invoice date can not be empty." msgid "Invoice date can not be empty."
msgstr "No podéis dejar la fecha de la factura en blanco." msgstr "No podéis dejar la fecha de la factura en blanco."
#: pkg/invoices.go:402 #: pkg/invoices.go:404
msgid "Invoice date must be a valid date." msgid "Invoice date must be a valid date."
msgstr "La fecha de factura debe ser válida." msgstr "La fecha de factura debe ser válida."
#: pkg/invoices.go:464 #: pkg/invoices.go:406
msgid "Selected payment method is not valid."
msgstr "Habéis escogido un método de pago que no es válido."
#: pkg/invoices.go:467
msgctxt "input" msgctxt "input"
msgid "Id" msgid "Id"
msgstr "Identificador" msgstr "Identificador"
#: pkg/invoices.go:487 #: pkg/invoices.go:490
msgctxt "input" msgctxt "input"
msgid "Quantity" msgid "Quantity"
msgstr "Cantidad" msgstr "Cantidad"
#: pkg/invoices.go:495 #: pkg/invoices.go:498
msgctxt "input" msgctxt "input"
msgid "Discount (%)" msgid "Discount (%)"
msgstr "Descuento (%)" msgstr "Descuento (%)"
#: pkg/invoices.go:544 #: pkg/invoices.go:547
msgid "Quantity can not be empty." msgid "Quantity can not be empty."
msgstr "No podéis dejar la cantidad en blanco." msgstr "No podéis dejar la cantidad en blanco."
#: pkg/invoices.go:545 #: pkg/invoices.go:548
msgid "Quantity must be a number greater than zero." msgid "Quantity must be a number greater than zero."
msgstr "La cantidad tiene que ser un número mayor a cero." msgstr "La cantidad tiene que ser un número mayor a cero."
#: pkg/invoices.go:547 #: pkg/invoices.go:550
msgid "Discount can not be empty." msgid "Discount can not be empty."
msgstr "No podéis dejar el descuento en blanco." msgstr "No podéis dejar el descuento en blanco."
#: pkg/invoices.go:548 #: pkg/invoices.go:551
msgid "Discount must be a percentage between 0 and 100." msgid "Discount must be a percentage between 0 and 100."
msgstr "El descuento tiene que ser un percentage entre 0 y 100." msgstr "El descuento tiene que ser un porcentaje entre 0 y 100."
#: pkg/contacts.go:143 #: pkg/contacts.go:143
msgctxt "input" msgctxt "input"

View File

@ -0,0 +1,8 @@
-- Revert numerus:company_default_payment_method from pg
begin;
alter table numerus.company
drop column if exists default_payment_method_id;
commit;

View File

@ -36,6 +36,8 @@ country_i18n [schema_numerus country_code language country] 2023-01-27T19:20:43Z
available_countries [schema_numerus country country_i18n] 2023-01-27T18:49:28Z jordi fita mas <jordi@tandem.blog> # Add the list of available countries available_countries [schema_numerus country country_i18n] 2023-01-27T18:49:28Z jordi fita mas <jordi@tandem.blog> # Add the list of available countries
company [schema_numerus extension_vat email extension_pg_libphonenumber extension_uri currency_code currency country_code country] 2023-01-24T15:03:15Z jordi fita mas <jordi@tandem.blog> # Add the relation for companies company [schema_numerus extension_vat email extension_pg_libphonenumber extension_uri currency_code currency country_code country] 2023-01-24T15:03:15Z jordi fita mas <jordi@tandem.blog> # Add the relation for companies
company_user [schema_numerus user company] 2023-01-24T17:50:06Z jordi fita mas <jordi@tandem.blog> # Add the relation of companies and their users company_user [schema_numerus user company] 2023-01-24T17:50:06Z jordi fita mas <jordi@tandem.blog> # Add the relation of companies and their users
payment_method [schema_numerus company] 2023-03-03T15:00:41Z jordi fita mas <jordi@tandem.blog> # Add relation of payment method
company_default_payment_method [schema_numerus company payment_method] 2023-03-04T20:25:20Z jordi fita mas <jordi@tandem.blog> # Add the companys default payment method property
tax_class [schema_numerus company] 2023-02-28T10:13:14Z jordi fita mas <jordi@tandem.blog> # Add the relation for tax classes tax_class [schema_numerus company] 2023-02-28T10:13:14Z jordi fita mas <jordi@tandem.blog> # Add the relation for tax classes
tax_rate [schema_numerus] 2023-01-28T11:33:39Z jordi fita mas <jordi@tandem.blog> # Add domain for tax rates tax_rate [schema_numerus] 2023-01-28T11:33:39Z jordi fita mas <jordi@tandem.blog> # Add domain for tax rates
tax [schema_numerus company tax_rate tax_class] 2023-01-28T11:45:47Z jordi fita mas <jordi@tandem.blog> # Add relation for taxes tax [schema_numerus company tax_rate tax_class] 2023-01-28T11:45:47Z jordi fita mas <jordi@tandem.blog> # Add relation for taxes
@ -47,7 +49,7 @@ invoice_status [schema_numerus] 2023-02-07T14:50:26Z jordi fita mas <jordi@tande
invoice_status_i18n [schema_numerus invoice_status language] 2023-02-07T14:56:18Z jordi fita mas <jordi@tandem.blog> # Add relation for invoice status translatable texts invoice_status_i18n [schema_numerus invoice_status language] 2023-02-07T14:56:18Z jordi fita mas <jordi@tandem.blog> # Add relation for invoice status translatable texts
available_invoice_status [schema_numerus invoice_status invoice_status_i18n] 2023-02-07T15:07:06Z jordi fita mas <jordi@tandem.blog> # Add the list of available invoice status available_invoice_status [schema_numerus invoice_status invoice_status_i18n] 2023-02-07T15:07:06Z jordi fita mas <jordi@tandem.blog> # Add the list of available invoice status
product_tax [schema_numerus product tax] 2023-02-08T11:36:49Z jordi fita mas <jordi@tandem.blog> # Add relation of product taxes product_tax [schema_numerus product tax] 2023-02-08T11:36:49Z jordi fita mas <jordi@tandem.blog> # Add relation of product taxes
invoice [schema_numerus company contact invoice_status currency] 2023-02-09T09:52:21Z jordi fita mas <jordi@tandem.blog> # Add relation for invoice invoice [schema_numerus company contact invoice_status payment_method currency] 2023-02-09T09:52:21Z jordi fita mas <jordi@tandem.blog> # Add relation for invoice
discount_rate [schema_numerus] 2023-02-10T17:22:40Z jordi fita mas <jordi@tandem.blog> # Add domain for discount rates discount_rate [schema_numerus] 2023-02-10T17:22:40Z jordi fita mas <jordi@tandem.blog> # Add domain for discount rates
invoice_product [schema_numerus invoice discount_rate] 2023-02-10T17:07:08Z jordi fita mas <jordi@tandem.blog> # Add relation for invoice product invoice_product [schema_numerus invoice discount_rate] 2023-02-10T17:07:08Z jordi fita mas <jordi@tandem.blog> # Add relation for invoice product
add_product [schema_numerus product product_tax parse_price company currency] 2023-02-14T10:32:18Z jordi fita mas <jordi@tandem.blog> # Add function to add new products add_product [schema_numerus product product_tax parse_price company currency] 2023-02-14T10:32:18Z jordi fita mas <jordi@tandem.blog> # Add function to add new products
@ -62,4 +64,3 @@ invoice_product_amount [schema_numerus invoice_product invoice_product_tax] 2023
invoice_amount [schema_numerus invoice_product invoice_product_amount] 2023-02-22T12:58:46Z jordi fita mas <jordi@tandem.blog> # Add view to compute subtotal and total for invoices invoice_amount [schema_numerus invoice_product invoice_product_amount] 2023-02-22T12:58:46Z jordi fita mas <jordi@tandem.blog> # Add view to compute subtotal and total for invoices
new_invoice_amount [schema_numerus] 2023-02-23T12:08:25Z jordi fita mas <jordi@tandem.blog> # Add type to return when computing new invoice amounts new_invoice_amount [schema_numerus] 2023-02-23T12:08:25Z jordi fita mas <jordi@tandem.blog> # Add type to return when computing new invoice amounts
compute_new_invoice_amount [schema_numerus company currency tax new_invoice_product new_invoice_amount] 2023-02-23T12:20:13Z jordi fita mas <jordi@tandem.blog> # Add function to compute the subtotal, taxes, and total amounts for a new invoice compute_new_invoice_amount [schema_numerus company currency tax new_invoice_product new_invoice_amount] 2023-02-23T12:20:13Z jordi fita mas <jordi@tandem.blog> # Add function to compute the subtotal, taxes, and total amounts for a new invoice
payment_method [schema_numerus company] 2023-03-03T15:00:41Z jordi fita mas <jordi@tandem.blog> # Add relation of payment method

View File

@ -29,14 +29,24 @@ truncate contact cascade;
truncate product cascade; truncate product cascade;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, invoice_number_format) set constraints "company_default_payment_method_id_fkey" deferred;
values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', '"F"YYYY0000')
, (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', '"INV"000-YY') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, invoice_number_format, default_payment_method_id)
values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', '"F"YYYY0000', 111)
, (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', '"INV"000-YY', 222)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into invoice_number_counter (company_id, year, currval) insert into invoice_number_counter (company_id, year, currval)
values (1, 2023, '5') values (1, 2023, '5')
, (2, 2023, '55') , (2, 2023, '55')

View File

@ -25,15 +25,24 @@ truncate product_tax cascade;
truncate product cascade; truncate product cascade;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
set constraints "company_default_payment_method_id_fkey" deferred;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR') values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 111)
, (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') , (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 222)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into tax_class (tax_class_id, company_id, name) insert into tax_class (tax_class_id, company_id, name)
values (11, 1, 'tax') values (11, 1, 'tax')
, (22, 2, 'tax') , (22, 2, 'tax')

View File

@ -5,7 +5,7 @@ reset client_min_messages;
begin; begin;
select plan(90); select plan(96);
set search_path to numerus, auth, public; set search_path to numerus, auth, public;
@ -106,6 +106,13 @@ select col_not_null('company', 'legal_disclaimer');
select col_has_default('company', 'legal_disclaimer'); select col_has_default('company', 'legal_disclaimer');
select col_default_is('company', 'legal_disclaimer', ''); select col_default_is('company', 'legal_disclaimer', '');
select has_column('company', 'default_payment_method_id');
select col_is_fk('company', 'default_payment_method_id');
select fk_ok('company', 'default_payment_method_id', 'payment_method', 'payment_method_id');
select col_type_is('company', 'default_payment_method_id', 'integer');
select col_not_null('company', 'default_payment_method_id');
select col_hasnt_default('company', 'default_payment_method_id');
select has_column('company', 'created_at'); select has_column('company', 'created_at');
select col_type_is('company', 'created_at', 'timestamp with time zone'); select col_type_is('company', 'created_at', 'timestamp with time zone');
select col_not_null('company', 'created_at'); select col_not_null('company', 'created_at');
@ -115,6 +122,7 @@ select col_default_is('company', 'created_at', current_timestamp);
set client_min_messages to warning; set client_min_messages to warning;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -124,12 +132,22 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
, (6, 'Company 6', 'XX345', '', '777-777-777', 'c@c', '', '', '', '', '', 'DE', 'USD') values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 20)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 40)
, (6, 'Company 6', 'XX345', '', '777-777-777', 'c@c', '', '', '', '', '', 'DE', 'USD', 60)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (20, 2, 'cash', 'cash')
, (40, 4, 'cash', 'cash')
, (60, 6, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (2, 5) , (2, 5)
@ -175,8 +193,8 @@ select throws_ok(
reset role; reset role;
select throws_ok( $$ select throws_ok( $$
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (7, ' ', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR') values (7, ' ', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 20)
$$, $$,
'23514', 'new row for relation "company" violates check constraint "business_name_not_empty"', '23514', 'new row for relation "company" violates check constraint "business_name_not_empty"',
'Should not allow companies with blank business name' 'Should not allow companies with blank business name'

View File

@ -22,13 +22,22 @@ select function_privs_are('numerus', 'compute_new_invoice_amount', array ['integ
set client_min_messages to warning; set client_min_messages to warning;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 111)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into tax_class (tax_class_id, company_id, name) insert into tax_class (tax_class_id, company_id, name)
values (11, 1, 'tax') values (11, 1, 'tax')
; ;

View File

@ -109,20 +109,30 @@ select col_default_is('contact', 'created_at', current_timestamp);
set client_min_messages to warning; set client_min_messages to warning;
truncate contact cascade; truncate contact cascade;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
set constraints "company_default_payment_method_id_fkey" deferred;
insert into auth."user" (user_id, email, name, password, role, cookie, cookie_expires_at) insert into auth."user" (user_id, email, name, password, role, cookie, cookie_expires_at)
values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e', current_timestamp + interval '1 month') values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e', current_timestamp + interval '1 month')
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR') values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') , (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -25,15 +25,24 @@ truncate product_tax cascade;
truncate product cascade; truncate product cascade;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
set constraints "company_default_payment_method_id_fkey" deferred;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR') values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 111)
, (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') , (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 222)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into tax_class (tax_class_id, company_id, name) insert into tax_class (tax_class_id, company_id, name)
values (11, 1, 'tax') values (11, 1, 'tax')
, (22, 2, 'tax') , (22, 2, 'tax')

View File

@ -94,6 +94,7 @@ truncate invoice cascade;
truncate contact cascade; truncate contact cascade;
truncate company_user cascade; truncate company_user cascade;
truncate company cascade; truncate company cascade;
truncate payment_method cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -102,11 +103,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -33,13 +33,22 @@ truncate contact cascade;
truncate product cascade; truncate product cascade;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 111)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into tax_class (tax_class_id, company_id, name) insert into tax_class (tax_class_id, company_id, name)
values (11, 1, 'tax') values (11, 1, 'tax')
; ;

View File

@ -37,6 +37,7 @@ select col_hasnt_default('invoice_number_counter', 'currval');
set client_min_messages to warning; set client_min_messages to warning;
truncate invoice_number_counter cascade; truncate invoice_number_counter cascade;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -46,11 +47,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -78,6 +78,7 @@ truncate invoice cascade;
truncate product cascade; truncate product cascade;
truncate contact cascade; truncate contact cascade;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -87,11 +88,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -33,13 +33,22 @@ truncate contact cascade;
truncate product cascade; truncate product cascade;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 111)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into tax_class (tax_class_id, company_id, name) insert into tax_class (tax_class_id, company_id, name)
values (11, 1, 'tax') values (11, 1, 'tax')
; ;

View File

@ -46,6 +46,7 @@ truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate contact cascade; truncate contact cascade;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -55,11 +56,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -33,13 +33,22 @@ truncate contact cascade;
truncate product cascade; truncate product cascade;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (1, 'Company 1', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 111)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into tax_class (tax_class_id, company_id, name) insert into tax_class (tax_class_id, company_id, name)
values (11, 1, 'tax') values (11, 1, 'tax')
; ;

View File

@ -22,14 +22,24 @@ select function_privs_are('numerus', 'next_invoice_number', array ['integer', 'd
set client_min_messages to warning; set client_min_messages to warning;
truncate invoice_number_counter cascade; truncate invoice_number_counter cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
reset client_min_messages; reset client_min_messages;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, invoice_number_format) set constraints "company_default_payment_method_id_fkey" deferred;
values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', '"F"YYYY0000')
, (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', '"INV"000-YY') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, invoice_number_format, default_payment_method_id)
values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', '"F"YYYY0000', 111)
, (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', '"INV"000-YY', 222)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (111, 1, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into invoice_number_counter (company_id, year, currval) insert into invoice_number_counter (company_id, year, currval)
values (1, 2010, 5) values (1, 2010, 5)
, (2, 2010, 6) , (2, 2010, 6)

View File

@ -59,9 +59,11 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
@ -69,12 +71,14 @@ values (2, 1)
, (4, 5) , (4, 5)
; ;
insert into payment_method(company_id, name, instructions) insert into payment_method(payment_method_id, company_id, name, instructions)
values (2, 'Cash', 'Payment in cash.') values (222, 2, 'Cash', 'Payment in cash.')
, (2, 'Wire Transfer', 'Please, transfer money to my Nigerian bank') , (223, 2, 'Wire Transfer', 'Please, transfer money to my Nigerian bank')
, (4, 'Pigeon', 'Send money via carrier pigeon.') , (444, 4, 'Pigeon', 'Send money via carrier pigeon.')
; ;
set constraints "company_default_payment_method_id_fkey" immediate;
prepare payment_method_data as prepare payment_method_data as
select company_id, name, instructions select company_id, name, instructions
from payment_method; from payment_method;

View File

@ -68,6 +68,7 @@ select col_default_is('product', 'created_at', current_timestamp);
set client_min_messages to warning; set client_min_messages to warning;
truncate product cascade; truncate product cascade;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -77,11 +78,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -38,6 +38,7 @@ truncate product cascade;
truncate tax cascade; truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -47,11 +48,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -59,6 +59,7 @@ truncate tax cascade;
truncate tax_class cascade; truncate tax_class cascade;
truncate company_user cascade; truncate company_user cascade;
truncate company cascade; truncate company cascade;
truncate payment_method cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -67,11 +68,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -45,6 +45,7 @@ select col_hasnt_default('tax_class', 'name');
set client_min_messages to warning; set client_min_messages to warning;
truncate tax_class cascade; truncate tax_class cascade;
truncate company_user cascade; truncate company_user cascade;
truncate payment_method cascade;
truncate company cascade; truncate company cascade;
truncate auth."user" cascade; truncate auth."user" cascade;
reset client_min_messages; reset client_min_messages;
@ -54,11 +55,20 @@ values (1, 'demo@tandem.blog', 'Demo', 'test', 'invoicer', '44facbb30d8a419dfd4b
, (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month') , (5, 'admin@tandem.blog', 'Demo', 'test', 'admin', '12af4c88b528c2ad4222e3740496ecbc58e76e26f087657524', current_timestamp + interval '1 month')
; ;
insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code) set constraints "company_default_payment_method_id_fkey" deferred;
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR')
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD') insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_payment_method_id)
values (2, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 222)
, (4, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 444)
; ;
insert into payment_method (payment_method_id, company_id, name, instructions)
values (444, 4, 'cash', 'cash')
, (222, 2, 'cash', 'cash')
;
set constraints "company_default_payment_method_id_fkey" immediate;
insert into company_user (company_id, user_id) insert into company_user (company_id, user_id)
values (2, 1) values (2, 1)
, (4, 5) , (4, 5)

View File

@ -0,0 +1,9 @@
-- Verify numerus:company_default_payment_method on pg
begin;
select default_payment_method_id
from numerus.company
where false;
rollback;

View File

@ -21,6 +21,7 @@
{{ template "input-field" .Number }} {{ template "input-field" .Number }}
{{ template "input-field" .Date }} {{ template "input-field" .Date }}
{{ template "input-field" .Notes }} {{ template "input-field" .Notes }}
{{ template "select-field" .PaymentMethod }}
{{- range $product := .Products }} {{- range $product := .Products }}
<fieldset class="new-invoice-product"> <fieldset class="new-invoice-product">