diff options
| -rw-r--r-- | indoteknik_custom/models/account_move.py | 133 | ||||
| -rwxr-xr-x | indoteknik_custom/security/ir.model.access.csv | 4 | ||||
| -rw-r--r-- | indoteknik_custom/views/account_move.xml | 35 |
3 files changed, 132 insertions, 40 deletions
diff --git a/indoteknik_custom/models/account_move.py b/indoteknik_custom/models/account_move.py index e5e68146..6713e87c 100644 --- a/indoteknik_custom/models/account_move.py +++ b/indoteknik_custom/models/account_move.py @@ -128,45 +128,35 @@ class AccountMove(models.Model): move.payment_date = False def action_sync_promise_date(self): - for inv in self: - if not inv.customer_promise_date: - inv.env.user.notify_warning( - message="Isi Janji Bayar terlebih dahulu sebelum melakukan sinkronisasi.", - title="Sync Gagal", - ) - continue - - # Cari invoice lain milik partner yang due date sama - other_invoices = self.search([ - ('id', '!=', inv.id), - ('partner_id', '=', inv.partner_id.id), - ('invoice_date_due', '=', inv.invoice_date_due), - ('move_type', '=', 'out_invoice'), - ('state', '=', 'posted'), - ]) - - if not other_invoices: - inv.env.user.notify_info( - message="Tidak ada invoice lain dengan due date yang sama untuk disinkronkan.", - title="Sync Janji Bayar", - ) - continue - - # Sync field - other_invoices.write({'customer_promise_date': inv.customer_promise_date}) - - # Log di invoices lain - for other in other_invoices: - other.message_post( - body=f"Janji Bayar {inv.customer_promise_date} disinkronkan dari invoice {inv.name}." - ) + self.ensure_one() + if not self.customer_promise_date: + raise UserError("Isi Janji Bayar terlebih dahulu sebelum melakukan sinkronisasi.") + + other_invoices = self.env['account.move'].search([ + ('id', '!=', self.id), + ('partner_id', '=', self.partner_id.id), + ('invoice_date_due', '=', self.invoice_date_due), + ('move_type', '=', 'out_invoice'), + ('state', '=', 'posted'), + ('date_terima_tukar_faktur', '!=', False) + ]) + lines = [] + for inv in other_invoices: + lines.append((0, 0, {'invoice_id': inv.id, 'sync_check': True})) # default dicentang semua - # Log di invoice asal - other_names = ", ".join(other_invoices.mapped("name")) - inv.message_post( - body=f"Janji Bayar {inv.customer_promise_date} disinkronkan ke {len(other_invoices)} invoice lain: {other_names}." - ) + wizard = self.env['sync.promise.date.wizard'].create({ + 'invoice_id': self.id, + 'line_ids': lines, + }) + return { + 'name': 'Sync Janji Bayar', + 'type': 'ir.actions.act_window', + 'res_model': 'sync.promise.date.wizard', + 'view_mode': 'form', + 'res_id': wizard.id, + 'target': 'new', + } def send_due_invoice_reminder(self): today = fields.Date.today() @@ -744,4 +734,71 @@ class AccountMove(models.Model): 'date_efaktur_exported': datetime.utcnow(), }) - return response
\ No newline at end of file + return response + +class SyncPromiseDateWizard(models.TransientModel): + _name = "sync.promise.date.wizard" + _description = "Sync Janji Bayar Wizard" + + invoice_id = fields.Many2one('account.move', string="Invoice Utama", required=True) + promise_date = fields.Date(string="Janji Bayar", related="invoice_id.customer_promise_date", readonly=True) + line_ids = fields.One2many('sync.promise.date.wizard.line', 'wizard_id', string="Invoices Terkait") + + def action_check_all(self): + for line in self.line_ids: + line.sync_check = True + return { + 'type': 'ir.actions.act_window', + 'res_model': 'sync.promise.date.wizard', + 'view_mode': 'form', + 'res_id': self.id, + 'target': 'new', + } + + def action_uncheck_all(self): + for line in self.line_ids: + line.sync_check = False + return { + 'type': 'ir.actions.act_window', + 'res_model': 'sync.promise.date.wizard', + 'view_mode': 'form', + 'res_id': self.id, + 'target': 'new', + } + + def action_confirm(self): + self.ensure_one() + selected_lines = self.line_ids.filtered(lambda l: l.sync_check) + selected_invoices = selected_lines.mapped('invoice_id') + + if not selected_invoices: + raise UserError("Tidak ada invoice dipilih untuk sinkronisasi.") + + # Update hanya invoice yang dipilih + for inv in selected_invoices: + inv.write({'customer_promise_date': self.promise_date}) + inv.message_post( + body=f"Janji Bayar {self.promise_date} disinkronkan dari invoice {self.invoice_id.name}." + ) + + # Log di invoice utama + self.invoice_id.message_post( + body=f"Janji Bayar {self.promise_date} disinkronkan ke {len(selected_invoices)} invoice lain: {', '.join(selected_invoices.mapped('name'))}." + ) + return {'type': 'ir.actions.act_window_close'} + + +class SyncPromiseDateWizardLine(models.TransientModel): + _name = "sync.promise.date.wizard.line" + _description = "Sync Janji Bayar Wizard Line" + + wizard_id = fields.Many2one('sync.promise.date.wizard', string="Wizard") + invoice_id = fields.Many2one('account.move', string="Invoice") + sync_check = fields.Boolean(string="Sync?") + invoice_name = fields.Char(related="invoice_id.name", string="Nomor Invoice", readonly=True) + invoice_date_due = fields.Date(related="invoice_id.invoice_date_due", string="Due Date", readonly=True) + invoice_day_to_due = fields.Integer(related="invoice_id.invoice_day_to_due", string="Day to Due", readonly=True) + new_invoice_day_to_due = fields.Integer(related="invoice_id.new_invoice_day_to_due", string="New Day Due", readonly=True) + date_terima_tukar_faktur = fields.Date(related="invoice_id.date_terima_tukar_faktur", string="Tanggal Terima Tukar Faktur", readonly=True) + amount_total = fields.Monetary(related="invoice_id.amount_total", string="Total", readonly=True) + currency_id = fields.Many2one(related="invoice_id.currency_id", readonly=True)
\ No newline at end of file diff --git a/indoteknik_custom/security/ir.model.access.csv b/indoteknik_custom/security/ir.model.access.csv index d6e44f9d..78b3dc0f 100755 --- a/indoteknik_custom/security/ir.model.access.csv +++ b/indoteknik_custom/security/ir.model.access.csv @@ -192,4 +192,6 @@ access_tukar_guling_line_all_users,tukar.guling.line.all.users,model_tukar_gulin access_tukar_guling_po_all_users,tukar.guling.po.all.users,model_tukar_guling_po,base.group_user,1,1,1,1 access_tukar_guling_line_po_all_users,tukar.guling.line.po.all.users,model_tukar_guling_line_po,base.group_user,1,1,1,1 access_tukar_guling_mapping_koli_all_users,tukar.guling.mapping.koli.all.users,model_tukar_guling_mapping_koli,base.group_user,1,1,1,1 -access_purchase_order_update_date_wizard,access.purchase.order.update.date.wizard,model_purchase_order_update_date_wizard,base.group_user,1,1,1,1
\ No newline at end of file +access_purchase_order_update_date_wizard,access.purchase.order.update.date.wizard,model_purchase_order_update_date_wizard,base.group_user,1,1,1,1 +access_sync_promise_date_wizard,access.sync.promise.date.wizard,model_sync_promise_date_wizard,base.group_user,1,1,1,1 +access_sync_promise_date_wizard_line,access.sync.promise.date.wizard.line,model_sync_promise_date_wizard_line,base.group_user,1,1,1,1
\ No newline at end of file diff --git a/indoteknik_custom/views/account_move.xml b/indoteknik_custom/views/account_move.xml index 284043d0..b399d4c9 100644 --- a/indoteknik_custom/views/account_move.xml +++ b/indoteknik_custom/views/account_move.xml @@ -73,7 +73,8 @@ <button name="action_sync_promise_date" string="Sync Janji Bayar ke Invoice Lain" type="object" - class="btn-primary"/> + class="btn-primary" + help="Sync Janji Bayar Customer ke Invoices dengan jumlah Due Date yang sama"/> </field> <field name="to_check" position="after"> <field name="already_paid"/> @@ -202,5 +203,37 @@ <field name="state">code</field> <field name="code">action = records.export_faktur_to_xml()</field> </record> + + <record id="view_sync_promise_date_wizard_form" model="ir.ui.view"> + <field name="name">sync.promise.date.wizard.form</field> + <field name="model">sync.promise.date.wizard</field> + <field name="arch" type="xml"> + <form string="Sync Janji Bayar"> + <group> + <field name="invoice_id" readonly="1"/> + <field name="promise_date" readonly="1"/> + </group> + <field name="line_ids"> + <tree create="false" delete="false" editable="bottom"> + <field name="sync_check"/> + <field name="invoice_name" readonly="1"/> + <field name="invoice_date_due" readonly="1"/> + <field name="invoice_day_to_due" readonly="1"/> + <field name="new_invoice_day_to_due" readonly="1"/> + <field name="date_terima_tukar_faktur" readonly="1"/> + <field name="amount_total" readonly="1"/> + </tree> + </field> + + <button name="action_check_all" string="Check All" type="object" class="btn-secondary"/> + <button name="action_uncheck_all" string="Uncheck All" type="object" class="btn-secondary"/> + + <footer> + <button name="action_confirm" string="Konfirmasi Sync" type="object" class="btn-primary"/> + <button string="Batal" class="btn-secondary" special="cancel"/> + </footer> + </form> + </field> + </record> </data> </odoo>
\ No newline at end of file |
