diff --git a/mis_builder_cash_flow_forecast_sale/README.rst b/mis_builder_cash_flow_forecast_sale/README.rst new file mode 100644 index 0000000..119de88 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/README.rst @@ -0,0 +1,61 @@ +=================================== +Mis Builder Cash Flow Forecast Sale +=================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f4b5b7796902a87631304fe7057f4a6cab7707472417788cc1a2ab21234e5e34 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-Escodoo%2Faccount--addons-lightgray.png?logo=github + :target: https://github.com/Escodoo/account-addons/tree/16.0/mis_builder_cash_flow_forecast_sale + :alt: Escodoo/account-addons + +|badge1| |badge2| |badge3| + + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Escodoo + +Contributors +~~~~~~~~~~~~ + +* `Escodoo `_: + + * Marcel Savegnago + +Maintainers +~~~~~~~~~~~ + +This module is part of the `Escodoo/account-addons `_ project on GitHub. + +You are welcome to contribute. diff --git a/mis_builder_cash_flow_forecast_sale/__init__.py b/mis_builder_cash_flow_forecast_sale/__init__.py new file mode 100644 index 0000000..1d353d7 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/__init__.py @@ -0,0 +1,2 @@ +from .hooks import post_init_hook +from . import models diff --git a/mis_builder_cash_flow_forecast_sale/__manifest__.py b/mis_builder_cash_flow_forecast_sale/__manifest__.py new file mode 100644 index 0000000..b0e19b9 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2022 - TODAY, Escodoo +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Mis Builder Cash Flow Forecast Sale", + "summary": """ + MIS Builder Cash Flow Forecast - Sale""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "Escodoo", + "website": "https://github.com/Escodoo/account-addons", + "depends": [ + "mis_builder_cash_flow_forecast_integration", + "sale_management", + "queue_job", + ], + "data": [ + "views/res_config_settings.xml", + "views/sale_order.xml", + "data/ir_cron.xml", + ], + "demo": [], +} diff --git a/mis_builder_cash_flow_forecast_sale/data/ir_cron.xml b/mis_builder_cash_flow_forecast_sale/data/ir_cron.xml new file mode 100644 index 0000000..ec7ca5c --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/data/ir_cron.xml @@ -0,0 +1,18 @@ + + + + + MIS Builder Cash Flow - Generate Forecast - Sale Order + + code + model.cron_mis_cash_flow_generate_forecast_lines() + + 1 + days + -1 + + + + diff --git a/mis_builder_cash_flow_forecast_sale/hooks.py b/mis_builder_cash_flow_forecast_sale/hooks.py new file mode 100644 index 0000000..5752de8 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/hooks.py @@ -0,0 +1,12 @@ +# Copyright (C) 2022 - TODAY, Marcel Savegnago +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from odoo import SUPERUSER_ID, api + + +def post_init_hook(cr, registry): + + env = api.Environment(cr, SUPERUSER_ID, {}) + orders = env["sale.order"].search([("state", "in", ["sale", "done"])]) + if orders: + orders.sudo()._compute_forecast_uninvoiced_amount() diff --git a/mis_builder_cash_flow_forecast_sale/i18n/mis_builder_cash_flow_forecast_sale.pot b/mis_builder_cash_flow_forecast_sale/i18n/mis_builder_cash_flow_forecast_sale.pot new file mode 100644 index 0000000..0dc1a95 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/i18n/mis_builder_cash_flow_forecast_sale.pot @@ -0,0 +1,130 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mis_builder_cash_flow_forecast_sale +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mis_builder_cash_flow_forecast_sale +#: model_terms:ir.ui.view,arch_db:mis_builder_cash_flow_forecast_sale.res_config_settings_view_form +msgid "" +"" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model_terms:ir.ui.view,arch_db:mis_builder_cash_flow_forecast_sale.view_order_form +msgid "" +"Cash Flow Forecast\n" +" " +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: code:addons/mis_builder_cash_flow_forecast_sale/models/sale_order.py:0 +#, python-format +msgid "Cash Flow Forecast - Sale" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model,name:mis_builder_cash_flow_forecast_sale.model_res_company +msgid "Companies" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model,name:mis_builder_cash_flow_forecast_sale.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_account_move__display_name +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_company__display_name +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order__display_name +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order_line__display_name +msgid "Display Name" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_company__enable_sale_mis_cash_flow_forecast +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_config_settings__enable_sale_mis_cash_flow_forecast +msgid "Enable MIS Builder Cash Flow Forecast - Sale" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model_terms:ir.ui.view,arch_db:mis_builder_cash_flow_forecast_sale.res_config_settings_view_form +msgid "Enable MIS Builder Cash Flow Gernerate Sale Forecast" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order__mis_cash_flow_forecast_line_ids +msgid "Forecast Line" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order__mis_cash_flow_forecast_line_count +msgid "Forecast Line Count" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order__forecast_uninvoiced_amount +msgid "Forecast Uninvoiced Amount" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_account_move__id +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_company__id +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_config_settings__id +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order__id +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order_line__id +msgid "ID" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model,name:mis_builder_cash_flow_forecast_sale.model_account_move +msgid "Journal Entry" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_account_move____last_update +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_company____last_update +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_res_config_settings____last_update +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order____last_update +#: model:ir.model.fields,field_description:mis_builder_cash_flow_forecast_sale.field_sale_order_line____last_update +msgid "Last Modified on" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.actions.server,name:mis_builder_cash_flow_forecast_sale.cron_mis_cash_flow_generate_forecast_lines_ir_actions_server +#: model:ir.cron,cron_name:mis_builder_cash_flow_forecast_sale.cron_mis_cash_flow_generate_forecast_lines +#: model:ir.cron,name:mis_builder_cash_flow_forecast_sale.cron_mis_cash_flow_generate_forecast_lines +msgid "MIS Builder Cash Flow - Generate Forecast - Sale Order" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model_terms:ir.ui.view,arch_db:mis_builder_cash_flow_forecast_sale.view_order_form +msgid "MIS Builder Cash Flow Forecast" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model,name:mis_builder_cash_flow_forecast_sale.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model:ir.model,name:mis_builder_cash_flow_forecast_sale.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: mis_builder_cash_flow_forecast_sale +#: model_terms:ir.ui.view,arch_db:mis_builder_cash_flow_forecast_sale.view_order_tree +msgid "Total Forecast Uninvoiced Amount" +msgstr "" diff --git a/mis_builder_cash_flow_forecast_sale/models/__init__.py b/mis_builder_cash_flow_forecast_sale/models/__init__.py new file mode 100644 index 0000000..c36dfda --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/models/__init__.py @@ -0,0 +1,5 @@ +from . import res_company +from . import res_config_settings +from . import sale_order_line +from . import sale_order +from . import account_invoice diff --git a/mis_builder_cash_flow_forecast_sale/models/account_invoice.py b/mis_builder_cash_flow_forecast_sale/models/account_invoice.py new file mode 100644 index 0000000..61a7f3f --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/models/account_invoice.py @@ -0,0 +1,45 @@ +# Copyright 2022 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class AccountMove(models.Model): + + _inherit = "account.move" + + def action_post(self): + res = super().action_post() + for move in self: + order = move.invoice_line_ids.mapped("sale_line_ids.order_id") + if order and order.company_id.enable_sale_mis_cash_flow_forecast: + order.with_delay()._generate_mis_cash_flow_forecast_lines() + return res + + def button_cancel(self): + res = super().button_cancel() + for move in self: + order = move.invoice_line_ids.mapped("sale_line_ids.order_id") + if order and order.company_id.enable_sale_mis_cash_flow_forecast: + order._compute_forecast_uninvoiced_amount() + order.with_delay()._generate_mis_cash_flow_forecast_lines() + return res + + def button_draft(self): + res = super().button_draft() + for move in self: + order = move.invoice_line_ids.mapped("sale_line_ids.order_id") + if order and order.company_id.enable_sale_mis_cash_flow_forecast: + order._compute_forecast_uninvoiced_amount() + order.with_delay()._generate_mis_cash_flow_forecast_lines() + return res + + @api.model + def create(self, vals_list): + moves = super().create(vals_list) + for move in moves: + order = move.invoice_line_ids.mapped("sale_line_ids.order_id") + if order and order.company_id.enable_sale_mis_cash_flow_forecast: + order._compute_forecast_uninvoiced_amount() + order.with_delay()._generate_mis_cash_flow_forecast_lines() + return moves diff --git a/mis_builder_cash_flow_forecast_sale/models/res_company.py b/mis_builder_cash_flow_forecast_sale/models/res_company.py new file mode 100644 index 0000000..a0682bf --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/models/res_company.py @@ -0,0 +1,13 @@ +# Copyright 2022 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + + _inherit = "res.company" + + enable_sale_mis_cash_flow_forecast = fields.Boolean( + string="Enable MIS Builder Cash Flow Forecast - Sale", default=True + ) diff --git a/mis_builder_cash_flow_forecast_sale/models/res_config_settings.py b/mis_builder_cash_flow_forecast_sale/models/res_config_settings.py new file mode 100644 index 0000000..977f53c --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/models/res_config_settings.py @@ -0,0 +1,15 @@ +# Copyright 2022 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = "res.config.settings" + + enable_sale_mis_cash_flow_forecast = fields.Boolean( + string="Enable MIS Builder Cash Flow Forecast - Sale", + readonly=False, + related="company_id.enable_sale_mis_cash_flow_forecast", + ) diff --git a/mis_builder_cash_flow_forecast_sale/models/sale_order.py b/mis_builder_cash_flow_forecast_sale/models/sale_order.py new file mode 100644 index 0000000..b192300 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/models/sale_order.py @@ -0,0 +1,267 @@ +# Copyright 2022 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import _, api, fields, models + + +class SaleOrder(models.Model): + + _inherit = "sale.order" + + forecast_uninvoiced_amount = fields.Monetary( + readonly=True, + compute="_compute_forecast_uninvoiced_amount", + store=True, + ) + + mis_cash_flow_forecast_line_ids = fields.One2many( + comodel_name="mis.cash_flow.forecast_line", + compute="_compute_mis_cash_flow_forecast_line_ids", + string="Forecast Line", + required=False, + ) + + mis_cash_flow_forecast_line_count = fields.Integer( + compute="_compute_mis_cash_flow_forecast_line_ids", + string="Forecast Line Count", + ) + + @api.depends( + "partner_id", + "amount_total", + "pricelist_id", + "currency_id", + "order_line.invoice_lines", + "order_line.qty_invoiced", + "invoice_ids", + ) + def _compute_forecast_uninvoiced_amount(self): + for order in self: + amount_invoiced = sum( + x.amount_total + for x in order.invoice_ids.filtered( + lambda x: x.state in ["draft", "posted"] + ) + ) + forecast_uninvoiced_amount = order.amount_total - amount_invoiced + if forecast_uninvoiced_amount < 0 or order.state in [ + "cancel", + ]: + forecast_uninvoiced_amount = 0 + if order.forecast_uninvoiced_amount != forecast_uninvoiced_amount: + order.update( + { + "forecast_uninvoiced_amount": order.currency_id.round( + forecast_uninvoiced_amount + ) + } + ) + + def _compute_mis_cash_flow_forecast_line_ids(self): + ForecastLine = self.env["mis.cash_flow.forecast_line"] + forecast_lines = ForecastLine.search( + [ + ("res_model", "=", self._name), + ("res_id", "in", self.ids), + ] + ) + + result = dict.fromkeys(self.ids, ForecastLine) + for forecast in forecast_lines: + result[forecast.res_id] |= forecast + + for rec in self: + rec.mis_cash_flow_forecast_line_ids = result[rec.id] + rec.mis_cash_flow_forecast_line_count = len( + rec.mis_cash_flow_forecast_line_ids + ) + + def _compute_payment_terms(self, date, total_balance, total_amount_currency): + """Compute the payment terms. + :param self: The current account.move record. + :param date: The date computed by + '_get_payment_terms_computation_date'. + :param total_balance: The invoice's total in company's currency. + :param total_amount_currency: The invoice's total in invoice's currency. + :return: A list . + """ + if self.payment_term_id: + to_compute = self.payment_term_id.compute( + total_balance, date_ref=date, currency=self.company_id.currency_id + ) + if self.currency_id == self.company_id.currency_id: + # Single-currency. + return [(b[0], b[1], b[1]) for b in to_compute] + else: + # Multi-currencies. + to_compute_currency = self.payment_term_id.compute( + total_amount_currency, date_ref=date, currency=self.currency_id + ) + return [ + (b[0], b[1], ac[1]) + for b, ac in zip(to_compute, to_compute_currency) + ] + else: + return [(fields.Date.to_string(date), total_balance, total_amount_currency)] + + def _compute_amount_uninvoiced_company_currency(self, amount_uninvoiced): + if ( + self.currency_id + and self.company_id + and self.currency_id != self.company_id.currency_id + ): + cur = self.currency_id + price_subtotal = cur.round(amount_uninvoiced) + rate_date = self.expected_date or fields.Date.today() + amount_uninvoiced = cur._convert( + price_subtotal, + self.company_id.currency_id, + self.company_id, + rate_date, + ) + return amount_uninvoiced + + @api.model + def _get_mis_cash_flow_forecast_update_trigger_fields(self): + return [ + "partner_id", + "pricelist_id", + "fiscal_position_id", + "currency_id", + "order_line", + "payment_term_id", + "currency_rate", + "invoice_status", + "state", + "invoice_ids", + "invoice_count", + ] + + def write(self, values): + res = super(SaleOrder, self).write(values) + if any( + [ + field in values + for field in self._get_mis_cash_flow_forecast_update_trigger_fields() + ] + ): + for rec in self: + if ( + values.get("state") in ["sale", "done", "cancel"] + or rec.state in ["sale", "done"] + and rec.company_id.enable_sale_mis_cash_flow_forecast + ): + rec.with_delay()._generate_mis_cash_flow_forecast_lines() + return res + + def unlink(self): + for rec in self: + if rec.mis_cash_flow_forecast_line_ids: + rec.mis_cash_flow_forecast_line_ids.unlink() + return super().unlink() + + def _prepare_mis_cash_flow_forecast_line( + self, payment_term_item, payment_term_count, date, amount + ): + self.ensure_one() + parent_res_id = self + parent_res_model_id = self.env["ir.model"]._get(parent_res_id._name) + + partner = self.partner_id.with_company(self.company_id) + account_id = partner.property_account_receivable_id + if account_id.company_id.id != self.company_id.id: + account_id = self.company_id.partner_id.property_account_receivable_id + + return { + "name": "%s - %s/%s" + % ( + self.display_name, + payment_term_item, + payment_term_count, + ), + "date": date, + "account_id": account_id.id, + "partner_id": self.partner_id.id, + "balance": amount, + "company_id": self.company_id.id, + "res_model_id": self.env["ir.model"]._get(self._name).id, + "res_id": self.id, + "parent_res_model_id": parent_res_model_id.id, + "parent_res_id": parent_res_id.id, + } + + def _generate_mis_cash_flow_forecast_lines(self): + values = [] + for rec in self: + rec.mis_cash_flow_forecast_line_ids.unlink() + if rec.forecast_uninvoiced_amount and rec.state in ["sale", "done"]: + sign = 1 + amount_uninvoiced = rec.forecast_uninvoiced_amount * sign + + if ( + rec.currency_id + and rec.company_id + and rec.currency_id != rec.company_id.currency_id + ): + cur = rec.currency_id + amount_uninvoiced = cur.round(amount_uninvoiced) + + amount_uninvoiced_company = ( + rec._compute_amount_uninvoiced_company_currency(amount_uninvoiced) + ) + payment_terms = rec._compute_payment_terms( + rec.expected_date, + amount_uninvoiced_company, + amount_uninvoiced, + ) + + payment_term_count = len(payment_terms) + payment_term_line = 0 + + for payment_term in payment_terms: + payment_term_line += 1 + new_vals = rec._prepare_mis_cash_flow_forecast_line( + payment_term_line, + payment_term_count, + payment_term[0], + payment_term[1], + ) + values.append(new_vals) + + return self.env["mis.cash_flow.forecast_line"].create(values) + + @api.model + def cron_mis_cash_flow_generate_forecast_lines(self): + offset = 0 + while True: + orders = self.search( + [ + ("forecast_uninvoiced_amount", ">", 0), + ("state", "in", ["sale", "done"]), + ], + limit=100, + offset=offset, + ) + orders.with_delay()._generate_mis_cash_flow_forecast_lines() + if len(orders) < 100: + break + offset += 100 + + def action_show_mis_forecast(self): + self.ensure_one() + context = dict(self.env.context) + context.pop("group_by", None) + + return { + "type": "ir.actions.act_window", + "name": _("Cash Flow Forecast - Sale"), + "res_model": "mis.cash_flow.forecast_line", + "domain": [ + ("parent_res_model", "=", self._name), + ("parent_res_id", "=", self.id), + ], + "view_mode": "pivot,tree", + "context": context, + } diff --git a/mis_builder_cash_flow_forecast_sale/models/sale_order_line.py b/mis_builder_cash_flow_forecast_sale/models/sale_order_line.py new file mode 100644 index 0000000..a2cd73d --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/models/sale_order_line.py @@ -0,0 +1,9 @@ +# Copyright 2022 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class SaleOrderLine(models.Model): + + _inherit = "sale.order.line" diff --git a/mis_builder_cash_flow_forecast_sale/readme/CONTRIBUTORS.rst b/mis_builder_cash_flow_forecast_sale/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..ae453a6 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Escodoo `_: + + * Marcel Savegnago diff --git a/mis_builder_cash_flow_forecast_sale/readme/DESCRIPTION.rst b/mis_builder_cash_flow_forecast_sale/readme/DESCRIPTION.rst new file mode 100644 index 0000000..e69de29 diff --git a/mis_builder_cash_flow_forecast_sale/readme/USAGE.rst b/mis_builder_cash_flow_forecast_sale/readme/USAGE.rst new file mode 100644 index 0000000..e69de29 diff --git a/mis_builder_cash_flow_forecast_sale/static/description/icon.png b/mis_builder_cash_flow_forecast_sale/static/description/icon.png new file mode 100644 index 0000000..12ab005 Binary files /dev/null and b/mis_builder_cash_flow_forecast_sale/static/description/icon.png differ diff --git a/mis_builder_cash_flow_forecast_sale/static/description/index.html b/mis_builder_cash_flow_forecast_sale/static/description/index.html new file mode 100644 index 0000000..fff650d --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/static/description/index.html @@ -0,0 +1,417 @@ + + + + + +Mis Builder Cash Flow Forecast Sale + + + +
+

Mis Builder Cash Flow Forecast Sale

+ + +

Beta License: AGPL-3 Escodoo/account-addons

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Escodoo
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the Escodoo/account-addons project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/mis_builder_cash_flow_forecast_sale/views/res_config_settings.xml b/mis_builder_cash_flow_forecast_sale/views/res_config_settings.xml new file mode 100644 index 0000000..c1b5849 --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/views/res_config_settings.xml @@ -0,0 +1,44 @@ + + + + + + res.config.settings in (mis_builder_cash_flow_forecast_sale) + res.config.settings + + + +
+
+
+ +
+
+
+
+
+
+
+
+ +
diff --git a/mis_builder_cash_flow_forecast_sale/views/sale_order.xml b/mis_builder_cash_flow_forecast_sale/views/sale_order.xml new file mode 100644 index 0000000..27b1dfa --- /dev/null +++ b/mis_builder_cash_flow_forecast_sale/views/sale_order.xml @@ -0,0 +1,51 @@ + + + + + + sale.order.form in (mis_builder_cash_flow_forecast_sale) + sale.order + + + + + + + + + + + + + + sale.order.tree in (mis_builder_cash_flow_forecast_sale) + sale.order + + + + + + + + diff --git a/setup/mis_builder_cash_flow_forecast_sale/odoo/addons/mis_builder_cash_flow_forecast_sale b/setup/mis_builder_cash_flow_forecast_sale/odoo/addons/mis_builder_cash_flow_forecast_sale new file mode 120000 index 0000000..0778740 --- /dev/null +++ b/setup/mis_builder_cash_flow_forecast_sale/odoo/addons/mis_builder_cash_flow_forecast_sale @@ -0,0 +1 @@ +../../../../mis_builder_cash_flow_forecast_sale \ No newline at end of file diff --git a/setup/mis_builder_cash_flow_forecast_sale/setup.py b/setup/mis_builder_cash_flow_forecast_sale/setup.py new file mode 100644 index 0000000..28c57bb --- /dev/null +++ b/setup/mis_builder_cash_flow_forecast_sale/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)