From 8c69f38c25e8821b402b4d45cceb826067366268 Mon Sep 17 00:00:00 2001 From: nik gaffney Date: Sat, 28 Oct 2023 12:15:53 +0200 Subject: [PATCH] The Nefastis Machine --- LICENSE | 674 +++++++++++++++++++++++++++++++++++++++++++ README.org | 110 +++++++ generate-invoice.py | 50 ++++ generate-invoice.scm | 27 ++ invoice-example.pdf | Bin 0 -> 25920 bytes invoice-example.yaml | 46 +++ invoice-template.tex | 138 +++++++++ logo.png | Bin 0 -> 11114 bytes 8 files changed, 1045 insertions(+) create mode 100644 LICENSE create mode 100644 README.org create mode 100755 generate-invoice.py create mode 100755 generate-invoice.scm create mode 100644 invoice-example.pdf create mode 100644 invoice-example.yaml create mode 100644 invoice-template.tex create mode 100644 logo.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.org b/README.org new file mode 100644 index 0000000..7642a65 --- /dev/null +++ b/README.org @@ -0,0 +1,110 @@ +# -*- mode: org; coding: utf-8; -*- +#+title: +[[file:logo.png]] + +* Invoice template + +A simple script for generating pdf invoices from text files. + +The template and workflow is build upon [[https://amyfare.ca/files/simple_invoice_template.tex][LaTeX Simple Invoice Template]] by Amy Fare (CC BY 4.0) and [[https://github.com/mrzool/invoice-boilerplate][invoice-boilerplate]] by Mattia Tezzele (GPL2) + +* Requirements +- an XeLaTeX environment such as [[https://tug.org/texlive/][TeX Live]]or [[https://miktex.org/][MiKTeX]] +- [[https://pandoc.org/][pandoc]] +- python or guile (or possibly an other scheme) + +* Instructions for use + - copy/edit =invoice-example.yaml= (invoice file must end in =.yaml=) + - generate pdf via =./generate-invoice.py invoice.yaml= + +* Template variables + +The source file is text in YAML format. The following variables and their values are substituted into the invoice (note that the ’from’ fields are hardcoded for now) + +| invoice-number | | +| invoice-date | | +| invoice-due | | +| invoice-to | name of recipient | +| address-1, address-2, address-3, address-4 | address can use up to 4 lines | +| VAT-id | | + +invoice lines itemizing products or services can be included as part of a =service= list + +| description | description of the item | +| quantity | | +| unit-price | | +| vat-rate | | +| total | line total including any VAT & discounts | +| details | (not used) | + + +The subtotal, taxes and invoice total + +| invoice-subtotal | +| invoice-VAT | +| invoice-total | + +payment details (only configured for SEPA bank transfers) + +| account-name | +| IBAN | +| BIC | + + If required, the invoice can include a line about intra-community supply (for 0% VAT between EU entities) by setting =eu-zero= to =true= or =false= + +| inside-eu | (unused) | +| eu-zero | will add note about “0% VAT” if set to =true= | + + +Adjust some of the typography and layout settings + +| seriffont | e.g. Hoefler Text | +| sansfont | e.g. Fira Sans | +| fontsize | e.g. 10pt | +| geometry | e.g. left=43mm, right=43mm, top=51mm, bottom=17mm | + +* Example + +#+BEGIN_SRC yaml +--- +invoice-number: 20-A0091 +invoice-date: 2020-11-11 +invoice-due: 2030-11-11 + +invoice-to: Erika Mustermann +address-1: Musterallee 23 +address-2: 54321 Musterstadt +address-3: Germany +address-4: +VAT-id: DE837566332 + +# Products & services rendered +service: +- description: Miscellaneous aerospace supplies + quantity: 7 + unit-price: 320.33 + vat-rate: 19 + total: 2668.35 + details: +- description: Tristero System installation and callibration + quantity: 1pc + unit-price: 7120.00 + vat-rate: 19 + total: 8472.80 + details: + +# Invoice totals +invoice-subtotal: 9362.31 +invoice-VAT: 1778.84 +invoice-total: 11141.15 + +# payment details +account-name: Yoyodyne Inc +IBAN: EV27183413 +BIC: EVXXX4 + +# inside EU and/or 0% VAT rate notice? +inside-eu: true +eu-zero: false +--- +#+END_SRC diff --git a/generate-invoice.py b/generate-invoice.py new file mode 100755 index 0000000..68747ae --- /dev/null +++ b/generate-invoice.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +# Creator: nik gaffney +# Created: 2023-10-23 +# Copyright ©️ 2023 FoAM oü +# SPDX-License-Identifier: GPL-3.0-or-later + +import sys +import os +import shutil + +pandoc = "pandoc" +template = "invoice-template.tex" +pdf_engine = "xelatex" + +def check_dependencies(): + def check_cmd(cmd): + if shutil.which(cmd) is None: + print(f"error: {cmd} is not installed.\n") + sys.exit() + check_cmd(pdf_engine) + check_cmd(pandoc) + # etc + + +def process_invoice(file): + output_file = os.path.splitext(file)[0] + # assemble command + pandoc_command = (f"{pandoc} {file} -o {output_file}.pdf \ + --template={template} --pdf-engine={pdf_engine} --quiet") + # run it... + status = os.system(pandoc_command) + if status==0: + print(f"successfully generated {output_file}") + else: + print(f"error generating {output_file}") + + +def main(): + check_dependencies() + if len(sys.argv) == 2: + input_file = sys.argv[1] + process_invoice(input_file) + else: + print(f"usage: {sys.argv[0]} ") + sys.exit() + + +if __name__ == "__main__": + main() diff --git a/generate-invoice.scm b/generate-invoice.scm new file mode 100755 index 0000000..185bbb3 --- /dev/null +++ b/generate-invoice.scm @@ -0,0 +1,27 @@ +#!/usr/local/bin/guile \ +--no-auto-compile -e main -s +!# + +;; Creator: nik gaffney +;; Created: 2023-10-23 +;; Copyright ©️ 2023 FoAM oü +;; SPDX-License-Identifier: GPL-3.0-or-later + +(define pandoc "pandoc") +(define template "invoice-template.tex") +(define pdf-engine "xelatex") + +;; compose & execute suitable pandoc command +(define (run-pandoc file) + (let* ((output-file (basename file ".yaml")) + (status (system + (format #f "~a '~a' -o '~a.pdf' --template='~a' --pdf-engine=~a --quiet" + pandoc file output-file template pdf-engine)))) + (if (eq? status 0) + (display (format #f "successfully generated ~a.pdf\n" output-file)) + (display (format #f "error generating ~a.pdf\n" output-file))))) + +(define (main args) + (if (eq? (length args) 2) + (run-pandoc (list-ref args 1)) + (display (format #f "usage: ~a \n" (car args))))) diff --git a/invoice-example.pdf b/invoice-example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f53ce843ed7c0aa1c90bdc3fbc76e9f5e36e03c1 GIT binary patch literal 25920 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 literal 0 HcmV?d00001 diff --git a/invoice-example.yaml b/invoice-example.yaml new file mode 100644 index 0000000..3eb7d21 --- /dev/null +++ b/invoice-example.yaml @@ -0,0 +1,46 @@ +--- +invoice-number: 20-A0091 +invoice-date: 2020-11-11 +invoice-due: 2030-11-11 + +invoice-to: Erika Mustermann +address-1: Musterallee 1 +address-2: 12345 Musterstadt +address-3: Germany +address-4: +VAT-id: DE837566332 + +# Products & services rendered +service: +- description: Miscellaneous aerospace supplies + quantity: 7 + unit-price: 320.33 + vat-rate: 19 + total: 2,668.35 + details: +- description: Tristero System installation and callibration + quantity: 1pc + unit-price: 7,120.00 + vat-rate: 19 + total: 8,472.80 + details: + +# Invoice totals +invoice-subtotal: 9,362.31 +invoice-VAT: 1,778.84 +invoice-total: 11,141.15 + +# payment details +account-name: Yoyodyne Inc +IBAN: EV27183413 +BIC: EVXXX4 + +# inside EU and/or 0% VAT rate notice? +inside-eu: true +eu-zero: false + +# Invoice settings +currency: EUR +lang: en-GB + +--- diff --git a/invoice-template.tex b/invoice-template.tex new file mode 100644 index 0000000..a0ffce7 --- /dev/null +++ b/invoice-template.tex @@ -0,0 +1,138 @@ +% !TEX TS-program = xelatex +% !TEX encoding = UTF-8 Unicode + +%% Creator: nik gaffney +%% Created: 2023-10-23 +%% Copyright ©️ 2023 FoAM oü +%% SPDX-License-Identifier: GPL-3.0-or-later + +%% Invoice template based on +%% LaTeX Simple Invoice Template by Amy Fare (CC BY 4.0) and +%% invoice-boilerplate by Mattia Tezzele (GPL2) + +\documentclass[a4paper]{article} +\usepackage[utf8]{inputenc} +\usepackage[colorlinks]{hyperref} +\usepackage[left=23mm, right=23mm, top=23mm, bottom=17mm]{geometry} +\usepackage{graphicx} +\usepackage{tabularx} +\usepackage{multirow} +\usepackage{ragged2e} +\usepackage{array} +\usepackage{fontspec} +\usepackage[table]{xcolor} + +\hypersetup{ + urlcolor=blue +} + +% Font(s) +\setmainfont[Ligatures={Common, Rare, Discretionary, Required, Contextual}, + BoldFont={Fira Sans Bold}, + ItalicFont={Fira Sans Book Italic}] + {Fira Sans Book} + +\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} + +\begin{document} + +\thispagestyle{empty} + +\begin{tabularx}{\textwidth}{l X l} + \hspace{-8pt} + \multirow{3}{*} & \hskip12pt\multirow{3}{*} & + + % Invoice no. and Date + {\begin{tabular}{r l } + \huge{Invoice No:} & \huge{$invoice-number$} \\ + & \\ + Issue Date: & $invoice-date$ \\ + Due Date: & $invoice-due$ \\ + \end{tabular}}\hspace{-6pt} \\ + + \hspace{-2.1cm}\includegraphics[height=2cm]{logo.png} & \\ + + \textbf{Yoyodyne Inc} \\ + VAT ID: AT8375614432 & \\ + & \\ + 1640 Riverside Drive & \\ + Hill Valley, CA & \\ + USA & \\ + +\end{tabularx} + +\vspace{0.5 cm} + +%% Recipient + +\begin{tabularx}{\textwidth}{l X l} + \hspace{-8pt} \multirow{5}{*} & \hskip12pt\multirow{5}{*} & \hspace{-6pt} \\ + + \textbf{$invoice-to$} & \\ + VAT ID: $VAT-id$ & \\ + $if(address-1)$ $address-1$ & \\ $endif$ + $if(address-2)$ $address-2$ & \\ $endif$ + $if(address-3)$ $address-3$ & \\ $endif$ + $if(address-4)$ $address-4$ & \\ $endif$ + +\end{tabularx} + +\vspace{0.5 cm} + +%% Table of fees +\begin{tabularx}{\linewidth}{p{8cm} X X r r} + \rowcolor[HTML]{dfdfff} + & & & &\\[0.25ex] + \rowcolor[HTML]{dfdfff} + {\bf{Description}} & + \centering{\bf{Quantity}} & + \centering{\bf{Unit price}} & + \centering{\bf{VAT rate}} & + \bf Net amount\\[2.5ex] + + % sales details + $for(service)$ + \rowcolor[HTML]{efefff} & & & & \\ \rowcolor[HTML]{efefff} + % description + $service.description$ & + % quantity + \centering $service.quantity$ & + % unit price + \centering $service.unit-price$ & + % VAT rate + \centering $service.vat-rate$\% & + % NET amount + $service.total$ \texteuro\\[7.5ex] + % \hline + $endfor$ + + & & & & \\ & & & + \bf \small{Subtotal} & $invoice-subtotal$ \texteuro\\ + & & & & \\ & & & + \bf \small{VAT $if(eu-zero)$ 0\%* $endif$} & $invoice-VAT$ \texteuro\\ [2.5ex] + + & & & \cellcolor[HTML]{dfdfff} & \cellcolor[HTML]{dfdfff} \\ & & & \cellcolor[HTML]{dfdfff} + + \bf \large{Total} & \cellcolor[HTML]{dfdfff} + \large{$invoice-total$ \texteuro} \\ [2.2ex] + +\end{tabularx} + +\vfill{} + +\textbf{Payment instructions} \\ [1.2ex] + +\small{Please add the invoice number to your payment description.} \\ + +\small{Account holder: $account-name$} + +\small{IBAN: $IBAN$} + +\small{BIC/SWIFT: $BIC$} \\ [1.2ex] + +$if(eu-zero)$ +% To include if applicable +\small{*The purchase is liable to Intra-Community supply 0\% Reverse charge.} +$endif$ + +\end{document} diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..93444a001a6228827b0c7a5c622edd360294fbf4 GIT binary patch literal 11114 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 c!19|aVwU}@phLFL$!%CI4LxKj;#T