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,16 @@
# 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, commission, invoice
def register():
Pool.register(
commission.Agent,
commission.Commission,
invoice.Invoice,
invoice.InvoiceLine,
account.Move,
module='commission_waiting', type_='model')

View File

@@ -0,0 +1,12 @@
# 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 Move(metaclass=PoolMeta):
__name__ = 'account.move'
@classmethod
def _get_origin(cls):
return super(Move, cls)._get_origin() + ['commission']

View File

@@ -0,0 +1,98 @@
# 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.model import ModelView, fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Bool, Eval
from trytond.transaction import Transaction
class Agent(metaclass=PoolMeta):
__name__ = 'commission.agent'
waiting_account = fields.Many2One('account.account', 'Waiting Account',
domain=[
('type', '!=', None),
('closed', '!=', True),
('company', '=', Eval('company')),
],
help="The account the agent's waiting commission amounts are posted "
"to.")
class Commission(metaclass=PoolMeta):
__name__ = 'commission'
waiting_move = fields.Many2One(
'account.move', "Waiting Move", readonly=True)
@classmethod
def __setup__(cls):
super(Commission, cls).__setup__()
cls.amount.states['readonly'] |= Bool(Eval('waiting_move'))
@classmethod
def copy(cls, commissions, default=None):
if default is None:
default = {}
else:
default = default.copy()
default.setdefault('waiting_move', None)
return super(Commission, cls).copy(commissions, default=default)
@classmethod
@ModelView.button
def create_waiting_move(cls, commissions):
pool = Pool()
Move = pool.get('account.move')
Commission = pool.get('commission')
moves = []
for commission in commissions:
move = commission.get_move()
if move:
moves.append(move)
commission.waiting_move = move
Move.save(moves)
Commission.save(commissions)
def get_move(self, date=None):
pool = Pool()
Move = pool.get('account.move')
Line = pool.get('account.move.line')
Date = pool.get('ir.date')
Period = pool.get('account.period')
Currency = pool.get('currency.currency')
if not self.agent.waiting_account:
return
if self.waiting_move:
return self.waiting_move
if date is None:
with Transaction().set_context(company=self.agent.company.id):
date = Date.today()
period = Period.find(self.agent.company, date=date)
move = Move(journal=self.get_journal(), origin=self,
date=date, period=period, company=self.agent.company)
amount = Currency.compute(self.currency, self.amount,
self.agent.company.currency)
line = Line()
with Transaction().set_context(date=date):
if self.type_ == 'in':
line.credit = amount if amount > 0 else 0
line.debit = amount if amount < 0 else 0
line.account = self.product.account_revenue_used
else:
line.debit = amount if amount > 0 else 0
line.credit = amount if amount < 0 else 0
line.account = self.product.account_expense_used
if line.account.party_required:
line.party = self.agent.party
# XXX second currency?
counterpart = Line()
counterpart.debit, counterpart.credit = line.credit, line.debit
counterpart.account = self.agent.waiting_account
if counterpart.account.party_required:
counterpart.party = self.agent.party
move.lines = (line, counterpart)
return move

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. -->
<tryton>
<data>
<record model="ir.ui.view" id="agent_view_form">
<field name="model">commission.agent</field>
<field name="inherit" ref="commission.agent_view_form"/>
<field name="name">agent_form</field>
</record>
<record model="ir.ui.view" id="commission_view_form">
<field name="model">commission</field>
<field name="inherit" ref="commission.commission_view_form"/>
<field name="name">commission_form</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,67 @@
# 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 trytond.pool import Pool, PoolMeta
class Invoice(metaclass=PoolMeta):
__name__ = 'account.invoice'
@classmethod
def _post(cls, invoices):
super()._post(invoices)
cls.post_commission_waiting_moves(invoices)
@classmethod
def create_commissions(cls, invoices):
pool = Pool()
Commission = pool.get('commission')
commissions = super(Invoice, cls).create_commissions(invoices)
Commission.create_waiting_move(commissions)
return commissions
@classmethod
def post_commission_waiting_moves(cls, invoices):
pool = Pool()
Move = pool.get('account.move')
moves = []
for invoice in invoices:
for line in invoice.lines:
for commission in line.from_commissions:
if (commission.waiting_move
and commission.waiting_move.state != 'posted'):
moves.append(commission.waiting_move)
if moves:
Move.post(moves)
class InvoiceLine(metaclass=PoolMeta):
__name__ = 'account.invoice.line'
def get_move_lines(self):
pool = Pool()
MoveLine = pool.get('account.move.line')
lines = super(InvoiceLine, self).get_move_lines()
if self.from_commissions:
amounts = defaultdict(int)
for commission in self.from_commissions:
if not commission.waiting_move:
continue
for line in commission.waiting_move.lines:
amounts[(line.account, line.party)] += (
line.debit - line.credit)
for (account, party), amount in amounts.items():
line = MoveLine()
line.debit = -amount if amount < 0 else 0
line.credit = amount if amount > 0 else 0
line.account = account
line.party = party
line.amount_second_currency = None
lines.append(line)
return lines

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,17 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Assentament d'espera"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Compte d'espera"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""
"El compte on es contabilitzarant els imports de ocmisions en espera de "
"l'agent."

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Sammelbuchung"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Sammelkonto"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""
"Das Konto, auf dem die auszuzahlenden Provisionsbeträge gesammelt werden."

View File

@@ -0,0 +1,17 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Asiento de espera"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Cuenta de espera"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""
"La cuenta en la que se contabilizan los importes de comisiones en espera del"
" agente."

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Vahekonto"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Vahekonto"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "حساب در انتظار"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "حساب در انتظار"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,17 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Mouvement d'attente"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Compte d'attente"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""
"Le compte sur lequel les montants des commissions en attente de l'agent sont"
" comptabilisés."

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Akun Tunggu"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Akun Tunggu"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,17 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Movimento in attesa"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "conto attesa"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""
"Il conto in cui vengono registrati gli importi delle commissioni in attesa "
"dell'agente."

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "ບັນຊີລໍຖ້າ"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "ບັນຊີລໍຖ້າ"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,17 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "wacht boeking"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "wachtrekening"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""
"De rekening waarop de wachtende commissiebedragen van de agent worden "
"geboekt."

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Conta de Espera"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Conta de Espera"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Mișcare în așteptare"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Cont de așteptare"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""
"Conturile in care este postat comisionul al agentului in care de așteptare."

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,16 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr "Čakalni konto"
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr "Čakalni konto"
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

View File

@@ -0,0 +1,15 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:commission,waiting_move:"
msgid "Waiting Move"
msgstr ""
msgctxt "field:commission.agent,waiting_account:"
msgid "Waiting Account"
msgstr ""
msgctxt "help:commission.agent,waiting_account:"
msgid "The account the agent's waiting commission amounts are posted to."
msgstr ""

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,157 @@
===================
Commission 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 (
... create_payment_term, set_fiscalyear_invoice_sequences)
>>> 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('commission_waiting')
Create company::
>>> _ = create_company()
>>> company = get_company()
Create fiscal year::
>>> fiscalyear = set_fiscalyear_invoice_sequences(
... create_fiscalyear(company, today))
>>> fiscalyear.click('create_period')
Create chart of accounts::
>>> _ = create_chart(company)
>>> accounts = get_accounts(company)
Create waiting account::
>>> Account = Model.get('account.account')
>>> waiting_account = Account(name='Waiting Commission')
>>> waiting_account.type = accounts['payable'].type
>>> waiting_account.reconcile = True
>>> waiting_account.deferral = True
>>> waiting_account.party_required = False
>>> waiting_account.save()
Create customer::
>>> Party = Model.get('party.party')
>>> customer = Party(name='Customer')
>>> customer.save()
Create account category::
>>> ProductCategory = Model.get('product.category')
>>> account_category = ProductCategory(name="Account Category")
>>> account_category.accounting = True
>>> account_category.account_expense = accounts['expense']
>>> account_category.account_revenue = accounts['revenue']
>>> account_category.save()
Create commission product::
>>> Uom = Model.get('product.uom')
>>> Template = Model.get('product.template')
>>> unit, = Uom.find([('name', '=', 'Unit')])
>>> template = Template()
>>> template.name = 'Commission'
>>> template.default_uom = unit
>>> template.type = 'service'
>>> template.list_price = Decimal(0)
>>> template.account_category = account_category
>>> template.save()
>>> commission_product, = template.products
Create commission plan::
>>> Plan = Model.get('commission.plan')
>>> plan = Plan(name='Plan')
>>> plan.commission_product = commission_product
>>> plan.commission_method = 'payment'
>>> line = plan.lines.new()
>>> line.formula = 'amount * 0.1'
>>> plan.save()
Create payment term::
>>> payment_term = create_payment_term()
>>> payment_term.save()
Create agent::
>>> Agent = Model.get('commission.agent')
>>> agent_party = Party(name='Agent')
>>> agent_party.supplier_payment_term = payment_term
>>> agent_party.save()
>>> agent = Agent(party=agent_party)
>>> agent.type_ = 'agent'
>>> agent.plan = plan
>>> agent.currency = company.currency
>>> agent.waiting_account = waiting_account
>>> agent.save()
Create invoice::
>>> Invoice = Model.get('account.invoice')
>>> invoice = Invoice()
>>> invoice.party = customer
>>> invoice.payment_term = payment_term
>>> invoice.agent = agent
>>> line = invoice.lines.new()
>>> line.account = accounts['revenue']
>>> line.description = 'Test'
>>> line.quantity = 1
>>> line.unit_price = Decimal('100.00')
>>> invoice.save()
Post invoice::
>>> invoice.click('post')
>>> line, = invoice.lines
>>> commission, = line.commissions
>>> bool(commission.waiting_move)
True
>>> waiting_account.reload()
>>> waiting_account.balance
Decimal('-10.00')
>>> accounts['payable'].reload()
>>> accounts['payable'].balance
Decimal('0.00')
>>> accounts['expense'].reload()
>>> accounts['expense'].balance
Decimal('10.00')
Create commission invoices::
>>> create_invoice = Wizard('commission.create_invoice')
>>> create_invoice.form.from_ = None
>>> create_invoice.form.to = None
>>> create_invoice.execute('create_')
>>> invoice, = Invoice.find([('state', '=', 'draft')])
>>> invoice.invoice_date = today
>>> invoice.click('post')
>>> waiting_account.reload()
>>> waiting_account.balance
Decimal('0.00')
>>> accounts['payable'].reload()
>>> accounts['payable'].balance
Decimal('-10.00')
>>> accounts['expense'].reload()
>>> accounts['expense'].balance
Decimal('10.00')

View File

@@ -0,0 +1,12 @@
# 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 CommissionWaitingTestCase(ModuleTestCase):
'Test Commission Waiting module'
module = 'commission_waiting'
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,9 @@
[tryton]
version=7.2.0
depends:
account
account_invoice
commission
ir
xml:
commission.xml

View File

@@ -0,0 +1,9 @@
<?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='currency']" position="after">
<label name="waiting_account"/>
<field name="waiting_account"/>
</xpath>
</data>

View File

@@ -0,0 +1,10 @@
<?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='origin']" position="after">
<newline/>
<label name="waiting_move"/>
<field name="waiting_move"/>
</xpath>
</data>