12 changed files with 679 additions and 0 deletions
@ -0,0 +1,24 @@ |
|||
Costing Method:Last Purchase Price |
|||
================================== |
|||
|
|||
This module introduces a new costing method to Odoo. That will update a product's cost price when a new purchase |
|||
happens with the purchasing rate. if you enables automatic stock valuation and provided a price difference account, |
|||
this module will generate stock journal entry to update the stock value according to the price change. |
|||
|
|||
Installation |
|||
============ |
|||
- www.odoo.com/documentation/12.0/setup/install.html |
|||
- Install our custom addon |
|||
|
|||
|
|||
Bug Tracker |
|||
=========== |
|||
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
|||
|
|||
Credits |
|||
======= |
|||
* Cybrosys Techno Solutions <https://www.cybrosys.com> |
|||
|
|||
Author |
|||
------ |
|||
* Fasluca <faslu@cybrosys.in> |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: fasluca(<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
from . import models |
|||
|
@ -0,0 +1,45 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################### |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2018-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: fasluca(<https://www.cybrosys.com>) |
|||
# |
|||
# This program is free software: you can modify |
|||
# it under the terms of the GNU Affero General Public License (AGPL) as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################### |
|||
|
|||
{ |
|||
'name': 'Costing method: Last Purchase Price', |
|||
'version': '12.0.1.0.0', |
|||
'category': 'Warehouse', |
|||
'summary': "Introducing new costing method in Odoo 'last purchase price'", |
|||
'author': 'Cybrosys Techno solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'website': 'https://www.openhrms.com', |
|||
'description': """ |
|||
""", |
|||
'depends': ['stock', |
|||
'stock_account', |
|||
'purchase' |
|||
], |
|||
'data': [], |
|||
'demo': [], |
|||
'images': ['static/description/banner.jpg'], |
|||
'license': 'AGPL-3', |
|||
'application': False, |
|||
'installable': True, |
|||
'auto_install': False, |
|||
} |
@ -0,0 +1,3 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from . import stock |
|||
from . import product |
@ -0,0 +1,159 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from odoo import api, fields, models, _ |
|||
from odoo.exceptions import UserError |
|||
from odoo.tools import float_is_zero |
|||
|
|||
|
|||
class ProductCategory(models.Model): |
|||
_inherit = "product.category" |
|||
|
|||
property_cost_method = fields.Selection([ |
|||
('standard', 'Standard Price'), |
|||
('last', 'Last Purchase Price'), |
|||
('fifo', 'First In First Out (FIFO)'), |
|||
('average', 'Average Cost (AVCO)')], string='Costing Method', |
|||
company_dependent=True, copy=True, |
|||
help="""Standard Price: The products are valued at their standard cost defined on the product. |
|||
Average Cost (AVCO): The products are valued at weighted average cost. |
|||
First In First Out (FIFO): The products are valued supposing those that enter the company first will also leave it first. |
|||
Last Purchase Price: The products are valued same as 'Standard Price' Method, But standard price defined on the product will updated automatically with last purchase price.""") |
|||
|
|||
|
|||
class ProductTemplate(models.Model): |
|||
_inherit = 'product.template' |
|||
|
|||
property_cost_method = fields.Selection([ |
|||
('standard', 'Standard Price'), |
|||
('last', 'Last Purchase Price'), |
|||
('fifo', 'First In First Out (FIFO)'), |
|||
('average', 'Average Cost (AVCO)')], string='Costing Method', |
|||
company_dependent=True, copy=True, |
|||
help="""Standard Price: The products are valued at their standard cost defined on the product. |
|||
Average Cost (AVCO): The products are valued at weighted average cost. |
|||
First In First Out (FIFO): The products are valued supposing those that enter the company first will also leave it first. |
|||
Last Purchase Price: The products are valued same as 'Standard Price' Method, But standard price defined on the product will be updated automatically with last purchase price.""") |
|||
|
|||
@api.one |
|||
def _set_cost_method(self): |
|||
# When going from FIFO to AVCO or to standard, we update the standard price with the |
|||
# average value in stock. |
|||
if self.property_cost_method == 'fifo' and self.cost_method in ['average', 'standard', 'last']: |
|||
# Cannot use the `stock_value` computed field as it's already invalidated when |
|||
# entering this method. |
|||
valuation = sum([variant._sum_remaining_values()[0] for variant in self.product_variant_ids]) |
|||
qty_available = self.with_context(company_owned=True).qty_available |
|||
if qty_available: |
|||
self.standard_price = valuation / qty_available |
|||
return self.write({'property_cost_method': self.cost_method}) |
|||
|
|||
|
|||
class ProductProduct(models.Model): |
|||
_inherit = 'product.product' |
|||
|
|||
@api.multi |
|||
def create_price_change_account_move(self, new_price, account_id, company_id, origin): |
|||
""" |
|||
""" |
|||
AccountMove = self.env['account.move'] |
|||
product_accounts = {product.id: product.product_tmpl_id.get_product_accounts() for product in self} |
|||
for product in self.with_context().filtered(lambda r: r.valuation == 'real_time'): |
|||
diff = product.standard_price - new_price |
|||
if float_is_zero(diff, precision_rounding=product.currency_id.rounding): |
|||
raise UserError(_("No difference between the standard price and the new price.")) |
|||
if not product_accounts[product.id].get('stock_valuation', False): |
|||
raise UserError(_('You don\'t have any stock valuation account defined on your product category. You must define one before processing this operation.')) |
|||
qty_available = product.qty_available |
|||
if qty_available: |
|||
# Accounting Entries |
|||
if diff * qty_available > 0: |
|||
debit_account_id = account_id |
|||
credit_account_id = product_accounts[product.id]['stock_valuation'].id |
|||
else: |
|||
debit_account_id = product_accounts[product.id]['stock_valuation'].id |
|||
credit_account_id = account_id |
|||
|
|||
move_vals = { |
|||
'journal_id': product_accounts[product.id]['stock_journal'].id, |
|||
'company_id': company_id, |
|||
'ref': product.default_code, |
|||
'line_ids': [(0, 0, { |
|||
'name': _('%s changed cost from %s to %s - %s') % (origin, product.standard_price, new_price, product.display_name), |
|||
'account_id': debit_account_id, |
|||
'debit': abs(diff * qty_available), |
|||
'credit': 0, |
|||
'product_id': product.id, |
|||
}), (0, 0, { |
|||
'name': _('%s changed cost from %s to %s - %s') % (origin, product.standard_price, new_price, product.display_name), |
|||
'account_id': credit_account_id, |
|||
'debit': 0, |
|||
'credit': abs(diff * qty_available), |
|||
'product_id': product.id, |
|||
})], |
|||
} |
|||
move = AccountMove.create(move_vals) |
|||
move.post() |
|||
return True |
|||
|
|||
@api.multi |
|||
@api.depends('stock_move_ids.product_qty', 'stock_move_ids.state', 'stock_move_ids.remaining_value', |
|||
'product_tmpl_id.cost_method', 'product_tmpl_id.standard_price', 'product_tmpl_id.property_valuation', |
|||
'product_tmpl_id.categ_id.property_valuation') |
|||
def _compute_stock_value(self): |
|||
StockMove = self.env['stock.move'] |
|||
to_date = self.env.context.get('to_date') |
|||
|
|||
self.env['account.move.line'].check_access_rights('read') |
|||
fifo_automated_values = {} |
|||
query = """SELECT aml.product_id, aml.account_id, sum(aml.debit) - sum(aml.credit), sum(quantity), array_agg(aml.id) |
|||
FROM account_move_line AS aml |
|||
WHERE aml.product_id IS NOT NULL AND aml.company_id=%%s %s |
|||
GROUP BY aml.product_id, aml.account_id""" |
|||
params = (self.env.user.company_id.id,) |
|||
if to_date: |
|||
query = query % ('AND aml.date <= %s',) |
|||
params = params + (to_date,) |
|||
else: |
|||
query = query % ('',) |
|||
self.env.cr.execute(query, params=params) |
|||
|
|||
res = self.env.cr.fetchall() |
|||
for row in res: |
|||
fifo_automated_values[(row[0], row[1])] = (row[2], row[3], list(row[4])) |
|||
|
|||
for product in self: |
|||
if product.cost_method in ['standard', 'average', 'last']: |
|||
qty_available = product.with_context(company_owned=True, owner_id=False).qty_available |
|||
price_used = product.standard_price |
|||
if to_date: |
|||
price_used = product.get_history_price( |
|||
self.env.user.company_id.id, |
|||
date=to_date, |
|||
) |
|||
product.stock_value = price_used * qty_available |
|||
product.qty_at_date = qty_available |
|||
elif product.cost_method == 'fifo': |
|||
if to_date: |
|||
if product.product_tmpl_id.valuation == 'manual_periodic': |
|||
domain = [('product_id', '=', product.id), |
|||
('date', '<=', to_date)] + StockMove._get_all_base_domain() |
|||
moves = StockMove.search(domain) |
|||
product.stock_value = sum(moves.mapped('value')) |
|||
product.qty_at_date = product.with_context(company_owned=True, owner_id=False).qty_available |
|||
product.stock_fifo_manual_move_ids = StockMove.browse(moves.ids) |
|||
elif product.product_tmpl_id.valuation == 'real_time': |
|||
valuation_account_id = product.categ_id.property_stock_valuation_account_id.id |
|||
value, quantity, aml_ids = fifo_automated_values.get((product.id, valuation_account_id)) or ( |
|||
0, 0, []) |
|||
product.stock_value = value |
|||
product.qty_at_date = quantity |
|||
product.stock_fifo_real_time_aml_ids = self.env['account.move.line'].browse(aml_ids) |
|||
else: |
|||
product.stock_value, moves = product._sum_remaining_values() |
|||
product.qty_at_date = product.with_context(company_owned=True, owner_id=False).qty_available |
|||
if product.product_tmpl_id.valuation == 'manual_periodic': |
|||
product.stock_fifo_manual_move_ids = moves |
|||
elif product.product_tmpl_id.valuation == 'real_time': |
|||
valuation_account_id = product.categ_id.property_stock_valuation_account_id.id |
|||
value, quantity, aml_ids = fifo_automated_values.get((product.id, valuation_account_id)) or ( |
|||
0, 0, []) |
|||
product.stock_fifo_real_time_aml_ids = self.env['account.move.line'].browse(aml_ids) |
@ -0,0 +1,107 @@ |
|||
# -*- coding: utf-8 -*- |
|||
from collections import defaultdict |
|||
|
|||
from odoo import api, models |
|||
from odoo.exceptions import UserError |
|||
from odoo.tools import float_is_zero |
|||
|
|||
|
|||
class StockMove(models.Model): |
|||
_inherit = "stock.move" |
|||
|
|||
@api.multi |
|||
def product_price_update_before_done(self, forced_qty=None): |
|||
tmpl_dict = defaultdict(lambda: 0.0) |
|||
# adapt standard price on incomming moves if the product cost_method is 'average' |
|||
std_price_update = {} |
|||
for move in self.filtered(lambda move: move.location_id.usage in ('supplier', 'production') and move.product_id.cost_method in ('average', 'last')): |
|||
product_tot_qty_available = move.product_id.qty_available + tmpl_dict[move.product_id.id] |
|||
rounding = move.product_id.uom_id.rounding |
|||
|
|||
qty_done = 0.0 |
|||
if float_is_zero(product_tot_qty_available, precision_rounding=rounding): |
|||
new_std_price = move._get_price_unit() |
|||
elif float_is_zero(product_tot_qty_available + move.product_qty, precision_rounding=rounding) or \ |
|||
float_is_zero(product_tot_qty_available + qty_done, precision_rounding=rounding): |
|||
new_std_price = move._get_price_unit() |
|||
else: |
|||
# Get the standard price |
|||
if move.product_id.cost_method == 'average': |
|||
amount_unit = std_price_update.get( |
|||
(move.company_id.id, move.product_id.id)) or move.product_id.standard_price |
|||
qty_done = move.product_uom._compute_quantity(move.quantity_done, move.product_id.uom_id) |
|||
qty = forced_qty or qty_done |
|||
new_std_price = ((amount_unit * product_tot_qty_available) + (move._get_price_unit() * qty)) / (product_tot_qty_available + qty_done) |
|||
if move.product_id.cost_method == 'last' and move.product_id.valuation == 'real_time': |
|||
new_std_price = move._get_price_unit() |
|||
products = self.env['product.product'].browse(move.product_id.id) |
|||
account_id = products.property_account_creditor_price_difference.id or products.categ_id.property_account_creditor_price_difference_categ.id |
|||
if not account_id: |
|||
raise UserError(_('Configuration error. Please configure the price difference account on the product or its category to process this operation.')) |
|||
products.create_price_change_account_move(new_std_price, account_id, move.company_id.id, move.origin) |
|||
tmpl_dict[move.product_id.id] += qty_done |
|||
# Write the standard price, as SUPERUSER_ID because a warehouse manager may not have the right to write on products |
|||
move.product_id.with_context(force_company=move.company_id.id).sudo().write({'standard_price': new_std_price}) |
|||
std_price_update[move.company_id.id, move.product_id.id] = new_std_price |
|||
|
|||
|
|||
class StockMoveLine(models.Model): |
|||
_inherit = 'stock.move.line' |
|||
|
|||
@api.multi |
|||
def write(self, vals): |
|||
""" When editing a done stock.move.line, we impact the valuation. Users may increase or |
|||
decrease the `qty_done` field. There are three cost method available: standard, average |
|||
and fifo. We implement the logic in a similar way for standard and average: increase |
|||
or decrease the original value with the standard or average price of today. In fifo, we |
|||
have a different logic wheter the move is incoming or outgoing. If the move is incoming, we |
|||
update the value and remaining_value/qty with the unit price of the move. If the move is |
|||
outgoing and the user increases qty_done, we call _run_fifo and it'll consume layer(s) in |
|||
the stack the same way a new outgoing move would have done. If the move is outoing and the |
|||
user decreases qty_done, we either increase the last receipt candidate if one is found or |
|||
we decrease the value with the last fifo price. |
|||
""" |
|||
if 'qty_done' in vals: |
|||
moves_to_update = {} |
|||
for move_line in self.filtered( |
|||
lambda ml: ml.state == 'done' and (ml.move_id._is_in() or ml.move_id._is_out())): |
|||
moves_to_update[move_line.move_id] = vals['qty_done'] - move_line.qty_done |
|||
|
|||
for move_id, qty_difference in moves_to_update.items(): |
|||
move_vals = {} |
|||
if move_id.product_id.cost_method in ['standard', 'average', 'last']: |
|||
correction_value = qty_difference * move_id.product_id.standard_price |
|||
if move_id._is_in(): |
|||
move_vals['value'] = move_id.value + correction_value |
|||
elif move_id._is_out(): |
|||
move_vals['value'] = move_id.value - correction_value |
|||
else: |
|||
if move_id._is_in(): |
|||
correction_value = qty_difference * move_id.price_unit |
|||
new_remaining_value = move_id.remaining_value + correction_value |
|||
move_vals['value'] = move_id.value + correction_value |
|||
move_vals['remaining_qty'] = move_id.remaining_qty + qty_difference |
|||
move_vals['remaining_value'] = move_id.remaining_value + correction_value |
|||
elif move_id._is_out() and qty_difference > 0: |
|||
correction_value = self.env['stock.move']._run_fifo(move_id, quantity=qty_difference) |
|||
# no need to adapt `remaining_qty` and `remaining_value` as `_run_fifo` took care of it |
|||
move_vals['value'] = move_id.value - correction_value |
|||
elif move_id._is_out() and qty_difference < 0: |
|||
candidates_receipt = self.env['stock.move'].search(move_id._get_in_domain(), order='date, id desc', limit=1) |
|||
if candidates_receipt: |
|||
candidates_receipt.write({ |
|||
'remaining_qty': candidates_receipt.remaining_qty + -qty_difference, |
|||
'remaining_value': candidates_receipt.remaining_value + ( |
|||
-qty_difference * candidates_receipt.price_unit), |
|||
}) |
|||
correction_value = qty_difference * candidates_receipt.price_unit |
|||
else: |
|||
correction_value = qty_difference * move_id.product_id.standard_price |
|||
move_vals['value'] = move_id.value - correction_value |
|||
move_id.write(move_vals) |
|||
|
|||
if move_id.product_id.valuation == 'real_time': |
|||
move_id.with_context(force_valuation_amount=correction_value, forced_quantity=qty_difference)._account_entry_move() |
|||
if qty_difference > 0: |
|||
move_id.product_price_update_before_done(forced_qty=qty_difference) |
|||
return super(StockMoveLine, self).write(vals) |
After Width: | Height: | Size: 463 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 16 KiB |
@ -0,0 +1,318 @@ |
|||
|
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-header-banner.png); background-repeat:no-repeat; background-size:cover;padding: 13% 0% 19% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="font-size: 35px;color: #fff;font-weight: 900;text-transform: uppercase;text-align: left;margin: 0;margin-bottom: 16px;"> |
|||
Costing method: Last Purchase Price |
|||
</h2> |
|||
<h3 class="oe_slogan" style="font-size: 25px;color: #fff;font-weight: 600;text-align: left;opacity: 1;margin: 0 !important;"> |
|||
Introducing new costing method 'Last Purchase Price' in Odoo |
|||
</h3> |
|||
<h5 class="oe_slogan" style="text-align: left;background: #fff;width: 293px;padding: 10px;color: #080808 !important;opacity: 1 !important;font-weight: 600;font-size: 20px;"> |
|||
<a style="color: #080808 !important;" href="https://www.cybrosys.com">Cybrosys Technologies</a> |
|||
</h5> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="padding: 3% 0% 3% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Overview |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
This module allows you to update your product's cost as your last purchase price |
|||
and changes the stock valuation based on that |
|||
</h3> |
|||
</div> |
|||
|
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 300;margin: 0px !important;"> |
|||
Configuration |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
After installing the module, |
|||
Select the newly added costing method in product category. Provide 'Price Difference Account' too if you are |
|||
following automated inventory valuation. |
|||
</h3> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-banner.png); background-repeat:no-repeat; background-size:cover;padding: 11% 0% 14% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Features |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
A New Costing Method Is Added To The List And Can Be Chosen From Product Category Form. |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Cost Price Of Products Will Be Updated With Their Last Purchase Price |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Takes Last Purchase Price In Stock Valuation Report |
|||
</h3> |
|||
<h3 class="oe_slogan" style="text-align: left;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 18px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Automatically Posting Price Difference Related Accounting Entries To The |
|||
'Price Difference Account' When We Use Automated Inventory Valuation |
|||
</h3> |
|||
</div> |
|||
</section> |
|||
<!-----------------Screenshot Section-------------------------> |
|||
<section class="oe_container" style="padding: 3% 0% 0% 15%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Screenshots |
|||
</h2> |
|||
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Product category |
|||
</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<img src="prod_category.png" alt="" style="width: 95%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: left;padding: 5% 0% 0% 0%;font-size: 16px;width: 90%;margin: 0;margin-top: 14px;color: #000 !important;opacity: 1 !important;line-height: 24px;"> |
|||
<i class="fa fa-check" aria-hidden="true" style="color: #cd2d47;font-size: 15px;"></i> |
|||
Journal Item generated by the price change |
|||
</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<img src="journal_item.png" alt="" style="width: 95%;"/> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<!-----------------Screenshot Section End-------------------------> |
|||
<!-----------------Our Service Section-------------------------> |
|||
<section class="oe_container" style="padding: 1% 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Our Service |
|||
</h2> |
|||
<div style="display:flex;padding-top: 20px;justify-content: space-between;"> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://www.cybrosys.com/odoo-customization-and-installation/" target="_blank"> |
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-customization.png" style="width: 100%;border-radius: 100%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
Odoo <br/>Customization |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-implementation/" target="_blank"> |
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-implementation.png" style="width: 100%;border-radius: 100%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
Odoo <br/>Implementation |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-integration/" target="_blank"> |
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-integration.png" style="width: 100%;border-radius: 100%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
Odoo <br/>Integration |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://www.cybrosys.com/odoo-erp-support/" target="_blank"> |
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-erp-support.png" style="width: 100%;border-radius: 100%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
Odoo <br/>Support |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 18%;"> |
|||
<a href="https://www.cybrosys.com/hire-odoo-developer/" target="_blank"> |
|||
<div style="width:75px;height:75px;background:#fff; border-radius:100%;margin: auto;"> |
|||
<img src="https://www.cybrosys.com/images/hire-odoo-developer.png" style="width: 100%;border-radius: 100%;"/> |
|||
</div> |
|||
<h3 class="oe_slogan" style="text-align: center;font-size: 14px;width: 100%;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;"> |
|||
Hire <br/>Odoo Developer |
|||
</h3> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<!-----------------END Our Service Section-------------------------> |
|||
<!-----------------Our Industries-------------------------> |
|||
<section class="oe_container" style="padding: 3% 0% 0% 3%;"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan" style="text-align: left;font-size: 28px;font-weight: 600;margin: 0px !important;"> |
|||
Our Industries |
|||
</h2> |
|||
<div style="display:flex;justify-content: space-between;flex-wrap:wrap;"> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-1.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
Trading |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Easily procure and sell your products. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-2.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
Manufacturing |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Plan, track and schedule your operations. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-3.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
Restaurant |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Run your bar or restaurant methodical. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/pos/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-4.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
|
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
POS |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Easy configuring and convivial selling. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-5.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
|
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 0px;margin-left: 16px;"> |
|||
E-commerce & Website |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Mobile friendly, awe-inspiring product pages. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-6.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
|
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
Hotel Management |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
An all-inclusive hotel management application. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-7.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
|
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
Education |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
A Collaborative platform for educational management. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div style="flex-basis: 32%;padding-top: 20px;"> |
|||
<a href="https://www.cybrosys.com/odoo/industries/service-management/" target="_blank"> |
|||
<div style="width:30%; float:left;"> |
|||
<div style="width:75px;height:75px;background:#CE2D48; border-radius:100%;float: left;text-align: left;"> |
|||
<img src="https://www.cybrosys.com/images/odoo-index-industry-8.png" alt="Odoo Industry" style=" border-radius: 100%;width:100%;"/> |
|||
|
|||
</div> |
|||
</div> |
|||
<div style="width:70%;float:left;"> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 14px;font-weight:600;width: auto;margin: 0;margin-top: 14px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 4px;margin-left: 16px;"> |
|||
Service Management |
|||
</h3> |
|||
<h3 class="oe_slogan" style=" text-align: left;font-size: 13px;width: auto;margin: 0;margin-top:5px;color: #000 !important;margin-top: 5px;opacity: 1 !important;line-height: 17px;float: left;margin-top: 5px;margin-left: 16px;"> |
|||
Keep track of services and invoice accordingly. |
|||
</h3> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
<!-----------------END Industries-------------------------> |
|||
<section class="oe_container" style="background-image:url(https://www.cybrosys.com/images/odoo-index-footer-bg.png); background-repeat:no-repeat; background-size:100%;padding: 13% 0% 6% 0%;"> |
|||
<div class="oe_slogan" style="margin-top:10px !important;margin-bottom: 0px;"> |
|||
<div> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 14px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i class="fa fa-envelope"></i> Email us </a> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 14px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/contact/"><i class="fa fa-phone"></i> Contact Us </a> |
|||
<a style="color: #5c5c5c !important;border-radius: 0;background: none;border: none;background: #fff;box-shadow: 0 10px 40px 0 rgba(62,57,107,0.07), 0 2px 9px 0 rgba(62, 57, 107, 0.05);border-radius: 30px;font-size: 14px;padding: 9px 26px;margin-right: 9px;width: 200px;text-transform: capitalize;" class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com/odoo-customization-and-installation/"><i class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="https://www.cybrosys.com/images/logo.png" style="width: 190px; margin-bottom: 25px;margin-top: 30px;" class="center-block"> |
|||
<div> |
|||
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px; ;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;height: 35px;padding-top: 7px;font-size: 21px;margin-right: 6px;border-radius: 100%;"></i></a></td> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<!-----------------Footer End-------------------------> |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 65 KiB |
Loading…
Reference in new issue