1993 lines
109 KiB
Python
Executable File
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")
|
|
|