summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/coretax_fatur.py
blob: a0820feec39496865a4de718d88d3b7c2bf07365 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from odoo import models, fields
import xml.etree.ElementTree as ET
from xml.dom import minidom
import base64

class CoretaxFaktur(models.Model):
    _name = 'coretax.faktur'
    _description = 'Export Faktur ke XML'
    
    export_file = fields.Binary(string="Export File",  )
    export_filename = fields.Char(string="Export File",  )

    def generate_xml(self):
        # Buat root XML
        root = ET.Element('TaxInvoiceBulk', {
            'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance",
            'xsi:noNamespaceSchemaLocation': "TaxInvoice.xsd"
        })
        ET.SubElement(root, 'TIN').text = 'xxxxxxxxxxxxxxxx'

        # Tambahkan elemen ListOfTaxInvoice
        list_of_tax_invoice = ET.SubElement(root, 'ListOfTaxInvoice')

        # Dapatkan data faktur
        inv_obj = self.env['account.move']
        invoices = inv_obj.search([('is_efaktur_exported','!=',True),
                                   ('state','=','posted'),
                                   ('efaktur_id','!=', False),
                                   ('move_type','=','out_invoice')])
        for invoice in invoices:
            tax_invoice = ET.SubElement(list_of_tax_invoice, 'TaxInvoice')

            # Tambahkan elemen faktur
            ET.SubElement(tax_invoice, 'TaxInvoiceDate').text = invoice.invoice_date.strftime('%Y-%m-%d') if invoice.invoice_date else ''
            ET.SubElement(tax_invoice, 'TaxInvoiceOpt').text = 'Normal'
            ET.SubElement(tax_invoice, 'TrxCode').text = '01'
            ET.SubElement(tax_invoice, 'AddInfo')
            ET.SubElement(tax_invoice, 'CustomDoc')
            ET.SubElement(tax_invoice, 'RefDesc')
            ET.SubElement(tax_invoice, 'FacilityStamp')
            ET.SubElement(tax_invoice, 'SellerIDTKU').text = '0000000000000000000000'
            ET.SubElement(tax_invoice, 'BuyerTin').text = 'xxxxxxxxxxxxxxxx'
            ET.SubElement(tax_invoice, 'BuyerDocument').text = 'TIN'
            ET.SubElement(tax_invoice, 'BuyerCountry').text = 'IND'
            ET.SubElement(tax_invoice, 'BuyerEmail').text = invoice.partner_id.email or ''
            ET.SubElement(tax_invoice, 'BuyerIDTKU').text = '0000000000000000000000'

            # Tambahkan elemen ListOfGoodService
            list_of_good_service = ET.SubElement(tax_invoice, 'ListOfGoodService')
            for line in invoice.invoice_line_ids:
                good_service = ET.SubElement(list_of_good_service, 'GoodService')
                ET.SubElement(good_service, 'Opt').text = 'A'
                ET.SubElement(good_service, 'Code').text = '000000'
                ET.SubElement(good_service, 'Name').text = line.name
                ET.SubElement(good_service, 'Unit').text = 'UM.0001'
                ET.SubElement(good_service, 'Price').text = str(line.price_unit)
                ET.SubElement(good_service, 'Qty').text = str(line.quantity)
                ET.SubElement(good_service, 'TotalDiscount').text = '100000'
                ET.SubElement(good_service, 'TaxBase').text = str(line.price_subtotal)
                ET.SubElement(good_service, 'OtherTaxBase').text = str(line.price_subtotal)
                ET.SubElement(good_service, 'VATRate').text = '11'
                ET.SubElement(good_service, 'VAT').text = str(line.price_total * 0.11)
                ET.SubElement(good_service, 'STLGRate').text = '20'
                ET.SubElement(good_service, 'STLG').text = '580000'

        # Pretty print XML
        xml_str = ET.tostring(root, encoding='utf-8')
        xml_pretty = minidom.parseString(xml_str).toprettyxml(indent="    ")
        return xml_pretty

    def export_to_download(self):
        # Generate XML content
        xml_content = self.generate_xml()

        # Encode content to Base64
        xml_encoded = base64.b64encode(xml_content.encode('utf-8'))

        # Buat attachment untuk XML
        attachment = self.env['ir.attachment'].create({
            'name': 'Faktur_XML.xml',
            'type': 'binary',
            'datas': xml_encoded,
            'mimetype': 'application/xml',
            'store_fname': 'faktur_xml.xml',
        })

        # Kembalikan URL untuk download dengan header 'Content-Disposition'
        response = {
            'type': 'ir.actions.act_url',
            'url': '/web/content/{}?download=true'.format(attachment.id),
            'target': 'self',
        }

        return response