Browse Source

[IMP] Multiple Invoice Copies added

pull/164/head
Ajmal Cybro 4 years ago
parent
commit
5099c2b626
  1. 7
      base_accounting_kit/__manifest__.py
  2. 8
      base_accounting_kit/data/multiple_invoice_data.xml
  3. 5
      base_accounting_kit/doc/changelog.md
  4. 2
      base_accounting_kit/models/__init__.py
  5. 49
      base_accounting_kit/models/multiple_invoice.py
  6. 151
      base_accounting_kit/models/multiple_invoice_layout.py
  7. 2
      base_accounting_kit/report/__init__.py
  8. 552
      base_accounting_kit/report/multiple_invoice_layouts.xml
  9. 37
      base_accounting_kit/report/multiple_invoice_report.py
  10. 260
      base_accounting_kit/report/multiple_invoice_report.xml
  11. 5
      base_accounting_kit/security/ir.model.access.csv
  12. BIN
      base_accounting_kit/static/description/banner.gif
  13. BIN
      base_accounting_kit/static/description/images/mi_image1.png
  14. BIN
      base_accounting_kit/static/description/images/mi_image2.png
  15. BIN
      base_accounting_kit/static/description/images/mi_image3.png
  16. BIN
      base_accounting_kit/static/description/images/mi_image5.png
  17. BIN
      base_accounting_kit/static/description/images/mi_image6.png
  18. BIN
      base_accounting_kit/static/description/images/multiple_invoice_banner.png
  19. BIN
      base_accounting_kit/static/description/images/multiple_invoice_icon.png
  20. 264
      base_accounting_kit/static/description/index.html
  21. 33
      base_accounting_kit/views/multiple_invoice_form.xml
  22. 44
      base_accounting_kit/views/multiple_invoice_layout_view.xml

7
base_accounting_kit/__manifest__.py

@ -22,7 +22,7 @@
{
'name': 'Odoo 14 Full Accounting Kit',
'version': '14.0.2.7.6',
'version': '14.0.3.7.7',
'category': 'Accounting',
'live_test_url': 'https://www.youtube.com/watch?v=peAp2Tx_XIs',
'summary': """ Asset and Budget Management,
@ -58,6 +58,7 @@
'data/followup_levels.xml',
'data/account_asset_data.xml',
'data/recurring_entry_cron.xml',
'data/multiple_invoice_data.xml',
'views/assets.xml',
'views/dashboard_views.xml',
'views/reports_config_view.xml',
@ -76,6 +77,8 @@
'views/account_asset_templates.xml',
'views/product_template_views.xml',
'views/payment_matching.xml',
'views/multiple_invoice_layout_view.xml',
'views/multiple_invoice_form.xml',
'wizard/financial_report.xml',
'wizard/general_ledger.xml',
'wizard/partner_ledger.xml',
@ -101,6 +104,8 @@
'report/account_day_book_view.xml',
'report/account_asset_report_views.xml',
'report/report.xml',
'report/multiple_invoice_layouts.xml',
'report/multiple_invoice_report.xml',
],
'qweb': [
'static/src/xml/template.xml',

8
base_accounting_kit/data/multiple_invoice_data.xml

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="multiple_invoice_sample_name" model="multiple.invoice">
<field name="copy_name">Sample Name</field>
</record>
</data>
</odoo>

5
base_accounting_kit/doc/changelog.md

@ -48,3 +48,8 @@
#### UPDT
- Reconcilation issue.
#### 27.04.2021
#### Version 14.0.3.7.7
#### UPDT
- Multiple Invoice Copies added.

2
base_accounting_kit/models/__init__.py

@ -34,3 +34,5 @@ from . import res_config_settings
from . import res_partner
from . import account_dashboard
from . import payment_matching
from . import multiple_invoice
from . import multiple_invoice_layout

49
base_accounting_kit/models/multiple_invoice.py

@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
from odoo import fields, models
class MultipleInvoice(models.Model):
"""Multiple Invoice Model"""
_name = "multiple.invoice"
_order = "sequence"
sequence = fields.Integer('Sequence No')
copy_name = fields.Char('Invoice Copy Name')
journal_id = fields.Many2one('account.journal', string="Journal")
class AccountJournal(models.Model):
"""Inheriting Account Journal Model"""
_inherit = "account.journal"
multiple_invoice_ids = fields.One2many('multiple.invoice', 'journal_id',
string='Multiple Invoice')
multiple_invoice_type = fields.Selection(
[('text', 'Text'), ('watermark', 'Watermark')], required=True,
default='text', string="Display Type")
text_position = fields.Selection([
('header', 'Header'),
('footer', 'Footer'),
('body', 'Document Body')
], required=True, default='header')
body_text_position = fields.Selection([
('tl', 'Top Left'),
('tr', 'Top Right'),
('bl', 'Bottom Left'),
('br', 'Bottom Right'),
], default='tl')
text_align = fields.Selection([
('right', 'Right'),
('left', 'Left'),
('center', 'Center'),
], default='right')
layout = fields.Char(related="company_id.external_report_layout_id.key")

151
base_accounting_kit/models/multiple_invoice_layout.py

@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models
from odoo.modules import get_resource_path
try:
import sass as libsass
except ImportError:
libsass = None
class MultipleInvoiceLayout(models.TransientModel):
"""
Customise the invoice copy document layout and display a live preview
"""
_name = 'multiple.invoice.layout'
_description = 'Multiple Invoice Document Layout'
def _get_default_journal(self):
return self.env['account.journal'].search(
[('id', '=', self.env.context.get('active_id'))]).id
company_id = fields.Many2one(
'res.company', default=lambda self: self.env.company, required=True)
layout = fields.Char(related="company_id.external_report_layout_id.key")
journal_id = fields.Many2one('account.journal', string='Journal',
required=True, default=_get_default_journal)
multiple_invoice_type = fields.Selection(
related='journal_id.multiple_invoice_type', readonly=False,
required=True)
text_position = fields.Selection(related='journal_id.text_position',
readonly=False, required=True,
default='header')
body_text_position = fields.Selection(
related='journal_id.body_text_position',
readonly=False)
text_align = fields.Selection(
related='journal_id.text_align',
readonly=False)
preview = fields.Html(compute='_compute_preview',
sanitize=False,
sanitize_tags=False,
sanitize_attributes=False,
sanitize_style=False,
sanitize_form=False,
strip_style=False,
strip_classes=False)
@api.depends('multiple_invoice_type', 'text_position', 'body_text_position',
'text_align')
def _compute_preview(self):
""" compute a qweb based preview to display on the wizard """
styles = self._get_asset_style()
for wizard in self:
if wizard.company_id:
preview_css = self._get_css_for_preview(styles, wizard.id)
layout = self._get_layout_for_preview()
ir_ui_view = wizard.env['ir.ui.view']
wizard.preview = ir_ui_view._render_template(
'base_accounting_kit.multiple_invoice_wizard_preview',
{'company': wizard.company_id, 'preview_css': preview_css,
'layout': layout,
'mi_type': self.multiple_invoice_type,
'txt_position': self.text_position,
'body_txt_position': self.body_text_position,
'txt_align': self.text_align,
'mi': self.env.ref(
'base_accounting_kit.multiple_invoice_sample_name')
})
else:
wizard.preview = False
def _get_asset_style(self):
template_style = self.env.ref('web.styles_company_report',
raise_if_not_found=False)
if not template_style:
return b''
company_styles = template_style._render({
'company_ids': self.company_id,
})
return company_styles
@api.model
def _get_css_for_preview(self, scss, new_id):
"""
Compile the scss into css.
"""
css_code = self._compile_scss(scss)
return css_code
@api.model
def _compile_scss(self, scss_source):
"""
This code will compile valid scss into css.
Parameters are the same from odoo/addons/base/models/assetsbundle.py
Simply copied and adapted slightly
"""
# No scss ? still valid, returns empty css
if not scss_source.strip():
return ""
precision = 8
output_style = 'expanded'
bootstrap_path = get_resource_path('web', 'static', 'lib', 'bootstrap',
'scss')
try:
return libsass.compile(
string=scss_source,
include_paths=[
bootstrap_path,
],
output_style=output_style,
precision=precision,
)
except libsass.CompileError as e:
raise libsass.CompileError(e.args[0])
def _get_layout_for_preview(self):
if self.layout == 'web.external_layout_boxed':
new_layout = 'base_accounting_kit.boxed'
elif self.layout == 'web.external_layout_clean':
new_layout = 'base_accounting_kit.clean'
elif self.layout == 'web.external_layout_background':
new_layout = 'base_accounting_kit.background'
else:
new_layout = 'base_accounting_kit.standard'
return new_layout
def document_layout_save(self):
# meant to be overridden
return self.env.context.get('report_action') or {
'type': 'ir.actions.act_window_close'}

2
base_accounting_kit/report/__init__.py

@ -32,4 +32,4 @@ from . import account_bank_book
from . import account_cash_book
from . import account_day_book
from . import account_asset_report
from . import multiple_invoice_report

552
base_accounting_kit/report/multiple_invoice_layouts.xml

@ -0,0 +1,552 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="base_accounting_kit.standard">
<div t-attf-class="header o_company_#{company.id}_layout" t-att-style="report_header_style">
<div class="row">
<div class="col-3 mb4">
<img t-if="company.logo" t-att-src="image_data_uri(company.logo)" style="max-height: 45px;" alt="Logo"/>
<!--Header-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'header'">
<div class="row">
<div t-if="txt_align == 'left'" class="text-left">
<span t-esc="mi.copy_name" style="font-size: 20px; padding-left:25px; white-space:nowrap;"/>
</div>
<div t-if="txt_align == 'center'" class="text-center">
<span t-esc="mi.copy_name" style="font-size: 20px;
margin-left:340px; margin-right:340px; white-space:nowrap;"/>
</div>
</div>
</t>
</t>
</div>
<div class="col-9 text-right" style="margin-top:22px;" t-field="company.report_header" name="moto"/>
<!--Header-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'header'">
<div t-if="txt_align == 'right'" class="col-9 text-right">
<span t-esc="mi.copy_name" style="font-size: 20px;"/>
</div>
</t>
</t>
</div>
<div t-if="company.logo or company.report_header" class="row zero_min_height">
<div class="col-12">
<div style="border-bottom: 1px solid black;"/>
</div>
</div>
<div class="row">
<div class="col-6" name="company_address">
<div t-field="company.partner_id"
t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}'
/>
</div>
</div>
<!--Watermark-->
<t t-if="mi_type =='watermark'">
<div style="opacity:0.15; font-size:100px; width:85%; text-align:center;top:500px; right:100px; position: fixed; z-index:99; -webkit-transform: rotate(-30deg);">
<t t-esc="mi.copy_name"/>
</div>
</t>
</div>
<div t-attf-class="article o_report_layout_standard o_company_#{company.id}_layout" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
<div class="pt-5">
<!-- This div ensures that the address is not cropped by the header. -->
<t t-call="web.address_layout"/>
</div>
<t t-raw="0"/>
</div>
<div t-attf-class="footer o_standard_footer o_company_#{company.id}_layout">
<div class="text-center" style="border-top: 1px solid black;">
<ul class="list-inline mb4">
<!-- using the list-inline-item class from bootstrap causes weird behaviours in pdf report
adding d-inline class fixes the problem-->
<li t-if="company.phone" class="list-inline-item d-inline"><span class="o_force_ltr" t-field="company.phone"/></li>
<li t-if="company.email" class="list-inline-item d-inline"><span t-field="company.email"/></li>
<li t-if="company.website" class="list-inline-item d-inline"><span t-field="company.website"/></li>
<li t-if="company.vat" class="list-inline-item d-inline"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
<!--Footer-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'footer'">
<div t-if="txt_align == 'right'" class="text-right">
<span t-esc="mi.copy_name" style="font-size: 15px;"/>
</div>
<div t-if="txt_align == 'left'" class="text-left">
<span t-esc="mi.copy_name" style="font-size: 15px;"/>
</div>
<div t-if="txt_align == 'center'" class="text-center;">
<span t-esc="mi.copy_name" style="font-size: 15px;"/>
</div>
</t>
</t>
</ul>
<div name="financial_infos">
<span t-field="company.report_footer"/>
</div>
<div t-if="report_type == 'pdf'" class="text-muted">
Page: <span class="page"/> / <span class="topage"/>
</div>
</div>
</div>
</template>
<template id="base_accounting_kit.boxed">
<div t-attf-class="header o_company_#{company.id}_layout" t-att-style="report_header_style">
<div class="o_boxed_header">
<div class="row mb8">
<div class="col-6">
<img t-if="company.logo" t-att-src="image_data_uri(company.logo)" alt="Logo"/>
<!--Header-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'header'">
<div t-if="txt_align == 'left'">
<span t-esc="mi.copy_name" style="font-size: 25px; white-space:nowrap;"/>
</div>
<div t-if="txt_align == 'center'" class="text-align: center">
<span t-esc="mi.copy_name" style="font-size: 25px;
margin-left:340px; margin-right:340px; white-space:nowrap;"/>
</div>
</t>
</t>
</div>
<div class="col-6 text-right mb4">
<h4 class="mt0" t-field="company.report_header"/>
<div name="company_address" class="float-right mb4">
<span class="company_address" t-field="company.partner_id"
t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": true}'/>
<!--Header-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'header'">
<div t-if="txt_align == 'right'" class="float-right mb4">
<span t-esc="mi.copy_name" style="font-size: 25px;"/>
</div>
</t>
</t>
<br/>
</div>
</div>
</div>
</div>
<!--Watermark-->
<t t-if="mi_type =='watermark'">
<div style="opacity:0.15; font-size:100px; width:85%; text-align:center;top:500px; right:100px; position: fixed; z-index:99; -webkit-transform: rotate(-30deg);">
<t t-esc="mi.copy_name"/>
</div>
</t>
</div>
<div t-attf-class="article o_report_layout_boxed o_company_#{company.id}_layout" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
<div class="pt-5">
<!-- This div ensures that the address is not cropped by the header. -->
<t t-call="web.address_layout"/>
</div>
<t t-raw="0"/>
</div>
<div t-attf-class="footer o_boxed_footer o_company_#{company.id}_layout">
<div class="text-center">
<ul class="list-inline">
<li t-if="company.phone" class="list-inline-item"><span class="o_force_ltr" t-field="company.phone"/></li>
<li t-if="company.email" class="list-inline-item"><span t-field="company.email"/></li>
<li t-if="company.website" class="list-inline-item"><span t-field="company.website"/></li>
<li t-if="company.vat" class="list-inline-item"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
</ul>
<div t-field="company.report_footer"/>
<!--Footer-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'footer'">
<div t-if="txt_align == 'right'" class="text-right">
<span t-esc="mi.copy_name" style="font-size: 20px;"/>
</div>
<div t-if="txt_align == 'left'" class="text-left">
<span t-esc="mi.copy_name" style="font-size: 20px;"/>
</div>
<div t-if="txt_align == 'center'" class="text-center;">
<span t-esc="mi.copy_name" style="font-size: 20px;"/>
</div>
</t>
</t>
<div t-if="report_type == 'pdf'">
Page: <span class="page"/> / <span class="topage"/>
</div>
</div>
</div>
</template>
<template id="base_accounting_kit.clean">
<div t-attf-class="header o_company_#{company.id}_layout" t-att-style="report_header_style">
<div class="o_clean_header">
<div class="row">
<div class="col-6">
<img t-if="company.logo" t-att-src="image_data_uri(company.logo)" alt="Logo"/>
<!--Header-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'header'">
<div t-if="txt_align == 'left'">
<br/>
<span t-esc="mi.copy_name" style="font-size: 20px; padding-left:25px; white-space:nowrap;"/>
</div>
<div t-if="txt_align == 'center'" class="text-align: center">
<br/>
<span t-esc="mi.copy_name" style="font-size: 20px;
margin-left:280px; margin-right:280px; white-space:nowrap;"/>
</div>
</t>
</t>
</div>
<div class="col-5 offset-1" name="company_address">
<ul class="list-unstyled">
<strong><li t-if="company.name"><span t-field="company.name"/></li></strong>
<li t-if="company.vat"><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
<li t-if="company.phone">Tel: <span class="o_force_ltr" t-field="company.phone"/></li>
<li t-if="company.email"><span t-field="company.email"/></li>
<li t-if="company.website"><span t-field="company.website"/></li>
<!--Header-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'header'">
<div t-if="txt_align == 'right'">
<span t-esc="mi.copy_name" style="font-size: 20px;"/>
</div>
</t>
</t>
</ul>
</div>
</div>
</div>
<!--Watermark-->
<t t-if="mi_type =='watermark'">
<div style="opacity:0.15; font-size:100px; width:85%; text-align:center;top:500px; right:100px; position: fixed; z-index:99; -webkit-transform: rotate(-30deg);">
<t t-esc="mi.copy_name"/>
</div>
</t>
</div>
<div t-attf-class="article o_report_layout_clean o_company_#{company.id}_layout" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
<t t-call="web.address_layout"/>
<t t-raw="0"/>
</div>
<div t-attf-class="footer o_clean_footer o_company_#{company.id}_layout">
<div class="row mt8">
<!--Footer-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'footer'">
<div t-if="txt_align == 'left'" class="text-left">
<span t-esc="mi.copy_name" style="font-size: 18px; padding-left:25px; white-space:nowrap;"/>
</div>
</t>
</t>
<div class="col-3">
<span t-field="company.report_footer"/>
</div>
<div class="col-4 text-right">
<span class="company_address" t-field="company.partner_id"
t-options='{"widget": "contact", "fields": ["address"], "no_marker": true}'/>
</div>
<div class="col-4">
<h4 class="mt0 mb0 text-uppercase" t-field="company.report_header"/>
<!--Footer-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'footer'">
<div t-if="txt_align == 'right'" class="text-right">
<span t-esc="mi.copy_name" style="font-size: 18px;"/>
</div>
<div t-if="txt_align == 'center'" class="text-center;">
<span t-esc="mi.copy_name" style="font-size: 18px;"/>
</div>
</t>
</t>
</div>
<div class="col-1">
<ul t-if="report_type == 'pdf'" class="list-inline pagenumber float-right text-center">
<li class="list-inline-item"><strong><span class="page"/></strong></li>
</ul>
</div>
</div>
</div>
</template>
<template id="base_accounting_kit.background">
<div t-attf-class="o_company_#{company.id}_layout header" t-att-style="report_header_style">
<div class="o_background_header">
<div class="float-right">
<h3 class="mt0 text-right" t-field="company.report_header"/>
</div>
<img t-if="company.logo" t-att-src="image_data_uri(company.logo)" class="float-left" alt="Logo"/>
<div class="float-left company_address">
<div>
<strong t-field="company.partner_id.name"/>
</div>
<span t-field="company.partner_id"
t-options='{"widget": "contact", "fields": ["address"], "no_marker": true}'/>
</div>
<!--Header-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'header'">
<div t-if="txt_align == 'right'" class="text-right" style="position: relative; top: 50px;">
<span t-esc="mi.copy_name" style="font-size: 20px;"/>
</div>
<div t-if="txt_align == 'center'" class="text-center">
<br/>
<span t-esc="mi.copy_name" style="font-size: 20px;
margin-left:280px; margin-right:280px; white-space:nowrap;"/>
</div>
<div t-if="txt_align == 'left'" class="text-left" style="position: fixed; top: 70px; left:20px;">
<br/>
<span t-esc="mi.copy_name" style="font-size: 20px; white-space:nowrap;"/>
</div>
</t>
</t>
<div class="clearfix mb8"/>
</div>
<!--Watermark-->
<t t-if="mi_type =='watermark'">
<div style="opacity:0.15; font-size:100px; width:85%; text-align:center;top:500px; right:100px; position: fixed; z-index:99; -webkit-transform: rotate(-30deg);">
<t t-esc="mi.copy_name"/>
</div>
</t>
</div>
<div t-attf-class="o_company_#{company.id}_layout article o_report_layout_background" t-att-data-oe-model="o and o._name" t-att-data-oe-id="o and o.id" t-att-data-oe-lang="o and o.env.context.get('lang')">
<t t-call="web.address_layout"/>
<t t-raw="0"/>
</div>
<div t-attf-class="o_company_#{company.id}_layout footer o_background_footer">
<div class="text-center">
<ul class="list-inline">
<li t-if="company.phone" class="list-inline-item"><i class="fa fa-phone" role="img" aria-label="Phone" title="Phone"/> <span class="o_force_ltr" t-field="company.phone"/></li>
<li t-if="company.email" class="list-inline-item"><i class="fa fa-at" role="img" aria-label="Email" title="Email"/> <span t-field="company.email"/></li>
<li t-if="company.website" class="list-inline-item"><i class="fa fa-globe" role="img" aria-label="Website" title="Website"/> <span t-field="company.website"/></li>
<li t-if="company.vat" class="list-inline-item"><i class="fa fa-building-o" role="img" aria-label="Fiscal number"/><t t-esc="company.country_id.vat_label or 'Tax ID'"/>: <span t-field="company.vat"/></li>
</ul>
<div t-field="company.report_footer"/>
<!--Footer-->
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'footer'">
<div t-if="txt_align == 'right'" class="text-right">
<span t-esc="mi.copy_name" style="font-size: 15px;"/>
</div>
<div t-if="txt_align == 'left'" class="text-left">
<span t-esc="mi.copy_name" style="font-size: 15px;"/>
</div>
<div t-if="txt_align == 'center'" class="text-center;">
<span t-esc="mi.copy_name" style="font-size: 15px;"/>
</div>
</t>
</t>
<div t-if="report_type == 'pdf'" class="text-muted">
Page:
<span class="page"/>
of
<span class="topage"/>
</div>
</div>
</div>
</template>
<template id="multiple_invoice_wizard_preview">
<t t-call="web.html_preview_container">
<t t-call="base_accounting_kit.new_external_layout">
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'body'">
<div t-if="body_txt_position == 'tr'" style="font-size:25px; text-align:right;">
<span>Sample Name</span>
</div>
<div t-if="body_txt_position == 'tl'" style="font-size:25px; text-align:left;">
<span>Sample Name</span>
</div>
</t>
</t>
<div class="pt-5">
<div class="address row">
<div name="address" class="col-md-5 ml-auto">
<address>
<address class="mb-0" itemscope="itemscope"
itemtype="http://schema.org/Organization">
<div>
<span itemprop="name">Deco Addict</span>
</div>
<div itemprop="address" itemscope="itemscope"
itemtype="http://schema.org/PostalAddress">
<div class="d-flex align-items-baseline">
<span class="w-100 o_force_ltr" itemprop="streetAddress">77 Santa Barbara
Rd<br/>Pleasant Hill CA 94523<br/>United States</span>
</div>
</div>
</address>
</address>
</div>
</div>
</div>
<div class="page">
<h2>
<span>Invoice</span>
<span>INV/2020/07/0003</span>
</h2>
<div id="informations" class="row mt32 mb32">
<div class="col-auto mw-100 mb-2" name="invoice_date">
<strong>Invoice Date:</strong>
<p class="m-0">07/08/2020</p>
</div>
<div class="col-auto mw-100 mb-2" name="due_date">
<strong>Due Date:</strong>
<p class="m-0">08/07/2020</p>
</div>
</div>
<table class="table table-sm o_main_table" name="invoice_line_table">
<thead>
<tr>
<th name="th_description" class="text-left"><span>Description</span></th>
<th name="th_quantity" class="text-right"><span>Quantity</span></th>
<th name="th_priceunit" class="text-right d-none d-md-table-cell"><span>Unit Price</span></th>
<th name="th_taxes" class="text-left d-none d-md-table-cell"><span>Taxes</span></th>
<th name="th_subtotal" class="text-right">
<span>Amount</span>
</th>
</tr>
</thead>
<tbody class="invoice_tbody">
<tr>
<td name="account_invoice_line_name"><span>[FURN_8999] Three-Seat Sofa<br/>
Three Seater Sofa with Lounger in Steel Grey Colour</span></td>
<td class="text-right">
<span>5.000</span>
</td>
<td class="text-right d-none d-md-table-cell">
<span class="text-nowrap">1,500.00</span>
</td>
<td class="text-left d-none d-md-table-cell">
<span id="line_tax_ids">15.00%</span>
</td>
<td class="text-right o_price_total">
<span class="text-nowrap">$ <span class="oe_currency_value">7,500.00</span></span>
</td>
</tr>
<tr>
<td name="account_invoice_line_name"><span>[FURN_8220] Four Person Desk<br/>
Four person modern office workstation</span></td>
<td class="text-right">
<span>5.000</span>
</td>
<td class="text-right d-none d-md-table-cell">
<span class="text-nowrap">23,500.00</span>
</td>
<td class="text-left d-none d-md-table-cell">
<span id="line_tax_ids">15.00%</span>
</td>
<td class="text-right o_price_total">
<span class="text-nowrap">$ <span class="oe_currency_value">117,500.00</span></span>
</td>
</tr>
</tbody>
</table>
<div class="clearfix">
<div id="total" class="row">
<div class="col-sm-7 col-md-6 ml-auto">
<table class="table table-sm" style="page-break-inside: avoid;">
<tbody><tr class="border-black o_subtotal" style="">
<td><strong>Subtotal</strong></td>
<td class="text-right">
<span>$ <span class="oe_currency_value">125,000.00</span></span>
</td>
</tr>
<tr style="">
<td><span class="text-nowrap">Tax 15%</span></td>
<td class="text-right o_price_total">
<span class="text-nowrap">$ 18,750.00</span>
</td>
</tr>
<tr class="border-black o_total">
<td><strong>Total</strong></td>
<td class="text-right">
<span class="text-nowrap">$ <span class="oe_currency_value">
143,750.00</span></span>
</td>
</tr>
</tbody></table>
</div>
</div>
</div>
<p>
Please use the following communication for your payment : <b><span>
INV/2020/07/0003</span></b>
</p>
<p name="payment_term">
<span>Payment terms: 300 Days</span>
</p>
<t t-if="mi_type == 'text'">
<t t-if="txt_position == 'body'">
<div t-if="body_txt_position == 'br'" style="font-size:25px; text-align:right;">
<span>Sample Name</span>
</div>
<div t-if="body_txt_position == 'bl'" style="font-size:25px; text-align:left;">
<span>Sample Name</span>
</div>
</t>
</t>
</div>
</t>
</t>
</template>
<template id="new_external_layout">
<t t-if="not o" t-set="o" t-value="doc"/>
<t t-if="not company">
<!-- Multicompany -->
<t t-if="company_id">
<t t-set="company" t-value="company_id"/>
</t>
<t t-elif="o and 'company_id' in o">
<t t-set="company" t-value="o.company_id.sudo()"/>
</t>
<t t-else="else">
<t t-set="company" t-value="res_company"/>
</t>
</t>
<t t-if="layout" t-call="{{layout}}"><t t-raw="0"/></t>
<t t-else="else" t-call="base_accounting_kit.standard"><t t-raw="0"/></t>
</template>
</odoo>

37
base_accounting_kit/report/multiple_invoice_report.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
from odoo import models, api
class ReportInvoiceMultiple(models.AbstractModel):
_name = 'report.base_accounting_kit.report_multiple_invoice'
_inherit = 'report.account.report_invoice'
@api.model
def _get_report_values(self, docids, data=None):
rslt = super()._get_report_values(docids, data)
inv = rslt['docs']
layout = inv.journal_id.company_id.external_report_layout_id.key
if layout == 'web.external_layout_boxed':
new_layout = 'base_accounting_kit.boxed'
elif layout == 'web.external_layout_clean':
new_layout = 'base_accounting_kit.clean'
elif layout == 'web.external_layout_background':
new_layout = 'base_accounting_kit.background'
else:
new_layout = 'base_accounting_kit.standard'
rslt['mi_type'] = inv.journal_id.multiple_invoice_type
rslt['mi_ids'] = inv.journal_id.multiple_invoice_ids
rslt['txt_position'] = inv.journal_id.text_position
rslt['body_txt_position'] = inv.journal_id.body_text_position
rslt['txt_align'] = inv.journal_id.text_align
rslt['layout'] = new_layout
rslt['report_type'] = data.get('report_type') if data else ''
return rslt

260
base_accounting_kit/report/multiple_invoice_report.xml

@ -0,0 +1,260 @@
<odoo>
<template id="report_multiple_invoice_new">
<t t-call="base_accounting_kit.new_external_layout">
<t t-set="o" t-value="o.with_context(lang=lang)" />
<t t-set="address">
<address t-field="o.partner_id" t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
<div t-if="o.partner_id.vat" class="mt16">
<t t-if="o.company_id.country_id.vat_label" t-esc="o.company_id.country_id.vat_label" id="inv_tax_id_label"/>
<t t-else="">Tax ID</t>: <span t-field="o.partner_id.vat"/></div>
</t>
<div class="page">
<t t-set="txt_style" t-value="'font-size:25px; text-align:center;top:0px; left:15px; position:absolute; z-index:99;'"/>
<t t-if="body_txt_position == 'tr'">
<t t-set="txt_style" t-value="'font-size:25px; text-align:center;top:0px; right:15px; position:absolute; z-index:99;'"/>
</t>
<t t-if="body_txt_position == 'br'">
<t t-set="txt_style" t-value="'font-size:25px; text-align:right;'"/>
</t>
<t t-if="body_txt_position == 'bl'">
<t t-set="txt_style" t-value="'font-size:25px; text-align:left;'"/>
</t>
<h2>
<span t-if="o.move_type == 'out_invoice' and o.state == 'posted'">Invoice</span>
<span t-if="o.move_type == 'out_invoice' and o.state == 'draft'">Draft Invoice</span>
<span t-if="o.move_type == 'out_invoice' and o.state == 'cancel'">Cancelled Invoice</span>
<span t-if="o.move_type == 'out_refund'">Credit Note</span>
<span t-if="o.move_type == 'in_refund'">Vendor Credit Note</span>
<span t-if="o.move_type == 'in_invoice'">Vendor Bill</span>
<span t-if="o.name != '/'" t-field="o.name"/>
</h2>
<div id="informations" class="row mt32 mb32">
<div class="col-auto col-3 mw-100 mb-2" t-if="o.invoice_date" name="invoice_date">
<strong>Invoice Date:</strong>
<p class="m-0" t-field="o.invoice_date"/>
</div>
<div class="col-auto col-3 mw-100 mb-2" t-if="o.invoice_date_due and o.move_type == 'out_invoice' and o.state == 'posted'" name="due_date">
<strong>Due Date:</strong>
<p class="m-0" t-field="o.invoice_date_due"/>
</div>
<div class="col-auto col-3 mw-100 mb-2" t-if="o.invoice_origin" name="origin">
<strong>Source:</strong>
<p class="m-0" t-field="o.invoice_origin"/>
</div>
<div class="col-auto col-3 mw-100 mb-2" t-if="o.partner_id.ref" name="customer_code">
<strong>Customer Code:</strong>
<p class="m-0" t-field="o.partner_id.ref"/>
</div>
<div class="col-auto col-3 mw-100 mb-2" t-if="o.ref" name="reference">
<strong>Reference:</strong>
<p class="m-0" t-field="o.ref"/>
</div>
</div>
<t t-set="display_discount" t-value="any(l.discount for l in o.invoice_line_ids)"/>
<table class="table table-sm o_main_table" name="invoice_line_table">
<thead>
<tr>
<th name="th_description" class="text-left"><span>Description</span></th>
<th name="th_quantity" class="text-right"><span>Quantity</span></th>
<th name="th_priceunit" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Unit Price</span></th>
<th name="th_price_unit" t-if="display_discount" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span>Disc.%</span>
</th>
<th name="th_taxes" t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}"><span>Taxes</span></th>
<th name="th_subtotal" class="text-right">
<span groups="account.group_show_line_subtotals_tax_excluded">Amount</span>
<span groups="account.group_show_line_subtotals_tax_included">Total Price</span>
</th>
</tr>
</thead>
<tbody class="invoice_tbody">
<t t-set="current_subtotal" t-value="0"/>
<t t-set="lines" t-value="o.invoice_line_ids.sorted(key=lambda l: (-l.sequence, l.date, l.move_name, -l.id), reverse=True)"/>
<t t-foreach="lines" t-as="line">
<t t-set="current_subtotal" t-value="current_subtotal + line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<t t-set="current_subtotal" t-value="current_subtotal + line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
<tr t-att-class="'bg-200 font-weight-bold o_line_section' if line.display_type == 'line_section' else 'font-italic o_line_note' if line.display_type == 'line_note' else ''">
<t t-if="not line.display_type" name="account_invoice_line_accountable">
<td name="account_invoice_line_name"><span t-field="line.name" t-options="{'widget': 'text'}"/></td>
<td class="text-right">
<span t-field="line.quantity"/>
<span t-field="line.product_uom_id" groups="uom.group_uom"/>
</td>
<td t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span class="text-nowrap" t-field="line.price_unit"/>
</td>
<td t-if="display_discount" t-attf-class="text-right {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span class="text-nowrap" t-field="line.discount"/>
</td>
<td t-attf-class="text-left {{ 'd-none d-md-table-cell' if report_type == 'html' else '' }}">
<span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_ids))" id="line_tax_ids"/>
</td>
<td class="text-right o_price_total">
<span class="text-nowrap" t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
<span class="text-nowrap" t-field="line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
</td>
</t>
<t t-if="line.display_type == 'line_section'">
<td colspan="99">
<span t-field="line.name" t-options="{'widget': 'text'}"/>
</td>
<t t-set="current_section" t-value="line"/>
<t t-set="current_subtotal" t-value="0"/>
</t>
<t t-if="line.display_type == 'line_note'">
<td colspan="99">
<span t-field="line.name" t-options="{'widget': 'text'}"/>
</td>
</t>
</tr>
<t t-if="current_section and (line_last or lines[line_index+1].display_type == 'line_section')">
<tr class="is-subtotal text-right">
<td colspan="99">
<strong class="mr16">Subtotal</strong>
<span
t-esc="current_subtotal"
t-options='{"widget": "monetary", "display_currency": o.currency_id}'
/>
</td>
</tr>
</t>
</t>
</tbody>
</table>
<div class="clearfix">
<div id="total" class="row">
<div t-attf-class="#{'col-6' if report_type != 'html' else 'col-sm-7 col-md-6'} ml-auto">
<table class="table table-sm" style="page-break-inside: avoid;">
<tr class="border-black o_subtotal" style="">
<td><strong>Subtotal</strong></td>
<td class="text-right">
<span t-field="o.amount_untaxed"/>
</td>
</tr>
<t t-foreach="o.amount_by_group" t-as="amount_by_group">
<tr style="">
<t t-if="len(o.line_ids.filtered(lambda line: line.tax_line_id)) in [0, 1] and o.amount_untaxed == amount_by_group[2]">
<td><span class="text-nowrap" t-esc="amount_by_group[0]"/></td>
<td class="text-right o_price_total">
<span class="text-nowrap" t-esc="amount_by_group[3]" />
</td>
</t>
<t t-else="">
<td>
<span t-esc="amount_by_group[0]"/>
<span class="text-nowrap"> on
<t t-esc="amount_by_group[4]"/>
</span>
</td>
<td class="text-right o_price_total">
<span class="text-nowrap" t-esc="amount_by_group[3]"/>
</td>
</t>
</tr>
</t>
<tr class="border-black o_total">
<td><strong>Total</strong></td>
<td class="text-right">
<span class="text-nowrap" t-field="o.amount_total"/>
</td>
</tr>
<t t-if="print_with_payments">
<t t-if="o.payment_state != 'invoicing_legacy'">
<t t-set="payments_vals" t-value="o.sudo()._get_reconciled_info_JSON_values()"/>
<t t-foreach="payments_vals" t-as="payment_vals">
<tr>
<td>
<i class="oe_form_field text-right oe_payment_label">Paid on <t t-esc="payment_vals['date']" t-options='{"widget": "date"}'/></i>
</td>
<td class="text-right">
<span t-esc="payment_vals['amount']" t-options='{"widget": "monetary", "display_currency": o.currency_id}'/>
</td>
</tr>
</t>
<t t-if="len(payments_vals) > 0">
<tr class="border-black">
<td><strong>Amount Due</strong></td>
<td class="text-right">
<span t-field="o.amount_residual"/>
</td>
</tr>
</t>
</t>
</t>
</table>
</div>
</div>
</div>
<p t-if="o.move_type in ('out_invoice', 'in_refund') and o.payment_reference" name="payment_communication">
Please use the following communication for your payment : <b><span t-field="o.payment_reference"/></b>
</p>
<p t-if="o.invoice_payment_term_id" name="payment_term">
<span t-field="o.invoice_payment_term_id.note"/>
</p>
<p t-if="o.narration" name="comment">
<span t-field="o.narration"/>
</p>
<p t-if="o.fiscal_position_id.note" name="note">
<span t-field="o.fiscal_position_id.note"/>
</p>
<p t-if="o.invoice_incoterm_id" name="incoterm">
<strong>Incoterm: </strong><span t-field="o.invoice_incoterm_id.code"/> - <span t-field="o.invoice_incoterm_id.name"/>
</p>
<div id="qrcode" t-if="o.display_qr_code">
<p t-if="qr_code_urls.get(o.id)">
<strong class="text-center">Scan me with your banking app.</strong><br/><br/>
<img class="border border-dark rounded" t-att-src="qr_code_urls[o.id]"/>
</p>
</div>
<t t-if="mi_type == 'text'">
<div t-if="txt_position == 'body'" t-att-style="txt_style">
<span t-esc="mi.copy_name" />
</div>
</t>
</div>
</t>
</template>
<template id="report_multiple_invoice">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-set="lang" t-value="o.invoice_user_id.sudo().lang if o.move_type in ('in_invoice', 'in_refund') else o.partner_id.lang"/>
<t t-set="print_with_payments" t-value="True"/>
<t t-if="o._get_name_invoice_report() == 'account.report_invoice_document'"
t-call="account.report_invoice_document" t-lang="lang"/>
<t t-foreach="mi_ids" t-as="mi">
<t t-call="base_accounting_kit.report_multiple_invoice_new" t-lang="lang"/>
</t>
</t>
</t>
</template>
<record id="report_multiple_invoice_copies" model="ir.actions.report">
<field name="name">Multiple Invoice Copies</field>
<field name="model">account.move</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">base_accounting_kit.report_multiple_invoice</field>
<field name="report_file">base_accounting_kit.report_multiple_invoice</field>
<field name="binding_model_id" ref="account.model_account_move"/>
<field name="binding_type">report</field>
</record>
</odoo>

5
base_accounting_kit/security/ir.model.access.csv

@ -37,4 +37,7 @@ access_account_report_partner_ledger,access.account.report.partner.ledger,model_
access_account_common_account_report,access.account.common.account.report,model_account_common_account_report,account.group_account_user,1,1,1,1
access_kit_account_tax_report,access.kit.account.tax.report,model_kit_account_tax_report,account.group_account_user,1,1,1,1
access_account_balance_report,access.account.balance.report,model_account_balance_report,account.group_account_user,1,1,1,1
access_account_recurring_entries_line,access.account.recurring.entries.line,model_account_recurring_entries_line,account.group_account_user,1,1,1,1
access_account_recurring_entries_line,access.account.recurring.entries.line,model_account_recurring_entries_line,account.group_account_user,1,1,1,1
access_multiple_invoice,multiple_invoice,model_multiple_invoice,account.group_account_manager,1,1,1,1
access_multiple_invoice_layout,multiple_invoice_layout,model_multiple_invoice_layout,account.group_account_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
37 access_account_balance_report access.account.balance.report model_account_balance_report account.group_account_user 1 1 1 1
38 access_account_recurring_entries_line access.account.recurring.entries.line model_account_recurring_entries_line account.group_account_user 1 1 1 1
39 access_multiple_invoice multiple_invoice model_multiple_invoice account.group_account_manager 1 1 1 1
40 access_multiple_invoice_layout multiple_invoice_layout model_multiple_invoice_layout account.group_account_manager 1 1 1 1
41
42
43

BIN
base_accounting_kit/static/description/banner.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 122 KiB

BIN
base_accounting_kit/static/description/images/mi_image1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

BIN
base_accounting_kit/static/description/images/mi_image2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

BIN
base_accounting_kit/static/description/images/mi_image3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

BIN
base_accounting_kit/static/description/images/mi_image5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
base_accounting_kit/static/description/images/mi_image6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
base_accounting_kit/static/description/images/multiple_invoice_banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
base_accounting_kit/static/description/images/multiple_invoice_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

264
base_accounting_kit/static/description/index.html

@ -12,41 +12,45 @@
<ul style=" padding: 0 1px; list-style: none;">
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Translation Added <br/>
Multiple Invoice Copies option Added <br/>
</li>
<ul>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Arabic
Translation Added <br/>
</li>
<ul>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Arabic
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
German (CH) / Deutsch (CH)
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Spanish (AR) / Espanol (AR)
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
German (CH) / Deutsch (CH)
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
French (BE) / Francais (BE)
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Spanish (AR) / Espanol (AR)
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Ukrainian <br />
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
French (BE) / Francais (BE)
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Chinese (HK)
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Ukrainian <br/>
</li>
</ul>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Chinese (HK)
</li>
</ul>
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 19px; list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
@ -63,44 +67,100 @@
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;"></li>
</ul>
<div style=" margin: 0 0 0px;padding: 20px 0 10;font-size: 23px;line-height: 35px;font-weight: 400;color: #000;border-top: 1px solid rgba(255,255,255,0.1);border-bottom: 1px solid rgba(255,255,255,0.11);text-align: left;">
<h1 style="font-size: 39px;font-weight: 600;margin: 0px !important;">Odoo 14 Accounting</h1>
<h3 style="font-size: 21px;margin-top: 8px;position: relative;">Dashboard, Asset Management, Accounting
Reports, PDC Management,
Account Lock dates, Customer Credit Limit and Follow Ups, Day book,
Bank book and Cash book reports in Odoo 14 community edition.</h3>
<h1 style="font-size: 39px;font-weight: 600;margin: 0px !important;">Odoo 14 Accounting Kit Features</h1>
</div>
<h2 style="font-weight: 600;font-size: 1.8rem;margin-top: 15px;">Key Highlights</h2>
<ul style=" padding: 0 1px; list-style: none; ">
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;">
<div>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Asset management system.
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;">
Multiple Invoice Copies option.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Handle Post Dated Cheques.
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;">
Reconciliation Widget
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Accounting lock dates.
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;">
Accounting Dashboard with all necessary details.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Handle Recurring payments.
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;">
Asset management system for Odoo 14 community edition.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Customer credit limit and customer follow-up.
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;">
PDC management is now in.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
All Accounting reports.
</li>
<li style="display: flex;align-items: center;padding: 8px 0;font-size: 18px; list-style: none;">
Accounting lock dates for Odoo 14 community edition.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Customer credit limit.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Handle Recurring payments in Odoo.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Manage Customer follow-ups.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Multiple Invoice Copies.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Day book, Bank book and Cash book reports.
</li>
</ul>
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Financial reports.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Trial balance report.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Journal audit report.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
General ledger report.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Partner ledger report.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Aged partner balance.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Tax reports.
</p>
</div>
</div>
<div class="col-md-5 col-sm-12 col-xs-12"><img src="images/accounting_kit_window.gif" class="img-responsive" alt="">
</div>
@ -669,6 +729,7 @@
</div>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
style="float: left;">
@ -685,6 +746,95 @@
</div>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
style="float: left;">
<h3 class="alert"
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
<i class="fa fa-check-circle-o"
style="width:40px; color:#07B700;"></i>
Configure Multiple Invoice Copies from Accounting >
Configuration > Journals > Advanced Settings.
</h3>
<div style="">
<img class="img img-responsive center-block"
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
src="images/mi_image1.png">
</div>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
style="float: left;">
<h3 class="alert"
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
<i class="fa fa-check-circle-o"
style="width:40px; color:#07B700;"></i>
Multiple Invoice Copies Layout Configurator.
</h3>
<div style="">
<img class="img img-responsive center-block"
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
src="images/mi_image2.png">
</div>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
style="float: left;">
<h3 class="alert"
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
<i class="fa fa-check-circle-o"
style="width:40px; color:#07B700;"></i>
Multiple Invoice Copies print button inside the invoice.
</h3>
<div style="">
<img class="img img-responsive center-block"
style="border-top-left-radius: 10px;border-top-right-radius: 10px;"
src="images/mi_image3.png">
</div>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
style="float: left;">
<h3 class="alert"
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
<i class="fa fa-check-circle-o"
style="width:40px; color:#07B700;"></i>
Sample Multiple Invoice Copy with Watermark Display Type.
</h3>
<div style="">
<img class="img img-responsive center-block"
style="border-top-left-radius: 10px;border-top-right-radius: 10px; border: 2px solid black;"
src="images/mi_image5.png">
</div>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-12 col-md-12 mb16 mt16"
style="float: left;">
<h3 class="alert"
style="font-weight:400;color: #091E42;background: #fff;text-align: left;border-radius: 0; font-size: 18px;">
<i class="fa fa-check-circle-o"
style="width:40px; color:#07B700;"></i>
Sample Multiple Invoice Copy with Text Display Type.
</h3>
<div style="">
<img class="img img-responsive center-block"
style="border-top-left-radius: 10px;border-top-right-radius: 10px; border: 2px solid black;"
src="images/mi_image6.png">
</div>
</div>
</div>
</div>
@ -746,6 +896,11 @@
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Manage Customer follow-ups.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
Multiple Invoice Copies.
</p>
<p class="mb8"
style="font-family: Roboto;color: #000;list-style-type: square;font-size: 19px;line-height: 50px; background-color: #3a34380d;padding-left: 20px;border-radius: 7px;list-style: none;">
<i class="fa fa-check-circle-o" style="width:40px; color:#07B700;"></i>
@ -787,6 +942,7 @@
Tax reports.
</p>
</div>
@ -810,8 +966,8 @@
In community edition, we have only limited features available under Odoo accounting. Here
comes the use of the module Odoo14 Full Accounting Kit by Cybrosys Technologies which is
built under the V14 platform. This module will bring back the accounting features such as
Asset management, Accounting Reports, PDC Management, Account Lock dates, Customer Credit
Limit, and Follow-Ups, Daybook, Bankbook, and Cashbook reports.
Asset management, Accounting Reports, PDC Management, Account Lock dates, Multiple Invoice
Copies, Customer Credit Limit, and Follow-Ups, Daybook, Bankbook, and Cashbook reports.
</h3>

33
base_accounting_kit/views/multiple_invoice_form.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="multiple_invoice_view_form" model="ir.ui.view">
<field name="name">multiple.invoice.form.inherit.account.journal</field>
<field name="model">account.journal</field>
<field name="inherit_id" ref="account.view_account_journal_form" />
<field name="arch" type="xml">
<page name="advanced_settings" position="inside">
<group string="Multiple Invoice Copies" attrs="{'invisible': [('type', 'not in',['sale', 'purchase'])]}">
<field name="multiple_invoice_type" style="width: 40%"/>
</group>
<group attrs="{'invisible': [('type', 'not in',['sale', 'purchase'])]}">
<div class="mt8">
<button name="%(base_accounting_kit.action_multiple_invoice_layout_configurator)d" string="Configure Copy Layout" type="action" class="oe_link" icon="fa-arrow-right"/>
</div>
</group>
<group attrs="{'invisible': [('type', 'not in',['sale', 'purchase'])]}">
<div>
<field name="multiple_invoice_ids" widget="one2many" nolabel="1">
<tree editable="bottom">
<field name="sequence" widget="handle"/>
<field name="copy_name" style="width: 75"/>
</tree>
</field>
</div>
</group>
</page>
</field>
</record>
</odoo>

44
base_accounting_kit/views/multiple_invoice_layout_view.xml

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_multiple_invoice_layout" model="ir.ui.view">
<field name="name">Document Layout</field>
<field name="model">multiple.invoice.layout</field>
<field name="arch" type="xml">
<form class="o_document_layout">
<group>
<group class="o_document_layout_company">
<field name="company_id" invisible="1"/>
<field name="journal_id" invisible="1"/>
<field name="multiple_invoice_type"/>
<field name="text_position" widget="selection"
attrs="{'invisible': [('multiple_invoice_type', '!=', 'text')]}"/>
<field name="body_text_position" widget="radio"
attrs="{'invisible': ['|', ('multiple_invoice_type', '!=', 'text'),
('text_position', '!=', 'body')]}"/>
<field name="text_align" widget="radio" string="Text Align"
attrs="{'invisible': ['|', ('multiple_invoice_type', '!=', 'text'),
('text_position', 'not in', ['header', 'footer'])]}"/>
</group>
<div>
<field name="preview" widget="iframe_wrapper" />
</div>
</group>
<footer>
<button string="Save" class="btn-primary" type="object" name="document_layout_save"/>
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
</record>
<record id="action_multiple_invoice_layout_configurator" model="ir.actions.act_window">
<field name="type">ir.actions.act_window</field>
<field name="name">Configure Copy layout</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="res_model">multiple.invoice.layout</field>
<field name="view_id" ref="base_accounting_kit.view_multiple_invoice_layout"/>
</record>
</odoo>
Loading…
Cancel
Save