diff --git a/accounting/locale/zh_Hant/LC_MESSAGES/django.po b/accounting/locale/zh_Hant/LC_MESSAGES/django.po index e0fe781..7ff8c50 100644 --- a/accounting/locale/zh_Hant/LC_MESSAGES/django.po +++ b/accounting/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: mia-accounting 3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-27 23:04+0800\n" -"PO-Revision-Date: 2020-08-27 23:07+0800\n" +"POT-Creation-Date: 2020-08-31 09:53+0800\n" +"PO-Revision-Date: 2020-08-31 09:58+0800\n" "Last-Translator: imacat \n" "Language-Team: Traditional Chinese \n" "Language: Traditional Chinese\n" @@ -195,22 +195,22 @@ msgstr "勞保{month}" msgid "Health insurance for {month}" msgstr "健保{month}" -#: accounting/management/commands/accounting_sample.py:246 +#: accounting/management/commands/accounting_sample.py:247 msgid "Income Tax" msgstr "代扣所得稅" -#: accounting/management/commands/accounting_sample.py:247 +#: accounting/management/commands/accounting_sample.py:248 #, python-brace-format msgid "Payroll for {month}" msgstr "{month}份薪水" #: accounting/templates/accounting/account_detail.html:37 #: accounting/templates/accounting/transaction_expense_detail.html:39 -#: accounting/templates/accounting/transaction_expense_form.html:47 +#: accounting/templates/accounting/transaction_expense_form.html:45 #: accounting/templates/accounting/transaction_income_detail.html:39 -#: accounting/templates/accounting/transaction_income_form.html:47 +#: accounting/templates/accounting/transaction_income_form.html:45 #: accounting/templates/accounting/transaction_transfer_detail.html:39 -#: accounting/templates/accounting/transaction_transfer_form.html:47 +#: accounting/templates/accounting/transaction_transfer_form.html:45 msgid "Error:" msgstr "錯誤:" @@ -246,12 +246,12 @@ msgstr "取消" #: accounting/templates/accounting/account_detail.html:71 #: accounting/templates/accounting/account_form.html:42 #: accounting/templates/accounting/transaction_expense_detail.html:73 -#: accounting/templates/accounting/transaction_expense_form.html:54 +#: accounting/templates/accounting/transaction_expense_form.html:52 #: accounting/templates/accounting/transaction_income_detail.html:73 -#: accounting/templates/accounting/transaction_income_form.html:54 +#: accounting/templates/accounting/transaction_income_form.html:52 #: accounting/templates/accounting/transaction_sort_form.html:43 #: accounting/templates/accounting/transaction_transfer_detail.html:73 -#: accounting/templates/accounting/transaction_transfer_form.html:54 +#: accounting/templates/accounting/transaction_transfer_form.html:52 msgid "Back" msgstr "回上頁" @@ -274,7 +274,7 @@ msgid "Ledger" msgstr "分類帳" #: accounting/templates/accounting/account_detail.html:107 -#: accounting/views.py:1028 +#: accounting/views.py:1076 msgid "This account is in use." msgstr "會計科目使用中。" @@ -347,10 +347,10 @@ msgid "Add a New Account" msgstr "建新會計科目" #: accounting/templates/accounting/account_form.html:81 -#: accounting/templates/accounting/transaction_expense_form.html:117 -#: accounting/templates/accounting/transaction_income_form.html:116 +#: accounting/templates/accounting/transaction_expense_form.html:116 +#: accounting/templates/accounting/transaction_income_form.html:115 #: accounting/templates/accounting/transaction_sort_form.html:137 -#: accounting/templates/accounting/transaction_transfer_form.html:149 +#: accounting/templates/accounting/transaction_transfer_form.html:148 msgid "Save" msgstr "儲存" @@ -626,18 +626,18 @@ msgstr "期間" #: accounting/templates/accounting/report-trial-balance.html:146 #: accounting/templates/accounting/transaction_expense_detail.html:146 #: accounting/templates/accounting/transaction_expense_detail.html:164 -#: accounting/templates/accounting/transaction_expense_form.html:95 +#: accounting/templates/accounting/transaction_expense_form.html:94 #: accounting/templates/accounting/transaction_income_detail.html:146 #: accounting/templates/accounting/transaction_income_detail.html:164 -#: accounting/templates/accounting/transaction_income_form.html:94 +#: accounting/templates/accounting/transaction_income_form.html:93 #: accounting/templates/accounting/transaction_transfer_detail.html:142 #: accounting/templates/accounting/transaction_transfer_detail.html:160 #: accounting/templates/accounting/transaction_transfer_detail.html:189 #: accounting/templates/accounting/transaction_transfer_detail.html:207 -#: accounting/templates/accounting/transaction_transfer_form.html:96 -#: accounting/templates/accounting/transaction_transfer_form.html:126 -#: accounting/views.py:132 accounting/views.py:241 accounting/views.py:381 -#: accounting/views.py:568 +#: accounting/templates/accounting/transaction_transfer_form.html:95 +#: accounting/templates/accounting/transaction_transfer_form.html:125 +#: accounting/views.py:135 accounting/views.py:244 accounting/views.py:384 +#: accounting/views.py:571 msgid "Total" msgstr "合計" @@ -756,7 +756,7 @@ msgstr "%(prep_period)s的日記簿" #: accounting/templates/accounting/report-trial-balance.html:84 #: accounting/templates/accounting/search.html:78 #: accounting/templates/accounting/transaction_transfer_detail.html:121 -#: accounting/templates/accounting/transaction_transfer_form.html:75 +#: accounting/templates/accounting/transaction_transfer_form.html:74 msgid "Debit" msgstr "借方" @@ -766,7 +766,7 @@ msgstr "借方" #: accounting/templates/accounting/report-trial-balance.html:85 #: accounting/templates/accounting/search.html:79 #: accounting/templates/accounting/transaction_transfer_detail.html:168 -#: accounting/templates/accounting/transaction_transfer_form.html:105 +#: accounting/templates/accounting/transaction_transfer_form.html:104 msgid "Credit" msgstr "貸方" @@ -864,12 +864,12 @@ msgid "To Transfer" msgstr "改轉帳" #: accounting/templates/accounting/transaction_expense_detail.html:123 -#: accounting/templates/accounting/transaction_expense_form.html:65 +#: accounting/templates/accounting/transaction_expense_form.html:64 #: accounting/templates/accounting/transaction_income_detail.html:123 -#: accounting/templates/accounting/transaction_income_form.html:65 +#: accounting/templates/accounting/transaction_income_form.html:64 #: accounting/templates/accounting/transaction_sort_form.html:49 #: accounting/templates/accounting/transaction_transfer_detail.html:115 -#: accounting/templates/accounting/transaction_transfer_form.html:65 +#: accounting/templates/accounting/transaction_transfer_form.html:64 msgid "Date:" msgstr "日期:" @@ -881,11 +881,11 @@ msgid "$" msgstr "$" #: accounting/templates/accounting/transaction_expense_detail.html:172 -#: accounting/templates/accounting/transaction_expense_form.html:105 +#: accounting/templates/accounting/transaction_expense_form.html:104 #: accounting/templates/accounting/transaction_income_detail.html:172 -#: accounting/templates/accounting/transaction_income_form.html:104 +#: accounting/templates/accounting/transaction_income_form.html:103 #: accounting/templates/accounting/transaction_transfer_detail.html:217 -#: accounting/templates/accounting/transaction_transfer_form.html:137 +#: accounting/templates/accounting/transaction_transfer_form.html:136 msgid "Notes:" msgstr "註記:" @@ -940,62 +940,119 @@ msgstr "沒有這個會計科目。" msgid "You cannot select a parent account." msgstr "請勿選擇上層會計科目。" -#: accounting/views.py:308 +#: accounting/views.py:311 msgid "Brought Forward" msgstr "上期結轉" -#: accounting/views.py:622 +#: accounting/views.py:625 msgid "Gross Income" msgstr "營業毛利" -#: accounting/views.py:623 +#: accounting/views.py:626 msgid "Operating Income" msgstr "營業淨利" -#: accounting/views.py:624 +#: accounting/views.py:627 msgid "Before Tax Income" msgstr "稅前淨利" -#: accounting/views.py:625 +#: accounting/views.py:628 msgid "After Tax Income" msgstr "稅後淨利" -#: accounting/views.py:802 +#: accounting/views.py:805 msgid "This transaction was not modified." msgstr "會計傳票未異動。" -#: accounting/views.py:803 +#: accounting/views.py:806 msgid "This transaction was saved successfully." msgstr "會計傳票已存檔。" -#: accounting/views.py:910 +#: accounting/views.py:809 +msgid "Pension" +msgstr "國民年金" + +#: accounting/views.py:809 +msgid "Pension for (last_month_name)" +msgstr "國民年金(last_month_no)月" + +#: accounting/views.py:811 +msgid "Health insurance" +msgstr "健保" + +#: accounting/views.py:812 +msgid "Health insurance for (last_month_name)" +msgstr "健保(last_month_no)月" + +#: accounting/views.py:813 +msgid "Electricity bill" +msgstr "電費" + +#: accounting/views.py:814 +msgid "" +"Electricity bill for (last_bimonthly_from_name)-(last_bimonthly_to_name)" +msgstr "電費(last_bimonthly_from_no)–(last_bimonthly_to_no)月" + +#: accounting/views.py:817 +msgid "Water bill" +msgstr "水費" + +#: accounting/views.py:818 +msgid "Water bill for (last_bimonthly_from_name)-(last_bimonthly_to_name)" +msgstr "水費(last_bimonthly_from_no)–(last_bimonthly_to_no)月" + +#: accounting/views.py:821 +msgid "Gas bill" +msgstr "瓦斯費" + +#: accounting/views.py:822 +msgid "Gas bill for (last_bimonthly_from_name)-(last_bimonthly_to_name)" +msgstr "瓦斯費(last_bimonthly_from_no)–(last_bimonthly_to_no)月" + +#: accounting/views.py:825 +msgid "Phone bill" +msgstr "電話費" + +#: accounting/views.py:826 +msgid "Phone bill for (last_month_name)" +msgstr "電話費(last_month_no)月" + +#: accounting/views.py:830 +msgid "Payroll" +msgstr "薪水" + +#: accounting/views.py:830 +msgid "Payroll for (last_month_name)" +msgstr "(last_month_no)月份薪水" + +#: accounting/views.py:958 msgid "This transaction was deleted successfully." msgstr "會計傳票已刪除。" -#: accounting/views.py:926 +#: accounting/views.py:974 msgid "The transaction orders were not modified." msgstr "會計傳票次序未異動。" -#: accounting/views.py:928 +#: accounting/views.py:976 msgid "The transaction orders were saved successfully." msgstr "會計傳票次序已儲存。" -#: accounting/views.py:987 +#: accounting/views.py:1035 msgid "This account was not modified." msgstr "會計科目未異動。" -#: accounting/views.py:988 +#: accounting/views.py:1036 msgid "This account was saved successfully." msgstr "會計科目已存檔。" -#: accounting/views.py:1032 +#: accounting/views.py:1080 msgid "This account was deleted successfully." msgstr "會計科目已刪除。" -#: accounting/views.py:1073 +#: accounting/views.py:1121 msgid "---Accounts In Use---" msgstr "-----使用中科目-----" -#: accounting/views.py:1078 +#: accounting/views.py:1126 msgid "---Accounts Not In Use---" msgstr "-----未使用科目-----" diff --git a/accounting/locale/zh_Hant/LC_MESSAGES/djangojs.po b/accounting/locale/zh_Hant/LC_MESSAGES/djangojs.po index 6fae3f8..be116be 100644 --- a/accounting/locale/zh_Hant/LC_MESSAGES/djangojs.po +++ b/accounting/locale/zh_Hant/LC_MESSAGES/djangojs.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: mia-accounting-js 3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-08-09 21:54+0800\n" -"PO-Revision-Date: 2020-08-11 10:14+0800\n" +"POT-Creation-Date: 2020-08-31 09:42+0800\n" +"PO-Revision-Date: 2020-08-31 09:58+0800\n" "Last-Translator: imacat \n" "Language-Team: Traditional Chinese \n" "Language: Traditional Chinese\n" @@ -53,6 +53,54 @@ msgstr "子科目的代碼會太長(最長5位數字)。" msgid "Please fill in the title." msgstr "請填寫標題。" +#: accounting/static/accounting/js/summary-helper.js:254 +msgid "January" +msgstr "一月" + +#: accounting/static/accounting/js/summary-helper.js:255 +msgid "February" +msgstr "二月" + +#: accounting/static/accounting/js/summary-helper.js:256 +msgid "March" +msgstr "三月" + +#: accounting/static/accounting/js/summary-helper.js:257 +msgid "April" +msgstr "四月" + +#: accounting/static/accounting/js/summary-helper.js:258 +msgid "May" +msgstr "五月" + +#: accounting/static/accounting/js/summary-helper.js:259 +msgid "June" +msgstr "六月" + +#: accounting/static/accounting/js/summary-helper.js:260 +msgid "July" +msgstr "七月" + +#: accounting/static/accounting/js/summary-helper.js:261 +msgid "August" +msgstr "八月" + +#: accounting/static/accounting/js/summary-helper.js:262 +msgid "September" +msgstr "九月" + +#: accounting/static/accounting/js/summary-helper.js:263 +msgid "October" +msgstr "十月" + +#: accounting/static/accounting/js/summary-helper.js:264 +msgid "November" +msgstr "十一月" + +#: accounting/static/accounting/js/summary-helper.js:265 +msgid "December" +msgstr "十二月" + #: accounting/static/accounting/js/transaction-form.js:376 msgid "Please fill in the date." msgstr "請填寫日期。" diff --git a/accounting/static/accounting/js/summary-helper.js b/accounting/static/accounting/js/summary-helper.js index 71e1e3c..e1b4809 100644 --- a/accounting/static/accounting/js/summary-helper.js +++ b/accounting/static/accounting/js/summary-helper.js @@ -178,27 +178,8 @@ function loadKnownSummaryCategories(type) { }); }); - // The regular payments - const regularPayments = getRegularPayments(); - ["debit", "credit"].forEach(function (type) { - summaryCategories[type].regular = []; - summaryAccounts[type].regular = {}; - regularPayments[type].forEach(function (item) { - summaryCategories[type].regular.push(item); - summaryAccounts[type].regular[item.title] = item.account; - }); - }); - const regularPaymentButtons = $("#summary-regular-payments"); - regularPaymentButtons.html(""); - summaryCategories[type].regular.forEach(function (item) { - regularPaymentButtons.append( - $("") - .attr("title", item.summary) - .addClass("btn btn-outline-primary") - .addClass("btn-summary-helper") - .addClass("btn-summary-regular") - .text(item.title)); - }); + // The regular accounts + loadRegularAccounts(type); $(".btn-summary-general-category") .on("click", function () { @@ -221,14 +202,89 @@ function loadKnownSummaryCategories(type) { setBusSummary(); setSummaryAccount("bus", this.innerText); }); +} + +/** + * Loads the regular accounts. + * + * @param {string} type the record type + * @private + */ +function loadRegularAccounts(type) { + const regularAccounts = JSON.parse(document.getElementById("regular-accounts").value); + setRegularAccountSummary(regularAccounts); + Object.keys(regularAccounts).forEach(function (type) { + summaryCategories[type].regular = []; + summaryAccounts[type].regular = {}; + regularAccounts[type].forEach(function (item) { + summaryCategories[type].regular.push(item); + summaryAccounts[type].regular[item.title] = item.account; + }); + console.log(summaryAccounts[type].regular); + }); + const regularAccountButtons = $("#summary-regular-accounts"); + regularAccountButtons.html(""); + summaryCategories[type].regular.forEach(function (item) { + regularAccountButtons.append( + $("") + .attr("title", item.summary) + .addClass("btn btn-outline-primary") + .addClass("btn-summary-helper") + .addClass("btn-summary-regular") + .text(item.title)); + }); $(".btn-summary-regular") .on("click", function () { $("#summary-summary").get(0).value = this.title; - setSummaryRegularPaymentButtons(this.innerText); + setSummaryRegularAccountButtons(this.innerText); setSummaryAccount("regular", this.innerText); }); } +/** + * Sets the summary of the regular accounts according to the date + * + * @param {{}} regularAccounts the regular account data + * @private + */ +function setRegularAccountSummary(regularAccounts) +{ + const monthNames = [ + "", + gettext("January"), + gettext("February"), + gettext("March"), + gettext("April"), + gettext("May"), + gettext("June"), + gettext("July"), + gettext("August"), + gettext("September"), + gettext("October"), + gettext("November"), + gettext("December"), + ]; + const today = new Date($("#txn-date").get(0).value); + const thisMonth = today.getMonth() + 1; + const lastMonth = (thisMonth + 10) % 12 + 1; + const lastBimonthlyFrom = ((thisMonth + thisMonth % 2 + 8) % 12 + 1); + const lastBimonthlyTo = ((thisMonth + thisMonth % 2 + 9) % 12 + 1); + Object.keys(regularAccounts).forEach(function (type) { + regularAccounts[type].forEach(function (item) { + item.summary = item.format + .replaceAll("(month_no)", String(thisMonth)) + .replaceAll("(month_name)", monthNames[thisMonth]) + .replaceAll("(last_month_no)", String(lastMonth)) + .replaceAll("(last_month_name)", monthNames[lastMonth]) + .replaceAll("(last_bimonthly_from_no)", String(lastBimonthlyFrom)) + .replaceAll("(last_bimonthly_from_name)", monthNames[lastBimonthlyFrom]) + .replaceAll("(last_bimonthly_to_no)", String(lastBimonthlyTo)) + .replaceAll("(last_bimonthly_to_name)", monthNames[lastBimonthlyTo]); + }); + }); +} + + /** * Parses the summary and sets up the summary helper. * @@ -459,11 +515,11 @@ function setBusSummary() { } /** - * Sets the regular payment buttons. + * Sets the regular account buttons. * - * @param {string} category the regular payment + * @param {string} category the regular account */ -function setSummaryRegularPaymentButtons(category) { +function setSummaryRegularAccountButtons(category) { $(".btn-summary-regular").each(function () { if (this.innerText === category) { this.classList.remove("btn-outline-primary"); diff --git a/accounting/templates/accounting/include/summary-helper.html b/accounting/templates/accounting/include/summary-helper.html index 4886a79..97e2c46 100644 --- a/accounting/templates/accounting/include/summary-helper.html +++ b/accounting/templates/accounting/include/summary-helper.html @@ -134,11 +134,11 @@ First written: 2020/4/3 - +
-
+
diff --git a/accounting/templates/accounting/transaction_expense_form.html b/accounting/templates/accounting/transaction_expense_form.html index e4ffd93..ca53a20 100644 --- a/accounting/templates/accounting/transaction_expense_form.html +++ b/accounting/templates/accounting/transaction_expense_form.html @@ -32,7 +32,6 @@ First written: 2020/7/23 {% static "accounting/css/transactions.css" as file %}{% add_css file %} {% static "accounting/css/summary-helper.css" as file %}{% add_css file %} {% static "accounting/js/transaction-form.js" as file %}{% add_js file %} - {% static "js/regular-payments.js" as file %}{% add_js file %} {% static "accounting/js/summary-helper.js" as file %}{% add_js file %} {% endblock %} @@ -56,6 +55,7 @@ First written: 2020/7/23 +
{% csrf_token %} diff --git a/accounting/templates/accounting/transaction_income_form.html b/accounting/templates/accounting/transaction_income_form.html index 45c77a8..ca2bc72 100644 --- a/accounting/templates/accounting/transaction_income_form.html +++ b/accounting/templates/accounting/transaction_income_form.html @@ -32,7 +32,6 @@ First written: 2020/7/23 {% static "accounting/css/transactions.css" as file %}{% add_css file %} {% static "accounting/css/summary-helper.css" as file %}{% add_css file %} {% static "accounting/js/transaction-form.js" as file %}{% add_js file %} - {% static "js/regular-payments.js" as file %}{% add_js file %} {% static "accounting/js/summary-helper.js" as file %}{% add_js file %} {% endblock %} @@ -56,6 +55,7 @@ First written: 2020/7/23 + {% csrf_token %} diff --git a/accounting/templates/accounting/transaction_transfer_form.html b/accounting/templates/accounting/transaction_transfer_form.html index 958a227..dbdfa0a 100644 --- a/accounting/templates/accounting/transaction_transfer_form.html +++ b/accounting/templates/accounting/transaction_transfer_form.html @@ -32,7 +32,6 @@ First written: 2020/7/23 {% static "accounting/css/transactions.css" as file %}{% add_css file %} {% static "accounting/css/summary-helper.css" as file %}{% add_css file %} {% static "accounting/js/transaction-form.js" as file %}{% add_js file %} - {% static "js/regular-payments.js" as file %}{% add_js file %} {% static "accounting/js/summary-helper.js" as file %}{% add_js file %} {% endblock %} @@ -56,6 +55,7 @@ First written: 2020/7/23 + {% csrf_token %} diff --git a/accounting/views.py b/accounting/views.py index 21697bb..e363327 100644 --- a/accounting/views.py +++ b/accounting/views.py @@ -20,8 +20,9 @@ """ import json import re -from typing import Dict, Optional +from typing import Dict, Optional, List, Tuple +from django.conf import settings from django.contrib import messages from django.db import transaction from django.db.models import Sum, Case, When, F, Q, Count, BooleanField, \ @@ -34,7 +35,7 @@ from django.template.loader import render_to_string from django.urls import reverse from django.utils import timezone from django.utils.decorators import method_decorator -from django.utils.translation import gettext as _, gettext_noop +from django.utils.translation import gettext as _, gettext_noop, gettext from django.views.decorators.http import require_GET, require_POST from django.views.generic import ListView, DetailView @@ -803,11 +804,42 @@ class TransactionFormView(FormView): form_class = TransactionForm not_modified_message = gettext_noop("This transaction was not modified.") success_message = gettext_noop("This transaction was saved successfully.") + DEFAULT_REGULAR_ACCOUNTS = { + "debit": [ + (gettext_noop("Pension"), + gettext_noop("Pension for (last_month_name)"), + "1314"), + (gettext_noop("Health insurance"), + gettext_noop("Health insurance for (last_month_name)"), + "6262"), + (gettext_noop("Electricity bill"), + gettext_noop("Electricity bill for (last_bimonthly_from_name)" + "-(last_bimonthly_to_name)"), + "6261"), + (gettext_noop("Water bill"), + gettext_noop("Water bill for (last_bimonthly_from_name)" + "-(last_bimonthly_to_name)"), + "6261"), + (gettext_noop("Gas bill"), + gettext_noop("Gas bill for (last_bimonthly_from_name)" + "-(last_bimonthly_to_name)"), + "6261"), + (gettext_noop("Phone bill"), + gettext_noop("Phone bill for (last_month_name)"), + "6261"), + ], + "credit": [ + (gettext_noop("Payroll"), + gettext_noop("Payroll for (last_month_name)"), + "4611"), + ], + } def get_context_data(self, **kwargs): """Returns the context data for the template.""" context = super().get_context_data(**kwargs) context["summary_categories"] = self._get_summary_categories() + context["regular_accounts"] = self._get_regular_accounts() context["new_record_template"] = self._get_new_record_template_json() return context @@ -864,6 +896,28 @@ class TransactionFormView(FormView): # US-ASCII return json.dumps(categories) + @staticmethod + def _get_regular_accounts() -> str: + """Returns the regular account data, as JSON. + + Returns: + Two lists of the (title, format pattern, account code) tuple, sorted by + debit or credit. + """ + try: + regular = settings.REGULAR_ACCOUNTS + regular = {t: [{"title": x[0], + "format": x[1], + "account": x[2]} for x in regular[t]] + for t in regular} + except AttributeError: + regular = TransactionFormView.DEFAULT_REGULAR_ACCOUNTS + regular = {t: [{"title": gettext(x[0]), + "format": gettext(x[1]), + "account": x[2]} for x in regular[t]] + for t in regular} + return json.dumps(regular) + def _get_new_record_template_json(self) -> str: context = {"record_type": "TTT", "no": "NNN"} template_name = "accounting/include/record_form-transfer.html"\