summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2024-05-10 07:43:40 +0000
committerIT Fixcomart <it@fixcomart.co.id>2024-05-10 07:43:40 +0000
commite2cf27c1fc540ad24b457d23c89ddd1ea4e6034a (patch)
treea635964dbd0b9729c1d161e16ca7e8dabb02a3c8
parentcb9ae6021dd4858372ed78d16ab491226c95f1d2 (diff)
parent844339e517540826f6990456a63945dc879e37d5 (diff)
Merged in dev/request-by-abl (pull request #141)
Dev/request by abl
-rw-r--r--indoteknik_api/controllers/api_v1/sale_order.py2
-rw-r--r--indoteknik_api/models/__init__.py1
-rw-r--r--indoteknik_api/models/res_partner.py14
-rw-r--r--indoteknik_api/models/sale_order.py2
-rwxr-xr-xindoteknik_custom/__manifest__.py1
-rwxr-xr-xindoteknik_custom/models/__init__.py1
-rw-r--r--indoteknik_custom/models/res_partner.py32
-rw-r--r--indoteknik_custom/models/res_partner_site.py20
-rwxr-xr-xindoteknik_custom/models/sale_order.py14
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv3
-rw-r--r--indoteknik_custom/views/res_partner.xml5
-rw-r--r--indoteknik_custom/views/res_partner_site.xml28
-rwxr-xr-xindoteknik_custom/views/sale_order.xml56
13 files changed, 156 insertions, 23 deletions
diff --git a/indoteknik_api/controllers/api_v1/sale_order.py b/indoteknik_api/controllers/api_v1/sale_order.py
index 50f57c9a..957d49c7 100644
--- a/indoteknik_api/controllers/api_v1/sale_order.py
+++ b/indoteknik_api/controllers/api_v1/sale_order.py
@@ -160,7 +160,7 @@ class SaleOrder(controller.Controller):
if partner.web_role:
sale_order.web_approval = 'cust_%s' % partner.web_role
- if sale_order.web_approval == 'cust_director':
+ if sale_order.web_approval in ['cust_procurement', 'cust_director']:
sale_order.approval_status = 'pengajuan1'
return self.response('success')
diff --git a/indoteknik_api/models/__init__.py b/indoteknik_api/models/__init__.py
index 8c85938c..892d2657 100644
--- a/indoteknik_api/models/__init__.py
+++ b/indoteknik_api/models/__init__.py
@@ -9,4 +9,3 @@ from . import sale_order
from . import x_manufactures
from . import website_content
from . import coupon_program
-from . import res_partner
diff --git a/indoteknik_api/models/res_partner.py b/indoteknik_api/models/res_partner.py
deleted file mode 100644
index 57200ac1..00000000
--- a/indoteknik_api/models/res_partner.py
+++ /dev/null
@@ -1,14 +0,0 @@
-from odoo import models
-
-
-class ResPartner(models.Model):
- _inherit = 'res.partner'
-
- def get_main_parent(self):
- partner = self
-
- while partner.parent_id:
- partner = partner.parent_id
-
- return partner
- \ No newline at end of file
diff --git a/indoteknik_api/models/sale_order.py b/indoteknik_api/models/sale_order.py
index 1c0180ec..c98834bf 100644
--- a/indoteknik_api/models/sale_order.py
+++ b/indoteknik_api/models/sale_order.py
@@ -8,7 +8,7 @@ class SaleOrder(models.Model):
APPROVAL_STEP = {
'company': 1,
'cust_manager': 2,
- 'cust_director': 3,
+ 'cust_director': 3
}
data = {
diff --git a/indoteknik_custom/__manifest__.py b/indoteknik_custom/__manifest__.py
index 1bfaa722..f1f3f9b6 100755
--- a/indoteknik_custom/__manifest__.py
+++ b/indoteknik_custom/__manifest__.py
@@ -121,6 +121,7 @@
'views/cust_commision.xml',
'views/stock_quant.xml',
'views/purchasing_job_state.xml',
+ 'views/res_partner_site.xml',
'report/report.xml',
'report/report_banner_banner.xml',
'report/report_banner_banner2.xml',
diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py
index 92a0f232..160d2af3 100755
--- a/indoteknik_custom/models/__init__.py
+++ b/indoteknik_custom/models/__init__.py
@@ -110,3 +110,4 @@ from . import cust_commision
from . import report_stock_forecasted
from . import web_logging
from . import sales_order_fullfillment
+from . import res_partner_site
diff --git a/indoteknik_custom/models/res_partner.py b/indoteknik_custom/models/res_partner.py
index abb7f739..eee19b2f 100644
--- a/indoteknik_custom/models/res_partner.py
+++ b/indoteknik_custom/models/res_partner.py
@@ -28,14 +28,42 @@ class ResPartner(models.Model):
use_only_ready_stock = fields.Boolean(string='Use Only Ready Stock')
web_role = fields.Selection([
('manager', 'Manager'),
- ('director', 'Director')
+ ('director', 'Director'),
+ ('procurement', 'Procurement'),
], string='Web Role')
+ site_id = fields.Many2one('res.partner.site', string='Site')
+ main_parent_id = fields.Many2one('res.partner', string='Main Parent', compute='_compute_main_parent_id')
pareto_status = fields.Selection([
('PR', 'Pareto Repeating'),
('PPR', 'Potensi Pareto Repeating'),
('PNR', 'Pareto Non Repeating'),
('NP', 'Non Pareto')
])
+
+ @api.onchange('site_id')
+ def _onchange_site_id(self):
+ for rec in self:
+ if not rec.site_id: continue
+ site = rec.site_id
+
+ rec.street = site.street
+ rec.street2 = site.street2
+ rec.city = site.city
+ rec.state_id = site.state_id
+ rec.country_id = site.country_id
+ rec.zip = site.zip
+
+ def get_main_parent(self):
+ partner = self
+
+ while partner.parent_id:
+ partner = partner.parent_id
+
+ return partner
+
+ def _compute_main_parent_id(self):
+ for partner in self:
+ partner.main_parent_id = partner.get_main_parent()
def get_child_ids(self):
partner = self.env['res.partner'].search([('id', '=', self.id)], limit=1)
@@ -47,7 +75,7 @@ class ResPartner(models.Model):
def get_approve_partner_ids(self, type=False):
parent = self.parent_id or self
- partners = self.search([('parent_id', '=', parent.id), ('web_role', 'in', ['manager', 'director'])])
+ partners = self.search([('parent_id', '=', parent.id), ('web_role', '!=', False)])
if type == 'email_comma_sep':
return ",".join([x.email for x in partners])
diff --git a/indoteknik_custom/models/res_partner_site.py b/indoteknik_custom/models/res_partner_site.py
new file mode 100644
index 00000000..00850c97
--- /dev/null
+++ b/indoteknik_custom/models/res_partner_site.py
@@ -0,0 +1,20 @@
+from odoo import models, fields, api
+
+class ResPartnerSite(models.Model):
+ _name = 'res.partner.site'
+
+ partner_ids = fields.One2many('res.partner', 'site_id', string='Partners')
+ partner_id = fields.Many2one('res.partner', string='Partner')
+ name = fields.Char(string='Name')
+ street = fields.Char(string='Street')
+ street2 = fields.Char(string='Street 2')
+ city = fields.Char(string='City')
+ state_id = fields.Many2one('res.country.state', string='State')
+ country_id = fields.Many2one('res.country', string='Country')
+ zip = fields.Char(string='Zip')
+
+ @api.model
+ def create(self, vals):
+ rec = super(ResPartnerSite, self).create(vals)
+ rec.partner_id = rec.partner_id.get_main_parent()
+ return rec \ No newline at end of file
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 620953b9..aa34b0f4 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -93,7 +93,8 @@ class SaleOrder(models.Model):
web_approval = fields.Selection([
('company', 'Company'),
('cust_manager', 'Customer Manager'),
- ('cust_director', 'Customer Director')
+ ('cust_director', 'Customer Director'),
+ ('cust_procurement', 'Customer Procurement')
], string='Web Approval', copy=False)
compute_fullfillment = fields.Boolean(string='Compute Fullfillment', compute="_compute_fullfillment")
@@ -458,6 +459,12 @@ class SaleOrder(models.Model):
raise UserError("Bisa langsung Confirm")
+ def send_notif_to_salesperson(self):
+ for rec in self:
+ if not rec.partner_id.main_parent_id.use_so_approval: continue
+ template = self.env.ref('indoteknik_custom.mail_template_sale_order_notification_to_salesperson')
+ template.send_mail(rec.id, force_send=True)
+
def action_confirm(self):
for order in self:
order._validate_order()
@@ -467,8 +474,8 @@ class SaleOrder(models.Model):
SYSTEM_UID = 25
FROM_WEBSITE = order.create_uid.id == SYSTEM_UID
- if FROM_WEBSITE and main_parent.use_so_approval and order.web_approval != 'cust_director':
- raise UserError("This order not yet approved by customer director")
+ if FROM_WEBSITE and main_parent.use_so_approval and order.web_approval not in ['cust_procurement', 'cust_director']:
+ raise UserError("This order not yet approved by customer procurement or director")
if order.validate_partner_invoice_due():
return self._create_notification_action('Notification', 'Terdapat invoice yang telah melewati batas waktu, mohon perbarui pada dokumen Due Extension')
@@ -483,6 +490,7 @@ class SaleOrder(models.Model):
order.approval_status = 'approved'
order._set_sppkp_npwp_contact()
order.calculate_line_no()
+ order.send_notif_to_salesperson()
# order.order_line.get_reserved_from()
res = super(SaleOrder, self).action_confirm()
diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv
index 6d265748..f03e0118 100755
--- a/indoteknik_custom/security/ir.model.access.csv
+++ b/indoteknik_custom/security/ir.model.access.csv
@@ -109,4 +109,5 @@ access_report_logbook_sj_line,access.report.logbook.sj.line,model_report_logbook
access_cust_commision,access.cust.commision,model_cust_commision,,1,1,1,1
access_report_stock_report_product_product_replenishment,access.report.stock.report_product_product_replenishment,model_report_stock_report_product_product_replenishment,,1,1,1,1
access_sales_order_fullfillment,access.sales.order.fullfillment,model_sales_order_fullfillment,,1,1,1,1
-access_purchasing_job_state,access.purchasing.job.state,model_purchasing_job_state,,1,1,1,1 \ No newline at end of file
+access_purchasing_job_state,access.purchasing.job.state,model_purchasing_job_state,,1,1,1,1
+access_res_partner_site,access.res_partner_site,model_res_partner_site,,1,1,1,1 \ No newline at end of file
diff --git a/indoteknik_custom/views/res_partner.xml b/indoteknik_custom/views/res_partner.xml
index 4c481e8a..59d33f29 100644
--- a/indoteknik_custom/views/res_partner.xml
+++ b/indoteknik_custom/views/res_partner.xml
@@ -32,6 +32,11 @@
<field name="use_only_ready_stock" attrs="{'invisible': [('parent_id', '!=', False), ('company_type', '!=', 'company')]}" />
<field name="web_role" attrs="{'invisible': ['|', ('parent_id', '=', False), ('company_type', '=', 'company')]}" />
</field>
+ <xpath expr="//field[@name='child_ids']/form//field[@name='name']" position="before">
+ <field name="parent_id" invisible="1" />
+ <field name="main_parent_id" invisible="1" />
+ <field name="site_id" attrs="{'readonly': [('parent_id', '=', False)]}" domain="[('partner_id', '=', main_parent_id)]" context="{'default_partner_id': active_id}" />
+ </xpath>
</field>
</record>
</data>
diff --git a/indoteknik_custom/views/res_partner_site.xml b/indoteknik_custom/views/res_partner_site.xml
new file mode 100644
index 00000000..df4c8c4a
--- /dev/null
+++ b/indoteknik_custom/views/res_partner_site.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<odoo>
+ <data>
+ <record id="res_partner_site_form_view" model="ir.ui.view">
+ <field name="name">Partner Site</field>
+ <field name="model">res.partner.site</field>
+ <field name="arch" type="xml">
+ <form>
+ <group>
+ <group>
+ <field name="name" required="1" />
+ <field name="partner_id" invisible="1" />
+ <label for="street" string="Address" />
+ <div class="o_address_format" name="div_address">
+ <field name="street" placeholder="Street..." class="o_address_street"/>
+ <field name="street2" placeholder="Street 2..." class="o_address_street"/>
+ <field name="city" placeholder="City" class="o_address_city"/>
+ <field name="state_id" class="o_address_state" placeholder="State" options="{'no_open': True, 'no_quick_create': True}" context="{'country_id': country_id, 'default_country_id': country_id, 'zip': zip}"/>
+ <field name="zip" placeholder="ZIP" class="o_address_zip"/>
+ <field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
+ </div>
+ </group>
+ </group>
+ </form>
+ </field>
+ </record>
+ </data>
+</odoo> \ No newline at end of file
diff --git a/indoteknik_custom/views/sale_order.xml b/indoteknik_custom/views/sale_order.xml
index 2cc406ea..d6738759 100755
--- a/indoteknik_custom/views/sale_order.xml
+++ b/indoteknik_custom/views/sale_order.xml
@@ -310,4 +310,60 @@
</field>
</record>
</data>
+
+ <data>
+ <record id="mail_template_sale_order_notification_to_salesperson" model="mail.template">
+ <field name="name">Sale Order: Notification to Salesperson</field>
+ <field name="model_id" ref="sale.model_sale_order"/>
+ <field name="subject">Konsolidasi Pengiriman</field>
+ <field name="email_from">sales@indoteknik.com</field>
+ <field name="email_to">${object.user_id.login | safe}</field>
+ <field name="body_html" type="html">
+ <table border="0" cellpadding="0" cellspacing="0" style="padding-top: 16px; background-color: #F1F1F1; font-family:Inter, Helvetica, Verdana, Arial,sans-serif; line-height: 24px; color: #454748; width: 100%; border-collapse:separate;">
+ <tr><td align="center">
+ <table border="0" cellpadding="0" cellspacing="0" width="590" style="font-size: 13px; padding: 16px; background-color: white; color: #454748; border-collapse:separate;">
+ <!-- HEADER -->
+ <tbody>
+ <tr>
+ <td align="center" style="min-width: 590px;">
+ <table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
+ <tr>
+ <td valign="middle">
+ <span></span>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2" style="text-align:center;">
+ <hr width="100%" style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <!-- CONTENT -->
+ <tr>
+ <td align="center" style="min-width: 590px;">
+ <table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
+ <tr><td style="padding-bottom: 24px;">Dear ${object.user_id.name},</td></tr>
+
+ <tr><td style="padding-bottom: 16px;">Terdapat pesanan ${object.name} dari ${object.partner_id.main_parent_id.name} untuk site ${object.partner_shipping_id.site_id.name | safe} dengan total pembelian ${object.grand_total}</td></tr>
+
+ <tr>
+ <td style="text-align:center;">
+ <hr width="100%"
+ style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;" />
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <!-- CONTENT -->
+ </tbody>
+ </table>
+ </td></tr>
+ </table>
+ </field>
+ </record>
+ </data>
</odoo> \ No newline at end of file