198 lines
9.1 KiB
Python
Executable File
198 lines
9.1 KiB
Python
Executable File
import ast
|
|
import datetime
|
|
import json
|
|
import re
|
|
import uuid
|
|
import logging
|
|
import base64
|
|
import subprocess
|
|
import tempfile
|
|
#from symbol import return_stmt
|
|
|
|
import easywebdav
|
|
import io
|
|
import os.path
|
|
import sys
|
|
import csv
|
|
#sys.path.append('/opt/odoo')
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo import tools
|
|
|
|
from odoo.exceptions import ValidationError
|
|
from . import dss_settings
|
|
from datetime import date
|
|
from datetime import datetime
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class dssimportinvoicelist(models.Model):
|
|
_name = "dss.importinvoicelist"
|
|
_description = "DigitalSignage Rechnungsliste importieren"
|
|
_inherit = ['mail.thread','mail.activity.mixin']
|
|
_rec_name = "autoimportname"
|
|
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
|
autoimportname = fields.Char("Name des Imports",default=lambda self: self._default_name(), required=True)
|
|
import_invoicelist = fields.Binary('Datei')
|
|
import_error = fields.Text('Importfehler')
|
|
file_name = fields.Char("File Name")
|
|
alreadyimported = fields.Boolean('Bereits eingelesen?',tracking=True)
|
|
projecttype = fields.Many2one('dss.systemtypen',tracking=True)
|
|
date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date())
|
|
user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user())
|
|
|
|
context = fields.Char(string='Context', compute='_get_context')
|
|
|
|
def _get_context(self):
|
|
self.context = dict(self.env.context)
|
|
|
|
@api.model
|
|
def _default_uuid(self):
|
|
return str(uuid.uuid4())
|
|
|
|
def _default_name(self):
|
|
calcname = 'RechnungsImport_'+str(date.today())
|
|
return str(calcname)
|
|
|
|
def _default_create_date(self):
|
|
return str(date.today())
|
|
|
|
def _default_create_user(self):
|
|
return str(self.env.user.name)
|
|
|
|
def pyimport_invoicelist(self):
|
|
if not self.alreadyimported:
|
|
datas=base64.b64decode(self.import_invoicelist)
|
|
data=datas.decode('utf-8','ignore').splitlines()
|
|
_logger.info("Import Invoices - start data : "+str(data)+" - "+str(self.import_invoicelist))
|
|
data.pop(0)
|
|
try:
|
|
for row in data:
|
|
BotText=''
|
|
line=row.split(";")
|
|
if (line[0] != ''):
|
|
_logger.info("Import Invoices - row : "+str(line))
|
|
oldimport = self.env['dss.invoices'].search([('invoiceid','=',line[0])])
|
|
if not oldimport:
|
|
client = self.env['dss.contracts'].search([('contract_auto_id','=',line[3])])
|
|
entry = self.env['dss.invoices'].create({'invoiceid':line[0],'from_import':self.id,'invoicename':line[1],'invoiceclientnr':line[3],'contract':client.id,'invoice_date':datetime.strptime(line[4],"%d.%m.%Y"),'is_printed':(line[5]=="Endgltig"),'ammount_netto':line[6].strip(),'ammount_ust':line[7].strip(),'ammount_brutto':line[8].strip(),'is_payed':(line[11]=="Ja"),'invoice_type':line[9],'invoice_reference':line[10]})
|
|
BotText='Rechnung ['+str(line[0])+'] für '+str(line[1])+' ('+str(line[3])+') neu erstellt als '
|
|
if (line[11]=="Ja"):
|
|
entry.is_payed = True
|
|
entry.is_payed_date = self.date_create
|
|
client.contract_payment_done = True
|
|
client.contract_payment_done_date = self.date_create
|
|
BotText = BotText +' bezahlt'
|
|
else:
|
|
client.contract_payment_done = False
|
|
client.contract_payment_done_date = ''
|
|
BotText = BotText +' nicht bezahlt'
|
|
client.client_invoices = [(4, entry.id)]
|
|
else:
|
|
client=oldimport.contract
|
|
if oldimport.is_payed:
|
|
if (line[11]=="Ja"):
|
|
_logger.info("Import Invoices - "+str(line[0])+' allready imported and payed - delete bevore import again !')
|
|
else:
|
|
_logger.info("Import Invoices - "+str(line[0])+' allready imported and payed - now not payed again !')
|
|
else:
|
|
if (line[11]=="Ja"):
|
|
oldimport.is_payed = True
|
|
oldimport.is_payed_date = self.date_create
|
|
client.contract_payment_done = True
|
|
client.contract_payment_done_date = self.date_create
|
|
BotText='Rechnung ['+str(line[0])+'] für '+str(line[1])+' ('+str(line[3])+') geändert in bezahlt !'
|
|
_logger.info("Import Invoices - "+str(line[0])+' allready imported and not Payed - now Payed')
|
|
else:
|
|
_logger.info("Import Invoices - "+str(line[0])+' allready imported and not Payed - not Payed again !')
|
|
if (BotText):
|
|
body = BotText
|
|
self.message_post(body=body,author_id=self.env.ref('base.partner_root').id)
|
|
|
|
finally:
|
|
self.alreadyimported = True
|
|
else:
|
|
raise ValidationError(("Rechnungsliste wurde bereits importiert ! Bitte löschen und Import-Status zurückstetzen"))
|
|
return 1
|
|
|
|
def show_popup_with_message(self):
|
|
return {
|
|
'name': 'Dynamic Popup',
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': 'dss.importinvoicelist',
|
|
'view_mode': 'form',
|
|
'view_id': self.env.ref('DigitalSignage.view_dynamic_popup').id,
|
|
'target': 'new',
|
|
'context': {
|
|
'dynamic_message': 'This is a custom message from the server!',
|
|
},
|
|
}
|
|
|
|
|
|
|
|
def _old_pyimport_invoicelist(self):
|
|
# Liest Rechnungsdaten aus einer CSV-Datei und erstellt Rechnungen in Odoo.
|
|
# :param env: Odoo-Umgebung
|
|
# :param csv_filepath: Pfad zur CSV-Datei
|
|
invoices = []
|
|
try:
|
|
# CSV-Datei öffnen
|
|
data=base64.b64decode(self.import_invoicelist)
|
|
with open(csv_data, mode='r', encoding='utf-8') as file:
|
|
reader = csv.DictReader(file)
|
|
|
|
for row in reader:
|
|
# Daten aus der Zeile lesen
|
|
partner_id = int(row['partner_id'])
|
|
invoice_date = row['Belegdatum']
|
|
product_id = 1
|
|
quantity = 1
|
|
price_unit = float(row['Brutto'])
|
|
payment_state = row['bezahlt']
|
|
|
|
# Rechnung erstellen
|
|
invoice_data = {
|
|
'move_type': 'out_invoice', # Typ: Verkaufsrechnung
|
|
'partner_id': partner_id,
|
|
'invoice_date': invoice_date,
|
|
'payment_state': payment_state,
|
|
'invoice_line_ids': [
|
|
(0, 0, {
|
|
'product_id': product_id,
|
|
'quantity': quantity,
|
|
'price_unit': price_unit,
|
|
}),
|
|
],
|
|
}
|
|
|
|
new_invoice = env['account.move'].create(invoice_data)
|
|
invoices.append(new_invoice)
|
|
|
|
# Optional: Rechnung validieren
|
|
new_invoice.action_post()
|
|
print(f"Rechnung erstellt: ID {new_invoice.id}, Name {new_invoice.name}")
|
|
|
|
print(f"{len(invoices)} Rechnungen wurden erfolgreich erstellt.")
|
|
|
|
except Exception as e:
|
|
print(f"Fehler beim Verarbeiten der CSV-Datei: {e}")
|
|
return 1
|
|
|
|
def pyimport_takeattachment(self):
|
|
found = False
|
|
for message in self.website_message_ids:
|
|
_logger.info("Import Invoices - Get Arr. File - Message : "+str(message))
|
|
for att in message.attachment_ids:
|
|
_logger.info("Import Invoices - Get Att. File - Attachment : "+str(att.name))
|
|
if "CSV" in att.name:
|
|
found = True
|
|
_logger.info("Import Invoices - Get Att. File - Attachment CSV found : "+str(att.name))
|
|
self.import_invoicelist = att.datas
|
|
break
|
|
if not found:
|
|
raise ValidationError(("Keine CSV Datei in den Anhängen gefunden !"))
|
|
|
|
|