[IMP] Useability and misc fixes in POS
bzr revid: fp@tinyerp.com-20110925210020-5jvd7x38asnbzv5b
This commit is contained in:
@@ -117,6 +117,12 @@ class account_bank_statement(osv.osv):
|
||||
res[statement_id] = (currency_id, currency_names[currency_id])
|
||||
return res
|
||||
|
||||
def _get_statement(self, cr, uid, ids, context=None):
|
||||
result = {}
|
||||
for line in self.pool.get('account.bank.statement.line').browse(cr, uid, ids, context=context):
|
||||
result[line.statement_id.id] = True
|
||||
return result.keys()
|
||||
|
||||
_order = "date desc, id desc"
|
||||
_name = "account.bank.statement"
|
||||
_description = "Bank Statement"
|
||||
@@ -131,7 +137,11 @@ class account_bank_statement(osv.osv):
|
||||
states={'confirm':[('readonly',True)]}),
|
||||
'balance_end_real': fields.float('Ending Balance', digits_compute=dp.get_precision('Account'),
|
||||
states={'confirm': [('readonly', True)]}),
|
||||
'balance_end': fields.function(_end_balance, store=True, # store=True for account_cash_statement
|
||||
'balance_end': fields.function(_end_balance,
|
||||
store = {
|
||||
'account.bank.statement': (lambda self, cr, uid, ids, c={}: ids, ['line_ids','move_line_ids'], 10),
|
||||
'account.bank.statement.line': (_get_statement, ['amount'], 10),
|
||||
},
|
||||
string="Balance", help='Balance as calculated based on Starting Balance and transaction lines'),
|
||||
'company_id': fields.related('journal_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True),
|
||||
'line_ids': fields.one2many('account.bank.statement.line',
|
||||
@@ -306,7 +316,7 @@ class account_bank_statement(osv.osv):
|
||||
return self.write(cr, uid, ids, {'state':'confirm'}, context=context)
|
||||
|
||||
def check_status_condition(self, cr, uid, state, journal_type='bank'):
|
||||
return state=='draft'
|
||||
return state in ('draft','open')
|
||||
|
||||
def button_confirm_bank(self, cr, uid, ids, context=None):
|
||||
obj_seq = self.pool.get('ir.sequence')
|
||||
|
||||
@@ -184,8 +184,18 @@ class account_cash_statement(osv.osv):
|
||||
res['end'] = end_l
|
||||
return res
|
||||
|
||||
def _get_statement(self, cr, uid, ids, context=None):
|
||||
result = {}
|
||||
for line in self.pool.get('account.bank.statement.line').browse(cr, uid, ids, context=context):
|
||||
result[line.statement_id.id] = True
|
||||
return result.keys()
|
||||
|
||||
_columns = {
|
||||
'total_entry_encoding': fields.function(_get_sum_entry_encoding, store=True, string="Cash Transaction", help="Total cash transactions"),
|
||||
'total_entry_encoding': fields.function(_get_sum_entry_encoding, string="Cash Transaction", help="Total cash transactions",
|
||||
store = {
|
||||
'account.bank.statement': (lambda self, cr, uid, ids, c={}: ids, ['line_ids','move_line_ids'], 10),
|
||||
'account.bank.statement.line': (_get_statement, ['amount'], 10),
|
||||
}),
|
||||
'closing_date': fields.datetime("Closed On"),
|
||||
'balance_end_cash': fields.function(_balance_end_cash, store=True, string='Balance', help="Closing balance based on cashBox"),
|
||||
'starting_details_ids': fields.one2many('account.cashbox.line', 'starting_id', string='Opening Cashbox'),
|
||||
@@ -201,14 +211,6 @@ class account_cash_statement(osv.osv):
|
||||
}
|
||||
|
||||
def create(self, cr, uid, vals, context=None):
|
||||
sql = [
|
||||
('journal_id', '=', vals.get('journal_id', False)),
|
||||
('state', '=', 'open')
|
||||
]
|
||||
open_jrnl = self.search(cr, uid, sql)
|
||||
if open_jrnl:
|
||||
raise osv.except_osv(_('Error'), _('You can not have two open register for the same journal!'))
|
||||
|
||||
if self.pool.get('account.journal').browse(cr, uid, vals['journal_id'], context=context).type == 'cash':
|
||||
open_close = self._get_cash_open_close_box_lines(cr, uid, context)
|
||||
if vals.get('starting_details_ids', False):
|
||||
|
||||
@@ -2556,7 +2556,7 @@ action = pool.get('res.config').next(cr, uid, [], context)
|
||||
<group col="6" colspan="4">
|
||||
<field name="name" select="1"/>
|
||||
<field name="company_id" select="1" groups="base.group_multi_company"/>
|
||||
<field name="journal_id" on_change="onchange_journal_id(journal_id)" domain="[('type','=','cash')]" select="1" widget="selection"/>
|
||||
<field name="journal_id" on_change="onchange_journal_id(journal_id)" select="1" widget="selection"/>
|
||||
<field name="user_id" select="1" readonly="1"/>
|
||||
<field name="period_id" select="1"/>
|
||||
<field name="currency" invisible="1"/>
|
||||
|
||||
@@ -25,9 +25,9 @@ from osv import fields, osv
|
||||
class account_journal(osv.osv):
|
||||
_inherit = 'account.journal'
|
||||
_columns = {
|
||||
'auto_cash': fields.boolean('Automatic Opening', help="This field authorize the automatic creation of the cashbox"),
|
||||
'check_dtls': fields.boolean('Check Details', help="This field authorize Validation of Cashbox without checking ending details"),
|
||||
'journal_users': fields.many2many('res.users', 'pos_journal_users', 'journal_id', 'user_id', 'Users'),
|
||||
'auto_cash': fields.boolean('Automatic Opening', help="This field authorize the automatic creation of the cashbox, without control of the initial balance."),
|
||||
'check_dtls': fields.boolean('Control Balance Before Closing', help="This field authorize Validation of Cashbox without controlling the closing balance."),
|
||||
'journal_user': fields.boolean('PoS Payment Method', help="Check this box if this journal define a payment method that can be used in point of sales."),
|
||||
}
|
||||
_defaults = {
|
||||
'check_dtls': False,
|
||||
@@ -48,14 +48,6 @@ class account_cash_statement(osv.osv):
|
||||
else:
|
||||
return True
|
||||
|
||||
def _user_allow(self, cr, uid, statement_id, context=None):
|
||||
statement = self.browse(cr, uid, statement_id, context=context)
|
||||
if (not statement.journal_id.journal_users) and uid == 1: return True
|
||||
for user in statement.journal_id.journal_users:
|
||||
if uid == user.id:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _get_cash_open_box_lines(self, cr, uid, context=None):
|
||||
res = super(account_cash_statement,self)._get_cash_open_box_lines(cr, uid, context)
|
||||
curr = [0.01, 0.02, 0.05, 0.10, 0.20, 0.50]
|
||||
|
||||
@@ -1,75 +1,17 @@
|
||||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record id="pos_visa_journal" model="account.journal">
|
||||
<field name="name">Visa Journal</field>
|
||||
<field name="code">VIJ</field>
|
||||
<field name="type">cash</field>
|
||||
<field eval="1" name="check_dtls"/>
|
||||
<field name="view_id" ref="account.account_journal_view"/>
|
||||
<field name="sequence_id" ref="account.sequence_journal"/>
|
||||
<field model="account.account" name="default_credit_account_id" ref="account.a_sale"/>
|
||||
<field model="account.account" name="default_debit_account_id" ref="account.a_sale"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
|
||||
<!-- <record id="pos_cash_journal" model="account.journal">
|
||||
<field name="name">Cash Journal</field>
|
||||
<field name="code">CAJ</field>
|
||||
<field name="type">cash</field>
|
||||
<field name="view_id" ref="account.account_journal_view"/>
|
||||
<field name="sequence_id" ref="account.sequence_journal"/>
|
||||
<field model="account.account" name="default_credit_account_id" ref="account.a_sale"/>
|
||||
<field model="account.account" name="default_debit_account_id" ref="account.a_sale"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
-->
|
||||
|
||||
<record id="pos_bankcard_journal" model="account.journal">
|
||||
<field name="name">Bancontact Journal</field>
|
||||
<field name="code">BACJ</field>
|
||||
<field name="type">cash</field>
|
||||
<field eval="1" name="check_dtls"/>
|
||||
<field name="view_id" ref="account.account_journal_view"/>
|
||||
<field name="sequence_id" ref="account.sequence_journal"/>
|
||||
<field model="account.account" name="default_credit_account_id" ref="account.a_sale"/>
|
||||
<field model="account.account" name="default_debit_account_id" ref="account.a_sale"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
|
||||
<record id="account.sales_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
|
||||
<record id="account.refund_sales_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
|
||||
<record id="account.expenses_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
|
||||
<record id="account.refund_expenses_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
|
||||
<record id="account.bank_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
<field eval="True" name="journal_user"/>
|
||||
</record>
|
||||
|
||||
<record id="account.check_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
</record>
|
||||
|
||||
<record id="stock.stock_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
<field eval="True" name="journal_user"/>
|
||||
</record>
|
||||
|
||||
<record id="account.cash_journal" model="account.journal">
|
||||
<field eval="[(6,0,[ref('base.user_root')])]" name="journal_users"/>
|
||||
<field eval="True" name="journal_user"/>
|
||||
<field eval="1" name="check_dtls"/>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -11,11 +11,10 @@
|
||||
<page string="Point of Sale">
|
||||
<group col="6" colspan="4">
|
||||
<separator colspan="6" string="Extended Configuration"/>
|
||||
<field name="check_dtls" groups="point_of_sale.group_pos_manager" string="Check Cash Balance"/>
|
||||
<field name="journal_user"/>
|
||||
<field name="auto_cash"/>
|
||||
<field name="check_dtls"/>
|
||||
</group>
|
||||
<separator colspan="4" string="POS Users"/>
|
||||
<field name="journal_users" nolabel="1" colspan="4"/>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
@@ -65,7 +64,7 @@
|
||||
<search string="Search Cash Statements">
|
||||
<group>
|
||||
<filter string="Open" domain="[('state','=','open')]" icon="terp-document-new" name="open"/>
|
||||
<filter string="Confirm" domain="[('state','=','confirm')]" icon="terp-camera_test"/>
|
||||
<filter string="Closed" domain="[('state','=','confirm')]" icon="terp-camera_test"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="date"/>
|
||||
<field name="name"/>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<field name="groups_id" eval="[(4,ref('group_pos_user'))]"/>
|
||||
</record>
|
||||
<record id="account.cash_journal" model="account.journal">
|
||||
<field eval="[(6, 0, [ref('base.user_root')])]" name="journal_users"/>
|
||||
<field eval="True" name="journal_user"/>
|
||||
</record>
|
||||
|
||||
<record id="product_product_putmoneyforchange0" model="product.product">
|
||||
|
||||
@@ -130,11 +130,16 @@
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Sales Order">
|
||||
<filter icon="terp-document-new" string="New" domain="[('state','=','draft')]"/>
|
||||
<filter icon="gtk-apply" string="Done" domain="[('state','in',('paid','invoiced','done'))]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<filter icon="terp-check" string="Invoiced" domain="[('state','=','invoiced')]"/>
|
||||
<filter icon="gtk-convert" string="Posted" domain="[('state','=','done')]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<filter icon="terp-go-month" string="Today" domain="[('date_order','>=',datetime.date.today().strftime('%%Y-%%m-%%d 00:00:00')),('date_order','<=',datetime.date.today().strftime('%%Y-%%m-%%d 23:59:59'))]"/>
|
||||
<filter icon="gtk-go-forward" string="Yesterday" domain="[('date_order','<',datetime.date.today().strftime('%%Y-%%m-%%d 00:00:00')),('date_order','>=',(datetime.date.today() - relativedelta(days=1)).strftime('%%Y-%%m-%%d 00:00:00'))]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="name"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="user_id"/>
|
||||
<field name="date_order" string="Order date"/>
|
||||
<newline/>
|
||||
<group expand="0" string="Group By..." groups="base.group_extended">
|
||||
<filter string="Customer" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
|
||||
@@ -724,6 +729,16 @@
|
||||
<menuitem name="Reporting" parent="menu_point_root" id="menu_point_rep" sequence="20" groups="group_pos_manager"/>
|
||||
<!-- Invoice -->
|
||||
|
||||
<record model="ir.actions.act_window" id="action_pos_sale_all">
|
||||
<field name="name">All Sales Orders</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">pos.order</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[]</field>
|
||||
</record>
|
||||
<menuitem parent="menu_point_root" id="menu_point_ofsale_all" action="action_pos_sale_all" sequence="1"/>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_pos_invoice">
|
||||
<field name="name">Invoices</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
I check that I have some bank statements open for the admin user
|
||||
-
|
||||
!python {model: account.bank.statement}: |
|
||||
ids = self.search(cr, uid, [('state', '=', 'open'), ('user_id', '=', 1)])
|
||||
assert (len(ids)>0), 'No statement open for the admin user !'
|
||||
ids = self.search(cr, uid, [('state', 'in', ('open','new')), ('user_id', '=', 1)])
|
||||
assert (len(ids)>0), 'No statement open for the admin user!'
|
||||
|
||||
@@ -37,12 +37,9 @@ def get_journal(self, cr, uid, context=None):
|
||||
|
||||
journal_obj = self.pool.get('account.journal')
|
||||
statement_obj = self.pool.get('account.bank.statement')
|
||||
cr.execute("SELECT DISTINCT journal_id FROM pos_journal_users WHERE user_id = %s ORDER BY journal_id", (uid, ))
|
||||
j_ids = map(lambda x1: x1[0], cr.fetchall())
|
||||
ids = journal_obj.search(cr, uid, [('type', '=', 'cash'), ('id', 'in', j_ids)], context=context)
|
||||
obj_ids = statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', 'in', ids)], context=context)
|
||||
res_obj = journal_obj.read(cr, uid, ids, ['journal_id'], context=context)
|
||||
res_obj = [(r1['id']) for r1 in res_obj]
|
||||
|
||||
j_ids = journal_obj.search(cr, uid, [('journal_user','=',1)], context=context)
|
||||
obj_ids = statement_obj.search(cr, uid, [('state', '=', 'open'), ('user_id', '=', uid), ('journal_id', 'in', j_ids)], context=context)
|
||||
res = statement_obj.read(cr, uid, obj_ids, ['journal_id'], context=context)
|
||||
res = [(r['journal_id']) for r in res]
|
||||
res.insert(0, ('', ''))
|
||||
|
||||
@@ -38,27 +38,27 @@ class pos_close_statement(osv.osv_memory):
|
||||
mod_obj = self.pool.get('ir.model.data')
|
||||
statement_obj = self.pool.get('account.bank.statement')
|
||||
journal_obj = self.pool.get('account.journal')
|
||||
cr.execute("SELECT DISTINCT journal_id FROM pos_journal_users "
|
||||
"WHERE user_id=%s ORDER BY journal_id", (uid, ))
|
||||
j_ids = map(lambda x1: x1[0], cr.fetchall())
|
||||
journal_ids = journal_obj.search(cr, uid, [('auto_cash', '=', True), ('type', '=', 'cash'), ('id', 'in', j_ids)], context=context)
|
||||
ids = statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', 'in', journal_ids)], context=context)
|
||||
for journal in journal_obj.browse(cr, uid, journal_ids, context=context):
|
||||
if not ids:
|
||||
raise osv.except_osv(_('Message'), _('Cash registers are already closed.'))
|
||||
else:
|
||||
if not journal.check_dtls:
|
||||
statement_obj.button_confirm_cash(cr, uid, ids, context=context)
|
||||
|
||||
tree_res = mod_obj.get_object_reference(cr, uid, 'account', 'view_bank_statement_tree')
|
||||
j_ids = journal_obj.search(cr, uid, [('journal_user','=',1)], context=context)
|
||||
ids = statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', 'in', j_ids)], context=context)
|
||||
if not ids:
|
||||
raise osv.except_osv(_('Message'), _('Cash registers are already closed.'))
|
||||
for statement in statement_obj.browse(cr, uid, ids, context=context):
|
||||
statement_obj.write(cr, uid, [statement.id], {
|
||||
'balance_end_real': statement.balance_end
|
||||
}, context=context)
|
||||
if not statement.journal_id.check_dtls:
|
||||
statement_obj.button_confirm_cash(cr, uid, [statement.id], context=context)
|
||||
|
||||
tree_res = mod_obj.get_object_reference(cr, uid, 'point_of_sale', 'view_cash_statement_pos_tree')
|
||||
tree_id = tree_res and tree_res[1] or False
|
||||
form_res = mod_obj.get_object_reference(cr, uid, 'account', 'view_bank_statement_form2')
|
||||
form_id = form_res and form_res[1] or False
|
||||
search_id = mod_obj.get_object_reference(cr, uid, 'point_of_sale', 'view_pos_confirm_cash_statement_filter')
|
||||
|
||||
|
||||
return {
|
||||
'domain': "[('id', 'in', " + str(ids) + ")]",
|
||||
'name': 'Close Statements',
|
||||
'name': _('Close Cash Registers'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree, form',
|
||||
'search_view_id': search_id and search_id[1] or False,
|
||||
@@ -66,7 +66,6 @@ class pos_close_statement(osv.osv_memory):
|
||||
'views': [(tree_id, 'tree'), (form_id, 'form')],
|
||||
'type': 'ir.actions.act_window'
|
||||
}
|
||||
|
||||
pos_close_statement()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -42,46 +42,48 @@ class pos_open_statement(osv.osv_memory):
|
||||
journal_obj = self.pool.get('account.journal')
|
||||
if context is None:
|
||||
context = {}
|
||||
company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
|
||||
cr.execute("SELECT DISTINCT journal_id FROM pos_journal_users "
|
||||
"WHERE user_id = %s ORDER BY journal_id"% (uid, ))
|
||||
j_ids = map(lambda x1: x1[0], cr.fetchall())
|
||||
journal_ids = journal_obj.search(cr, uid, [('auto_cash', '=', True), ('type', '=', 'cash'), ('id', 'in', j_ids)], context=context)
|
||||
|
||||
for journal in journal_obj.browse(cr, uid, journal_ids, context=context):
|
||||
st_ids = []
|
||||
j_ids = journal_obj.search(cr, uid, [('journal_user','=',1)], context=context)
|
||||
|
||||
for journal in journal_obj.browse(cr, uid, j_ids, context=context):
|
||||
ids = statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', '=', journal.id)], context=context)
|
||||
if len(ids):
|
||||
st_ids += ids
|
||||
continue
|
||||
|
||||
number = ''
|
||||
if journal.sequence_id:
|
||||
number = sequence_obj.get_id(cr, uid, journal.sequence_id.id)
|
||||
else:
|
||||
number = sequence_obj.get(cr, uid, 'account.cash.statement')
|
||||
|
||||
data.update({'journal_id': journal.id,
|
||||
'company_id': company_id,
|
||||
'user_id': uid,
|
||||
'state': 'draft',
|
||||
'name': number })
|
||||
data.update({
|
||||
'journal_id': journal.id,
|
||||
'user_id': uid,
|
||||
'state': 'draft',
|
||||
'name': number
|
||||
})
|
||||
statement_id = statement_obj.create(cr, uid, data, context=context)
|
||||
statement_obj.button_open(cr, uid, [statement_id], context)
|
||||
st_ids.append(statement_id)
|
||||
|
||||
tree_res = mod_obj.get_object_reference(cr, uid, 'account', 'view_bank_statement_tree')
|
||||
if journal.auto_cash:
|
||||
statement_obj.button_open(cr, uid, [statement_id], context)
|
||||
|
||||
tree_res = mod_obj.get_object_reference(cr, uid, 'point_of_sale', 'view_cash_statement_pos_tree')
|
||||
tree_id = tree_res and tree_res[1] or False
|
||||
form_res = mod_obj.get_object_reference(cr, uid, 'account', 'view_bank_statement_form2')
|
||||
form_id = form_res and form_res[1] or False
|
||||
search_id = mod_obj.get_object_reference(cr, uid, 'point_of_sale', 'view_pos_open_cash_statement_filter')
|
||||
|
||||
return {
|
||||
'domain': "[('state', '=', 'open'),('id', 'in',[ "+','.join(map(str,j_ids))+"])]",
|
||||
'name': 'Open Statement',
|
||||
'domain': "[('id', 'in',[ "+','.join(map(str,st_ids))+"])]",
|
||||
'name': _('Open Cash Registers'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree, form',
|
||||
'search_view_id': search_id and search_id[1] or False ,
|
||||
'res_model': 'account.bank.statement',
|
||||
'views': [(tree_id, 'tree'), (form_id, 'form')],
|
||||
'context': {'search_default_open': 1},
|
||||
'context': {},
|
||||
'type': 'ir.actions.act_window'
|
||||
}
|
||||
pos_open_statement()
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
domain="[('date','<=',(datetime.date.today()+relativedelta(day=31)).strftime('%%Y-%%m-%%d')),('date','>=',(datetime.date.today()-relativedelta(day=1)).strftime('%%Y-%%m-%%d'))]"
|
||||
help="Sales order created in current month"/>
|
||||
<filter icon="terp-go-month"
|
||||
string=" Month-1 "
|
||||
string="Month-1"
|
||||
domain="[('date','<=', (datetime.date.today() - relativedelta(day=31, months=1)).strftime('%%Y-%%m-%%d')),('date','>=',(datetime.date.today() - relativedelta(day=1,months=1)).strftime('%%Y-%%m-%%d'))]"
|
||||
help="Sales order created in last month"/>
|
||||
<separator orientation="vertical"/>
|
||||
|
||||
Reference in New Issue
Block a user