diff --git a/pkg/invoices.go b/pkg/invoices.go index ce7447c..6618df6 100644 --- a/pkg/invoices.go +++ b/pkg/invoices.go @@ -231,6 +231,8 @@ func ServeInvoice(w http.ResponseWriter, r *http.Request, params httprouter.Para if invoiceToDuplicate := r.URL.Query().Get("duplicate"); invoiceToDuplicate != "" { form.MustFillFromDatabase(r.Context(), conn, invoiceToDuplicate) form.InvoiceStatus.Selected = []string{"created"} + } else if quoteToInvoice := r.URL.Query().Get("quote"); quoteToInvoice != "" { + form.MustFillFromQuote(r.Context(), conn, quoteToInvoice) } form.Date.Val = time.Now().Format("2006-01-02") w.WriteHeader(http.StatusOK) @@ -774,6 +776,31 @@ func (form *invoiceForm) MustFillFromDatabase(ctx context.Context, conn *Conn, s return true } +func (form *invoiceForm) MustFillFromQuote(ctx context.Context, conn *Conn, slug string) bool { + var quoteId int + selectedPaymentMethod := form.PaymentMethod.Selected + note := gettext("Re: quotation #%s of %s", form.locale) + dateFormat := pgettext("to_char", "MM/DD/YYYY", form.locale) + form.PaymentMethod.Clear() + if notFoundErrorOrPanic(conn.QueryRow(ctx, ` + select quote_id + , coalesce(contact_id::text, '') + , (case when length(trim(notes)) = 0 then '' else notes || E'\n\n' end) || format($2, quote_number, to_char(quote_date, $3)) + , coalesce(payment_method_id::text, $4) + , tags + from quote + left join quote_contact using (quote_id) + left join quote_payment_method using (quote_id) + where slug = $1 + `, slug, note, dateFormat, selectedPaymentMethod[0]).Scan("eId, form.Customer, form.Notes, form.PaymentMethod, form.Tags)) { + form.PaymentMethod.Selected = selectedPaymentMethod + return false + } + form.Products = []*invoiceProductForm{} + form.mustAddProductsFromQuery(ctx, conn, "select '', coalesce(product_id, 0), name, description, to_price(price, $2), quantity, (discount_rate * 100)::integer, array_remove(array_agg(tax_id), null) from quote_product left join quote_product_product using (quote_product_id) left join quote_product_tax using (quote_product_id) where quote_id = $1 group by quote_product_id, coalesce(product_id, 0), name, description, discount_rate, price, quantity", quoteId, form.company.DecimalDigits) + return true +} + func mustGetTaxOptions(ctx context.Context, conn *Conn, company *Company) []*SelectOption { return MustGetGroupedOptions(ctx, conn, "select tax_id::text, tax.name, tax_class.name from tax join tax_class using (tax_class_id) where tax.company_id = $1 order by tax_class.name, tax.name", company.Id) } diff --git a/po/ca.po b/po/ca.po index f497e96..324aa8e 100644 --- a/po/ca.po +++ b/po/ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: numerus\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2023-06-09 12:38+0200\n" +"POT-Creation-Date: 2023-06-10 20:40+0200\n" "PO-Revision-Date: 2023-01-18 17:08+0100\n" "Last-Translator: jordi fita mas \n" "Language-Team: Catalan \n" @@ -65,7 +65,7 @@ msgstr "Nom" #: web/template/invoices/products.gohtml:50 #: web/template/invoices/view.gohtml:62 web/template/quotes/products.gohtml:50 -#: web/template/quotes/view.gohtml:68 web/template/products/index.gohtml:42 +#: web/template/quotes/view.gohtml:71 web/template/products/index.gohtml:42 msgctxt "title" msgid "Price" msgstr "Preu" @@ -95,15 +95,15 @@ msgstr "Desfes" #: web/template/invoices/new.gohtml:60 web/template/invoices/view.gohtml:67 #: web/template/invoices/edit.gohtml:61 web/template/quotes/new.gohtml:61 -#: web/template/quotes/view.gohtml:73 web/template/quotes/edit.gohtml:62 +#: web/template/quotes/view.gohtml:76 web/template/quotes/edit.gohtml:62 msgctxt "title" msgid "Subtotal" msgstr "Subtotal" #: web/template/invoices/new.gohtml:70 web/template/invoices/view.gohtml:71 #: web/template/invoices/view.gohtml:111 web/template/invoices/edit.gohtml:71 -#: web/template/quotes/new.gohtml:71 web/template/quotes/view.gohtml:77 -#: web/template/quotes/view.gohtml:117 web/template/quotes/edit.gohtml:72 +#: web/template/quotes/new.gohtml:71 web/template/quotes/view.gohtml:80 +#: web/template/quotes/view.gohtml:120 web/template/quotes/edit.gohtml:72 msgctxt "title" msgid "Total" msgstr "Total" @@ -146,7 +146,7 @@ msgid "All" msgstr "Totes" #: web/template/invoices/index.gohtml:50 web/template/invoices/view.gohtml:34 -#: web/template/quotes/index.gohtml:50 web/template/quotes/view.gohtml:34 +#: web/template/quotes/index.gohtml:50 web/template/quotes/view.gohtml:37 msgctxt "title" msgid "Date" msgstr "Data" @@ -199,7 +199,7 @@ msgid "Select invoice %v" msgstr "Selecciona factura %v" #: web/template/invoices/index.gohtml:119 web/template/invoices/view.gohtml:19 -#: web/template/quotes/index.gohtml:119 web/template/quotes/view.gohtml:19 +#: web/template/quotes/index.gohtml:119 web/template/quotes/view.gohtml:22 #: web/template/contacts/index.gohtml:74 web/template/expenses/index.gohtml:88 #: web/template/products/index.gohtml:72 msgctxt "action" @@ -207,7 +207,7 @@ msgid "Edit" msgstr "Edita" #: web/template/invoices/index.gohtml:127 web/template/invoices/view.gohtml:16 -#: web/template/quotes/index.gohtml:127 web/template/quotes/view.gohtml:16 +#: web/template/quotes/index.gohtml:127 web/template/quotes/view.gohtml:19 msgctxt "action" msgid "Duplicate" msgstr "Duplica" @@ -226,22 +226,22 @@ msgctxt "action" msgid "Download invoice" msgstr "Descarrega factura" -#: web/template/invoices/view.gohtml:61 web/template/quotes/view.gohtml:67 +#: web/template/invoices/view.gohtml:61 web/template/quotes/view.gohtml:70 msgctxt "title" msgid "Concept" msgstr "Concepte" -#: web/template/invoices/view.gohtml:64 web/template/quotes/view.gohtml:70 +#: web/template/invoices/view.gohtml:64 web/template/quotes/view.gohtml:73 msgctxt "title" msgid "Discount" msgstr "Descompte" -#: web/template/invoices/view.gohtml:66 web/template/quotes/view.gohtml:72 +#: web/template/invoices/view.gohtml:66 web/template/quotes/view.gohtml:75 msgctxt "title" msgid "Units" msgstr "Unitats" -#: web/template/invoices/view.gohtml:101 web/template/quotes/view.gohtml:107 +#: web/template/invoices/view.gohtml:101 web/template/quotes/view.gohtml:110 msgctxt "title" msgid "Tax Base" msgstr "Base imposable" @@ -339,21 +339,26 @@ msgctxt "action" msgid "Select quotation %v" msgstr "Selecciona pressupost %v" -#: web/template/quotes/index.gohtml:137 +#: web/template/quotes/index.gohtml:135 web/template/quotes/view.gohtml:16 +msgctxt "action" +msgid "Create invoice" +msgstr "Crea factura" + +#: web/template/quotes/index.gohtml:145 msgid "No quotations added yet." msgstr "No hi ha cap pressupost." -#: web/template/quotes/view.gohtml:2 web/template/quotes/view.gohtml:33 +#: web/template/quotes/view.gohtml:2 web/template/quotes/view.gohtml:36 msgctxt "title" msgid "Quotation %s" msgstr "Pressupost %s" -#: web/template/quotes/view.gohtml:22 +#: web/template/quotes/view.gohtml:25 msgctxt "action" msgid "Download quotation" msgstr "Descarrega pressupost" -#: web/template/quotes/view.gohtml:60 +#: web/template/quotes/view.gohtml:63 msgid "Terms and Conditions:" msgstr "Condicions d’acceptació:" @@ -645,7 +650,7 @@ msgstr "No podeu deixar la contrasenya en blanc." msgid "Invalid user or password." msgstr "Nom d’usuari o contrasenya incorrectes." -#: pkg/products.go:164 pkg/products.go:263 pkg/quote.go:801 pkg/invoices.go:824 +#: pkg/products.go:164 pkg/products.go:263 pkg/quote.go:801 pkg/invoices.go:851 #: pkg/contacts.go:135 msgctxt "input" msgid "Name" @@ -653,7 +658,7 @@ msgstr "Nom" #: pkg/products.go:169 pkg/products.go:290 pkg/quote.go:188 pkg/quote.go:608 #: pkg/expenses.go:202 pkg/expenses.go:361 pkg/invoices.go:189 -#: pkg/invoices.go:601 pkg/invoices.go:1123 pkg/contacts.go:140 +#: pkg/invoices.go:603 pkg/invoices.go:1150 pkg/contacts.go:140 #: pkg/contacts.go:325 msgctxt "input" msgid "Tags" @@ -687,40 +692,40 @@ msgstr "Qualsevol" msgid "Invoices must have at least one of the specified labels." msgstr "Les factures han de tenir com a mínim una de les etiquetes." -#: pkg/products.go:269 pkg/quote.go:815 pkg/invoices.go:838 +#: pkg/products.go:269 pkg/quote.go:815 pkg/invoices.go:865 msgctxt "input" msgid "Description" msgstr "Descripció" -#: pkg/products.go:274 pkg/quote.go:819 pkg/invoices.go:842 +#: pkg/products.go:274 pkg/quote.go:819 pkg/invoices.go:869 msgctxt "input" msgid "Price" msgstr "Preu" -#: pkg/products.go:284 pkg/quote.go:848 pkg/expenses.go:181 pkg/invoices.go:871 +#: pkg/products.go:284 pkg/quote.go:848 pkg/expenses.go:181 pkg/invoices.go:898 msgctxt "input" msgid "Taxes" msgstr "Imposts" -#: pkg/products.go:309 pkg/quote.go:897 pkg/profile.go:92 pkg/invoices.go:920 +#: pkg/products.go:309 pkg/quote.go:897 pkg/profile.go:92 pkg/invoices.go:947 msgid "Name can not be empty." msgstr "No podeu deixar el nom en blanc." -#: pkg/products.go:310 pkg/quote.go:898 pkg/invoices.go:921 +#: pkg/products.go:310 pkg/quote.go:898 pkg/invoices.go:948 msgid "Price can not be empty." msgstr "No podeu deixar el preu en blanc." -#: pkg/products.go:311 pkg/quote.go:899 pkg/invoices.go:922 +#: pkg/products.go:311 pkg/quote.go:899 pkg/invoices.go:949 msgid "Price must be a number greater than zero." msgstr "El preu ha de ser un número major a zero." #: pkg/products.go:313 pkg/quote.go:907 pkg/expenses.go:227 pkg/expenses.go:232 -#: pkg/invoices.go:930 +#: pkg/invoices.go:957 msgid "Selected tax is not valid." msgstr "Heu seleccionat un impost que no és vàlid." #: pkg/products.go:314 pkg/quote.go:908 pkg/expenses.go:228 pkg/expenses.go:233 -#: pkg/invoices.go:931 +#: pkg/invoices.go:958 msgid "You can only select a tax of each class." msgstr "Només podeu seleccionar un impost de cada classe." @@ -828,7 +833,7 @@ msgid "Payment instructions can not be empty." msgstr "No podeu deixar les instruccions de pagament en blanc." #: pkg/quote.go:161 pkg/quote.go:586 pkg/expenses.go:340 pkg/invoices.go:162 -#: pkg/invoices.go:584 +#: pkg/invoices.go:586 msgctxt "input" msgid "Customer" msgstr "Client" @@ -873,8 +878,8 @@ msgstr "Els pressuposts han de tenir com a mínim una de les etiquetes." msgid "quotations.zip" msgstr "pressuposts.zip" -#: pkg/quote.go:534 pkg/quote.go:1063 pkg/quote.go:1071 pkg/invoices.go:533 -#: pkg/invoices.go:1098 pkg/invoices.go:1106 +#: pkg/quote.go:534 pkg/quote.go:1063 pkg/quote.go:1071 pkg/invoices.go:535 +#: pkg/invoices.go:1125 pkg/invoices.go:1133 msgid "Invalid action" msgstr "Acció invàlida." @@ -892,12 +897,12 @@ msgctxt "input" msgid "Terms and conditions" msgstr "Condicions d’acceptació" -#: pkg/quote.go:603 pkg/invoices.go:596 +#: pkg/quote.go:603 pkg/invoices.go:598 msgctxt "input" msgid "Notes" msgstr "Notes" -#: pkg/quote.go:612 pkg/invoices.go:606 +#: pkg/quote.go:612 pkg/invoices.go:608 msgctxt "input" msgid "Payment Method" msgstr "Mètode de pagament" @@ -910,7 +915,7 @@ msgstr "Escolliu un mètode de pagament." msgid "Selected quotation status is not valid." msgstr "Heu seleccionat un estat de pressupost que no és vàlid." -#: pkg/quote.go:651 pkg/invoices.go:643 +#: pkg/quote.go:651 pkg/invoices.go:645 msgid "Selected customer is not valid." msgstr "Heu seleccionat un client que no és vàlid." @@ -922,21 +927,21 @@ msgstr "No podeu deixar la data del pressupost en blanc." msgid "Quotation date must be a valid date." msgstr "La data del pressupost ha de ser vàlida." -#: pkg/quote.go:657 pkg/invoices.go:647 +#: pkg/quote.go:657 pkg/invoices.go:649 msgid "Selected payment method is not valid." msgstr "Heu seleccionat un mètode de pagament que no és vàlid." -#: pkg/quote.go:791 pkg/quote.go:796 pkg/invoices.go:814 pkg/invoices.go:819 +#: pkg/quote.go:791 pkg/quote.go:796 pkg/invoices.go:841 pkg/invoices.go:846 msgctxt "input" msgid "Id" msgstr "Identificador" -#: pkg/quote.go:829 pkg/invoices.go:852 +#: pkg/quote.go:829 pkg/invoices.go:879 msgctxt "input" msgid "Quantity" msgstr "Quantitat" -#: pkg/quote.go:838 pkg/invoices.go:861 +#: pkg/quote.go:838 pkg/invoices.go:888 msgctxt "input" msgid "Discount (%)" msgstr "Descompte (%)" @@ -945,23 +950,23 @@ msgstr "Descompte (%)" msgid "Quotation product ID must be a number greater than zero." msgstr "L’ID del producte de pressupost ha de ser un número major a zero." -#: pkg/quote.go:895 pkg/invoices.go:918 +#: pkg/quote.go:895 pkg/invoices.go:945 msgid "Product ID must be a positive number or zero." msgstr "L’ID del producte ha de ser un número positiu o zero." -#: pkg/quote.go:901 pkg/invoices.go:924 +#: pkg/quote.go:901 pkg/invoices.go:951 msgid "Quantity can not be empty." msgstr "No podeu deixar la quantitat en blanc." -#: pkg/quote.go:902 pkg/invoices.go:925 +#: pkg/quote.go:902 pkg/invoices.go:952 msgid "Quantity must be a number greater than zero." msgstr "La quantitat ha de ser un número major a zero." -#: pkg/quote.go:904 pkg/invoices.go:927 +#: pkg/quote.go:904 pkg/invoices.go:954 msgid "Discount can not be empty." msgstr "No podeu deixar el descompte en blanc." -#: pkg/quote.go:905 pkg/invoices.go:928 +#: pkg/quote.go:905 pkg/invoices.go:955 msgid "Discount must be a percentage between 0 and 100." msgstr "El descompte ha de ser un percentatge entre 0 i 100." @@ -1042,7 +1047,7 @@ msgctxt "input" msgid "Invoice number" msgstr "Número de factura" -#: pkg/expenses.go:175 pkg/invoices.go:590 +#: pkg/expenses.go:175 pkg/invoices.go:592 msgctxt "input" msgid "Invoice Date" msgstr "Data de factura" @@ -1061,7 +1066,7 @@ msgstr "Fitxer" msgid "Selected contact is not valid." msgstr "Heu seleccionat un contacte que no és vàlid." -#: pkg/expenses.go:226 pkg/invoices.go:645 +#: pkg/expenses.go:226 pkg/invoices.go:647 msgid "Invoice date must be a valid date." msgstr "La data de facturació ha de ser vàlida." @@ -1078,28 +1083,38 @@ msgctxt "input" msgid "Invoice Number" msgstr "Número de factura" -#: pkg/invoices.go:168 pkg/invoices.go:578 +#: pkg/invoices.go:168 pkg/invoices.go:580 msgctxt "input" msgid "Invoice Status" msgstr "Estat de la factura" -#: pkg/invoices.go:426 +#: pkg/invoices.go:428 msgid "Select a customer to bill." msgstr "Escolliu un client a facturar." -#: pkg/invoices.go:527 +#: pkg/invoices.go:529 msgid "invoices.zip" msgstr "factures.zip" -#: pkg/invoices.go:642 +#: pkg/invoices.go:644 msgid "Selected invoice status is not valid." msgstr "Heu seleccionat un estat de factura que no és vàlid." -#: pkg/invoices.go:644 +#: pkg/invoices.go:646 msgid "Invoice date can not be empty." msgstr "No podeu deixar la data de la factura en blanc." -#: pkg/invoices.go:915 +#: pkg/invoices.go:782 +#, c-format +msgid "Re: quotation #%s of %s" +msgstr "Ref: pressupost núm. %s del %s" + +#: pkg/invoices.go:783 +msgctxt "to_char" +msgid "MM/DD/YYYY" +msgstr "DD/MM/YYYY" + +#: pkg/invoices.go:942 msgid "Invoice product ID must be a number greater than zero." msgstr "L’ID del producte de factura ha de ser un número major a zero." diff --git a/po/es.po b/po/es.po index 608bde8..4db94bb 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: numerus\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2023-06-09 12:38+0200\n" +"POT-Creation-Date: 2023-06-10 20:40+0200\n" "PO-Revision-Date: 2023-01-18 17:45+0100\n" "Last-Translator: jordi fita mas \n" "Language-Team: Spanish \n" @@ -65,7 +65,7 @@ msgstr "Nombre" #: web/template/invoices/products.gohtml:50 #: web/template/invoices/view.gohtml:62 web/template/quotes/products.gohtml:50 -#: web/template/quotes/view.gohtml:68 web/template/products/index.gohtml:42 +#: web/template/quotes/view.gohtml:71 web/template/products/index.gohtml:42 msgctxt "title" msgid "Price" msgstr "Precio" @@ -95,15 +95,15 @@ msgstr "Deshacer" #: web/template/invoices/new.gohtml:60 web/template/invoices/view.gohtml:67 #: web/template/invoices/edit.gohtml:61 web/template/quotes/new.gohtml:61 -#: web/template/quotes/view.gohtml:73 web/template/quotes/edit.gohtml:62 +#: web/template/quotes/view.gohtml:76 web/template/quotes/edit.gohtml:62 msgctxt "title" msgid "Subtotal" msgstr "Subtotal" #: web/template/invoices/new.gohtml:70 web/template/invoices/view.gohtml:71 #: web/template/invoices/view.gohtml:111 web/template/invoices/edit.gohtml:71 -#: web/template/quotes/new.gohtml:71 web/template/quotes/view.gohtml:77 -#: web/template/quotes/view.gohtml:117 web/template/quotes/edit.gohtml:72 +#: web/template/quotes/new.gohtml:71 web/template/quotes/view.gohtml:80 +#: web/template/quotes/view.gohtml:120 web/template/quotes/edit.gohtml:72 msgctxt "title" msgid "Total" msgstr "Total" @@ -146,7 +146,7 @@ msgid "All" msgstr "Todas" #: web/template/invoices/index.gohtml:50 web/template/invoices/view.gohtml:34 -#: web/template/quotes/index.gohtml:50 web/template/quotes/view.gohtml:34 +#: web/template/quotes/index.gohtml:50 web/template/quotes/view.gohtml:37 msgctxt "title" msgid "Date" msgstr "Fecha" @@ -199,7 +199,7 @@ msgid "Select invoice %v" msgstr "Seleccionar factura %v" #: web/template/invoices/index.gohtml:119 web/template/invoices/view.gohtml:19 -#: web/template/quotes/index.gohtml:119 web/template/quotes/view.gohtml:19 +#: web/template/quotes/index.gohtml:119 web/template/quotes/view.gohtml:22 #: web/template/contacts/index.gohtml:74 web/template/expenses/index.gohtml:88 #: web/template/products/index.gohtml:72 msgctxt "action" @@ -207,7 +207,7 @@ msgid "Edit" msgstr "Editar" #: web/template/invoices/index.gohtml:127 web/template/invoices/view.gohtml:16 -#: web/template/quotes/index.gohtml:127 web/template/quotes/view.gohtml:16 +#: web/template/quotes/index.gohtml:127 web/template/quotes/view.gohtml:19 msgctxt "action" msgid "Duplicate" msgstr "Duplicar" @@ -226,22 +226,22 @@ msgctxt "action" msgid "Download invoice" msgstr "Descargar factura" -#: web/template/invoices/view.gohtml:61 web/template/quotes/view.gohtml:67 +#: web/template/invoices/view.gohtml:61 web/template/quotes/view.gohtml:70 msgctxt "title" msgid "Concept" msgstr "Concepto" -#: web/template/invoices/view.gohtml:64 web/template/quotes/view.gohtml:70 +#: web/template/invoices/view.gohtml:64 web/template/quotes/view.gohtml:73 msgctxt "title" msgid "Discount" msgstr "Descuento" -#: web/template/invoices/view.gohtml:66 web/template/quotes/view.gohtml:72 +#: web/template/invoices/view.gohtml:66 web/template/quotes/view.gohtml:75 msgctxt "title" msgid "Units" msgstr "Unidades" -#: web/template/invoices/view.gohtml:101 web/template/quotes/view.gohtml:107 +#: web/template/invoices/view.gohtml:101 web/template/quotes/view.gohtml:110 msgctxt "title" msgid "Tax Base" msgstr "Base imponible" @@ -339,21 +339,26 @@ msgctxt "action" msgid "Select quotation %v" msgstr "Seleccionar presupuesto %v" -#: web/template/quotes/index.gohtml:137 +#: web/template/quotes/index.gohtml:135 web/template/quotes/view.gohtml:16 +msgctxt "action" +msgid "Create invoice" +msgstr "Crear factura" + +#: web/template/quotes/index.gohtml:145 msgid "No quotations added yet." msgstr "No hay presupuestos." -#: web/template/quotes/view.gohtml:2 web/template/quotes/view.gohtml:33 +#: web/template/quotes/view.gohtml:2 web/template/quotes/view.gohtml:36 msgctxt "title" msgid "Quotation %s" msgstr "Estado del presupuesto" -#: web/template/quotes/view.gohtml:22 +#: web/template/quotes/view.gohtml:25 msgctxt "action" msgid "Download quotation" msgstr "Descargar presupuesto" -#: web/template/quotes/view.gohtml:60 +#: web/template/quotes/view.gohtml:63 msgid "Terms and Conditions:" msgstr "Condiciones de aceptación:" @@ -645,7 +650,7 @@ msgstr "No podéis dejar la contraseña en blanco." msgid "Invalid user or password." msgstr "Nombre de usuario o contraseña inválido." -#: pkg/products.go:164 pkg/products.go:263 pkg/quote.go:801 pkg/invoices.go:824 +#: pkg/products.go:164 pkg/products.go:263 pkg/quote.go:801 pkg/invoices.go:851 #: pkg/contacts.go:135 msgctxt "input" msgid "Name" @@ -653,7 +658,7 @@ msgstr "Nombre" #: pkg/products.go:169 pkg/products.go:290 pkg/quote.go:188 pkg/quote.go:608 #: pkg/expenses.go:202 pkg/expenses.go:361 pkg/invoices.go:189 -#: pkg/invoices.go:601 pkg/invoices.go:1123 pkg/contacts.go:140 +#: pkg/invoices.go:603 pkg/invoices.go:1150 pkg/contacts.go:140 #: pkg/contacts.go:325 msgctxt "input" msgid "Tags" @@ -687,40 +692,40 @@ msgstr "Cualquiera" msgid "Invoices must have at least one of the specified labels." msgstr "Las facturas deben tener como mínimo una de las etiquetas." -#: pkg/products.go:269 pkg/quote.go:815 pkg/invoices.go:838 +#: pkg/products.go:269 pkg/quote.go:815 pkg/invoices.go:865 msgctxt "input" msgid "Description" msgstr "Descripción" -#: pkg/products.go:274 pkg/quote.go:819 pkg/invoices.go:842 +#: pkg/products.go:274 pkg/quote.go:819 pkg/invoices.go:869 msgctxt "input" msgid "Price" msgstr "Precio" -#: pkg/products.go:284 pkg/quote.go:848 pkg/expenses.go:181 pkg/invoices.go:871 +#: pkg/products.go:284 pkg/quote.go:848 pkg/expenses.go:181 pkg/invoices.go:898 msgctxt "input" msgid "Taxes" msgstr "Impuestos" -#: pkg/products.go:309 pkg/quote.go:897 pkg/profile.go:92 pkg/invoices.go:920 +#: pkg/products.go:309 pkg/quote.go:897 pkg/profile.go:92 pkg/invoices.go:947 msgid "Name can not be empty." msgstr "No podéis dejar el nombre en blanco." -#: pkg/products.go:310 pkg/quote.go:898 pkg/invoices.go:921 +#: pkg/products.go:310 pkg/quote.go:898 pkg/invoices.go:948 msgid "Price can not be empty." msgstr "No podéis dejar el precio en blanco." -#: pkg/products.go:311 pkg/quote.go:899 pkg/invoices.go:922 +#: pkg/products.go:311 pkg/quote.go:899 pkg/invoices.go:949 msgid "Price must be a number greater than zero." msgstr "El precio tiene que ser un número mayor a cero." #: pkg/products.go:313 pkg/quote.go:907 pkg/expenses.go:227 pkg/expenses.go:232 -#: pkg/invoices.go:930 +#: pkg/invoices.go:957 msgid "Selected tax is not valid." msgstr "Habéis escogido un impuesto que no es válido." #: pkg/products.go:314 pkg/quote.go:908 pkg/expenses.go:228 pkg/expenses.go:233 -#: pkg/invoices.go:931 +#: pkg/invoices.go:958 msgid "You can only select a tax of each class." msgstr "Solo podéis escoger un impuesto de cada clase." @@ -828,7 +833,7 @@ msgid "Payment instructions can not be empty." msgstr "No podéis dejar las instrucciones de pago en blanco." #: pkg/quote.go:161 pkg/quote.go:586 pkg/expenses.go:340 pkg/invoices.go:162 -#: pkg/invoices.go:584 +#: pkg/invoices.go:586 msgctxt "input" msgid "Customer" msgstr "Cliente" @@ -873,8 +878,8 @@ msgstr "Los presupuestos deben tener como mínimo una de las etiquetas." msgid "quotations.zip" msgstr "presupuestos.zip" -#: pkg/quote.go:534 pkg/quote.go:1063 pkg/quote.go:1071 pkg/invoices.go:533 -#: pkg/invoices.go:1098 pkg/invoices.go:1106 +#: pkg/quote.go:534 pkg/quote.go:1063 pkg/quote.go:1071 pkg/invoices.go:535 +#: pkg/invoices.go:1125 pkg/invoices.go:1133 msgid "Invalid action" msgstr "Acción inválida." @@ -892,12 +897,12 @@ msgctxt "input" msgid "Terms and conditions" msgstr "Condiciones de aceptación" -#: pkg/quote.go:603 pkg/invoices.go:596 +#: pkg/quote.go:603 pkg/invoices.go:598 msgctxt "input" msgid "Notes" msgstr "Notas" -#: pkg/quote.go:612 pkg/invoices.go:606 +#: pkg/quote.go:612 pkg/invoices.go:608 msgctxt "input" msgid "Payment Method" msgstr "Método de pago" @@ -910,7 +915,7 @@ msgstr "Escoged un método e pago." msgid "Selected quotation status is not valid." msgstr "Habéis escogido un estado de presupuesto que no es válido." -#: pkg/quote.go:651 pkg/invoices.go:643 +#: pkg/quote.go:651 pkg/invoices.go:645 msgid "Selected customer is not valid." msgstr "Habéis escogido un cliente que no es válido." @@ -922,21 +927,21 @@ msgstr "No podéis dejar la fecha del presupuesto en blanco." msgid "Quotation date must be a valid date." msgstr "La fecha de presupuesto debe ser válida." -#: pkg/quote.go:657 pkg/invoices.go:647 +#: pkg/quote.go:657 pkg/invoices.go:649 msgid "Selected payment method is not valid." msgstr "Habéis escogido un método de pago que no es válido." -#: pkg/quote.go:791 pkg/quote.go:796 pkg/invoices.go:814 pkg/invoices.go:819 +#: pkg/quote.go:791 pkg/quote.go:796 pkg/invoices.go:841 pkg/invoices.go:846 msgctxt "input" msgid "Id" msgstr "Identificador" -#: pkg/quote.go:829 pkg/invoices.go:852 +#: pkg/quote.go:829 pkg/invoices.go:879 msgctxt "input" msgid "Quantity" msgstr "Cantidad" -#: pkg/quote.go:838 pkg/invoices.go:861 +#: pkg/quote.go:838 pkg/invoices.go:888 msgctxt "input" msgid "Discount (%)" msgstr "Descuento (%)" @@ -945,23 +950,23 @@ msgstr "Descuento (%)" msgid "Quotation product ID must be a number greater than zero." msgstr "El ID de producto de presupuesto tiene que ser un número mayor a cero." -#: pkg/quote.go:895 pkg/invoices.go:918 +#: pkg/quote.go:895 pkg/invoices.go:945 msgid "Product ID must be a positive number or zero." msgstr "El ID de producto tiene que ser un número positivo o cero." -#: pkg/quote.go:901 pkg/invoices.go:924 +#: pkg/quote.go:901 pkg/invoices.go:951 msgid "Quantity can not be empty." msgstr "No podéis dejar la cantidad en blanco." -#: pkg/quote.go:902 pkg/invoices.go:925 +#: pkg/quote.go:902 pkg/invoices.go:952 msgid "Quantity must be a number greater than zero." msgstr "La cantidad tiene que ser un número mayor a cero." -#: pkg/quote.go:904 pkg/invoices.go:927 +#: pkg/quote.go:904 pkg/invoices.go:954 msgid "Discount can not be empty." msgstr "No podéis dejar el descuento en blanco." -#: pkg/quote.go:905 pkg/invoices.go:928 +#: pkg/quote.go:905 pkg/invoices.go:955 msgid "Discount must be a percentage between 0 and 100." msgstr "El descuento tiene que ser un porcentaje entre 0 y 100." @@ -1042,7 +1047,7 @@ msgctxt "input" msgid "Invoice number" msgstr "Número de factura" -#: pkg/expenses.go:175 pkg/invoices.go:590 +#: pkg/expenses.go:175 pkg/invoices.go:592 msgctxt "input" msgid "Invoice Date" msgstr "Fecha de factura" @@ -1061,7 +1066,7 @@ msgstr "Archivo" msgid "Selected contact is not valid." msgstr "Habéis escogido un contacto que no es válido." -#: pkg/expenses.go:226 pkg/invoices.go:645 +#: pkg/expenses.go:226 pkg/invoices.go:647 msgid "Invoice date must be a valid date." msgstr "La fecha de factura debe ser válida." @@ -1078,28 +1083,38 @@ msgctxt "input" msgid "Invoice Number" msgstr "Número de factura" -#: pkg/invoices.go:168 pkg/invoices.go:578 +#: pkg/invoices.go:168 pkg/invoices.go:580 msgctxt "input" msgid "Invoice Status" msgstr "Estado de la factura" -#: pkg/invoices.go:426 +#: pkg/invoices.go:428 msgid "Select a customer to bill." msgstr "Escoged un cliente a facturar." -#: pkg/invoices.go:527 +#: pkg/invoices.go:529 msgid "invoices.zip" msgstr "facturas.zip" -#: pkg/invoices.go:642 +#: pkg/invoices.go:644 msgid "Selected invoice status is not valid." msgstr "Habéis escogido un estado de factura que no es válido." -#: pkg/invoices.go:644 +#: pkg/invoices.go:646 msgid "Invoice date can not be empty." msgstr "No podéis dejar la fecha de la factura en blanco." -#: pkg/invoices.go:915 +#: pkg/invoices.go:782 +#, c-format +msgid "Re: quotation #%s of %s" +msgstr "Ref: presupuesto n.º %s del %s" + +#: pkg/invoices.go:783 +msgctxt "to_char" +msgid "MM/DD/YYYY" +msgstr "DD/MM/YYYY" + +#: pkg/invoices.go:942 msgid "Invoice product ID must be a number greater than zero." msgstr "El ID de producto de factura tiene que ser un número mayor a cero." diff --git a/web/template/quotes/index.gohtml b/web/template/quotes/index.gohtml index e2e03d3..76119ff 100644 --- a/web/template/quotes/index.gohtml +++ b/web/template/quotes/index.gohtml @@ -127,6 +127,14 @@ {{( pgettext "Duplicate" "action" )}} +
  • + + + {{( pgettext "Create invoice" "action" )}} + +
  • diff --git a/web/template/quotes/view.gohtml b/web/template/quotes/view.gohtml index d993fc8..f2f10c1 100644 --- a/web/template/quotes/view.gohtml +++ b/web/template/quotes/view.gohtml @@ -11,6 +11,9 @@ {{ .Number }}

    + {{( pgettext "Create invoice" "action" )}} {{( pgettext "Duplicate" "action" )}}