line: amount darf negativ sein + test, constrain gelöscht

This commit is contained in:
Frederik Jaeckel 2022-09-08 12:13:30 +02:00
parent e3887debe9
commit 9732fe11e9
5 changed files with 154 additions and 19 deletions

16
line.py
View file

@ -91,8 +91,7 @@ class Line(Workflow, ModelSQL, ModelView):
STATES['readonly'], STATES['readonly'],
Eval('bookingtype', '').in_(['spin', 'spout']), Eval('bookingtype', '').in_(['spin', 'spout']),
), ),
}, depends=DEPENDS+['currency_digits', 'bookingtype'], }, depends=DEPENDS+['currency_digits', 'bookingtype'])
domain=[('amount', '>=', Decimal('0.0'))])
debit = fields.Numeric(string='Debit', digits=(16, Eval('currency_digits', 2)), debit = fields.Numeric(string='Debit', digits=(16, Eval('currency_digits', 2)),
required=True, readonly=True, depends=['currency_digits']) required=True, readonly=True, depends=['currency_digits'])
credit = fields.Numeric(string='Credit', digits=(16, Eval('currency_digits', 2)), credit = fields.Numeric(string='Credit', digits=(16, Eval('currency_digits', 2)),
@ -174,6 +173,13 @@ class Line(Workflow, ModelSQL, ModelView):
#image = fields.Binary... #image = fields.Binary...
@classmethod
def __register__(cls, module_name):
super(Line, cls).__register__(module_name)
table = cls.__table_handler__(module_name)
table.drop_constraint('amount_val')
@classmethod @classmethod
def __setup__(cls): def __setup__(cls):
super(Line, cls).__setup__() super(Line, cls).__setup__()
@ -184,9 +190,6 @@ class Line(Workflow, ModelSQL, ModelView):
('state_val', ('state_val',
Check(t, t.state.in_(['edit', 'check', 'done'])), Check(t, t.state.in_(['edit', 'check', 'done'])),
'cashbook.msg_line_wrong_state_value'), 'cashbook.msg_line_wrong_state_value'),
('amount_val',
Check(t, t.amount >= Decimal('0.0')),
'cashbook.msg_line_must_positive'),
]) ])
cls._transitions |= set(( cls._transitions |= set((
('edit', 'check'), ('edit', 'check'),
@ -351,11 +354,10 @@ class Line(Workflow, ModelSQL, ModelView):
def search_rec_name(cls, name, clause): def search_rec_name(cls, name, clause):
""" search in description +... """ search in description +...
""" """
l1 = cls.search_payee(name, clause) + [ return cls.search_payee(name, clause) + [
('description',) + tuple(clause[1:]), ('description',) + tuple(clause[1:]),
('category.rec_name',) + tuple(clause[1:]), ('category.rec_name',) + tuple(clause[1:]),
] ]
return l1
def get_rec_name(self, name): def get_rec_name(self, name):
""" short + name """ short + name

View file

@ -150,10 +150,6 @@ msgctxt "model:ir.message,text:msg_line_invalid_category"
msgid "The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'." msgid "The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'."
msgstr "Die Kategorie der Buchungszeile '%(recname)s' paßt nicht zum Buchungstyp '%(booktype)s'." msgstr "Die Kategorie der Buchungszeile '%(recname)s' paßt nicht zum Buchungstyp '%(booktype)s'."
msgctxt "model:ir.message,text:msg_line_must_positive"
msgid "The amount must be positive."
msgstr "Der Betrag muß positiv sein."
############# #############
# res.group # # res.group #

View file

@ -146,10 +146,6 @@ msgctxt "model:ir.message,text:msg_line_invalid_category"
msgid "The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'." msgid "The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'."
msgstr "The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'." msgstr "The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'."
msgctxt "model:ir.message,text:msg_line_must_positive"
msgid "The amount must be positive."
msgstr "The amount must be positive."
msgctxt "model:res.group,name:group_cashbook" msgctxt "model:res.group,name:group_cashbook"
msgid "Cashbook" msgid "Cashbook"
msgstr "Cashbook" msgstr "Cashbook"
@ -262,6 +258,10 @@ msgctxt "model:ir.ui.menu,name:act_category_view"
msgid "Category" msgid "Category"
msgstr "Category" msgstr "Category"
msgctxt "model:ir.ui.menu,name:menu_enter_booking"
msgid "Enter Booking"
msgstr "Enter Booking"
msgctxt "model:ir.action,name:act_book_view" msgctxt "model:ir.action,name:act_book_view"
msgid "Cashbook" msgid "Cashbook"
msgstr "Cashbook" msgstr "Cashbook"
@ -286,6 +286,10 @@ msgctxt "model:ir.action,name:act_wizard_report"
msgid "Cashbook Report" msgid "Cashbook Report"
msgstr "Cashbook Report" msgstr "Cashbook Report"
msgctxt "model:ir.action,name:act_enterbooking_wiz"
msgid "Enter Booking"
msgstr "Enter Booking"
msgctxt "model:ir.action.act_window.domain,name:act_line_domain_current" msgctxt "model:ir.action.act_window.domain,name:act_line_domain_current"
msgid "Current Month" msgid "Current Month"
msgstr "Current Month" msgstr "Current Month"
@ -922,6 +926,10 @@ msgctxt "model:cashbook.configuration,name:"
msgid "Configuration" msgid "Configuration"
msgstr "Configuration" msgstr "Configuration"
msgctxt "view:cashbook.configuration:"
msgid "Enter Booking Wizard"
msgstr "Enter Booking Wizard"
msgctxt "view:cashbook.configuration:" msgctxt "view:cashbook.configuration:"
msgid "Open Cashbook Wizard" msgid "Open Cashbook Wizard"
msgstr "Open Cashbook Wizard" msgstr "Open Cashbook Wizard"
@ -930,6 +938,14 @@ msgctxt "view:cashbook.configuration:"
msgid "Cashbook" msgid "Cashbook"
msgstr "Cashbook" msgstr "Cashbook"
msgctxt "field:cashbook.configuration,defbook:"
msgid "Default Cashbook"
msgstr "Default Cashbook"
msgctxt "help:cashbook.configuration,defbook:"
msgid "The default cashbook is selected when you open the booking wizard."
msgstr "The default cashbook is selected when you open the booking wizard."
msgctxt "field:cashbook.configuration,date_from:" msgctxt "field:cashbook.configuration,date_from:"
msgid "Start Date" msgid "Start Date"
msgstr "Start Date" msgstr "Start Date"
@ -998,6 +1014,14 @@ msgctxt "help:cashbook.configuration_user,catnamelong:"
msgid "Shows the long name of the category in the Category field of a cash book line." msgid "Shows the long name of the category in the Category field of a cash book line."
msgstr "Shows the long name of the category in the Category field of a cash book line." msgstr "Shows the long name of the category in the Category field of a cash book line."
msgctxt "field:cashbook.configuration_user,defbook:"
msgid "Default Cashbook"
msgstr "Default Cashbook"
msgctxt "help:cashbook.configuration_user,defbook:"
msgid "The default cashbook is selected when you open the booking wizard."
msgstr "The default cashbook is selected when you open the booking wizard."
msgctxt "model:cashbook.recon,name:" msgctxt "model:cashbook.recon,name:"
msgid "Cashbook Reconciliation" msgid "Cashbook Reconciliation"
msgstr "Cashbook Reconciliation" msgstr "Cashbook Reconciliation"
@ -1166,3 +1190,95 @@ msgctxt "report:cashbook.reprecon:"
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
msgctxt "report:cashbook.reprecon:"
msgid "Payee"
msgstr "Payee"
msgctxt "model:cashbook.enterbooking.start,name:"
msgid "Enter Booking"
msgstr "Enter Booking"
msgctxt "view:cashbook.enterbooking.start:"
msgid "Description"
msgstr "Description"
msgctxt "view:cashbook.enterbooking.start:"
msgid "Booking"
msgstr "Booking"
msgctxt "field:cashbook.enterbooking.start,cashbook:"
msgid "Cashbook"
msgstr "Cashbook"
msgctxt "field:cashbook.enterbooking.start,cashbooks:"
msgid "Cashbooks"
msgstr "Cashbooks"
msgctxt "field:cashbook.enterbooking.start,currency_digits:"
msgid "Currency Digits"
msgstr "Currency Digits"
msgctxt "field:cashbook.enterbooking.start,currency:"
msgid "Currency"
msgstr "Currency"
msgctxt "field:cashbook.enterbooking.start,bookingtype:"
msgid "Type"
msgstr "Type"
msgctxt "selection:cashbook.enterbooking.start,bookingtype:"
msgid "Revenue"
msgstr "Revenue"
msgctxt "selection:cashbook.enterbooking.start,bookingtype:"
msgid "Revenue Splitbooking"
msgstr "Revenue Splitbooking"
msgctxt "selection:cashbook.enterbooking.start,bookingtype:"
msgid "Expense"
msgstr "Expense"
msgctxt "selection:cashbook.enterbooking.start,bookingtype:"
msgid "Expense Splitbooking"
msgstr "Expense Splitbooking"
msgctxt "selection:cashbook.enterbooking.start,bookingtype:"
msgid "Transfer from"
msgstr "Transfer from"
msgctxt "selection:cashbook.enterbooking.start,bookingtype:"
msgid "Transfer to"
msgstr "Transfer to"
msgctxt "field:cashbook.enterbooking.start,amount:"
msgid "Amount"
msgstr "Amount"
msgctxt "field:cashbook.enterbooking.start,owner_cashbook:"
msgid "Owner"
msgstr "Owner"
msgctxt "field:cashbook.enterbooking.start,category:"
msgid "Category"
msgstr "Category"
msgctxt "field:cashbook.enterbooking.start,booktransf:"
msgid "Source/Dest"
msgstr "Source/Dest"
msgctxt "field:cashbook.enterbooking.start,party:"
msgid "Party"
msgstr "Party"
msgctxt "model:cashbook.enterbooking,name:"
msgid "Enter Booking"
msgstr "Enter Booking"
msgctxt "wizard_button:cashbook.enterbooking,start,end:"
msgid "Cancel"
msgstr "Cancel"
msgctxt "wizard_button:cashbook.enterbooking,start,save_:"
msgid "Save"
msgstr "Save"

View file

@ -113,9 +113,6 @@ full copyright notices and license terms. -->
<record model="ir.message" id="msg_line_invalid_category"> <record model="ir.message" id="msg_line_invalid_category">
<field name="text">The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'.</field> <field name="text">The category of the booking line '%(recname)s' does not match the posting type '%(booktype)s'.</field>
</record> </record>
<record model="ir.message" id="msg_line_must_positive">
<field name="text">The amount must be positive.</field>
</record>
</data> </data>
</tryton> </tryton>

View file

@ -870,11 +870,25 @@ class LineTestCase(ModuleTestCase):
'bookingtype': 'mvout', 'bookingtype': 'mvout',
'amount': Decimal('1.0'), 'amount': Decimal('1.0'),
'booktransf': book2.id, 'booktransf': book2.id,
}, {
'date': date(2022, 6, 1), # in-category, return
'description': 'in-return', # amount negative
'category': category_in.id,
'bookingtype': 'in',
'amount': Decimal('-1.0'),
'booktransf': book2.id,
}, {
'date': date(2022, 6, 1), # out-category, return
'description': 'out-return', # amount negative
'category': category_out.id,
'bookingtype': 'out',
'amount': Decimal('-1.0'),
'booktransf': book2.id,
}])], }])],
}]) }])
self.assertEqual(book.name, 'Book 1') self.assertEqual(book.name, 'Book 1')
self.assertEqual(book.state, 'open') self.assertEqual(book.state, 'open')
self.assertEqual(len(book.lines), 4) self.assertEqual(len(book.lines), 6)
self.assertEqual(book.lines[0].amount, Decimal('1.0')) self.assertEqual(book.lines[0].amount, Decimal('1.0'))
self.assertEqual(book.lines[0].bookingtype, 'in') self.assertEqual(book.lines[0].bookingtype, 'in')
@ -901,6 +915,16 @@ class LineTestCase(ModuleTestCase):
self.assertEqual(book.lines[3].credit, Decimal('0.0')) self.assertEqual(book.lines[3].credit, Decimal('0.0'))
self.assertEqual(book.lines[3].debit, Decimal('1.0')) self.assertEqual(book.lines[3].debit, Decimal('1.0'))
self.assertEqual(book.lines[4].amount, Decimal('-1.0'))
self.assertEqual(book.lines[4].bookingtype, 'in')
self.assertEqual(book.lines[4].credit, Decimal('-1.0'))
self.assertEqual(book.lines[4].debit, Decimal('0.0'))
self.assertEqual(book.lines[5].amount, Decimal('-1.0'))
self.assertEqual(book.lines[5].bookingtype, 'out')
self.assertEqual(book.lines[5].credit, Decimal('0.0'))
self.assertEqual(book.lines[5].debit, Decimal('-1.0'))
Line.write(*[ Line.write(*[
[book.lines[0]], [book.lines[0]],
{ {