DigitalSignage/models/dss_importinvoicelist.py

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 !"))