Browse Source

moved inv button logic serverside

cli-archive
nic 1 year ago
parent
commit
6d3b5fda81
  1. 58
      internal/handlers/web/invoices.go
  2. 55
      templates/partials/invoice_search_results.html

58
internal/handlers/web/invoices.go

@ -12,6 +12,22 @@ import (
"strings"
)
type StatusButton struct {
Status string
Label string
Class string
ConfirmText string
}
var statusButtons = []StatusButton{
{"draft", "Draft Invoice", "success-button", "Are you sure you want to draft this invoice?"},
{"ok", "Ok Invoice", "success-button", "Are you sure you want to mark this invoice as OK?"},
{"fail", "Fail Invoice", "caution-button", "Are you sure you want to fail this invoice?"},
{"pending", "Pending Invoice", "caution-button", "Are you sure you want to mark this invoice as pending?"},
{"processed", "Process Invoice", "warning-button", "Are you sure you want to process this invoice?"},
{"void", "Void Invoice", "warning-button", "Are you sure you want to void this invoice?"},
}
func InvoicesHandler(w http.ResponseWriter, r *http.Request) {
session, ok := r.Context().Value("session").(*api.Session)
if !ok {
@ -85,6 +101,11 @@ func handleInvoiceSearch(w http.ResponseWriter, r *http.Request, session *api.Se
// log.Printf("Invoice found: %+v", invoice)
if invoice != nil {
// Add the buttons to display
invoice["buttons"] = getInvoiceStatusButtons(invoice["id"].(string), invoice["status"].(string))
}
tmpl := template.Must(template.ParseFiles("templates/partials/invoice_search_results.html"))
err = tmpl.ExecuteTemplate(w, "invoice_search_results", invoice)
if err != nil {
@ -93,6 +114,43 @@ func handleInvoiceSearch(w http.ResponseWriter, r *http.Request, session *api.Se
}
}
func getInvoiceStatusButtons(invoiceID, currentStatus string) []map[string]string {
var buttons []map[string]string
switch currentStatus {
case "processed":
// Only allow voiding for processed invoices
for _, button := range statusButtons {
if button.Status == "void" {
buttons = append(buttons, map[string]string{
"Action": fmt.Sprintf("/%s-invoice/%s", button.Status, invoiceID),
"Label": button.Label,
"Class": button.Class,
"ConfirmText": button.ConfirmText,
})
break
}
}
case "void":
// No buttons for voided invoices
return buttons
default:
// For all other statuses, show all buttons except the current status
for _, button := range statusButtons {
if button.Status != currentStatus {
buttons = append(buttons, map[string]string{
"Action": fmt.Sprintf("/%s-invoice/%s", button.Status, invoiceID),
"Label": button.Label,
"Class": button.Class,
"ConfirmText": button.ConfirmText,
})
}
}
}
return buttons
}
func UpdateInvoiceStatusHandler(w http.ResponseWriter, r *http.Request) {
session, ok := r.Context().Value("session").(*api.Session)
if !ok {

55
templates/partials/invoice_search_results.html

@ -1,65 +1,30 @@
{{define "invoice_search_results"}} {{if .Error}}
<div class="not-found">
<p>{{.ErrorMsg}}</p>
{{.ErrorMsg}}
<p>Search term: "{{.SearchTerm}}"</p>
</div>
{{else if .NotFound}}
<div class="not-found">
<p>{{.ErrorMsg}}</p>
{{.ErrorMsg}}
<p>Search term: "{{.SearchTerm}}"</p>
</div>
{{else if .invoiceNumber}}
<h3>Invoice Details</h3>
{{if and (or (ne .status "void") (ne .status "processed")) (or (eq .status
"draft") (eq .status "ok") (eq .status "pending_accounting") (eq .status
"failed") )}}
{{range .buttons}}
<button
hx-put="/draft-invoice/{{.id}}"
hx-confirm="Are you sure you want to void this invoice?"
hx-put="{{.Action}}"
hx-confirm="{{.ConfirmText}}"
hx-target="#invoice-search-results"
class="success-button">
Draft Invoice
</button>
<button
hx-put="/ok-invoice/{{.id}}"
hx-confirm="Are you sure you want to void this invoice?"
hx-target="#invoice-search-results"
class="success-button">
Ok Invoice
</button>
<button
hx-put="/fail-invoice/{{.id}}"
hx-confirm="Are you sure you want to void this invoice?"
hx-target="#invoice-search-results"
class="caution-button">
Fail Invoice
</button>
<button
hx-put="/pending-invoice/{{.id}}"
hx-confirm="Are you sure you want to void this invoice?"
hx-target="#invoice-search-results"
class="caution-button">
Pending Invoice
</button>
{{end}} {{if and (ne .status "void") (ne .status "processed")}}
<button
hx-put="/process-invoice/{{.id}}"
hx-confirm="Are you sure you want to void this invoice?"
hx-target="#invoice-search-results"
class="warning-button">
Process Invoice
</button>
<button
hx-put="/void-invoice/{{.id}}"
hx-confirm="Are you sure you want to void this invoice?"
hx-target="#invoice-search-results"
class="warning-button">
Void Invoice
class="{{.Class}}">
{{.Label}}
</button>
{{end}}
<p><strong>Invoice Number:</strong> {{.invoiceNumber}}</p>
<p><strong>Total Price:</strong> ${{.totalPrice}}</p>
<p><strong>Status:</strong> {{.status}}</p>
{{with .customer}}
<p><strong>Customer:</strong> {{.name}}</p>
{{end}} {{with .job}}

Loading…
Cancel
Save