forked from momo/invoiceplane-template
Compare commits
12 commits
Author | SHA1 | Date | |
---|---|---|---|
teutat3s | a4f2aa7658 | ||
teutat3s | 099d168ef4 | ||
teutat3s | 8fd252d743 | ||
teutat3s | da9eac700b | ||
teutat3s | 08292f95f9 | ||
teutat3s | 6cf6f7d88d | ||
teutat3s | eaad78f00e | ||
teutat3s | d5e7cb73a8 | ||
b12f | d59893ebcb | ||
b12f | b0dabc8dfc | ||
hensoko | d8fb72b1b1 | ||
Benjamin Yule Bädorf | ba61a4fb5b |
76
.editorconfig
Normal file
76
.editorconfig
Normal file
|
@ -0,0 +1,76 @@
|
|||
# Editor configuration, see http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# Ignore diffs/patches
|
||||
[*.{diff,patch}]
|
||||
end_of_line = unset
|
||||
insert_final_newline = unset
|
||||
trim_trailing_whitespace = unset
|
||||
indent_size = unset
|
||||
charset = unset
|
||||
indent_style = unset
|
||||
indent_size = unset
|
||||
|
||||
[{.*,secrets}/**]
|
||||
end_of_line = unset
|
||||
insert_final_newline = unset
|
||||
trim_trailing_whitespace = unset
|
||||
charset = unset
|
||||
indent_style = unset
|
||||
indent_size = unset
|
||||
|
||||
[*.rom]
|
||||
end_of_line = unset
|
||||
insert_final_newline = unset
|
||||
trim_trailing_whitespace = unset
|
||||
charset = unset
|
||||
indent_style = unset
|
||||
indent_size = unset
|
||||
|
||||
[*.py]
|
||||
indent_size = 4
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# Ignore diffs/patches
|
||||
[*.{diff,patch}]
|
||||
end_of_line = unset
|
||||
insert_final_newline = unset
|
||||
trim_trailing_whitespace = unset
|
||||
indent_size = unset
|
||||
charset = unset
|
||||
indent_style = unset
|
||||
indent_size = unset
|
||||
|
||||
[{.*,secrets}/**]
|
||||
end_of_line = unset
|
||||
insert_final_newline = unset
|
||||
trim_trailing_whitespace = unset
|
||||
charset = unset
|
||||
indent_style = unset
|
||||
indent_size = unset
|
||||
|
||||
[*.rom]
|
||||
end_of_line = unset
|
||||
insert_final_newline = unset
|
||||
trim_trailing_whitespace = unset
|
||||
charset = unset
|
||||
indent_style = unset
|
||||
indent_size = unset
|
||||
|
||||
[*.py]
|
||||
indent_size = 4
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
tags
|
||||
result
|
||||
|
|
|
@ -8,10 +8,18 @@ This Template is adopted from the original one with some minor changes:
|
|||
- Altered spacing and fields due to DIN 5008
|
||||
- Moved zip-code in front of city
|
||||
|
||||
This Template has hardcoded German text.
|
||||
|
||||
## Installation
|
||||
|
||||
Simply add the files into `application/views/invoice_templates/pdf` and select them in Invoiceplane's *System Settings -> Invoices* as PDF templates.
|
||||
|
||||
### Extra fields
|
||||
|
||||
You can add a "Leistungszeitraum" for any invoice by defining the two custom date fields: `Leistungszeitraum-Anfang` and `Leistungszeitraum-Ende`. These will not be shown on the invoice if either is not set.
|
||||
|
||||
You can also add a description text for the full invoice by adding a text custom field called `Beschreibung`.
|
||||
|
||||
## Example
|
||||
|
||||
![Screenshot](screenshot.png)
|
||||
|
|
58
flake.lock
Normal file
58
flake.lock
Normal file
|
@ -0,0 +1,58 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1727826117,
|
||||
"narHash": "sha256-K5ZLCyfO/Zj9mPFldf3iwS6oZStJcU4tSpiXTMYaaL0=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "3d04084d54bedc3d6b8b736c70ef449225c361b1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1728193676,
|
||||
"narHash": "sha256-PbDWAIjKJdlVg+qQRhzdSor04bAPApDqIv2DofTyynk=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ecbc1ca8ffd6aea8372ad16be9ebbb39889e55b6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-24.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1727825735,
|
||||
"narHash": "sha256-0xHYkMkeLVQAMa7gvkddbPqpxph+hDzdu1XdGPJR+Os=",
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
26
flake.nix
26
flake.nix
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
description = "b12f invoiceplane template";
|
||||
description = "momo invoiceplane template";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11";
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
};
|
||||
|
||||
|
@ -12,23 +12,25 @@
|
|||
inputs.flake-parts.flakeModules.easyOverlay
|
||||
];
|
||||
|
||||
systems = [ "x86_64-linux" ];
|
||||
systems = [ "x86_64-linux" "aarch64-linux" ];
|
||||
|
||||
perSystem = args@{ system, pkgs, lib, config, ... }: let
|
||||
invoiceplane-template = pkgs.stdenv.mkDerivation {
|
||||
perSystem = { config, pkgs, final, ... }: {
|
||||
devShells.default = pkgs.mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
phpactor
|
||||
];
|
||||
};
|
||||
overlayAttrs = {
|
||||
inherit (config.packages) invoiceplane-template;
|
||||
};
|
||||
packages.invoiceplane-template = pkgs.stdenv.mkDerivation {
|
||||
name = "invoiceplane-template";
|
||||
src = ./.;
|
||||
installPhase = ''
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp *.php $out/
|
||||
'';
|
||||
};
|
||||
in {
|
||||
packages.default = invoiceplane-template;
|
||||
packages.invoiceplane-template = invoiceplane-template;
|
||||
overlayAttrs = {
|
||||
inherit (config.packages) invoiceplane-template;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -103,49 +103,55 @@ footer .notes {
|
|||
<div id="pm-3"><hr /></div>
|
||||
|
||||
<div id="client">
|
||||
<div id="sichtfenster-absender">
|
||||
<?php
|
||||
echo htmlsc($invoice->user_name) . ' - ' . htmlsc($invoice->user_address_1) . ' - ' . htmlsc($invoice->user_zip) . ' ' . htmlsc($invoice->user_city);
|
||||
?>
|
||||
<hr />
|
||||
</div>
|
||||
<div>
|
||||
<b><?php _htmlsc(format_client($invoice)); ?></b>
|
||||
</div>
|
||||
<?php if ($invoice->client_vat_id) {
|
||||
echo '<div>' . trans('vat_id_short') . ': ' . $invoice->client_vat_id . '</div>';
|
||||
}
|
||||
if ($invoice->client_tax_code) {
|
||||
echo '<div>' . trans('tax_code_short') . ': ' . $invoice->client_tax_code . '</div>';
|
||||
}
|
||||
if ($invoice->client_address_1) {
|
||||
echo '<div>' . htmlsc($invoice->client_address_1) . '</div>';
|
||||
}
|
||||
if ($invoice->client_address_2) {
|
||||
echo '<div>' . htmlsc($invoice->client_address_2) . '</div>';
|
||||
}
|
||||
if ($invoice->client_city || $invoice->client_state || $invoice->client_zip) {
|
||||
echo '<div>';
|
||||
<div id="sichtfenster-absender">
|
||||
<?php if ($invoice->user_company !== ""): ?>
|
||||
<?php
|
||||
echo htmlsc($invoice->user_company) . ' - ' . htmlsc($invoice->user_address_1) . ' - ' . htmlsc($invoice->user_zip) . ' ' . htmlsc($invoice->user_city);
|
||||
?>
|
||||
<?php else: ?>
|
||||
<?php
|
||||
echo htmlsc($invoice->user_name) . ' - ' . htmlsc($invoice->user_address_1) . ' - ' . htmlsc($invoice->user_zip) . ' ' . htmlsc($invoice->user_city);
|
||||
?>
|
||||
<?php endif; ?>
|
||||
<hr />
|
||||
</div>
|
||||
<div>
|
||||
<b><?php _htmlsc(format_client($invoice)); ?></b>
|
||||
</div>
|
||||
<?php if ($invoice->client_vat_id) {
|
||||
echo '<div>' . trans('vat_id_short') . ': ' . $invoice->client_vat_id . '</div>';
|
||||
}
|
||||
if ($invoice->client_tax_code) {
|
||||
echo '<div>' . trans('tax_code_short') . ': ' . $invoice->client_tax_code . '</div>';
|
||||
}
|
||||
if ($invoice->client_address_1) {
|
||||
echo '<div>' . htmlsc($invoice->client_address_1) . '</div>';
|
||||
}
|
||||
if ($invoice->client_address_2) {
|
||||
echo '<div>' . htmlsc($invoice->client_address_2) . '</div>';
|
||||
}
|
||||
if ($invoice->client_city || $invoice->client_state || $invoice->client_zip) {
|
||||
echo '<div>';
|
||||
if ($invoice->client_zip) {
|
||||
echo htmlsc($invoice->client_zip) . ' ';
|
||||
}
|
||||
if ($invoice->client_city) {
|
||||
echo htmlsc($invoice->client_city) . ' ';
|
||||
}
|
||||
if ($invoice->client_state) {
|
||||
echo htmlsc($invoice->client_state);
|
||||
}
|
||||
echo '</div>';
|
||||
}
|
||||
if ($invoice->client_country) {
|
||||
echo '<div>' . get_country_name(trans('cldr'), $invoice->client_country) . '</div>';
|
||||
}
|
||||
echo htmlsc($invoice->client_zip) . ' ';
|
||||
}
|
||||
if ($invoice->client_city) {
|
||||
echo htmlsc($invoice->client_city) . ' ';
|
||||
}
|
||||
if ($invoice->client_state) {
|
||||
echo htmlsc($invoice->client_state);
|
||||
}
|
||||
echo '</div>';
|
||||
}
|
||||
if ($invoice->client_country) {
|
||||
echo '<div>' . get_country_name(trans('cldr'), $invoice->client_country) . '</div>';
|
||||
}
|
||||
|
||||
echo '<br/>';
|
||||
echo '<br/>';
|
||||
|
||||
if ($invoice->client_phone) {
|
||||
echo '<div>' . trans('phone_abbr') . ': ' . htmlsc($invoice->client_phone) . '</div>';
|
||||
} ?>
|
||||
if ($invoice->client_phone) {
|
||||
echo '<div>' . trans('phone_abbr') . ': ' . htmlsc($invoice->client_phone) . '</div>';
|
||||
} ?>
|
||||
</div>
|
||||
|
||||
<header class="clearfix">
|
||||
|
@ -156,10 +162,16 @@ footer .notes {
|
|||
|
||||
<h1 class="invoice-title"><?php echo trans('invoice'); ?></h1>
|
||||
|
||||
<!-- client is extracted due to absolute position -->
|
||||
<!-- client is extracted due to absolute position -->
|
||||
|
||||
<div id="company">
|
||||
<div><b><?php _htmlsc($invoice->user_name); ?></b></div>
|
||||
<div><b>
|
||||
<?php if ($invoice->user_company !== "") : ?>
|
||||
<?php _htmlsc($invoice->user_company); ?>
|
||||
<?php else: ?>
|
||||
<?php _htmlsc($invoice->user_name); ?>
|
||||
<?php endif; ?>
|
||||
</b></div>
|
||||
<?php if ($invoice->user_vat_id) {
|
||||
echo '<div>' . trans('vat_id_short') . ': ' . $invoice->user_vat_id . '</div>';
|
||||
}
|
||||
|
@ -229,7 +241,7 @@ footer .notes {
|
|||
|
||||
<p class="invoice-meta">
|
||||
Rechnungsnummer: <?php echo $invoice->invoice_number; ?><br />
|
||||
<?php if ($custom_fields['invoice']['Leistungszeitraum-Anfang'] && $custom_fields['invoice']['Leistungszeitraum-Ende']): ?>
|
||||
<?php if (isset($custom_fields['invoice']['Leistungszeitraum-Anfang']) && isset($custom_fields['invoice']['Leistungszeitraum-Ende'])): ?>
|
||||
Leistungszeitraum:
|
||||
<?php echo date_from_mysql($custom_fields['invoice']['Leistungszeitraum-Anfang'], true); ?>
|
||||
-
|
||||
|
@ -237,7 +249,7 @@ footer .notes {
|
|||
<?php endif; ?>
|
||||
</p>
|
||||
|
||||
<?php if ($custom_fields['invoice']['Beschreibung']): ?>
|
||||
<?php if (isset($custom_fields['invoice']['Beschreibung'])): ?>
|
||||
<p>
|
||||
<?php echo $custom_fields['invoice']['Beschreibung']; ?>
|
||||
</p>
|
||||
|
@ -384,7 +396,12 @@ footer .notes {
|
|||
<?php if (!$isPaid): ?>
|
||||
<p>
|
||||
Bitte überweisen Sie den Rechnungsbetrag innerhalb von <?php echo (-1 * $invoice->days_overdue); ?> Tagen auf untenstehendes Konto:<br />
|
||||
Inhaber: <?php echo $invoice->user_name; ?><br />
|
||||
Inhaber:
|
||||
<?php if ($invoice->user_company !== "") : ?>
|
||||
<?php echo $invoice->user_company; ?><br />
|
||||
<?php else: ?>
|
||||
<?php echo $invoice->user_name; ?><br />
|
||||
<?php endif; ?>
|
||||
IBAN: <?php echo $invoice->user_iban; ?><br />
|
||||
<?php echo invoice_qrcode($invoice->invoice_id); ?>
|
||||
</p>
|
Loading…
Reference in a new issue