August 2025 Build

This commit is contained in:
jopster 2025-08-04 08:35:55 +02:00
parent a2e4beba27
commit 4e32d9ba82
17 changed files with 277 additions and 25 deletions

BIN
models/__pycache__/dss_advertisefields.cpython-311.pyc Executable file → Normal file

Binary file not shown.

BIN
models/__pycache__/dss_eventdays.cpython-311.pyc Executable file → Normal file

Binary file not shown.

BIN
models/__pycache__/dss_m2mmail.cpython-311.pyc Executable file → Normal file

Binary file not shown.

BIN
models/__pycache__/dss_maintains.cpython-311.pyc Executable file → Normal file

Binary file not shown.

View File

@ -124,6 +124,7 @@ class dssadvertisefields(models.Model):
btn_text_2_font = fields.Char('Textzeile 2 Schriftart', tracking=True)
btn_text_3_font = fields.Char('Textzeile 3 Schriftart', tracking=True)
btn_text_4_font = fields.Char('Textzeile 4 Schriftart', tracking=True)
Field_notinCloud = fields.Boolean('Feld im Cloudname',tracking=True, default=True)
loopfiles = fields.Char('Durchlaufdateien', tracking=True)

View File

@ -42,6 +42,7 @@ class dsseventdays(models.Model):
color = fields.Char(string='Color Index')
username = fields.Many2one('res.users',string="Kalendercontact")
calendarevent = fields.Integer('Kalenderevent ID')
category = fields.Char('Kategorie', required=True)
@api.model
def _default_uuid(self):

View File

@ -65,7 +65,7 @@ class dssm2mvalues(models.Model):
self.project = False
for record in self:
if record.project_id:
project = self.env['dss.projects'].search([('projectid', '=', int(record.project_id))])
project = self.env['dss.projects'].search([('projectid', '=', int(record.project_id))],limit=1)
if project:
record.project = project

View File

@ -41,15 +41,160 @@ class dssmaintaintasks(models.Model):
user_create = fields.Char('Erstellungsuser', default=lambda self: self._default_create_user())
user_lastedit = fields.Char('Änderungsuser')
maintaintyp = fields.Selection([('AUF','Aufbau/Installation'),('REP','Reparatur'), ('CLE','Reinigung'), ('INS','Inspektion'), ('ABB','Demontage'), ('SON','Sonstiges')],tracking=True)
maintaintyp = fields.Selection([('AUF','Aufbau/Installation'),('REP','Reparatur'), ('CLE','Reinigung'), ('INS','Inspektion'), ('ABB','Demontage'), ('REN','Erneuerung'),('SON','Sonstiges')],tracking=True)
project = fields.Many2one('dss.projects', required=True, tracking=True)
maintain_tag = fields.Date('Einsatztag', required=True, tracking=True)
maintain_time_h = fields.Integer('Einsatzzeit Volle Stunden', required=True, tracking=True)
maintain_time_m = fields.Integer('Einsatzzeit Rest Minuten', required=True, tracking=True)
maintain_tag = fields.Date('Einsatztag', tracking=True)
maintain_time_h = fields.Integer('Einsatzzeit Volle Stunden', tracking=True)
maintain_time_m = fields.Integer('Einsatzzeit Rest Minuten', tracking=True)
# maintain_people = fields.Many2many('res.partner','Einsatzbeteiligte', domain="['&',('dssinternpartner','=',True),('dssinternpartner_grafik','=',True)]", tracking=True,required=True)
maintain_reason = fields.Char('Einsatzgrund', required=True)
maintain_text = fields.Html('Einsatzablauf', required=True)
maintain_travel_start = fields.Datetime('Anreisebeginn', tracking=True)
maintain_travel_end = fields.Datetime('Ankunftszeit', tracking=True)
maintain_travel_distance = fields.Float('Anreise Entfernung', tracking=True)
maintain_travel_duration = fields.Float('Anreise Dauer', tracking=True, compute='_compute_travel_total_time', store=True)
maintain_travel_duration_text = fields.Char('Anreise Dauer', tracking=True, compute='_compute_travel_total_time_text', store=True)
maintain_work_start = fields.Datetime('Arbeitsbeginn', tracking=True)
maintain_work_end = fields.Datetime('Arbeitsende', tracking=True)
maintain_work_duration = fields.Float('Arbeits Dauer', tracking=True,compute='_compute_work_total_time', store=True)
maintain_work_duration_text = fields.Char('Arbeits Dauer', tracking=True, compute='_compute_work_total_time_text', store=True)
maintain_return_start = fields.Datetime('Rückreisebeginn', tracking=True)
maintain_return_end = fields.Datetime('Rückreiseende', tracking=True)
maintain_return_duration = fields.Float('Rückreise Dauer', tracking=True,compute='_compute_return_total_time', store=True)
maintain_return_distance = fields.Float('Rückreise Entfernung', tracking=True)
maintain_return_duration_text = fields.Char('Rückreise Dauer', tracking=True, compute='_compute_return_total_time_text', store=True)
maintain_total_start = fields.Datetime('Einsatzbeginn', tracking=True,compute='_compute_maintain_total_start', store=True)
maintain_total_end = fields.Datetime('Einsatzende', tracking=True, compute='_compute_maintain_total_end', store=True)
maintain_total_duration = fields.Float('Einsatz Dauer', tracking=True,compute='_compute_maintain_total_time', store=True)
maintain_total_duration_text = fields.Char('Einsatz Dauer', tracking=True, compute='_compute_maintain_total_time_text', store=True)
maintain_total_duration_money = fields.Float('Einsatz Kosten', tracking=True, compute='_compute_maintain_total_cost', store=True)
maintain_is_calculate = fields.Boolean('Einsatz ist Abrechenbar', default=False, tracking=True)
maintain_employee =fields.Many2many('hr.employee', string='Einsatzmitarbeiter', tracking=True, required=True)
@api.depends('maintain_employee')
@api.onchange('maintain_employee')
def _compute_maintain_total_cost(self):
for record in self:
total_cost = 0.0
if record.maintain_employee:
for employee in record.maintain_employee:
if employee.hourly_cost:
# Calculate the total cost for each employee based on their hourly cost and the total duration of the maintenance task
total_cost += employee.hourly_cost * record.maintain_total_duration
record.maintain_total_duration_money = total_cost
@api.depends('maintain_travel_duration')
@api.onchange('maintain_travel_duration')
def _compute_travel_total_time_text(self):
for record in self:
if record.maintain_travel_duration:
hours = int(record.maintain_travel_duration)
minutes = int((record.maintain_travel_duration - hours) * 60)
record.maintain_travel_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_travel_duration_text = "0 Stunden 0 Minuten"
@api.depends('maintain_work_duration')
@api.onchange('maintain_work_duration')
def _compute_work_total_time_text(self):
for record in self:
if record.maintain_work_duration:
hours = int(record.maintain_work_duration)
minutes = int((record.maintain_work_duration - hours) * 60)
record.maintain_work_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_work_duration_text = "0 Stunden 0 Minuten"
@api.depends('maintain_return_duration')
@api.onchange('maintain_return_duration')
def _compute_return_total_time_text(self):
for record in self:
if record.maintain_return_duration:
hours = int(record.maintain_return_duration)
minutes = int((record.maintain_return_duration - hours) * 60)
record.maintain_return_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_return_duration_text = "0 Stunden 0 Minuten"
@api.depends('maintain_total_duration')
@api.onchange('maintain_total_duration')
def _compute_maintain_total_time_text(self):
for record in self:
if record.maintain_total_duration:
hours = int(record.maintain_total_duration)
minutes = int((record.maintain_total_duration - hours) * 60)
record.maintain_total_duration_text = f"{hours} Stunden {minutes} Minuten"
else:
record.maintain_total_duration_text = "0 Stunden 0 Minuten"
@api.constrains('maintain_travel_start', 'maintain_travel_end')
@api.onchange('maintain_travel_start', 'maintain_travel_end')
def _compute_travel_total_time(self):
for record in self:
if record.maintain_travel_start and record.maintain_travel_end:
if record.maintain_travel_start >= record.maintain_travel_end:
raise ValidationError(_("Anreisebeginn muss vor Ankunftszeit liegen."))
record.maintain_travel_duration = (record.maintain_travel_end - record.maintain_travel_start).total_seconds() / 3600.0
@api.constrains('maintain_work_start', 'maintain_work_end')
@api.onchange('maintain_work_start', 'maintain_work_end')
def _compute_work_total_time(self):
for record in self:
if record.maintain_work_start and record.maintain_work_end:
if record.maintain_work_start >= record.maintain_work_end:
raise ValidationError(_("Arbeitsbeginn muss vor Arbeitsende liegen."))
record.maintain_work_duration = (record.maintain_work_end - record.maintain_work_start).total_seconds() / 3600.0
@api.constrains('maintain_return_start', 'maintain_return_end')
@api.onchange('maintain_return_start', 'maintain_return_end')
def _compute_return_total_time(self):
for record in self:
if record.maintain_return_start and record.maintain_return_end:
if record.maintain_return_start >= record.maintain_return_end:
raise ValidationError(_("Rückreisebeginn muss vor Rückreiseende liegen."))
record.maintain_return_duration = (record.maintain_return_end - record.maintain_return_start).total_seconds() / 3600.0
@api.depends('maintain_travel_start', 'maintain_work_start', 'maintain_return_start')
def _compute_maintain_total_start(self):
for record in self:
if record.maintain_travel_start and record.maintain_work_start and record.maintain_return_start:
# Find the earliest start time among travel, work, and return
earliest_start = min(record.maintain_travel_start, record.maintain_work_start, record.maintain_return_start)
record.maintain_total_start = earliest_start
else:
record.maintain_total_start = False
@api.depends('maintain_travel_end', 'maintain_work_end', 'maintain_return_end')
def _compute_maintain_total_end(self):
for record in self:
if record.maintain_travel_end and record.maintain_work_end and record.maintain_return_end:
# Find the latest end time among travel, work, and return
latest_end = max(record.maintain_travel_end, record.maintain_work_end, record.maintain_return_end)
record.maintain_total_end = latest_end
else:
record.maintain_total_end = False
@api.depends('maintain_travel_duration', 'maintain_work_duration', 'maintain_return_duration')
@api.onchange('maintain_travel_duration', 'maintain_work_duration', 'maintain_return_duration')
def _compute_maintain_total_time(self):
for record in self:
total_duration = 0.0
if record.maintain_travel_duration:
total_duration += record.maintain_travel_duration
if record.maintain_work_duration:
total_duration += record.maintain_work_duration
if record.maintain_return_duration:
total_duration += record.maintain_return_duration
record.maintain_total_duration = total_duration
@api.model
def _default_uuid(self):
return str(uuid.uuid4())

View File

@ -58,6 +58,8 @@ class dssprojects(models.Model):
aktstatus_color = fields.Char(related='aktstatus.color')
aktstatus_icon = fields.Image(related='aktstatus.icon')
description = fields.Text('Beschreibung',tracking=True)
remarks = fields.Html('Bemerkungen',tracking=True)
hotremarks = fields.Html('Wichtige Bemerkungen',tracking=True)
short_partner_description = fields.Char('Kurz-Beschreibung für Kunden',tracking=True)
partner_description = fields.Text('Beschreibung für Kunden',tracking=True)
systemname = fields.Many2one('dss.systems',tracking=True)
@ -157,6 +159,8 @@ class dssprojects(models.Model):
simstart_DVEmpty_3 = fields.Boolean('Simkarte 3 DV leer', tracking=True)
simstart_DVEmpty_3_lastdate = fields.Date('Simkarte 3 Leerdatum', tracking=True)
playsetup_user = fields.Many2one('res.users',domain="[('user_type','=','1')]",string='Einspielung - Benutzer',tracking=True)
@api.model
def _read_group_system_ids(self, stages, domain, order):
project_system_ids = self.env['dss.systemtypen'].search([('open_close_standard_state','=',False)], order='order')

View File

@ -76,7 +76,13 @@ class dssSettings(models.Model):
for parts in path.split(','):
if parts[0] == '$':
fels = parts[1:]
parts = record._origin.read([fels])
if fels == 'shortwerbe_feld_selected':
if not record.werbe_feld_selected.Field_notinCloud:
parts = ''
else:
parts = record._origin.read([fels])
else:
parts = record._origin.read([fels])
_logger.info("Get Path - Anfrage-Teil gefunden : " + str(parts))
if parts:
value = str(parts[0][fels])

View File

@ -26,20 +26,21 @@
<sheet>
<group>
<group name="basethings">
<field name="feldname" string="Feldname"/>
<field name="project" string="Projekt"/>
<field name="auto_feldname" string="Projekt_Feld" readonly="1"/>
<field name="contract" string="Vertrag">
<field name="feldname" string="Feldname"/>
<field name="project" string="Projekt"/>
<field name="auto_feldname" string="Projekt_Feld" readonly="1"/>
<field name="contract" string="Vertrag">
<tree string="Verträge">
<field name="contract_auto_name"/>
<field name="contract_auto_id"/>
<field name="contract_name" />
</tree>
</field>
<div colspan="2" style="font-color:#E00000;"><p>Die Struktur kann erst nach Speichern der Grunddaten eingerichtet werden !</p></div>
<field name="mediastructure" attrs="{'invisible': [('issaved','!=',True)]}" />
<field name="isblocked" widget="boolean_toggle"/>
</field>
<div colspan="2" style="font-color:#E00000;"><p>Die Struktur kann erst nach Speichern der Grunddaten eingerichtet werden !</p></div>
<field name="mediastructure" attrs="{'invisible': [('issaved','!=',True)]}" />
<field name="isblocked" widget="boolean_toggle"/>
<field name="is_btn"/>
<field name="Field_notinCloud" widget="boolean_toggle"/>
</group>
</group>
<notebook>

View File

@ -10,6 +10,7 @@
<field name="eventname"/>
<field name="eventstartdate"/>
<field name="eventenddate"/>
<field name="category"/>
<field name="description"/>
<field name="color" widget="color"/>
</tree>
@ -32,6 +33,7 @@
<field name="description" string="Beschreibung"/>
<field name="color" widget="color"/>
<field name="username" string="Benutzer in dessen Kalender Event einzutragen ist"/>
<field name="category"/>
</group>
<notebook>
<page name="informations" string="Informationen">

View File

@ -15,17 +15,86 @@
<field name="maintaintyp"/>
<field name="project"/>
</group>
<group name="settings" string="Einsatzzeiten">
<field name="maintain_tag"/>
<field name="maintain_time_h" />
<field name="maintain_time_m" />
</group>
<group name="settings" string="Einsatzablauf">
<field name="maintain_reason"/>
<field name="maintain_text"/>
<field name="maintain_is_calculate" widget="boolean_toggle" options="{'terminology': 'Abrechenbar'}"/>
</group>
</group>
<notebook>
<page name="maintaintimes" string="Einsatzzeiten">
<div class="row">
<div class="col-md-6">
<group name="maintain_travel" string="Anreise">
<field name="maintain_travel_start"/>
</group>
</div>
<div class="col-md-6">
<group name="maintain_travel" string="Anreise">
<field name="maintain_travel_end"/>
</group>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label for="maintain_travel_distance" string="Fahr - Entfernung in km"/><field name="maintain_travel_distance"/>
</div>
<div class="col-md-6">
<label for="maintain_travel_duration_text" string="Fahrzeit gesamt in h"/><field name="maintain_travel_duration_text" readonly="1"/>
</div>
</div>
<div class="row">
<div class="col-md-6">
<group name="maintain_times" string="Einsatzzeiten">
<field name="maintain_work_start"/>
</group>
</div>
<div class="col-md-6">
<group name="maintain_times" string="Einsatzzeiten">
<field name="maintain_work_end"/>
</group>
</div>
</div>
<div class="row">
<div class="col-md-10">
<label for="maintain_work_duration_text" string="Gesamt Arbeitszeit in h"/><field name="maintain_work_duration_text" readonly="1"/>
</div>
</div>
<div class="row">
<div class="col-md-6">
<group name="maintain_return" string="Rückreise">
<field name="maintain_return_start"/>
</group>
</div>
<div class="col-md-6">
<group name="maintain_return" string="Rückreise">
<field name="maintain_return_end"/>
</group>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label for="maintain_return_distance" string="Rückfahr - Entfernung in km"/><field name="maintain_return_distance"/>
</div>
<div class="col-md-6">
<label for="maintain_return_duration_text" string="Gesamt Rückfahrzeit in h"/><field name="maintain_return_duration_text" readonly="1"/>
</div>
</div>
<group name="maintain_total" string="Gesamtzeiten">
<field name="maintain_total_start" readonly="1"/>
<field name="maintain_total_end" readonly="1"/>
<field name="maintain_total_duration_text" readonly="1"/>
</group>
</page>
<page name="employees" string="Mitarbeiter">
<group name="maintain_employee" string="Einsatzbeteiligte">
<field name="maintain_employee" widget="many2many_tags" options="{'no_create': True, 'no_create_edit': True}"/>
</group>
<group name="maintain_employee_other" string="Kosten">
<field name="maintain_total_duration_money"/>
</group>
</page>
<page name="informations" string="Informationen">
<group name="settings" string="interne Informationen">
<field name="uuid" string="UUID"/>
@ -53,7 +122,9 @@
<field name="maintainname"/>
<field name="maintaintyp"/>
<field name="project"/>
<field name="maintain_tag"/>
<field name="maintain_total_start"/>
<field name="maintain_total_duration" sum="Gesamtzeit"/>
<field name="maintain_total_duration_money" sum="Gesamtkosten"/>
</tree>
</field>
</record>

View File

@ -182,7 +182,10 @@
<field name="maintainname"/>
<field name="maintaintyp"/>
<field name="project"/>
<field name="maintain_tag"/>
<field name="maintain_total_start"/>
<field name="maintain_total_duration_text"/>
<field name="maintain_total_duration" sum="Gesamtzeit"/>
<field name="maintain_total_duration_money" sum="Gesamtkosten"/>
</tree>
</field>
</page>
@ -201,7 +204,7 @@
<field name="simstart_DVEmpty_3" widget="boolean_toggle"/>
<field name="simstart_DVEmpty_3_lastdate"/>
</group>
</page>
</page>
<page name="trigger" string="Aktionen/Trigger">
<group>
<field name="run_trigger" string="Trigger aktiv ?" widget="Boolean_toggle"/>
@ -210,6 +213,12 @@
<field name="run_uni_sub_trigger" string="Allgemeine Vertrags - Trigger ausführen ?" widget="Boolean_toggle"/>
</group>
</page>
<page name="Bemerkungen" string="Bemerkungen/Anweisungen/Notizen">
<group>
<field name="remarks"/>
<field name="hotremarks"/>
</group>
</page>
<page name="informations" string="Interne Informationen">
<group>
<field name="id" string="Iid" readonly="1"/>
@ -256,6 +265,7 @@
<field name="playername_2"/>
<field name="playername_3"/>
<field name="grundsystemicon_different"/>
<field name="hotremarks"/>
<templates>
<t t-name="kanban-box">
<t t-set="colonr" t-value="aktstatus_color"/>
@ -276,8 +286,8 @@
</div>
<div class="col-8" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<div class="row">
<div style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<span style="font-size:17px;"><field name="projektname" string="Project Name"/></span>
<div style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
<span style="font-size:17px;"><field name="projektname" string="Project Name"/></span>
</div>
</div>
<div class="row">

View File

@ -51,11 +51,22 @@
</field>
</record>
<record id="dss_triggerconditions_trigger_condition_view" model="ir.ui.view">
<field name="name">dss_triggerconditions_tree</field>
<field name="model">dss.triggerconditions</field>
<field name="priority" eval="16"/>
<field name="arch" type="xml">
<trigger_condition_view string="Trigger Aktionen">
<field name="triggerconditionname"/>
</tree>
</field>
</record>
<record id="action_dss_triggerconditions_view" model="ir.actions.act_window">
<field name="name">DigitalSignage TriggerBedingungen</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.triggerconditions</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">tree,form,trigger_condition_view</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="'o_view_nocontent_smiling_face">