complex-bill #1
@@ -7,34 +7,35 @@
|
||||
.PH ''''
|
||||
\# Centered block
|
||||
.DS C
|
||||
.HU "Your Bill"
|
||||
.HU "${COMPANY}'s Bill"
|
||||
.DE
|
||||
\# Contact info
|
||||
.TS
|
||||
nospaces center tab(;);
|
||||
LR.
|
||||
Cooies Unlimited;(123) 456-7890
|
||||
123 Sesame St.;cookie@example.com
|
||||
Dumpster 1;\*[DT]
|
||||
Nicevile FL;Invoice ID #${INVOICE_NUM}
|
||||
${COMPANY_NAME};$PHONE
|
||||
${ADDR_LN_1};${EMAIL}
|
||||
${ADDR_LN_2};\*[DT]
|
||||
${ADDR_LN_3};Invoice ID #${INVOICE_NUM}
|
||||
.TE
|
||||
|
||||
\# Billing info
|
||||
.TS
|
||||
nospaces center tab(;);
|
||||
CbSS
|
||||
CiCi|Ci
|
||||
RN|N.
|
||||
${COMPANY}
|
||||
Work Performed
|
||||
Job;Hours;Cost
|
||||
_
|
||||
${BODY}
|
||||
${HRS_BODY}
|
||||
_
|
||||
.T&
|
||||
RbN|Nb.
|
||||
${TOTAL}
|
||||
Total;${HRS_TOTAL}
|
||||
.TE
|
||||
|
||||
.DS C
|
||||
.R
|
||||
.DE
|
||||
.PP
|
||||
Hours were charged at $${RATE}/hr. If you have any questions please reach out at any of the provided contacts above.
|
||||
Thank you for your business!
|
||||
62
2col.template.mm
Normal file
62
2col.template.mm
Normal file
@@ -0,0 +1,62 @@
|
||||
\# Make headers bold
|
||||
.ds HF 3 3
|
||||
\# Make lvl 1 headers 20pt, lvl 2 18pt
|
||||
.ds HP 20 18
|
||||
.S 12
|
||||
\# Disable page header
|
||||
.PH ''''
|
||||
\# Centered block
|
||||
.DS C
|
||||
.HU "${COMPANY}'s Bill"
|
||||
.DE
|
||||
\# Contact info
|
||||
.TS
|
||||
nospaces center tab(;);
|
||||
LR.
|
||||
${COMPANY_NAME};$PHONE
|
||||
${ADDR_LN_1};${EMAIL}
|
||||
${ADDR_LN_2};\*[DT]
|
||||
${ADDR_LN_3};Invoice ID #${INVOICE_NUM}
|
||||
.TE
|
||||
|
||||
.2C
|
||||
.TS
|
||||
nospaces center tab(;);
|
||||
CbSS
|
||||
CiCi|Ci
|
||||
RN|N.
|
||||
Work Performed
|
||||
Job;Hours;Cost
|
||||
_
|
||||
${HRS_BODY}
|
||||
_
|
||||
.T&
|
||||
RiNi|Ni.
|
||||
Sub-Total;${HRS_TOTAL}
|
||||
.TE
|
||||
.NCOL
|
||||
.TS
|
||||
nospaces center tab(;);
|
||||
CbS
|
||||
Ci|Ci
|
||||
R|N.
|
||||
Other
|
||||
Item;Cost
|
||||
_
|
||||
${ITEM_BODY}
|
||||
_
|
||||
.T&
|
||||
Ri|Ni.
|
||||
Sub-Total;${ITEM_TOTAL}
|
||||
.TE
|
||||
.1C 1
|
||||
.DS C
|
||||
.PP
|
||||
.B
|
||||
Total: $${TOTAL}
|
||||
.R
|
||||
.DE
|
||||
.PP
|
||||
Hours were charged at $${RATE}/hr. If you have any questions please reach out at any of the provided contacts above.
|
||||
Thank you for your business!
|
||||
|
||||
104
gen.sh
104
gen.sh
@@ -1,43 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
# What you charge an hour
|
||||
RATE=50
|
||||
export RATE=50
|
||||
export COMPANY_NAME="Cookies Unlimited, LLC"
|
||||
export ADDR_LN_1="123 Sesasme St"
|
||||
export ADDR_LN_2="Dumpster 1"
|
||||
export ADDR_LN_3="12345, Nicevile, FL"
|
||||
export PHONE="(123) 456-7890"
|
||||
export EMAIL="cookie@exapmle.com"
|
||||
|
||||
short_help() {
|
||||
echo "$0 <file.csv> <Paying Company Name> [output file]"
|
||||
echo "--help for help"
|
||||
}
|
||||
long_help() {
|
||||
short_help
|
||||
print_help() {
|
||||
echo "$0 -1 <hrs.csv> <Paying Company Name> [output file]"
|
||||
echo "$0 -2 <hrs.csv> <items.csv> <Paying Company Name> [output file]"
|
||||
echo ""
|
||||
echo "The csv file should be setup as:"
|
||||
echo ""
|
||||
echo "Job <string>, Hours <number>"
|
||||
echo ""
|
||||
echo "With no empty line at the end."
|
||||
echo "CSV files should be <name>,<value>."
|
||||
echo "CSV files should have no empty line at the end."
|
||||
echo "Paying company name is any string"
|
||||
echo "The output argument is optional and will by default output to invoice-<num>.pdf"
|
||||
}
|
||||
|
||||
CSV=""
|
||||
if [[ -z $1 ]]; then
|
||||
short_help
|
||||
exit
|
||||
elif [[ $1 = "--help" ]]; then
|
||||
long_help
|
||||
exit
|
||||
else
|
||||
CSV=$1
|
||||
fi
|
||||
|
||||
COMPANY=""
|
||||
if [[ -z $2 ]]; then
|
||||
short_help
|
||||
exit
|
||||
else
|
||||
COMPANY=$2
|
||||
fi
|
||||
|
||||
get_invoice_num() {
|
||||
# Increment a global invoice number
|
||||
INV_FILE="last_invoice_number"
|
||||
INV_NUM=0
|
||||
@@ -47,24 +27,50 @@ else
|
||||
INV_NUM=1
|
||||
fi
|
||||
echo $INV_NUM > $INV_FILE
|
||||
echo $INV_NUM
|
||||
}
|
||||
read_hrs_csv() {
|
||||
TMP=$(mktemp)
|
||||
# Parse the CSV into: Label;Hrs;Cost
|
||||
cat $1 | RATE=$RATE awk -F, '{ sum += $2 }; { print $1 ";" $2 ";" $2 * ENVIRON["RATE"] } END { print sum ";" sum * ENVIRON["RATE"] }' > $TMP
|
||||
echo $TMP
|
||||
}
|
||||
read_items_csv() {
|
||||
TMP=$(mktemp)
|
||||
cat $1 | awk -F, '{ sum += $2 }; { print $1 ";" $2 } END { print sum }' > $TMP
|
||||
echo $TMP
|
||||
}
|
||||
|
||||
# 3rd argument is output location (optional)
|
||||
OUTPUT="invoice-${INV_NUM}.pdf"
|
||||
if [[ ! -z $3 ]]; then
|
||||
OUTPUT=$3
|
||||
if [[ -z $1 ]]; then
|
||||
print_help
|
||||
exit
|
||||
fi
|
||||
|
||||
# Parse the CSV into: Label;Hrs;Cost
|
||||
TMP=$(mktemp)
|
||||
cat $CSV | RATE=$RATE awk -F, '{ sum += $2 }; { print $1 ";" $2 ";" $2 * ENVIRON["RATE"] } END { print "Total" ";" sum ";" sum * ENVIRON["RATE"]}' > $TMP
|
||||
export INVOICE_NUM=$(get_invoice_num)
|
||||
OUTPUT="invoice-${INVOICE_NUM}.pdf"
|
||||
|
||||
# TOTAL = Last line
|
||||
# BODY = Everything but the last line
|
||||
TOTAL=$(cat $TMP | tail -n 1) \
|
||||
BODY=$(cat $TMP | head -n -1) \
|
||||
COMPANY=$COMPANY \
|
||||
INVOICE_NUM=$INV_NUM \
|
||||
RATE=$RATE \
|
||||
envsubst < template.mm | groff -t -mm -T pdf > $OUTPUT
|
||||
HRS_TMP=$(read_hrs_csv $2)
|
||||
export HRS_TOTAL=$(cat $HRS_TMP | tail -n 1)
|
||||
export HRS_BODY=$(cat $HRS_TMP | head -n -1)
|
||||
|
||||
rm $TMP
|
||||
if [[ $1 = "-1" ]]; then
|
||||
if [[ ! -z $4 ]]; then
|
||||
OUTPUT=$4
|
||||
fi
|
||||
export COMPANY=$3
|
||||
envsubst < 1col.template.mm | groff -t -mm -T pdf > $OUTPUT
|
||||
elif [[ $1 = "-2" ]]; then
|
||||
if [[ ! -z $5 ]]; then
|
||||
OUTPUT=$5
|
||||
fi
|
||||
HRS_COST=$(cat $HRS_TMP | tail -n 1 | awk -F";" '{ print $2 }')
|
||||
CONSUME_TMP=$(read_items_csv $3)
|
||||
CONSUME_COST=$(cat $CONSUME_TMP | tail -n 1 | awk -F";" '{ print $2 }')
|
||||
export ITEM_TOTAL=$(cat $CONSUME_TMP | tail -n 1)
|
||||
export ITEM_BODY=$(cat $CONSUME_TMP | head -n -1)
|
||||
export TOTAL=$(A=$HRS_COST B=$ITEM_TOTAL awk 'BEGIN{ print ENVIRON["A"] + ENVIRON["B"] }')
|
||||
export COMPANY=$4
|
||||
envsubst < 2col.template.mm | groff -t -mm -T pdf > $OUTPUT
|
||||
else
|
||||
echo First arg should be either -1 or -2
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user