class PayslipLinesContributionRegister(models.TransientModel): _name = 'payslip.lines.contribution.register' _description = 'PaySlip Lines by Contribution Registers' date_from = fields.Date(string='Date From', required=True, default=datetime.now().strftime('%Y-%m-01')) date_to = fields.Date( string='Date To', required=True, default=str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1)) [:10]) @api.multi def print_report(self): active_ids = self.env.context.get('active_ids', []) datas = { 'ids': active_ids, 'model': 'hr.contribution.register', 'form': self.read()[0] } return self.env.ref( 'hr_payroll.action_contribution_register').report_action( [], data=datas)
class WizGst5Report(models.TransientModel): _name = 'wiz.gst5.report' _description = 'GST5 Report' company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.user.company_id) date_from = fields.Date(string="From", required=True) date_to = fields.Date(string="To", required=True) answer1_yes = fields.Boolean(string='Yes', default=False) answer1_no = fields.Boolean(string='No', default=True) answer2_yes = fields.Boolean(string='Yes', default=False) answer2_no = fields.Boolean(string='No', default=True) answer3_yes = fields.Boolean(string='Yes', default=False) answer3_no = fields.Boolean(string='No', default=True) @api.multi def print_report(self): self.ensure_one() [data] = self.read() data['taxes'] = self.env.context.get('active_ids', []) account_taxes = self.env['account.tax'].browse(data['taxes']) data.update({'declaration_of_error': ''}) datas = {'ids': [], 'model': 'account.tax', 'form': data} return self.env.ref('l10n_sg_gst.action_account_gst5_report_id').\ report_action(account_taxes, data=datas)
class Product(models.Model): _inherit = 'product.template' membership = fields.Boolean( help='Check if the product is eligible for membership.') membership_date_from = fields.Date( string='Membership Start Date', help='Date from which membership becomes active.') membership_date_to = fields.Date( string='Membership End Date', help='Date until which membership remains active.') _sql_constraints = [ ('membership_date_greater', 'check(membership_date_to >= membership_date_from)', 'Error ! Ending Date cannot be set before Beginning Date.') ] @api.model def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): if self._context.get('product') == 'membership_product': if view_type == 'form': view_id = self.env.ref( 'membership.membership_products_form').id else: view_id = self.env.ref( 'membership.membership_products_tree').id return super(Product, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
class CrossoveredBudget(models.Model): _name = "crossovered.budget" _description = "Budget" _inherit = ['mail.thread'] name = fields.Char('Budget Name', required=True, states={'done': [('readonly', True)]}) creating_user_id = fields.Many2one('res.users', 'Responsible', default=lambda self: self.env.user) date_from = fields.Date('Start Date', required=True, states={'done': [('readonly', True)]}) date_to = fields.Date('End Date', required=True, states={'done': [('readonly', True)]}) state = fields.Selection([('draft', 'Draft'), ('cancel', 'Cancelled'), ('confirm', 'Confirmed'), ('validate', 'Validated'), ('done', 'Done')], 'Status', default='draft', index=True, required=True, readonly=True, copy=False, track_visibility='always') crossovered_budget_line = fields.One2many( 'crossovered.budget.lines', 'crossovered_budget_id', 'Budget Lines', states={'done': [('readonly', True)]}, copy=True) company_id = fields.Many2one('res.company', 'Company', required=True, default=lambda self: self.env['res.company']. _company_default_get('account.budget.post')) @api.multi def action_budget_confirm(self): self.write({'state': 'confirm'}) @api.multi def action_budget_draft(self): self.write({'state': 'draft'}) @api.multi def action_budget_validate(self): self.write({'state': 'validate'}) @api.multi def action_budget_cancel(self): self.write({'state': 'cancel'}) @api.multi def action_budget_done(self): self.write({'state': 'done'})
class AccountCommonReport(models.TransientModel): _name = "account.common.report" _description = "Account Common Report" _inherit = ['ir.branch.company.mixin'] company_id = fields.Many2one('res.company', string='Company', readonly=True, default=lambda self: self.env.user.company_id) journal_ids = fields.Many2many( 'account.journal', string='Journals', required=True, default=lambda self: self.env['account.journal'].search([])) date_from = fields.Date(string='Start Date') date_to = fields.Date(string='End Date') target_move = fields.Selection([ ('posted', 'All Posted Entries'), ('all', 'All Entries'), ], string='Target Moves', required=True, default='posted') def _build_contexts(self, data): result = {} result['journal_ids'] = 'journal_ids' in data['form'] and data['form'][ 'journal_ids'] or False result['state'] = 'target_move' in data['form'] and data['form'][ 'target_move'] or '' result['date_from'] = data['form']['date_from'] or False result['date_to'] = data['form']['date_to'] or False result['branch_id'] = data['form']['branch_id'] or False result['strict_range'] = True if result['date_from'] else False return result def _print_report(self, data): raise NotImplementedError() @api.multi def check_report(self): self.ensure_one() data = {} data['ids'] = self.env.context.get('active_ids', []) data['model'] = self.env.context.get('active_model', 'ir.ui.menu') data['form'] = self.read([ 'date_from', 'date_to', 'journal_ids', 'target_move', 'branch_id' ])[0] used_context = self._build_contexts(data) data['form']['used_context'] = dict(used_context, lang=self.env.context.get('lang') or 'en_US') return self._print_report(data)
class CrmPartnerReportAssign(models.Model): """ CRM Lead Report """ _name = "crm.partner.report.assign" _auto = False _description = "CRM Partner Report" partner_id = fields.Many2one('res.partner', 'Partner', required=False, readonly=True) grade_id = fields.Many2one('res.partner.grade', 'Grade', readonly=True) activation = fields.Many2one('res.partner.activation', 'Activation', index=True) user_id = fields.Many2one('res.users', 'User', readonly=True) date_review = fields.Date('Latest Partner Review') date_partnership = fields.Date('Partnership Date') country_id = fields.Many2one('res.country', 'Country', readonly=True) team_id = fields.Many2one('crm.team', 'Sales Channel', oldname='section_id', readonly=True) nbr_opportunities = fields.Integer('# of Opportunity', readonly=True, oldname='opp') turnover = fields.Float('Turnover', readonly=True) date = fields.Date('Invoice Account Date', readonly=True) _depends = { 'account.invoice.report': ['date', 'partner_id', 'price_total', 'state', 'type'], 'crm.lead': ['partner_assigned_id'], 'res.partner': ['activation', 'country_id', 'date_partnership', 'date_review', 'grade_id', 'parent_id', 'team_id', 'user_id'], } @api.model_cr def init(self): """ CRM Lead Report @param cr: the current row, from the database cursor """ tools.drop_view_if_exists(self._cr, 'crm_partner_report_assign') self._cr.execute(""" CREATE OR REPLACE VIEW crm_partner_report_assign AS ( SELECT coalesce(i.id, p.id - 1000000000) as id, p.id as partner_id, (SELECT country_id FROM res_partner a WHERE a.parent_id=p.id AND country_id is not null limit 1) as country_id, p.grade_id, p.activation, p.date_review, p.date_partnership, p.user_id, p.team_id, (SELECT count(id) FROM crm_lead WHERE partner_assigned_id=p.id) AS nbr_opportunities, i.price_total as turnover, i.date FROM res_partner p left join account_invoice_report i on (i.partner_id=p.id and i.type in ('out_invoice','out_refund') and i.state in ('open','paid')) )""")
class ProductMargin(models.TransientModel): _name = 'product.margin' _description = 'Product Margin' from_date = fields.Date('From', default=time.strftime('%Y-01-01')) to_date = fields.Date('To', default=time.strftime('%Y-12-31')) invoice_state = fields.Selection([ ('paid', 'Paid'), ('open_paid', 'Open and Paid'), ('draft_open_paid', 'Draft, Open and Paid'), ], 'Invoice State', index=True, required=True, default="open_paid") @api.multi def action_open_window(self): self.ensure_one() context = dict(self.env.context or {}) def ref(module, xml_id): proxy = self.env['ir.model.data'] return proxy.get_object_reference(module, xml_id) model, search_view_id = ref('product', 'product_search_form_view') model, graph_view_id = ref('product_margin', 'view_product_margin_graph') model, form_view_id = ref('product_margin', 'view_product_margin_form') model, tree_view_id = ref('product_margin', 'view_product_margin_tree') context.update(invoice_state=self.invoice_state) if self.from_date: context.update(date_from=self.from_date) if self.to_date: context.update(date_to=self.to_date) views = [ (tree_view_id, 'tree'), (form_view_id, 'form'), (graph_view_id, 'graph') ] return { 'name': _('Product Margins'), 'context': context, 'view_type': 'form', "view_mode": 'tree,form,graph', 'res_model': 'product.product', 'type': 'ir.actions.act_window', 'views': views, 'view_id': False, 'search_view_id': search_view_id, }
class WizGst7Report(models.TransientModel): _name = 'wiz.gst7.report' _description = 'GST7 Report' company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.user.company_id) date_from = fields.Date(string="From", required=True) date_to = fields.Date(string="To", required=True) answer1_yes = fields.Boolean(string='Yes', default=False) answer1_no = fields.Boolean(string='No', default=True) answer2_yes = fields.Boolean(string='Yes', default=False) answer2_no = fields.Boolean(string='No', default=True) answer3_yes = fields.Boolean(string='Yes', default=False) answer3_no = fields.Boolean(string='No', default=True) declaration_of_error = fields.Text(string="Declaration of Errors", size=200) @api.constrains('declaration_of_error') def check_declaration_of_error(self): if len(self.declaration_of_error) > 200: raise ValidationError('Number of characters must on exceed 200') def _check_value(self): pattern = "^[a-z A-Z]*$" for data in self: if re.match(pattern, data.declaration_of_error): return True else: return False if len(self.declaration_of_error) > 200: raise ValidationError(_('Number of characters must on exceed 200')) return {} _constraints = [ (_check_value, 'Please do not enter any symbol in this field".', ['declaration_of_error']), ] @api.multi def print_report(self): self.ensure_one() [data] = self.read() data['taxes'] = self.env.context.get('active_ids', []) account_taxes = self.env['account.tax'].browse(data['taxes']) datas = {'ids': [], 'model': 'account.tax', 'form': data} return self.env.ref( 'l10n_sg_gst.action_account_gst7_report_id').report_action( account_taxes, data=datas)
class HrPayslipRun(models.Model): _name = 'hr.payslip.run' _description = 'Payslip Batches' name = fields.Char(required=True, readonly=True, states={'draft': [('readonly', False)]}) slip_ids = fields.One2many('hr.payslip', 'payslip_run_id', string='Payslips', readonly=True, states={'draft': [('readonly', False)]}) state = fields.Selection([ ('draft', 'Draft'), ('close', 'Close'), ], string='Status', index=True, readonly=True, copy=False, default='draft') date_start = fields.Date(string='Date From', required=True, readonly=True, states={'draft': [('readonly', False)]}, default=time.strftime('%Y-%m-01')) date_end = fields.Date( string='Date To', required=True, readonly=True, states={'draft': [('readonly', False)]}, default=str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1)) [:10]) credit_note = fields.Boolean( string='Credit Note', readonly=True, states={'draft': [('readonly', False)]}, help= "If its checked, indicates that all payslips generated from here are refund payslips." ) @api.multi def draft_payslip_run(self): return self.write({'state': 'draft'}) @api.multi def close_payslip_run(self): return self.write({'state': 'close'})
class HrSalaryEmployeeBymonth(models.TransientModel): _name = 'hr.salary.employee.month' _description = 'Hr Salary Employee By Month Report' def _get_default_category(self): return self.env['hr.salary.rule.category'].search( [('code', '=', 'NET')], limit=1) def _get_default_start_date(self): year = fields.Date.from_string(fields.Date.today()).strftime('%Y') return '{}-01-01'.format(year) def _get_default_end_date(self): date = fields.Date.from_string(fields.Date.today()) return date.strftime('%Y') + '-' + date.strftime( '%m') + '-' + date.strftime('%d') start_date = fields.Date(string='Start Date', required=True, default=_get_default_start_date) end_date = fields.Date(string='End Date', required=True, default=_get_default_end_date) employee_ids = fields.Many2many('hr.employee', 'payroll_year_rel', 'payroll_year_id', 'employee_id', string='Employees', required=True) category_id = fields.Many2one('hr.salary.rule.category', string='Category', required=True, default=_get_default_category) @api.multi def print_report(self): """ To get the date and print the report @return: return report """ self.ensure_one() data = {'ids': self.env.context.get('active_ids', [])} res = self.read() res = res and res[0] or {} data.update({'form': res}) return self.env.ref( 'l10n_in_hr_payroll.action_report_hrsalarybymonth').report_action( self, data=data)
class test_model(models.Model): _name = 'test_converter.test_model' char = fields.Char() integer = fields.Integer() float = fields.Float() numeric = fields.Float(digits=(16, 2)) many2one = fields.Many2one('test_converter.test_model.sub', group_expand='_gbf_m2o') binary = fields.Binary() date = fields.Date() datetime = fields.Datetime() selection = fields.Selection([ (1, "réponse A"), (2, "réponse B"), (3, "réponse C"), (4, "réponse <D>"), ]) selection_str = fields.Selection([ ('A', u"Qu'il n'est pas arrivé à Toronto"), ('B', u"Qu'il était supposé arriver à Toronto"), ('C', u"Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?"), ('D', u"La réponse D"), ], string=u"Lorsqu'un pancake prend l'avion à destination de Toronto et " u"qu'il fait une escale technique à St Claude, on dit:") html = fields.Html() text = fields.Text() # `base` module does not contains any model that implement the functionality # `group_expand`; test this feature here... @api.model def _gbf_m2o(self, subs, domain, order): sub_ids = subs._search([], order=order, access_rights_uid=SUPERUSER_ID) return subs.browse(sub_ids)
class LunchCashMove(models.Model): """ Two types of cashmoves: payment (credit) or order (debit) """ _name = 'lunch.cashmove' _description = 'lunch cashmove' user_id = fields.Many2one('res.users', 'User', default=lambda self: self.env.uid) date = fields.Date('Date', required=True, default=fields.Date.context_today) amount = fields.Float( 'Amount', required=True, help= 'Can be positive (payment) or negative (order or payment if user wants to get his money back)' ) description = fields.Text('Description', help='Can be an order or a payment') order_id = fields.Many2one('lunch.order.line', 'Order', ondelete='cascade') state = fields.Selection([('order', 'Order'), ('payment', 'Payment')], 'Is an order or a payment', default='payment') @api.multi def name_get(self): return [(cashmove.id, '%s %s' % (_('Lunch Cashmove'), '#%d' % cashmove.id)) for cashmove in self]
class AccountMoveReversal(models.TransientModel): """ Account move reversal wizard, it cancel an account move by reversing it. """ _name = 'account.move.reversal' _description = 'Account move reversal' date = fields.Date(string='Reversal date', default=fields.Date.context_today, required=True) journal_id = fields.Many2one( 'account.journal', string='Use Specific Journal', help='If empty, uses the journal of the journal entry to be reversed.') @api.multi def reverse_moves(self): ac_move_ids = self._context.get('active_ids', False) res = self.env['account.move'].browse(ac_move_ids).reverse_moves( self.date, self.journal_id or False) if res: return { 'name': _('Reverse Moves'), 'type': 'ir.actions.act_window', 'view_type': 'form', 'view_mode': 'tree,form', 'res_model': 'account.move', 'domain': [('id', 'in', res)], } return {'type': 'ir.actions.act_window_close'}
class ConverterTest(models.Model): _name = 'web_editor.converter.test' # disable translation export for those brilliant field labels and values _translate = False char = fields.Char() integer = fields.Integer() float = fields.Float() numeric = fields.Float(digits=(16, 2)) many2one = fields.Many2one('web_editor.converter.test.sub') binary = fields.Binary() date = fields.Date() datetime = fields.Datetime() selection = fields.Selection([ (1, "réponse A"), (2, "réponse B"), (3, "réponse C"), (4, "réponse <D>"), ]) selection_str = fields.Selection( [ ('A', "Qu'il n'est pas arrivé à Toronto"), ('B', "Qu'il était supposé arriver à Toronto"), ('C', "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?"), ('D', "La réponse D"), ], string=u"Lorsqu'un pancake prend l'avion à destination de Toronto et " u"qu'il fait une escale technique à St Claude, on dit:") html = fields.Html() text = fields.Text()
class FleetVehicleOdometer(models.Model): _name = 'fleet.vehicle.odometer' _description = 'Odometer log for a vehicle' _order = 'date desc' name = fields.Char(compute='_compute_vehicle_log_name', store=True) date = fields.Date(default=fields.Date.context_today) value = fields.Float('Odometer Value', group_operator="max") vehicle_id = fields.Many2one('fleet.vehicle', 'Vehicle', required=True) unit = fields.Selection(related='vehicle_id.odometer_unit', string="Unit", readonly=True) driver_id = fields.Many2one(related="vehicle_id.driver_id", string="Driver") @api.depends('vehicle_id', 'date') def _compute_vehicle_log_name(self): for record in self: name = record.vehicle_id.name if not name: name = record.date elif record.date: name += ' / ' + record.date record.name = name @api.onchange('vehicle_id') def _onchange_vehicle(self): if self.vehicle_id: self.unit = self.vehicle_id.odometer_unit
class MixedModel(models.Model): _name = 'test_new_api.mixed' number = fields.Float(digits=(10, 2), default=3.14) date = fields.Date() now = fields.Datetime(compute='_compute_now') lang = fields.Selection(string='Language', selection='_get_lang') reference = fields.Reference(string='Related Document', selection='_reference_models') comment1 = fields.Html(sanitize=False) comment2 = fields.Html(sanitize_attributes=True, strip_classes=False) comment3 = fields.Html(sanitize_attributes=True, strip_classes=True) comment4 = fields.Html(sanitize_attributes=True, strip_style=True) currency_id = fields.Many2one( 'res.currency', default=lambda self: self.env.ref('base.EUR')) amount = fields.Monetary() @api.one def _compute_now(self): # this is a non-stored computed field without dependencies self.now = fields.Datetime.now() @api.model def _get_lang(self): return self.env['res.lang'].get_installed() @api.model def _reference_models(self): models = self.env['ir.model'].sudo().search([('state', '!=', 'manual') ]) return [(model.model, model.name) for model in models if not model.model.startswith('ir.')]
class MrpProductionMessage(models.Model): _name = "mrp.message" _description = "Production Message" @api.model def _default_valid_until(self): return datetime.today() + relativedelta(days=7) name = fields.Text(compute='_get_note_first_line', store=True) message = fields.Html(required=True) product_tmpl_id = fields.Many2one('product.template', 'Product Template') product_id = fields.Many2one('product.product', string="Product") bom_id = fields.Many2one('mrp.bom', 'Bill of Material', domain="['|', ('product_id', '=', product_id), ('product_tmpl_id.product_variant_ids','=', product_id)]") workcenter_id = fields.Many2one('mrp.workcenter', string='Work Center') valid_until = fields.Date('Validity Date', default=_default_valid_until, required=True) routing_id = fields.Many2one('mrp.routing', string='Routing') @api.depends('message') def _get_note_first_line(self): for message in self: message.name = (message.message and html2plaintext(message.message) or "").strip().replace('*', '').split("\n")[0] @api.multi def save(self): """ Used in a wizard-like form view, manual save button when in edit mode """ return True
class HolidaysSummaryEmployee(models.TransientModel): _name = 'hr.holidays.summary.employee' _description = 'HR Leaves Summary Report By Employee' date_from = fields.Date(string='From', required=True, default=lambda *a: time.strftime('%Y-%m-01')) emp = fields.Many2many('hr.employee', 'summary_emp_rel', 'sum_id', 'emp_id', string='Employee(s)') holiday_type = fields.Selection([('Approved', 'Approved'), ('Confirmed', 'Confirmed'), ('both', 'Both Approved and Confirmed')], string='Select Leave Type', required=True, default='Approved') @api.multi def print_report(self): self.ensure_one() [data] = self.read() data['emp'] = self.env.context.get('active_ids', []) employees = self.env['hr.employee'].browse(data['emp']) datas = {'ids': [], 'model': 'hr.employee', 'form': data} return self.env.ref( 'hr_holidays.action_report_holidayssummary').report_action( employees, data=datas)
class ResPartner(models.Model): _inherit = "res.partner" partner_latitude = fields.Float(string='Geo Latitude', digits=(16, 5)) partner_longitude = fields.Float(string='Geo Longitude', digits=(16, 5)) date_localization = fields.Date(string='Geolocation Date') @api.multi def geo_localize(self): # We need country names in English below for partner in self.with_context(lang='en_US'): result = geo_find( geo_query_address(street=partner.street, zip=partner.zip, city=partner.city, state=partner.state_id.name, country=partner.country_id.name)) if result is None: result = geo_find( geo_query_address(city=partner.city, state=partner.state_id.name, country=partner.country_id.name)) if result: partner.write({ 'partner_latitude': result[0], 'partner_longitude': result[1], 'date_localization': fields.Date.context_today(partner) }) return True
class SupplierInfo(models.Model): _name = "product.supplierinfo" _description = "Information about a product vendor" _order = 'sequence, min_qty desc, price' name = fields.Many2one( 'res.partner', 'Vendor', domain=[('supplier', '=', True)], ondelete='cascade', required=True, help="Vendor of this product") product_name = fields.Char( 'Vendor Product Name', help="This vendor's product name will be used when printing a request for quotation. Keep empty to use the internal one.") product_code = fields.Char( 'Vendor Product Code', help="This vendor's product code will be used when printing a request for quotation. Keep empty to use the internal one.") sequence = fields.Integer( 'Sequence', default=1, help="Assigns the priority to the list of product vendor.") product_uom = fields.Many2one( 'product.uom', 'Vendor Unit of Measure', readonly="1", related='product_tmpl_id.uom_po_id', help="This comes from the product form.") min_qty = fields.Float( 'Minimal Quantity', default=0.0, required=True, help="The minimal quantity to purchase from this vendor, expressed in the vendor Product Unit of Measure if not any, in the default unit of measure of the product otherwise.") price = fields.Float( 'Price', default=0.0, digits=dp.get_precision('Product Price'), required=True, help="The price to purchase a product") company_id = fields.Many2one( 'res.company', 'Company', default=lambda self: self.env.user.company_id.id, index=1) currency_id = fields.Many2one( 'res.currency', 'Currency', default=lambda self: self.env.user.company_id.currency_id.id, required=True) date_start = fields.Date('Start Date', help="Start date for this vendor price") date_end = fields.Date('End Date', help="End date for this vendor price") product_id = fields.Many2one( 'product.product', 'Product Variant', help="If not set, the vendor price will apply to all variants of this products.") product_tmpl_id = fields.Many2one( 'product.template', 'Product Template', index=True, ondelete='cascade', oldname='product_id') product_variant_count = fields.Integer('Variant Count', related='product_tmpl_id.product_variant_count') delay = fields.Integer( 'Delivery Lead Time', default=1, required=True, help="Lead time in days between the confirmation of the purchase order and the receipt of the products in your warehouse. Used by the scheduler for automatic computation of the purchase order planning.")
class OpeningAccountMoveWizard(models.TransientModel): _name = 'account.opening' company_id = fields.Many2one(comodel_name='res.company', required=True) opening_move_id = fields.Many2one( string='Opening Journal Entry', comodel_name='account.move', related='company_id.account_opening_move_id') currency_id = fields.Many2one(comodel_name='res.currency', related='opening_move_id.currency_id') opening_move_line_ids = fields.One2many(string='Opening Journal Items', related="opening_move_id.line_ids") journal_id = fields.Many2one(string='Journal', comodel_name='account.journal', required=True, related='opening_move_id.journal_id') date = fields.Date(string='Opening Date', required=True, related='opening_move_id.date') def validate(self): self.opening_move_id.post() @api.onchange('opening_move_line_ids') def opening_move_line_ids_changed(self): debit_diff, credit_diff = self.company_id.get_opening_move_differences( self.opening_move_line_ids) unaffected_earnings_account = self.company_id.get_unaffected_earnings_account( ) balancing_line = self.opening_move_line_ids.filtered( lambda x: x.account_id == unaffected_earnings_account) if balancing_line: if not self.opening_move_line_ids == balancing_line and ( debit_diff or credit_diff): balancing_line.debit = credit_diff balancing_line.credit = debit_diff else: self.opening_move_line_ids -= balancing_line elif debit_diff or credit_diff: balancing_line = self.env['account.move.line'].new({ 'name': _('Automatic Balancing Line'), 'move_id': self.company_id.account_opening_move_id.id, 'account_id': unaffected_earnings_account.id, 'debit': credit_diff, 'credit': debit_diff, 'company_id': self.company_id, }) self.opening_move_line_ids += balancing_line
class WarrantyExpireLine(models.Model): _name = "warranty.expire.line" _description = "Warranty Expire Lines" rma_id = fields.Many2one('rma.request', string='RMA Request Number') product_id = fields.Many2one('product.product', string='Product') lot_id = fields.Many2one('stock.production.lot', string='Stock production lot') qty_expired = fields.Float(string="Expired Quantity") warranty_date = fields.Date('Lot Warranty Date')
class ResourceCalendarAttendance(models.Model): _name = "resource.calendar.attendance" _description = "Work Detail" _order = 'dayofweek, hour_from' name = fields.Char(required=True) dayofweek = fields.Selection([ ('0', 'Monday'), ('1', 'Tuesday'), ('2', 'Wednesday'), ('3', 'Thursday'), ('4', 'Friday'), ('5', 'Saturday'), ('6', 'Sunday') ], 'Day of Week', required=True, index=True, default='0') date_from = fields.Date(string='Starting Date') date_to = fields.Date(string='End Date') hour_from = fields.Float(string='Work from', required=True, index=True, help="Start and End time of working.") hour_to = fields.Float(string='Work to', required=True) calendar_id = fields.Many2one("resource.calendar", string="Resource's Calendar", required=True, ondelete='cascade')
class WizGstAnalysis(models.TransientModel): _name = 'wiz.gst.analysis' _description = 'GST Analysis' company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.user.company_id) date_from = fields.Date(string="From", required=True) date_to = fields.Date(string="To", required=True) @api.multi def print_report(self): datas = {'ids': self.env.context.get('active_ids', [])} res = self.read(['company_id', 'date_from', 'date_to']) res = res and res[0] or {} datas['form'] = res return self.env.ref( 'l10n_sg_gst.action_account_gst_analysis').report_action( [], data=datas)
class YearlySalaryDetail(models.TransientModel): _name = 'yearly.salary.detail' _description = 'Hr Salary Employee By Category Report' def _get_default_date_from(self): year = fields.Date.from_string(fields.Date.today()).strftime('%Y') return '{}-01-01'.format(year) def _get_default_date_to(self): date = fields.Date.from_string(fields.Date.today()) return date.strftime('%Y') + '-' + date.strftime( '%m') + '-' + date.strftime('%d') employee_ids = fields.Many2many('hr.employee', 'payroll_emp_rel', 'payroll_id', 'employee_id', string='Employees', required=True) date_from = fields.Date(string='Start Date', required=True, default=_get_default_date_from) date_to = fields.Date(string='End Date', required=True, default=_get_default_date_to) @api.multi def print_report(self): """ To get the date and print the report @return: return report """ self.ensure_one() data = {'ids': self.env.context.get('active_ids', [])} res = self.read() res = res and res[0] or {} data.update({'form': res}) return self.env.ref( 'l10n_in_hr_payroll.action_report_hryearlysalary').report_action( self, data=data)
class CompanyB2CLimit(models.Model): _name = 'res.company.b2c.limit' date_from = fields.Date(string='From') date_to = fields.Date(string='To') b2cl_limit = fields.Float(string='B2CL Limit', default=250000.0, help='Inter state minimum limit for B2CL type ' 'transactions.') b2cs_limit = fields.Float(string='B2CS Limit', default=250000.0, help='Inter state maximum limit for B2CS type ' 'transactions.') company_id = fields.Many2one('res.company', string='Company') @api.constrains('date_to', 'date_from', 'company_id') def _check_sheet_date(self): for line in self: self.env.cr.execute( ''' SELECT id FROM res_company_b2c_limit WHERE (date_from <= %s and %s <= date_to) AND company_id=%s AND id <> %s''', (line.date_to, line.date_from, line.company_id.id, line.id)) if any(self.env.cr.fetchall()): raise ValidationError( _('You cannot have 2 limit lines of same period that ' 'overlap for %s!') % (line.company_id and line.company_id.name)) @api.constrains('date_from', 'date_to') def _check_dates(self): if any( self.filtered(lambda line: line.date_from and line.date_to and line.date_from > line.date_to)): raise ValidationError(_('From date must be lower than to date.'))
class AccountAssetCategory(models.Model): _name = 'account.asset.category' _description = 'Asset category' active = fields.Boolean(default=True) name = fields.Char(required=True, index=True, string="Asset Type") account_analytic_id = fields.Many2one('account.analytic.account', string='Analytic Account') account_asset_id = fields.Many2one('account.account', string='Asset Account', required=True, domain=[('internal_type','=','other'), ('deprecated', '=', False)], help="Account used to record the purchase of the asset at its original price.") account_depreciation_id = fields.Many2one('account.account', string='Depreciation Entries: Asset Account', required=True, domain=[('internal_type','=','other'), ('deprecated', '=', False)], help="Account used in the depreciation entries, to decrease the asset value.") account_depreciation_expense_id = fields.Many2one('account.account', string='Depreciation Entries: Expense Account', required=True, domain=[('internal_type','=','other'), ('deprecated', '=', False)], oldname='account_income_recognition_id', help="Account used in the periodical entries, to record a part of the asset as expense.") journal_id = fields.Many2one('account.journal', string='Journal', required=True) company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env['res.company']._company_default_get('account.asset.category')) method = fields.Selection([('linear', 'Linear'), ('degressive', 'Degressive')], string='Computation Method', required=True, default='linear', help="Choose the method to use to compute the amount of depreciation lines.\n" " * Linear: Calculated on basis of: Gross Value / Number of Depreciations\n" " * Degressive: Calculated on basis of: Residual Value * Degressive Factor") method_number = fields.Integer(string='Number of Depreciations', default=5, help="The number of depreciations needed to depreciate your asset") method_period = fields.Integer(string='Period Length', default=1, help="State here the time between 2 depreciations, in months", required=True) method_progress_factor = fields.Float('Degressive Factor', default=0.3) method_time = fields.Selection([('number', 'Number of Entries'), ('end', 'Ending Date')], string='Time Method', required=True, default='number', help="Choose the method to use to compute the dates and number of entries.\n" " * Number of Entries: Fix the number of entries and the time between 2 depreciations.\n" " * Ending Date: Choose the time between 2 depreciations and the date the depreciations won't go beyond.") method_end = fields.Date('Ending date') prorata = fields.Boolean(string='Prorata Temporis', help='Indicates that the first depreciation entry for this asset have to be done from the purchase date instead of the first of January') open_asset = fields.Boolean(string='Auto-confirm Assets', help="Check this if you want to automatically confirm the assets of this category when created by invoices.") group_entries = fields.Boolean(string='Group Journal Entries', help="Check this if you want to group the generated entries by categories.") type = fields.Selection([('sale', 'Sale: Revenue Recognition'), ('purchase', 'Purchase: Asset')], required=True, index=True, default='purchase') @api.onchange('account_asset_id') def onchange_account_asset(self): if self.type == "purchase": self.account_depreciation_id = self.account_asset_id elif self.type == "sale": self.account_depreciation_expense_id = self.account_asset_id @api.onchange('type') def onchange_type(self): if self.type == 'sale': self.prorata = True self.method_period = 1 else: self.method_period = 12 @api.onchange('method_time') def _onchange_method_time(self): if self.method_time != 'number': self.prorata = False
class CurrencyRate(models.Model): _name = "res.currency.rate" _description = "Currency Rate" _order = "name desc" name = fields.Date(string='Date', required=True, index=True, default=lambda self: fields.Date.today()) rate = fields.Float( digits=(12, 6), help='The rate of the currency to the currency of rate 1') currency_id = fields.Many2one('res.currency', string='Currency', readonly=True) company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.user.company_id) _sql_constraints = [ ('unique_name_per_day', 'unique (name,currency_id,company_id)', 'Only one currency rate per day allowed!'), ] @api.model def name_search(self, name, args=None, operator='ilike', limit=80): if operator in ['=', '!=']: try: date_format = '%Y-%m-%d' if self._context.get('lang'): langs = self.env['res.lang'].search([ ('code', '=', self._context['lang']) ]) if langs: date_format = langs.date_format name = time.strftime('%Y-%m-%d', time.strptime(name, date_format)) except ValueError: try: args.append(('rate', operator, float(name))) except ValueError: return [] name = '' operator = 'ilike' return super(CurrencyRate, self).name_search(name, args=args, operator=operator, limit=limit)
class link_tracker_click(models.Model): _name = "link.tracker.click" _rec_name = "link_id" click_date = fields.Date(string='Create Date') link_id = fields.Many2one('link.tracker', 'Link', required=True, ondelete='cascade') ip = fields.Char(string='Internet Protocol') country_id = fields.Many2one('res.country', 'Country') @api.model def add_click(self, code, ip, country_code, stat_id=False): self = self.sudo() code_rec = self.env['link.tracker.code'].search([('code', '=', code)]) if not code_rec: return None again = self.search_count([('link_id', '=', code_rec.link_id.id), ('ip', '=', ip)]) if not again: self.create( self._get_click_values_from_route( dict( code=code, ip=ip, country_code=country_code, stat_id=stat_id, ))) def _get_click_values_from_route(self, route_values): code = self.env['link.tracker.code'].search( [('code', '=', route_values['code'])], limit=1) country = self.env['res.country'].search( [('code', '=', route_values['country_code'])], limit=1) return { 'link_id': code.link_id.id, 'create_date': datetime.date.today(), 'ip': route_values['ip'], 'country_id': country.id, }
class AccountAnalyticLine(models.Model): _name = 'account.analytic.line' _description = 'Analytic Line' _order = 'date desc, id desc' @api.model def _default_user(self): return self.env.context.get('user_id', self.env.user.id) name = fields.Char('Description', required=True) date = fields.Date('Date', required=True, index=True, default=fields.Date.context_today) amount = fields.Monetary('Amount', required=True, default=0.0) unit_amount = fields.Float('Quantity', default=0.0) account_id = fields.Many2one('account.analytic.account', 'Analytic Account', required=True, ondelete='restrict', index=True) partner_id = fields.Many2one('res.partner', string='Partner') user_id = fields.Many2one('res.users', string='User', default=_default_user) tag_ids = fields.Many2many('account.analytic.tag', 'account_analytic_line_tag_rel', 'line_id', 'tag_id', string='Tags', copy=True) company_id = fields.Many2one(related='account_id.company_id', string='Company', store=True, readonly=True) branch_id = fields.Many2one(related='account_id.branch_id', string='Branch', store=True, readonly=True) currency_id = fields.Many2one(related="company_id.currency_id", string="Currency", readonly=True)