diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2024-07-02 10:06:29 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2024-07-02 10:06:29 +0700 |
| commit | a10024fec206f68791c87a5a4e56e4c6bce28f5c (patch) | |
| tree | 627d0ca2443eecbcb44b1b4eeda98f94c9ea3496 /indoteknik_custom/models/sale_order.py | |
| parent | 51c19eca13239fe20ae592f8e9ee0d23f8904c5f (diff) | |
| parent | f9c5b3dffcd71bfa9dea74c946d7b4277db66bd6 (diff) | |
Merge branch 'production' into feature/add_voucher_pastihemat_productsolr
Diffstat (limited to 'indoteknik_custom/models/sale_order.py')
| -rwxr-xr-x | indoteknik_custom/models/sale_order.py | 108 |
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): |
