summaryrefslogtreecommitdiff
path: root/fixco_custom/models/upload_payments.py
diff options
context:
space:
mode:
authorAzka Nathan <darizkyfaz@gmail.com>2025-06-03 14:04:36 +0700
committerAzka Nathan <darizkyfaz@gmail.com>2025-06-03 14:04:36 +0700
commit50054732da991bdd966f4fba879c33ee853879ff (patch)
tree9a2ec4f03eecbb87cb97fe5e697a8ada3b9a7812 /fixco_custom/models/upload_payments.py
parentbd521743ac81103979ab5835e99ffb3df3693998 (diff)
create receipt after invoice paid and schema invoice
Diffstat (limited to 'fixco_custom/models/upload_payments.py')
-rw-r--r--fixco_custom/models/upload_payments.py120
1 files changed, 78 insertions, 42 deletions
diff --git a/fixco_custom/models/upload_payments.py b/fixco_custom/models/upload_payments.py
index 0473997..e7599a7 100644
--- a/fixco_custom/models/upload_payments.py
+++ b/fixco_custom/models/upload_payments.py
@@ -1,58 +1,94 @@
-from odoo import models, fields, api
+from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
+from datetime import datetime
+import base64
+import xlrd
class UploadPayments(models.Model):
_name = "upload.payments"
_description = "Upload Payments"
+ _order = "create_date desc"
- no_invoice = fields.Char('Invoice Number', required=True)
- date_invoice = fields.Date('Invoice Date', required=True)
- move_id = fields.Many2one('account.move', string='Invoice')
- payment_id = fields.Many2one('account.payment', string='Created Payment')
+ payments_lines = fields.One2many('upload.payments.line', 'upload_payments_id', string='Upload Payments Lines', auto_join=True, copy=False)
+ number = fields.Char('Number', copy=False)
+ date_upload = fields.Date('Upload Date', copy=False, default=fields.Date.context_today)
+ user_id = fields.Many2one('res.users', string='Created By', copy=False, default=lambda self: self.env.user.id)
+ excel_file = fields.Binary('Excel File', attachment=True)
+ filename = fields.Char('File Name')
@api.model
def create(self, vals):
- record = super(UploadPayments, self).create(vals)
-
- record._create_payment_from_invoice()
-
- return record
+ vals['number'] = self.env['ir.sequence'].next_by_code('upload.payments') or '/'
+ return super(UploadPayments, self).create(vals)
- def _create_payment_from_invoice(self):
+ def action_import_excel(self):
self.ensure_one()
- # Find the invoice based on the marketplace number
- invoice = self.env['account.move'].search([
- ('invoice_marketplace', '=', self.no_invoice)
- ], limit=1)
+ if not self.excel_file:
+ raise ValidationError(_("Please upload an Excel file first."))
- if not invoice:
- raise ValidationError(f"No invoice found with marketplace number {self.no_invoice}")
-
- self.move_id = invoice.id
-
- # Create payment
- payment_vals = {
- 'payment_type': 'inbound' if invoice.move_type in ('out_invoice', 'out_refund') else 'outbound',
- 'partner_id': invoice.partner_id.id,
- 'amount': invoice.amount_residual,
- 'date': self.date_invoice or fields.Date.today(),
- 'ref': invoice.name,
- 'journal_id': invoice.journal_id.id,
- 'currency_id': invoice.currency_id.id,
- }
+ try:
+ file_content = base64.b64decode(self.excel_file)
+ workbook = xlrd.open_workbook(file_contents=file_content)
+ sheet = workbook.sheet_by_index(0)
+ except:
+ raise ValidationError(_("Invalid Excel file format."))
- payment = self.env['account.payment'].create(payment_vals)
- payment.action_post()
+ # Process Excel rows (skip header row if exists)
+ line_vals_list = []
+ for row in range(1, sheet.nrows):
+ try:
+ no_invoice = str(sheet.cell(row, 0).value).strip()
+ date_invoice = xlrd.xldate.xldate_as_datetime(sheet.cell(row, 1).value, workbook.datemode).date()
+
+ line_vals = {
+ 'no_invoice': no_invoice,
+ 'date_invoice': date_invoice,
+ }
+ line_vals_list.append((0, 0, line_vals))
+ except:
+ continue
- # Reconcile with invoice
- lines_to_reconcile = invoice.line_ids.filtered(
- lambda line: line.account_id.account_type in ('asset_receivable', 'liability_payable')
- )
- payment_lines = payment.line_ids.filtered(
- lambda line: line.account_id.account_type in ('asset_receivable', 'liability_payable')
- )
+ # Update current record with lines
+ self.write({
+ 'payments_lines': line_vals_list,
+ })
- (lines_to_reconcile + payment_lines).reconcile()
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'display_notification',
+ 'params': {
+ 'title': _('Success'),
+ 'message': _('Imported %s lines from Excel.') % len(line_vals_list),
+ 'sticky': False,
+ 'next': {'type': 'ir.actions.act_window_close'},
+ }
+ }
+
+ def action_create_payments(self):
+ """Membuat payment untuk semua lines yang belum memiliki payment"""
+ self.ensure_one()
+ created_payments = []
- self.payment_id = payment.id
- return payment \ No newline at end of file
+ for line in self.payments_lines.filtered(lambda l: not l.payment_id):
+ # Cari invoice berdasarkan invoice_marketplace
+ invoice = self.env['account.move'].search([
+ ('invoice_marketplace', '=', line.no_invoice),
+ ('state', '=', 'posted'),
+ ('payment_state', '!=', 'paid'),
+ ])
+
+ for move in invoice:
+ move._register_payment_automatically()
+
+
+
+class UploadPaymentsLine(models.Model):
+ _name = "upload.payments.line"
+ _description = "Upload Payments Line"
+ _inherit = ['mail.thread']
+
+ upload_payments_id = fields.Many2one('upload.payments', string='Upload Payments')
+ no_invoice = fields.Char('Invoice Number', required=True)
+ date_invoice = fields.Date('Invoice Date', required=True)
+ move_id = fields.Many2one('account.move', string='Invoice')
+ payment_id = fields.Many2one('account.payment', string='Created Payment') \ No newline at end of file