summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/sale_order.py
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2024-07-02 10:06:29 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2024-07-02 10:06:29 +0700
commita10024fec206f68791c87a5a4e56e4c6bce28f5c (patch)
tree627d0ca2443eecbcb44b1b4eeda98f94c9ea3496 /indoteknik_custom/models/sale_order.py
parent51c19eca13239fe20ae592f8e9ee0d23f8904c5f (diff)
parentf9c5b3dffcd71bfa9dea74c946d7b4277db66bd6 (diff)
Merge branch 'production' into feature/add_voucher_pastihemat_productsolr
Diffstat (limited to 'indoteknik_custom/models/sale_order.py')
-rwxr-xr-xindoteknik_custom/models/sale_order.py108
1 files changed, 95 insertions, 13 deletions
diff --git a/indoteknik_custom/models/sale_order.py b/indoteknik_custom/models/sale_order.py
index 91792b59..ac81737d 100755
--- a/indoteknik_custom/models/sale_order.py
+++ b/indoteknik_custom/models/sale_order.py
@@ -2,6 +2,7 @@ from odoo import fields, models, api, _
from odoo.exceptions import UserError, ValidationError
from datetime import datetime, timedelta
import logging, random, string, requests, math, json, re
+from collections import defaultdict
_logger = logging.getLogger(__name__)
@@ -9,7 +10,7 @@ _logger = logging.getLogger(__name__)
class SaleOrder(models.Model):
_inherit = "sale.order"
- # fullfillment_line = fields.One2many('sales.order.fullfillment', 'sales_order_id', string='Fullfillment')
+ fullfillment_line = fields.One2many('sales.order.fullfillment', 'sales_order_id', string='Fullfillment')
order_sales_match_line = fields.One2many('sales.order.purchase.match', 'sales_order_id', string='Purchase Match Lines', states={'cancel': [('readonly', True)], 'done': [('readonly', True)]}, copy=True)
total_margin = fields.Float('Total Margin', compute='_compute_total_margin', help="Total Margin in Sales Order Header")
total_percent_margin = fields.Float('Total Percent Margin', compute='_compute_total_percent_margin', help="Total % Margin in Sales Order Header")
@@ -90,22 +91,31 @@ class SaleOrder(models.Model):
picking_iu_id = fields.Many2one('stock.picking', 'Picking IU')
helper_by_id = fields.Many2one('res.users', 'Helper By')
eta_date = fields.Datetime(string='ETA Date', copy=False, compute='_compute_eta_date')
+ flash_sale = fields.Boolean(string='Flash Sale', help='Data dari web')
web_approval = fields.Selection([
('company', 'Company'),
('cust_manager', 'Customer Manager'),
('cust_director', 'Customer Director'),
('cust_procurement', 'Customer Procurement')
], string='Web Approval', copy=False)
- # compute_fullfillment = fields.Boolean(string='Compute Fullfillment', compute="_compute_fullfillment")
+ compute_fullfillment = fields.Boolean(string='Compute Fullfillment', compute="_compute_fullfillment")
+ note_ekspedisi = fields.Char(string="Note Ekspedisi")
+
+ def open_form_multi_create_uang_muka(self):
+ action = self.env['ir.actions.act_window']._for_xml_id('indoteknik_custom.action_sale_order_multi_uangmuka')
+ action['context'] = {
+ 'so_ids': [x.id for x in self]
+ }
+ return action
- # def _compute_fullfillment(self):
- # for rec in self:
- # rec.fullfillment_line.unlink()
+ def _compute_fullfillment(self):
+ for rec in self:
+ rec.fullfillment_line.unlink()
- # for line in rec.order_line:
- # line._compute_reserved_from()
+ for line in rec.order_line:
+ line._compute_reserved_from()
- # rec.compute_fullfillment = True
+ rec.compute_fullfillment = True
def _compute_eta_date(self):
max_leadtime = 0
@@ -453,6 +463,8 @@ class SaleOrder(models.Model):
raise UserError("Credit Limit pada Master Data Customer harus diisi")
if order.payment_term_id != partner.property_payment_term_id:
raise UserError("Payment Term berbeda pada Master Data Customer")
+ if not order.client_order_ref and order.create_date > datetime(2024, 6, 27):
+ raise UserError("Customer Reference kosong, di isi dengan NO PO jika PO tidak ada mohon ditulis Tanpa PO")
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')
@@ -466,11 +478,75 @@ 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 send_notif_to_salesperson(self, cancel=False):
+
+ if not cancel:
+ grouping_so = self.search([
+ ('partner_id.parent_id.id', '=', self.partner_id.parent_id.id),
+ ('partner_id.site_id.id', '=', self.partner_id.site_id.id),
+ ])
+ else:
+ grouping_so = self.search([
+ ('partner_id.parent_id.id', '=', self.partner_id.parent_id.id),
+ ('partner_id.site_id.id', '=', self.partner_id.site_id.id),
+ ('id', '!=', self.id),
+ ])
+ # Kelompokkan data berdasarkan salesperson
+ salesperson_data = {}
+ for rec in grouping_so:
+ if rec.user_id.id not in salesperson_data:
+ salesperson_data[rec.user_id.id] = {'name': rec.user_id.name, 'orders': [], 'total_amount': 0, 'sum_total_amount': 0, 'business_partner': '', 'site': ''} # Menetapkan nilai awal untuk 'site'
+ if rec.picking_ids:
+ if not any(picking.state in ['assigned', 'confirmed', 'waiting'] for picking in rec.picking_ids):
+ continue
+ if all(picking.state == 'done' for picking in rec.picking_ids):
+ continue
+ if all(picking.state == 'cancel' for picking in rec.picking_ids):
+ continue
+ if not rec.partner_id.main_parent_id.use_so_approval:
+ continue
+ order_total_amount = rec.amount_total # Mengakses langsung rec.amount_total
+ salesperson_data[rec.user_id.id]['orders'].append({
+ 'order_name': rec.name,
+ 'parent_name': rec.partner_id.name,
+ 'site_name': rec.partner_id.site_id.name,
+ 'total_amount': rec.amount_total,
+ })
+ salesperson_data[rec.user_id.id]['sum_total_amount'] += order_total_amount
+ salesperson_data[rec.user_id.id]['business_partner'] = grouping_so[0].partner_id.main_parent_id.name
+ salesperson_data[rec.user_id.id]['site'] = grouping_so[0].partner_id.site_id.name # Menambahkan nilai hanya jika ada
+
+ # Kirim email untuk setiap salesperson
+ for salesperson_id, data in salesperson_data.items():
+ if data['orders']:
+ # Buat isi tabel untuk email
+ table_content = ''
+ for order_data in data['orders']:
+ table_content += f"""
+ <tr>
+ <td>{order_data['order_name']}</td>
+ <td>{order_data['parent_name']}</td>
+ <td>{order_data['site_name']}</td>
+ <td>{order_data['total_amount']}</td>
+ </tr>
+ """
+
+ # Dapatkan email salesperson
+ salesperson_email = self.env['res.users'].browse(salesperson_id).partner_id.email
+
+ # Kirim email hanya jika ada data yang dikumpulkan
+ template = self.env.ref('indoteknik_custom.mail_template_sale_order_notification_to_salesperson')
+ email_body = template.body_html.replace('${table_content}', table_content)
+ email_body = email_body.replace('${salesperson_name}', data['name'])
+ email_body = email_body.replace('${sum_total_amount}', str(data['sum_total_amount']))
+ email_body = email_body.replace('${site}', str(data['site']))
+ email_body = email_body.replace('${business_partner}', str(data['business_partner']))
+ # Kirim email
+ self.env['mail.mail'].create({
+ 'subject': 'Notification: Sale Orders',
+ 'body_html': email_body,
+ 'email_to': salesperson_email,
+ }).send()
def action_confirm(self):
for order in self:
@@ -483,6 +559,9 @@ class SaleOrder(models.Model):
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 not order.client_order_ref and order.create_date > datetime(2024, 6, 27):
+ raise UserError("Customer Reference kosong, di isi dengan NO PO jika PO tidak ada mohon ditulis Tanpa PO")
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')
@@ -505,6 +584,7 @@ class SaleOrder(models.Model):
def action_cancel(self):
# TODO stephan prevent cancel if have invoice, do, and po
+ main_parent = self.partner_id.get_main_parent()
if self._name != 'sale.order':
return super(SaleOrder, self).action_cancel()
@@ -520,6 +600,8 @@ class SaleOrder(models.Model):
self.approval_status = False
self.due_id = False
+ if main_parent.use_so_approval:
+ self.send_notif_to_salesperson(cancel=True)
return super(SaleOrder, self).action_cancel()
def validate_partner_invoice_due(self):