Files
DigitalSignage/models/dss_contract.py
T
2026-07-23 08:54:44 +02:00

1993 lines
109 KiB
Python
Executable File

# -*- coding: utf-8 -*
# Test
# Test2
import ast
import datetime
import json
import re
import uuid
from .dsslogger import OdooCustomLogger
import logging
import base64
import subprocess
import tempfile
import easywebdav
import os
import os.path
import kontocheck
from PIL import Image,ImageDraw,ImageFont
from odoo import api, fields, models, _
from odoo import tools
from . import dss_settings
from . import dss_ads
from odoo.exceptions import ValidationError
from odoo.exceptions import UserError
from datetime import date
from datetime import datetime
from dateutil.relativedelta import relativedelta
from pyffmpeg import FFmpeg
from tuya_iot import TuyaOpenAPI, TUYA_LOGGER
from tuya_connector import TuyaOpenAPI, TUYA_LOGGER
from webdav4.client import Client
from webdav4.fsspec import WebdavFileSystem
#from dss_trigger import trigger
import sys
TUYA_LOGGER.setLevel(logging.DEBUG)
logging.setLoggerClass(OdooCustomLogger)
_logger = logging.getLogger(__name__)
_logger.setloging(True)
class dsscontracts(models.Model):
@api.model
def _get_default_project(self):
_logger.debug("Ermittelte Id aus Context : %s" % (self.env.context.get('active_id')))
ds = self.env['dss.projects'].search([('id','=',self.env.context.get('active_id'))],limit=1)
return ds
def _default_work_state(self):
ds=self.env['dss.workstate'].search([('statusname','=','Neu')],limit=1).id
_logger.debug(ds)
return ds
def _default_work_state_color(self):
ds=self.env['dss.workstate'].search([('statusname','=','Neu')],limit=1).color
_logger.info(ds)
return ds
def _default_todo_state(self):
ds=self.env['dss.todostate'].search([('statusnr','=','0')],limit=1).id
if not ds : ds = 1
_logger.debug(ds)
# ds =
return ds
def _default_get_ads_last_ad(self):
_logger.info('finding Standard ad '+str(self.id))
ds = self.env['dss.ads'].search([('contract','=',self.id),('ad_is_lastpos','=',True)],limit=1)
if not ds:
ds = self.env['dss.ads'].search([('contract','=',self.id)],limit=1)
return ds
def _getkorrColor(self):
_logger.info('Contract get Color ')
for record in self:
record.korrectur_color = "#000000"
return "#000000"
_name = "dss.contracts"
_description = "DigitalSignage Vertraege"
_rec_name = "contract_auto_name"
_inherit = ['mail.thread','dss.activity.mixin','dss.triggermodel']
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
contract_creator = fields.Many2one('res.users', string='Vertrag erstellt von', default=lambda self: self.env.user)
contract_create_date = fields.Datetime('Vertrag erstellt am', default=lambda self: fields.Datetime.now(), readonly=True)
cruuid = fields.Char(related='uuid')
contract_id = fields.Char("Kundennummer",store=True,tracking=True)
contract_name = fields.Char('Kurzbezeichnung', required=True,tracking=True)
contract_state = fields.Many2one('dss.contractstate',group_expand='_read_group_stage_ids',tracking=True)
contract_state_name = fields.Char(related='contract_state.statusname',string='Vertragsstatus - Text',store=True)
contract_state_color = fields.Char(related='contract_state.color',string='Vertragsstatus - Farbe',store=True)
contract_state_order = fields.Integer(related='contract_state.order',string='Vertragsstatus - Reihenfolge',store=True)
contract_state_minimal_kanban = fields.Boolean(related='contract_state.kanban_display_minimal',string='Kanban minimieren',store=True)
contract_state_kanban_collapsed = fields.Selection(related='contract_state.kanban_collapsed_choice', string='Kanban eingeklappt', store=True)
contract_auto_id = fields.Char("Kundennummer",tracking=True,help="Wird berechnet aus Projektnummer + Kunden ID")
contract_auto_name = fields.Char('Vertragskennug',tracking=True,help="Wird berechnet aus Kundennummer + Vertragskennung")
contract_payment_done = fields.Boolean('Zahlungeingang erfolgt',tracking=True)
contract_payment_done_date = fields.Date('Zahlungeingang Datum',tracking=True)
contract_boarding = fields.Boolean('Boarding gebucht?',tracking=True)
contract_grafik = fields.Boolean('Grafik gebucht?',tracking=True)
contract_receipt_done_multi = fields.Boolean('Mehrere Rechnungen nötig ?', tracking=True)
contract_receipt_done = fields.Boolean('Rechnungstellung erfolgt',tracking=True)
contract_receipt_number = fields.Char("Rechnungsnummer",tracking=True)
contract_receipt_done_date = fields.Date('Rechnungsdatum',tracking=True)
contract_receipt_done_until_date = fields.Date('Zahlungsziel', tracking=True)
client_is_export_finance = fields.Boolean('An Buchhaltung exportiert ?', tracking=True)
client_is_export_finance_date = fields.Date('An Buchhaltung exportiert am', tracking=True)
client_is_inkaso = fields.Boolean('Ist Inkasso eröffnet ?', tracking=True)
client_inkaso_datum = fields.Datetime('Inkasso eröffnet am ', tracking=True)
client_inkaso_info = fields.Char('Inkasso Bemerkungen', tracking=True)
client_is_inkaso_success = fields.Boolean('Ist Inkasso erfolgreich ?', tracking=True)
client_is_anwalt = fields.Boolean('Ist bei Anwalt eröffnet ?', tracking=True)
client_Anwalt_datum = fields.Datetime('Zum Anwalt übergeben am', tracking=True)
client_Anwalt_info = fields.Char('Anwaltlichte Bemerkungen', tracking=True)
client_is_Anwalt_success = fields.Boolean('Ist Anwalt erfolgreich ?', tracking=True)
remark = fields.Html('Bemerkung',tracking=True)
contract_writer = fields.Many2one('res.partner', tracking=True)
contract_writer_mailcc = fields.Boolean('Vertragsschr. Mail CC ?', tracking=True)
vertragssumme = fields.Float('Vertragssumme :', tracking=True)
provisionstyp = fields.Many2one('dss.provisionstypen', tracking=True)
provisionsteilcalc = fields.Float('Berechnete Provision :')
provisions = fields.Many2many('dss.provision', tracking=True)
provisionspayedpercent = fields.Float('Ausgezahlte Provision % :',compute='_compute_provisionspayedpercent')
grafiker = fields.Many2one('res.partner', domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True, string="abw. Grafiker",help="Grafiker nur wenn abweichend vom Projektgrafiker")
real_grafiker = fields.Char('Grafiker tatsächlich', tracking=True)
techniker = fields.Many2one('res.partner', domain="['&',('dssinternpartner','=',True),('dssinternpartner_technik','=',True)]", tracking=True, string="abw. Techniker (Einspielung)",help="der Techniker der die Einspielung vornehmen kann")
techniker_email = fields.Char(related="techniker.email", string="Techniker Email")
contract_remark = fields.Html('Vertragshinweise',tracking=True)
project = fields.Many2one('dss.projects' , string='Project', store=True,tracking=True)
project_name = fields.Char(related='project.name')
project_id = fields.Integer(related='project.projectid', string='Project ID')
projectIid = fields.Integer('Project IID',tracking=True)
project_ad_structure = fields.Many2one(related='project.grundsystem_default_adstructure', string='Aufbau')
project_grundsystem_typ = fields.Char(related='project.grundsystem_typ', tracking=True)
project_grundsystem_typ_cloud_contract_template = fields.Char(related='project.grundsystem_default_cloud_structure_contract', tracking=True)
project_grafiker = fields.Many2one(related="project.project_grafiker",tracking=True)
project_system_uuid = fields.Char(related='project.grundsystemnameuuid', tracking=True)
project_techniker = fields.Many2one(related='project.project_techniker', string='Aufbau')
techniker_computed = fields.Many2one('res.partner', compute='_compute_techniker_computed', string='Techniker tatsächlich')
run_trigger = fields.Boolean(tracking=True)
run_uni_trigger = fields.Boolean(tracking=True)
run_uni_sub_trigger = fields.Boolean(tracking=True)
client = fields.Many2one('res.partner',string="Kunde (wenn angelegt)",domain="['&',('dsspartner','=',True),('dsspartner_werbung','=',True)]",tracking=True,help="Nur zu Benutzen wenn Kunden als Kontakt angelegt wurde")
client_id = fields.Char(string="KundenID (2Stellen)",help="Nur der 2 stellige letzte Teil der Kundennummer",tracking=True)
client_uuid = fields.Char(related="client.dss_uuid")
contact_street = fields.Char(related="client.street")
contact_street2 = fields.Char(related="client.street2")
contact_zip = fields.Char(related="client.zip")
contact_city = fields.Char(related="client.city")
contact_state_id = fields.Many2one(related="client.state_id")
contact_country_id = fields.Many2one(related="client.country_id")
contact_telefon = fields.Char(related="client.phone")
contact_mobil = fields.Char(related="client.mobile")
contact_email = fields.Char(related="client.email")
contact_rgemail = fields.Char(related="client.rgemail")
contact_leitwegid = fields.Char(related="client.leitwegid")
contact_web = fields.Char(related="client.website")
contact_company_name = fields.Char(related="client.company_name")
contact_name = fields.Char(related="client.name")
contact_dsspartner_vorname = fields.Char(related="client.dsspartner_vorname")
contact_dsspartner_name = fields.Char(related="client.dsspartner_name")
contact_company_type = fields.Many2one(related="client.dsspartner_Company_type")
parent_id = fields.Many2one('dss.contracts', string='Parent Task', index=True,tracking=True)
client_short_company = fields.Char('Firmenname Kunde',tracking=True)
client_short_company_type = fields.Many2one('dss.company.type',string='Firmentyp Kunde',tracking=True)
client_short_vorname = fields.Char('Vorname Kunde',tracking=True)
client_short_name = fields.Char('Name Kunde',tracking=True)
client_short_strasse = fields.Char('Strasse Kunde',tracking=True)
client_short_plz = fields.Char('PLZ Kunde',tracking=True)
client_short_ort = fields.Char('Ort Kunde',tracking=True)
client_short_land = fields.Many2one('res.country','Land Kunde',tracking=True)
client_short_email = fields.Char('Email Kunde',tracking=True)
client_short_rgemail = fields.Char('Rechnungs-Email Kunde',tracking=True)
client_short_telefon = fields.Char('Telefon Kunde',tracking=True)
client_short_mobil = fields.Char('Mobilfunk Kunde',tracking=True)
client_short_website = fields.Char('Webseite Kunde',tracking=True)
client_short_leitwegid = fields.Char('Leitwegid Kunde',tracking=True)
client_short_website = fields.Char('Webseite Kunde',tracking=True)
client_short_leitwegid = fields.Char('Leitwegid Kunde',tracking=True)
client_short_BIC = fields.Char('BIC Kunde',tracking=True)
client_short_IBAN = fields.Char('IBAN Kunde',tracking=True)
client_short_BANK_computed = fields.Char(string='Bank Kunde',compute='_compute_cutshort_Bank')
client_short_KONTO_computed = fields.Char(string='Konto Kunde',compute='_compute_cutshort_Konto')
client_short_BLZ_computed = fields.Char(string='BLZ Kunde',compute='_compute_cutshort_BLZ')
client_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte',tracking=True)
client_invoices = fields.Many2many('dss.invoices',string='Rechnungsliste',tracking=True,domain='[("invoiceclientnr","=",contract_auto_id)]')
werbe_feld_selected = fields.Many2many('dss.advertisefields',string='Werbefelder',tracking=True)
shortwerbe_feld_selected = fields.Char(related='werbe_feld_selected.feldname',string='Werbefelder',tracking=True)
cutshortwerbe_feld_selected = fields.Char(string='gekürzte Felder',compute='_compute_cutshort')
werbe_feld_selected_btn_img = fields.Binary(related="werbe_feld_selected.btn_image_bin",string='Buttonbild')
werbe_feld_selected_btn_img_base64 = fields.Char(related="werbe_feld_selected.btn_image_bin_base64")
werbe_feld_selected_btn_pos_x = fields.Integer(related="werbe_feld_selected.btn_pos_x", tracking=True)
werbe_feld_selected_btn_pos_y = fields.Integer(related="werbe_feld_selected.btn_pos_y", tracking=True)
werbe_feld_selected_btn_pos_w = fields.Integer(related="werbe_feld_selected.btn_pos_w", tracking=True)
werbe_feld_selected_btn_pos_h = fields.Integer(related="werbe_feld_selected.btn_pos_h", tracking=True)
werbe_feld_selected_btn_name = fields.Char(related="werbe_feld_selected.btn_name",tracking=True)
grafik_zuarbeitBis = fields.Date("Grafik Zuarbeit bis", tracking=True)
# need_media = fields.Many2many('dss.mediarelations','mediarelations_contract_rel','contract_id','mediarelations_id',string='benötigte Medien')
last_media = fields.Many2many('dss.mediarelations',string='Medien',domain="[('isreference','=',False)]")
# last_media = fields.Many2many('dss.mediarelations','mediarelations_ad_relations','contract_id','mediarelations_id',string='Medien')
need_media = fields.Many2many('dss.mediarelations','contract',string='Medien',domain="[('isreference','=',True)]")
# need_media_computed = fields.One2many('dss.mediarelations','field',compute='_get_media_list')
# need_media_computed = fields.One2many('dss.mediarelations','uuid',domain="[('field','in',werbe_feld_selected)]")
main_runtime = fields.Integer('Gesamtcliplänge',tracking=True)
split_runtime_count = fields.Integer('Clip Teilungen',tracking=True)
split_runtime_time = fields.Integer('Cliplänge Sekunden',tracking=True)
contract_date = fields.Date('Vertragsdatum',tracking=True)
start_date = fields.Date('Start/Auslief.datum',tracking=True,help="Datum des geplanten Startes der 1. Kampagne. Also die Uraustrahlung!")
calc_end_date = fields.Date('Enddatum berechnet',tracking=True,help="Berechnetes Enddatum der Kampagne basierend auf Startdatum und Laufzeit (Ändert sich bei Verlängerungen).")
contract_cancel_mon = fields.Integer('Kündigungsfrist Monaten',tracking=True)
contract_cancel_date = fields.Date('Kündigungsfrist Errechnet', tracking=True)
contract_iscanceled = fields.Boolean('Vertrag gekündigt',tracking=True)
contract_iscanceled_date = fields.Date('Vertrag gekündigt am',tracking=True)
contract_iscanceled_logumedia = fields.Boolean('Vertrag gekündigt durch Logumedia',tracking=True)
contract_iscanceled_logumedia_date = fields.Date('Vertrag von Logumedia gekündigt am ',tracking=True)
contract_iscanceled_logumedia_reason = fields.Char('Vertrag von Logumedia gekündigt Grund',tracking=True)
contract_auto_extend = fields.Boolean('autom. V.Verlängerung',tracking=True)
contract_auto_extend_time = fields.Char('Verl. Monate',tracking=True)
contract_auto_extend_count = fields.Integer('Anzahl Vertragsverlängerungen', tracking=True, default=0)
scan_vertrag = fields.Binary('Datei')
scan_vertrag_filename = fields.Char("Dateiname") # Hilft, den Dateinamen zu speichern
no_cancel_calc = fields.Boolean('Berechnungen verbieten',tracking=True)
runtimesystem = fields.Selection([('M','Monatslaufzeit'),('T','Tagelaufzeit'), ('E','Eventlaufzeit'), ('S','Sonderlaufzeit')],tracking=True)
runtime_m = fields.Integer('Laufzeit Monate',tracking=True)
runtime_bonus_m = fields.Integer('zusätzl. Laufzeit Monate',tracking=True)
runtime_t = fields.Integer('Laufzeit Tage',tracking=True)
runtime_bonus_t = fields.Integer('zusätzl. Laufzeit Tage',tracking=True)
runtime_events = fields.Many2many('dss.eventdays',tracking=True)
runtime_bonus_e = fields.Integer('zusätzl. Events',tracking=True)
runtime_divers = fields.Char('Laufzeit',tracking=True)
runtime_finish = fields.Date('LaufzeitEnde',tracking=True)
runtime_calendar_event = fields.Integer('Kalendereintrag ID',tracking=True)
paymentsystems = fields.Many2one('dss.paysystems',string='Abrechnungsart',tracking=True)
paymentinterval = fields.Many2one('dss.payintervals',string='Abrechnungsinterval',tracking=True)
intern_info_payment_off = fields.Boolean('Keine Zahl-Benachrichtigungen',tracking=True)
base_ad = fields.Many2one('dss.ads',tracking=True)
ads = fields.One2many('dss.ads','contract',tracking=True)
ads_last_ad = fields.Many2one('dss.ads', help="letzte Werbekampagne",compute='_default_get_ads_last_ad',store=True)
ads_last_adtype = fields.Selection(related='ads_last_ad.adtype')
ads_last_state = fields.Many2one(related='ads_last_ad.ad_state', string="Zuständigkeit letzt Kamp",help="Zuständigkeit/Status des letzten Werbekampagnen Eintrags",store=True,readonly=False,group_expand='_expand_ads_last_state')
ads_last_state_color = fields.Char(related='ads_last_ad.ad_state_color')
ads_last_state_text = fields.Char(related='ads_last_ad.ad_state_text',store=True,readonly=False)
ads_last_work_state = fields.Many2one(related='ads_last_ad.work_state', string="Arbeitschritt letzt Kamp",help="Arbeitsstatus des letzten Werbekampagnen Eintrags",store=True,readonly=False,group_expand='_expand_ads_last_work_state')
ads_last_work_state_color = fields.Char(related='ads_last_ad.work_state_color')
ads_last_work_state_text = fields.Char(related='ads_last_ad.work_state_text',store=True,readonly=False)
ads_last_work_state_info = fields.Char(related='ads_last_ad.work_state_info',store=True,readonly=False)
ads_last_todo_state = fields.Many2one(related='ads_last_ad.todo_state',string="Aufgabe letzt Kamp", help="Aufgabenstatus des letzten Werbekampagnen Eintrags",store=True,readonly=False,group_expand='_expand_ads_last_todo_state')
ads_last_todo_state_until = fields.Date(related='ads_last_ad.todo_state_until',readonly=False)
ads_last_todo_state_color = fields.Char(related='ads_last_ad.todo_state_color')
ads_last_todo_state_text = fields.Char(related='ads_last_ad.todo_state_text',store=True,readonly=False)
ads_last_date_zuarbeit = fields.Date(related='ads_last_ad.date_zuarbeit',readonly=False)
ads_last_date_korrekturabzug = fields.Date(related='ads_last_ad.date_korrekturabzug',readonly=False)
ads_last_date_korrekturfreigabe_ablauf = fields.Date(related='ads_last_ad.date_korrekturfreigabe_ablauf',readonly=False)
ads_last_date_korrekturfreigabe_ablauf_erfolgt = fields.Boolean(related='ads_last_ad.korrekturfreigabe_ablauf_erfolgt',readonly=False)
ads_last_date_korrekturfreigabe = fields.Date(related='ads_last_ad.date_korrekturfreigabe',readonly=False)
ads_last_date_start_planed = fields.Date(related='ads_last_ad.date_start_planed',readonly=False,help="Datum des geplanten Startes der Aktuell gültigen Kampagne !")
ads_last_date_start_real = fields.Date(related='ads_last_ad.date_start_real',readonly=False,help="Datum des wirklichen Startes der Aktuell gültigen Kampagne !")
ads_last_date_remove_planed = fields.Date(related='ads_last_ad.date_remove_planed',readonly=False)
ads_last_date_remove_real = fields.Date(related='ads_last_ad.date_remove_real',readonly=False)
ads_last_date_start_real_mail_send = fields.Boolean(related='ads_last_ad.date_start_real_mail_send',string='Kampagnen Startmail', tracking=True)
ads_last_date_start_real_mail_data = fields.Date(related='ads_last_ad.date_start_real_mail_data', tracking=True)
korrectur_color = fields.Char(string='Korrektur Text Color nach Status',compute=_getkorrColor)
ads_last_date_korrekturfreigabe_ablauf_auto_cancel = fields.Boolean(related='ads_last_ad.korrekturfreigabe_ablauf_auto_cancel', tracking=True)
vnnox_zugang_erstellt = fields.Boolean('Vnnox Zugang ?',tracking=True)
vnnox_zugang_username = fields.Char('Vnnox Username',tracking=True)
vnnox_zugang_password = fields.Char('Vnnox Passwort',tracking=True)
vnnox_zugang_gesendet = fields.Boolean('Vnnox Zugang gesendet?',tracking=True)
vnnox_playlist_checked = fields.Boolean('Vnnox Liste geprüft ?',tracking=True)
vnnox_playlist_checked_empty = fields.Boolean('Vnnox Liste war leer ?',tracking=True)
vnnox_playlist_checked_date = fields.Date('Vnnox Liste geprüft am ',tracking=True)
xibo_zugang_erstellt = fields.Boolean('Xibo Zugang ?',tracking=True)
xibo_zugang_username = fields.Char('Xibo Username',tracking=True)
xibo_zugang_password = fields.Char('Xibo Passwort',tracking=True)
xibo_zugang_gesendet = fields.Boolean('Xibo Zugang gesendet?',tracking=True)
lmw_zugang_erstellt = fields.Boolean('LMW Zugang ?',tracking=True)
lmw_zugang_username = fields.Char('LMW Username',tracking=True)
lmw_zugang_password = fields.Char('LMW Passwort',tracking=True)
lmw_zugang_gesendet = fields.Boolean('LMW Zugang gesendet?',tracking=True)
wflow_korrekturabzug = fields.Boolean('Korekturabzug gesendet ?',tracking=True)
wflow_ausstahlung = fields.Boolean('Eingespielt/Ausgestahlt ?',tracking=True)
wflow_aenderung = fields.Boolean('Änderung durchgeführt ?',tracking=True)
info_account_changes = fields.Boolean('Benachrichtigen bei Accountänderungen',tracking=True)
info_spot_changes = fields.Boolean('Benachrichtigen bei Spotänderungen',tracking=True)
info_contract_changes = fields.Boolean('Benachrichtigen bei Vertragsänderungen',tracking=True)
info_partner_changes = fields.Boolean('Benachrichtigen bei Partneränderungen',tracking=True)
info_partner = fields.Many2one('res.partner','Benachrichtigung an : ',tracking=True)
work_marker_1 = fields.Boolean('Markierung 1 aktiv (StartEmail versendet)',tracking=True)
get_marker_1_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_1_color_false')
work_marker_2 = fields.Boolean('Markierung 2 aktiv',tracking=True)
get_marker_2_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_2_color_false')
work_marker_3 = fields.Boolean('Markierung 3 aktiv',tracking=True)
work_marker_3_full = fields.Boolean('Markierung 3 vollmarker',tracking=True)
work_marker_3_value = fields.Char('Markierung 3 Wert',tracking=True)
get_marker_3_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_3_color_false')
work_marker_3_1 = fields.Boolean('Teil-Markierung 3.1 aktiv',tracking=True)
work_marker_3_1_value = fields.Char('Teil-Markierung 3.1 Wert',tracking=True)
work_marker_3_2 = fields.Boolean('Teil-Markierung 3.2 aktiv',tracking=True)
work_marker_3_2_value = fields.Char('Teil-Markierung 3.2 Wert',tracking=True)
work_marker_4 = fields.Boolean('Markierung 4 aktiv',tracking=True)
work_marker_4_full = fields.Boolean('Markierung 4 vollmarker',tracking=True)
work_marker_4_value = fields.Char('Markierung 4 Wert',tracking=True)
get_marker_4_color = fields.Char('Markierung 1 Farbe get',compute='_get_marker_4_color_false')
work_marker_4_1 = fields.Boolean('Teil-Markierung 4.1 aktiv',tracking=True)
work_marker_4_1_value = fields.Char('Teil-Markierung 4.1 Wert',tracking=True)
work_marker_4_2 = fields.Boolean('Teil-Markierung 4.2 aktiv',tracking=True)
work_marker_4_2_value = fields.Char('Teil-Markierung 4.2 Wert',tracking=True)
marker_list = fields.Many2many('dss.marker', string='vorhandene Marker', tracking=True)
# work_state = fields.Many2one('dss.workstate',default=_default_work_state,tracking=True)
# work_state_color = fields.Char(related='work_state.color')
# work_state_text = fields.Char(related='work_state.statusname')
work_state_info = fields.Char('Zusatzinfo',tracking=True)
contract_binaries = fields.Many2many('dss.binaries', string='Vertragsdateien', tracking=True)
# todo_state = fields.Many2one('dss.todostate',default=_default_todo_state,tracking=True)
# todo_state_color = fields.Char(related='todo_state.color')
# todo_state_text = fields.Char(related='todo_state.statusname')
# todo_state_info = fields.Char('Zusatzinfo',tracking=True)
# todo_state_until = fields.Date('Abarbeiten bis',tracking=True)
cloudlink = fields.Char('Cloud Verzeichnis',help='Verzeichnis für den Kunde innerhalb des Projekt Ordners')
web_contract = fields.Many2one('dss.web_contracts' , string='Web_Vertrag', store=True,tracking=True)
web_contract_input_notfinished = fields.Boolean('Web Vertrag Eingabe nicht abgeschlossen',tracking=True)
web_contract_input_finished = fields.Boolean('Web Vertrag Eingabe war abgeschlossen',tracking=True)
web_contract_paysum_gfx = fields.Float('Web Vertrag Zahlungssumme Grafik',tracking=True)
web_contract_paysum_lz = fields.Float('Web Vertrag Zahlungssumme Laufzeit',tracking=True)
web_contract_paysum_all = fields.Float('Web Vertrag Zahlungssumme Gesamt',tracking=True)
web_contract_sign_ort = fields.Char('Web Vertrag Ort',tracking=True)
web_contract_sign_datum = fields.Char('Web Vertrag Datum',tracking=True)
web_contract_sign_name = fields.Char('Web Vertrag Unterschrift Name',tracking=True)
web_contract_is_lastschrift = fields.Boolean('Web Vertrag ist Lastschrift',tracking=True)
web_contract_kapayment_info = fields.Char('Web Vertrag Zahlung nach Korrekturabzug Summe',tracking=True)
web_contract_alpayment_info = fields.Char('Web Vertrag Zahlung nach Auslieferung Summe',tracking=True)
web_contract_sonder_0 = fields.Char('Web Vertrag Sonderfeld 01',tracking=True)
web_contract_sonder_1 = fields.Char('Web Vertrag Sonderfeld 02',tracking=True)
web_contract_sonder_2 = fields.Char('Web Vertrag Sonderfeld 03',tracking=True)
web_contract_satzmail = fields.Boolean('Web Vertrag Satzmaterial als Mail',tracking=True)
web_contract_satzgiven = fields.Boolean('Web Vertrag Satzmaterial gegeben',tracking=True)
web_contract_rgmail = fields.Boolean('Web Vertrag Rechnung als Mail',tracking=True)
web_contract_kamail = fields.Boolean('Web Vertrag Korrekturabzug Zugang',tracking=True)
web_constract_zahlstonst = fields.Char('Web Vertrag Zahlungsweise',tracking=True)
web_contract_rejected = fields.Boolean('Eingabe - Web Vertrag abgelehnt',tracking=True)
web_contract_reject_reason = fields.Char('Eingabe - Web Vertrag Ablehnungsgrund',tracking=True)
web_bande_spieltage = fields.Char('Web Vertrag Bande - gebuchte Spieltage',tracking=True)
web_contract_start_planed = fields.Char("TV Kampagne Start",tracking=True)
web_contract_remove_planed = fields.Char("TV Kampagne Ende",tracking=True)
tv_reach_PLZ = fields.Char(string='Reichweite PLZ',tracking=True)
ads_radius_PLZ = fields.Integer('Umkreis PLZ in Km',tracking=True)
ads_count_perYear = fields.Selection([('30000','30.000'),('60000','60.000'),('120000','120.000'),('1000000','1.000.000')],'Einblendungen alt',tracking=True)
ads_count_perYear2 = fields.Integer('Einblendungen',tracking=True)
ads_topics = fields.Many2many('dss.contracts_ads_topics', string='Themenliste', tracking=True)
ads_topics_text = fields.Char('Themenliste gesamt',compute='_compute_themenliste')
userdef_vars = fields.Many2many('dss.contracts_uservars', string='Vertrags Uservariablen', tracking=True)
contract_finish_img_cloud = fields.Char('Überg. Bildlink',tracking=True)
@api.depends('techniker','project_techniker')
@api.onchange('techniker')
@api.onchange('project_techniker')
def _compute_techniker_computed(self):
for record in self:
if record.techniker:
record.techniker_computed = record.techniker
elif record.project_techniker:
record.techniker_computed = record.project_techniker
else:
record.techniker_computed = False
@api.depends('client_short_IBAN')
@api.onchange('client_short_IBAN')
@api.onchange('client_short_BIC')
def _compute_cutshort_Bank(self):
# BIC für Deutsche Bank
kontocheck.lut_load()
for record in self:
bankname =''
if record.client_short_BIC:
try:
bankname = kontocheck.scl_get_bankname(record.client_short_BIC)
except ValueError:
bankname = ''
else :
if record.client_short_BLZ_computed:
try:
bankname = kontocheck.get_bankname(record.client_short_BLZ_computed)
except ValueError:
bankname = ''
record.client_short_BANK_computed = bankname
def get_account_from_iban(iban):
# Entfernen von Leerzeichen und Großbuchstaben
clean_iban = "".join(iban.split()).upper()
# Überprüfen, ob es eine deutsche IBAN ist
if len(clean_iban) == 22 and clean_iban.startswith("DE"):
# Die letzten 10 Stellen sind die Kontonummer
account_number = clean_iban[-10:]
return account_number
else:
return "Ungültige deutsche IBAN"
def get_blz_from_iban(iban):
# Entfernen von Leerzeichen und Großbuchstaben
clean_iban = "".join(iban.split()).upper()
# Überprüfen, ob es eine deutsche IBAN ist
if len(clean_iban) == 22 and clean_iban.startswith("DE"):
# Die letzten 10 Stellen sind die Kontonummer
blz_number = clean_iban[4:12]
return blz_number
else:
return "Ungültige deutsche IBAN"
@api.depends('client_short_IBAN')
@api.onchange('client_short_IBAN')
def _compute_cutshort_Konto(self):
kontocheck.lut_load()
for record in self:
Kontonummer = ''
if record.client_short_IBAN:
try:
Kontonummer = dsscontracts.get_account_from_iban(record.client_short_IBAN)
except ValueError:
Kontonummer = ''
record.client_short_KONTO_computed = Kontonummer
@api.depends('client_short_IBAN')
@api.onchange('client_short_IBAN')
def _compute_cutshort_BLZ(self):
kontocheck.lut_load()
for record in self:
Bankleitzahl = ''
if record.client_short_IBAN:
try:
Bankleitzahl = dsscontracts.get_blz_from_iban(record.client_short_IBAN)
except ValueError:
Bankleitzahl = ''
record.client_short_BLZ_computed = Bankleitzahl
@api.depends('work_marker_1')
@api.onchange('work_marker_1')
def _get_marker_1_color_false(self):
try :
_logger.info('Contract get Marker 1 Color false')
self.get_marker_1_color = dss_settings.dssSettings._get_settingvalue(self,'marker_1_color_unused')
for record in self:
if not record.work_marker_1:
record.get_marker_1_color = dss_settings.dssSettings._get_settingvalue(self,'marker_1_color_unused')
else:
record.get_marker_1_color = dss_settings.dssSettings._get_settingvalue(self,'marker_1_color_used')
except :
_logger.info("error")
@api.depends('work_marker_2')
@api.onchange('work_marker_2')
def _get_marker_2_color_false(self):
_logger.info('Contract get Marker 2 Color false')
for record in self:
if not record.work_marker_2:
record.get_marker_2_color = dss_settings.dssSettings._get_settingvalue(self,'marker_2_color_unused')
else:
record.get_marker_2_color = dss_settings.dssSettings._get_settingvalue(self,'marker_2_color_used')
@api.depends('work_marker_3')
@api.onchange('work_marker_3')
def _get_marker_3_color_false(self):
_logger.info('Contract get Marker 3 Color false')
for record in self:
if dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_value'):
if record.work_marker_3:
record.get_marker_3_color = record.work_marker_3_value
else:
record.get_marker_3_color = dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_unused')
else:
if not record.work_marker_3:
record.get_marker_3_color = dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_unused')
else:
record.get_marker_3_color = dss_settings.dssSettings._get_settingvalue(self,'marker_3_color_used')
def _get_marker_4_color_false(self):
_logger.info('Contract get Marker 4 Color false')
for record in self:
if dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_value'):
if record.work_marker_4:
record.get_marker_4_color = record.work_marker_4_value
else:
record.get_marker_4_color = dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_unused')
else:
if not record.work_marker_4:
record.get_marker_4_color = dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_unused')
else:
record.get_marker_4_color = dss_settings.dssSettings._get_settingvalue(self,'marker_4_color_used')
@api.depends('ads_topics')
def _compute_themenliste(self):
# _logger.info('Contract Themenliste Berechnung : C_' + str(self.id))
for record in self:
if record.ads_topics:
record.ads_topics_text = ', '.join(record.ads_topics.mapped('thema'))
else:
record.ads_topics_text = ''
@api.onchange('ads_last_date_korrekturabzug')
def _ads_last_date_korrekturabzug_change(self):
_logger.info('Korrekturabzug änderung C')
for record in self:
_logger.info('Korrekturabzug änderung C: C_' + str(self.id) + 'K_' + str(record.id)+' / '+str(record.ads_last_date_korrekturabzug)+' / '+str(record._origin.ads_last_date_korrekturabzug))
autodays=0
if record.ads_last_date_korrekturabzug:
_logger.info('Korrekturabzug Änderung erfolgt C: C_' + str(self.id) + 'K_' + str(record.id))
autodays=self.env['dss.settings'].search([],limit=1).freigabe_auto_time
record.ads_last_date_korrekturfreigabe_ablauf = record.ads_last_date_korrekturabzug + relativedelta(days=autodays)
@api.depends('vertragssumme')
def _compute_prov(self):
# _logger.info('contract Provision Berechnung : C_' + str(self.id));
if self.provisionstyp.provisionbase == 'VSUM':
if not self.provisionstyp.provisioncalc:
prozent=self.provisionstyp.provisionprozent
basis=self.vertragssumme
value = (basis/100)*prozent
self.provisionsteilcalc = value
def _compute_provisionspayedpercent(self):
addval = 0
for prov in self.provisions:
# _logger.info('contract Provision Payed_part : C_' + str(self.id)+' / '+str(prov.provisionprozent));
addval = addval + prov.provisionprozent
# _logger.info('Contract Provision payed : C_' + str(self.id)+' V '+str(addval));
self.provisionspayedpercent = addval
@api.onchange('provisionstyp')
def _onchange_provtype(self):
self._compute_prov()
self._compute_provisionspayedpercent()
@api.onchange('vertragssumme')
def _onchange_vsumme(self):
self._compute_prov()
self._compute_provisionspayedpercent()
@api.model
def _expand_ads_last_work_state(self,states,domain,order):
if dss_settings.dssSettings._get_settingvalue(self,'show_expand_contract_group_ad_work_state'):
state_ids = self.env['dss.workstate'].search([])
return state_ids
else:
return self.ads_last_work_state
@api.model
def _expand_ads_last_todo_state(self,states,domain,order):
if dss_settings.dssSettings._get_settingvalue(self,'show_expand_contract_group_ad_todo_state'):
state_ids = self.env['dss.todostate'].search([])
return state_ids
else:
return self.ads_last_todo_state
@api.model
def _expand_ads_last_state(self,states,domain,order):
if dss_settings.dssSettings._get_settingvalue(self,'show_expand_contract_group_ad_state'):
state_ids = self.env['dss.adstate'].search([])
return state_ids
else:
return self.ads_last_state
@api.constrains('client_id')
def _check_client_id(self) :
for record in self :
if len(record.client_id) != 2 :
_logger.debug("Kundenid muss 2 Stellen haben %s" % (record.client_id))
raise ValidationError(_("KundenID muss 2 Stellen haben"))
@api.onchange('client_id')
def _onchange_client_id(self):
for record in self :
if record.contract_name == '' :
cname = 'unbekannter Kunden'
else:
cname = record.contract_name
resstr = "%s%s %s" % (record.project_id,record.client_id,cname)
cidstr = "%s%s" % (record.project_id,record.client_id)
if resstr is None :
resstr = 'nicht ermittelbar'
_logger.info('Contract_client_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name));
self.contract_auto_name = resstr
self.contract_auto_id = cidstr
@api.onchange('project_id')
def _onchange_project_id(self):
_logger.info('project_id_change_1 : C_' + str(self) + ' - '+str(self.project))
for record in self :
if record.contract_name == '' :
cname = 'unbekannter Kunden'
else:
cname = record.contract_name
resstr = "%s%s %s" % (record.project_id,record.client_id,cname)
cidstr = "%s%s" % (record.project_id,record.client_id)
if resstr is None :
resstr = 'nicht ermittelbar'
_logger.info('project_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name))
self.contract_auto_name = resstr
self.contract_auto_id = cidstr
@api.onchange('contract_name')
def _onchange_contract_name(self):
for record in self :
if record.contract_name == '' :
cname = 'unbekannter Kunden'
else:
cname = record.contract_name
resstr = "%s%s %s" % (record.project_id,record.client_id,cname)
cidstr = "%s%s" % (record.project_id, record.client_id)
if resstr is None :
resstr = 'nicht ermittelbar'
_logger.info('Contract_Name_Change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name))
if not self.contract_auto_name:
self.contract_auto_name = resstr
if not self.contract_auto_id:
self.contract_auto_id = cidstr
if self.contract_auto_id == "":
self.contract_auto_id = cidstr
def jumpcloud(self):
urlbase=str(self.env['dss.settings'].search([], limit=1).def_cloud_url_base)
_logger.info("Cloud Open Link Urlbase DB " + str(urlbase))
if not urlbase:
urlbase = 'https://cloud.logumedia.de/index.php/apps/files/?dir=';
_logger.info("Cloud Open Link Urlbase Used " + str(urlbase))
if not self.cloudlink:
url=str(urlbase)+str(dss_settings.dssSettings._get_path_converted(self,self.project.cloudlink,self.project))+str(dss_settings.dssSettings._get_path_converted(self,self.cloudlink,self))
else:
url=str(urlbase)+str(dss_settings.dssSettings._get_path_converted(self,self.cloudlink,self))
_logger.info("Cloud Open Link " + str(url))
return {
'type': 'ir.actions.act_url',
'url': str(url),
'target': 'new',
}
@api.onchange('contract_auto_id')
def _onchange_contract_auto_id(self):
for record in self :
if record.contract_name == '' :
cname = 'unbekannter Kunden'
else:
cname = record.contract_name
resstr = "%s%s %s" % (record.project_id,record.client_id,cname)
cidstr = "%s%s" % (record.project_id, record.client_id)
if resstr is None:
resstr = 'nicht ermittelbar'
_logger.info('Contract_auto_id_change : C_' + str(self.id) + ' - '+str(cidstr)+' vs. '+str(self.contract_auto_id)+'/'+str(resstr)+' vs '+str(self.contract_auto_name));
if not self.contract_auto_name:
self.contract_auto_name = resstr
if not self.contract_auto_id:
self.contract_auto_id = cidstr
if self.contract_auto_id == "":
self.contract_auto_id = cidstr
# @api.model
# def create(self,vals):
# vals['projectid'] = self.env.context.get('active_id')
# project = self.env('dss.projects').search(['id','=',vals['projectid']])
# vals['project'] = project('projektname');
# contract=super().create(vals)
# return contract
def action_info_click_ls(self):
view=self.env.ref("DigitalSignage.dss_contracts_infofeld_form")
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_id': view.id,
'res_model': 'dss.contracts' ,
'target': 'new' ,
'display_name' : 'Text ändern',
'views':[(view.id,'form')],
'res_id': self.id ,
}
def action_state_click_ls(self):
view=self.env.ref("DigitalSignage.dss_contracts_viewstate_ls_form")
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_id': view.id,
'res_model': 'dss.contracts' ,
'target': 'new' ,
'display_name' : 'Status ändern',
'views':[(view.id,'form')],
'res_id': self.id ,
}
def action_state_click_lws(self):
view=self.env.ref("DigitalSignage.dss_contracts_viewstate_lws_form")
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_id': view.id,
'res_model': 'dss.contracts' ,
'target': 'new' ,
'display_name' : 'Status ändern',
'views':[(view.id,'form')],
'res_id': self.id ,
}
def action_state_click_lds(self):
view=self.env.ref("DigitalSignage.dss_contracts_viewstate_lds_form")
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_id': view.id,
'res_model': 'dss.contracts' ,
'target': 'new' ,
'display_name' : 'Status ändern',
'views':[(view.id,'form')],
'res_id': self.id ,
}
# return {
#'effect':{
# 'fadeout':'slow',
# 'message':'Status Geklickt',
# 'type':'rainbow_man',
# }
# }
''
@api.model
def _default_uuid(self):
return str(uuid.uuid4())
@api.model
def _getdefwscolor(self):
return str('#ffffff')
@api.model
def _read_group_stage_ids(self,stages,domain,order):
_logger.info('Get Columns Contract State '+ str(stages)+' / ' + str(domain)+' / '+str(domain[0])+' / '+str(len(domain[0])))
if (len(domain[0]) > 1):
_logger.info('get Columns Contract State ' + str(domain)+' / '+str(domain[0]))
Pid = domain[0][2]
else:
_logger.info('get Columns Contract State ' + str(domain)+' / '+str(domain[1][2]))
Pid = domain[1][2]
Myproject=self.env['dss.projects'].search([("id","=",Pid)])
contract_state_ids = self.env['dss.contractstate'].search(["|",("systemtypdefault","=",True),("systemtypuuid","=",Myproject.grundsystemnameuuid)],order='order')
# contract_state_ids = self.env['dss.contractstate'].search([],order='order')
_logger.info('get Columns Contract State ' + str(contract_state_ids)+' / '+str(self.project_system_uuid)+' / '+str(self)+' / '+str(stages)+' / '+str(domain)+' / '+str(Myproject))
return contract_state_ids
@api.model
def _read_group_system_ids(self, stages, domain, order):
_logger.info('Get Columns System State ' + str(stages)+' / '+str(domain)+' / '+str(order))
project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order')
return project_system_ids
@api.model
def fields_view_get(self,cr,uid,view_id=None,view_type='form',context=None, toolbar=False, submenu=False):
_logger.info('Fields View Get ' + str(cr)+' / '+str(uid)+' / '+str(view)+' / '+str(parent))
if context is None:
context={}
return res
@api.model
def _default_client_id(self):
return str("00")
def pyaction_dss_contract_goto_partner(self):
fullname = str(self.client_short_vorname) + ' ' +str(self.client_short_name)
def pyaction_dss_contract_make_partner(self):
fullname = str(self.client_short_vorname) + ' ' +str(self.client_short_name)
myplz=self.client_short_plz
result = self.env['res.partner'].create({'name':fullname,
'company_name': self.client_short_company,
'dsspartner_vorname':self.client_short_vorname,
'dsspartner_name':self.client_short_name,
'dsspartner':True,
'dsspartner_werbung':True,
'street':self.client_short_strasse,
'city':self.client_short_ort,
'zip':myplz,
'phone':self.client_short_telefon,
'mobile':self.client_short_mobil,
'email':self.client_short_email,
'rgemail':self.client_short_rgemail,
'is_company':False})
result.country_id = self.client_short_land
result.dsspartner_Company_type = self.client_short_company_type.id
_logger.info('Creating Contact ' + str(result) + ' ' + str(fullname))
self.client = result
# action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.act_dss_project_view_contract')
# action['display_name'] = self.contract_name
# action['domain'] = '[["projectid","=","4"]]'
# context = action['context'].replace('', str(self.id))
# context = ast.literal_eval(context)
# context.update({
# 'create': self.active,
# 'active_test': self.active
# })
# action['context'] = context
# return action
def pyaction_dss_contract_addcalendar_runtime(self):
event = {
'start': self.runtime_finish.strftime('%Y-%m-%d %H:%M:%S'),
'stop': self.runtime_finish.strftime('%Y-%m-%d %H:%M:%S'),
'duration': 24,
'allday': True,
'partner_ids': (4,self.env['dss.settings'].search([],limit=1).contact_runtime_user.partner_id.id),
'name': 'Vertragsablauf '+self.contract_auto_name,
'description': 'Vertragsablauf '+self.contract_auto_name+' im Projekt '+self.project.projektname,
'user_id': self.env['dss.settings'].search([],limit=1).contact_runtime_user.id
}
_logger.debug('linking new event ' + str(event) + ' ' + str(self.uuid))
self.runtime_calendar_event=self.env['calendar.event'].create(event).id
return ""
def pyaction_dss_contract_addcalendar_rf_runtime(self):
self.env['calendar.event'].search([('id', '=', self.runtime_calendar_event)]).unlink()
event = {
'start': self.runtime_finish.strftime('%Y-%m-%d %H:%M:%S'),
'stop': self.runtime_finish.strftime('%Y-%m-%d %H:%M:%S'),
'duration': 24,
'allday': True,
'partner_ids': (4,self.env['dss.settings'].search([],limit=1).contact_runtime_user.partner_id.id),
'name': 'Vertragsablauf '+self.contract_auto_name,
'description': 'Vertragsablauf '+self.contract_auto_name+' im Projekt '+self.project.projektname,
'user_id': self.env['dss.settings'].search([],limit=1).contact_runtime_user.id
}
_logger.debug('linking new event ' + str(event) + ' ' + str(self.uuid))
self.runtime_calendar_event=self.env['calendar.event'].create(event).id
return ""
def pyaction_dss_contract_calc_runtime(self):
if self.ads_last_date_start_real:
startdatum= self.ads_last_date_start_real
elif self.ads_last_date_start_planed:
startdatum= self.ads_last_date_start_planed
elif self.start_date:
startdatum= self.start_date
else:
startdatum= self.contract_date
if startdatum :
if self.runtimesystem == "M":
bmonths = 0
bmonths = self.runtime_m+self.runtime_bonus_m
if bmonths > 12:
addyears=bmonths//12
else:
addyears = 0
addmonths = bmonths - (addyears*12)
enddatum = startdatum + relativedelta(months=addmonths,years=addyears,days=-1)
elif self.runtimesystem == "T":
enddatum = startdatum + relativedelta(days=self.runtime_t-1)
enddatum = enddatum + relativedelta(days=self.runtime_t)
elif self.runtimesystem == "E":
enddatum = startdatum
if self.runtime_events:
mydate = startdatum
for event in self.runtime_events:
if mydate.strftime('%Y-%m-%d') < event.eventenddate.strftime('%Y-%m-%d'):
mydate = event.eventenddate
enddatum = mydate
elif self.runtimesystem == "S":
enddatum = self.runtime_finish
self.runtime_finish = enddatum
if not self.contract_cancel_mon:
cancelmonths = 0
else:
cancelmonths = self.contract_cancel_mon
self.contract_cancel_date = enddatum - relativedelta(months=cancelmonths)
def pyaction_dss_contract_calc_runtime_end(self):
if self.ads_last_date_start_real:
startdatum= self.ads_last_date_start_real
elif self.ads_last_date_start_planed:
startdatum= self.ads_last_date_start_planed
elif self.start_date:
startdatum= self.start_date
else:
startdatum= self.contract_date
if startdatum :
if self.runtimesystem == "M":
bmonths = 0
bmonths = self.runtime_m+self.runtime_bonus_m
if bmonths > 12:
addyears=bmonths//12
else:
addyears = 0
addmonths = bmonths - (addyears*12)
enddatum = startdatum + relativedelta(months=addmonths,years=addyears,days=-1)
elif self.runtimesystem == "T":
enddatum = startdatum + relativedelta(days=self.runtime_t-1)
enddatum = enddatum + relativedelta(days=self.runtime_t)
elif self.runtimesystem == "E":
enddatum = startdatum
if self.runtime_events:
mydate = startdatum
for event in self.runtime_events:
if mydate.strftime('%Y-%m-%d') < event.eventenddate.strftime('%Y-%m-%d'):
mydate = event.eventenddate
enddatum = mydate
elif self.runtimesystem == "S":
enddatum = self.runtime_finish
if not self.contract_cancel_mon:
cancelmonths = 0
else:
cancelmonths = self.contract_cancel_mon
self.contract_cancel_date = enddatum - relativedelta(months=cancelmonths)
def pyopen_provadd_form_view(self):
_logger.info('Open Add Provision')
view=self.env.ref("DigitalSignage.dss_provision_add_form")
self._compute_prov()
provision=self.env['dss.provision'].create({'contract':self.id,'provisiongesamt':self.provisionsteilcalc,'paydate':date.today()})
_logger.info('Open Add Provision '+str(view)+' P_'+str(provision))
# self.provisions=[(4,[provision.id])]
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.provision' ,
'target': 'new' ,
'display_name' : 'Neu Provision einfügen',
'views':[(view.id,'form')],
'res_id':provision.id,
}
def tokampagne(self):
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' - prüfe Letzte Aktuelle Kampagne')
# action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.action_dss_ads_view')
# context = action['context']
ds = self.env['dss.ads'].search([('contract','=',self.id),('ad_is_lastpos','=',True)],limit=1)
if not ds:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' - keine letzte Kampagne')
ds = self.env['dss.ads'].search([('contract','=',self.id)],limit=1)
else:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Kampagne gefunden ')
self.ads_last_ad = ds
# prüfen ob Contract_autoname
resstr = ''
if not self.contract_auto_name:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Kein Contract_autoname ')
if self.contract_name == '':
cname = 'unbekannter Kunden'
else:
cname = self.contract_name
resstr = "%s%s %s" % (self.project_id, self.client_id, cname)
if not resstr:
resstr = 'nicht ermittelbar'
_logger.debug(resstr)
self.contract_auto_name = resstr
_logger.info('Click auf Werbekampagne : C_' + str(self.id) + 'A_' + str(ds.id) + ' - Contract_autoname gesetzt '+ str(resstr))
# prüfen ob LetzteKampagne medien hat
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Suche evtl Medien der Kampagne ')
medias = self.env['dss.mediarelations'].search(['&',('contract','=',self.id),('ad','=',ds.id)])
if medias:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Medien gefunden '+str(medias.ids))
self.write({'last_media': [(6,0,medias.ids)]})
else:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(ds.id)+' - Keine Medien gefunden ')
# Medien erzeugen wenn nicht vorhanden
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' Suche Kampagne allgemein ')
kampagne=self.env['dss.ads'].search([('contract','=',self.id)],limit=1)
if not kampagne:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' kein kampagne')
defadstate = self.env['dss.adstate'].search([('func','=','STD')],limit=1)
if not defadstate :
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' kein defstate')
defadstateid = 1
else:
defadstateid = defadstate.id
kampagne = self.env['dss.ads'].create({'contract': self.id, 'project': self.project.id, 'adname': 'WK '+self.contract_auto_name,'adtype':'MAIN','ad_state':defadstateid})
self.ads_last_ad = kampagne.id
if self.web_contract_start_planed :
kampagne.date_start_planed = self.web_contract_start_planed
kampagne.date_remove_planed = self.web_contract_remove_planed
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' Kampagne erstellt A_'+str(kampagne.id))
kampagne.parent_ad = kampagne.id
mediaids = []
if not self.werbe_feld_selected:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Keine Felder im Vertrag')
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
else:
for feld in self.werbe_feld_selected:
if not feld:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Keine Felder im Vertrag')
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
else:
for media in feld.mediastructure.medias:
if not media:
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' Kein Medium in MedienStructur von F_'+str(feld.id)+'M_'+str(media.id))
else:
newmedia=self.env['dss.mediarelations'].create({'field':feld.id,'contract':self.id,'project':self.project.id,'field_uuid':feld.uuid,'ad':kampagne.id, 'relname': media.medianame,
'mediatype': media.id})
_logger.info('Prüfe Medien : C_'+str(self.id)+'K_'+str(kampagne.id)+' setze Vertrag für Medium : '+str(newmedia.contract)+'/'+str(newmedia.ad))
mediaids.append(newmedia.id)
kampagne.write({'need_media': [(6,0,mediaids)]})
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'/'+str(kampagne.id)+' setze Media '+str(kampagne.need_media))
else:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+' mind. 1 Kampagne vorhanden A_'+str(kampagne.id))
kampagnen=self.env['dss.ads'].search([('contract','=',self.id)])
_logger.info('Prüfe Medien : C_'+str(self.id)+' alle Kamp : '+str(kampagnen))
for kamp in kampagnen:
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' - P_'+str(kamp.parent_ad))
if kamp:
mediaids = []
medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)])
if not medias:
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' keine Medien gefunden !')
if not self.werbe_feld_selected:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Keine Felder im Vertrag')
raise ValidationError(
_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
else:
for feld in self.werbe_feld_selected:
if not feld:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Keine Felder im Vertrag')
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
else:
for media in feld.mediastructure.medias:
if not media:
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Kein Medium in der Struktur F_'+str(feld.id)+'M_'+str(feld.mediastructure.id))
else:
newmedi = self.env['dss.mediarelations'].create(
{ 'field': feld.id, 'contract': self.id, 'project': self.project.id,
'field_uuid': feld.uuid, 'ad': kamp.id, 'relname':media.medianame,'mediatype':media.id})
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Erstelle Medium : M_'+str(media.id)+' -> '+str(newmedi.id))
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Medien evtl erstellt ! ')
medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)])
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' neue Media '+str(mediaids))
kamp.write({'need_media': [(6,0,medias.ids)]})
# self.write({'need_media': [(5,0,0)]})
# _logger.info('Click auf Werbekampagne : C_'+str(self.id)+'K_'+str(kamp.id)+' setze Media '+str(kamp.need_media))
else:
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' Medien gefunden !')
if not self.werbe_feld_selected:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Keine Felder im Vertrag')
raise ValidationError(
_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
else:
for feld in self.werbe_feld_selected:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(kamp.id)+'F_'+str(feld.id))
if not feld:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Keine Felder im Vertrag')
raise ValidationError(_("Vertrag hat keine Felder ! Kampagnen benötigen Felder - auch virtuelle"))
else:
for media in feld.mediastructure.medias:
if not media:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Kein Medium in der Struktur F_' + str(feld.id) + 'M_' + str(
feld.mediastructure.id))
else:
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(kamp.id) + 'F_' + str(
feld.id) + 'M_' + str(media.id))
existmedia = self.env['dss.mediarelations'].search(['&',('ad','=',kamp.id),('mediatype','=',media.id),('field','=',feld.id)])
if not existmedia:
newmedi = self.env['dss.mediarelations'].create(
{'field': feld.id, 'contract': self.id, 'project': self.project.id,
'field_uuid': feld.uuid, 'ad': kamp.id, 'relname': media.medianame,
'mediatype': media.id})
_logger.info('Prüfe Medien : C_' + str(self.id) + 'A_' + str(
kamp.id) + ' Erstelle Medium : M_' + str(media.id) + ' -> ' + str(
newmedi.id))
# mediaids.append(medias.ids)
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' gefundene Media '+str(mediaids))
kampagne=self.env['dss.ads'].browse(kamp.id)
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' gefundene Media '+str(mediaids)+' Kampagne '+str(kampagne))
if kampagne.need_media != medias:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' Media unterschiede - setze Media '+str(mediaids)+'/'+str(kampagne.need_media))
else:
_logger.info('Click auf Werbekampagne : C_'+str(self.id)+'A_'+str(kamp.id)+' Media gleich '+str(kampagne.need_media))
else:
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_' +str(kamp.id)+' Keine Kampagne gefunden !')
# _logger.info('Click auf Werbekampagne : '+str(self.id)+' 4 '+str(kampagne.id))
return {
'type': 'ir.actions.act_window',
'view_type':'form',
'view_mode':'form,tree',
'res_model':'dss.ads',
'target':'current',
'context':'{"kampagne_id":'+str(kampagne.id)+',"show_project_update":True}',
'context':'',
'res_id':self.ads_last_ad.id,
#kampagne.id,
# 'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname,
'domain':'[("id","=","context[kampagne_id]")]'
}
def setFirstKampagne(self):
for record in self:
if record.contract_auto_id:
record.tokampagne()
def setTreeStandardValues(self):
for record in self:
if record.contract_name == '':
cname = 'unbekannter Kunden'
else:
cname = record.contract_name
resstr = "%s%s %s" % (record.project_id, record.client_id, cname)
cidstr = "%s%s" % (record.project_id, record.client_id)
if resstr is None:
resstr = 'nicht ermittelbar'
_logger.info('Set Standard Values : C_' + str(record.id) + ' - ' + str(cidstr) + ' vs. ' + str(
record.contract_auto_id) + '/' + str(resstr) + ' vs ' + str(record.contract_auto_name));
if not record.contract_auto_name:
record.contract_auto_name = resstr
if not record.contract_auto_id:
record.contract_auto_id = cidstr
if record.contract_auto_id == "":
record.contract_auto_id = cidstr
def _compute_contract_end_for_calc_date(self):
self.ensure_one()
start_date = self.start_date or self.contract_date
if not start_date:
return False
if self.contract_iscanceled and self.ads_last_todo_state_until:
return self.ads_last_todo_state_until
runtime_months = int(self.runtime_m or 0) + int(self.runtime_bonus_m or 0)
if self.contract_auto_extend:
try:
runtime_months += int((self.contract_auto_extend_time or '0').strip() or 0)
except Exception:
pass
return start_date + relativedelta(months=runtime_months)
def action_update_calc_contract_end_selected(self):
updated_count = 0
for record in self:
new_end_date = record._compute_contract_end_for_calc_date()
if record.calc_end_date != new_end_date:
record.calc_end_date = new_end_date
updated_count += 1
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _('Vertragsende aktualisiert'),
'message': _('%s Vertrag(e) wurden aktualisiert.') % updated_count,
'type': 'success',
'sticky': False,
}
}
def action_remove_selected_fields(self):
selected_fields = self.mapped('werbe_feld_selected')
contract_ids = self.ids
self.write({'werbe_feld_selected': [(5, 0, 0)]})
for ad_field in selected_fields:
remove_cmds = [(3, contract_id) for contract_id in contract_ids if contract_id in ad_field.contract.ids]
if remove_cmds:
ad_field.write({'contract': remove_cmds})
if ad_field.contract_save and ad_field.contract_save.id in contract_ids:
ad_field.contract_save = ad_field.contract[:1].id or False
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _('Felder entfernt'),
'message': _('%s Vertrag(e) wurden von ihren Werbefeldern getrennt.') % len(self),
'type': 'success',
'sticky': False,
}
}
def action_open_move_to_fallback_field_wizard(self):
if not self:
raise ValidationError(_("Bitte mindestens einen Vertrag auswaehlen."))
projects = self.mapped('project')
if len(projects) != 1:
raise ValidationError(_("Bitte nur Vertraege aus einem Projekt gleichzeitig auswaehlen."))
view = self.env.ref('DigitalSignage.dss_contracts_move_field_wizard_view_form')
return {
'type': 'ir.actions.act_window',
'name': _('Felder auf ausweichfeld umsetzen'),
'res_model': 'dss.contracts.move.field.wizard',
'view_mode': 'form',
'view_id': view.id,
'views': [(view.id, 'form')],
'target': 'new',
'context': {
'active_ids': self.ids,
'default_project_id': projects.id,
},
}
# def setRealGrafiker(self):
#for record in self:
#if self.grafiker:
#record.real_Grafiker="Test"
#return "Test"
# else:
# return self.project_grafiker
def setStandardValues(self):
for record in self:
if record.contract_name == '':
cname = 'unbekannter Kunden'
else:
cname = record.contract_name
resstr = "%s%s %s" % (record.project_id, record.client_id, cname)
cidstr = "%s%s" % (record.project_id, record.client_id)
if resstr is None:
resstr = 'nicht ermittelbar'
_logger.info('Set Standard Values : C_' + str(self.id) + ' - ' + str(cidstr) + ' vs. ' + str(
self.contract_auto_id) + '/' + str(resstr) + ' vs ' + str(self.contract_auto_name));
if not self.contract_auto_name:
self.contract_auto_name = resstr
if not self.contract_auto_id:
self.contract_auto_id = cidstr
if self.contract_auto_id == "":
self.contract_auto_id = cidstr
def pyopen_dss_contract_add_uservar(self):
_logger.info('Open Add Uservar Form')
view = self.env.ref("DigitalSignage.dss_uservar_form")
uservar=self.env['dss.contracts_uservars'].create({'contract':self.id})
self.userdef_vars = [(4, uservar.id)]
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.contracts_uservars' ,
'target': 'new' ,
'display_name' : 'Neu Uservariable einfügen',
'views':[(view.id,'form')],
'res_id':uservar.id,
'context': {'default_contract':self.id},
}
@api.depends('shortwerbe_feld_selected')
@api.onchange('werbe_feld_selected')
def _compute_cutshort(self):
for rec in self:
if rec.werbe_feld_selected:
shorty = ""
for f in rec.werbe_feld_selected:
try:
if not shorty:
shorty = str(f.feldname)
else:
shorty = shorty+','+str(f.feldname)
except:
_logger.info('Werbefeldberechnung Exception : C_' + str(rec.id))
rec.cutshortwerbe_feld_selected = str(shorty)
else:
rec.cutshortwerbe_feld_selected = 'unb.'
_logger.info('Werbefeldberechnung kein Inhalt für : C_' + str(rec.id) + ' - ' + str(rec.shortwerbe_feld_selected))
def pyaction_view_contract(self):
view = self.env.ref('DigitalSignage.dss_main_contracts_form')
_logger.debug('Click auf Vertrag : '+str(self.id))
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_id': view.id,
'res_model': 'dss.contracts' ,
'target': 'current' ,
'display_name' : self.contract_name,
'views':[(view.id,'form')],
'res_id': self.id ,
}
def pyaction_new_contract_kanban(self):
action = self.env['ir.actions.act_window'].with_context({'default_contractid': self.id})._for_xml_id('DigitalSignage.action_dss_project_new_contract_kanban')
action['display_name'] = self.contract_name
action['domain'] = '[["id","=","'+str(self.id)+'"]]'
# context = action['context'].replace('', str(self.id))
# context = ast.literal_eval(context)
# context.update({
# 'create': self.active,
# 'active_test': self.active
# })
# action['context'] = context
return action
def pyaction_dss_project_make_contract(self):
#raise UserError(_("Inhalt : "+str(self.id)+" - "+str(self.contract_name)+" - "+str(self.client_id)))
newid =self.id
self.contract_auto_id = str(self.project_id) + str(self.client_id)
self.contract_auto_name = str(self.project_id) + str(self.client_id) + ' ' + str(self.contract_name)
projectcloudpath = self.project.cloudlink
if not projectcloudpath:
self.cloudlink = str(dss_settings.dssSettings.getprojectpath(self,self.project))+str(dss_settings.dssSettings.getClientpath(self,self))
else:
if projectcloudpath[0] != '$':
self.cloudlink = str(projectcloudpath)+str(dss_settings.dssSettings.getClientpath(self,self))
else:
self.cloudlink = str(dss_settings.dssSettings.getprojectpath(self,self.project))+str(dss_settings.dssSettings.getClientpath(self,self))
cl = str(self.cloudlink)
action = (self.env["confirmation.wizard"].confirm_message(_("Ist die Bezeichnung des neuen Kunden : "+self.contract_auto_name+" richtig ?( "+str(cl)+" ) (Cloudornder wird entsprechend angelegt) !"),title="Bitte bestätigen",method="createcontract",records=self,callback_params={"template":self.id})
)
if action:
return action
def export_kd_csv_all_not_work(self):
_logger.info('Export Kunden CSV : C_'+str(self.id))
action = (self.env["confirmation.wizard"].confirm_message(_("Soll der Kunde einzeln übertragen werden ?"),title="Bitte bestätigen",method="export_kd_csv",records=self,callback_params={"template":self.id}))
if action:
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - einzeln bestätigt ')
csv = 'Kundenname;Firma;Strasse;Ort;PLZ;Telefon;Mobil;Email;RG-Email;Leitwegid;Company Type\n'
#csv += str(self.client_short_vorname) + ' ' + str(self.client_short_name) + ';' + str(self.client_short_company) + ';' + str(self.client_short_strasse) + ';' + str(self.client_short_ort) + ';' + str(self.client_short_plz) + ';' + str(self.client_short_telefon) + ';' + str(self.client_short_mobil) + ';' + str(self.client_short_email) + ';' + str(self.client_short_rgemail) + ';' + str(self.client_short_leitwegid) + ';' + str(self.client_short_company_type.name if self.client_short_company_type else '')+'\n'
else:
action = (self.env["confirmation.wizard"].confirm_message(_("Soll der Kunde zur Liste der Übertragungen hinzugefügt werden ?"),title="Bitte bestätigen",method="export_kd_csv",records=self,callback_params={"template":self.id}))
if action:
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Hinzufügen bestätigt ')
action = (self.env["confirmation.wizard"].confirm_message(_("Liste jetzt als CSV erstellen ?"),title="Bitte bestätigen",method="export_kd_csv",records=self,callback_params={"template":self.id}))
if action:
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - CSV bestätigt ')
@staticmethod
def _split_text_for_csv(value, first_max=40, second_max=40):
text = str(value or '').strip()
if len(text) <= first_max:
return text, ''
boundary_cut = -1
remainder_start = first_max
for match in re.finditer(r'[\s\W_]+', text[:first_max + 1]):
if 0 < match.start() <= first_max:
boundary_cut = match.start()
remainder_start = match.end()
# If no useful separator exists near the limit, fallback to strict split.
if boundary_cut < int(first_max * 0.6):
first_line = text[:first_max]
second_line = text[first_max:]
else:
first_line = text[:boundary_cut]
second_line = text[remainder_start:]
return first_line, second_line.lstrip()[:second_max]
@api.model
def checkattachents(self,project,contract):
_logger.info('Check Attachments : C_'+str(contract)+' - P_'+str(project))
html = ""
if project.contract_finish_img_cloud:
_logger.info('Check Attachments : C_'+str(contract)+' - P_'+str(project)+' - Projekt hat Cloudbilder :'+str(project.contract_finish_img_cloud))
return True
else:
if contract.contract_finish_img_cloud:
_logger.info('Check Attachments : C_'+str(contract)+' - P_'+str(project)+' - Vertrag hat Cloudbilder :'+str(contract.contract_finish_img_cloud))
return True
else:
return False
@staticmethod
def _encode_csv_attachment(csv_text):
# UTF-8 with BOM keeps umlauts/special chars readable in Excel and downstream tools.
normalized = str(csv_text or '').replace('\r\n', '\n').replace('\r', '\n')
return base64.b64encode(normalized.encode('utf-8-sig'))
def _export_kd_csv_single(self,record_id):
dataset=self.env['dss.contracts'].browse(record_id)
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Einzelner Export ')
company_name_line_1, company_name_line_2 = self._split_text_for_csv(dataset.client_short_company)
csv = '"DEBITORENKONTO";"Kunde_seit";"ZAHLUNGSART";"SKONTOTYP";"ANREDE";"akad.Grad";"TITEL1";"AP-VORNAME";"AP-NAME";"NAME";"Ergaenzung";"LAND";"STRASSE";"PLZ";"ORT";"TELEFON1";"FAX1";"Mobil1";"INTERNET";"EMAIL1";"TELEFON1_AP";"KUNDENNR";"BANKNAME_1";"BANKKONTO_1";"BLZ_1";"IBAN_1";"BIC_1";"FIBU-KONTENBEZEICHNUNG";"KREDITLIMIT";"HAUSBANK";"FAELLIG_TG"'+'\n'
csv += ('"'+str(dataset.contract_auto_id) +
'";"' + str(dataset.contract_date.strftime('%d.%m.%Y')) +
'";"' + ('L' if dataset.web_contract_is_lastschrift else '') +
'";"' + str("4") +
'";"' + str("") +
'";"' + str("") +
'";"' + str("") +
'";"' + str(dataset.client_short_vorname) +
'";"' + str(dataset.client_short_name) +
'";"' + str(company_name_line_1) +
'";"' + str(company_name_line_2) +
'";"' + str(dataset.client_short_land.name if dataset.client_short_land else 'DEUTSCHLAND') +
'";"' + str(dataset.client_short_strasse) +
'";"' + str(dataset.client_short_plz) +
'";"' + str(dataset.client_short_ort) +
'";"' + str(dataset.client_short_telefon) +
'";"' + str(dataset.runtime_m) +
'";"' + str(dataset.client_short_mobil) +
'";"' + str(dataset.cutshortwerbe_feld_selected) +
'";"' + str(dataset.client_short_email) +
'";"' + str("") +
'";"' + str(dataset.contract_auto_id) +
'";"' + str(dataset.client_short_BANK_computed) +
'";"' + str(dataset.client_short_KONTO_computed) +
'";"' + str(dataset.client_short_BLZ_computed) +
'";"' + str(dataset.client_short_IBAN).upper() +
'";"' + str(dataset.client_short_BIC).upper() +
'";"' + str(re.sub(r'[^a-zA-Z0-9]', '', str(dataset.client_short_company.upper().strip()))[:20]) +
'";"' + str(dataset.web_contract_paysum_all) +
'";"' + str('2' if dataset.web_contract_is_lastschrift else '1') +
'"8"'+
'"\n')
_logger.info('Export Kunden CSV : C_'+str(dataset.id)+' - CSV Inhalt : \n'+str(csv))
#csv = csv.replace('"False"', '""')
filename = 'KDEXPORT_' + str(dataset.contract_auto_id) + '_' + str(uuid.uuid4())[:8] + '.csv'
attachment_id = self.env['ir.attachment'].create({ 'name': filename, 'datas': self._encode_csv_attachment(csv),'res_model': 'dss.contracts', 'res_id': dataset.id})
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
download_url = '/web/content/' + str(attachment_id.id) + '?download=true'
self.client_is_export_finance_date = datetime.now()
self.client_is_export_finance = True
#
# this does the download
return {
"type": "ir.actions.act_url",
"url": str(base_url) + str(download_url),
"target": "new"
}
def export_kd_csv_single(self,data_id=None):
if not self.client_is_export_finance or data_id:
self._export_kd_csv_single(self.id)
else:
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Bereits exportiert am '+str(self.client_is_export_finance_date))
action = (self.env["confirmation.wizard"].confirm_message(_("Der Kunde wurde bereits am "+str(self.client_is_export_finance_date)+" exportiert ! Soll der Export erneut durchgeführt werden ?"),title="Bitte bestätigen",method="export_kd_csv_single",records=self,callback_params={"data_id":self.id}))
if action:
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Einzelner Export erneut bestätigt ')
self.client_is_export_finance = False
return self.export_kd_csv_single()
else:
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Einzelner Export erneut abgelehnt ')
def _export_kd_csv_add(self,record_ids):
dataset=self.env['dss.contracts'].browse(record_ids)
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Hinzufügen ')
existing_user_var = self.env['dss.contracts_uservars'].search([('contract', '=', self.id),('var_ID','=','BHEXMARK_1')], limit=1)
if not existing_user_var:
uvar = self.env['dss.contracts_uservars'].create({'contract': self.id, 'var_ID': 'BHEXMARK_1', 'var_name':'Buchhaltung Export vorgemerkt !', 'var_value': str(datetime.now())})
self.userdef_vars = [(4, uvar.id)]
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Hinzufügen - Uservar erstellt ')
def export_kd_csv_add(self,data_id=None):
if not self.client_is_export_finance or data_id:
self._export_kd_csv_add(self.id)
else:
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Bereits exportiert am '+str(self.client_is_export_finance_date))
action = (self.env["confirmation.wizard"].confirm_no_action_message(_("Der Kunde wurde bereits am "+str(self.client_is_export_finance_date)+" exportiert ! "),title="Schon exportiert !"))
return action
def export_kd_csv_send(self):
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Senden ')
existing_user_var = self.env['dss.contracts_uservars'].search([('var_ID','=','BHEXMARK_1')])
Text = 'Export Kunden CSV es wurden folgende Kunden gefunden und übertragen : \n'
csv = '"DEBITORENKONTO";"Kunde_seit";"ZAHLUNGSART";"SKONTOTYP";"ANREDE";"akad.Grad";"TITEL1";"AP-VORNAME";"AP-NAME";"NAME";"Ergaenzung";"LAND";"STRASSE";"PLZ";"ORT";"TELEFON1";"FAX1";"Mobil1";"INTERNET";"EMAIL1";"TELEFON1_AP";"KUNDENNR";"BANKNAME_1";"BANKKONTO_1";"BLZ_1";"IBAN_1";"BIC_1";"FIBU-KONTENBEZEICHNUNG";"HAUSBANK";"FAELLIG_TG"'+'\n'
for contract_user_var in existing_user_var:
contract=contract_user_var.contract
if contract:
dataset=contract
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Einzelner Export ')
company_name_line_1, company_name_line_2 = self._split_text_for_csv(dataset.client_short_company)
csv += ('"'+str(dataset.contract_auto_id) + #DEBITORENKONTO
'";"' + str(dataset.contract_date.strftime('%d.%m.%Y')) + #Kunde_seit
'";"' + ('L' if dataset.web_contract_is_lastschrift else '') + #ZAHLUNGSART
'";"' + str("4") + #SKONTOTYP
'";"' + str("") + #ANREDE
'";"' + str("") + #akad.Grad
'";"' + str("") + #TITEL1
'";"' + str(dataset.client_short_vorname) + #AP-VORNAME
'";"' + str(dataset.client_short_name) + #AP-NAME
'";"' + str(company_name_line_1) + #NAME
'";"' + str(company_name_line_2) + #Ergaenzung
'";"' + str(dataset.client_short_land.name if dataset.client_short_land else 'DEUTSCHLAND') + #LAND
'";"' + str(dataset.client_short_strasse) + #STRASSE
'";"' + str(dataset.client_short_plz) + #PLZ
'";"' + str(dataset.client_short_ort) + #ORT
'";"' + str(dataset.client_short_telefon) + #TELEFON1
'";"' + str(dataset.runtime_m) + #FAX1
'";"' + str(dataset.client_short_mobil) + #Mobil1
'";"' + str(dataset.cutshortwerbe_feld_selected) + #INTERNET
'";"' + str(dataset.client_short_email) + #EMAIL1
'";"' + str(dataset.client_short_telefon) + #TELEFON1_AP
'";"' + str(dataset.contract_auto_id) + #KUNDENNR
'";"' + str(dataset.client_short_BANK_computed) + #BANKNAME_1
'";"' + str(dataset.client_short_KONTO_computed) + #BANKKONTO_1
'";"' + str(dataset.client_short_BLZ_computed) + #BLZ_1
'";"' + str(dataset.client_short_IBAN).upper() + #IBAN_1
'";"' + str(dataset.client_short_BIC).upper() + #BIC_1
'";"' + str((dataset.client_short_vorname)+' '+str(dataset.client_short_name)+' '+str(dataset.client_short_company))[:20] + #FIBU-KONTENBEZEICHNUNG
'";"' + str(dataset.web_contract_paysum_all).replace('.', ',') + #KREDITLIMIT
'";"' + str('2') + #HAUSBANK
'";"' + str('8') + #FAELLIG_TG
'"\n')
dataset.client_is_export_finance_date = datetime.now()
dataset.client_is_export_finance = True
Text += 'Kunde : '+str(dataset.contract_auto_name)+' - '+str(dataset.client_short_company)+'\n'
#contract.userdef_vars = [(5,0,0)]
_logger.info('Export Kunden CSV : C_'+str(self.id)+' - Senden - Uservar entfernt ')
contract_user_var.var_ID = 'BHEXMARK_1_SENT'
contract_user_var.var_value = str(datetime.now())
filename = 'KDEXPORT_' + str(datetime.now().strftime("%Y%m%d%H%M%S")) + '_' + str(uuid.uuid4())[:8] + '.csv'
attachment_id = self.env['ir.attachment'].create({ 'name': filename, 'datas': self._encode_csv_attachment(csv)})
attachment_id.allow_shared_download=True
attachment_id.folder_id=self.env['documents.folders'].search([('name','=','Kundenanlage')],limit=1).id
csvs = self.env['dss.csvs'].create({'csv_id': filename,'csv_name': filename, 'csv_filename': filename, 'csv_attachment_id': attachment_id.id, 'csv_mailtext': Text, 'csv_description': 'Export Kunden CSV am '+str(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))})
#trigger.SendMail(self,MailEmpfaenger,MailEmpfaengerCC,MailEmpfaengerBCC,MailTemplate,MailSender,has_attachments=False,attachmentlist=[],with_confirm=False,Dataset=None):
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
download_url = '/web/content/' + str(attachment_id.id) + '?download=true'
return {
"type": "ir.actions.act_url",
"url": str(base_url) + str(download_url),
"target": "new"
}
def create_cloud_structure_client(self, newClient):
_logger.info("Create Cloud Structure for Client "+str(newClient.id)+" - "+str(newClient.cloudlink))
cloudpath = str(newClient.cloudlink)
client = Client("https://cloud.logumedia.de/remote.php/dav/files/OdooDav/", auth=("odooClient@logumedia.de", "lm2020#OdooDav"))
_logger.info("Neuer Cloud Path : "+str(cloudpath))
try:
#client.mkdir(new_folder)
#_logger.info("Make Cloud Path : "+str(new_folder))
_logger.info("Create Standard Cloud Structure for Client "+str(newClient.id)+" - "+str(newClient.cloudlink))
client.copy(str(newClient.project_grundsystem_typ_cloud_contract_template)+'/',cloudpath)
_logger.info("Make Standard Cloud Path : "+str(cloudpath)+'/'+str(newClient.project_grundsystem_typ_cloud_contract_template))
except Exception as e:
_logger.info("Make Cloud Path error : "+str(e))
return True
def pyaction_create_cloud_structure_client(self):
projectcloudpath = self.project.cloudlink
if not projectcloudpath:
newpath = str(dss_settings.dssSettings.getprojectpath(self,self.project))+str(dss_settings.dssSettings.getClientpath(self,self))
else:
if projectcloudpath[0] != '$':
newpath = str(projectcloudpath)+str(dss_settings.dssSettings.getClientpath(self,self))
else:
newpath = str(dss_settings.dssSettings.getprojectpath(self,self.project))+str(dss_settings.dssSettings.getClientpath(self,self))
action = (self.env["confirmation.wizard"].confirm_message(_("Sind Sie sicher den Cloudordner auf Standard zurück zu setzen und anzulegen ? : Aktuell : "+self.cloudlink+" danach : "+str(newpath)),title="Bitte bestätigen",method="createcontract",records=self,callback_params={"template":self.id})
)
if action:
self.cloudlink=newpath
self.create_cloud_structure_client(self)
def createcontract(self,template):
newid = template
newClient = self.env['dss.contracts'].search([('id','=',newid)])
dsscontracts.create_cloud_structure_client(self,newClient)
_logger.info('Neu angelegt : '+str(self.id)+' - '+str(self.contract_name)+' - '+str(self.client_id))
action = self.env['ir.actions.act_window'].with_context({'default_projectid': self.id})._for_xml_id('DigitalSignage.action_open_create_contract_new_edit')
action['domain'] = '[["id","=","'+str(newid)+'"]]'
action['res_id'] = newid
return action
def py_jump_last_ad(self):
for record in self:
self.tokampagne()
def _track_template(self, changes):
res = super()._track_template(changes)
self.trigger_track_template(changes, self)
return res
def py_open_contract_form_view(self):
return {'name': 'Budget Edit',
'domain': [],
'res_model': 'dss.contracts',
'type': 'ir.actions.act_window',
'view_mode': 'form',
'view_type': 'form',
'res_id': self.id,
# 'target': 'new',
}
def pyaction_vnoxx_action1(self):
return ""
def pyaction_vnoxx_action2(self):
return ""
def pyaction_vnoxx_action3(self):
return ""
def pyaction_dss_contract_update_partner(self):
self.client.company_name = self.client_short_company
self.client.dsspartner_vorname = self.client_short_vorname
self.client.dsspartner_name = self.client_short_name
self.client.dsspartner = True,
self.client.dsspartner_werbung = True
self.client.street = self.client_short_strasse
self.client.city = self.client_short_ort
self.client.zip = self.client_short_plz
self.client.phone = self.client_short_telefon
self.client.mobile = self.client_short_mobil
self.client.email = self.client_short_email
self.client.rgemail = self.client_short_rgemail
self.client.leitwegid = self.client_short_leitwegid
self.client.dsspartner_Company_type = self.client_short_company_type
def pyaction_dss_contract_update_short_from_partner(self):
self.client_short_company=self.client.company_name
self.client_short_vorname=self.client.dsspartner_vorname
self.client_short_name=self.client.dsspartner_name
self.client_short_strasse=self.client.street
self.client_short_ort=self.client.city
self.client_short_plz=self.client.zip
self.client_short_telefon=self.client.phone
self.client_short_mobil=self.client.mobile
self.client_short_email=self.client.email
self.client_short_rgemail=self.client.rgemail
self.client_short_leitwegid=self.client.leitwegid
self.client_short_company_type=self.client.dsspartner_Company_type
@api.model
def buildText(self):
_logger.info('Build Text for Contract : C_'+str(self.id))
if self.project_id:
projekt_id = self.project_id
else:
projekt_id = '000'
if self.project_name:
projekt = self.project_name
else:
projekt = 'Unbekannt'
if self.contract_name:
vertrag_name = self.contract_name
else:
vertrag_name = 'Unbekannt'
if self.contract_auto_id:
vertrag_id = self.contract_auto_id
else:
vertrag_id = 'XXXXX'
if self.client_short_vorname:
vname = self.client_short_vorname
else:
vname = 'Unbekannt'
if self.client_short_name:
name = self.client_short_name
else:
name = 'Unbekannt'
if self.client_short_strasse:
vstrasse = self.client_short_strasse
else:
vstrasse = 'Unbekannt'
if self.client_short_plz:
vplz = self.client_short_plz
else:
vplz = '00000'
if self.client_short_ort:
vort = self.client_short_ort
else:
vort = 'unbekannt'
vplz_vort = '%s %s' % (vplz,vort)
if self.client_short_email:
vemail = 'ist per Email über %s zu erreichen' % (self.client_short_email)
else:
vemail = 'ist nicht per Email zu erreichbar'
if self.client_short_telefon:
vtelefon = 'ist per Telefon unter %s zu erreichen' % (self.client_short_telefon)
else:
vtelefon = 'ist nicht per Telefon zu erreichen'
if self.client_short_mobil:
vmobil = 'ist per Mobiltelefon unter %s zu erreichen' % (self.client_short_mobil)
else:
vmobil = 'ist nicht per Mobiltelefon zu erreichen'
textprojekt= 'Es ist im Projekt %s_%s ' % (projekt_id,projekt)
vertragkopftext = 'ein Vertrag mit der Kundennummer %s und der Vertragskennung %s.' % (vertrag_id,vertrag_name)
kundentext = 'Dieser Kunde heisst %s %s und wohnt in der %s in %s. Der Kunde %s und %s und %s' % (vname,name,vstrasse,vplz_vort,vemail,vtelefon,vmobil)
if self.client_short_mobil:
vmobil = 'ist per Mobiltelefon unter %s zu erreichen' % (self.client_short_mobil)
else:
vmobil = 'ist nicht per Mobiltelefon zu erreichen'
if self.start_date:
startzeit = self.start_date.strftime('%d.%m.%Y')
else:
startzeit = 'unbekannt'
if self.contract_date:
startzeit = self.contract_date.strftime('%d.%m.%Y')
if self.runtime_finish:
if self.runtime_finish < date.today():
endzeit = 'Er ist bereits abgelaufen am %s' % (self.runtime_finish.strftime('%d.%m.%Y'))
else:
endzeit = 'Er endet am %s' % (self.runtime_finish.strftime('%d.%m.%Y'))
else:
endzeit = 'unbekannt'
laufzeitmodel = 'Laufzeitmodell unbekannt'
if self.runtimesystem == 'M':
laufzeitmodel = 'eine monatliche Laufzeit mit %s Monaten und %s Monaten Bonus' % (self.runtime_m,self.runtime_bonus_m)
elif self.runtimesystem == 'T':
laufzeitmodel = 'eine tägliche Laufzeit mit %s Tagen ' % (self.runtime_t)
elif self.runtimesystem == 'E':
laufzeitmodel = 'eine ereignisabhängige Laufzeit mit %s Ereignissen' % (len(self.runtime_events))
elif self.runtimesystem == 'S':
if self.runtime_finish:
laufzeitmodel = 'ein stichtagsabhängig Laufzeit bis zum %s' % (self.runtime_finish.strftime('%d.%m.%Y'))
else:
laufzeitmodel = 'ein stichtagsabhängig Laufzeit unbekannt'
kuendigungsfrist = 'Die Kündigungsfrist beträgt %s Monate' % (self.contract_cancel_mon)
if self.contract_cancel_date:
kuendigungsfrist = 'Die Kündigungsfrist beträgt %s Monate und endet am %s' % (self.contract_cancel_mon,self.contract_cancel_date.strftime('%d.%m.%Y'))
if self.contract_cancel_date < date.today():
kuendigungsfrist = 'Die Kündigungsfrist beträgt %s Monate und endet am %s' % (self.contract_cancel_mon,self.contract_cancel_date.strftime('%d.%m.%Y'))
vertragtext = 'Der Vertrag hat die Vertragskennung %s und ist am %s begonnen. Der Vertrag hat %s . %s. %s' % (vertrag_id,startzeit,laufzeitmodel,endzeit,kuendigungsfrist)
text = textprojekt + " "+vertragkopftext + kundentext + '. '+ vertragtext
return text
raise ValidationError((text))
_logger.info('Build Text for Contract : C_'+str(self.id)+' - '+str(text))
return text
def buildallText(self):
_logger.info('Build all Text for Contract : C_'+str(self))
if self and "all" in str(self[0]):
self = self.env['dss.contracts'].search([])
if not self:
raise ValidationError(_("The first record contains 'all' in its string representation."))
all_contract_text = ''
contracts = []
for record in self:
_logger.info('Build Text for Contract : C_'+str(record.id))
singletext = ' Ein Vertrag mit der ID '+str(record.id)+': '+record.buildText()
contracts += [singletext]
_logger.info('Build Text for Contract : C_'+str(record.id)+' - '+str(singletext))
all_contract_text += singletext
#raise ValidationError((all_contract_text))
return contracts
def lm_contract_tool_execute(self):
return self.buildText()
def pyopen_dss_contract_add_media_form_view(self):
_logger.info('Open Add Media Form')
view = self.env.ref("DigitalSignage.dss_media_add_form")
self._compute_prov()
media = self.env['dss.mediarelations'].create({'contract':self.id,'project':self.project.id,'field_uuid':self.werbe_feld_selected[0].uuid,'ad':self.ads_last_ad.id})
_logger.info('Open Add Media Form '+str(view)+' M_'+str(media))
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.mediarelations' ,
'target': 'new' ,
'display_name' : 'Neu Media einfügen',
'views':[(view.id,'form')],
'res_id':media.id,
}
def pyopen_dss_contract_add_binary_form_view(self):
_logger.info('Open Add Binary Form')
view = self.env.ref("DigitalSignage.dss_binaries_view_form_wizard")
_logger.info('Open Wizzard Binary Form '+str(view))
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.binaries.wizard.new' ,
'target': 'new' ,
'views':[(view.id,'form')],
'context': {'default_binary_contract':self.id},
}
def pyopen_dss_contract_add_binary_form_view_from_wizzard(self,media):
_logger.info('Open Add Binary Form')
view = self.env.ref("DigitalSignage.dss_binaries_view_form")
self._compute_prov()
binary = self.env['dss.binaries'].create({'binary_contract':self.id,'binary_name':self.contract_name,'binary_mediatype':media.id,'binary_id':str(media.filepartname+'_'+self.contract_auto_id),'binary_binary':media.standard_image})
self.contract_binaries = [(4, binary.id)]
_logger.info('Open Add Binary Form '+str(view)+' B_'+str(binary))
return {
'type': 'ir.actions.act_window',
'view_mode': 'form' ,
'view_type': 'form' ,
'view_id': view.id,
'res_model': 'dss.binaries' ,
'target': 'new' ,
'views':[(view.id,'form')],
'res_id':binary.id,
}
@api.model
def newwizzard(self,id):
project = self.env['dss.projects'].search([('id', '=', id)], limit=1)
_logger.info("Create new Contract Wizard - Project : "+str(project))
action = self.env["ir.actions.actions"]._for_xml_id("DigitalSignage.action_open_create_contract")
action['context'] = {'default_project': project.id}
return action
def get_attachments_by_mediatype(self, mediatype):
_logger.info('Get Attachments for Contract : C_'+str(self.id)+' - Mediatype : '+str(mediatype))
attachment = self.env['dss.binaries'].search([('binary_contract', '=', self.id), ('binary_mediatype', '=', mediatype.id)])
if not attachment:
_logger.info('No Attachments found for Contract : C_'+str(self.id)+' - Mediatype : '+str(mediatype))
return ""
else:
return attachment
def get_attachments_by_mediatype_id(self, mediatypeid):
_logger.info('Get Attachments for Contract : C_'+str(self.id)+' - Mediatype : '+str(mediatypeid))
attachment = self.env['dss.binaries'].search([('binary_contract', '=', self.id), ('binary_mediatype', '=', mediatypeid)])
if not attachment:
_logger.info('No Attachments found for Contract : C_'+str(self.id)+' - Mediatype : '+str(mediatypeid))
return ""
else:
return attachment
@api.model
def pyaction_create_stamps(self):
_logger.info('Create Stamps for Contract : C_'+str(self.id))
# Bildparameter definieren
for feld in self.werbe_feld_selected:
_logger.info('Create Stamps for Contract : C_'+str(self.id)+' - Feld : F_'+str(feld.id)+' - '+str(feld.feldname))
# Bildgröße und Hintergrundfarbe festlegen
background_color = (255, 255, 255) # Weißer Hintergrund (RGB)
# Neues Bild erstellen
image = Image.new("RGB", (feld.btn_pos_w, feld.btn_pos_h), background_color)
d = ImageDraw.Draw(image)
Zeilen = feld.btn_pos_h // 6
zposy = 2
if self.client:
text = self.contact_company_name
if len(text) > 35:
# Trenne den Text an einem Leerzeichen nahe bei Position 40
idx = text.rfind(' ', 0, 35)
if idx == -1:
idx = 35
text2 = text[:idx]
bcount = len(text2) if text2 else 1
fonts = feld.btn_pos_w // (bcount ) *1.8
if fonts > feld.btn_pos_h:
fonts = feld.btn_pos_h - 10
if fonts <=0 :
fonts = 10
# font = ImageFont.truetype("addons/web/static/fonts/sign/Zeyada-Regular.ttf", fonts)
font = ImageFont.truetype("addons/web/static/fonts/google/Open_Sans/Open_Sans-SemiBold.ttf", fonts)
d.text((feld.btn_pos_w // 2, 1*Zeilen), text2, fill="black",align="center", anchor="ms", font=font) # Beispiel: Ein Rechteck
text1 = text[idx:]
zposy = 2
if len(text1) > 35:
# Trenne den Text an einem Leerzeichen nahe bei Position 40
idx = text1.rfind(' ', 0, 35)
if idx == -1:
idx = 35
text2 = text1[:idx]
# font = ImageFont.truetype("addons/web/static/fonts/sign/Zeyada-Regular.ttf", fonts)
font = ImageFont.truetype("addons/web/static/fonts/google/Open_Sans/Open_Sans-SemiBold.ttf", fonts)
d.text((feld.btn_pos_w // 2, zposy*Zeilen), text2, fill="black",align="center", anchor="ms", font=font) # Beispiel: Ein Rechteck
text = text1[idx:]
zposy = 3
else:
bcount = len(text) if text else 1
fonts = feld.btn_pos_w // (bcount ) *1.8
if fonts > feld.btn_pos_h:
fonts = feld.btn_pos_h - 10
if fonts <=0 :
fonts = 10
# font = ImageFont.truetype("addons/web/static/fonts/sign/Zeyada-Regular.ttf", fonts)
font = ImageFont.truetype("addons/web/static/fonts/google/Open_Sans/Open_Sans-SemiBold.ttf", fonts)
d.text((feld.btn_pos_w // 2, zposy*Zeilen), text, fill="black",align="center", anchor="ms", font=font) # Beispiel: Ein Rechteck
text = self.contact_street
bcount = len(text) if text else 1
Zeilen = feld.btn_pos_h // 6
fonts = feld.btn_pos_w // (bcount ) *1.2
if fonts > feld.btn_pos_h:
fonts = feld.btn_pos_h - 10
if fonts <=0 :
fonts = 10
# font = ImageFont.truetype("addons/web/static/fonts/sign/Zeyada-Regular.ttf", fonts)
font = ImageFont.truetype("addons/web/static/fonts/google/Open_Sans/Open_Sans-Regular.ttf", fonts)
d.text((feld.btn_pos_w // 2, 4*Zeilen), text, fill="black",align="center", anchor="ms", font=font) # Beispiel: Ein Rechteck
text = self.contact_zip+' '+self.contact_city
bcount = len(text) if text else 1
Zeilen = feld.btn_pos_h // 6
fonts = feld.btn_pos_w // (bcount ) *1.2
if fonts > feld.btn_pos_h:
fonts = feld.btn_pos_h - 10
if fonts <=0 :
fonts = 10
# font = ImageFont.truetype("addons/web/static/fonts/sign/Zeyada-Regular.ttf", fonts)
font = ImageFont.truetype("addons/web/static/fonts/google/Open_Sans/Open_Sans-Regular.ttf", fonts)
d.text((feld.btn_pos_w // 2, 5*Zeilen), text, fill="black",align="center", anchor="ms", font=font) # Beispiel: Ein Rechteck
# Bild speichern
image.save(self.contract_auto_id+"_"+feld.feldname+".png")