summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indoteknik_custom/models/account_move.py133
-rwxr-xr-xindoteknik_custom/security/ir.model.access.csv4
-rw-r--r--indoteknik_custom/views/account_move.xml35
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