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