DigitalSignage/models/dss_web_contracts.py

317 lines
18 KiB
Python
Executable File

# -*- coding: utf-8 -*
# Test
# Test2
import ast
import datetime
import json
import re
import uuid
import logging
import base64
import subprocess
import tempfile
import easywebdav
import os
import os.path
from odoo import api, fields, models, _
from odoo import tools
from . import dss_settings
from . import dss_ads
from odoo.exceptions import ValidationError
from datetime import date
from datetime import datetime
from babel.dates import format_date
from dateutil.relativedelta import relativedelta
from pyffmpeg import FFmpeg
from tuya_iot import TuyaOpenAPI, TUYA_LOGGER
from tuya_connector import TuyaOpenAPI, TUYA_LOGGER
import sys
TUYA_LOGGER.setLevel(logging.DEBUG)
_logger = logging.getLogger(__name__)
class dsscontracts(models.Model):
_name = "dss.web_contracts"
_description = "DigitalSignage Web_Vertraege"
_rec_name = "contract_auto_name"
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
cruuid = fields.Char(related='uuid')
contract_id = fields.Char("Kundennummer",store=True,tracking=True)
contract_auto_id = fields.Char("Kundennummer automatisch",tracking=True,help="Wird berechnet aus Projektnummer + Kunden ID")
contract_name = fields.Char('Kurzbezeichnung', required=True,tracking=True)
contract_auto_name = fields.Char('Vertragskennung',tracking=True,help="Wird berechnet aus Kundennummer + Vertragskennung")
contract_writer = fields.Many2one('res.partner', domain="['&',('dsspartner','=',True),('dsspartner_vertrieb','=',True)]", tracking=True)
contract_writer_formular = fields.Char('Vertragsschreiber Formular', tracking=True)
contract_type = fields.Selection([('TV','TV'),('Web','Web')], 'Vertragstyp', tracking=True)
remark = fields.Char('Bemerkungen',tracking=True)
vertragssumme = fields.Float('Vertragssumme :', tracking=True)
contract_remark = fields.Html('Vertragshinweise',tracking=True)
project = fields.Many2one('dss.projects' , string='Project', store=True,tracking=True)
project_id = fields.Integer(related='project.projectid', string='Project ID')
projectIid = fields.Integer('Project IID',tracking=True)
client_id = fields.Char(string="KundenID (2Stellen)",help="Nur der 2 stellige letzte Teil der Kundennummer",tracking=True)
client_short_company = fields.Char('Firmenname 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_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 = 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_other_projects = fields.Many2many('dss.projects',string='Weitere Projekte',tracking=True)
werbe_feld = fields.Char(string='Werbefelde(r)',tracking=True)
werbe_feld_selected = fields.Many2many('dss.advertisefields',string='Werbefelder',tracking=True)
werbe_feld_tv = fields.Selection([('L-Banner','L-Banner'),('Countdown','Countdown')], 'Paket', tracking=True)
werbe_feld_web = fields.Selection([('Standard','Standard'),('Premium','Premium')], 'Paket', tracking=True)
zahlweise = fields.Selection([('einmalig','einmalig'),('jaehrlich','jährlich'),('sonder','Sonderzahlweise')], 'Zahlweise', tracking=True)
paymentinterval = fields.Many2one('dss.payintervals',string='Abrechnungsinterval',tracking=True)
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)
contract_cancel_date = fields.Date('Kündigungsfrist Datum', tracking=True)
contract_cancel_mon = fields.Integer('Kündigungsfrist Monaten',tracking=True)
contract_auto_extend = fields.Boolean('autom. V.Verlängerung',tracking=True)
contract_auto_extend_time = fields.Char('Verl. Monate',tracking=True)
runtimesystem = fields.Selection([('J','Jahreslaufzeit'),('M','Monatslaufzeit'),('T','Tagelaufzeit'), ('E','Eventlaufzeit'), ('S','Sonderlaufzeit')],'Laufzeit',tracking=True)
runtime_j = fields.Integer('Laufzeit Jahre',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 Spezial',tracking=True)
runtime_finish = fields.Date('LaufzeitEnde',tracking=True)
runtime_calendar_event = fields.Integer('Kalendereintrag ID',tracking=True)
date_start_planed = fields.Date(string='geplantes Startdatum', tracking=True)
date_remove_planed = fields.Date(string='geplantes Enddatum', tracking=True)
tv_reach_PLZ = fields.Char('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_count_perYear_related_re = fields.Selection(related='dss.contracts.ads_count_perYear',tracking=True)
ads_topic = fields.Selection([('auto','Auto'),('beauty','Beauty & Fashion'),('wirtschaft','Wirtschaft, Finanzen & News'),('food','Food'),('gesundheit','Gesundheit'),('lifestyle','Lifestyle'),('living','Living'),('entertainment','Entertainment'),('reise','Reise'),('technik','Technik'),('individuell','Individuell')],'Themen', tracking=True)
ads_topics = fields.Many2many('dss.contracts_ads_topics', string='Themenliste', tracking=True)
grafik_zuarbeitBis = fields.Date("Zuarbeit bis", tracking=True)
grafikerstellung = fields.Boolean("Grafikerstellung Logumedia", tracking=True)
boarding = fields.Boolean("Boarding", tracking=True)
scan_vertrag = fields.Binary('Datei')
file_name = fields.Char(string='Dateiname')
erfasst_in_odoo = fields.Boolean('In Odoo erfasst')
erfasst_in_agenda = fields.Boolean('In Agenda erfasst')
rechnungsanfrage_RTL = fields.Boolean('Bei RTL angekündigt')
# def action_send_email(self):
# """ Sendet eine E-Mail mit den Inhalten des Objekts """
# template = self.env.ref('dss.email_template_my_model')
# if template:
# template.send_mail(self.id, force_send=True)
def pydonewpartner1(self):
_logger.info("create new partner...")
def pydonewpartner(self):
_logger.info("create new partner...")
fullname = str(self.client_short_vorname) + ' ' +str(self.client_short_name)
newcontact = self.env['res.partner'].create({'name': fullname,
'dsspartner_vorname': self.client_short_vorname,
'dsspartner_name': self.client_short_name,
'email': self.client_short_email,
'phone': self.client_short_telefon,
'mobile': self.client_short_mobil,
'street': self.client_short_strasse,
'city': self.client_short_ort,
'zip': self.client_short_plz,
'country_id': self.env['res.country'].search([('code', '=', 'DE')], limit=1).id,
'company_type': 'person', # 'company' oder 'person',
'website': self.client_short_website,
'company_name': self.client_short_company,
'dsspartner': True,
'dsspartner_werbung': True
})
self.client = newcontact.id
def pydonewcontract(self):
_logger.info("create new contract...")
newcontract = self.env['dss.contracts'].create({'project_id': self.project_id,
'project': self.project.id,
'client_id': self.client_id,
'contract_auto_name': self.contract_auto_name,
'contract_auto_id': self.contract_auto_id,
'contract_name': self.contract_name,
'contract_state': self.env['dss.contractstate'].search([("statusname","=","Angelegt")]).id,
'paymentinterval': self.paymentinterval.id,
'werbe_feld_selected': self.werbe_feld_selected,
'client': self.client.id,
'client_short_vorname': self.client_short_vorname,
'client_short_name': self.client_short_name,
'client_short_email': self.client_short_email,
'client_short_telefon': self.client_short_telefon,
'client_short_mobil': self.client_short_mobil,
'client_short_strasse': self.client_short_strasse,
'client_short_ort': self.client_short_ort,
'client_short_plz': self.client_short_plz,
'client_short_website': self.client_short_website,
'client_short_company': self.client_short_company,
'ads_count_perYear2': self.ads_count_perYear2,
'runtimesystem': self.runtimesystem,
'runtime_m': self.runtime_m,
'runtime_t': self.runtime_t,
'contract_auto_extend': self.contract_auto_extend,
'contract_cancel_date': self.contract_cancel_date,
'runtime_events': self.runtime_events,
'tv_reach_PLZ': self.tv_reach_PLZ,
'ads_radius_PLZ': self.ads_radius_PLZ,
'ads_topics': self.ads_topics,
'web_contract':self.id,
'contract_auto_extend': self.contract_auto_extend,
'contract_date': self.contract_date,
'work_state_info': self.remark,
'scan_vertrag': self.scan_vertrag
})
_logger.info("create new Werbekampagne...")
newWK = self.env['dss.ads'].create({'contract': newcontract.id,
'project': newcontract.project.id,
'adname': 'WK '+self.contract_auto_name,
'adtype': 'MAIN',
'date_start_planed': self.date_start_planed,
'date_remove_planed': self.date_remove_planed,
#'work_state_info': 'ZA bis: '+str(self.grafik_zuarbeitBis)+' / '+self.remark
'work_state_info': 'ZA bis: '+format_date(self.grafik_zuarbeitBis,format='dd.MM.yy',locale='de_DE')
})
self.erfasst_in_odoo = True
def pysendemail_rtl(self):
"""Sendet eine E-Mail über das Template"""
myAction = self.env['dss.triggeractions.groups'].search([('id','=',self.env['dss.settings'].search([], limit=1).tv_vertragsankuendigung_actionID)], limit=1) #Id der TriggerAktion
myAction.action_test_id = self.id #Id des Datensatzes für den die Mail ist
myAction.exectriggeraction_group()
"""
template = self.env['mail.template'].search([('id','=',44)], limit=1)
if template:
template.send_mail(self.id, force_send=True)
self.rechnungsanfrage_RTL = True
email_body = template._render_field('body_html', [self.id])[self.id] # HTML-Body rendern
email_subject = template._render_field('subject', [self.id])[self.id] # Betreff rendern
email_to = template._render_field('email_to', [self.id])[self.id] # Empfänger rendern
self.message_post(body=f"<b>Betreff:</b> {email_subject}<br/><b>Empfänger:</b> {email_to}<br/><br/>{email_body}",subject="E-Mail gesendet",message_type='comment',subtype_xmlid="mail.mt_comment")
"""
@api.model
def _default_uuid(self):
return str(uuid.uuid4())
#Vertragskennungen bei onChange anpassen
@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):
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('project')
# def _onchange_project(self):
# self.project_id = self.project.project_id
@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
@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
class dsscontractsadstopics(models.Model):
_name = 'dss.contracts_ads_topics'
_description = "DigitalSignage Werbung ATV Themen"
_rec_name = "anzeigename"
_inherit = ['mail.thread','mail.activity.mixin','dss.triggermodel']
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
thema = fields.Char(string="Name")
anzeigename = fields.Char(string='Anzeigename')