# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import logging import time from datetime import datetime, timedelta from odoo import api, models, Command from odoo.exceptions import UserError, ValidationError from odoo.tools.misc import file_open _logger = logging.getLogger(__name__) class AccountChartTemplate(models.AbstractModel): _inherit = "account.chart.template" @api.model def _get_demo_data(self, company=False): demo_data = {} if company.account_fiscal_country_id.code == "IN": if company.state_id: demo_data = { 'res.partner.category': self._get_demo_data_res_partner_category(company), 'res.partner': self._get_demo_data_partner(company), 'account.move': self._get_demo_data_move(company), 'res.config.settings': self._get_demo_data_config_settings(company), 'ir.attachment': self._get_demo_data_attachment(company), 'mail.message': self._get_demo_data_mail_message(company), } else: _logger.warning('Error while loading Indian-Accounting demo data in the company "%s".State is not set in the company.', company.name) else: demo_data = super()._get_demo_data(company) return demo_data @api.model def _get_demo_data_config_settings(self, company=False): return{ 'sales_credit_limit':{ 'account_use_credit_limit': True, 'account_default_credit_limit': '10000' } } @api.model def _get_demo_data_res_partner_category(self, company=False): return{ 'res_partner_category_registered': { 'name': 'Registered', 'color': 2, }, 'res_partner_category_unregistered': { 'name': 'Unregistered', 'color': 3, }, } @api.model def _get_demo_data_partner(self, company=False): cid = company.id or self.env.company.id intra_state_id = company.state_id inter_state_id = self.env['res.country.state'].search([ ('id', 'not in', intra_state_id.ids), ('country_id', '=', intra_state_id.country_id.id) ], order='name DESC', limit=1) default_partner_dict = {'city': 'City', 'zip': '000000', 'country_id': 'base.in', 'is_company': True} return{ 'res_partner_registered_customer': { **default_partner_dict, 'name': 'B2B Customer Inter State', 'category_id': 'res_partner_category_registered', 'l10n_in_gst_treatment': 'regular', 'street': '201, Second Floor, IT Tower 4', 'street2': 'InfoCity Gate - 1, Infocity', 'state_id': inter_state_id.id, 'company_id': cid, 'vat': '%sAABCT1332L2ZD'%(inter_state_id.l10n_in_tin), }, 'res_partner_registered_customer_intra_state': { **default_partner_dict, 'name': 'B2B Customer Intra State', 'category_id': 'res_partner_category_registered', 'l10n_in_gst_treatment': 'regular', 'street': 'floor-1, Maddikunta-Ankanpally Village', 'street2': 'Post box No 2, NH-65', 'state_id': intra_state_id.id, 'company_id': cid, 'vat': '%sAAACM4154G1ZO'%(intra_state_id.l10n_in_tin), }, 'res_partner_unregistered_customer':{ **default_partner_dict, 'name': 'B2C Customer Inter State', 'category_id': 'res_partner_category_unregistered', 'l10n_in_gst_treatment': 'unregistered', 'street': 'B105, yogeshwar Tower', 'state_id': inter_state_id.id, 'company_id': cid, }, 'res_partner_unregistered_customer_intra_state':{ **default_partner_dict, 'name': 'B2C Customer Intra State', 'category_id': 'res_partner_category_unregistered', 'l10n_in_gst_treatment': 'unregistered', 'street': '80, Sarojini Devi Road', 'state_id': intra_state_id.id, 'company_id': cid, }, 'res_partner_registered_supplier_1': { **default_partner_dict, 'name': 'Supplier', 'category_id': 'res_partner_category_registered', 'l10n_in_gst_treatment': 'regular', 'street': '19, Ground Floor', 'street2': 'Survey Road,Vadipatti', 'state_id': inter_state_id.id, 'company_id': cid, 'vat': '%sAACCT6304M1DB'%(inter_state_id.l10n_in_tin), }, 'res_partner_registered_supplier_2': { **default_partner_dict, 'name': 'Odoo In Private Limited', 'category_id': 'res_partner_category_registered', 'l10n_in_gst_treatment': 'regular', 'street': '201, Second Floor, IT Tower 4', 'street2': 'InfoCity Gate - 1, Infocity', 'state_id': inter_state_id.id, 'company_id': cid, 'vat': '%sAACCT6304M1ZB'%(inter_state_id.l10n_in_tin), }, 'res_partner_overseas': { 'name': 'Supplier Overseas', 'l10n_in_gst_treatment': 'overseas', 'street': '142 Street, Rigas building', 'street2': 'Survey Road,', 'city': 'City', 'zip': '000000', 'state_id': 'base.state_us_5', 'country_id': 'base.us', 'is_company': True, 'company_id': cid, }, } @api.model def _get_demo_data_move(self, company=False): cid = company.id or self.env.company.id def _get_tax_by_id(tax_id): tax = self.env.ref('account.%s_%s'%((cid), (tax_id))) return tax.id if company.account_fiscal_country_id.code == "IN": sale_journal = self.env['account.journal'].search( domain=[ *self.env['account.journal']._check_company_domain(cid), ('type', '=', 'sale'), ], limit=1) return { # Demo of B2B (business-to-business) Taxable supplies made to other registered person. 'demo_invoice_b2b_1': { 'move_type': 'out_invoice', 'partner_id': 'res_partner_registered_customer', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'regular', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.product_product_8', 'quantity': 2, 'price_unit': 40000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_28')])], }), Command.create({ 'product_id': 'product.product_product_9', 'quantity': 3, 'price_unit': 400.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_28'), _get_tax_by_id('cess_5_plus_1591_sale')])], }), Command.create({ 'product_id': 'product.product_product_10', 'quantity': 4, 'price_unit': 300.0, 'tax_ids':[Command.set([_get_tax_by_id('igst_sale_18')])], }), ], }, 'demo_invoice_b2b_2': { 'move_type': 'out_invoice', 'partner_id': 'res_partner_registered_customer_intra_state', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'regular', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.product_product_9', 'quantity': 2, 'price_unit': 4000.0, 'tax_ids': [Command.set([_get_tax_by_id('sgst_sale_5')])], }), Command.create({ 'product_id': 'product.product_product_10', 'quantity': 3, 'price_unit': 300.0, 'tax_ids': [Command.set([_get_tax_by_id('sgst_sale_5')])], }), ], }, 'demo_bill_b2b_1': { 'ref': 'INV/001', 'move_type': 'in_invoice', 'partner_id': 'res_partner_registered_supplier_2', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 1, 'price_unit': 1000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), Command.create({ 'product_id': 'product.consu_delivery_03', 'quantity': 1, 'price_unit': 2000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), ] }, 'demo_bill_b2b_2': { 'ref': 'INV/002', 'move_type': 'in_invoice', 'partner_id': 'res_partner_registered_supplier_2', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 4, 'price_unit': 1000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), Command.create({ 'product_id': 'product.consu_delivery_03', 'quantity': 3, 'price_unit': 2000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), ] }, 'demo_bill_b2b_3': { 'ref': 'INV/003', 'move_type': 'in_invoice', 'partner_id': 'res_partner_registered_supplier_1', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 2, 'price_unit': 1000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), Command.create({ 'product_id': 'product.consu_delivery_03', 'quantity': 3, 'price_unit': 2000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), ] }, 'demo_invoice_to_extract': { 'move_type': 'in_invoice', 'message_main_attachment_id': 'ir_attachment_in_invoice_1', }, 'demo_invoice_service': { 'ref': 'MYS-91021146', 'move_type': 'in_invoice', 'partner_id': 'res_partner_registered_supplier_2', 'invoice_user_id': False, 'invoice_date': datetime.now(), 'invoice_line_ids': [ Command.create({ 'name': 'Integrated Managed Infrastructure Service', 'quantity': 1, 'price_unit': 69132.78, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), ], 'message_main_attachment_id': 'ir_attachment_in_invoice_2', }, # Demo of IMP(Import) of supplies. 'demo_bill_imp': { 'ref': 'BOE/123', 'move_type': 'in_invoice', 'partner_id': 'res_partner_overseas', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'invoice_line_ids': [ Command.create({ 'product_id': 'product.product_product_4', 'quantity': 30, 'price_unit': 9000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), ] }, # Demo of cdnr(Credit/ Debit Note for registered business). Create credit note for demo b2b bill. 'demo_bill_cdnr_1': { 'ref': 'CR/001', 'move_type': 'in_refund', 'partner_id': 'res_partner_registered_supplier_2', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now() - timedelta(days=1), 'l10n_in_gst_treatment': 'regular', 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 1, 'price_unit': 1000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), Command.create({ 'product_id': 'product.consu_delivery_03', 'quantity': 1, 'price_unit': 2000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), ] }, 'demo_bill_cdnr_2': { 'ref': '000072', 'move_type': 'in_refund', 'partner_id': 'res_partner_registered_supplier_1', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'regular', 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 1, 'price_unit': 1000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_purchase_18')])], }), ] }, # Demo of B2CS (business to consumer small) Taxable supplies made to other unregistered Person and below INR 2.5 lakhs invoice value. 'demo_invoice_b2cs': { 'move_type': 'out_invoice', 'partner_id': 'res_partner_unregistered_customer_intra_state', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'consumer', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.product_product_16', 'quantity': 1, 'price_unit': 1500.0, 'tax_ids': [Command.set([_get_tax_by_id('sgst_sale_18')])], }), Command.create({ 'product_id': 'product.product_product_20', 'quantity': 1, 'price_unit': 2300.0, 'tax_ids': [Command.set([_get_tax_by_id('sgst_sale_18')])], }), Command.create({ 'product_id': 'product.product_product_22', 'quantity': 1, 'price_unit': 2600.0, 'tax_ids': [Command.set([_get_tax_by_id('sgst_sale_18')])], }), Command.create({ 'product_id': 'product.product_product_24', 'quantity': 2, 'price_unit': 1655.0, 'tax_ids': [Command.set([_get_tax_by_id('sgst_sale_5')])], }), ] }, # Demo of B2CL (business to consumer - Large) Taxable supplies made to other unregistered Person and invoice value is more than INR 2.5 lakhs. 'demo_invoice_b2cl': { 'move_type': 'out_invoice', 'partner_id': 'res_partner_unregistered_customer', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'consumer', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 3, 'price_unit': 90000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_18')])], }), ] }, # Demo of EXP(Export) supplies including supplies to SEZ/SEZ Developer or deemed exports. 'demo_invoice_exp': { 'move_type': 'out_invoice', 'partner_id': 'base.res_partner_3', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'overseas', 'l10n_in_shipping_bill_number': '999704', 'l10n_in_shipping_bill_date': time.strftime('%Y-%m-02'), 'l10n_in_shipping_port_code_id': 'l10n_in.port_code_inixy1', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.product_product_4', 'quantity': 30, 'price_unit': 8000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_18_sez_exp')])], }), ] }, # Demo of exempt(Nil Rated, Exempted and Non GST supplies). Set Nill rated and Exempted tax in line. 'demo_invoice_nill': { 'move_type': 'out_invoice', 'partner_id': 'res_partner_registered_customer', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'regular', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.product_product_1', 'quantity': 2, 'price_unit': 25000.0, 'tax_ids': [Command.set([_get_tax_by_id('exempt_sale')])], }), Command.create({ 'product_id': 'product.product_product_5', 'quantity': 1, 'price_unit': 400.0, 'tax_ids': [Command.set([_get_tax_by_id('nil_rated_sale')])], }), ] }, # Demo of cdnr(Credit/ Debit Note for registered person). Create credit note for demo b2b invoice. 'demo_invoice_cdnr_1': { 'move_type': 'out_refund', 'partner_id': 'res_partner_registered_customer', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'regular', 'reversed_entry_id': 'demo_invoice_b2b_1', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.product_product_8', 'quantity': 2, 'price_unit': 40000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_28')])], }), Command.create({ 'product_id': 'product.product_product_9', 'quantity': 3, 'price_unit': 400.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_28'), _get_tax_by_id('cess_5_plus_1591_sale')])], }), Command.create({ 'product_id': 'product.product_product_10', 'quantity': 4, 'price_unit': 300.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_18')])], }), ] }, 'demo_invoice_cdnr_2': { 'move_type': 'out_refund', 'partner_id': 'res_partner_registered_customer', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'regular', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 1, 'price_unit': 1000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_18')])], }), Command.create({ 'product_id': 'product.consu_delivery_03', 'quantity': 1, 'price_unit': 2000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_18')])], }), ] }, # Demo of cdnr(Credit/ Debit Note for unregistered person). Create credit note for demo b2cl invoice. 'demo_invoice_cdnur': { 'move_type': 'out_refund', 'partner_id': 'res_partner_unregistered_customer', 'invoice_user_id': 'base.user_demo', 'invoice_payment_term_id': 'account.account_payment_term_end_following_month', 'invoice_date': datetime.now(), 'l10n_in_gst_treatment': 'consumer', 'reversed_entry_id': 'demo_invoice_b2cl', 'journal_id': sale_journal.id, 'invoice_line_ids': [ Command.create({ 'product_id': 'product.consu_delivery_01', 'quantity': 3, 'price_unit': 90000.0, 'tax_ids': [Command.set([_get_tax_by_id('igst_sale_18')])], }), ] }, } else: return super()._get_demo_data_move(company) @api.model def _get_demo_data_attachment(self, company=False): if company.account_fiscal_country_id.code == "IN": return{ 'ir_attachment_in_invoice_1': { 'type': 'binary', 'name': 'in_invoice_demo_1.pdf', 'res_model': 'account.move', 'res_id': 'demo_invoice_to_extract', 'raw': file_open( 'l10n_in/static/demo/in_invoice_demo_1.pdf', 'rb' ).read() }, 'ir_attachment_in_invoice_2': { 'type': 'binary', 'name': 'in_invoice_demo_2.pdf', 'res_model': 'account.move', 'res_id': 'demo_invoice_service', 'raw': file_open( 'l10n_in/static/demo/in_invoice_demo_2.pdf', 'rb' ).read() } } else: return super()._get_demo_data_attachment(company) @api.model def _get_demo_data_mail_message(self, company=False): if company.account_fiscal_country_id.code == "IN": return { 'mail_message_in_invoice_1': { 'model': 'account.move', 'res_id': 'demo_invoice_to_extract', 'body': 'Vendor Bill attachment', 'message_type': 'comment', 'author_id': 'base.partner_demo', 'attachment_ids': [Command.set([ 'ir_attachment_in_invoice_1', ])] }, 'mail_message_in_invoice_2': { 'model': 'account.move', 'res_id': 'demo_invoice_service', 'body': 'Vendor Bill attachment', 'message_type': 'comment', 'author_id': 'base.partner_demo', 'attachment_ids': [Command.set([ 'ir_attachment_in_invoice_2', ])] }, } else: return super()._get_demo_data_mail_message(company) def _post_load_demo_data(self, company=False): if company.account_fiscal_country_id.code == "IN": if company.state_id: invoices = ( self.ref('demo_invoice_b2b_1') + self.ref('demo_invoice_b2b_2') + self.ref('demo_invoice_b2cs') + self.ref('demo_invoice_b2cl') + self.ref('demo_invoice_exp') + self.ref('demo_invoice_nill') + self.ref('demo_invoice_cdnr_1') + self.ref('demo_invoice_cdnr_2') + self.ref('demo_invoice_cdnur') + self.ref('demo_bill_b2b_1') + self.ref('demo_bill_b2b_2') + self.ref('demo_bill_b2b_3') + self.ref('demo_bill_imp') + self.ref('demo_bill_cdnr_1') + self.ref('demo_bill_cdnr_2') + self.ref('demo_invoice_service') ) for move in invoices: try: move.action_post() except (UserError, ValidationError): _logger.exception('Error while posting demo data') else: return super()._post_load_demo_data(company)