diff --git a/MKS_Tradex_Backend_2/__init__.py b/MKS_Tradex_Backend_2/__init__.py new file mode 100755 index 0000000..d6210b1 --- /dev/null +++ b/MKS_Tradex_Backend_2/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/MKS_Tradex_Backend_2/__manifest__.py b/MKS_Tradex_Backend_2/__manifest__.py new file mode 100755 index 0000000..59710e6 --- /dev/null +++ b/MKS_Tradex_Backend_2/__manifest__.py @@ -0,0 +1,29 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +{ + 'name': 'MKS Tradex Backend', + 'version': '13.0.1.0', + 'category': 'Operations/Purchase', + 'description': """ +This module allows you to manage your Purchase Agreements flow. + Store keeper create Purchase Agreement + Purchase Codinator Approve / Reject Purchase Agreement + Purchase Manager Approve / Reject Purchase Agreement + Purchase Codinator Create RFQ after Approve purchase agreement by purchase manager + +""", + 'depends': ['purchase','purchase_requisition','sale_management'], + 'data': [ + 'edi/mail_template.xml', + 'edi/purchase_mail_template.xml', + 'edi/sale_mail_template.xml', + 'edi/invoice_mail_template.xml', + 'security/purchase_security.xml', + 'security/account_security.xml', + 'views/purchase_requisition_views.xml', + 'views/purchase_order_views.xml', + 'views/sale_order_view.xml', + 'views/stock_picking.xml', + 'views/account_move_views.xml', + ], + +} diff --git a/MKS_Tradex_Backend_2/edi/invoice_mail_template.xml b/MKS_Tradex_Backend_2/edi/invoice_mail_template.xml new file mode 100755 index 0000000..0adda9e --- /dev/null +++ b/MKS_Tradex_Backend_2/edi/invoice_mail_template.xml @@ -0,0 +1,36 @@ + + + + + + + Invoice Approval Email Temmplate + ${(object.user_id.email and '%s <%s>' % (object.user_id.company_id.name, object.user_id.email) or '')|safe} + Invoice Financial Approval + + + +

To Manager,


+

Please Approve Account Invoice Request bellow link

+ + + % set setup_url = object.make_invoice_url() +

+ Approve Invoice Request +

+ + + ]]>
+
+ +
+ + + + + + + + diff --git a/MKS_Tradex_Backend_2/edi/mail_template.xml b/MKS_Tradex_Backend_2/edi/mail_template.xml new file mode 100755 index 0000000..318949c --- /dev/null +++ b/MKS_Tradex_Backend_2/edi/mail_template.xml @@ -0,0 +1,66 @@ + + + + + + + Purchase Coordinator + ${(object.user_id.email and '%s <%s>' % (object.user_id.company_id.name, object.user_id.email) or '')|safe} + Purchase Agreements Approve + + + +

Dear Purchase Coordinator,


+

Please Approve Purchase Agreements bellow link

+ + ${object.basick_information() | safe} + ${object.line_information() | safe} + + % set setup_url = object.make_url() +

+ Approve Purchase Agreements +

+ + + ]]>
+
+ + + Purchase Manager + ${(object.user_id.email and '%s <%s>' % (object.user_id.company_id.name, object.user_id.email) or '')|safe} + Purchase Agreements Approve + + + +

Dear Managment,


+

Please Approve Purchase Agreements bellow link

+ + ${object.basick_information() | safe} + ${object.line_information() | safe} + + + % set setup_url = object.make_url() +

+ Approve Purchase Agreements +

+ + + ]]>
+
+ + + + +
+ + + + + + + + diff --git a/MKS_Tradex_Backend_2/edi/purchase_mail_template.xml b/MKS_Tradex_Backend_2/edi/purchase_mail_template.xml new file mode 100755 index 0000000..ed75164 --- /dev/null +++ b/MKS_Tradex_Backend_2/edi/purchase_mail_template.xml @@ -0,0 +1,57 @@ + + + + + + + Purchase Coordinator + ${(object.user_id.email and '%s <%s>' % (object.user_id.company_id.name, object.user_id.email) or '')|safe} + Purchase Request Approve + + + +

Dear Coordinator,


+

Please Approve Purchase Request bellow link

+ + + % set setup_url = object.make_url() +

+ Approve Purchase Request +

+ + + ]]>
+
+ + + Purchase Manager + ${(object.user_id.email and '%s <%s>' % (object.user_id.company_id.name, object.user_id.email) or '')|safe} + Purchase Request confirm + + + +

Dear Manager,


+

Please Confirm Purchase Request bellow link

+ + + % set setup_url = object.make_url() +

+ Approve Purchase Request +

+ + + ]]>
+
+
+ + + + + + + + diff --git a/MKS_Tradex_Backend_2/edi/sale_mail_template.xml b/MKS_Tradex_Backend_2/edi/sale_mail_template.xml new file mode 100755 index 0000000..2a1795f --- /dev/null +++ b/MKS_Tradex_Backend_2/edi/sale_mail_template.xml @@ -0,0 +1,101 @@ + + + + + + + Sale Manager + ${(object.user_id.email and '%s <%s>' % (object.user_id.company_id.name, object.user_id.email) or '')|safe} + Sale Management Approval + + + +

Dear Sale Management ,


+

Please Approve RFQ Request bellow link

+ + + % set setup_url = object.make_url() +

+ Approve Sale Order Request +

+ + + ]]>
+
+ + + Sale Store Keeper + Management Approval + + + +

Dear ${(object.user_id.name)} ,


+

Please Approve RFQ Request bellow link

+ + % set setup_url = object.make_url() +

+ Approve Sale Order Request +

+ + + ]]>
+
+ + + Sale Logistic Approval + ${(object.user_id.email and '%s <%s>' % (object.user_id.company_id.name, object.user_id.email) or '')|safe} + Logistic Approval + + + +

Dear Logistic,


+

Please Approve Sale Order bellow link

+ + % set setup_url = object.make_url() +

+ Approve Sale Order Request +

+ + + ]]>
+
+ + + Credit controller + Credit Controller Confirm Sale Order + + + +

Dear Credit Controller,


+

Please Approve Sale Order bellow link

+ + % set setup_url = object.make_url() +

+ Approve Sale Order Request +

+ + + ]]>
+
+ + + + + +
+ + + + + + + + diff --git a/MKS_Tradex_Backend_2/models/__init__.py b/MKS_Tradex_Backend_2/models/__init__.py new file mode 100755 index 0000000..46dcdfc --- /dev/null +++ b/MKS_Tradex_Backend_2/models/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import purchase_requisition +from . import purchase_order +from . import stock_picking +from . import sale_order +from . import account_invoice diff --git a/MKS_Tradex_Backend_2/models/account_invoice.py b/MKS_Tradex_Backend_2/models/account_invoice.py new file mode 100755 index 0000000..6d91d75 --- /dev/null +++ b/MKS_Tradex_Backend_2/models/account_invoice.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, SUPERUSER_ID, _ + +class account_move(models.Model): + _inherit = "account.move" + + state = fields.Selection(selection_add=[('approval','Financial Approval')]) + + def make_invoice_url(self): + for invoice in self: + base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url', default='http://localhost:8069') + if base_url: + base_url += '/web/login?db=%s&login=%s&key=%s#id=%s&model=%s' % ( + self._cr.dbname, '', '', invoice.id, 'account.move') + return base_url + + def get_email(self): + group_id = self.env['ir.model.data'].get_object_reference('account', 'group_account_manager')[1] + email = '' + if group_id: + group_id = self.env['res.groups'].browse(group_id) + for user in group_id.users: + if user.partner_id.email: + if email: + email = email+','+user.partner_id.email + else: + email = user.partner_id.email + return email + + def send_invoice_approval_mail(self): + email = self.get_email() + if email: + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'invoice_approval_mail_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.write({'email_to': email}) + mail_tem.send_mail(self.id,True) + + + def action_post(self): + if self.env.user.has_group('account.group_account_manager'): + return super(account_move,self).action_post() + else: + if self.type in ['out_invoice','out_refund','in_invoice','in_refund'] and self.state == 'draft': + self.send_invoice_approval_mail() + self.state = 'approval' + else: + return super(account_move,self).action_post() + diff --git a/MKS_Tradex_Backend_2/models/purchase_order.py b/MKS_Tradex_Backend_2/models/purchase_order.py new file mode 100755 index 0000000..cc369c8 --- /dev/null +++ b/MKS_Tradex_Backend_2/models/purchase_order.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, SUPERUSER_ID, _ + +class purchase_order(models.Model): + _inherit = "purchase.order" + + state = fields.Selection([ + ('draft', 'RFQ'), + ('sent', 'RFQ Sent'), + ('approved', 'RFQ Approved'), + ('po_approval', 'PO Approval'), + ('to approve', 'To Approve'), + ('purchase', 'Purchase Order'), + ('done', 'Locked'), + ('cancel', 'Cancelled') + ], string='Status', readonly=True, index=True, copy=False, default='draft', tracking=True) + + def make_url(self): + record_id = self.id + menu_id = self.env.ref('purchase.menu_purchase_rfq').id + action_id = self.env.ref('purchase.purchase_rfq').id + base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + if base_url: + base_url += \ + '/web?#id=%s&view_type=form&model=%s&menu_id=%s&action=%s' % ( + self.id, self._name, menu_id, action_id) + return base_url + + def action_manager_approval(self): + group_id = self.env['ir.model.data'].get_object_reference('MKS_Tradex_Backend_2', 'group_purchase_coordinator')[1] + if group_id: + browse_group = self.env['res.groups'].browse(group_id) + for user in browse_group.users: + manager_mail = user.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'purchase_req_coordinator_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.send_mail(self.id,True) + mail_tem.write({'email_to': manager_mail}) + self.state = 'approved' + + def button_confirm_mks(self): + group_id = self.env['ir.model.data'].get_object_reference('purchase', 'group_purchase_manager')[1] + if group_id: + browse_group = self.env['res.groups'].browse(group_id) + for user in browse_group.users: + manager_mail = user.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'purchase_req_manager_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.send_mail(self.id,True) + mail_tem.write({'email_to': manager_mail}) + self.state = 'po_approval' + return True + + + def button_confirm(self): + for order in self: + if order.state not in ['draft', 'sent','approved','po_approval']: + continue + order._add_supplier_to_product() + # Deal with double validation process + if order.company_id.po_double_validation == 'one_step'\ + or (order.company_id.po_double_validation == 'two_step'\ + and order.amount_total < self.env.company.currency_id._convert( + order.company_id.po_double_validation_amount, order.currency_id, order.company_id, order.date_order or fields.Date.today()))\ + or order.user_has_groups('purchase.group_purchase_manager'): + order.button_approve() + else: + order.write({'state': 'to approve'}) + return True diff --git a/MKS_Tradex_Backend_2/models/purchase_requisition.py b/MKS_Tradex_Backend_2/models/purchase_requisition.py new file mode 100755 index 0000000..f5b2250 --- /dev/null +++ b/MKS_Tradex_Backend_2/models/purchase_requisition.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, SUPERUSER_ID, _ + + +PURCHASE_REQUISITION_STATES = [ + ('draft', 'Draft'), + ('approval', 'Approval'), + ('manager_approval','Manager Approval'), + ('approved','Approved'), + ('ongoing', 'Ongoing'), + ('in_progress', 'Confirmed'), + ('open', 'Bid Selection'), + ('done', 'Closed'), + ('cancel', 'Cancelled'), +] + +class purchase_requisition(models.Model): + _inherit = "purchase.requisition" + + state = fields.Selection(PURCHASE_REQUISITION_STATES, + 'Status', tracking=True, required=True, + copy=False, default='draft') + + state_blanket_order = fields.Selection(PURCHASE_REQUISITION_STATES, compute='_set_state') + + @api.depends('state') + def _set_state(self): + self.state_blanket_order = self.state + + def basick_information(self): + order_table='' + order_table +=''' + + + + + + + + + ''' + Purchase_rep = self.user_id and self.user_id.name or ' ' + agreement_type = self.type_id and self.type_id.name or ' ' + vendor = self.vendor_id and self.vendor_id.name or ' ' + agreement_deadline = self.date_end or ' ' + delivery_date = self.schedule_date or ' ' + order_table += "" + '' + '' + '' + '' + '' + "" + + order_table += ''' +
Purchase Representative
Agreement Type
Vendor
Agreement Deadline
Delivery Date
' + Purchase_rep + '' + str(agreement_type) + '' + vendor + '' + str(agreement_deadline) + '' + str(delivery_date) + '
+ ''' + + return order_table + + + def line_information(self): + order_table='' + order_table +=''' + + + + + + + + + ''' + for line in self.line_ids: + product_name = line.product_id and line.product_id.name or ' ' + schedule_date = line.schedule_date or ' ' + order_table += "" + '' + '' + '' + '' + '' + "" + order_table += ''' +
Product
Quantity
Order Quantity
Scheduled Date
Unit Price
' + product_name + '' + str(line.product_qty) + '' + str(line.qty_ordered) + '' + str(schedule_date) + '' + str(line.price_unit) + '
+ ''' + + return order_table + + + + def make_url(self): + record_id = self.id + menu_id = self.env.ref('purchase_requisition.menu_purchase_requisition_pro_mgt').id + action_id = self.env.ref('purchase_requisition.action_purchase_requisition').id + base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + if base_url: + base_url += \ + '/web?#id=%s&view_type=form&model=%s&menu_id=%s&action=%s' % ( + self.id, self._name, menu_id, action_id) + return base_url + + def action_approval(self): + group_id = self.env['ir.model.data'].get_object_reference('MKS_Tradex_Backend_2', 'group_purchase_coordinator')[1] + if group_id: + browse_group = self.env['res.groups'].browse(group_id) + for user in browse_group.users: + coordinator_mail = user.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'purchase_coordinator_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.send_mail(self.id,True) + mail_tem.write({'email_to': coordinator_mail}) + self.state = 'approval' + + def action_coordinator_approval(self): + group_id = self.env['ir.model.data'].get_object_reference('purchase', 'group_purchase_manager')[1] + if group_id: + browse_group = self.env['res.groups'].browse(group_id) + for user in browse_group.users: + manager_mail = user.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'purchase_manager_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.send_mail(self.id,True) + mail_tem.write({'email_to': manager_mail}) + self.state = 'manager_approval' + + def action_manager_approval(self): + self.state = 'approved' + diff --git a/MKS_Tradex_Backend_2/models/sale_order.py b/MKS_Tradex_Backend_2/models/sale_order.py new file mode 100755 index 0000000..0c50a66 --- /dev/null +++ b/MKS_Tradex_Backend_2/models/sale_order.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, SUPERUSER_ID, _ + +class sale_order(models.Model): + _inherit = "sale.order" + + # logistics_id = fields.Many2one('res.users',string="Logistics Users") + # credit_controller_id = fields.Many2one('res.users',string="Credit Controller") + + state = fields.Selection([ + ('draft', 'Quotation'), + ('approval', 'RFQ approval'), + ('approved', 'RFQ Approved'), + ('logistics_approval', 'Logistics Approval'), + ('logistics_approved', 'Logistics Approved'), + ('credit_approval', 'Credit Approval'), + ('sent', 'Quotation Sent'), + ('sale', 'Sales Order'), + ('done', 'Locked'), + ('cancel', 'Cancelled'), + ], string='Status', readonly=True, copy=False, index=True, tracking=3, default='draft') + + def make_url(self): + record_id = self.id + menu_id = self.env.ref('sale.menu_sale_quotations').id + action_id = self.env.ref('sale.action_quotations_with_onboarding').id + base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + if base_url: + base_url += \ + '/web?#id=%s&view_type=form&model=%s&menu_id=%s&action=%s' % ( + self.id, self._name, menu_id, action_id) + return base_url + + + def action_confirm_approval_request(self): + group_id = self.env['ir.model.data'].get_object_reference('sales_team', 'group_sale_manager')[1] + if group_id: + browse_group = self.env['res.groups'].browse(group_id) + for user in browse_group.users: + print ("=====",user.name) + manager_mail = user.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'sale_manager_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.write({'email_to': manager_mail}) + mail_tem.send_mail(self.id,True) + self.state = 'approval' + return True + + def action_manager_approval(self): + user_email = self.user_id.partner_id.email + manager = self.env.user.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'sale_user_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.send_mail(self.id,True) + mail_tem.write({'email_from': manager,'email_to': user_email}) + self.state = 'approved' + return True + + def action_logistics_approval(self): + group_id = self.env['ir.model.data'].get_object_reference('MKS_Tradex_Backend_2', 'group_sale_logistics')[1] + if group_id: + browse_group = self.env['res.groups'].browse(group_id) + for user in browse_group.users: + manager_mail = user.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'sale_logistic_approval_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.send_mail(self.id,True) + mail_tem.write({'email_to': manager_mail}) + self.state = 'logistics_approval' + return True + + def action_logistics_approve(self): + group_id = self.env['ir.model.data'].get_object_reference('MKS_Tradex_Backend_2', 'group_credit_controller')[1] + if group_id: + browse_group = self.env['res.groups'].browse(group_id) + for user in browse_group.users: + credit_controller = user.partner_id.email + user_email = self.user_id.partner_id.email + mtp =self.env['mail.template'] + ir_model_data = self.env['ir.model.data'] + template_id = ir_model_data.get_object_reference('MKS_Tradex_Backend_2', 'sale_credit_controller_template') + mail_tem=mtp.browse(template_id[1]) + mail_tem.send_mail(self.id,True) + mail_tem.write({'email_from': user_email,'email_to': credit_controller}) + self.state = 'sale' + return True + + + def action_credit_approval(self): + self.state = 'credit_approval' + return True + + + + diff --git a/MKS_Tradex_Backend_2/models/stock_picking.py b/MKS_Tradex_Backend_2/models/stock_picking.py new file mode 100755 index 0000000..7f886d3 --- /dev/null +++ b/MKS_Tradex_Backend_2/models/stock_picking.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, SUPERUSER_ID, _ + +class stock_picking(models.Model): + _inherit = "stock.picking" + + state = fields.Selection(selection_add=[('qa_approval', 'QA approval')], + ) + + def button_validate_qa_approval(self): + self.state = 'qa_approval' + return True + + diff --git a/MKS_Tradex_Backend_2/security/account_security.xml b/MKS_Tradex_Backend_2/security/account_security.xml new file mode 100755 index 0000000..c6e3b03 --- /dev/null +++ b/MKS_Tradex_Backend_2/security/account_security.xml @@ -0,0 +1,14 @@ + + + + + + Accountant + + + + Finance Manager + + + + diff --git a/MKS_Tradex_Backend_2/security/purchase_security.xml b/MKS_Tradex_Backend_2/security/purchase_security.xml new file mode 100644 index 0000000..c771245 --- /dev/null +++ b/MKS_Tradex_Backend_2/security/purchase_security.xml @@ -0,0 +1,45 @@ + + + + + + Store Keeper + + + + Purchase Coordinator + + + + + + Management + + + + + + + Store Keeper + + + + Logistics and Warehouse Coordinator + + + + + + Credit Controller + + + + + Management + + + + + + + diff --git a/MKS_Tradex_Backend_2/views/account_move_views.xml b/MKS_Tradex_Backend_2/views/account_move_views.xml new file mode 100644 index 0000000..20491a6 --- /dev/null +++ b/MKS_Tradex_Backend_2/views/account_move_views.xml @@ -0,0 +1,17 @@ + + + + view.account.move.inherit.form + account.move + + + +