From e175414bb23dd1e142285b5711f2f957285faef5 Mon Sep 17 00:00:00 2001 From: Ignacio Buioli Date: Wed, 22 Sep 2021 14:20:56 -0300 Subject: [PATCH] feat: add ledger --- l10n_ar_ledger/README.md | 14 + l10n_ar_ledger/__init__.py | 7 + l10n_ar_ledger/__manifest__.py | 26 ++ l10n_ar_ledger/account_report.xml | 16 + l10n_ar_ledger/account_vat_report.py | 287 ++++++++++++++++++ l10n_ar_ledger/account_vat_report_view.xml | 98 ++++++ l10n_ar_ledger/report/__init__.py | 6 + l10n_ar_ledger/report/account_vat_ledger.ods | Bin 0 -> 13819 bytes .../report/account_vat_ledger_report.xml | 20 ++ l10n_ar_ledger/security/ir.model.access.csv | 2 + l10n_ar_ledger/security/security.xml | 11 + 11 files changed, 487 insertions(+) create mode 100644 l10n_ar_ledger/README.md create mode 100644 l10n_ar_ledger/__init__.py create mode 100644 l10n_ar_ledger/__manifest__.py create mode 100644 l10n_ar_ledger/account_report.xml create mode 100644 l10n_ar_ledger/account_vat_report.py create mode 100644 l10n_ar_ledger/account_vat_report_view.xml create mode 100644 l10n_ar_ledger/report/__init__.py create mode 100644 l10n_ar_ledger/report/account_vat_ledger.ods create mode 100644 l10n_ar_ledger/report/account_vat_ledger_report.xml create mode 100644 l10n_ar_ledger/security/ir.model.access.csv create mode 100644 l10n_ar_ledger/security/security.xml diff --git a/l10n_ar_ledger/README.md b/l10n_ar_ledger/README.md new file mode 100644 index 0000000..1d794ec --- /dev/null +++ b/l10n_ar_ledger/README.md @@ -0,0 +1,14 @@ +# Argentina Ledger + +Creates Sale and Purchase VAT report menus in "Accounting/Reporting/Argentina Statements" + +## Contributors + +* AdHoc SA +* Moldeo Interactive +* Exemax +* Codize + +## Maintainer + +This module is maintained by the Exemax-Codize. Original develop by AdHoc SA \ No newline at end of file diff --git a/l10n_ar_ledger/__init__.py b/l10n_ar_ledger/__init__.py new file mode 100644 index 0000000..58d38cc --- /dev/null +++ b/l10n_ar_ledger/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __manifest__.py file in module root +# directory +############################################################################## +# from . import account_move +from . import account_vat_report diff --git a/l10n_ar_ledger/__manifest__.py b/l10n_ar_ledger/__manifest__.py new file mode 100644 index 0000000..fc6c928 --- /dev/null +++ b/l10n_ar_ledger/__manifest__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +{ + "name": "Libros IVA de Argentina", + 'version': '14.0.0.0.0', + 'category': 'Accounting/Localizations', + 'sequence': 14, + 'author': 'ADHOC SA, Moldeo Interactive, Odoo Community Association (OCA), Exemax, Codize', + 'license': 'AGPL-3', + 'summary': '', + "depends": [ + "base", + "l10n_ar", + "report_xlsx" + ], + 'external_dependencies': { + }, + "data": [ + 'account_vat_report_view.xml', + 'account_report.xml', + 'security/ir.model.access.csv', + ], + 'demo': [], + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/l10n_ar_ledger/account_report.xml b/l10n_ar_ledger/account_report.xml new file mode 100644 index 0000000..a1328ab --- /dev/null +++ b/l10n_ar_ledger/account_report.xml @@ -0,0 +1,16 @@ + + + + +`` + + + diff --git a/l10n_ar_ledger/account_vat_report.py b/l10n_ar_ledger/account_vat_report.py new file mode 100644 index 0000000..792e380 --- /dev/null +++ b/l10n_ar_ledger/account_vat_report.py @@ -0,0 +1,287 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __manifest__.py file in module root +# directory +############################################################################## +from odoo import models, fields, api, _ +from odoo.exceptions import Warning +import time + + +class account_vat_ledger(models.Model): + + _name = "account.vat.ledger" + _description = "Account VAT Ledger" + _inherit = ['mail.thread'] + _order = 'date_from desc' + + company_id = fields.Many2one( + 'res.company', + string='Empresa', + required=True, + readonly=True, + states={'draft': [('readonly', False)]}, + default=lambda self: self.env[ + 'res.company']._company_default_get('account.vat.ledger') + ) + type = fields.Selection( + [('sale', 'Sale'), ('purchase', 'Purchase')], + "Type", + required=True + ) + date_from = fields.Date( + string='Fecha Desde', + required=True, + readonly=True, + states={'draft': [('readonly', False)]}, + ) + date_to = fields.Date( + string='Fecha Hasta', + required=True, + readonly=True, + states={'draft': [('readonly', False)]}, + ) + + #@api.onchange('date_range_id') + #def onchange_date_range_id(self): + # if self.date_range_id: + # self.date_from = self.date_range_id.date_start + # self.date_to = self.date_range_id.date_end + # else: + # self.date_from = self.date_to = None + # period_id = fields.Many2one( + # 'account.period', 'Period', required=True, + # readonly=True, states={'draft': [('readonly', False)]},) + journal_ids = fields.Many2many( + 'account.journal', 'account_vat_ledger_journal_rel', + 'vat_ledger_id', 'journal_id', + string='Diarios', + required=True, + readonly=True, + states={'draft': [('readonly', False)]}, + ) + #first_page = fields.Integer( + # "First Page", + # required=True, + # readonly=True, + # states={'draft': [('readonly', False)]}, + #) + #last_page = fields.Integer( + # "Last Page", + # readonly=True, + # states={'draft': [('readonly', False)]}, + #) + presented_ledger = fields.Binary( + "Presented Ledger", + readonly=True, + states={'draft': [('readonly', False)]}, + ) + presented_ledger_name = fields.Char( + ) + state = fields.Selection( + [('draft', 'Draft'), ('presented', 'Presented'), ('cancel', 'Cancel')], + 'State', + required=True, + default='draft' + ) + note = fields.Html( + "Notas" + ) +# Computed fields + name = fields.Char( + 'Nombre', + compute='_get_name' + ) + reference = fields.Char( + 'Referencia', + ) + invoice_ids = fields.Many2many( + 'account.move', + string="Facturas", + compute="_get_data" + ) + #document_type_ids = fields.Many2many( + # 'account.document.type', + # string="Document Classes", + # compute="_get_data" + #) + #vat_tax_ids = fields.Many2many( + # 'account.tax', + # string="VAT Taxes", + # compute="_get_data" + #) + #other_tax_ids = fields.Many2many( + # 'account.tax', + # string="Other Taxes", + # compute="_get_data" + #) + # vat_tax_code_ids = fields.Many2many( + # 'account.tax.code', + # string="VAT Tax Codes", + # compute="_get_data" + # ) + # other_tax_code_ids = fields.Many2many( + # 'account.tax.code', + # string="Other Tax Codes", + # compute="_get_data" + # ) + #afip_responsability_type_ids = fields.Many2many( + # 'l10nafip.responsability.type', + # string="AFIP Responsabilities", + # compute="_get_data" + #) + + # Sacamos el depends por un error con el cache en esqume multi cia al + # cambiar periodo de una cia hija con usuario distinto a admin + # @api.depends('journal_ids', 'period_id') + def _get_data(self): + #self.afip_responsability_type_ids = self.env[ + # 'l10n_ar.afip.responsibility.type'].search([]) + + if self.type == 'sale': + invoices_domain = [ + # cancel invoices with internal number are invoices + ('state', '!=', 'draft'), + ('document_number', '!=', False), + # ('internal_number', '!=', False), + ('journal_id', 'in', self.journal_ids.ids), + ('date', '>=', self.date_from), + ('date', '<=', self.date_to), + ] + invoices = self.env['account.move'].search( + # TODO, tal vez directamente podemos invertir el orden, como? + invoices_domain, + order='invoice_date asc, document_number asc, id asc') + else: + invoices_domain = [ + # cancel invoices with internal number are invoices + ('state', '!=', 'draft'), + ('name', '!=', False), + # ('internal_number', '!=', False), + ('journal_id', 'in', self.journal_ids.ids), + ('date', '>=', self.date_from), + ('date', '<=', self.date_to), + ] + invoices = self.env['account.move'].search( + # TODO, tal vez directamente podemos invertir el orden, como? + invoices_domain, + order='invoice_date asc, name asc, id asc') + + + #self.document_type_ids = invoices.mapped('l10n_latam_document_type_id') + self.invoice_ids = invoices + + #self.vat_tax_ids = invoices.mapped( + # 'vat_tax_ids.tax_id') + #self.other_tax_ids = invoices.mapped( + # 'not_vat_tax_ids.tax_id') + # self.vat_tax_code_ids = invoices.mapped( + # 'vat_tax_ids.tax_code_id') + # self.other_tax_code_ids = invoices.mapped( + # 'not_vat_tax_ids.tax_code_id') + + def _get_name(self): + for rec in self: + if rec.type == 'sale': + ledger_type = _('Ventas') + elif rec.type == 'purchase': + ledger_type = _('Compras') + + lang = self.env['res.lang'] + #date_format = lang.browse(lang._lang_get( + # self._context.get('lang', 'en_US'))).date_format + + name = _("%s Libro de IVA %s - %s") % ( + ledger_type, + rec.date_from and fields.Date.from_string( + rec.date_from).strftime("%d-%m-%Y") or '', + rec.date_to and fields.Date.from_string( + rec.date_to).strftime("%d-%m-%Y") or '', + ) + if rec.reference: + name = "%s - %s" % (name, rec.reference) + rec.name = name + + @api.onchange('company_id') + def change_company(self): + now = time.strftime('%Y-%m-%d') + company_id = self.company_id.id + domain = [('company_id', '=', company_id), + ('date_start', '<', now), ('date_stop', '>', now)] + # fiscalyears = self.env['account.fiscalyear'].search(domain, limit=1) + # self.fiscalyear_id = fiscalyears + if self.type == 'sale': + domain = [('type', '=', 'sale')] + elif self.type == 'purchase': + domain = [('type', '=', 'purchase')] + domain += [ + ('l10n_latam_use_documents', '=', True), + ('company_id', '=', self.company_id.id), + ] + journals = self.env['account.journal'].search(domain) + self.journal_ids = journals + + def action_present(self): + self.state = 'presented' + + def action_cancel(self): + self.state = 'cancel' + + def action_to_draft(self): + self.state = 'draft' + +class AccountVatLedgerXlsx(models.AbstractModel): + _name = 'report.l10n_ar_account_vat_ledger.account_vat_ledger_xlsx' + #_name = 'account_vat_ledger_xlsx' + _inherit = 'report.report_xlsx.abstract' + + def generate_xlsx_report(self, workbook, data, vat_ledger): + if vat_ledger.invoice_ids: + report_name = 'IVA Ventas' + sheet = workbook.add_worksheet(report_name[:31]) + money_format = workbook.add_format({'num_format': '$#,##0'}) + bold = workbook.add_format({'bold': True}) + sheet.write(1, 0, vat_ledger.display_name, bold) + titles = ['Fecha','Cliente','CUIT','Tipo Comprobante','Responsabilidad AFIP','Nro Comprobante','Neto gravado','Neto Exento','IVA 21','IVA 10.5','Otros Impuestos','Total gravado'] + for i,title in enumerate(titles): + sheet.write(3, i, title, bold) + row = 4 + index = 0 + sheet.set_column('A:F', 30) + for i,obj in enumerate(vat_ledger.invoice_ids): + # One sheet by partner + #if obj.qty_available < 1: + # continue + sheet.write(row + index, 0, obj.invoice_date.strftime("%Y-%m-%d")) + sheet.write(row + index, 1, obj.partner_id.display_name) + sheet.write(row + index, 2, obj.partner_id.vat) + sheet.write(row + index, 3, obj.l10n_latam_document_type_id.display_name) + sheet.write(row + index, 4, obj.partner_id.l10n_ar_afip_responsibility_type_id.name) + sheet.write(row + index, 5, obj.display_name) + vat_taxable_amount = 0 + vat_exempt_base_amount = 0 + other_taxes_amount = 0 + vat_amount = 0 + for move_tax in obj.move_tax_ids: + if move_tax.tax_id.tax_group_id.tax_type == 'vat' and move_tax.tax_id.tax_group_id.l10n_ar_vat_afip_code != '2': + vat_taxable_amount += move_tax.base_amount + vat_amount += move_tax.tax_amount + elif move_tax.tax_id.tax_group_id.tax_type == 'vat' and move_tax.tax_id.tax_group_id.l10n_ar_vat_afip_code == '2': + vat_exempt_base_amount += move_tax.base_amount + else: + other_taxes_amount += move_tax.tax_amount + + sheet.write(row + index, 6, vat_taxable_amount,money_format) + sheet.write(row + index, 7, vat_exempt_base_amount,money_format) + for tax_line in obj.move_tax_ids: + if tax_line.tax_id.amount == 21: + sheet.write(row + index, 8, tax_line.tax_amount,money_format) + if tax_line.tax_id.amount == 10.5: + sheet.write(row + index, 9, tax_line.tax_amount,money_format) + sheet.write(row + index, 10, other_taxes_amount,money_format) + sheet.write(row + index, 11, obj.amount_total,money_format) + #sheet.write(row + index, 9, obj.vat_amount) + #sheet.write(row + index, 10, obj.amount_tax - obj.vat_amount) + #sheet.write(row + index, 11, obj.currency_id.name) + index += 1 + diff --git a/l10n_ar_ledger/account_vat_report_view.xml b/l10n_ar_ledger/account_vat_report_view.xml new file mode 100644 index 0000000..3c5769b --- /dev/null +++ b/l10n_ar_ledger/account_vat_report_view.xml @@ -0,0 +1,98 @@ + + + + + + Account VAT Ledger + account.vat.ledger + + + + + + + + + + + + + Account VAT Ledger + account.vat.ledger + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + + IVA Compras + account.vat.ledger + {'default_type':'purchase'} + [('type','=','purchase')] + + + + IVA Ventas + account.vat.ledger + {'default_type':'sale'} + [('type','=','sale')] + + + + + +
+
diff --git a/l10n_ar_ledger/report/__init__.py b/l10n_ar_ledger/report/__init__.py new file mode 100644 index 0000000..db559f9 --- /dev/null +++ b/l10n_ar_ledger/report/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __manifest__.py file in module root +# directory +############################################################################## +# import parser diff --git a/l10n_ar_ledger/report/account_vat_ledger.ods b/l10n_ar_ledger/report/account_vat_ledger.ods new file mode 100644 index 0000000000000000000000000000000000000000..a36c1fd2ecea7d16d04453e224b1415f6837d986 GIT binary patch literal 13819 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 + + + + Account Vat Ledger + ir.actions.report.xml + account.vat.ledger + report_account_vat_ledger + aeroo + oo-ods + + l10n_ar_account_vat_ledger/report/account_vat_ledger.ods + + default + file + Libro IVA ${o.type == 'purchase' and 'Compras' or 'Ventas'} ${o.date_to}.xls + + + + diff --git a/l10n_ar_ledger/security/ir.model.access.csv b/l10n_ar_ledger/security/ir.model.access.csv new file mode 100644 index 0000000..c35aacf --- /dev/null +++ b/l10n_ar_ledger/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_vat_ledger_accountant,account_vat_ledger_accountant,model_account_vat_ledger,account.group_account_user,1,1,1,1 diff --git a/l10n_ar_ledger/security/security.xml b/l10n_ar_ledger/security/security.xml new file mode 100644 index 0000000..161dd57 --- /dev/null +++ b/l10n_ar_ledger/security/security.xml @@ -0,0 +1,11 @@ + + + + + Vat Ledger Multi Company + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + +