Browse Source

[ADD] Initial Commit

pull/90/merge
Sreejith P 7 years ago
parent
commit
c3662f31fe
  1. 30
      export_stockinfo_xls/README.rst
  2. 23
      export_stockinfo_xls/__init__.py
  3. 46
      export_stockinfo_xls/__manifest__.py
  4. 23
      export_stockinfo_xls/models/__init__.py
  5. 22
      export_stockinfo_xls/models/res_partner.py
  6. 23
      export_stockinfo_xls/models/wizard.py
  7. 3
      export_stockinfo_xls/report/__init__.py
  8. 178
      export_stockinfo_xls/report/current_stock_xls.py
  9. BIN
      export_stockinfo_xls/static/description/banner.jpg
  10. BIN
      export_stockinfo_xls/static/description/cybro_logo.png
  11. BIN
      export_stockinfo_xls/static/description/icon.png
  12. BIN
      export_stockinfo_xls/static/description/image1.png
  13. BIN
      export_stockinfo_xls/static/description/image2.png
  14. BIN
      export_stockinfo_xls/static/description/image3.png
  15. 88
      export_stockinfo_xls/static/description/index.html
  16. 57
      export_stockinfo_xls/views/wizard_view.xml

30
export_stockinfo_xls/README.rst

@ -0,0 +1,30 @@
=================================
Export Product Stock in Excel v11
=================================
This module helps you to take current stock report for all products in each warehouse.
Tech
====
* [Python] - Models
* [XML] - Odoo views
Installation
============
- www.odoo.com/documentation/11.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>
Maintainer
----------
This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com.

23
export_stockinfo_xls/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2018-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Cybrosys(<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 report
from . import models

46
export_stockinfo_xls/__manifest__.py

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2018-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Cybrosys(<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': 'Export Product Stock in Excel',
'version': '11.0.1.0.0',
'summary': "Current Stock Report for all Products in each Warehouse",
'category': 'Warehouse',
'author': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': [
'base',
'stock',
'sale',
'purchase',
'report_xlsx'
],
'data': [
'views/wizard_view.xml',
],
'images': ['static/description/banner.jpg'],
'license': "AGPL-3",
'installable': True,
'auto_install': False,
'auto_install': False,
}

23
export_stockinfo_xls/models/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2018-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Cybrosys(<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 res_partner
from . import wizard

22
export_stockinfo_xls/models/res_partner.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from odoo import models, fields
class Partner(models.Model):
_inherit = 'res.partner'
supplier_id = fields.Many2many('wizard.stock.history', 'supp_wiz_rel', 'wiz', 'supp', invisible=True)
class Category(models.Model):
_inherit = 'product.category'
obj = fields.Many2many('wizard.stock.history', 'categ_wiz_rel', 'wiz', 'categ', invisible=True)
class Warehouse(models.Model):
_inherit = 'stock.warehouse'
obj = fields.Many2many('wizard.stock.history', 'wh_wiz_rel', 'wiz', 'wh', invisible=True)

23
export_stockinfo_xls/models/wizard.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from datetime import datetime
from odoo import models, fields, api
class StockReport(models.TransientModel):
_name = "wizard.stock.history"
_description = "Current Stock History"
warehouse = fields.Many2many('stock.warehouse', 'wh_wiz_rel', 'wh', 'wiz', string='Warehouse', required=True)
category = fields.Many2many('product.category', 'categ_wiz_rel', 'categ', 'wiz', string='Warehouse')
@api.multi
def export_xls(self):
context = self._context
datas = {'ids': context.get('active_ids', [])}
datas['model'] = 'wizard.stock.history'
datas['form'] = self.read()[0]
for field in datas['form'].keys():
if isinstance(datas['form'][field], tuple):
datas['form'][field] = datas['form'][field][0]
if context.get('xls_export'):
return self.env.ref('export_stockinfo_xls.stock_xlsx').report_action(self, data=datas)

3
export_stockinfo_xls/report/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import current_stock_xls

178
export_stockinfo_xls/report/current_stock_xls.py

@ -0,0 +1,178 @@
# -*- coding: utf-8 -*-
import datetime
from datetime import datetime
import pytz
from odoo import models
class StockReportXls(models.AbstractModel):
_name = 'report.export_stockinfo_xls.stock_report_xls.xlsx'
_inherit = 'report.report_xlsx.abstract'
def get_warehouse(self, data):
wh = data.warehouse.mapped('id')
obj = self.env['stock.warehouse'].search([('id', 'in', wh)])
l1 = []
l2 = []
for j in obj:
l1.append(j.name)
l2.append(j.id)
return l1, l2
def get_lines(self, data, warehouse):
lines = []
categ_id = data.mapped('id')
if categ_id:
stock_history = self.env['product.product'].search([('categ_id', 'in', categ_id)])
else:
stock_history = self.env['product.product'].search([])
for obj in stock_history:
sale_value = 0
purchase_value = 0
product = self.env['product.product'].browse(obj.id)
sale_obj = self.env['sale.order.line'].search([('order_id.state', 'in', ('sale', 'done')),
('product_id', '=', product.id),
('order_id.warehouse_id', '=', warehouse)])
for i in sale_obj:
sale_value = sale_value + i.product_uom_qty
purchase_obj = self.env['purchase.order.line'].search([('order_id.state', 'in', ('purchase', 'done')),
('product_id', '=', product.id),
('order_id.picking_type_id', '=', warehouse)])
for i in purchase_obj:
purchase_value = purchase_value + i.product_qty
available_qty = product.with_context({'warehouse': warehouse}).virtual_available + \
product.with_context({'warehouse': warehouse}).outgoing_qty - \
product.with_context({'warehouse': warehouse}).incoming_qty
value = available_qty * product.standard_price
vals = {
'sku': product.default_code,
'name': product.name,
'category': product.categ_id.name,
'cost_price': product.standard_price,
'available': available_qty,
'virtual': product.with_context({'warehouse': warehouse}).virtual_available,
'incoming': product.with_context({'warehouse': warehouse}).incoming_qty,
'outgoing': product.with_context({'warehouse': warehouse}).outgoing_qty,
'net_on_hand': product.with_context({'warehouse': warehouse}).qty_available,
'total_value': value,
'sale_value': sale_value,
'purchase_value': purchase_value,
}
lines.append(vals)
return lines
def generate_xlsx_report(self, workbook, data, lines):
d = lines.category
get_warehouse = self.get_warehouse(lines)
count = len(get_warehouse[0]) * 11 + 6
comp = self.env.user.company_id.name
sheet = workbook.add_worksheet('Stock Info')
format0 = workbook.add_format({'font_size': 20, 'align': 'center', 'bold': True})
format1 = workbook.add_format({'font_size': 14, 'align': 'vcenter', 'bold': True})
format11 = workbook.add_format({'font_size': 12, 'align': 'center', 'bold': True})
format21 = workbook.add_format({'font_size': 10, 'align': 'center', 'bold': True})
format3 = workbook.add_format({'bottom': True, 'top': True, 'font_size': 12})
format4 = workbook.add_format({'font_size': 12, 'align': 'left', 'bold': True})
font_size_8 = workbook.add_format({'font_size': 8, 'align': 'center'})
font_size_8_l = workbook.add_format({'font_size': 8, 'align': 'left'})
font_size_8_r = workbook.add_format({'font_size': 8, 'align': 'right'})
red_mark = workbook.add_format({'font_size': 8, 'bg_color': 'red'})
justify = workbook.add_format({'font_size': 12})
format3.set_align('center')
justify.set_align('justify')
format1.set_align('center')
red_mark.set_align('center')
sheet.merge_range(1, 7, 2, 10, 'Product Stock Info', format0)
sheet.merge_range(3, 7, 3, 10, comp, format11)
w_house = ', '
cat = ', '
c = []
d1 = d.mapped('id')
if d1:
for i in d1:
c.append(self.env['product.category'].browse(i).name)
cat = cat.join(c)
sheet.merge_range(4, 0, 4, 1, 'Category(s) : ', format4)
sheet.merge_range(4, 2, 4, 3 + len(d1), cat, format4)
sheet.merge_range(5, 0, 5, 1, 'Warehouse(s) : ', format4)
w_house = w_house.join(get_warehouse[0])
sheet.merge_range(5, 2, 5, 3+len(get_warehouse[0]), w_house, format4)
user = self.env['res.users'].browse(self.env.uid)
tz = pytz.timezone(user.tz)
time = pytz.utc.localize(datetime.now()).astimezone(tz)
sheet.merge_range('A8:G8', 'Report Date: ' + str(time.strftime("%Y-%m-%d %H:%M %p")), format1)
sheet.merge_range(7, 7, 7, count, 'Warehouses', format1)
sheet.merge_range('A9:G9', 'Product Information', format11)
w_col_no = 6
w_col_no1 = 7
for i in get_warehouse[0]:
w_col_no = w_col_no + 11
sheet.merge_range(8, w_col_no1, 8, w_col_no, i, format11)
w_col_no1 = w_col_no1 + 11
sheet.write(9, 0, 'SKU', format21)
sheet.merge_range(9, 1, 9, 3, 'Name', format21)
sheet.merge_range(9, 4, 9, 5, 'Category', format21)
sheet.write(9, 6, 'Cost Price', format21)
p_col_no1 = 7
for i in get_warehouse[0]:
sheet.write(9, p_col_no1, 'Available', format21)
sheet.write(9, p_col_no1 + 1, 'Virtual', format21)
sheet.write(9, p_col_no1 + 2, 'Incoming', format21)
sheet.write(9, p_col_no1 + 3, 'Outgoing', format21)
sheet.merge_range(9, p_col_no1 + 4, 9, p_col_no1 + 5, 'Net On Hand', format21)
sheet.merge_range(9, p_col_no1 + 6, 9, p_col_no1 + 7, 'Total Sold', format21)
sheet.merge_range(9, p_col_no1 + 8, 9, p_col_no1 + 9, 'Total Purchased', format21)
sheet.write(9, p_col_no1 + 10, 'Valuation', format21)
p_col_no1 = p_col_no1 + 11
prod_row = 10
prod_col = 0
for i in get_warehouse[1]:
get_line = self.get_lines(d, i)
for each in get_line:
sheet.write(prod_row, prod_col, each['sku'], font_size_8)
sheet.merge_range(prod_row, prod_col + 1, prod_row, prod_col + 3, each['name'], font_size_8_l)
sheet.merge_range(prod_row, prod_col + 4, prod_row, prod_col + 5, each['category'], font_size_8_l)
sheet.write(prod_row, prod_col + 6, each['cost_price'], font_size_8_r)
prod_row = prod_row + 1
break
prod_row = 10
prod_col = 7
for i in get_warehouse[1]:
get_line = self.get_lines(d, i)
for each in get_line:
if each['available'] < 0:
sheet.write(prod_row, prod_col, each['available'], red_mark)
else:
sheet.write(prod_row, prod_col, each['available'], font_size_8)
if each['virtual'] < 0:
sheet.write(prod_row, prod_col + 1, each['virtual'], red_mark)
else:
sheet.write(prod_row, prod_col + 1, each['virtual'], font_size_8)
if each['incoming'] < 0:
sheet.write(prod_row, prod_col + 2, each['incoming'], red_mark)
else:
sheet.write(prod_row, prod_col + 2, each['incoming'], font_size_8)
if each['outgoing'] < 0:
sheet.write(prod_row, prod_col + 3, each['outgoing'], red_mark)
else:
sheet.write(prod_row, prod_col + 3, each['outgoing'], font_size_8)
if each['net_on_hand'] < 0:
sheet.merge_range(prod_row, prod_col + 4, prod_row, prod_col + 5, each['net_on_hand'], red_mark)
else:
sheet.merge_range(prod_row, prod_col + 4, prod_row, prod_col + 5, each['net_on_hand'], font_size_8)
if each['sale_value'] < 0:
sheet.merge_range(prod_row, prod_col + 6, prod_row, prod_col + 7, each['sale_value'], red_mark)
else:
sheet.merge_range(prod_row, prod_col + 6, prod_row, prod_col + 7, each['sale_value'], font_size_8)
if each['purchase_value'] < 0:
sheet.merge_range(prod_row, prod_col + 8, prod_row, prod_col + 9, each['purchase_value'], red_mark)
else:
sheet.merge_range(prod_row, prod_col + 8, prod_row, prod_col + 9, each['purchase_value'], font_size_8)
if each['total_value'] < 0:
sheet.write(prod_row, prod_col + 10, each['total_value'], red_mark)
else:
sheet.write(prod_row, prod_col + 10, each['total_value'], font_size_8_r)
prod_row = prod_row + 1
prod_row = 10
prod_col = prod_col + 11

BIN
export_stockinfo_xls/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
export_stockinfo_xls/static/description/cybro_logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
export_stockinfo_xls/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
export_stockinfo_xls/static/description/image1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
export_stockinfo_xls/static/description/image2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
export_stockinfo_xls/static/description/image3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

88
export_stockinfo_xls/static/description/index.html

@ -0,0 +1,88 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">Current Stock XLS</h2>
<h3 class="oe_slogan">Current Stock Report for all Products in each Warehouse</h3>
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h4>
</div>
<div class="oe_row oe_spaced">
<div>
This module helps to print Current Stock Report for all Products in each Warehouse with XLS.
</div>
</div>
<div class="oe_row oe_spaced">
<div>
&#x261B; Installation : To install this module, you need also the report_xlsx module.
</div>
</div>
<div class="oe_row oe_spaced">
<div class="oe_span6">
<div class="oe_demo oe_picture oe_screenshot">
<img src="image1.png">
</div>
</div>
<div class="oe_span6">
<p class='oe_mt32'>
Go to Inventory -> Reports -> Current stock in Excel. Now a wizard will appear on your screen.
Please enter the warehouses which you want to take the report. You can also select category for products(It is Optional).
Then Click "Export Product with Stock Info" button. Then You will get the corresponding report in XLS.
</p>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_padded">
<div class="oe_span12">
<div class="oe_row_img oe_centered">
<img class="oe_picture oe_screenshot" src="image2.png">
</div>
</div>
</div>
</section>
<section>
<div class="oe_row oe_spaced">
<div class="oe_span12">
<p class='oe_mt32'>
Per warehouse you can get Available Qty, Virtual Qty, Incoming Qty, Outgoing Qty, Net On Hand Qty,
Total Sold & Total Purchased Qty. You can get your stock valuation details too. In below screen-shot you
can see stock details of 2 warehouse exported in single spreadsheet. Negative stock will be highlighted
in "red" cells.
</p>
</div>
<div class="oe_span12">
<div class="oe_demo oe_picture oe_screenshot">
<img src="image3.png">
</div>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2>
<div class="oe_slogan" style="margin-top:10px !important;">
<div>
<a class="btn btn-primary btn-lg mt8"
style="color: #FFFFFF !important;border-radius: 0;" href="http://www.cybrosys.com"><i
class="fa fa-envelope"></i> Email </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;"
href="http://www.cybrosys.com/contact/"><i
class="fa fa-phone"></i> Contact Us </a> <a
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;"
href="http://www.cybrosys.com/odoo-customization-and-installation/"><i
class="fa fa-check-square"></i> Request Customization </a>
</div>
<br>
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" 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;"></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;"></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;padding-left: 8px;"></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;"></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;"></i></a></td>
</div>
</div>
</section>

57
export_stockinfo_xls/views/wizard_view.xml

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model='ir.ui.view' id='wizard_form'>
<field name="name">wizard.stock.history.form</field>
<field name="model">wizard.stock.history</field>
<field name="arch" type="xml">
<form string="Wizard">
<group string="Warehouse">
<field name="warehouse" widget="many2many_tags"/>
</group>
<notebook>
<page string="Category">
<field name="category">
<tree>
<field name="name"/>
</tree>
</field>
</page>
</notebook>
<footer>
<button name="export_xls" type="object" default_focus="1"
string="Export Product with Stock Info" class="oe_highlight"
context="{'xls_export':1}" icon="fa-download"/>
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<record model='ir.actions.act_window' id='wizard_act'>
<field name="name">Export product stock in Excel</field>
<field name="res_model">wizard.stock.history</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="wizard_form"/>
<field name="target">new</field>
</record>
<report
id="stock_xlsx"
model="wizard.stock.history"
string="Product Stock Info"
report_type="xlsx"
name="export_stockinfo_xls.stock_report_xls.xlsx"
file="export_stockinfo_xls.stock_report_xls.xlsx"
menu="False"
attachment_use="False"/>
<menuitem name="Current stock in Excel"
parent="stock.menu_warehouse_report"
id="export_excel"
action="wizard_act"
sequence="3"/>
</data>
</odoo>
Loading…
Cancel
Save