[imp] first version of EKG delivery slip

This commit is contained in:
Niels Göttsch 2024-05-02 17:00:44 +02:00
parent bf4a8b954e
commit a7308a8792
13 changed files with 739 additions and 0 deletions

62
nfu_ekg_stock/README.rst Normal file
View file

@ -0,0 +1,62 @@
=============
NFU EKG Stock
=============
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:4dfaea54e4d01502b433eb5c0dcca409a5fbe2c3f175e29382a19230343183c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-bruecksen%2Fife_nfu-lightgray.png?logo=github
:target: https://github.com/bruecksen/ife_nfu/tree/16.0/nfu_ekg_stock
:alt: bruecksen/ife_nfu
|badge1| |badge2| |badge3|
This module adds EKG-specific stock c functionalities for the "Nachschub für uns"-Project
- small delivery slips
**Table of contents**
.. contents::
:local:
Changelog
=========
:1.0.0: Initial module.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/bruecksen/ife_nfu/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/bruecksen/ife_nfu/issues/new?body=module:%20nfu_ekg_stock%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* BAKEUP
Maintainers
~~~~~~~~~~~
This module is part of the `bruecksen/ife_nfu <https://github.com/bruecksen/ife_nfu/tree/16.0/nfu_ekg_stock>`_ project on GitHub.
You are welcome to contribute.

View file

@ -0,0 +1 @@
from . import models

View file

@ -0,0 +1,13 @@
{
"name": "NFU EKG Stock",
"summary": "NFU EKG Stock Improvements",
"author": "BAKEUP",
"website": "https://www.bakeup.org",
"category": "Stock",
"version": "16.0.1.0.1",
"depends": ["stock"],
"data": ["views/report_deliveryslip.xml", "report/stock_report_views.xml"],
"assets": {"web.report_assets_common": ["nfu_ekg_stock/static/src/scss/report_stock_rule.scss"]},
"license": "LGPL-3",
"application": True,
}

View file

View file

@ -0,0 +1 @@
Niels Göttsch <niels@ziemlichoptimal.de>

View file

@ -0,0 +1,2 @@
This module adds EKG-specific stock c functionalities for the "Nachschub für uns"-Project
- small delivery slips

View file

@ -0,0 +1,2 @@
:1.0.0: Initial module.

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_report_ekg_delivery" model="ir.actions.report">
<field name="name">EKG Delivery Slip</field>
<field name="model">stock.picking</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">nfu_ekg_stock.report_ekg_deliveryslip</field>
<field name="report_file">nfu_ekg_stock.report_ekg_deliveryslip</field>
<field
name="print_report_name"
>'EKG Delivery Slip - %s - %s' % (object.partner_id.name or '', object.name)</field>
<field name="binding_model_id" ref="stock.model_stock_picking"/>
<field name="binding_type">report</field>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,422 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>NFU EKG Stock</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="nfu-ekg-stock">
<h1 class="title">NFU EKG Stock</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:4dfaea54e4d01502b433eb5c0dcca409a5fbe2c3f175e29382a19230343183c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/bruecksen/ife_nfu/tree/16.0/nfu_ekg_stock"><img alt="bruecksen/ife_nfu" src="https://img.shields.io/badge/github-bruecksen%2Fife_nfu-lightgray.png?logo=github" /></a></p>
<p>This module adds EKG-specific stock c functionalities for the “Nachschub für uns”-Project
- small delivery slips</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#changelog" id="toc-entry-1">Changelog</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#toc-entry-1">Changelog</a></h1>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field"><th class="field-name">1.0.0:</th><td class="field-body">Initial module.</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/bruecksen/ife_nfu/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/bruecksen/ife_nfu/issues/new?body=module:%20nfu_ekg_stock%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>BAKEUP</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h2>
<p>This module is part of the <a class="reference external" href="https://github.com/bruecksen/ife_nfu/tree/16.0/nfu_ekg_stock">bruecksen/ife_nfu</a> project on GitHub.</p>
<p>You are welcome to contribute.</p>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,11 @@
td.fit {
width: 0;
white-space: nowrap;
min-width: fit-content;
}
.scissors {
width: 100%;
border-top: 3px dashed black;
margin-top: -3px;
}

View file

@ -0,0 +1,210 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template id="report_ekg_delivery_document">
<t t-set="o" t-value="o.with_context(lang=o._get_report_lang())"/>
<t t-set="partner" t-value="o.partner_id or (o.move_ids and o.move_ids[0].partner_id) or False"/>
<div class="scissors"/>
<div class="page" style="page-break-inside: avoid;">
<div class="row mt32">
<div class="col-auto" name="div_name">
<strong>Name:</strong> <span t-field="partner.name"/>
</div>
<div t-if="o.note" class="col-auto" name="div_note">
<span t-field="o.note"/>
</div>
</div>
<table class="table table-sm" t-if="o.state!='done'" name="stock_move_table">
<thead>
<tr>
<th name="th_sm_product"><strong>Product</strong></th>
<th name="th_sm_ordered"><strong>Ordered</strong></th>
<th name="th_sm_quantity"><strong>Delivered</strong></th>
</tr>
</thead>
<tbody>
<t t-set="lines" t-value="o.move_ids.filtered(lambda x: x.product_uom_qty)"/>
<tr t-foreach="lines" t-as="move">
<td class="fit">
<span t-field="move.product_uom_qty"/>
<span t-field="move.product_uom"/>
</td>
<td>
<span t-field="move.product_id"/>
<p
t-if="move.description_picking != move.product_id.name and move.description_picking != move.product_id.display_name"
>
<span t-field="move.description_picking"/>
</p>
</td>
<td>
<span t-field="move.quantity_done"/>
<span t-field="move.product_uom"/>
</td>
</tr>
</tbody>
</table>
<table
class="table table-sm mt48"
t-if="o.move_line_ids and o.state=='done'"
name="stock_move_line_table"
>
<t t-set="has_serial_number" t-value="False"/>
<t
t-set="has_serial_number"
t-value="o.move_line_ids.mapped('lot_id')"
groups="stock.group_lot_on_delivery_slip"
/>
<thead>
<tr>
<th name="th_sml_product"><strong>Product</strong></th>
<t name="lot_serial" t-if="has_serial_number">
<th>
Lot/Serial Number
</th>
</t>
<th name="th_sml_qty_ordered" class="text-center" t-if="not has_serial_number">
<strong>Ordered</strong>
</th>
<th name="th_sml_quantity" class="text-center"><strong>Delivered</strong></th>
</tr>
</thead>
<tbody>
<!-- This part gets complicated with different use cases (additional use cases in extensions of this report):
1. If serial numbers are used and set to print on delivery slip => print lines as is, otherwise group them by overlapping
product + description + uom combinations
2. If any packages are assigned => split products up by package (or non-package) and then apply use case 1 -->
<!-- If has destination packages => create sections of corresponding products -->
<t t-if="o.has_packages" name="has_packages">
<t t-set="packages" t-value="o.move_line_ids.mapped('result_package_id')"/>
<t t-foreach="packages" t-as="package">
<t t-call="stock.stock_report_delivery_package_section_line"/>
<t
t-set="package_move_lines"
t-value="o.move_line_ids.filtered(lambda l: l.result_package_id == package)"
/>
<!-- If printing lots/serial numbers => keep products in original lines -->
<t t-if="has_serial_number">
<tr t-foreach="package_move_lines" t-as="move_line">
<t t-call="stock.stock_report_delivery_has_serial_move_line"/>
</tr>
</t>
<!-- If not printing lots/serial numbers => merge lines with same product+description+uom -->
<t t-else="">
<t
t-set="aggregated_lines"
t-value="package_move_lines._get_aggregated_product_quantities(strict=True)"
/>
<t t-call="stock.stock_report_delivery_aggregated_move_lines"/>
</t>
</t>
<!-- Make sure we do another section for package-less products if they exist -->
<t
t-set="move_lines"
t-value="o.move_line_ids.filtered(lambda l: not l.result_package_id)"
/>
<t
t-set="aggregated_lines"
t-value="o.move_line_ids._get_aggregated_product_quantities(except_package=True)"
/>
<t t-if="move_lines or aggregated_lines" name="no_package_move_lines">
<t
t-call="stock.stock_report_delivery_no_package_section_line"
name="no_package_section"
/>
<t t-if="has_serial_number">
<tr t-foreach="move_lines" t-as="move_line">
<t t-call="stock.stock_report_delivery_has_serial_move_line"/>
</tr>
</t>
<t t-elif="aggregated_lines">
<t t-call="stock.stock_report_delivery_aggregated_move_lines"/>
</t>
</t>
</t>
<!-- No destination packages -->
<t t-else="">
<!-- If printing lots/serial numbers => keep products in original lines -->
<t t-if="has_serial_number">
<tr t-foreach="o.move_line_ids" t-as="move_line">
<t t-call="stock.stock_report_delivery_has_serial_move_line"/>
</tr>
</t>
<!-- If not printing lots/serial numbers => merge lines with same product -->
<t t-else="" name="aggregated_move_lines">
<t
t-set="aggregated_lines"
t-value="o.move_line_ids._get_aggregated_product_quantities()"
/>
<t t-call="stock.stock_report_delivery_aggregated_move_lines"/>
</t>
</t>
</tbody>
</table>
<t
t-set="backorders"
t-value="o.backorder_ids.filtered(lambda x: x.state not in ('done', 'cancel'))"
/>
<t t-if="o.backorder_ids and backorders">
<p class="mt-5">
<span>Remaining quantities not yet delivered:</span>
</p>
<table class="table table-sm" name="stock_backorder_table" style="table-layout: fixed;">
<thead>
<tr>
<th name="th_sb_product"><strong>Product</strong></th>
<th/>
<th name="th_sb_quantity" class="text-center"><strong>Quantity</strong></th>
</tr>
</thead>
<tbody>
<t t-foreach="backorders" t-as="backorder">
<t
t-set="bo_lines"
t-value="backorder.move_ids.filtered(lambda x: x.product_uom_qty)"
/>
<tr t-foreach="bo_lines" t-as="bo_line">
<td class="w-auto">
<span t-field="bo_line.product_id"/>
<p
t-if="bo_line.description_picking != bo_line.product_id.name and bo_line.description_picking != bo_line.product_id.display_name"
>
<span t-field="bo_line.description_picking"/>
</p>
</td>
<td/>
<td class="text-center w-auto">
<span t-field="bo_line.product_uom_qty"/>
<span t-field="bo_line.product_uom"/>
</td>
</tr>
</t>
</tbody>
</table>
</t>
<div t-if="o.signature" class="mt32 ml64 mr4" name="signature">
<div class="offset-8">
<strong>Signature</strong>
</div>
<div class="offset-8">
<img t-att-src="image_data_uri(o.signature)" style="max-height: 4cm; max-width: 8cm;"/>
</div>
<div class="offset-8 text-center">
<p t-field="o.partner_id.name"/>
</div>
</div>
</div>
</template>
<template id="report_ekg_deliveryslip">
<t t-call="web.html_container">
<t t-call="web.basic_layout">
<t t-foreach="docs" t-as="o">
<t t-call="nfu_ekg_stock.report_ekg_delivery_document" t-lang="o._get_report_lang()"/>
</t>
</t>
</t>
</template>
</odoo>