Initial import from Docker volume

This commit is contained in:
root
2025-12-26 13:11:43 +00:00
commit 4998dc066a
13336 changed files with 1767801 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import Pool
from . import account, ir, payment, statement
def register():
Pool.register(
payment.Journal,
payment.Payment,
payment.Group,
payment.SucceedStart,
account.Move,
account.MoveReconciliation,
ir.Cron,
module='account_payment_clearing', type_='model')
Pool.register(
statement.Payment,
statement.PaymentGroup,
statement.Statement,
statement.StatementLine,
module='account_payment_clearing', type_='model',
depends=['account_statement'])
Pool.register(
statement.StatementRuleLine,
module='account_payment_clearing', type_='model',
depends=['account_statement_rule'])
Pool.register(
payment.Succeed,
module='account_payment_clearing', type_='wizard')

View File

@@ -0,0 +1,57 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import Pool, PoolMeta
from trytond.tools import grouped_slice
class Move(metaclass=PoolMeta):
__name__ = 'account.move'
@classmethod
def _get_origin(cls):
models = super(Move, cls)._get_origin()
return models + ['account.payment']
def _payments_to_update(reconciliations):
pool = Pool()
Payment = pool.get('account.payment')
Reconciliation = pool.get('account.move.reconciliation')
moves = set()
others = set()
for reconciliation in reconciliations:
for line in reconciliation.lines:
moves.add(line.move)
others.update(line.reconciliations_delegated)
payments = set()
for sub_moves in grouped_slice(moves):
payments.update(Payment.search([
('clearing_move', 'in', [m.id for m in sub_moves]),
], order=[]))
if others:
payments.update(_payments_to_update(Reconciliation.browse(others)))
return payments
class MoveReconciliation(metaclass=PoolMeta):
__name__ = 'account.move.reconciliation'
@classmethod
def create(cls, vlist):
pool = Pool()
Payment = pool.get('account.payment')
reconciliations = super().create(vlist)
Payment.__queue__.update_reconciled(
list(_payments_to_update(reconciliations)))
return reconciliations
@classmethod
def delete(cls, reconciliations):
pool = Pool()
Payment = pool.get('account.payment')
payments = _payments_to_update(reconciliations)
super().delete(reconciliations)
Payment.__queue__.update_reconciled(list(payments))

View File

@@ -0,0 +1,14 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import PoolMeta
class Cron(metaclass=PoolMeta):
__name__ = 'ir.cron'
@classmethod
def __setup__(cls):
super().__setup__()
cls.method.selection.append(
('account.payment.journal|cron_post_clearing_moves',
"Post Clearing Moves"))

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,91 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Compte"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Assentament de liquidació"
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Liquidació conciliada"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr "Línies d'extracte"
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Liquidació conciliada"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr "Línies d'extracte"
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Compte de liquidació"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Diari de liquidació"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr "Retràs comptabilització liquidació"
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Data"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "Defineix el compte a utilitzar pel moviment de liquidació."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr "Marcat si l'apunt de liquidació s'ha conciliat."
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr "Tots els pagaments del grup s'han conciliat."
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
"Comptabilitza automàticament els asentaments de liquidació desprès del retràs.\n"
"Deixeu-ho en blanc per no comptabilitzar."
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Marca pagament amb èxit"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Marca pagaments amb èxit"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Amb èxit"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Comptabilitza assentaments de liquidació"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Liquidació"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Cancel·la"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Amb èxit"

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,91 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Konto"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Abstimmungsbuchungssatz"
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Zahlungsausgleich abgestimmt"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr "Kontoauszugspositionen"
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Zahlungsausgleich abgestimmt"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr "Kontoauszugspositionen"
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Konto Zahlungsausgleich"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Journal Zahlungsausgleich"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr "Verzögerung des Zahlungsausgleichs"
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Datum"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "Definieren des Kontos für die Ausgleichsbuchungssätze."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr "Ausgewählt wenn Zahlungsausgleichsbuchung abgestimmt ist."
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr "Alle Zahlungen in der Gruppe sind abgestimmt."
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
"Automatisches Verbuchen der Ausgleichsbuchungssätze mit Verzögerung.\n"
"Leer lassen, um keine Buchungssätze zu erzeugen."
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Erfolgreiche Zahlung"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Erfolgreiche Zahlungen"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Erfolgreich markieren"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Ausgleichsbuchungssätze erstellen"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Zahlungsausgleich"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Abbrechen"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Erfolgreich"

View File

@@ -0,0 +1,91 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Cuenta"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Asiento de liquidación"
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Liquidación conciliada"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr "Líneas de extracto"
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Liquidación conciliada"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr "Líneas de extracto"
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Cuenta de liquidación"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Diario de liquidación"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr "Retraso contabilización liquidación"
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Fecha"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "Define la cuenta a utilizar para el asiento de liquidación."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr "Marcado si el apunte de liquidación se ha conciliado."
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr "Todos los pagos del grupo se han conciliado."
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
"Contabiliza automáticamente los apuntes de liquidación después del retraso.\n"
"Dejar en blanco para no contabilizar."
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Marcar pagos con éxito"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Marcar pagos con éxito"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Con éxito"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Contabilizar asientos de liquidación"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Liquidación"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Cancelar"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Con éxito"

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Asiento de compensación"
#, fuzzy
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Asiento de compensación"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
#, fuzzy
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Asiento de compensación"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Cuenta de compensación"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Libro diario de compensación"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Fecha"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Pago exitoso"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Pago exitoso"
#, fuzzy
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Exitoso"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr ""
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Compensación"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Cancelar"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Exitoso"

View File

@@ -0,0 +1,93 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Konto"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Arvelduse kanne"
#, fuzzy
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Arvelduse kanne"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
#, fuzzy
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Arvelduse kanne"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Arvelduse konto"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Arvelduse päevaraamat"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr "Arvelduse postitamise viivitus"
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Kuupäev"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "Määra konto, mida kasutada arveldamise kandel."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
"Postita automaatselt arvelduse kanded pärast viivitust.Jäta tühjaks kui ei "
"soovi postitada."
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Tasumine õnnestus"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Tasumised õnnestusid"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Õnnestunud"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Postita tasumise kanded"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Tasumine"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Tühista"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Õnnestunud"

View File

@@ -0,0 +1,94 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "حساب"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "تسویه جابجایی"
#, fuzzy
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "تسویه جابجایی"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
#, fuzzy
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "تسویه جابجایی"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "تسویه حساب"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "تسویه روزنامه"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr "تسویه تاخیر ارسال"
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "تاریخ"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "تعریف حساب برای استفاده تسویه جابجایی."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
"ارسال تسویه جابجایی ها بعداز تأخییر بطورخودکار.\n"
"برای بدون ارسال خالی بگذارید."
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "پرداخت موفق"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "پرداخت های موفق"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "تسویه"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "انصراف"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "موفق شد"

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,91 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Compte"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Mouvement de compensation"
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Compensation réconciliée"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr "Lignes de relevé"
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Compensation réconciliée"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr "Lignes de relevé"
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Compte de compensation"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Journal de compensation"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr "Délai de comptabilisation de compensation"
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Date"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "Définit le compte à utiliser pour le mouvement de compensation."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr "Coché si la ligne de compensation est réconciliée."
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr "Tous les paiements du groupe sont réconciliés."
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
"Comptabilise automatiquement les mouvements de compensation après le délai.\n"
"Laissez vide pour ne pas comptabiliser."
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Réussir les paiements"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Réussir les paiements"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Réussir"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Comptabiliser les mouvements de compensation"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Compensation"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Annuler"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Réussir"

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,89 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Akun"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Tanggal"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr ""
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr ""
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr ""
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Batal"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr ""

View File

@@ -0,0 +1,90 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Conto"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Movimento di compensazione"
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
#, fuzzy
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Movimento di compensazione"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Conto di compensazione"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Registro di compensazione"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Data"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Pagamenti avvenuti con successo"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Pagamenti avvenuti con successo"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Riusciti"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr ""
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Compensazione"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Annulla"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Riusciti"

View File

@@ -0,0 +1,93 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "ຊໍາລະເຄື່ອນຍ້າຍ"
#, fuzzy
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "ຊໍາລະເຄື່ອນຍ້າຍ"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
#, fuzzy
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "ຊໍາລະເຄື່ອນຍ້າຍ"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "ບັນຊີສະສາງ"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "ບັນຊີສະສາງປະຈຳວັນ"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "ວັນທີ"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "ການຈ່າຍສຳເລັດ"
#, fuzzy
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "ການຊໍາລະ"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "ຍົກເລີກ"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "ສຳເລັດແລ້ວ"

View File

@@ -0,0 +1,90 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Koresponduojanti sąskaita"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Data"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Sėkmingai apmokėta"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Sėkmingai apmokėta"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Sėkmingai"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Atsisakyti"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Sėkmingai"

View File

@@ -0,0 +1,91 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Rekening"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "tegenboeking"
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Compensatieboeking afgeletterd"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr "Afschrift regels"
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Compensatieboeking afgeletterd"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr "Afschrift regels"
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "tegen rekening"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "tegen dagboek"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr "tegenboeking vertraging"
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Datum"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "definieer de rekening om te gebruiken voor de tegenboekingen."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr "Aangevinkt als de compensatieboekingsregel is afgeletterd."
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr "Alle betalingen in de groep zijn afgeletterd."
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
"maak automatisch de tegenboeking na de vertraging (delay).\n"
"Laat leeg om geen boekingen te maken."
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "succesvolle betalingen"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "geslaagde betalingen"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "geslaagd"
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Maak tegenboekingen"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "tegenboeking"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Annuleer"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "geslaagd"

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Konto"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Data"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Anuluj"
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,93 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Conta"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Movimento de Compensação"
#, fuzzy
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Movimento de Compensação"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
#, fuzzy
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Movimento de Compensação"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Conta de Compensação"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Diário de Compensação"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Data"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "Define a conta usada para o movimento de compensação."
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Pagamento com Sucesso"
#, fuzzy
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Compensação"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Cancelar"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Sucesso"

View File

@@ -0,0 +1,91 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Cont"
#, fuzzy
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Ștergerea Mișcării"
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Data"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
#, fuzzy
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr "Toate plățile din grup sunt reconciliate."
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr ""
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr ""
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr ""
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Anulare"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr ""

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,93 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr "Konto"
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr "Klirinška knjižba"
#, fuzzy
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Klirinška knjižba"
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
#, fuzzy
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr "Klirinška knjižba"
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr "Klirinški konto"
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr "Klirinški dnevnik"
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr "Datum"
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr "Konto za knjiženje klirinškega prometa"
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Zaključeno plačilo"
#, fuzzy
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr "Kliring"
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr "Prekliči"
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Zaključi"

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,89 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr ""
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr ""
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr ""
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr ""
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr ""

View File

@@ -0,0 +1,92 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:account.payment,account:"
msgid "Account"
msgstr ""
msgctxt "field:account.payment,clearing_move:"
msgid "Clearing Move"
msgstr ""
msgctxt "field:account.payment,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.group,clearing_reconciled:"
msgid "Clearing Reconciled"
msgstr ""
msgctxt "field:account.payment.group,statement_lines:"
msgid "Statement Lines"
msgstr ""
msgctxt "field:account.payment.journal,clearing_account:"
msgid "Clearing Account"
msgstr ""
msgctxt "field:account.payment.journal,clearing_journal:"
msgid "Clearing Journal"
msgstr ""
msgctxt "field:account.payment.journal,clearing_posting_delay:"
msgid "Clearing Posting Delay"
msgstr ""
msgctxt "field:account.payment.succeed.start,date:"
msgid "Date"
msgstr ""
msgctxt "help:account.payment,account:"
msgid "Define the account to use for clearing move."
msgstr ""
msgctxt "help:account.payment,clearing_reconciled:"
msgid "Checked if clearing line is reconciled."
msgstr ""
msgctxt "help:account.payment.group,clearing_reconciled:"
msgid "All payments in the group are reconciled."
msgstr ""
msgctxt "help:account.payment.journal,clearing_posting_delay:"
msgid ""
"Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting."
msgstr ""
#, fuzzy
msgctxt "model:account.payment.succeed.start,name:"
msgid "Succeed Payment"
msgstr "Succeed Payments"
msgctxt "model:ir.action,name:wizard_succeed"
msgid "Succeed Payments"
msgstr "Succeed Payments"
msgctxt "model:ir.model.button,string:payment_succeed_wizard_button"
msgid "Succeed"
msgstr "Succeed"
#, fuzzy
msgctxt "selection:ir.cron,method:"
msgid "Post Clearing Moves"
msgstr "Post Clearing Moves"
msgctxt "view:account.payment.journal:"
msgid "Clearing"
msgstr ""
msgctxt "wizard_button:account.payment.succeed,start,end:"
msgid "Cancel"
msgstr ""
#, fuzzy
msgctxt "wizard_button:account.payment.succeed,start,succeed:"
msgid "Succeed"
msgstr "Succeed"

View File

@@ -0,0 +1,470 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from collections import defaultdict
from functools import wraps
from sql.aggregate import BoolAnd, Min
from sql.conditionals import Coalesce
from trytond import backend
from trytond.model import ModelView, Workflow, fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Bool, Eval, If, TimeDelta
from trytond.tools import grouped_slice, reduce_ids
from trytond.transaction import Transaction
from trytond.wizard import Button, StateTransition, StateView, Wizard
class Journal(metaclass=PoolMeta):
__name__ = 'account.payment.journal'
clearing_account = fields.Many2One('account.account', 'Clearing Account',
domain=[
('company', '=', Eval('company', -1)),
('type', '!=', None),
('closed', '!=', True),
('party_required', '=', False),
],
states={
'required': Bool(Eval('clearing_journal')),
})
clearing_journal = fields.Many2One('account.journal', 'Clearing Journal',
states={
'required': Bool(Eval('clearing_account')),
})
clearing_posting_delay = fields.TimeDelta(
"Clearing Posting Delay",
domain=['OR',
('clearing_posting_delay', '=', None),
('clearing_posting_delay', '>=', TimeDelta()),
],
help="Post automatically the clearing moves after the delay.\n"
"Leave empty for no posting.")
@classmethod
def cron_post_clearing_moves(cls, date=None):
pool = Pool()
Date = pool.get('ir.date')
Move = pool.get('account.move')
if date is None:
date = Date.today()
moves = []
journals = cls.search([
('company', '=', Transaction().context.get('company')),
('clearing_posting_delay', '!=', None),
])
for journal in journals:
move_date = date - journal.clearing_posting_delay
moves.extend(Move.search([
('date', '<=', move_date),
('origin.journal.id', '=', journal.id,
'account.payment'),
('state', '=', 'draft'),
('company', '=', journal.company.id),
]))
Move.post(moves)
def cancel_clearing_move(func):
@wraps(func)
def wrapper(cls, payments, *args, **kwargs):
pool = Pool()
Move = pool.get('account.move')
Line = pool.get('account.move.line')
Reconciliation = pool.get('account.move.reconciliation')
func(cls, payments, *args, **kwargs)
to_delete = []
to_reconcile = defaultdict(lambda: defaultdict(list))
to_unreconcile = []
for payment in payments:
if payment.clearing_move:
if payment.clearing_move.state == 'draft':
to_delete.append(payment.clearing_move)
for line in payment.clearing_move.lines:
if line.reconciliation:
to_unreconcile.append(line.reconciliation)
else:
cancel_move = payment.clearing_move.cancel()
for line in (payment.clearing_move.lines
+ cancel_move.lines):
if line.reconciliation:
to_unreconcile.append(line.reconciliation)
if line.account.reconcile:
to_reconcile[payment.party][line.account].append(
line)
# Remove clearing_move before delete
# in case reconciliation triggers use it.
cls.write(payments, {'clearing_move': None})
if to_unreconcile:
Reconciliation.delete(to_unreconcile)
if to_delete:
Move.delete(to_delete)
for party in to_reconcile:
for lines in to_reconcile[party].values():
Line.reconcile(lines)
cls.update_reconciled(payments)
return wrapper
class Payment(metaclass=PoolMeta):
__name__ = 'account.payment'
account = fields.Many2One(
'account.account', "Account", ondelete='RESTRICT',
domain=[
('closed', '!=', True),
('company', '=', Eval('company', -1)),
['OR',
('second_currency', '=', Eval('currency', None)),
[
('company.currency', '=', Eval('currency', None)),
('second_currency', '=', None),
],
],
If(Eval('line'),
('id', '=', None),
()),
],
states={
'readonly': Eval('state') != 'draft',
'invisible': Eval('line') & ~Eval('account'),
},
help="Define the account to use for clearing move.")
clearing_move = fields.Many2One('account.move', 'Clearing Move',
readonly=True)
clearing_reconciled = fields.Boolean(
"Clearing Reconciled", readonly=True,
states={
'invisible': ~Eval('clearing_move'),
},
help="Checked if clearing line is reconciled.")
@property
def amount_line_paid(self):
amount = super().amount_line_paid
if self.clearing_move:
clearing_lines = [
l for l in self.clearing_move.lines
if l.account == self.clearing_account]
if clearing_lines:
clearing_line = clearing_lines[0]
if (not self.line.reconciliation
and clearing_line.reconciliation):
if self.line.second_currency:
payment_amount = abs(self.line.amount_second_currency)
else:
payment_amount = abs(
self.line.credit - self.line.debit)
amount -= max(min(self.amount, payment_amount), 0)
return amount
@classmethod
def __setup__(cls):
super(Payment, cls).__setup__()
line_invisible = Eval('account') & ~Eval('line')
if 'invisible' in cls.line.states:
cls.line.states['invisible'] &= line_invisible
else:
cls.line.states['invisible'] = line_invisible
cls._buttons.update({
'succeed_wizard': cls._buttons['succeed'],
})
cls.account.domain = [
cls.account.domain,
cls._account_type_domain(),
]
@classmethod
def _account_type_domain(cls):
return If(Eval('state') == 'draft',
If(Eval('kind') == 'receivable',
('type.receivable', '=', True),
('type.payable', '=', True),
),
())
@fields.depends('party', 'kind', 'date')
def on_change_party(self):
super().on_change_party()
if self.kind == 'receivable':
if self.party:
with Transaction().set_context(date=self.date):
self.account = self.party.account_receivable_used
else:
self.account = None
@classmethod
@ModelView.button_action('account_payment_clearing.wizard_succeed')
def succeed_wizard(cls, payments):
pass
@classmethod
@ModelView.button
@Workflow.transition('succeeded')
def succeed(cls, payments):
pool = Pool()
Line = pool.get('account.move.line')
super(Payment, cls).succeed(payments)
cls.set_clearing_move(payments)
to_reconcile = []
for payment in payments:
if (payment.line
and not payment.line.reconciliation
and payment.clearing_move):
lines = [l for l in payment.clearing_move.lines
if l.account == payment.line.account] + [payment.line]
if not sum(l.debit - l.credit for l in lines):
to_reconcile.append(lines)
Line.reconcile(*to_reconcile)
cls.reconcile_clearing(payments)
cls.update_reconciled(payments)
@property
def clearing_account(self):
if self.line:
return self.line.account
elif self.account:
return self.account
@property
def clearing_party(self):
if self.line:
return self.line.party
else:
return self.party
@classmethod
def set_clearing_move(cls, payments):
pool = Pool()
Move = pool.get('account.move')
moves = []
for payment in payments:
move = payment._get_clearing_move()
if move and not payment.clearing_move:
payment.clearing_move = move
moves.append(move)
if moves:
Move.save(moves)
cls.save(payments)
def _get_clearing_move(self, date=None):
pool = Pool()
Move = pool.get('account.move')
Line = pool.get('account.move.line')
Currency = pool.get('currency.currency')
Period = pool.get('account.period')
Date = pool.get('ir.date')
if not self.clearing_account:
return
if (not self.journal.clearing_account
or not self.journal.clearing_journal):
return
if self.clearing_move:
return self.clearing_move
if date is None:
date = Transaction().context.get('clearing_date')
if date is None:
with Transaction().set_context(company=self.company.id):
date = Date.today()
period = Period.find(self.company, date=date)
local_currency = self.journal.currency == self.company.currency
if not local_currency:
with Transaction().set_context(date=self.date):
local_amount = Currency.compute(
self.journal.currency, self.amount, self.company.currency)
else:
local_amount = self.amount
move = Move(journal=self.journal.clearing_journal, origin=self,
date=date, period=period, company=self.company)
line = Line()
if self.kind == 'payable':
line.debit, line.credit = local_amount, 0
else:
line.debit, line.credit = 0, local_amount
line.account = self.clearing_account
if not local_currency:
line.amount_second_currency = self.amount.copy_sign(
line.debit - line.credit)
line.second_currency = self.journal.currency
line.party = (self.clearing_party
if line.account.party_required else None)
counterpart = Line()
if self.kind == 'payable':
counterpart.debit, counterpart.credit = 0, local_amount
else:
counterpart.debit, counterpart.credit = local_amount, 0
counterpart.account = self.journal.clearing_account
if not local_currency:
counterpart.amount_second_currency = self.amount.copy_sign(
counterpart.debit - counterpart.credit)
counterpart.second_currency = self.journal.currency
move.lines = (line, counterpart)
return move
@classmethod
@ModelView.button
@Workflow.transition('processing')
@cancel_clearing_move
def proceed(cls, payments):
super().proceed(payments)
@classmethod
@ModelView.button
@Workflow.transition('failed')
@cancel_clearing_move
def fail(cls, payments):
super(Payment, cls).fail(payments)
@classmethod
def update_reconciled(cls, payments):
for payment in payments:
if payment.clearing_move:
payment.clearing_reconciled = all(
l.reconciliation for l in payment.clearing_lines)
else:
payment.clearing_reconciled = False
cls.save(payments)
@classmethod
def reconcile_clearing(cls, payments):
pool = Pool()
MoveLine = pool.get('account.move.line')
Group = pool.get('account.payment.group')
to_reconcile = []
for payment in payments:
if not payment.clearing_move:
continue
clearing_account = payment.journal.clearing_account
if not clearing_account or not clearing_account.reconcile:
continue
lines = [l for l in payment.clearing_lines if not l.reconciliation]
if lines and not sum((l.debit - l.credit) for l in lines):
to_reconcile.append(lines)
if to_reconcile:
MoveLine.reconcile(*to_reconcile)
Group.reconcile_clearing(
Group.browse(list({p.group for p in payments if p.group})))
@property
def clearing_lines(self):
clearing_account = self.journal.clearing_account
if self.clearing_move:
for line in self.clearing_move.lines:
if line.account == clearing_account:
yield line
@classmethod
def copy(cls, payments, default=None):
if default is None:
default = {}
else:
default = default.copy()
default.setdefault('clearing_move')
return super(Payment, cls).copy(payments, default=default)
class Group(metaclass=PoolMeta):
__name__ = 'account.payment.group'
clearing_reconciled = fields.Function(fields.Boolean(
"Clearing Reconciled",
help="All payments in the group are reconciled."),
'get_reconciled', searcher='search_reconciled')
@classmethod
def get_reconciled(cls, groups, name):
pool = Pool()
Payment = pool.get('account.payment')
payment = Payment.__table__()
cursor = Transaction().connection.cursor()
result = defaultdict()
column = Coalesce(payment.clearing_reconciled, False)
if backend.name == 'sqlite':
column = Min(column)
else:
column = BoolAnd(column)
for sub_groups in grouped_slice(groups):
cursor.execute(*payment.select(
payment.group, column,
where=reduce_ids(payment.group, sub_groups),
group_by=payment.group))
result.update(cursor)
return result
@classmethod
def search_reconciled(cls, name, clause):
pool = Pool()
Payment = pool.get('account.payment')
payment = Payment.__table__()
_, operator, value = clause
Operator = fields.SQL_OPERATORS[operator]
column = Coalesce(payment.clearing_reconciled, False)
if backend.name == 'sqlite':
column = Min(column)
else:
column = BoolAnd(column)
query = payment.select(
payment.group,
having=Operator(column, value),
group_by=payment.group)
return [('id', 'in', query)]
@classmethod
def reconcile_clearing(cls, groups):
pool = Pool()
MoveLine = pool.get('account.move.line')
to_reconcile = []
for group in groups:
clearing_account = group.journal.clearing_account
if not clearing_account or not clearing_account.reconcile:
continue
lines = [l for l in group.clearing_lines if not l.reconciliation]
if lines and not sum((l.debit - l.credit) for l in lines):
to_reconcile.append(lines)
if to_reconcile:
MoveLine.reconcile(*to_reconcile)
@property
def clearing_lines(self):
for payment in self.payments:
yield from payment.clearing_lines
class Succeed(Wizard):
"Succeed Payment"
__name__ = 'account.payment.succeed'
start = StateView('account.payment.succeed.start',
'account_payment_clearing.succeed_start_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Succeed', 'succeed', 'tryton-ok', default=True),
])
succeed = StateTransition()
def transition_succeed(self):
with Transaction().set_context(clearing_date=self.start.date):
self.model.succeed(self.records)
return 'end'
class SucceedStart(ModelView):
"Succeed Payment"
__name__ = 'account.payment.succeed.start'
date = fields.Date("Date", required=True)
@classmethod
def default_date(cls):
pool = Pool()
Date = pool.get('ir.date')
return Date.today()

View File

@@ -0,0 +1,54 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.ui.view" id="payment_journal_view_form">
<field name="model">account.payment.journal</field>
<field name="inherit"
ref="account_payment.payment_journal_view_form"/>
<field name="name">payment_journal_form</field>
</record>
<record model="ir.ui.view" id="payment_view_form">
<field name="model">account.payment</field>
<field name="inherit" ref="account_payment.payment_view_form"/>
<field name="name">payment_form</field>
</record>
<record model="ir.ui.view" id="payment_view_list">
<field name="model">account.payment</field>
<field name="inherit" ref="account_payment.payment_view_list"/>
<field name="name">payment_list</field>
</record>
<record model="ir.ui.view" id="payment_group_view_list">
<field name="model">account.payment.group</field>
<field name="inherit" ref="account_payment.payment_group_view_list"/>
<field name="name">payment_group_list</field>
</record>
<record model="ir.action.wizard" id="wizard_succeed">
<field name="name">Succeed Payments</field>
<field name="wiz_name">account.payment.succeed</field>
<field name="model">account.payment</field>
</record>
<record model="ir.ui.view" id="succeed_start_view_form">
<field name="model">account.payment.succeed.start</field>
<field name="type">form</field>
<field name="name">succeed_start_form</field>
</record>
<record model="ir.model.button" id="payment_succeed_wizard_button">
<field name="model">account.payment</field>
<field name="name">succeed_wizard</field>
<field name="string">Succeed</field>
</record>
<record model="ir.cron" id="cron_post_clearing_moves">
<field name="method">account.payment.journal|cron_post_clearing_moves</field>
<field name="interval_number" eval="1"/>
<field name="interval_type">days</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,245 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from sql import Null
from sql.operators import Concat
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval, If
from trytond.transaction import Transaction
class Payment(metaclass=PoolMeta):
__name__ = 'account.payment'
statement_lines = fields.One2Many(
'account.statement.line', 'related_to', "Statement Lines",
readonly=True)
@property
def clearing_lines(self):
clearing_account = self.journal.clearing_account
yield from super().clearing_lines
for statement_line in self.statement_lines:
if statement_line.move:
for line in statement_line.move.lines:
if line.account == clearing_account:
yield line
class PaymentGroup(metaclass=PoolMeta):
__name__ = 'account.payment.group'
statement_lines = fields.One2Many(
'account.statement.line', 'related_to', "Statement Lines",
readonly=True)
@property
def clearing_lines(self):
clearing_account = self.journal.clearing_account
yield from super().clearing_lines
for statement_line in self.statement_lines:
if statement_line.move:
for line in statement_line.move.lines:
if line.account == clearing_account:
yield line
class Statement(metaclass=PoolMeta):
__name__ = 'account.statement'
@classmethod
def _process_payments(cls, moves):
pool = Pool()
Payment = pool.get('account.payment')
payments = super()._process_payments(moves)
if payments:
Payment.__queue__.reconcile_clearing(payments)
return payments
def _group_key(self, line):
key = super(Statement, self)._group_key(line)
if hasattr(line, 'payment'):
key += (('payment', line.payment),)
return key
class StatementLine(metaclass=PoolMeta):
__name__ = 'account.statement.line'
@classmethod
def __setup__(cls):
super(StatementLine, cls).__setup__()
cls.related_to.domain['account.payment'] = [
cls.related_to.domain.get('account.payment', []),
If(Eval('statement_state') == 'draft',
('clearing_reconciled', '!=', True),
()),
]
cls.related_to.domain['account.payment.group'] = [
('company', '=', Eval('company', -1)),
If(Eval('second_currency'),
('currency', '=', Eval('second_currency', -1)),
('currency', '=', Eval('currency', -1))),
If(Eval('statement_state') == 'draft',
('clearing_reconciled', '!=', True),
()),
]
@classmethod
def __register__(cls, module):
table = cls.__table__()
super().__register__(module)
table_h = cls.__table_handler__(module)
cursor = Transaction().connection.cursor()
# Migration from 6.2: replace payment by related_to
if table_h.column_exist('payment'):
cursor.execute(*table.update(
[table.related_to],
[Concat('account.payment,', table.payment)],
where=table.payment != Null))
table_h.drop_column('payment')
# Migration from 6.2: replace payment_group by related_to
if table_h.column_exist('payment_group'):
cursor.execute(*table.update(
[table.related_to],
[Concat('account.payment.group,', table.payment_group)],
where=table.payment_group != Null))
table_h.drop_column('payment_group')
@classmethod
def _get_relations(cls):
return super()._get_relations() + ['account.payment.group']
@property
@fields.depends('related_to')
def payment_group(self):
pool = Pool()
PaymentGroup = pool.get('account.payment.group')
related_to = getattr(self, 'related_to', None)
if isinstance(related_to, PaymentGroup) and related_to.id >= 0:
return related_to
@payment_group.setter
def payment_group(self, value):
self.related_to = value
@fields.depends(methods=['payment', 'payment_group'])
def on_change_related_to(self):
super().on_change_related_to()
if self.payment:
clearing_account = self.payment.journal.clearing_account
if clearing_account:
self.account = clearing_account
if self.payment_group:
self.party = None
clearing_account = self.payment_group.journal.clearing_account
if clearing_account:
self.account = clearing_account
def payments(self):
yield from super().payments()
if self.payment_group:
yield self.payment_group.kind, self.payment_group.payments
@fields.depends('party', methods=['payment'])
def on_change_party(self):
super(StatementLine, self).on_change_party()
if self.payment:
if self.payment.party != self.party:
self.payment = None
if self.party:
self.payment_group = None
@fields.depends('account', methods=['payment', 'payment_group'])
def on_change_account(self):
super(StatementLine, self).on_change_account()
if self.payment:
clearing_account = self.payment.journal.clearing_account
elif self.payment_group:
clearing_account = self.payment_group.journal.clearing_account
else:
return
if self.account != clearing_account:
self.payment = None
@classmethod
def post_move(cls, lines):
pool = Pool()
Move = pool.get('account.move')
super(StatementLine, cls).post_move(lines)
Move.post([l.payment.clearing_move for l in lines
if l.payment
and l.payment.clearing_move
and l.payment.clearing_move.state == 'draft'])
class StatementRuleLine(metaclass=PoolMeta):
__name__ = 'account.statement.rule.line'
def _get_related_to(self, origin, keywords, party=None, amount=0):
return super()._get_related_to(
origin, keywords, party=party, amount=amount) | {
self._get_payment(origin, keywords, party=party, amount=amount),
self._get_payment_group(origin, keywords),
}
def _get_party_from(self, related_to):
pool = Pool()
Payment = pool.get('account.payment')
party = super()._get_party_from(related_to)
if isinstance(related_to, Payment):
party = related_to.party
return party
def _get_account_from(self, related_to):
pool = Pool()
Payment = pool.get('account.payment')
PaymentGroup = pool.get('account.payment.group')
account = super()._get_account_from(related_to)
if isinstance(related_to, (Payment, PaymentGroup)):
account = related_to.journal.clearing_account
return account
def _get_payment(self, origin, keywords, party=None, amount=0):
pool = Pool()
Payment = pool.get('account.payment')
if keywords.get('payment'):
domain = [
('rec_name', '=', keywords['payment']),
('company', '=', origin.company.id),
('currency', '=', origin.currency.id),
('state', 'in', ['processing', 'succeeded', 'failed']),
('clearing_reconciled', '!=', True),
]
if party:
domain.append(('party', '=', party.id))
if amount > 0:
domain.append(('kind', '=', 'receivable'))
elif amount < 0:
domain.append(('kind', '=', 'payable'))
payments = Payment.search(domain)
if len(payments) == 1:
payment, = payments
return payment
def _get_payment_group(self, origin, keywords):
pool = Pool()
PaymentGroup = pool.get('account.payment.group')
if keywords.get('payment_group'):
groups, = PaymentGroup.search([
('rec_name', '=', keywords['payment_group']),
('company', '=', origin.company.id),
('currency', '=', origin.currency.id),
('clearing_reconciled', '!=', True),
])
if len(groups) == 1:
group, = groups
return group

View File

@@ -0,0 +1,2 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

View File

@@ -0,0 +1,114 @@
==================================
Negative Payment Clearing Scenario
==================================
Imports::
>>> import datetime as dt
>>> from decimal import Decimal
>>> from proteus import Model, Wizard
>>> from trytond.modules.account.tests.tools import (
... create_chart, create_fiscalyear, get_accounts)
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.tests.tools import activate_modules
>>> today = dt.date.today()
Activate modules::
>>> config = activate_modules(['account_payment_clearing'])
Create company::
>>> _ = create_company()
>>> company = get_company()
Create fiscal year::
>>> fiscalyear = create_fiscalyear(company)
>>> fiscalyear.click('create_period')
Create chart of accounts::
>>> _ = create_chart(company)
>>> accounts = get_accounts(company)
>>> receivable = accounts['receivable']
>>> payable = accounts['payable']
>>> cash = accounts['cash']
>>> expense = accounts['expense']
>>> Account = Model.get('account.account')
>>> bank_clearing = Account(parent=payable.parent)
>>> bank_clearing.name = 'Bank Clearing'
>>> bank_clearing.type = payable.type
>>> bank_clearing.reconcile = True
>>> bank_clearing.deferral = True
>>> bank_clearing.save()
>>> Journal = Model.get('account.journal')
>>> expense_journal, = Journal.find([('code', '=', 'EXP')])
Create payment journal::
>>> PaymentJournal = Model.get('account.payment.journal')
>>> payment_journal = PaymentJournal(name='Manual',
... process_method='manual', clearing_journal=expense_journal,
... clearing_account=bank_clearing)
>>> payment_journal.save()
Create parties::
>>> Party = Model.get('party.party')
>>> supplier = Party(name='Supplier')
>>> supplier.save()
Create payable move::
>>> Move = Model.get('account.move')
>>> move = Move()
>>> move.journal = expense_journal
>>> line = move.lines.new(
... account=payable, party=supplier, maturity_date=today,
... debit=Decimal('-50.00'))
>>> line = move.lines.new(account=expense, credit=Decimal('-50.00'))
>>> move.click('post')
>>> payable.reload()
>>> payable.balance
Decimal('-50.00')
Pay the line::
>>> Payment = Model.get('account.payment')
>>> line, = [l for l in move.lines if l.account == payable]
>>> pay_line = Wizard('account.move.line.pay', [line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = payment_journal
>>> pay_line.execute('next_')
>>> payment, = Payment.find([('state', '=', 'draft')])
>>> payment.amount
Decimal('50.00')
>>> payment.click('submit')
>>> payment.click('approve')
>>> payment.state
'approved'
>>> process_payment = payment.click('process_wizard')
>>> payment.state
'processing'
Succeed payment::
>>> succeed = payment.click('succeed_wizard')
>>> succeed.execute('succeed')
>>> payment.state
'succeeded'
>>> payment.clearing_move.state
'draft'
>>> payable.reload()
>>> payable.balance
Decimal('0.00')
>>> bank_clearing.reload()
>>> bank_clearing.balance
Decimal('-50.00')
>>> bool(payment.line.reconciliation)
True

View File

@@ -0,0 +1,475 @@
=========================
Payment Clearing Scenario
=========================
Imports::
>>> import datetime as dt
>>> from decimal import Decimal
>>> from proteus import Model, Wizard
>>> from trytond.modules.account.tests.tools import (
... create_chart, create_fiscalyear, get_accounts)
>>> from trytond.modules.account_invoice.tests.tools import (
... set_fiscalyear_invoice_sequences)
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.modules.currency.tests.tools import get_currency
>>> from trytond.tests.tools import activate_modules, assertEqual
>>> today = dt.date.today()
>>> yesterday = today - dt.timedelta(days=1)
>>> first = today + dt.timedelta(days=1)
Activate modules::
>>> config = activate_modules(['account_payment_clearing', 'account_statement'])
Create company::
>>> _ = create_company()
>>> company = get_company()
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(
... create_fiscalyear(company, (yesterday, first)))
>>> fiscalyear.click('create_period')
Create chart of accounts::
>>> _ = create_chart(company)
>>> accounts = get_accounts(company)
>>> receivable = accounts['receivable']
>>> revenue = accounts['revenue']
>>> expense = accounts['expense']
>>> payable = accounts['payable']
>>> cash = accounts['cash']
>>> Account = Model.get('account.account')
>>> bank_clearing = Account(parent=payable.parent)
>>> bank_clearing.name = 'Bank Clearing'
>>> bank_clearing.type = payable.type
>>> bank_clearing.reconcile = True
>>> bank_clearing.deferral = True
>>> bank_clearing.save()
>>> Journal = Model.get('account.journal')
>>> expense_journal, = Journal.find([('code', '=', 'EXP')])
>>> revenue_journal, = Journal.find([('code', '=', 'REV')])
Create payment journal::
>>> PaymentJournal = Model.get('account.payment.journal')
>>> payment_journal = PaymentJournal(name='Manual',
... process_method='manual', clearing_journal=expense,
... clearing_account=bank_clearing,
... clearing_posting_delay=dt.timedelta(1))
>>> payment_journal.save()
Create parties::
>>> Party = Model.get('party.party')
>>> supplier = Party(name='Supplier')
>>> supplier.save()
>>> customer = Party(name='Customer')
>>> customer.save()
Create payable move::
>>> Move = Model.get('account.move')
>>> move = Move()
>>> move.journal = expense_journal
>>> line = move.lines.new(
... account=payable, party=supplier, maturity_date=today,
... credit=Decimal('50.00'))
>>> line = move.lines.new(account=expense, debit=Decimal('50.00'))
>>> move.click('post')
>>> payable.reload()
>>> payable.balance
Decimal('-50.00')
Partially pay the line::
>>> Payment = Model.get('account.payment')
>>> line, = [l for l in move.lines if l.account == payable]
>>> pay_line = Wizard('account.move.line.pay', [line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = payment_journal
>>> pay_line.execute('next_')
>>> payment, = Payment.find()
>>> payment.amount = Decimal('30.0')
>>> payment.click('submit')
>>> payment.click('approve')
>>> payment.state
'approved'
>>> process_payment = payment.click('process_wizard')
>>> payment.state
'processing'
Succeed payment::
>>> succeed = payment.click('succeed_wizard')
>>> succeed.form.date = first
>>> succeed.execute('succeed')
>>> payment.state
'succeeded'
>>> assertEqual(payment.clearing_move.date, first)
>>> payment.clearing_move.state
'draft'
>>> bool(payment.clearing_reconciled)
False
>>> payable.reload()
>>> payable.balance
Decimal('-20.00')
>>> bank_clearing.reload()
>>> bank_clearing.balance
Decimal('-30.00')
>>> payment.line.reconciliation
Fail payment::
>>> payment.click('fail')
>>> payment.state
'failed'
>>> payment.clearing_move
>>> bool(payment.clearing_reconciled)
False
>>> payment.line.reconciliation
>>> payable.reload()
>>> payable.balance
Decimal('-50.00')
>>> bank_clearing.reload()
>>> bank_clearing.balance
Decimal('0.00')
Pay the line::
>>> line, = [l for l in move.lines if l.account == payable]
>>> pay_line = Wizard('account.move.line.pay', [line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = payment_journal
>>> pay_line.execute('next_')
>>> payment, = Payment.find([('state', '=', 'draft')])
>>> payment.amount
Decimal('50.00')
>>> payment.click('submit')
>>> payment.click('approve')
>>> payment.state
'approved'
>>> process_payment = payment.click('process_wizard')
>>> payment.state
'processing'
Succeed payment::
>>> succeed = payment.click('succeed_wizard')
>>> succeed.execute('succeed')
>>> payment.state
'succeeded'
>>> payment.clearing_move.state
'draft'
>>> payable.reload()
>>> payable.balance
Decimal('0.00')
>>> bank_clearing.reload()
>>> bank_clearing.balance
Decimal('-50.00')
>>> bool(payment.line.reconciliation)
True
Fail payment::
>>> payment.click('fail')
>>> payment.state
'failed'
>>> payment.clearing_move
>>> payment.line.reconciliation
Succeed payment and post clearing::
>>> succeed = payment.click('succeed_wizard')
>>> succeed.form.date = yesterday
>>> succeed.execute('succeed')
>>> payment.state
'succeeded'
>>> Cron = Model.get('ir.cron')
>>> Company = Model.get('company.company')
>>> cron_post_clearing_moves, = Cron.find([
... ('method', '=',
... 'account.payment.journal|cron_post_clearing_moves'),
... ])
>>> cron_post_clearing_moves.companies.append(Company(company.id))
>>> cron_post_clearing_moves.click('run_once')
>>> payment.reload()
>>> clearing_move = payment.clearing_move
>>> clearing_move.state
'posted'
Fail payment with posted clearing::
>>> payment.click('fail')
>>> payment.state
'failed'
>>> payment.clearing_move
>>> bool(payment.clearing_reconciled)
False
>>> payment.line.reconciliation
>>> clearing_move.reload()
>>> line, = [l for l in clearing_move.lines
... if l.account == payment.line.account]
>>> bool(line.reconciliation)
True
Succeed payment to use on statement::
>>> succeed = payment.click('succeed_wizard')
>>> succeed.execute('succeed')
>>> payment.state
'succeeded'
Create statement::
>>> StatementJournal = Model.get('account.statement.journal')
>>> Statement = Model.get('account.statement')
>>> account_journal, = Journal.find([('code', '=', 'STA')], limit=1)
>>> statement_journal = StatementJournal(name='Test',
... journal=account_journal,
... account=cash,
... )
>>> statement_journal.save()
>>> statement = Statement(name='test',
... journal=statement_journal,
... start_balance=Decimal('0.00'),
... end_balance=Decimal('-50.00'),
... )
Create a line for the payment::
>>> line = statement.lines.new(date=today)
>>> line.amount = Decimal('-50.00')
>>> line.related_to = payment
>>> assertEqual(line.party, supplier)
>>> assertEqual(line.account, bank_clearing)
Remove the party must remove payment::
>>> line.party = None
>>> line.related_to
>>> line.related_to = payment
Change account must remove payment::
>>> line.account = receivable
>>> line.related_to
>>> line.account = None
>>> line.related_to = payment
Validate statement::
>>> statement.click('validate_statement')
>>> statement.state
'validated'
>>> line, = statement.lines
>>> move_line, = [l for l in line.move.lines
... if l.account == bank_clearing]
>>> bool(move_line.reconciliation)
True
>>> bank_clearing.reload()
>>> bank_clearing.balance
Decimal('0.00')
>>> payment.reload()
>>> bool(payment.clearing_reconciled)
True
>>> bool(payment.group.clearing_reconciled)
True
Unreconcile payment clearing to allow reimbursement::
>>> move_line.reconciliation.delete()
>>> payment.reload()
>>> bool(payment.clearing_reconciled)
False
>>> bool(payment.group.clearing_reconciled)
False
Create a statement that reimburse the payment group::
>>> statement = Statement(name='test',
... journal=statement_journal,
... start_balance=Decimal('-50.00'),
... end_balance=Decimal('0.00'),
... )
>>> line = statement.lines.new(date=today)
>>> line.related_to = payment.group
>>> assertEqual(line.account, bank_clearing)
>>> line.amount = Decimal('50.00')
>>> statement.click('validate_statement')
>>> statement.state
'validated'
Payment must be failed::
>>> payment.reload()
>>> payment.state
'failed'
Payment in a foreign currency
-----------------------------
Create a payment journal in Euro::
>>> euro = get_currency('EUR')
>>> euro_payment_journal = PaymentJournal(
... name='Euro Payments', process_method='manual', currency=euro,
... clearing_journal=expense_journal, clearing_account=bank_clearing)
>>> euro_payment_journal.save()
Create a payable move::
>>> move = Move()
>>> move.journal = expense_journal
>>> line = move.lines.new(
... account=payable, party=supplier, maturity_date=today,
... credit=Decimal('20.00'),
... amount_second_currency=Decimal('-40.00'), second_currency=euro)
>>> line = move.lines.new(
... account=expense, debit=Decimal('20.00'),
... amount_second_currency=Decimal('40.00'), second_currency=euro)
>>> move.click('post')
Pay the line::
>>> line, = [l for l in move.lines if l.account == payable]
>>> pay_line = Wizard('account.move.line.pay', [line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = euro_payment_journal
>>> pay_line.execute('next_')
>>> payment, = Payment.find([('state', '=', 'draft')])
>>> payment.amount
Decimal('40.00')
>>> payment.click('submit')
>>> payment.click('approve')
>>> process_payment = payment.click('process_wizard')
>>> payment.state
'processing'
Succeed payment::
>>> succeed = payment.click('succeed_wizard')
>>> succeed.execute('succeed')
>>> debit_line, = [l for l in payment.clearing_move.lines if l.debit > 0]
>>> debit_line.debit
Decimal('20.00')
>>> debit_line.amount_second_currency
Decimal('40.00')
Create receivable move::
>>> move = Move()
>>> move.journal = revenue_journal
>>> line = move.lines.new(
... account=receivable, party=customer, maturity_date=today,
... debit=Decimal('50.00'), second_currency=euro,
... amount_second_currency=Decimal('100.0'))
>>> line = move.lines.new(account=revenue, credit=Decimal('50.00'))
>>> move.click('post')
>>> receivable.reload()
>>> receivable.balance
Decimal('50.00')
Pay the line::
>>> Payment = Model.get('account.payment')
>>> line, = [l for l in move.lines if l.account == receivable]
>>> pay_line = Wizard('account.move.line.pay', [line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = euro_payment_journal
>>> pay_line.execute('next_')
>>> payment, = Payment.find([('state', '=', 'draft')])
>>> payment.amount
Decimal('100.0')
>>> payment.click('submit')
>>> process_payment = payment.click('process_wizard')
>>> payment.state
'processing'
Succeed payment::
>>> succeed = payment.click('succeed_wizard')
>>> succeed.execute('succeed')
>>> credit_line, = [l for l in payment.clearing_move.lines if l.credit > 0]
>>> credit_line.credit
Decimal('50.00')
>>> credit_line.amount_second_currency
Decimal('-100.0')
Validate Statement with processing payment
--------------------------------------------
Create a payable move::
>>> move = Move()
>>> move.journal = expense_journal
>>> line = move.lines.new(
... account=payable, party=supplier, maturity_date=today,
... credit=Decimal('50.00'))
>>> line = move.lines.new(account=expense, debit=Decimal('50.00'))
>>> move.click('post')
Create a processing payment for the move::
>>> Payment = Model.get('account.payment')
>>> line, = [l for l in move.lines if l.account == payable]
>>> pay_line = Wizard('account.move.line.pay', [line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = payment_journal
>>> pay_line.execute('next_')
>>> payment, = Payment.find([('line', '=', line.id)])
>>> payment.click('submit')
>>> payment.click('approve')
>>> payment.state
'approved'
>>> process_payment = payment.click('process_wizard')
>>> payment.state
'processing'
Create statement for the payment::
>>> statement = Statement(name='test',
... journal=statement_journal,
... start_balance=Decimal('0.00'),
... end_balance=Decimal('-50.00'))
>>> line = statement.lines.new(date=yesterday)
>>> line.amount = Decimal('-50.00')
>>> line.related_to = payment
>>> assertEqual(line.party, supplier)
>>> assertEqual(line.account, bank_clearing)
>>> statement.save()
Validate statement and check the payment is confirmed::
>>> statement.click('validate_statement')
>>> statement.state
'validated'
>>> line, = statement.lines
>>> move_line, = [l for l in line.move.lines
... if l.account == bank_clearing]
>>> bool(move_line.reconciliation)
True
>>> payment.reload()
>>> payment.state
'succeeded'
>>> bool(payment.clearing_reconciled)
True
>>> debit_line, = [l for l in payment.clearing_move.lines if l.debit > 0]
>>> debit_line.debit
Decimal('50.00')
>>> assertEqual(debit_line.date, yesterday)

View File

@@ -0,0 +1,167 @@
======================================
Payment Clearing Invoice Amount to Pay
======================================
Imports::
>>> from decimal import Decimal
>>> from proteus import Model, Wizard
>>> from trytond.modules.account.tests.tools import (
... create_chart, create_fiscalyear, get_accounts)
>>> from trytond.modules.account_invoice.tests.tools import (
... set_fiscalyear_invoice_sequences)
>>> from trytond.modules.company.tests.tools import create_company, get_company
>>> from trytond.tests.tools import activate_modules
Activate modules::
>>> config = activate_modules(
... ['account_payment_clearing', 'account_invoice'])
Create company::
>>> _ = create_company()
>>> company = get_company()
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(
... create_fiscalyear(company))
>>> fiscalyear.click('create_period')
Create chart of accounts::
>>> _ = create_chart(company)
>>> accounts = get_accounts(company)
>>> receivable = accounts['receivable']
>>> revenue = accounts['revenue']
>>> expense = accounts['expense']
>>> payable = accounts['payable']
>>> cash = accounts['cash']
>>> Account = Model.get('account.account')
>>> bank_clearing = Account(parent=payable.parent)
>>> bank_clearing.name = 'Bank Clearing'
>>> bank_clearing.type = payable.type
>>> bank_clearing.reconcile = True
>>> bank_clearing.deferral = True
>>> bank_clearing.save()
>>> Journal = Model.get('account.journal')
>>> expense_journal, = Journal.find([('code', '=', 'EXP')])
>>> revenue_journal, = Journal.find([('code', '=', 'REV')])
Create payment journal::
>>> PaymentJournal = Model.get('account.payment.journal')
>>> payment_journal = PaymentJournal(name='No Clearing',
... process_method='manual')
>>> payment_journal.save()
>>> clearing_journal = PaymentJournal(name='Clearing',
... process_method='manual', clearing_journal=expense,
... clearing_account=bank_clearing)
>>> clearing_journal.save()
Create parties::
>>> Party = Model.get('party.party')
>>> supplier = Party(name='Supplier')
>>> supplier.save()
>>> customer = Party(name='Customer')
>>> customer.save()
Create and pay an invoice without clearing::
>>> Invoice = Model.get('account.invoice')
>>> invoice = Invoice()
>>> invoice.party = customer
>>> line = invoice.lines.new()
>>> line.account = revenue
>>> line.quantity = 1
>>> line.unit_price = Decimal('100')
>>> invoice.save()
>>> invoice.click('post')
>>> invoice.amount_to_pay
Decimal('100.00')
>>> paid_line, = [l for l in invoice.move.lines if l.account == receivable]
>>> pay_line = Wizard('account.move.line.pay', [paid_line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = payment_journal
>>> pay_line.execute('next_')
>>> Payment = Model.get('account.payment')
>>> payment, = Payment.find()
>>> payment.click('submit')
>>> payment.state
'submitted'
>>> process_payment = payment.click('process_wizard')
>>> succeed = payment.click('succeed_wizard')
>>> succeed.execute('succeed')
>>> invoice.reload()
>>> invoice.amount_to_pay
Decimal('0.00')
Create an invoice and pay it::
>>> invoice1 = Invoice()
>>> invoice1.party = customer
>>> line = invoice1.lines.new()
>>> line.account = revenue
>>> line.quantity = 1
>>> line.unit_price = Decimal('100')
>>> invoice1.save()
>>> invoice1.click('post')
>>> invoice1.amount_to_pay
Decimal('100.00')
>>> paid_line, = [l for l in invoice1.move.lines if l.account == receivable]
>>> pay_line = Wizard('account.move.line.pay', [paid_line])
>>> pay_line.execute('next_')
>>> pay_line.form.journal = clearing_journal
>>> pay_line.execute('next_')
>>> payment, = Payment.find([('state', '=', 'draft')])
>>> payment.click('submit')
>>> payment.state
'submitted'
>>> process_payment = payment.click('process_wizard')
>>> succeed = payment.click('succeed_wizard')
>>> succeed.execute('succeed')
>>> invoice1.reload()
>>> invoice1.amount_to_pay
Decimal('0')
Unreconcile the payment line and check the amount to pay::
>>> other_line, = [l for l in paid_line.reconciliation.lines
... if l != paid_line]
>>> unreconcile = Wizard('account.move.unreconcile_lines', [paid_line])
>>> invoice1.reload()
>>> invoice1.amount_to_pay
Decimal('0.00')
Create a second invoice and reconcile its line to pay with the payment::
>>> invoice2 = Invoice()
>>> invoice2.party = customer
>>> line = invoice2.lines.new()
>>> line.account = revenue
>>> line.quantity = 1
>>> line.unit_price = Decimal('100')
>>> invoice2.save()
>>> invoice2.click('post')
>>> inv2_line, = [l for l in invoice2.move.lines if l.account == receivable]
>>> reconcile = Wizard(
... 'account.move.reconcile_lines', [inv2_line, other_line])
>>> invoice1.reload()
>>> invoice1.amount_to_pay
Decimal('100.00')
>>> invoice2.reload()
>>> invoice2.amount_to_pay
Decimal('0')

View File

@@ -0,0 +1,13 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.tests.test_tryton import ModuleTestCase
class AccountPaymentTestCase(ModuleTestCase):
'Test Account Payment module'
module = 'account_payment_clearing'
extras = ['account_statement', 'account_statement_rule']
del ModuleTestCase

View File

@@ -0,0 +1,8 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.tests.test_tryton import load_doc_tests
def load_tests(*args, **kwargs):
return load_doc_tests(__name__, __file__, *args, **kwargs)

View File

@@ -0,0 +1,11 @@
[tryton]
version=7.2.0
depends:
account
account_payment
ir
extras_depend:
account_statement
account_statement_rule
xml:
payment.xml

View File

@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="/form/field[@name='line']" position="after">
<label name="account"/>
<field name="account"/>
<newline/>
</xpath>
<xpath expr="/form/notebook/page[@id='info']/field[@name='group']"
position="after">
<label name="clearing_move"/>
<field name="clearing_move"/>
</xpath>
<xpath expr="//button[@name='succeed']" position="replace_attributes">
<button name="succeed_wizard"/>
</xpath>
</data>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//field[@name='payment_complete']" position="after">
<field name="clearing_reconciled"/>
</xpath>
</data>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="/form/field[@name='process_method']" position="after">
<separator id="clearing" string="Clearing" colspan="4"/>
<label name="clearing_account"/>
<field name="clearing_account"/>
<label name="clearing_journal"/>
<field name="clearing_journal" widget="selection"/>
<label name="clearing_posting_delay"/>
<field name="clearing_posting_delay"/>
</xpath>
</data>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="//field[@name='state']" position="after">
<field name="clearing_reconciled"/>
</xpath>
</data>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<label name="date"/>
<field name="date"/>
</form>