[MERGE] forward port branch saas-11.2 up to 3376bad191
This commit is contained in:
@@ -1266,6 +1266,8 @@ class AccountInvoice(models.Model):
|
||||
values[name] = line[name]
|
||||
elif name == 'invoice_line_tax_ids':
|
||||
values[name] = [(6, 0, line[name].ids)]
|
||||
elif name == 'analytic_tag_ids':
|
||||
values[name] = [(6, 0, line[name].ids)]
|
||||
result.append((0, 0, values))
|
||||
return result
|
||||
|
||||
|
||||
@@ -326,7 +326,6 @@
|
||||
<td style="padding:25px 0px;">
|
||||
<strong>Add this event to your calendar</strong>
|
||||
<a href="https://www.google.com/calendar/render?action=TEMPLATE&text=${object.event_id.name}&dates=${date_begin}/${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Google</a>
|
||||
<a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&summary=${object.event_id.name}&dtstart=${date_begin}&dtend=${date_end}&location=${location}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Outlook</a>
|
||||
<a href="https://calendar.yahoo.com/?v=60&view=d&type=20&title=${object.event_id.name}&in_loc=${location}&st=${format_tz(object.event_id.date_begin, tz='UTC', format='%Y%m%dT%H%M%S')}&et=${format_tz(object.event_id.date_end, tz='UTC', format='%Y%m%dT%H%M%S')}" style="padding:3px 5px;border:1px solid #875A7B;color:#875A7B;text-decoration:none;border-radius:3px;" target="new"><img src="/web_editor/font_to_img/61525/rgb(135,90,123)/16" style="vertical-align:middle;" height="16"> Yahoo</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -459,6 +459,17 @@ class EventRegistration(models.Model):
|
||||
pass
|
||||
return recipients
|
||||
|
||||
@api.multi
|
||||
def message_get_default_recipients(self):
|
||||
# Prioritize registration email over partner_id, which may be shared when a single
|
||||
# partner booked multiple seats
|
||||
return {
|
||||
r.id: {'partner_ids': [],
|
||||
'email_to': r.email,
|
||||
'email_cc': False}
|
||||
for r in self
|
||||
}
|
||||
|
||||
def _message_post_after_hook(self, message, values, notif_layout, notif_values):
|
||||
if self.email and not self.partner_id:
|
||||
# we consider that posting a message with a specified recipient (not a follower, a specific one)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<t t-if="l.task_id"><span t-field="l.task_id.name"/></t>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<span t-esc="'%s:%02.0f' % tuple(int(round(x)) for x in divmod(l.unit_amount*60,60))"/>
|
||||
<span t-field="l.unit_amount" t-options="{'widget': 'float_time'}"/>
|
||||
</td>
|
||||
</tr>
|
||||
</t>
|
||||
@@ -53,7 +53,9 @@
|
||||
<td />
|
||||
<td t-if="show_task"/>
|
||||
<td class="text-right"><strong>Total</strong></td>
|
||||
<td class="text-right"><strong t-esc="'%s:%02.0f' % tuple(int(round(x)) for x in divmod(sum(docs.mapped('unit_amount'))*60,60))"/></td>
|
||||
<t t-set="total_value" t-value="sum(docs.mapped('unit_amount'))" />
|
||||
<t t-set="sign" t-value="'-' if total_value < 0 else ''"/>
|
||||
<td class="text-right"><strong t-esc="sign + '%s:%02.0f' % tuple(int(round(x)) for x in divmod(abs(total_value)*60,60))"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -1,185 +1,185 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<odoo>
|
||||
<!-- Account Tax Tags -->
|
||||
|
||||
<record id="tag_de_41" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 41</field>
|
||||
<field name="name">Ust-VA KZ 41</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_44" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 44</field>
|
||||
<field name="name">Ust-VA KZ 44</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_49" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 49</field>
|
||||
<field name="name">Ust-VA KZ 49</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_43" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 43</field>
|
||||
<field name="name">Ust-VA KZ 43</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_48" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 48</field>
|
||||
<field name="name">Ust-VA KZ 48</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_81" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 81</field>
|
||||
<field name="name">Ust-VA KZ 81</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_86" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 86</field>
|
||||
<field name="name">Ust-VA KZ 86</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_35" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 35</field>
|
||||
<field name="name">Ust-VA KZ 35</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_77" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 77</field>
|
||||
<field name="name">Ust-VA KZ 77</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_76" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 76</field>
|
||||
<field name="name">Ust-VA KZ 76</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_91" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 91</field>
|
||||
<field name="name">Ust-VA KZ 91</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_89" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 89</field>
|
||||
<field name="name">Ust-VA KZ 89</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_93" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 93</field>
|
||||
<field name="name">Ust-VA KZ 93</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_95" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 95</field>
|
||||
<field name="name">Ust-VA KZ 95</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_94" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 94</field>
|
||||
<field name="name">Ust-VA KZ 94</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_42" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 42</field>
|
||||
<field name="name">Ust-VA KZ 42</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_68" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 68</field>
|
||||
<field name="name">Ust-VA KZ 68</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_60" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 60</field>
|
||||
<field name="name">Ust-VA KZ 60</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_21" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 21</field>
|
||||
<field name="name">Ust-VA KZ 21</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_45" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 45</field>
|
||||
<field name="name">Ust-VA KZ 45</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_46" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 46</field>
|
||||
<field name="name">Ust-VA KZ 46</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_52" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 52</field>
|
||||
<field name="name">Ust-VA KZ 52</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_73" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 73</field>
|
||||
<field name="name">Ust-VA KZ 73</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_78" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 78</field>
|
||||
<field name="name">Ust-VA KZ 78</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_84" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 84</field>
|
||||
<field name="name">Ust-VA KZ 84</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_36" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 36</field>
|
||||
<field name="name">Ust-VA KZ 36</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_80" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 80</field>
|
||||
<field name="name">Ust-VA KZ 80</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_98" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 98</field>
|
||||
<field name="name">Ust-VA KZ 98</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_96" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 96</field>
|
||||
<field name="name">Ust-VA KZ 96</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_47" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 47</field>
|
||||
<field name="name">Ust-VA KZ 47</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_53" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 53</field>
|
||||
<field name="name">Ust-VA KZ 53</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_74" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 74</field>
|
||||
<field name="name">Ust-VA KZ 74</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_79" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 79</field>
|
||||
<field name="name">Ust-VA KZ 79</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_85" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 85</field>
|
||||
<field name="name">Ust-VA KZ 85</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_65" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 65</field>
|
||||
<field name="name">Ust-VA KZ 65</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_66" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 66</field>
|
||||
<field name="name">Ust-VA KZ 66</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_61" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 61</field>
|
||||
<field name="name">Ust-VA KZ 61</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_62" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 62</field>
|
||||
<field name="name">Ust-VA KZ 62</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_67" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 67</field>
|
||||
<field name="name">Ust-VA KZ 67</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_63" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 63</field>
|
||||
<field name="name">Ust-VA KZ 63</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_64" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 64</field>
|
||||
<field name="name">Ust-VA KZ 64</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_59" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 59</field>
|
||||
<field name="name">Ust-VA KZ 59</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_69" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 69</field>
|
||||
<field name="name">Ust-VA KZ 69</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_39" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 39</field>
|
||||
<field name="name">Ust-VA KZ 39</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_83" model="account.account.tag">
|
||||
<field name="name">Umsatzsteuer-Voranmeldung Code 83</field>
|
||||
<field name="name">Ust-VA KZ 83</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
|
||||
@@ -188,300 +188,300 @@
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_intracom_community_supplies" model="account.account.tag">
|
||||
<field name="name">Sonstige leistungen</field>
|
||||
<field name="name">Sonstige Leistungen</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
<record id="tag_de_intracom_ABC" model="account.account.tag">
|
||||
<field name="name">Dreiecksgecshäfte</field>
|
||||
<field name="name">Dreiecksgeschäfte</field>
|
||||
<field name="applicability">taxes</field>
|
||||
</record>
|
||||
|
||||
<!-- Profit and loss tags -->
|
||||
<record id="tag_de_pl_01" model="account.account.tag">
|
||||
<field name="name">P&L: 1-Umsatzerlöse</field>
|
||||
<field name="name">G&V: 1-Umsatzerlöse</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_02" model="account.account.tag">
|
||||
<field name="name">P&L: 2-Erhöhung oder Verminderung des Bestands an fertigen und unfertigen Erzeugnissen</field>
|
||||
<field name="name">G&V: 2-Erhöhung oder Verminderung des Bestands an fertigen und unfertigen Erzeugnissen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_03" model="account.account.tag">
|
||||
<field name="name">P&L: 3-Andere aktivierte eigenleistungen</field>
|
||||
<field name="name">G&V: 3-Andere aktivierte Eigenleistungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_04" model="account.account.tag">
|
||||
<field name="name">P&L: 4-Sonstige betrieliche erträge</field>
|
||||
<field name="name">G&V: 4-Sonstige betrieliche Erträge</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_05" model="account.account.tag">
|
||||
<field name="name">P&L: 5-Materialaufwand</field>
|
||||
<field name="name">G&V: 5-Materialaufwand</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_06" model="account.account.tag">
|
||||
<field name="name">P&L: 6-Personalaufwand</field>
|
||||
<field name="name">G&V: 6-Personalaufwand</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_07" model="account.account.tag">
|
||||
<field name="name">P&L: 7-Abschreibungen</field>
|
||||
<field name="name">G&V: 7-Abschreibungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_08_1" model="account.account.tag">
|
||||
<field name="name">P&L: 8.1-Raumkosten</field>
|
||||
<field name="name">G&V: 8.1-Raumkosten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_08_2" model="account.account.tag">
|
||||
<field name="name">P&L: 8.2-Versicherungen, Beiträge und Abgaben</field>
|
||||
<field name="name">G&V: 8.2-Versicherungen, Beiträge und Abgaben</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_08_3" model="account.account.tag">
|
||||
<field name="name">P&L: 8.3-eparaturen und Instandhaltungen</field>
|
||||
<field name="name">G&V: 8.3-Reparaturen und Instandhaltungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_08_4" model="account.account.tag">
|
||||
<field name="name">P&L: 8.4-Fahrzeugkosten</field>
|
||||
<field name="name">G&V: 8.4-Fahrzeugkosten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_08_5" model="account.account.tag">
|
||||
<field name="name">P&L: 8.5-Werbe- und Reisekosten</field>
|
||||
<field name="name">G&V: 8.5-Werbe- und Reisekosten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_08_6" model="account.account.tag">
|
||||
<field name="name">P&L: 8.6-Kosten der Warenabgabe</field>
|
||||
<field name="name">G&V: 8.6-Kosten der Warenabgabe</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_08_7" model="account.account.tag">
|
||||
<field name="name">P&L: 8.7-verschiedene betriebliche Kosten</field>
|
||||
<field name="name">G&V: 8.7-verschiedene betriebliche Kosten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_09" model="account.account.tag">
|
||||
<field name="name">P&L: 9-Erträge aus beteiligungen</field>
|
||||
<field name="name">G&V: 9-Erträge aus Beteiligungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_10" model="account.account.tag">
|
||||
<field name="name">P&L: 10-Erträge aus anderen wertpapieren und ausleihungen des finanzanlagevermögens</field>
|
||||
<field name="name">G&V: 10-Erträge aus anderen Wertpapieren und Ausleihungen des Finanzanlagevermögens</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_11" model="account.account.tag">
|
||||
<field name="name">P&L: 11-Sonstige zinsen und ähnliche erträge</field>
|
||||
<field name="name">G&V: 11-Sonstige Zinsen und ähnliche Erträge</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_12" model="account.account.tag">
|
||||
<field name="name">P&L: 12-Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufvermögens</field>
|
||||
<field name="name">G&V: 12-Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufvermögens</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_13" model="account.account.tag">
|
||||
<field name="name">P&L: 13-Zinsen und ähnliche Aufwendungen</field>
|
||||
<field name="name">G&V: 13-Zinsen und ähnliche Aufwendungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_14" model="account.account.tag">
|
||||
<field name="name">P&L: 14-Steuern vom einkommen und ertrag</field>
|
||||
<field name="name">G&V: 14-Steuern vom Einkommen und Ertrag</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_pl_15" model="account.account.tag">
|
||||
<field name="name">P&L: 15-Sonstige steuern</field>
|
||||
<field name="name">G&V: 15-Sonstige Steuern</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
|
||||
<!-- Balance sheet tags -->
|
||||
<record id="tag_de_asset_bs_A_I_1" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A I 1-Selbst geschaffene gewerbliche Schutzrechte und ähnliche Rechte und Werte</field>
|
||||
<field name="name">Bilanz-Aktiva: A I 1-Selbst geschaffene gewerbliche Schutzrechte und ähnliche Rechte und Werte</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_I_2" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A I 2-Konzessionen, Lizenzen und ähnliche Rechte und Werte</field>
|
||||
<field name="name">Bilanz-Aktiva: A I 2-Konzessionen, Lizenzen und ähnliche Rechte und Werte</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_I_3" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A I 3-Geschäfts- oder Firmenwert</field>
|
||||
<field name="name">Bilanz-Aktiva: A I 3-Geschäfts- oder Firmenwert</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_I_4" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A I 4-geleistete Anzahlungen</field>
|
||||
<field name="name">Bilanz-Aktiva: A I 4-geleistete Anzahlungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_II_1" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A II 1-Grundstücke. grundstücksgleiche Rechte und Bauten</field>
|
||||
<field name="name">Bilanz-Aktiva: A II 1-Grundstücke. grundstücksgleiche Rechte und Bauten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_II_2" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A II 2-Technische Anlagen und Maschinen</field>
|
||||
<field name="name">Bilanz-Aktiva: A II 2-Technische Anlagen und Maschinen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_II_3" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A II 3-Andere Anlagen. Betriebs- und Geschäftsausstattung</field>
|
||||
<field name="name">Bilanz-Aktiva: A II 3-Andere Anlagen. Betriebs- und Geschäftsausstattung</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_II_4" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A II 4-Geleistete Anzahlungen und Anlagen im Bau</field>
|
||||
<field name="name">Bilanz-Aktiva: A II 4-Geleistete Anzahlungen und Anlagen im Bau</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_III_1" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A III 1-Anteile an verbundenen Unternehmen</field>
|
||||
<field name="name">Bilanz-Aktiva: A III 1-Anteile an verbundenen Unternehmen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_III_2" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A III 2-Ausleihungen an verbundene Unternehmen</field>
|
||||
<field name="name">Bilanz-Aktiva: A III 2-Ausleihungen an verbundene Unternehmen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_III_3" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A III 3-Beteiligungen</field>
|
||||
<field name="name">Bilanz-Aktiva: A III 3-Beteiligungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_III_4" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A III 4-Ausleihungen an Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
|
||||
<field name="name">Bilanz-Aktiva: A III 4-Ausleihungen an Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_III_5" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A III 5-Wertpapiere des Anlagevermögens</field>
|
||||
<field name="name">Bilanz-Aktiva: A III 5-Wertpapiere des Anlagevermögens</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_A_III_6" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: A III 6-sonstige Ausleihungen</field>
|
||||
<field name="name">Bilanz-Aktiva: A III 6-sonstige Ausleihungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_I_1" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B I 1-Roh-, Hilfs- und Betriebsstoffe</field>
|
||||
<field name="name">Bilanz-Aktiva: B I 1-Roh-, Hilfs- und Betriebsstoffe</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_I_2" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B I 2-Unfertige Erzeugnisse, unfertige Leistungen</field>
|
||||
<field name="name">Bilanz-Aktiva: B I 2-Unfertige Erzeugnisse, unfertige Leistungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_I_3" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B I 3-Fertige Erzeugnisse und Waren</field>
|
||||
<field name="name">Bilanz-Aktiva: B I 3-Fertige Erzeugnisse und Waren</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_I_4" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B I 4-Geleistete Anzahlungen</field>
|
||||
<field name="name">Bilanz-Aktiva: B I 4-Geleistete Anzahlungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_II_1" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B II 1-Forderungen aus Lieferungen und Leistungen</field>
|
||||
<field name="name">Bilanz-Aktiva: B II 1-Forderungen aus Lieferungen und Leistungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_II_2" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B II 2-Forderungen gegen verbundene Unternehmen</field>
|
||||
<field name="name">Bilanz-Aktiva: B II 2-Forderungen gegen verbundene Unternehmen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_II_3" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B II 3-Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
|
||||
<field name="name">Bilanz-Aktiva: B II 3-Forderungen gegen Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_II_4" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B II 4-Sonstige Vermögensgegenstände</field>
|
||||
<field name="name">Bilanz-Aktiva: B II 4-Sonstige Vermögensgegenstände</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_III_1" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B III 1-Anteile an verbundenen Unternehmen</field>
|
||||
<field name="name">Bilanz-Aktiva: B III 1-Anteile an verbundenen Unternehmen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_III_2" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B III 2-sonstige Wertpapiere</field>
|
||||
<field name="name">Bilanz-Aktiva: B III 2-sonstige Wertpapiere</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_B_IV" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: B IV-Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks</field>
|
||||
<field name="name">Bilanz-Aktiva: B IV-Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_C" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: C-Rechnungsabgrenzungsposten</field>
|
||||
<field name="name">Bilanz-Aktiva: C-Rechnungsabgrenzungsposten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_D" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: D-Aktive latente Steuern</field>
|
||||
<field name="name">Bilanz-Aktiva: D-Aktive latente Steuern</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_asset_bs_E" model="account.account.tag">
|
||||
<field name="name">BS-Aktivseite: E-Aktiver Unterschiedsbetrag aus der Vermögensverrechnung</field>
|
||||
<field name="name">Bilanz-Aktiva: E-Aktiver Unterschiedsbetrag aus der Vermögensverrechnung</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
|
||||
<record id="tag_de_liabilities_bs_A_I" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A I-Gezeichnetes Kapital</field>
|
||||
<field name="name">Bilanz-Passiva: A I-Gezeichnetes Kapital</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_A_II" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A II-Kapitalrücklage</field>
|
||||
<field name="name">Bilanz-Passiva: A II-Kapitalrücklage</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_A_III_1" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A III 1-Gesetzliche Rücklage</field>
|
||||
<field name="name">Bilanz-Passiva: A III 1-Gesetzliche Rücklage</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_A_III_2" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A III 2-Rücklage für Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen</field>
|
||||
<field name="name">Bilanz-Passiva: A III 2-Rücklage für Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_A_III_3" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A III 3-Satzungsmäßige Rücklagen</field>
|
||||
<field name="name">Bilanz-Passiva: A III 3-Satzungsmäßige Rücklagen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_A_III_4" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A III 4-Andere Gewinnrücklagen</field>
|
||||
<field name="name">Bilanz-Passiva: A III 4-Andere Gewinnrücklagen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_A_IV" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A IV-Gewinnvortrag/Verlustvortrag</field>
|
||||
<field name="name">Bilanz-Passiva: A IV-Gewinnvortrag/Verlustvortrag</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_A_V" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: A V-Jahresüberschuß/Jahresfehlbetrag</field>
|
||||
<field name="name">Bilanz-Passiva: A V-Jahresüberschuß/Jahresfehlbetrag</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_B" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: B Sonderposten mit Rücklageanteil</field>
|
||||
<field name="name">Bilanz-Passiva: B Sonderposten mit Rücklageanteil</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_C_1" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: C 1-Rückstellungen für Pensionen und ähnliche Verpflichtungen</field>
|
||||
<field name="name">Bilanz-Passiva: C 1-Rückstellungen für Pensionen und ähnliche Verpflichtungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_C_2" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: C 2-Steuerrückstellungen</field>
|
||||
<field name="name">Bilanz-Passiva: C 2-Steuerrückstellungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_C_3" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: C 3-Sonstige Rückstellungen</field>
|
||||
<field name="name">Bilanz-Passiva: C 3-Sonstige Rückstellungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_1" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 1-Anleihen, davon konvertibeln</field>
|
||||
<field name="name">Bilanz-Passiva: D 1-Anleihen, davon konvertibeln</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_2" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 2-Verbindlichkeiten gegenüber Kreditinstituten</field>
|
||||
<field name="name">Bilanz-Passiva: D 2-Verbindlichkeiten gegenüber Kreditinstituten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_3" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 3-Erhaltene Anzahlungen auf Bestellungen</field>
|
||||
<field name="name">Bilanz-Passiva: D 3-Erhaltene Anzahlungen auf Bestellungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_4" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 4-Verbindlichkeiten aus Lieferungen und Leistungen</field>
|
||||
<field name="name">Bilanz-Passiva: D 4-Verbindlichkeiten aus Lieferungen und Leistungen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_5" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 5-Verbindlichkeiten aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel</field>
|
||||
<field name="name">Bilanz-Passiva: D 5-Verbindlichkeiten aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_6" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 6-Verbindlichkeiten gegenüber verbundenen Unternehmen</field>
|
||||
<field name="name">Bilanz-Passiva: D 6-Verbindlichkeiten gegenüber verbundenen Unternehmen</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_7" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 7-Verbindlichkeiten gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
|
||||
<field name="name">Bilanz-Passiva: D 7-Verbindlichkeiten gegenüber Unternehmen, mit denen ein Beteiligungsverhältnis besteht</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_D_8" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: D 8-Sonstige Verbindlichkeiten, davon aus Steuern, davon im Rahmen der sozialen Sicherheit</field>
|
||||
<field name="name">Bilanz-Passiva: D 8-Sonstige Verbindlichkeiten, davon aus Steuern, davon im Rahmen der sozialen Sicherheit</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_E" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: E-Rechnungsabgrenzungsposten</field>
|
||||
<field name="name">Bilanz-Passiva: E-Rechnungsabgrenzungsposten</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
<record id="tag_de_liabilities_bs_F" model="account.account.tag">
|
||||
<field name="name">BS-Passivseite: F-Passive latente Steuern</field>
|
||||
<field name="name">Bilanz-Passiva: F-Passive latente Steuern</field>
|
||||
<field name="applicability">accounts</field>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from odoo import fields, models
|
||||
from odoo import api, fields, models
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.tools.translate import _
|
||||
|
||||
class AccountTaxTemplate(models.Model):
|
||||
_inherit = 'account.tax.template'
|
||||
@@ -14,3 +16,18 @@ class AccountTax(models.Model):
|
||||
_inherit = "account.tax"
|
||||
|
||||
l10n_de_datev_code = fields.Char(size=2, help="2 digits code use by Datev")
|
||||
|
||||
class AccountInvoice(models.Model):
|
||||
_inherit = "account.invoice"
|
||||
|
||||
def invoice_validate(self):
|
||||
for invoice in self:
|
||||
for line in invoice.invoice_line_ids:
|
||||
account_tax = line.account_id.tax_ids.ids
|
||||
if account_tax and invoice.company_id.country_id.code == 'DE':
|
||||
account_name = line.account_id.name
|
||||
for tax in line.invoice_line_tax_ids:
|
||||
if tax.id not in account_tax:
|
||||
raise UserError(_('Account %s does not authorize to have tax %s specified on the line. \
|
||||
Change the tax used in this invoice or remove all taxes from the account') % (account_name, tax.name))
|
||||
return super(AccountInvoice, self).invoice_validate()
|
||||
@@ -5,22 +5,24 @@
|
||||
# =====
|
||||
|
||||
# Dieses Modul bietet Ihnen einen deutschen Kontenplan basierend auf dem SKR03.
|
||||
# Gemäss der aktuellen Einstellungen ist die Firma nicht Umsatzsteuerpflichtig.
|
||||
# Diese Grundeinstellung ist sehr einfach zu ändern und bedarf in der Regel
|
||||
# grundsätzlich eine initiale Zuweisung von Steuerkonten zu Produkten und / oder
|
||||
# Sachkonten oder zu Partnern.
|
||||
# Die Umsatzsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei)
|
||||
# sollten bei den Produktstammdaten hinterlegt werden (in Abhängigkeit der
|
||||
# Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter Finanzbuchhaltung
|
||||
# (Kategorie: Umsatzsteuer).
|
||||
# Die Vorsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei)
|
||||
# sollten ebenso bei den Produktstammdaten hinterlegt werden (in Abhängigkeit
|
||||
# der Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter
|
||||
# Finanzbuchhaltung (Kategorie: Vorsteuer).
|
||||
# Gemäss der aktuellen Einstellungen ist ein neues Unternehmen in Odoo
|
||||
# Umsatzsteuerpflichtig. Zahlreiche Erlös- und Aufwandskonten enthalten
|
||||
# bereits eine zugeordnete Steuer. Hierdurch wird für diese Konten bereits
|
||||
# die richtige Vorsteuer (Eingangsrechnungen) bzw. Umsatzsteuer
|
||||
# (Ausgangsrechnungen) automatisch ausgewählt.
|
||||
#
|
||||
# Die Zuordnung von Steuerkonten zu Produkten und / oder Sachkonten kann
|
||||
# für den jeweiligen betrieblichen Anwendungszweck überarbeitet oder
|
||||
# auch erweitert werden.
|
||||
# Die mit diesem Kontenrahmen installierten Steuerschlüssel (z.B. 19%, 7%,
|
||||
# steuerfrei) können hierzu bei den Produktstammdaten hinterlegt werden
|
||||
# (in Abhängigkeit der Steuervorschriften). Die Zuordnung erfolgt auf
|
||||
# dem Aktenreiter Finanzbuchhaltung (Kategorie: Umsatzsteuer / Vorsteuer).
|
||||
|
||||
# Die Zuordnung der Steuern für Ein- und Ausfuhren aus EU Ländern, sowie auch
|
||||
# für den Ein- und Verkauf aus und in Drittländer sollten beim Partner
|
||||
# (Lieferant/Kunde)hinterlegt werden (in Anhängigkeit vom Herkunftsland
|
||||
# des Lieferanten/Kunden). Die Zuordnung beim Kunden ist 'höherwertig' als
|
||||
# (Lieferant / Kunde) hinterlegt werden (in Anhängigkeit vom Herkunftsland
|
||||
# des Lieferanten/Kunden). Diese Zuordnung ist 'höherwertig' als
|
||||
# die Zuordnung bei Produkten und überschreibt diese im Einzelfall.
|
||||
#
|
||||
# Zur Vereinfachung der Steuerausweise und Buchung bei Auslandsgeschäften
|
||||
@@ -28,32 +30,10 @@
|
||||
# (z.B. Zuordnung 'Umsatzsteuer 19%' zu 'steuerfreie Einfuhren aus der EU')
|
||||
# zwecks Zuordnung dieses Mappings zum ausländischen Partner (Kunde/Lieferant).
|
||||
|
||||
# Die Rechnungsbuchung beim Einkauf bewirkt folgendes:
|
||||
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
|
||||
# jeweiligen Kategorien für den Vorsteuer Steuermessbetrag (z.B. Vorsteuer
|
||||
# Steuermessbetrag Voller Steuersatz 19%).
|
||||
# Der Steuerbetrag erscheint unter der Kategorie 'Vorsteuern' (z.B. Vorsteuer
|
||||
# 19%). Durch multidimensionale Hierachien können verschiedene Positionen
|
||||
# zusammengefasst werden und dann in Form eines Reports ausgegeben werden.
|
||||
#
|
||||
# Die Rechnungsbuchung beim Verkauf bewirkt folgendes:
|
||||
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
|
||||
# jeweiligen Kategorien für den Umsatzsteuer Steuermessbetrag
|
||||
# (z.B. Umsatzsteuer Steuermessbetrag Voller Steuersatz 19%).
|
||||
# Der Steuerbetrag erscheint unter der Kategorie 'Umsatzsteuer'
|
||||
# (z.B. Umsatzsteuer 19%). Durch multidimensionale Hierachien können
|
||||
# verschiedene Positionen zusammengefasst werden.
|
||||
# Die zugewiesenen Steuerausweise können auf Ebene der einzelnen
|
||||
# Rechnung (Eingangs- und Ausgangsrechnung) nachvollzogen werden,
|
||||
# und dort gegebenenfalls angepasst werden.
|
||||
|
||||
# Rechnungsgutschriften führen zu einer Korrektur (Gegenposition)
|
||||
# der Steuerbuchung, in Form einer spiegelbildlichen Buchung.
|
||||
|
||||
|
||||
{
|
||||
'name': 'Deutschland SKR03 - Accounting',
|
||||
'version': '2.0',
|
||||
'version': '3.0',
|
||||
'author': 'openbig.org',
|
||||
'website': 'http://www.openbig.org',
|
||||
'category': 'Localization',
|
||||
@@ -68,6 +48,7 @@ German accounting chart and localization.
|
||||
'data/l10n_de_skr03_chart_data.xml',
|
||||
'data/account_data.xml',
|
||||
'data/account_tax_fiscal_position_data.xml',
|
||||
'data/account_reconcile_model_template.xml',
|
||||
'data/account_chart_template_data.xml',
|
||||
],
|
||||
'auto_install': True
|
||||
|
||||
@@ -4,13 +4,22 @@
|
||||
|
||||
<!-- Account Tax Group -->
|
||||
<record id="tax_group_0" model="account.tax.group">
|
||||
<field name="name">Tax 0%</field>
|
||||
<field name="name">USt 0%</field>
|
||||
</record>
|
||||
<record id="tax_group_7" model="account.tax.group">
|
||||
<field name="name">Tax 7%</field>
|
||||
<field name="name">USt 7%</field>
|
||||
</record>
|
||||
<record id="tax_group_55" model="account.tax.group">
|
||||
<field name="name">USt 5,5%</field>
|
||||
</record>
|
||||
<record id="tax_group_107" model="account.tax.group">
|
||||
<field name="name">USt 10,7%</field>
|
||||
</record>
|
||||
<record id="tax_group_x" model="account.tax.group">
|
||||
<field name="name">USt x%</field>
|
||||
</record>
|
||||
<record id="tax_group_19" model="account.tax.group">
|
||||
<field name="name">Tax 19%</field>
|
||||
<field name="name">USt 19%</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="reconcile_3731" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-EK-7%</field>
|
||||
<field name="account_id" ref="account_3731"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_vst_7_taxinclusive_skr03"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-EK-7%</field>
|
||||
<field name="chart_template_id" ref="l10n_de_chart_template"/>
|
||||
</record>
|
||||
<record id="reconcile_3736" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-EK-19%</field>
|
||||
<field name="account_id" ref="account_3736"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_vst_19_taxinclusive_skr03"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-EK-19%</field>
|
||||
<field name="chart_template_id" ref="l10n_de_chart_template"/>
|
||||
</record>
|
||||
<record id="reconcile_8731" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-VK-7%</field>
|
||||
<field name="account_id" ref="account_8731"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr03"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-VK-7%</field>
|
||||
<field name="chart_template_id" ref="l10n_de_chart_template"/>
|
||||
</record>
|
||||
<record id="reconcile_8736" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-VK-19%</field>
|
||||
<field name="account_id" ref="account_8736"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr03"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-VK-19%</field>
|
||||
<field name="chart_template_id" ref="l10n_de_chart_template"/>
|
||||
</record>
|
||||
<record id="reconcile_2401" model="account.reconcile.model.template">
|
||||
<field name="name">Forderungsverlust-7%</field>
|
||||
<field name="account_id" ref="account_2401"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr03"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Forderungsverlust-7%</field>
|
||||
<field name="chart_template_id" ref="l10n_de_chart_template"/>
|
||||
</record>
|
||||
<record id="reconcile_2406" model="account.reconcile.model.template">
|
||||
<field name="name">Forderungsverlust-19%</field>
|
||||
<field name="account_id" ref="account_2406"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr03"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Forderungsverlust-19%</field>
|
||||
<field name="chart_template_id" ref="l10n_de_chart_template"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,26 +3,25 @@
|
||||
|
||||
# SKR04
|
||||
# =====
|
||||
# Dieses Modul bietet Ihnen einen deutschen Kontenplan basierend auf dem SKR03.
|
||||
# Gemäss der aktuellen Einstellungen ist ein neues Unternehmen in Odoo
|
||||
# Umsatzsteuerpflichtig. Zahlreiche Erlös- und Aufwandskonten enthalten
|
||||
# bereits eine zugeordnete Steuer. Hierdurch wird für diese Konten bereits
|
||||
# die richtige Vorsteuer (Eingangsrechnungen) bzw. Umsatzsteuer
|
||||
# (Ausgangsrechnungen) automatisch ausgewählt.
|
||||
#
|
||||
# Die Zuordnung von Steuerkonten zu Produkten und / oder Sachkonten kann
|
||||
# für den jeweiligen betrieblichen Anwendungszweck überarbeitet oder
|
||||
# auch erweitert werden.
|
||||
# Die mit diesem Kontenrahmen installierten Steuerschlüssel (z.B. 19%, 7%,
|
||||
# steuerfrei) können hierzu bei den Produktstammdaten hinterlegt werden
|
||||
# (in Abhängigkeit der Steuervorschriften). Die Zuordnung erfolgt auf
|
||||
# dem Aktenreiter Finanzbuchhaltung (Kategorie: Umsatzsteuer / Vorsteuer).
|
||||
|
||||
# Dieses Modul bietet Ihnen einen deutschen Kontenplan basierend auf dem SKR04.
|
||||
# Gemäss der aktuellen Einstellungen ist die Firma nicht Umsatzsteuerpflichtig,
|
||||
# d.h. im Standard existiert keine Zuordnung von Produkten und Sachkonten zu
|
||||
# Steuerschlüsseln.
|
||||
# Diese Grundeinstellung ist sehr einfach zu ändern und bedarf in der Regel
|
||||
# grundsätzlich eine initiale Zuweisung von Steuerschlüsseln zu Produkten und / oder
|
||||
# Sachkonten oder zu Partnern.
|
||||
# Die Umsatzsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei)
|
||||
# sollten bei den Produktstammdaten hinterlegt werden (in Abhängigkeit der
|
||||
# Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter Finanzbuchhaltung
|
||||
# (Kategorie: Umsatzsteuer).
|
||||
# Die Vorsteuern (voller Steuersatz, reduzierte Steuer und steuerfrei)
|
||||
# sollten ebenso bei den Produktstammdaten hinterlegt werden (in Abhängigkeit
|
||||
# der Steuervorschriften). Die Zuordnung erfolgt auf dem Aktenreiter
|
||||
# Finanzbuchhaltung (Kategorie: Vorsteuer).
|
||||
# Die Zuordnung der Steuern für Ein- und Ausfuhren aus EU Ländern, sowie auch
|
||||
# für den Ein- und Verkauf aus und in Drittländer sollten beim Partner
|
||||
# (Lieferant/Kunde) hinterlegt werden (in Anhängigkeit vom Herkunftsland
|
||||
# des Lieferanten/Kunden). Die Zuordnung beim Kunden ist 'höherwertig' als
|
||||
# (Lieferant / Kunde) hinterlegt werden (in Anhängigkeit vom Herkunftsland
|
||||
# des Lieferanten/Kunden). Diese Zuordnung ist 'höherwertig' als
|
||||
# die Zuordnung bei Produkten und überschreibt diese im Einzelfall.
|
||||
#
|
||||
# Zur Vereinfachung der Steuerausweise und Buchung bei Auslandsgeschäften
|
||||
@@ -30,32 +29,10 @@
|
||||
# (z.B. Zuordnung 'Umsatzsteuer 19%' zu 'steuerfreie Einfuhren aus der EU')
|
||||
# zwecks Zuordnung dieses Mappings zum ausländischen Partner (Kunde/Lieferant).
|
||||
|
||||
# Die Rechnungsbuchung beim Einkauf bewirkt folgendes:
|
||||
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
|
||||
# jeweiligen Kategorien für den Vorsteuer Steuermessbetrag (z.B. Vorsteuer
|
||||
# Steuermessbetrag Voller Steuersatz 19%).
|
||||
# Der Steuerbetrag erscheint unter der Kategorie 'Vorsteuern' (z.B. Vorsteuer
|
||||
# 19%). Durch multidimensionale Hierachien können verschiedene Positionen
|
||||
# zusammengefasst werden und dann in Form eines Reports ausgegeben werden.
|
||||
#
|
||||
# Die Rechnungsbuchung beim Verkauf bewirkt folgendes:
|
||||
# Die Steuerbemessungsgrundlage (exklusive Steuer) wird ausgewiesen bei den
|
||||
# jeweiligen Kategorien für den Umsatzsteuer Steuermessbetrag
|
||||
# (z.B. Umsatzsteuer Steuermessbetrag Voller Steuersatz 19%).
|
||||
# Der Steuerbetrag erscheint unter der Kategorie 'Umsatzsteuer'
|
||||
# (z.B. Umsatzsteuer 19%). Durch multidimensionale Hierachien können
|
||||
# verschiedene Positionen zusammengefasst werden.
|
||||
# Die zugewiesenen Steuerausweise können auf Ebene der einzelnen
|
||||
# Rechnung (Eingangs- und Ausgangsrechnung) nachvollzogen werden,
|
||||
# und dort gegebenenfalls angepasst werden.
|
||||
|
||||
# Rechnungsgutschriften führen zu einer Korrektur (Gegenposition)
|
||||
# der Steuerbuchung, in Form einer spiegelbildlichen Buchung.
|
||||
|
||||
|
||||
{
|
||||
'name': 'Deutschland SKR04 - Accounting',
|
||||
'version': '2.0',
|
||||
'version': '3.0',
|
||||
'author': 'openbig.org',
|
||||
'website': 'http://www.openbig.org',
|
||||
'category': 'Localization',
|
||||
@@ -70,6 +47,7 @@ German accounting chart and localization.
|
||||
'data/l10n_de_skr04_chart_data.xml',
|
||||
'data/account_data.xml',
|
||||
'data/account_tax_fiscal_position_data.xml',
|
||||
'data/account_reconcile_model_template.xml',
|
||||
'data/account_chart_template_data.xml',
|
||||
],
|
||||
}
|
||||
|
||||
@@ -4,13 +4,22 @@
|
||||
|
||||
<!-- Account Tax Group -->
|
||||
<record id="tax_group_0" model="account.tax.group">
|
||||
<field name="name">Tax 0%</field>
|
||||
<field name="name">USt 0%</field>
|
||||
</record>
|
||||
<record id="tax_group_7" model="account.tax.group">
|
||||
<field name="name">Tax 7%</field>
|
||||
<field name="name">USt 7%</field>
|
||||
</record>
|
||||
<record id="tax_group_55" model="account.tax.group">
|
||||
<field name="name">USt 5,5%</field>
|
||||
</record>
|
||||
<record id="tax_group_107" model="account.tax.group">
|
||||
<field name="name">USt 10,7%</field>
|
||||
</record>
|
||||
<record id="tax_group_x" model="account.tax.group">
|
||||
<field name="name">USt x%</field>
|
||||
</record>
|
||||
<record id="tax_group_19" model="account.tax.group">
|
||||
<field name="name">Tax 19%</field>
|
||||
<field name="name">USt 19%</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="reconcile_5731" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-EK-7%</field>
|
||||
<field name="account_id" ref="chart_skr04_5731"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_vst_7_taxinclusive_skr04"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-EK-7%</field>
|
||||
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
|
||||
</record>
|
||||
<record id="reconcile_5736" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-EK-19%</field>
|
||||
<field name="account_id" ref="chart_skr04_5736"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_vst_19_taxinclusive_skr04"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-EK-19%</field>
|
||||
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
|
||||
</record>
|
||||
<record id="reconcile_4731" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-VK-7%</field>
|
||||
<field name="account_id" ref="chart_skr04_4731"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr04"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-VK-7%</field>
|
||||
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
|
||||
</record>
|
||||
<record id="reconcile_4736" model="account.reconcile.model.template">
|
||||
<field name="name">Skonto-VK-19%</field>
|
||||
<field name="account_id" ref="chart_skr04_4736"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr04"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Skonto-VK-19%</field>
|
||||
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
|
||||
</record>
|
||||
<record id="reconcile_6931" model="account.reconcile.model.template">
|
||||
<field name="name">Forderungsverlust-7%</field>
|
||||
<field name="account_id" ref="chart_skr04_6931"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_7_taxinclusive_skr04"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Forderungsverlust-7%</field>
|
||||
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
|
||||
</record>
|
||||
<record id="reconcile_6936" model="account.reconcile.model.template">
|
||||
<field name="name">Forderungsverlust-19%</field>
|
||||
<field name="account_id" ref="chart_skr04_6936"/>
|
||||
<field name="amount_type">percentage</field>
|
||||
<field name="tax_id" ref="tax_ust_19_taxinclusive_skr04"/>
|
||||
<field name="amount">100</field>
|
||||
<field name="label">Forderungsverlust-19%</field>
|
||||
<field name="chart_template_id" ref="l10n_chart_de_skr04"/>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+3053
-539
File diff suppressed because it is too large
Load Diff
@@ -63,7 +63,7 @@ def format_amount(env, amount, currency):
|
||||
lang = env['res.lang']._lang_get(env.context.get('lang') or 'en_US')
|
||||
|
||||
formatted_amount = lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\
|
||||
.replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011')
|
||||
.replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
|
||||
|
||||
pre = post = u''
|
||||
if currency.position == 'before':
|
||||
|
||||
@@ -255,6 +255,11 @@ class PosConfig(models.Model):
|
||||
if any(self.journal_ids.mapped(lambda journal: journal.currency_id and journal.currency_id != self.currency_id)):
|
||||
raise ValidationError(_("All payment methods must be in the same currency as the Sales Journal or the company currency if that is not set."))
|
||||
|
||||
@api.constrains('company_id', 'available_pricelist_ids')
|
||||
def _check_companies(self):
|
||||
if any(self.available_pricelist_ids.mapped(lambda pl: pl.company_id.id not in (False, self.company_id.id))):
|
||||
raise ValidationError(_("The selected pricelists must belong to no company or the company of the point of sale."))
|
||||
|
||||
@api.onchange('iface_print_via_proxy')
|
||||
def _onchange_iface_print_via_proxy(self):
|
||||
self.iface_print_auto = self.iface_print_via_proxy
|
||||
|
||||
@@ -182,6 +182,9 @@ class CustomerPortal(CustomerPortal):
|
||||
@http.route(['/my/task/<int:task_id>'], type='http', auth="user", website=True)
|
||||
def portal_my_task(self, task_id=None, **kw):
|
||||
task = request.env['project.task'].browse(task_id)
|
||||
task.check_access_rights('read')
|
||||
task.check_access_rule('read')
|
||||
|
||||
vals = {
|
||||
'task': task,
|
||||
'user': request.env.user
|
||||
|
||||
@@ -236,12 +236,13 @@
|
||||
</div>
|
||||
<t t-foreach="order.order_line" t-as="ol">
|
||||
<div class="row orders_vertical_align">
|
||||
<div class="visible-lg col-lg-1 text-center">
|
||||
<div t-if="not request.env.user._is_public()" class="visible-lg col-lg-1 text-center">
|
||||
<span t-field="ol.product_image" t-options="{'widget': 'image', 'class': 'img-rounded', 'style':'width: 48px;height:48px'}" />
|
||||
</div>
|
||||
<div id='product_name' t-att-class="'col-lg-3 col-sm-5 col-xs-4' if display_discount else 'col-lg-4 col-sm-6 col-xs-3'">
|
||||
<span t-esc="ol.product_id.name"/>
|
||||
</div>
|
||||
<div t-if="request.env.user._is_public()" class="visible-lg col-lg-1 text-center" /> <!-- Just for alignment -->
|
||||
<div class="col-sm-3 hidden-xs text-right">
|
||||
<span t-field="ol.price_unit" t-options='{"widget": "monetary", "display_currency": order.pricelist_id.currency_id}'/>
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<record id="account_analytic_line_rule_billing_user" model="ir.rule">
|
||||
<field name="name">account.analytic.line.billing.user</field>
|
||||
<field name="model_id" ref="analytic.model_account_analytic_line"/>
|
||||
<field name="domain_force">[('project_id', '=', False)]</field>
|
||||
<field name="domain_force">[(1, '=', 1)]</field>
|
||||
<field name="groups" eval="[(4, ref('account.group_account_invoice'))]"/>
|
||||
<field name="perm_create" eval="1"/>
|
||||
<field name="perm_write" eval="1"/>
|
||||
|
||||
@@ -28,11 +28,11 @@ class Company(models.Model):
|
||||
location.sudo().write({'company_id': company.id})
|
||||
company.write({'internal_transit_location_id': location.id})
|
||||
|
||||
warehouses = self.env['stock.warehouse'].search([('partner_id', '=', self.partner_id.id)])
|
||||
warehouses.mapped('partner_id').with_context(force_company=self.id).write({
|
||||
'property_stock_customer': location.id,
|
||||
'property_stock_supplier': location.id,
|
||||
})
|
||||
warehouses = self.env['stock.warehouse'].search([('partner_id', '=', company.partner_id.id)])
|
||||
warehouses.mapped('partner_id').with_context(force_company=company.id).write({
|
||||
'property_stock_customer': location.id,
|
||||
'property_stock_supplier': location.id,
|
||||
})
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
|
||||
@@ -25,7 +25,7 @@ class Http(models.AbstractModel):
|
||||
return {
|
||||
"session_id": request.session.sid,
|
||||
"uid": request.session.uid,
|
||||
"is_system": user._is_system(),
|
||||
"is_system": user._is_system() if request.session.uid else False,
|
||||
"is_superuser": user._is_superuser() if request.session.uid else False,
|
||||
"user_context": request.session.get_context() if request.session.uid else {},
|
||||
"db": request.session.db,
|
||||
|
||||
+1
@@ -48,6 +48,7 @@ ol {
|
||||
|
||||
ul {
|
||||
list-style: disc;
|
||||
padding-left: 40px;
|
||||
}
|
||||
|
||||
ul ul {
|
||||
|
||||
@@ -141,6 +141,7 @@ var KanbanColumnProgressBar = Widget.extend({
|
||||
}
|
||||
|
||||
// Display and animate the progress bars
|
||||
var barNumber = 0;
|
||||
_.each(self.colors, function (val, key) {
|
||||
var $bar = self.$bars[val];
|
||||
var count = self.subgroupCounts && self.subgroupCounts[key] || 0;
|
||||
@@ -165,7 +166,14 @@ var KanbanColumnProgressBar = Widget.extend({
|
||||
window.getComputedStyle($bar[0]).getPropertyValue('width'); // Force reflow so that animations work
|
||||
if (count > 0) {
|
||||
$bar.addClass('o_bar_has_records');
|
||||
// Make sure every bar that has records has some space
|
||||
// and that everything adds up to 100%
|
||||
var minWidth = 6*barNumber;
|
||||
var maxWidth = 100 - minWidth;
|
||||
self.$('.progress-bar.o_bar_has_records').css('max-width', maxWidth + '%');
|
||||
self.$('.progress-bar.o_bar_has_records').css('min-width', minWidth + '%');
|
||||
$bar.css('width', (count * 100 / self.groupCount) + '%');
|
||||
barNumber++;
|
||||
} else {
|
||||
$bar.css('width', '');
|
||||
}
|
||||
|
||||
@@ -73,11 +73,6 @@
|
||||
margin-bottom: 0;
|
||||
box-shadow: none;
|
||||
cursor: pointer;
|
||||
|
||||
// Be sure that a bar with data has a minimun width
|
||||
&.o_bar_has_records {
|
||||
min-width: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.o_kanban_counter_label {
|
||||
|
||||
@@ -1519,7 +1519,7 @@ var LinkDialog = Dialog.extend({
|
||||
+ ((size && size.length) ? (' btn-' + size) : '');
|
||||
var isNewWindow = this.$('input[name="is_new_window"]').prop('checked');
|
||||
|
||||
if (url.indexOf('@') >= 0 && url.indexOf('mailto:') < 0) {
|
||||
if (url.indexOf('@') >= 0 && url.indexOf('mailto:') < 0 && !url.match(/^http[s]?/i)) {
|
||||
url = ('mailto:' + url);
|
||||
}
|
||||
return {
|
||||
|
||||
@@ -72,7 +72,8 @@ class WebsiteHrRecruitment(http.Controller):
|
||||
|
||||
@http.route('/jobs/add', type='http', auth="user", website=True)
|
||||
def jobs_add(self, **kwargs):
|
||||
job = request.env['hr.job'].create({
|
||||
# avoid branding of website_description by setting rendering_bundle in context
|
||||
job = request.env['hr.job'].with_context(rendering_bundle=True).create({
|
||||
'name': _('Job Title'),
|
||||
})
|
||||
return request.redirect("/jobs/detail/%s?enable_editor=1" % slug(job))
|
||||
|
||||
@@ -76,4 +76,4 @@ class WebsiteSaleDelivery(WebsiteSale):
|
||||
lang = request.env['res.lang']._lang_get(request.env.context.get('lang') or 'en_US')
|
||||
|
||||
return lang.format(fmt, currency.round(amount), grouping=True, monetary=True)\
|
||||
.replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011')
|
||||
.replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
|
||||
|
||||
@@ -309,6 +309,13 @@ customize the amount of logging output
|
||||
enables `log rotation <https://docs.python.org/2/library/logging.handlers.html#timedrotatingfilehandler>`_
|
||||
daily, keeping 30 backups. Log rotation frequency and number of backups is
|
||||
not configurable.
|
||||
|
||||
.. danger::
|
||||
|
||||
Built-in log rotation is not reliable in multi-workers scenarios
|
||||
and may incur significant data loss. It is *strongly recommended* to
|
||||
use an external log rotation utility or use system loggers (--syslog)
|
||||
instead.
|
||||
|
||||
.. option:: --syslog
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ from odoo import api, fields, models, _
|
||||
from PIL import Image
|
||||
import babel
|
||||
from lxml import etree
|
||||
import math
|
||||
|
||||
from odoo.tools import html_escape as escape, posix_to_ldml, safe_eval, float_utils, format_date, pycompat
|
||||
|
||||
@@ -125,7 +126,7 @@ class IntegerConverter(models.AbstractModel):
|
||||
|
||||
@api.model
|
||||
def value_to_html(self, value, options):
|
||||
return pycompat.to_text(self.user_lang().format('%d', value, grouping=True).replace(r'-', u'\u2011'))
|
||||
return pycompat.to_text(self.user_lang().format('%d', value, grouping=True).replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}'))
|
||||
|
||||
|
||||
class FloatConverter(models.AbstractModel):
|
||||
@@ -145,7 +146,7 @@ class FloatConverter(models.AbstractModel):
|
||||
value = float_utils.float_round(value, precision_digits=precision)
|
||||
fmt = '%.{precision}f'.format(precision=precision)
|
||||
|
||||
formatted = self.user_lang().format(fmt, value, grouping=True).replace(r'-', u'\u2011')
|
||||
formatted = self.user_lang().format(fmt, value, grouping=True).replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
|
||||
|
||||
# %f does not strip trailing zeroes. %g does but its precision causes
|
||||
# it to switch to scientific notation starting at a million *and* to
|
||||
@@ -325,7 +326,7 @@ class MonetaryConverter(models.AbstractModel):
|
||||
|
||||
lang = self.user_lang()
|
||||
formatted_amount = lang.format(fmt, display_currency.round(value),
|
||||
grouping=True, monetary=True).replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'\u2011')
|
||||
grouping=True, monetary=True).replace(r' ', u'\N{NO-BREAK SPACE}').replace(r'-', u'-\N{ZERO WIDTH NO-BREAK SPACE}')
|
||||
|
||||
pre = post = u''
|
||||
if display_currency.position == 'before':
|
||||
@@ -367,9 +368,9 @@ class FloatTimeConverter(models.AbstractModel):
|
||||
|
||||
@api.model
|
||||
def value_to_html(self, value, options):
|
||||
factor = -1 if value < 0 else 1
|
||||
sign = math.copysign(1.0, value)
|
||||
hours, minutes = divmod(abs(value) * 60, 60)
|
||||
return '%02d:%02d' % (hours * factor, minutes)
|
||||
return '%02d:%02d' % (sign * hours, minutes)
|
||||
|
||||
|
||||
class DurationConverter(models.AbstractModel):
|
||||
|
||||
@@ -73,7 +73,7 @@ class TestFloatExport(TestBasicExport):
|
||||
converter = self.get_converter('float')
|
||||
|
||||
value = converter(-42.0)
|
||||
self.assertEqual(value, u"\u201142.0")
|
||||
self.assertEqual(value, u"-\N{ZERO WIDTH NO-BREAK SPACE}42.0")
|
||||
|
||||
value = converter(42.0100)
|
||||
self.assertEqual(value, "42.01")
|
||||
@@ -120,7 +120,7 @@ class TestCurrencyExport(TestExport):
|
||||
converted = self.convert(obj, dest=currency)
|
||||
|
||||
self.assertEqual(
|
||||
converted, u'<span class="oe_currency_value">\u20110.12</span>'
|
||||
converted, u'<span class="oe_currency_value">-\N{ZERO WIDTH NO-BREAK SPACE}0.12</span>'
|
||||
u'\N{NO-BREAK SPACE}{symbol}'.format(
|
||||
obj=obj,
|
||||
symbol=currency.symbol
|
||||
|
||||
@@ -139,14 +139,10 @@ class TestOnChange(common.TransactionCase):
|
||||
self.env.cache.invalidate()
|
||||
result = self.Discussion.onchange(values, 'name', field_onchange)
|
||||
self.assertIn('messages', result['value'])
|
||||
self.assertItemsEqual(result['value']['messages'], [
|
||||
self.assertEqual(result['value']['messages'], [
|
||||
(5,),
|
||||
(1, message.id, {
|
||||
'name': "[%s] %s" % ("Foo", USER.name),
|
||||
'body': message.body,
|
||||
'author': message.author.name_get()[0],
|
||||
'size': message.size,
|
||||
'important': message.important,
|
||||
}),
|
||||
(0, 0, {
|
||||
'name': "[%s] %s" % ("Foo", USER.name),
|
||||
@@ -157,6 +153,17 @@ class TestOnChange(common.TransactionCase):
|
||||
}),
|
||||
])
|
||||
|
||||
# ensure onchange changing one2many without subfield works
|
||||
one_level_fields = {k: v for k, v in field_onchange.items() if k.count('.') < 1}
|
||||
values = dict(values, name='{generate_dummy_message}')
|
||||
result = self.Discussion.with_context(generate_dummy_message=True).onchange(values, 'name', one_level_fields)
|
||||
self.assertEqual(result['value']['messages'], [
|
||||
(5,),
|
||||
(4, message.id),
|
||||
(0, 0, {}),
|
||||
(0, 0, {}),
|
||||
])
|
||||
|
||||
def test_onchange_one2many_reference(self):
|
||||
""" test the effect of onchange() on one2many fields with line references """
|
||||
BODY = "What a beautiful day!"
|
||||
@@ -245,8 +252,7 @@ class TestOnChange(common.TransactionCase):
|
||||
'lines': [
|
||||
(5,),
|
||||
(1, line1.id, {'name': partner2.name,
|
||||
'partner': (partner2.id, partner2.name),
|
||||
'tags': [(5,)]}),
|
||||
'partner': (partner2.id, partner2.name)}),
|
||||
(0, 0, {'name': partner2.name,
|
||||
'partner': (partner2.id, partner2.name),
|
||||
'tags': [(5,)]}),
|
||||
@@ -254,6 +260,17 @@ class TestOnChange(common.TransactionCase):
|
||||
})
|
||||
|
||||
# do it again, but this time with a new tag on the second line
|
||||
expected_new_tag_result = {
|
||||
'name': partner2.name,
|
||||
'lines': [
|
||||
(5,),
|
||||
(1, line1.id, {'name': partner2.name,
|
||||
'partner': (partner2.id, partner2.name)}),
|
||||
(0, 0, {'name': partner2.name,
|
||||
'partner': (partner2.id, partner2.name),
|
||||
'tags': [(5,), (0, 0, {'name': 'Tag'})]}),
|
||||
],
|
||||
}
|
||||
values = {
|
||||
'name': partner1.name,
|
||||
'partner': partner2.id, # this one just changed
|
||||
@@ -265,18 +282,13 @@ class TestOnChange(common.TransactionCase):
|
||||
self.env.cache.invalidate()
|
||||
|
||||
result = multi.onchange(values, 'partner', field_onchange)
|
||||
self.assertEqual(result['value'], {
|
||||
'name': partner2.name,
|
||||
'lines': [
|
||||
(5,),
|
||||
(1, line1.id, {'name': partner2.name,
|
||||
'partner': (partner2.id, partner2.name),
|
||||
'tags': [(5,)]}),
|
||||
(0, 0, {'name': partner2.name,
|
||||
'partner': (partner2.id, partner2.name),
|
||||
'tags': [(5,), (0, 0, {'name': 'Tag'})]}),
|
||||
],
|
||||
})
|
||||
self.assertEqual(result['value'], expected_new_tag_result)
|
||||
|
||||
# ensure ID is not returned when asked and a many2many record is set to be created
|
||||
self.env.cache.invalidate()
|
||||
|
||||
result = multi.onchange(values, 'partner', dict(field_onchange, **{'lines.tags.id': None}))
|
||||
self.assertEqual(result['value'], expected_new_tag_result)
|
||||
|
||||
def test_onchange_specific(self):
|
||||
""" test the effect of field-specific onchange method """
|
||||
@@ -308,8 +320,7 @@ class TestOnChange(common.TransactionCase):
|
||||
self.assertIn('participants', result['value'])
|
||||
self.assertItemsEqual(
|
||||
result['value']['participants'],
|
||||
[(5,)] + [(1, user.id, {'display_name': user.display_name})
|
||||
for user in discussion.participants + demo],
|
||||
[(5,)] + [(4, user.id) for user in discussion.participants + demo],
|
||||
)
|
||||
|
||||
def test_onchange_default(self):
|
||||
@@ -345,6 +356,8 @@ class TestOnChange(common.TransactionCase):
|
||||
self.assertEqual(len(discussion.messages), 3)
|
||||
messages = [(4, msg.id) for msg in discussion.messages]
|
||||
messages[0] = (1, messages[0][1], {'body': 'test onchange'})
|
||||
lines = ["%s:%s" % (m.name, m.body) for m in discussion.messages]
|
||||
lines[0] = "%s:%s" % (discussion.messages[0].name, 'test onchange')
|
||||
values = {
|
||||
'name': discussion.name,
|
||||
'moderator': demo.id,
|
||||
@@ -355,8 +368,7 @@ class TestOnChange(common.TransactionCase):
|
||||
}
|
||||
result = discussion.onchange(values, 'messages', field_onchange)
|
||||
self.assertIn('message_concat', result['value'])
|
||||
self.assertEqual(result['value']['message_concat'],
|
||||
"\n".join(["%s:%s" % (m.name, m.body) for m in discussion.messages]))
|
||||
self.assertEqual(result['value']['message_concat'], "\n".join(lines))
|
||||
|
||||
def test_onchange_one2many_with_domain_on_related_field(self):
|
||||
""" test the value of the one2many field when defined with a domain on a related field"""
|
||||
@@ -402,28 +414,15 @@ class TestOnChange(common.TransactionCase):
|
||||
'categories': [(4, cat.id) for cat in discussion.categories],
|
||||
'messages': [(4, msg.id) for msg in discussion.messages],
|
||||
'participants': [(4, usr.id) for usr in discussion.participants],
|
||||
'message_changes': 0,
|
||||
'important_messages': [(4, msg.id) for msg in discussion.important_messages],
|
||||
'important_emails': [(4, eml.id) for eml in discussion.important_emails],
|
||||
}
|
||||
self.env.cache.invalidate()
|
||||
result = discussion.onchange(values, 'name', field_onchange)
|
||||
|
||||
# When one2many domain contains non-computed field, things are ok
|
||||
self.assertEqual(result['value']['important_messages'],
|
||||
[(5,)] + [(4, msg.id) for msg in discussion.important_messages])
|
||||
|
||||
# But here with commit 5676d81, we get value of: [(2, email.id)]
|
||||
self.assertEqual(
|
||||
result['value']['important_emails'],
|
||||
[(5,),
|
||||
(1, email.id, {
|
||||
'name': u'[Foo Bar] %s' % USER.name,
|
||||
'body': email.body,
|
||||
'author': USER.name_get()[0],
|
||||
'important': True,
|
||||
'email_to': demo.email,
|
||||
'size': email.size,
|
||||
})]
|
||||
[(5,), (1, email.id, {'name': u'[Foo Bar] %s' % USER.name})],
|
||||
)
|
||||
|
||||
def test_onchange_related(self):
|
||||
|
||||
+106
-29
@@ -4972,28 +4972,114 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
if not all(name in self._fields for name in names):
|
||||
return {}
|
||||
|
||||
# filter out keys in field_onchange that do not refer to actual fields
|
||||
dotnames = []
|
||||
for dotname in field_onchange:
|
||||
try:
|
||||
model = self.browse()
|
||||
for name in dotname.split('.'):
|
||||
model = model[name]
|
||||
dotnames.append(dotname)
|
||||
except Exception:
|
||||
pass
|
||||
class PrefixTree(OrderedDict):
|
||||
""" A prefix tree for sequences of field names. The tree is a
|
||||
dictionary that associates each given field name to its
|
||||
corresponding subtree (in fields order)::
|
||||
|
||||
# tree corresponding to dotnames
|
||||
# ['name', 'line_ids.product_id', 'line_ids.tags_ids.name']
|
||||
{
|
||||
'name': {},
|
||||
'line_ids': {
|
||||
'product_id': {},
|
||||
'tags_ids': {
|
||||
'name': {},
|
||||
},
|
||||
},
|
||||
}
|
||||
"""
|
||||
def __init__(self, model, dotnames):
|
||||
super(PrefixTree, self).__init__()
|
||||
if not dotnames:
|
||||
return
|
||||
# group dotnames by prefix
|
||||
suffixes = defaultdict(list)
|
||||
for dotname in dotnames:
|
||||
names = dotname.split('.', 1)
|
||||
name_suffixes = suffixes[names[0]]
|
||||
if len(names) > 1:
|
||||
name_suffixes.append(names[1])
|
||||
# fill in self in fields order
|
||||
for name in model._fields:
|
||||
if name in suffixes:
|
||||
self[name] = PrefixTree(model[name], suffixes[name])
|
||||
|
||||
def dotnames(self):
|
||||
""" Iterate over the sequences of field names. """
|
||||
for name, subnames in self.items():
|
||||
yield name
|
||||
for dotname in subnames.dotnames():
|
||||
yield "%s.%s" % (name, dotname)
|
||||
|
||||
nametree = PrefixTree(self.browse(), field_onchange)
|
||||
dotnames = list(nametree.dotnames())
|
||||
|
||||
def snapshot(record, tree=nametree):
|
||||
""" Return a dict with the values of record, following nametree. """
|
||||
vals = {}
|
||||
for name, subnames in tree.items():
|
||||
if subnames:
|
||||
# x2many fields as {line: snapshot(line), ...}
|
||||
vals[name] = OrderedDict(
|
||||
(line, snapshot(line, subnames))
|
||||
for line in record[name]
|
||||
)
|
||||
else:
|
||||
vals[name] = record[name]
|
||||
return vals
|
||||
|
||||
def diff(record, old, new, tree=nametree):
|
||||
""" Return the values that differ between snapshots.
|
||||
The snapshot ``old`` may be empty (for new records).
|
||||
"""
|
||||
result = {}
|
||||
for name, subnames in tree.items():
|
||||
if name == 'id':
|
||||
continue
|
||||
if old and old[name] == new[name]:
|
||||
continue
|
||||
field = record._fields[name]
|
||||
if not subnames:
|
||||
result[name] = field.convert_to_onchange(new[name], record, {})
|
||||
continue
|
||||
# x2many fields: serialize value as commands
|
||||
result[name] = commands = [(5,)]
|
||||
old_val = old.get(name) or {}
|
||||
for line, vals in new[name].items():
|
||||
vals0 = (old_val.get(line) or snapshot(line, subnames)) if line.id else {}
|
||||
line_diff = diff(line, vals0, vals, subnames)
|
||||
if not line.id:
|
||||
commands.append((0, line.id.ref or 0, line_diff))
|
||||
elif line_diff:
|
||||
commands.append((1, line.id, line_diff))
|
||||
else:
|
||||
commands.append((4, line.id))
|
||||
return result
|
||||
|
||||
# prefetch x2many lines without data (for the initial snapshot)
|
||||
for name, subnames in nametree.items():
|
||||
if subnames and values.get(name):
|
||||
# retrieve all ids in commands, and read the expected fields
|
||||
line_ids = []
|
||||
for cmd in values[name]:
|
||||
if cmd[0] in (1, 4):
|
||||
line_ids.append(cmd[1])
|
||||
elif cmd[0] == 6:
|
||||
line_ids.extend(cmd[2])
|
||||
lines = self.browse()[name].browse(line_ids)
|
||||
lines.read(list(subnames), load='_classic_write')
|
||||
|
||||
# create a new record with values, and attach ``self`` to it
|
||||
with env.do_in_onchange():
|
||||
record = self.new(values)
|
||||
values = {name: record[name] for name in record._cache}
|
||||
values = {name: record[name] for name in nametree}
|
||||
# attach ``self`` with a different context (for cache consistency)
|
||||
record._origin = self.with_context(__onchange=True)
|
||||
|
||||
# load fields on secondary records, to avoid false changes
|
||||
# make a snapshot based on the initial values of record
|
||||
with env.do_in_onchange():
|
||||
for dotname in dotnames:
|
||||
record.mapped(dotname)
|
||||
before = snapshot(record)
|
||||
|
||||
# determine which field(s) should be triggered an onchange
|
||||
todo = list(names) or list(values)
|
||||
@@ -5012,7 +5098,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
record[name] = value
|
||||
|
||||
result = {}
|
||||
dirty = set()
|
||||
|
||||
# process names in order (or the keys of values if no name given)
|
||||
while todo:
|
||||
@@ -5038,22 +5123,14 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
field.type in ('one2many', 'many2many') and newval._is_dirty()
|
||||
):
|
||||
todo.append(name)
|
||||
dirty.add(name)
|
||||
|
||||
# determine subfields for field.convert_to_onchange() below
|
||||
Tree = lambda: defaultdict(Tree)
|
||||
subnames = Tree()
|
||||
for dotname in dotnames:
|
||||
subtree = subnames
|
||||
for name in dotname.split('.'):
|
||||
subtree = subtree[name]
|
||||
|
||||
# collect values from dirty fields
|
||||
# make a snapshot based on the final values of record
|
||||
with env.do_in_onchange():
|
||||
result['value'] = {
|
||||
name: self._fields[name].convert_to_onchange(record[name], record, subnames[name])
|
||||
for name in dirty
|
||||
}
|
||||
after = snapshot(record)
|
||||
|
||||
# determine values that have changed by comparing snapshots
|
||||
self.invalidate_cache()
|
||||
result['value'] = diff(record, before, after)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@ class FSWatcher(object):
|
||||
if isinstance(event, (FileCreatedEvent, FileModifiedEvent, FileMovedEvent)):
|
||||
if not event.is_directory:
|
||||
path = getattr(event, 'dest_path', event.src_path)
|
||||
if path.endswith('.py'):
|
||||
if path.endswith('.py') and not os.path.basename(path).startswith('.~'):
|
||||
try:
|
||||
source = open(path, 'rb').read() + b'\n'
|
||||
compile(source, path, 'exec')
|
||||
|
||||
@@ -107,8 +107,8 @@ _SAFE_OPCODES = _EXPR_OPCODES.union(set(opmap[x] for x in [
|
||||
'JUMP_FORWARD', 'JUMP_IF_TRUE', 'JUMP_IF_FALSE', 'JUMP_ABSOLUTE',
|
||||
# New in Python 2.7 - http://bugs.python.org/issue4715 :
|
||||
'JUMP_IF_FALSE_OR_POP', 'JUMP_IF_TRUE_OR_POP', 'POP_JUMP_IF_FALSE',
|
||||
'POP_JUMP_IF_TRUE', 'SETUP_EXCEPT', 'END_FINALLY', 'RAISE_VARARGS',
|
||||
'LOAD_NAME', 'STORE_NAME', 'DELETE_NAME', 'LOAD_ATTR',
|
||||
'POP_JUMP_IF_TRUE', 'SETUP_EXCEPT', 'SETUP_FINALLY', 'END_FINALLY',
|
||||
'RAISE_VARARGS', 'LOAD_NAME', 'STORE_NAME', 'DELETE_NAME', 'LOAD_ATTR',
|
||||
'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST', 'UNPACK_SEQUENCE',
|
||||
'LOAD_GLOBAL', # Only allows access to restricted globals
|
||||
] if x in opmap))
|
||||
|
||||
Reference in New Issue
Block a user