Add odex25_inventory

This commit is contained in:
expert 2024-06-24 14:12:22 +03:00
parent 3a3f834c54
commit 4adda2eaa9
221 changed files with 8430 additions and 1 deletions

View File

@ -1,2 +1,2 @@
# odex25-standard-moduless
# odex25-standard-modules
This Repo contains general standard modules for all projects.

View File

@ -0,0 +1,27 @@
Odoo Proprietary License v1.0
This software and associated files (the "Software") may only be used (executed,
modified, executed after modifications) if you have purchased a valid license
from the authors, typically via Odoo Apps, or if you have received a written
agreement from the authors of the Software (see the COPYRIGHT file).
You may develop Odoo modules that use the Software as a library (typically
by depending on it, importing it and using its resources), but without copying
any source code or material from the Software. You may distribute those
modules under the license of your choice, provided that this license is
compatible with the terms of the Odoo Proprietary License (For example:
LGPL, MIT, or proprietary licenses similar to this one).
It is forbidden to publish, distribute, sublicense, or sell copies of the Software
or modified copies of the Software.
The above copyright notice and this permission notice must be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from . import models
from . import wizard

View File

@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
# Author: Aktiv Software PVT. LTD.
# mail: odoo@aktivsoftware.com
# Copyright (C) 2015-Present Aktiv Software PVT. LTD.
# Contributions:
# Aktiv Software:
# - Janvi Raval
# - Komal Jimudiya
# - Burhan Vakharia
# - Tanvi Gajera
{
"name": "Internal Material Request / Inter-Warehouse Request",
"version": "14.0.1.0.3",
"summary": """This module allows Warehouse users to create Internal Material Requests.
Internal Warehouse Transfer,
Stock Request,
Goods Request,
2-Step Delivery Requests with Transit Location,
Inter-Warehouse Transfer,
Inter Warehouse Transfer,
Material Request,
Internal Request,
Stock Request,
Goods Request,
Transit Request,
Goods Transfer,
Stock Transfer,
Material Transfer,
Warehouse Transfer,
Internal Warehouse Transfer,
Goods Transfer between Warehouse,
Stock Transfer between Transfer,
Warehouse to Warehouse Transfer,
""",
"description": """
Title: Internal Material Request / Inter-Warehouse Request \n
Author: Aktiv Software PVT. LTD. \n
mail: odoo@aktivsoftware.com \n
Copyright (C) 2015-Present Aktiv Software PVt. LTD. \n
Contributions: Aktiv Software: \n
- Janvi Raval
- Komal Jimudiya
- Burhan Vakharia
- Tanvi Gajera
This module allows users to create Internal material request request
to any internal stock location.
It allows users to create Inter-Warehouse Requests.
The requests can be 1-Step or 2-Step Requests.
2-Step Requests are routed via a Transit Location.
Material Request,
Internal Request,
Stock Request,
Goods Request,
Transit Request,
Goods Transfer,
Stock Transfer,
Material Transfer,
Warehouse Transfer,
Internal Warehouse Transfer,
Goods Transfer between Warehouse,
Stock Transfer between Transfer,
Warehouse to Warehouse Transfer,
""",
"author": "Aktiv Software",
"website": "http://www.aktivsoftware.com",
"license": "OPL-1",
"price": 18.00,
"currency": "EUR",
'category': 'Odex25-Inventory/Odex25-Inventory',
"depends": ["stock"],
"data": [
"security/res_groups.xml",
"security/ir.model.access.csv",
"data/material_request_sequence.xml",
"wizard/reject_reason_wizard_views.xml",
"wizard/transit_location_wizard.xml",
"views/material_request_view.xml",
"views/res_config_views.xml",
"views/res_company_views.xml",
],
"images": ["static/description/banner.jpg"],
"installable": True,
"application": False,
"auto_install": False,
}

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="material_request_seq" model="ir.sequence">
<field name="name">Material Request Sequence</field>
<field name="code">material.request.seq</field>
<field name="prefix">MR</field>
<field name="padding">5</field>
</record>
</odoo>

View File

@ -0,0 +1,613 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * ak_material_request
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-04 07:46+0000\n"
"PO-Revision-Date: 2024-02-04 07:46+0000\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: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__two_verify
msgid "2 Step Delivery(Via Transit Location)"
msgstr "التسليم بخطوتين (عبر موقع وسيط)"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_res_company__two_step_material_req
msgid "2 step Picking"
msgstr "التحويل على خطوتين"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.inherit_res_config_setting_view
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\"/>"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_needaction
msgid "Action Needed"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_ids
msgid "Activities"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_exception_decoration
msgid "Activity Exception Decoration"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_state
msgid "Activity State"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_type_icon
msgid "Activity Type Icon"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_res_config_settings__two_step_material_req
msgid "Allow Material Request in 2-Steps"
msgstr "السماح بطلب التحويل على خطوتين"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_form_view
msgid "Approve"
msgstr "يعتمد"
#. module: ak_material_request
#: model:ir.model.fields.selection,name:ak_material_request.selection__material_request__state__approve
msgid "Approved"
msgstr "موافقة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__approved_user_id
msgid "Approved By"
msgstr "تمت الموافقة من طرف"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__available_qty
msgid "Available Quantity"
msgstr "الكمية المتوفرة"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.reject_reason_form_view
#: model_terms:ir.ui.view,arch_db:ak_material_request.transit_location_warning_form_view
msgid "Cancel"
msgstr "إلغاء"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__product_uom_category_id
msgid "Category"
msgstr "فئة"
#. module: ak_material_request
#: model:ir.model,name:ak_material_request.model_res_company
msgid "Companies"
msgstr "شركات"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__company_id
msgid "Company"
msgstr "شركة"
#. module: ak_material_request
#: model:ir.model,name:ak_material_request.model_res_config_settings
msgid "Config Settings"
msgstr "ضبط الاعدادات"
#. module: ak_material_request
#: model:ir.model.fields.selection,name:ak_material_request.selection__material_request__state__confirm
msgid "Confirmed"
msgstr "مؤكد"
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request_line__product_uom_category_id
msgid ""
"Conversion between Units of Measure can only occur if they belong to the "
"same category. The conversion will be made based on the ratios."
msgstr ""
"لا يمكن أن يحدث التحويل بين وحدات القياس إلا إذا كانت تنتمي إلى نفس الفئة. "
"سيتم إجراء التحويل على أساس النسب."
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__create_uid
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__create_uid
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__create_uid
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning__create_uid
msgid "Created by"
msgstr "انشأ من طرف"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__create_date
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__create_date
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__create_date
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning__create_date
msgid "Created on"
msgstr "تم الانشاء في"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__dest_location_id
msgid "Deliver Stock From"
msgstr "تسليم المخزون من"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__delivery_state
msgid "Delivery State"
msgstr "حالة التسليم"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__description
msgid "Description"
msgstr "الوصف"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_search_view
msgid "Destination Location"
msgstr "الوجهة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__display_name
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__display_name
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__display_name
#: model:ir.model.fields,field_description:ak_material_request.field_res_company__display_name
#: model:ir.model.fields,field_description:ak_material_request.field_res_config_settings__display_name
#: model:ir.model.fields,field_description:ak_material_request.field_stock_picking__display_name
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning__display_name
msgid "Display Name"
msgstr "الاسم"
#. module: ak_material_request
#: model:ir.model.fields.selection,name:ak_material_request.selection__material_request__state__draft
msgid "Draft"
msgstr "مسودة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_follower_ids
msgid "Followers"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__activity_type_icon
msgid "Font awesome icon e.g. fa-tasks"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__good_needed_on
msgid "Goods Needed On"
msgstr "استلام المخزون الى"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_search_view
msgid "Group By"
msgstr "تجميع بواسطة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__id
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__id
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__id
#: model:ir.model.fields,field_description:ak_material_request.field_res_company__id
#: model:ir.model.fields,field_description:ak_material_request.field_res_config_settings__id
#: model:ir.model.fields,field_description:ak_material_request.field_stock_picking__id
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning__id
msgid "ID"
msgstr "المُعرف"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_exception_icon
msgid "Icon"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__activity_exception_icon
msgid "Icon to indicate an exception activity."
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__message_needaction
#: model:ir.model.fields,help:ak_material_request.field_material_request__message_unread
msgid "If checked, new messages require your attention."
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__message_has_error
#: model:ir.model.fields,help:ak_material_request.field_material_request__message_has_sms_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: ak_material_request
#: model:ir.actions.act_window,name:ak_material_request.action_material_request
#: model:ir.ui.menu,name:ak_material_request.menu_action_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.inherit_res_config_setting_view
msgid "Internal Material Request"
msgstr "طلب تحويل داخلي"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request____last_update
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line____last_update
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard____last_update
#: model:ir.model.fields,field_description:ak_material_request.field_res_company____last_update
#: model:ir.model.fields,field_description:ak_material_request.field_res_config_settings____last_update
#: model:ir.model.fields,field_description:ak_material_request.field_stock_picking____last_update
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning____last_update
msgid "Last Modified on"
msgstr "تاريخ آخر تعديل"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__write_uid
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__write_uid
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__write_uid
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning__write_uid
msgid "Last Updated by"
msgstr "آخر تحديث بواسطة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__write_date
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__write_date
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__write_date
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning__write_date
msgid "Last Updated on"
msgstr "آخر تحديث بتاريخ"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_search_view
msgid "Location"
msgstr "الموقع"
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__dest_location_id
msgid "Location from where stock will be delivered."
msgstr "الموقع الذي سيتم تسليم المخزون منه."
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_form_view
msgid "Material Lines"
msgstr "بنود التحويل"
#. module: ak_material_request
#: model:ir.model,name:ak_material_request.model_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__material_request_id
#: model:ir.module.category,description:ak_material_request.material_request_group
#: model:ir.module.category,name:ak_material_request.material_request_group
msgid "Material Request"
msgstr "طلب التحويل"
#. module: ak_material_request
#: model:ir.model,name:ak_material_request.model_material_request_line
msgid "Material Request Lines"
msgstr "تفاصيل طلب التحويل"
#. module: ak_material_request
#: model:res.groups,name:ak_material_request.group_manager_material_request
msgid "Material Request Manager"
msgstr "مدير طلبات التحويل"
#. module: ak_material_request
#: model:ir.model,name:ak_material_request.model_reject_reason_wizard
msgid "Material Request Reject Reason Wizard"
msgstr "معالج سبب رفض طلب التحويل الداخلي"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_search_view
msgid "Material Request Search"
msgstr "بحث طلب تحويل"
#. module: ak_material_request
#: model:res.groups,name:ak_material_request.group_user_material_request
msgid "Material Request User"
msgstr "مستخدم طلبات التحويل"
#. module: ak_material_request
#: model:ir.model,name:ak_material_request.model_transit_location_warning
msgid "Material Request: Trasit Location Warning"
msgstr "طلب التحويل: تحذير حول موقع الانتظار"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_stock_picking__request_id
msgid "Material Requisition"
msgstr "طلب التحويل"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_ids
msgid "Messages"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__my_activity_date_deadline
msgid "My Activity Deadline"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_date_deadline
msgid "Next Activity Deadline"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_summary
msgid "Next Activity Summary"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_type_id
msgid "Next Activity Type"
msgstr "نوع النشاط التالي"
#. module: ak_material_request
#: model:ir.model.fields.selection,name:ak_material_request.selection__material_request__delivery_state__process
msgid "No Pending Transfers"
msgstr "لا يوجد تحويلات معلقة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_has_error_counter
msgid "Number of errors"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__picking_count
msgid "Picking Count"
msgstr "عدد التحويلات"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__picking_two_verify
msgid "Picking Two Verify"
msgstr "تحقق ثنائى للتحويل"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__picking_type_id
msgid "Picking Type"
msgstr "نوع العملية"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_form_view
msgid "Pickings"
msgstr "التحويلات"
#. module: ak_material_request
#: code:addons/ak_material_request/models/material_request.py:0
#, python-format
msgid "Please create some requisition lines."
msgstr "يرجى اضافة بعض بنود للتحويل"
#. module: ak_material_request
#: code:addons/ak_material_request/models/material_request.py:0
#, python-format
msgid "Please select the location from which you want to transfer the Stock."
msgstr "يرجى تحديد الموقع الذي تريد نقل المخزون منه."
#. module: ak_material_request
#: code:addons/ak_material_request/models/material_request.py:0
#, python-format
msgid "Please update Deliver Stock From Location."
msgstr "يرجى تحديث تسليم المخزون من الموقع."
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__product_id
msgid "Product"
msgstr "منتج"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__qty
msgid "Quantity"
msgstr "كمية"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__name
msgid "Reference"
msgstr "مرجع"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_form_view
#: model_terms:ir.ui.view,arch_db:ak_material_request.reject_reason_form_view
msgid "Reject"
msgstr "رفض"
#. module: ak_material_request
#: model:ir.actions.act_window,name:ak_material_request.action_reject_material_request_wizard
msgid "Reject Material Request Reason"
msgstr "سبب رفض طلب التحويل الداخلي"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_reject_reason_wizard__reject_reason
msgid "Reject Reason"
msgstr "سبب الرفض"
#. module: ak_material_request
#: model:ir.model.fields.selection,name:ak_material_request.selection__material_request__state__reject
msgid "Rejected"
msgstr "مرفوض"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_search_view
msgid "Reqisition Date"
msgstr "تاريخ الطلب"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__request_line_ids
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__request_id
msgid "Request"
msgstr "طلب"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__request_date
msgid "Request Date"
msgstr "تاريخ الطلب"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__user_id
msgid "Requested By"
msgstr "الطلب بواسطة"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_form_view
msgid "Reset to draft"
msgstr "إعادة تعيين للمسودة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__activity_user_id
msgid "Responsible User"
msgstr "المستخدم المسؤول"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_has_sms_error
msgid "SMS Delivery error"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__state
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_search_view
msgid "State"
msgstr "الحالة"
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__activity_state
msgid ""
"Status based on activities\n"
"Overdue: Due date is already passed\n"
"Today: Activity date is today\n"
"Planned: Future activities."
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__location_id
msgid "Stock Needed on Location"
msgstr "المخزون مطلوب في موقع"
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__location_id
msgid "Stock needed on Location."
msgstr "المخزون مطلوب في موقع"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_form_view
msgid "Submit for Approval"
msgstr "إرسال للموافقة"
#. module: ak_material_request
#: code:addons/ak_material_request/models/material_request.py:0
#, python-format
msgid "This record can be deleted only in Draft or Rejected state."
msgstr "يمكن حذف هذا السجل فقط في حالة المسودة أو الرفض."
#. module: ak_material_request
#: model:ir.model,name:ak_material_request.model_stock_picking
msgid "Transfer"
msgstr "التحويل"
#. module: ak_material_request
#: model:ir.model.fields.selection,name:ak_material_request.selection__material_request__delivery_state__pending
msgid "Transfer Pending"
msgstr "التحويل معلق"
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__activity_exception_decoration
msgid "Type of the exception activity on record."
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request_line__uom_id
msgid "Unit of Measure"
msgstr "وحدة القياس"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_unread
msgid "Unread Messages"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.inherit_res_config_setting_view
msgid ""
"Upon enabling this the material request will be navigated via transit "
"location."
msgstr "عند تفعيل هذا الخيار، سيتم التحويل عبر موقع وسيط"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.material_request_search_view
msgid "User"
msgstr "المستخدم"
#. module: ak_material_request
#: model_terms:ir.ui.view,arch_db:ak_material_request.transit_location_warning_form_view
msgid "View Transit Locations"
msgstr "عرض المواقع الوسيطة"
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_material_request__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,help:ak_material_request.field_material_request__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: ak_material_request
#: model:ir.model.fields,field_description:ak_material_request.field_transit_location_warning__name
msgid "name"
msgstr "اسم"

View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from . import stock_picking
from . import material_request
from . import material_request_line
from . import res_config
from . import res_company

View File

@ -0,0 +1,248 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from odoo import models, fields, api, _
from datetime import datetime
from odoo.exceptions import Warning, UserError, ValidationError
class MaterialRequest(models.Model):
_name = "material.request"
_description = "Material Request"
_inherit = ["mail.thread", "mail.activity.mixin"]
_order = "id desc"
def compute_delivery_state(self):
for material_request in self:
picking_recs = self.env["stock.picking"].search(
[("request_id", "=", material_request.id)]
)
if picking_recs and all(
picking.state in ["done", "cancel"] for picking in picking_recs
):
material_request.delivery_state = "process"
else:
material_request.delivery_state = "pending"
name = fields.Char(
string="Reference",
index=True,
readonly=1,
)
state = fields.Selection(
[
("draft", "Draft"),
("confirm", "Confirmed"),
("approve", "Approved"),
("reject", "Rejected"),
],
tracking=True,
default="draft",
)
user_id = fields.Many2one(
"res.users",
string="Requested By",
default=lambda self: self.env.user and self.env.user.id or False,
required=True,
domain=lambda self: [
("groups_id", "in", [self.env.ref("stock.group_stock_user").id])
],
)
location_id = fields.Many2one(
"stock.location",
string="Stock Needed on Location",
copy=True,
help="Stock needed on Location.",
)
dest_location_id = fields.Many2one(
"stock.location",
string="Deliver Stock From",
copy=False,
help="Location from where stock will be delivered.",
)
request_date = fields.Date(string="Request Date", default=datetime.now().date())
request_line_ids = fields.One2many(
"material.request.line", "request_id", string="Request", copy=True
)
picking_type_id = fields.Many2one(
"stock.picking.type",
string="Picking Type",
copy=False,
default=lambda self: self.env["stock.picking.type"].search(
[("code", "=", "internal")], limit=1
),
)
two_verify = fields.Boolean(string="2 Step Delivery(Via Transit Location)")
delivery_state = fields.Selection(
[("pending", "Transfer Pending"), ("process", "No Pending Transfers")],
tracking=True,
default="pending",
compute="compute_delivery_state",
)
good_needed_on = fields.Datetime(
string="Goods Needed On",
)
picking_count = fields.Integer(string="Picking Count", compute="compute_picking")
picking_two_verify = fields.Boolean(string="Picking Two Verify")
company_id = fields.Many2one(
"res.company", "Company", default=lambda self: self.env.company
)
approved_user_id = fields.Many2one("res.users", copy=False, string="Approved By")
@api.constrains("dest_location_id")
def check_dest_location(self):
for material_req_rec in self:
if material_req_rec.dest_location_id.id == material_req_rec.location_id.id:
raise ValidationError(_("Please update Deliver Stock From Location."))
def compute_picking(self):
"""These method is used for counting the
Internal Transfer which is created from the material request."""
for material_request_rec in self:
material_request_rec.picking_count = self.env["stock.picking"].search_count(
[("request_id", "=", material_request_rec.id)]
)
def action_reset_draft(self):
for rec in self:
rec.write({"state": "draft"})
@api.onchange("company_id")
def _onchange_2_step_delivery(self):
for rec in self:
if rec.company_id.two_step_material_req:
rec.picking_two_verify = True
def action_confirm(self):
for rec in self:
rec.write({"state": "confirm"})
def _prepare_pick_vals(self, req_line=False, picking=False):
"""This method is used to create stock moves from picking."""
pick_vals = {
"product_id": req_line.product_id.id,
"product_uom_qty": req_line.qty,
"product_uom": req_line.uom_id.id,
"location_id": picking.location_id.id,
"location_dest_id": picking.location_dest_id.id,
"picking_type_id": picking.picking_type_id.id,
"picking_id": picking.id,
"name": req_line.product_id.display_name,
}
return pick_vals
def action_approve(self):
"""This method is used to create Internal Transfer."""
pick_list_st = []
pick_list_td = []
stock_move_obj = self.env["stock.move"]
for material_req_rec in self:
if not material_req_rec.dest_location_id:
raise Warning(
_(
"Please select the location from which you want to transfer the Stock."
)
)
if not material_req_rec.request_line_ids:
raise Warning(_("Please create some requisition lines."))
scheduled_date = False
picking_vals = {
"picking_type_id": material_req_rec.picking_type_id.id,
"request_id": material_req_rec.id,
"origin": material_req_rec.name,
"location_id": material_req_rec.dest_location_id.id,
}
if material_req_rec.two_verify:
# Picking create for two step.
transit_location = self.env["stock.location"].search(
[("usage", "=", "transit")], limit=1
)
if not transit_location:
return {
"type": "ir.actions.act_window",
"name": "No Transit Location Warning",
"view_mode": "form",
"res_model": "transit.location.warning",
"context": {
"default_name": "No active Tranisit Location found in the system. Please contact the Inventory manager to Unarchive the Transit Location."
},
"target": "new",
}
picking_vals.update(
{
"location_dest_id": transit_location.id,
}
)
else:
picking_vals.update(
{
"location_dest_id": material_req_rec.location_id.id,
}
)
# Created Main picking.
main_picking_rec = self.env["stock.picking"].create(picking_vals)
if material_req_rec.good_needed_on:
scheduled_date = material_req_rec.good_needed_on
if material_req_rec.two_verify:
two_step_picking_rec = self.env["stock.picking"].create(
{
"location_id": transit_location.id,
"location_dest_id": material_req_rec.location_id.id,
"picking_type_id": material_req_rec.picking_type_id.id,
"request_id": material_req_rec.id,
"origin": material_req_rec.name,
}
)
for req_line in material_req_rec.request_line_ids:
stock_move_vals = material_req_rec._prepare_pick_vals(
req_line, main_picking_rec
)
first_move_rec = stock_move_obj.create(stock_move_vals)
main_picking_rec.action_confirm()
if material_req_rec.two_verify:
two_verify_stock_move_vals = material_req_rec._prepare_pick_vals(
req_line, two_step_picking_rec
)
two_verify_stock_move_vals.update(
{"move_orig_ids": [(6, 0, first_move_rec.ids)]}
)
stock_move_obj.create(two_verify_stock_move_vals)
two_step_picking_rec.action_confirm()
material_req_rec.write({"state": "approve"})
def action_reject(self):
action = self.env.ref(
"ak_material_request.action_reject_material_request_wizard"
).read()[0]
action["context"] = {"default_material_request_id": self.id}
return action
@api.model
def create(self, vals):
"""seqeunce is created for material request."""
name = self.env["ir.sequence"].next_by_code("material.request.seq")
vals.update({"name": name})
res = super(MaterialRequest, self).create(vals)
return res
def show_picking(self):
"""Redirects to the stock picking view."""
for rec in self:
res = self.env.ref("stock.action_picking_tree_all")
res = res.read()[0]
res["domain"] = str([("request_id", "=", rec.id)])
return res
def unlink(self):
for rec in self:
if rec.state not in ["draft", "reject"]:
raise UserError(
_("This record can be deleted only in Draft or Rejected state.")
)
return super(MaterialRequest, self).unlink()

View File

@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from odoo import api, fields, models
class MaterialRequestLine(models.Model):
_name = "material.request.line"
_description = "Material Request Lines"
product_id = fields.Many2one(
"product.product",
string="Product",
required=True,
)
description = fields.Char(
string="Description",
required=True,
)
qty = fields.Float(
string="Quantity",
default=1,
required=True,
)
available_qty = fields.Float(
string="Available Quantity",
required=True,
)
product_uom_category_id = fields.Many2one(
related="product_id.uom_id.category_id", readonly=True
)
uom_id = fields.Many2one(
"uom.uom",
string="Unit of Measure",
required=True,
domain="[('category_id', '=', product_uom_category_id)]",
)
request_id = fields.Many2one("material.request")
@api.onchange("product_id")
def product_id_change(self):
if self.product_id:
self.description = self.product_id.name
self.uom_id = self.product_id.uom_id
available_qty = self.env['stock.quant']._get_available_quantity(self.product_id, self.request_id.dest_location_id)
self.available_qty = available_qty

View File

@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
two_step_material_req = fields.Boolean(string="2 step Picking")

View File

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
two_step_material_req = fields.Boolean(
related="company_id.two_step_material_req",
readonly=False,
string="Allow Material Request in 2-Steps",
)

View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from odoo import models, fields
class StockPicking(models.Model):
_inherit = "stock.picking"
request_id = fields.Many2one(
"material.request", string="Material Requisition", readonly=True, copy=False
)
def _create_backorder(self):
"""
Override this method to update material request id in backorder.
"""
backorder_recs = super(StockPicking, self)._create_backorder()
for backorder_rec in backorder_recs:
if backorder_rec.backorder_id.request_id:
backorder_rec.write(
{"request_id": backorder_rec.backorder_id.request_id}
)
return backorder_recs

View File

@ -0,0 +1,5 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_material_request,access_material_request,model_material_request,,1,1,1,1
access_material_request_line,access_material_request_line,model_material_request_line,,1,1,1,1
access_reject_reason_wizard,access_reject_reason_wizard,model_reject_reason_wizard,,1,1,1,1
access_transit_location_warning,access_transit_location_warning,model_transit_location_warning,,1,1,1,1
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_material_request access_material_request model_material_request 1 1 1 1
3 access_material_request_line access_material_request_line model_material_request_line 1 1 1 1
4 access_reject_reason_wizard access_reject_reason_wizard model_reject_reason_wizard 1 1 1 1
5 access_transit_location_warning access_transit_location_warning model_transit_location_warning 1 1 1 1

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.module.category" id="material_request_group">
<field name="name">Material Request</field>
<field name="description">Material Request</field>
</record>
<record id="group_user_material_request" model="res.groups">
<field name="name">Material Request User</field>
<field name="category_id" ref="ak_material_request.material_request_group"/>
</record>
<record id="group_manager_material_request" model="res.groups">
<field name="name">Material Request Manager</field>
<field name="category_id" ref="ak_material_request.material_request_group"/>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 669 KiB

View File

@ -0,0 +1,577 @@
<div class="container">
<div class="oe_styling_v8">
<div class="container p-3 mb-3">
<div class="row">
<div class="col-12 d-lg-flex justify-content-between" style="border-bottom:1px solid #d5d5d5">
<div class="my-2 d-flex justify-content-center">
<img src="./default_icons/aktiv-logo.png" class="w-auto" style="height:50px !important">
</div>
<div class="my-2 w-100 w-lg-auto d-md-flex align-items-center justify-content-around justify-content-lg-start">
<div class="text-white font-weight-bold text-center"
style="background-color:#875A7B !important; padding:5px 15px 8px !important; margin:0 5px 5px 5px !important; border-radius: 15px;">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
<div class="text-white font-weight-bold text-center"
style="background-color:#7C7BAD !important; padding:5px 15px 8px !important; margin:0 5px 5px 5px !important; border-radius: 15px;">
<i class="fa fa-check mr-1"></i>Community
</div>
<div class="text-white font-weight-bold text-center"
style="background-color:#875A7B !important; padding:5px 15px 8px !important; margin:0 5px 5px 5px !important; border-radius: 15px;">
<i class="fa fa-check mr-1"></i>Odoo.Sh
</div>
<div class="text-white font-weight-bold text-center"
style="background-color:#7C7BAD !important; padding:5px 15px 8px !important; margin:0 5px 5px 5px !important; border-radius: 15px;">
<i class="fa fa-check mr-1"></i>Self Hosted
</div>
</div>
</div>
</div>
</div>
<div class="container pt-0 px-4 pb-5">
<div class="row">
<div class="col-12 bg-white" style="padding:4rem 1rem !important;">
<div class="d-md-flex justify-content-center mb-2">
<img src="icon.png" class="mx-auto mr-md-2 ml-md-0 mb-2 mb-md-0" height="80px" width="80px">
<div>
<h1 class="text-center font-weight-bold display-3"
style="font-family:'Montserrat', sans-serif !important; color: #b01e2f !important">
Internal Material Request
</h1>
<p class="text-center pb-3"
style="font-family:'Montserrat', sans-serif !important; font-weight:300 !important; color:#040f3a !important; font-size:1.4rem !important;">
</p>
</div>
</div>
<img src="material_request.gif" class="img-responsive w-100 h-auto" height="auto">
</div>
</div>
<!-- Demo video link -->
<div class="row mb-4 justify-content-center">
<a target="_blank" href="https://youtu.be/4wGdpELfAug"
style="background-color: #b01e2f !important; color: #fff !important; font-family:'Montserrat', sans-serif !important; font-size:1.4rem; border-radius: 5px; padding: 5px 15px;"
class="font-weight-bold">
Video Tutorial
</a>
</div>
<div class="row">
<div class="col-12 px-3 text-center">
<h2 class="font-weight-bold"
style="color: #b01e2f !important; font-family:'Montserrat', sans-serif !important; font-size:2rem;">
Explore this module
</h2>
<div class="mt-3">
<a class="font-weight-bold" href="#overview" class="mr-5"
style="font-family:'Montserrat', sans-serif !important; font-size:1.3rem; color:#040f3a !important">Overview
<i class="fa fa-chevron-right ml-1" style="color:#282F33 !important"></i></a>
<a class="font-weight-bold" href="#features" class="mr-5"
style="font-family:'Montserrat', sans-serif !important; font-size:1.3rem; color:#040f3a !important">Key
Features <i class="fa fa-chevron-right ml-1" style="color:#282F33 !important"></i></a>
<a class="font-weight-bold" href="#setup" class="mr-5"
style="font-family:'Montserrat', sans-serif !important; font-size:1.3rem; color:#040f3a !important">Setup
&amp; Configuration
<i class="fa fa-chevron-right ml-1" style="color:#282F33 !important"></i></a>
<a class="font-weight-bold" href="#screenshots" class="mr-5"
style="font-family:'Montserrat', sans-serif !important; font-size:1.3rem; color:#040f3a !important">Screenshots
<i class="fa fa-chevron-right ml-1" style="color:#282F33 !important"></i></a>
</div>
<hr class="my-5" style="border-color:d5d5d5 !important">
</div>
</div>
<!-- OVERVIEW -->
<div class="row " id="overview">
<div class="col-12 px-4">
<h2 class="font-weight-bold"
style="font-family:'Montserrat', sans-serif !important; font-size:2rem; color:#b01e2f !important">
Overview
</h2>
<hr style="border: 2px solid #040f3a !important; background-color: #040f3a !important; width: 50px !important; margin-left: 0 !important; margin-bottom: 2rem !important; margin-top: 8px;">
<p class="mt-4"
style="font-size:1.1rem !important; color:#282F33 !important; font-weight:400 !important; line-height:1.85 !important">
This custom module allows user to generate Internal Material/ Inter-Warehouse Transfer requests.
The process could be completed in two ways: </p>
<p>1-Step Transfer: Send the stock from source to destination location with manager's approval.</p>
<p>2-Step Transfer: Complete the material request transfer from Source to Transit and Transit to
Destination location
</p>
</div>
</div>
<!-- FEATURES -->
<!-- FEATURES -->
<div class="row my-5" id="features">
<div class="col-sm-12 col-md-12 col-lg-12 px-4">
<h2 class="font-weight-bold"
style="font-family:'Montserrat', sans-serif !important; font-size:2rem; color:#b01e2f !important">
Features
</h2>
<hr style="border: 2px solid #040f3a !important; background-color: #040f3a !important; width: 50px !important; margin-left: 0 !important; margin-bottom: 2rem !important; margin-top: 8px;">
<div class="row">
<div class="col-12">
<div class="row">
<div class="col-sm-12 col-md-6 my-3" style="border-bottom:2px solid #f0f0f0;">
<div class="d-flex" style="padding:1rem 0px !important;">
<img src="./default_icons/check.png" width="20px" height="20px" class="mr-2">
<h3 style="font-size:1.2rem !important">Make Internal or Inter-warehouse
material/transfer requests.</h3>
</div>
</div>
<div class="col-sm-12 col-md-6 my-3" style="border-bottom:2px solid #f0f0f0;">
<div class="d-flex" style="padding:1rem 0px !important;">
<img src="./default_icons/check.png" width="20px" height="20px" class="mr-2">
<h3 style="font-size:1.2rem !important">It can be performed in two different
ways: 1-step transfer or 2-step transfer as per the suitability.</h3>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="row">
<div class="col-sm-12 col-md-6 my-3" style="border-bottom:2px solid #f0f0f0;">
<div class="d-flex" style="padding:1rem 0px !important;">
<img src="./default_icons/check.png" width="20px" height="20px" class="mr-2">
<h3 style="font-size:1.2rem !important">Manager requires to approve or
disapprove the transfer request.
</h3>
</div>
</div>
<div class="col-sm-12 col-md-6 my-3" style="border-bottom:2px solid #f0f0f0;">
<div class="d-flex" style="padding:1rem 0px !important;">
<img src="./default_icons/check.png" width="20px" height="20px" class="mr-2">
<h3 style="font-size:1.2rem !important">This app supports Single company Setup
with Multi Warehouse and Multi Locations.</h3>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- SETUP & CONFIGURATION -->
<div class="row mb-5" id="setup">
<div class="col-12 px-4">
<h2 class="font-weight-bold"
style="font-family:'Montserrat', sans-serif !important; font-size:2rem; color:#b01e2f !important">
Setup &amp; Configuration
</h2>
<hr style="border: 2px solid #040f3a !important; background-color: #040f3a !important; width: 50px !important; margin-left: 0 !important; margin-bottom: 2rem !important; margin-top: 8px;">
<div class="mt-5">
<h2 class="font-weight-bold"
style="font-family:'Montserrat', sans-serif !important; font-size:1.2rem; color:#b01e2f !important">
Prerequisites
</h2>
<ul class="mb-2 pb-2">
<li class="p-1" style="border-bottom: 2px solid #f0f0f0;">
<h3 style="font-size:1.2rem !important">Required Apps
</h3>
<p>
Stock
</p>
</li>
</ul>
</div>
</div>
</div>
<!-- SCREENSHOTS -->
<div class="row mb-5" id="screenshots">
<div class="col-12 px-4">
<h2 class="font-weight-bold"
style="font-family:'Montserrat', sans-serif !important; font-size:2rem; color:#b01e2f !important">
Screenshots
</h2>
<hr style="border: 2px solid #040f3a !important; background-color: #040f3a !important; width: 50px !important; margin-left: 0 !important; margin-bottom: 2rem !important; margin-top: 8px;">
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Internal Material Request
</h3>
</div>
</div>
<img src="images/menu_1.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Material Request Tree View.</h3>
</div>
</div>
<img src="images/material_request_tree_2_ss.png" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Material Request Process:</h3>
<ul style="margin-left: 0%; padding-left: 5%;">
<li style="margin-right: 4px; color: black; font-size: calc(13px + 0.3vw); text-align: justify;
font-family: Times New Roman;">
Upon adding details about the source and destination location along with the
list of goods user needs to click send the request for approval to manager which
when approved will be marked as "Confirmed".
</li>
</ul>
</div>
</div>
<img src="images/material_request_form1_3.png" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Material Request Approve/Reject:
</h3>
<ul style="margin-left: 0%; padding-left: 5%;">
<li style="margin-right: 4px; color: black; font-size: calc(13px + 0.3vw); text-align: justify;
font-family: Times New Roman;">
Warehouse Manager can approve or reject the material or transfer request made by
the
user. Whereas they also has the rights to update the source location and product
lists.
</li>
</ul>
</div>
</div>
<img src="images/material_request_approval_4.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">If manager rejects the request, mentioning
rejection reason is mandatory.
</h3>
</div>
</div>
<img src="images/reject_reason_5.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">After rejection from manager users material or
transfer request will shift to "Rejected" stage with a log note mentioning the
rejection reason.
</h3>
</div>
</div>
<img src="images/reject_reason_chatter_6.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Material Request Picking Process 1-Step
Transfer:
</h3>
<ul style="margin-left: 0%; padding-left: 5%;">
<li style="margin-right: 4px; color: black; font-size: calc(13px + 0.3vw); text-align: justify;
font-family: Times New Roman;">
Once the transfer request is approved by manager, an Internal Transfer is
created with correct source and destination locations.
</li>
<li style="margin-right: 4px; color: black; font-size: calc(13px + 0.3vw); text-align: justify;
font-family: Times New Roman;">
The Transfer once created is visible in the Form view wherein one can see its
current stage through a smart button as shown in the below screenshot.
</li>
</ul>
</div>
</div>
<img src="images/picking_button_7.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">If user follows the 1-Step Transfer, single
transfer is created with source and destination locations.
</h3>
</div>
</div>
<img src="images/transfer_8.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Material Request Picking Process 1-Step Material
Request Picking- 2-Step Transfer:
</h3>
<ul style="margin-left: 0%; padding-left: 5%;">
<li style="margin-right: 4px; color: black; font-size: calc(13px + 0.3vw); text-align: justify;
font-family: Times New Roman;">
Before following the 2-step transfer user needs to configure the following:
</li>
</ul>
</div>
</div>
<img src="images/res_config_9.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<img src="images/two_step_req_10.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">As seen in the 1-step transfer, everything till
the manager approval and creation of
single transfer will remain the same for the 2-Step transfer.In the 2-step transfer,
the first transfer will occur from source location to transit
location and second transfer will occur from transit location to destination
location.
</h3>
</div>
</div>
<img src="images/source_to_transit_12.jpg" class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Please note, the 2nd Transfer will be in
"Waiting for Another Operation" state until the 1st transfer is completed.
</h3>
</div>
</div>
<img src="images/transit_to_destination_13.jpg"
class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">The Transfers are visible in the Form view as
well as in the smart button.
</h3>
</div>
</div>
<img src="images/2_pickings_11.jpg"
class="img-responsive img-thumbnail border">
</div>
<div class="mt-5">
<div class="d-flex mb-2 pb-2">
<img src="./default_icons/arrow.png" width="20px" height="20px" class="mr-2">
<div>
<h3 style="font-size:1.2rem !important">Pending Transfers Status on the Request Form:
</h3>
</div>
</div>
<img src="images/pending_transfers_14.jpg"
class="img-responsive img-thumbnail border">
</div>
</div>
</div>
<!-- SCREENSHOTS -->
<div class="row mt-3">
<div class="col-lg-12 d-flex flex-column justify-content-center" style="padding:2.5rem 15px !important">
<h2 class="font-weight-bold" style="font-family:'Montserrat', sans-serif !important; font-size:2rem; color:#b01e2f !important">
Suggested Apps
</h2>
<hr style="border: 2px solid #040f3a !important; background-color: #040f3a !important; width: 50px !important; margin-left: 0 !important; margin-bottom: 2rem !important; margin-top: 8px;">
<div id="product_slider" class="row carousel slide mt-4 data-ride=" carousel="">
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item active" style="min-height: 193.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/12.0/exchange_rate_management/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block w-100 h-auto"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./suggested_apps/ebchange_banner.jpg">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/11.0/inventory_scrap_report/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block w-100 h-auto"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./suggested_apps/inventory_scrap_report_banner.jpg">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/13.0/ak_inventory_valuation_report/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block w-100 h-auto"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./suggested_apps/inventory_valuation_reports_banner-01.jpg">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height: 193.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/14.0/stock_per_each_location/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block w-100 h-auto"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./suggested_apps/stock_per_each_location_banner-01.jpg">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/13.0/stock_notify_ept/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block w-100 h-auto"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./suggested_apps/notify_in_stock_banner-01.jpg">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/13.0/product_sale_target_report/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block w-100 h-auto"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./suggested_apps/product_ageing_report_banner-01.jpg">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#product_slider" data-slide="prev" style="width:35px; color:#000"> <span class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span> </a> <a class="carousel-control-next" href="#product_slider" data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF SUGGESTED PRODUCTS -->
<!-- OUR SERVICES -->
<section style="margin-top:2rem !important">
<div class="row">
<div class="col-lg-12">
<h2 class="font-weight-bold"
style="font-family:'Montserrat', sans-serif !important; font-size:2rem; color:#b01e2f !important">
Our Services
</h2>
<hr style="border: 2px solid #040f3a !important; background-color: #040f3a !important; width: 50px !important; margin-left: 0 !important; margin-bottom: 2rem !important; margin-top: 8px;">
</div>
<div class="col-md-4 col-sm-6 col-12 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="border-radius:15px !important; height:80px; width:80px">
<img src="./default_icons/Odoo_Consulting.png" class="img-responsive"
style="border-radius:15px !important; height:80px; width:80px">
</div>
<h6 class="text-center"
style="font-family:Montserrat, 'sans-serif' !important; font-weight:bold">
Odoo
Consulting
</h6>
</div>
<div class="col-md-4 col-sm-6 col-12 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="border-radius:15px !important; height:80px; width:80px">
<img src="./default_icons/Odoo_Customization.png" class="img-responsive"
style="border-radius:15px !important; height:80px; width:80px">
</div>
<h6 class="text-center"
style="font-family:Montserrat, 'sans-serif' !important; font-weight:bold">
Odoo
Customization
</h6>
</div>
<div class="col-md-4 col-sm-6 col-12 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="border-radius:15px !important; height:80px; width:80px">
<img src="./default_icons/Odoo_Implementation.png" class="img-responsive"
style="border-radius:15px !important; height:80px; width:80px">
</div>
<h6 class="text-center"
style="font-family:Montserrat, 'sans-serif' !important; font-weight:bold">
Odoo
Implementation
</h6>
</div>
<div class="col-md-4 col-sm-6 col-12 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="border-radius:15px !important; height:80px; width:80px">
<img src="./default_icons/Odoo_Integration.png" class="img-responsive"
style="border-radius:15px !important; height:80px; width:80px">
</div>
<h6 class="text-center"
style="font-family:Montserrat, 'sans-serif' !important; font-weight:bold">
Odoo
Integration
</h6>
</div>
<div class="col-md-4 col-sm-6 col-12 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="border-radius:15px !important; height:80px; width:80px">
<img src="./default_icons/Odoo_Migration.png" class="img-responsive"
style="border-radius:15px !important; height:80px; width:80px">
</div>
<h6 class="text-center"
style="font-family:Montserrat, 'sans-serif' !important; font-weight:bold">
Odoo
Migration
</h6>
</div>
<div class="col-md-4 col-sm-6 col-12 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="border-radius:15px !important; height:80px; width:80px">
<img src="./default_icons/Odoo_Support.png" class="img-responsive"
style="border-radius:15px !important; height:80px; width:80px">
</div>
<h6 class="text-center"
style="font-family:Montserrat, 'sans-serif' !important; font-weight:bold">
Odoo
Support
</h6>
</div>
</div>
</section>
<!-- END OF END OF OUR SERVICES -->
<!-- FOOTER -->
<!-- Don't Remove Below Part -->
<div>
<h2 class="oe_slogan">
<a href="http://aktivsoftware.com/" target="new">
<img src="./default_icons/aktiv-logo.png" class="img img-responsive"/>
</a>
<br/>
<a href="mailto:sales@aktivsoftware.com" style="color: #000000 !important;">
Get Help &amp; Support
</a>
</h2>
<div class="oe_slogan oe_spaced text-center">
<a class="btn btn success mt8" title="website" target="new"
style="background-color: #b01e2f !important; border-radius: 5px !important; color: #ffffff; !important; position:relative; overflow: hidden;"
href="http://aktivsoftware.com/"><b>Website</b></a>
<a class="btn btn success mt8" title="Contact Us"
style="background-color: #b01e2f !important; border-radius: 5px !important; color: #ffffff; !important; position:relative; overflow: hidden;"
href="mailto:sales@aktivsoftware.com"><b>Contact Us</b></a>
<a class="btn btn success mt8" title="Request New Features Now!"
style="background-color: #b01e2f !important; border-radius: 5px !important; color: #ffffff; !important; position:relative; overflow: hidden;"
href="mailto:sales@aktivsoftware.com"><b>Request For New Features</b></a>
</div>
</div>
<!-- END OF FOOTER -->
</div>
</div>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

View File

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="material_request_form_view" model="ir.ui.view">
<field name="name">material.request.form.view</field>
<field name="model">material.request</field>
<field name="arch" type="xml">
<form>
<header>
<button name="action_confirm" type="object" string="Submit for Approval" class="btn-primary"
attrs="{'invisible': [('state', 'in', ['confirm','approve','reject'])]}"/>
<button name="action_approve" type="object" string="Approve" class="btn-primary"
attrs="{'invisible': [('state', 'in', ['draft','approve','reject'])]}"
groups="ak_material_request.group_manager_material_request"/>
<button name="action_reject" type="object" string="Reject" class="btn-primary"
attrs="{'invisible': [('state', 'in', ['draft','approve','reject'])]}"
groups="ak_material_request.group_manager_material_request"/>
<button name="action_reset_draft" type="object" string="Reset to draft" class="btn-primary"
attrs="{'invisible': [('state', 'in', ['approve', 'confirm','draft'])]}"/>
<field name="delivery_state" widget="statusbar" attrs="{'invisible': [('state', 'in', ['draft', 'reject'])]}"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,approve"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" type="object" icon="fa-truck"
name="show_picking"
attrs="{'invisible': [('state', 'not in', ['approve'])]}">
<field name="picking_count" widget="statinfo" string="Pickings"/>
</button>
</div>
<div class="oe_title">
<div class="oe_title">
<h1>
<field name="name"/>
<br/>
</h1>
</div>
</div>
<group>
<group>
<field name="user_id" readonly="1" force_save="1"/>
<field name="location_id" required="1"
domain="[('usage', '=', 'internal')]"
attrs="{'readonly': [('state', '!=', 'draft')]}"
options="{'no_create': True}"/>
<field name="dest_location_id"
domain="[('usage', '=', 'internal')]"
attrs="{'readonly': [('state', 'in', ['approve', 'reject'])]}"
options="{'no_create': True}"/>
<field name="picking_type_id" required="1" domain="[('code', '=', 'internal')]"
attrs="{'readonly': [('state', '!=', 'draft')]}" options="{'no_create': True}"/>
</group>
<group>
<field name="request_date" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="good_needed_on" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="two_verify" attrs="{'invisible': [('picking_two_verify', '=', False)], 'readonly': [('state', '!=', 'draft')]}"/>
<field name="picking_two_verify" invisible="1"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
<notebook>
<page string="Material Lines">
<field name="request_line_ids" attrs="{'readonly': [('state', 'in', ['approve', 'reject'])], 'required': [('state', '=', 'confirm')]}">
<tree editable="bottom">
<field name="product_id" options="{'no_create': True}"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="description"/>
<field name="available_qty"/>
<field name="qty"/>
<field name="uom_id" groups="uom.group_uom" options="{'no_create': True}"/>
</tree>
<form>
<group>
<group>
<field name="product_id" options="{'no_create': True}"/>
<field name="description"/>
</group>
<group>
<field name="qty"/>
<field name="product_uom_category_id" invisible="1"/>
<field name="uom_id" groups="uom.group_uom" options="{'no_create': True}"/>
</group>
</group>
</form>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="material_request_tree_view" model="ir.ui.view">
<field name="name">material.request.view.tree</field>
<field name="model">material.request</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="user_id"/>
<field name="location_id"/>
<field name="dest_location_id"/>
<field name="request_date"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="material_request_search_view" model="ir.ui.view">
<field name="name">material.request.search</field>
<field name="model">material.request</field>
<field name="arch" type="xml">
<search string="Material Request Search">
<field name="user_id"/>
<field name="request_date"/>
<field name="location_id"/>
<field name="dest_location_id"/>
<field name="state"/>
<group expand="0" string="Group By">
<filter string="User" name="user_id" context="{'group_by':'user_id'}"/>
<filter string="Reqisition Date" name="request_date" context="{'group_by':'request_date'}"/>
<filter string="Location" name="location" context="{'group_by':'location_id'}"/>
<filter string="Destination Location" name="dest_location_id"
context="{'group_by':'dest_location_id'}"/>
<filter string="State" name="state" context="{'group_by':'state'}"/>
</group>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="action_material_request">
<field name="name">Internal Material Request</field>
<field name="res_model">material.request</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_action_material_request" name="Internal Material Request" parent="stock.menu_stock_warehouse_mgmt"
action="action_material_request"/>
</odoo>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_company_form_inherit_material_req" model="ir.ui.view">
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="after">
<field name="two_step_material_req" invisible="1"/>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="inherit_res_config_setting_view" model="ir.ui.view">
<field name="name">res.config.settings.view</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="stock.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@data-key='stock']" position="inside">
<h2>Internal Material Request</h2>
<div class="row mt16 o_settings_container">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="two_step_material_req"/>
</div>
<div class="o_setting_right_pane">
<label for="two_step_material_req"/>
<span class="fa fa-lg fa-building-o" title="Values set here are company-specific."/>
<div class="text-muted">
Upon enabling this the material request will be navigated via transit location.
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from . import reject_reason_wizard
from . import transit_location_warning

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from odoo import fields, models
class RejectReasonWizard(models.TransientModel):
_name = "reject.reason.wizard"
_description = "Material Request Reject Reason Wizard"
reject_reason = fields.Text(string="Reject Reason", required=True)
material_request_id = fields.Many2one("material.request", string="Material Request")
def reject_material_req(self):
self.material_request_id.write(
{
"state": "reject",
"delivery_state": "",
}
)
display_msg = (
"<p> User %s Rejected the material request.<br/>"
"Rejected Reason: %s </p>" % (self.env.user.name, self.reject_reason)
)
self.material_request_id.message_post(body=display_msg)

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="reject_reason_form_view" model="ir.ui.view">
<field name="model">reject.reason.wizard</field>
<field name="arch" type="xml">
<form>
<field name="material_request_id" invisible="1"/>
<field name="reject_reason" nolabel="1"/>
<footer>
<button name="reject_material_req" string="Reject" type="object" class="btn-primary"/>
<button name="cancel" special="cancel" string="Cancel"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_reject_material_request_wizard">
<field name="name">Reject Material Request Reason</field>
<field name="res_model">reject.reason.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Part of Odoo, Aktiv Software PVT. LTD.
# See LICENSE file for full copyright & licensing details.
from odoo import fields, models
class TransitLocationWarning(models.TransientModel):
_name = "transit.location.warning"
_description = "Material Request: Trasit Location Warning"
name = fields.Char(string="name")
def view_transit_location(self):
return {
"type": "ir.actions.act_window",
"name": "Locations",
"view_mode": "tree,form",
"res_model": "stock.location",
"domain": [("usage", "=", "transit"), ("active", "=", False)],
"context": {"default_usage": "transit"},
}

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="transit_location_warning_form_view" model="ir.ui.view">
<field name="model">transit.location.warning</field>
<field name="arch" type="xml">
<form>
<field name="name" nolabel="1" readonly="1"/>
<footer>
<button name="view_transit_location" string="View Transit Locations" type="object" class="btn-primary"/>
<button name="cancel" special="cancel" string="Cancel"/>
</footer>
</form>
</field>
</record>
</odoo>

View File

@ -0,0 +1,4 @@
=================================
Restriction on Stock Location
=================================
This app will restrict stock location for selected users.

View File

@ -0,0 +1 @@
from . import models

View File

@ -0,0 +1,25 @@
{
"name": "Restriction on Stock Location",
'version': "14.0",
'category': 'Odex25-Inventory/Odex25-Inventory',
"summary": "This app will Restriction on Stock Location.",
'author': 'INKERP',
'website': "http://www.inkerp.com",
"depends": ['stock'],
"data": [
"security/security.xml",
"views/stock_location_view.xml",
],
'images': ['static/description/banner.png'],
'license': "OPL-1",
'installable': True,
'application': True,
'auto_install': False,
}

View File

@ -0,0 +1 @@
from. import stock_location

View File

@ -0,0 +1,7 @@
from odoo import fields, models, api, _
class StockLocation(models.Model):
_inherit = 'stock.location'
user_ids = fields.Many2many(comodel_name='res.users', string='Users')

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="group_stock_location_restrict_manager" model="res.groups">
<field name="name">Stock Location Restriction</field>
</record>
<record id="stock_location_restriction_for_users" model="ir.rule">
<field name="name">Restrict Stock Location</field>
<field ref="model_stock_location" name="model_id"/>
<field name="domain_force">[('user_ids','!=',user.id)]</field>
<field name="groups" eval="[(4, ref('eg_stock_location_restriction.group_stock_location_restrict_manager'))]"/>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

View File

@ -0,0 +1,392 @@
<!--Heading Start-->
<section class="mb16">
<h2 class="oe_slogan" style="color:#008784;font-size: 50px;">Restriction on Stock Location</h2>
<p class="oe_mt32"
style="font-size: 20px; line-height: 1.2; word-break: break-word; text-align: center; mso-line-height-alt: 22px; margin: 0;">This app will restrict stock location for selected users.</p>
<br/>
<br/>
</section>
<!--Heading End-->
<!--#########=============================================########-->
<!--Divider 3PX 25% Start -->
<section class="oe_container">
<center>
<img class="oe_picture" src="divider.png"
style="margin: 0 0 50px 0;display: block;border: none;height: 3px;background: #0071B9; width:25%;"/>
</center>
</section>
<!--Divider 3PX End -->
<!--Company LOGO Start-->
<section class="oe_container">
<center>
<img class="oe_picture" src="company_logo.png" style="margin-bottom:3.33%" width="225px"/>
</center>
</section>
<!--Company LOGO end-->
<!--Support Button Start-->
<section class="oe_container">
<center class="oe_slogan">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="background:linear-gradient(to bottom, #000000 5%, #000000 100%);
border-radius:42px;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-family: 'Roboto', sans-serif;
font-size:23px;
padding:10px 33px;
background-color:black;
text-decoration:none;
border-radius: 45px;
"><i class="fa fa-envelope"></i>&nbsp; Looking for Demo or Support?</a>
</center>
</section>
<!--Support Button End-->
<!--Divider 3PX 25% Start -->
<section class="oe_container">
<center>
<img class="oe_picture" src="divider.png"
style="margin: 0 0 50px 0;display: block;border: none;height: 3px;background: #0071B9; width:25%;"/>
</center>
</section>
<!--ScreenShot Section Start-->
<section class="container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="font-size:28px"><b>1) Users view. </b></h2>
<div>
<h2 class="oe_slogan" style="font-size:22px;"> For Applying Restriction user have to assign group of (Stock Location Restriction) to User. so that assigned user can restrict the other user.</h2>
<h2 class="oe_slogan" style="font-size:22px"><b>Navigation:</b> Settings -> Users & Companies -> Users -> Stock Location Restriction</h2>
</div>
<div class="mt16 mb16">
<img src="images/1.png" class="img img-responsive center-block"
style="max-width:100%;border:8px solid lightgray;"/>
</div>
</div>
</section>
<!--ScreenShot Section End-->
<!--#########=============================================########-->
<!--ScreenShot Section Start-->
<!--Divider 3PX Start -->
<section class="oe_container">
<center>
<img src="divider.png"
style="margin: 0 0 50px 0;display: block;border: none;height: 3px;background: #0071B9; width:60%;"/>
</center>
</section>
<!--Divider 3PX End -->
<!--ScreenShot Section Start-->
<section class="container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="font-size:28px"><b>2) Locations view.</b></h2>
<div>
<h2 class="oe_slogan" style="font-size:22px;">In Stock Location form view restrict manager can see Users field. In that field select that users whom you want restrict from the this particular Stock Location.</h2>
<h2 class="oe_slogan" style="font-size:22px"><b>Navigation:</b> Inventory -> Reporting ->Locations</h2>
</div>
<div class="mt16 mb16">
<img src="images/2.png" class="img img-responsive center-block"
style="max-width:100%;border:8px solid lightgray;"/>
</div>
</div>
</section>
<!--ScreenShot Section End-->
<!--#########=============================================########-->
<!--#########=============================================########-->
<!--ScreenShot Section Start-->
<!--Divider 3PX Start -->
<section class="oe_container">
<center>
<img src="divider.png"
style="margin: 0 0 50px 0;display: block;border: none;height: 3px;background: #0071B9; width:60%;"/>
</center>
</section>
<!--Divider 3PX End -->
<!--ScreenShot Section Start-->
<section class="container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="font-size:28px"><b>3) Locations view.</b></h2>
<div>
<h2 class="oe_slogan" style="font-size:22px;">Here you can see that stock location was disappear from records. The location was restricted for Marc Demo.</h2>
<h2 class="oe_slogan" style="font-size:22px"><b>Navigation:</b> Inventory -> Reporting ->Locations</h2>
</div>
<div class="mt16 mb16">
<img src="images/3.png" class="img img-responsive center-block"
style="max-width:100%;border:8px solid lightgray;"/>
</div>
</div>
</section>
<!--ScreenShot Section End-->
<!--#########=============================================########-->
<!--######################################################################################-->
<!--############################# FOOTER START ###############################-->
<!--######################################################################################-->
<!--Divider 3PX Start -->
<section class="oe_container">
<center>
<img src="divider.png"
style="margin: 0 0 50px 0;display: block;border: none;height: 3px;background: #0071B9; width:100%;"/>
</center>
</section>
<!--Divider 3PX End -->
<!--#########=============================================########-->
<!--Featured APP section Start-->
<section class="oe_container">
<h2 class="oe_slogan">Featured Applications</h2>
<div id="demo" class="row carousel slide mb32" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item active">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_cancel_quotation/" target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_cancel_quotation.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_merge_purchase_order/" target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_merge_purchase_order.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_inventory_user_signature_report/"
target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_inventory_user_signature_report.png">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://apps.odoo.com/apps/modules/13.0/eg_po_from_so/" target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_po_from_so.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_sendcloud_delivery/" target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_sendcloud_delivery.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_product_sale_price_history/" target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_product_sale_price_history.png">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height: 0px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_split_quotation_order/" target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_split_quotation_order.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_whatsapp_all_in_one_integration/"
target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_whatsapp_all_in_one_integration.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float: left;">
<a href="https://www.odoo.com/apps/modules/13.0/eg_whatsapp_sale_integration/" target="_blank">
<div style="border-radius: 10px;">
<img class="img img-responsive center-block"
style="border-radius: 10px;"
src="eg_whatsapp_sale_integration.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo" data-slide="prev" style="left:-25px;width: 0px;color: #000;">
<span class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span>
</a>
<a class="carousel-control-next" href="#demo" data-slide="next" style="right:-25px;width: 0px;color: #000;">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" style="font-size:24px"></i></span>
</a>
</div>
</section>
<!--Featured App End-->
<!--#########=============================================########-->
<!--Divider 3PX Start -->
<section class="oe_container">
<center>
<img src="divider.png"
style="margin: 0 0 50px 0;display: block;border: none;height: 3px;background: #0071B9; width:100%;"/>
</center>
</section>
<!--Divider 3PX End -->
<!--Our Services Start-->
<section class="mb64">
<h2 class="oe_slogan" style="font-variant: initial;">Our Services</h2>
<center>
<table style="table-layout: fixed ; width: 100% ; height:100%;
font-size:20px;">
<tbody>
<tr>
<td style="background-color:black; border: 3px solid white;">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="width:100%;display:inline-block;cursor:pointer;color:#ffffff;padding:10px 20px;
text-decoration:none; font-family: 'Roboto', sans-serif;"><i class="fa fa-envelope"></i>&nbsp;
Odoo Implementation</a>
</td>
<td style="background-color:black; border: 3px solid white;">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="width:100%;display:inline-block;cursor:pointer;color:#ffffff;padding:10px 20px;
text-decoration:none; font-family: 'Roboto', sans-serif;"><i class="fa fa-envelope"></i>&nbsp;
Odoo App Development</a>
</td>
<td style="background-color:black; border: 3px solid white;">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="width:100%;display:inline-block;cursor:pointer;color:#ffffff;padding:10px 20px;
text-decoration:none; font-family: 'Roboto', sans-serif;"><i class="fa fa-envelope"></i>&nbsp;
Odoo Support & Maintenance</a>
</td>
</tr>
<tr>
<td style="background-color:black; border: 3px solid white;">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="width:100%;display:inline-block;cursor:pointer;color:#ffffff;padding:10px 20px;
text-decoration:none; font-family: 'Roboto', sans-serif;"><i class="fa fa-envelope"></i>&nbsp;
Odoo Customization</a>
</td>
<td style="background-color:black; border: 3px solid white;">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="width:100%;display:inline-block;cursor:pointer;color:#ffffff;padding:10px 20px;
text-decoration:none; font-family: 'Roboto', sans-serif;"><i class="fa fa-envelope"></i>&nbsp;
Odoo Integration Services</a>
</td>
<td style="background-color:black; border: 3px solid white;">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="width:100%;display:inline-block;cursor:pointer;color:#ffffff;padding:10px 20px;
text-decoration:none; font-family: 'Roboto', sans-serif;"><i class="fa fa-envelope"></i>&nbsp;
Odoo Developer Outsourcing</a>
</td>
</tr>
</tbody>
</table>
</center>
</section>
<!--Our Services end-->
<!--Divider 3PX 25% Start -->
<section class="oe_container">
<center>
<img src="divider.png"
style="margin: 0 0 50px 0;display: block;border: none;height: 3px;background: #0071B9; width:25%;"/>
</center>
</section>
<!--Divider 3PX End -->
<!--Support Button Start-->
<section class="mb64">
<center class="oe_slogan">
<a href="mailto:team@inkerp.com?subject=Odoo Support / Development&amp;body="
style="
border-radius:42px;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-family: 'Roboto', sans-serif;
font-size:23px;
padding:10px 33px;
background-color:black;
text-decoration:none;
border-radius: 45px;
"><i class="fa fa-envelope"></i>&nbsp; team@inkerp.com</a>
<a href="skype:live:.cid.4c02945aa38b9250?chat"
style="
border-radius:42px;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-family: 'Roboto', sans-serif;
font-size:23px;
padding:10px 33px;
background-color:black;
text-decoration:none;
border-radius: 45px;
"><i class="fa fa-skype"></i>&nbsp; team@inkerp.com</a>
</center>
</section>
<!--Support Button End-->
<!--Company LOGO Start-->
<section class="oe_container">
<center>
<img class="oe_picture" src="company_logo.png" style="margin-bottom:3.33%" width="225px"/>
</center>
</section>
<!--Company LOGO end-->
<!--######################################################################################-->
<!--############################# FOOTER END ###############################-->
<!--######################################################################################-->

View File

@ -0,0 +1,15 @@
<odoo>
<record id="restriction_stock_location_form_view_inherited" model="ir.ui.view">
<field name="name">stock.location.restriction.form.view</field>
<field name="model">stock.location</field>
<field name="inherit_id" ref="stock.view_location_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='comment']" position="after">
<separator string="User Rights"/>
<group>
<field name="user_ids" widget="many2many_tags"/>
</group>
</xpath>
</field>
</record>
</odoo>

View File

@ -0,0 +1,42 @@
Export Product Stock in Excel v16
=================================
This module helps you to take current stock report for all products in each warehouse.
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developers: Cybrosys Techno Solutions odoo@cybrosys.com
Version 15: Midilaj V K @cybrosys
Version 16: Sahla Sherin @cybrosys
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Midilaj (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import models
from . import controllers

View File

@ -0,0 +1,54 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Midilaj (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
{
'name': 'Export Product Stock in Excel',
'version': '16.0.1.0.0',
'live_test_url': 'https://www.youtube.com/watch?v=9ae4GkApHQM',
'summary': "Current Stock Report for all Products in each Warehouse",
'description': "Current Stock Report for all Products in each Warehouse, Odoo 13,Odoo13",
'category': 'Odex25-Inventory/Odex25-Inventory',
'author': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': [
'base',
'sale_management',
'stock',
'purchase',
],
'data': [
'views/wizard_view.xml',
'security/ir.model.access.csv',
],
'images': ['static/description/banner.png'],
'assets': {
'web.assets_backend': [
'export_stockinfo_xls/static/src/js/action_manager.js',
],
},
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'auto_install': False,
}

View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2020-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Midilaj (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import main

View File

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Midilaj (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
import json
from odoo import http
from odoo.http import content_disposition, request, serialize_exception as _serialize_exception
from odoo.tools import html_escape
class XLSXReportController(http.Controller):
@http.route('/xlsx_reports', type='http', auth='user', methods=['POST'], csrf=False)
def get_report_xlsx(self, model, options, output_format, report_name, **kw):
uid = request.session.uid
report_obj = request.env[model].with_user(uid)
options = json.loads(options)
token = 'dummy-because-api-expects-one'
try:
if output_format == 'xlsx':
response = request.make_response(
None,
headers=[
('Content-Type', 'application/vnd.ms-excel'),
('Content-Disposition', content_disposition(report_name + '.xlsx'))
]
)
report_obj.get_xlsx_report(options, response)
response.set_cookie('fileToken', token)
return response
except Exception as e:
se = _serialize_exception(e)
error = {
'code': 200,
'message': 'Odoo Server Error',
'data': se
}
return request.make_response(html_escape(json.dumps(error)))

View File

@ -0,0 +1,11 @@
## Module <export_stockinfo_xls>
#### 04.10.2021
#### Version 16.0.1.0.0
#### ADD
Initial Commit Export Product Stock in Excel

View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Midilaj (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import res_partner
from . import wizard

View File

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Midilaj (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
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)

View File

@ -0,0 +1,251 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Midilaj (<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
import time
from datetime import date, datetime
import pytz
import json
import datetime
import io
from odoo import api, fields, models, _
from odoo.tools import date_utils
try:
from odoo.tools.misc import xlsxwriter
except ImportError:
import xlsxwriter
class StockReport(models.TransientModel):
_name = "wizard.stock.history"
_description = "Current Stock History"
warehouse_ids = fields.Many2many('stock.warehouse', 'wh_wiz_rel', 'wh', 'wiz', string='Warehouse', required=True)
category_ids = fields.Many2many('product.category', 'categ_wiz_rel', 'categ', 'wiz', string='Category')
def export_xls(self):
data = {
'ids': self.ids,
'model': self._name,
'warehouse': self.warehouse_ids.ids,
'category': self.category_ids.ids,
}
return {
'type': 'ir.actions.report',
'data': {'model': 'wizard.stock.history',
'options': json.dumps(data, default=date_utils.json_default),
'output_format': 'xlsx',
'report_name': 'Current Stock History',
},
'report_type': 'stock_xlsx'
}
def get_warehouse(self, data):
wh = data.warehouse_ids.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_ids):
lines = []
categ_id = data.mapped('id')
if categ_id:
categ_products = self.env['product.product'].search([('categ_id', 'in', categ_id)])
else:
categ_products = self.env['product.product'].search([])
product_ids = tuple([pro_id.id for pro_id in categ_products])
sale_query = """
SELECT sum(s_o_l.product_uom_qty) AS product_uom_qty, s_o_l.product_id FROM sale_order_line AS s_o_l
JOIN sale_order AS s_o ON s_o_l.order_id = s_o.id
WHERE s_o.state IN ('sale','done')
AND s_o.warehouse_id = %s
AND s_o_l.product_id in %s group by s_o_l.product_id"""
purchase_query = """
SELECT sum(p_o_l.product_qty) AS product_qty, p_o_l.product_id FROM purchase_order_line AS p_o_l
JOIN purchase_order AS p_o ON p_o_l.order_id = p_o.id
INNER JOIN stock_picking_type AS s_p_t ON p_o.picking_type_id = s_p_t.id
WHERE p_o.state IN ('purchase','done')
AND s_p_t.warehouse_id = %s AND p_o_l.product_id in %s group by p_o_l.product_id"""
params = warehouse_ids, product_ids if product_ids else (0, 0)
self._cr.execute(sale_query, params)
sol_query_obj = self._cr.dictfetchall()
self._cr.execute(purchase_query, params)
pol_query_obj = self._cr.dictfetchall()
for obj in categ_products:
sale_value = 0
purchase_value = 0
for sol_product in sol_query_obj:
if sol_product['product_id'] == obj.id:
sale_value = sol_product['product_uom_qty']
for pol_product in pol_query_obj:
if pol_product['product_id'] == obj.id:
purchase_value = pol_product['product_qty']
virtual_available = obj.with_context({'warehouse': warehouse_ids}).virtual_available
outgoing_qty = obj.with_context({'warehouse': warehouse_ids}).outgoing_qty
incoming_qty = obj.with_context({'warehouse': warehouse_ids}).incoming_qty
available_qty = virtual_available + outgoing_qty - incoming_qty
value = available_qty * obj.standard_price
vals = {
'sku': obj.default_code,
'name': obj.name,
'category': obj.categ_id.name,
'cost_price': obj.standard_price,
'available': available_qty,
'virtual': virtual_available,
'incoming': incoming_qty,
'outgoing': outgoing_qty,
'net_on_hand': obj.with_context({'warehouse': warehouse_ids}).qty_available,
'total_value': value,
'sale_value': sale_value,
'purchase_value': purchase_value,
}
lines.append(vals)
return lines
def get_xlsx_report(self, data, response):
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
lines = self.browse(data['ids'])
d = lines.category_ids
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 if user.tz else 'UTC')
times = pytz.utc.localize(datetime.datetime.now()).astimezone(tz)
sheet.merge_range('A8:G8', 'Report Date: ' + str(times.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
workbook.close()
output.seek(0)
response.stream.write(output.read())
output.close()

View File

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_wizard_stock_history_user,wizard.stock.history,model_wizard_stock_history,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_wizard_stock_history_user wizard.stock.history model_wizard_stock_history base.group_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Some files were not shown because too many files have changed in this diff Show More