summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2026-01-08 04:39:54 +0000
committerIT Fixcomart <it@fixcomart.co.id>2026-01-08 04:39:54 +0000
commit32889edcb74b5ddc6a931ccb0df2681ff988a83f (patch)
tree1cc9916cab45f7afb00971fcb4c3dfde7e03dc14
parent5c332365e81cda9a7bdb233a31880c3bec1d1e0e (diff)
parentf5e9a57a021902317297eba2441a00b8968ba38c (diff)
Merged in print_picking_list (pull request #2)
Print picking list
-rwxr-xr-xfixco_custom/__manifest__.py1
-rw-r--r--fixco_custom/models/print_picking_list.py3
-rwxr-xr-xfixco_custom/models/stock_picking.py28
-rw-r--r--fixco_custom/models/stock_picking_print_picking_list.py4
-rwxr-xr-xfixco_custom/security/ir.model.access.csv3
-rw-r--r--fixco_custom/views/ir_sequence.xml10
-rw-r--r--fixco_custom/views/print_picking_list.xml4
-rw-r--r--fixco_custom/views/report_picking_list_new.xml177
8 files changed, 212 insertions, 18 deletions
diff --git a/fixco_custom/__manifest__.py b/fixco_custom/__manifest__.py
index 4925d69..c1aa655 100755
--- a/fixco_custom/__manifest__.py
+++ b/fixco_custom/__manifest__.py
@@ -51,6 +51,7 @@
'views/upload_cancel_picking.xml',
'views/queue_job.xml',
'views/purchase_order_multi_bills.xml',
+ 'views/report_picking_list_new.xml',
],
'demo': [],
'css': [],
diff --git a/fixco_custom/models/print_picking_list.py b/fixco_custom/models/print_picking_list.py
index 6998526..2b1605a 100644
--- a/fixco_custom/models/print_picking_list.py
+++ b/fixco_custom/models/print_picking_list.py
@@ -19,7 +19,7 @@ class PrintPickingList(models.Model):
vals['number'] = self.env['ir.sequence'].next_by_code('print.picking.list') or '0'
result = super(PrintPickingList, self).create(vals)
return result
-
+
class PrintPickingListLine(models.Model):
_name = 'print.picking.list.line'
_description = 'Print Picking List Line'
@@ -27,4 +27,3 @@ class PrintPickingListLine(models.Model):
print_picking_list_id = fields.Many2one('print.picking.list', string='Ref', required=True, ondelete='cascade', index=True, copy=False)
invoice_marketplace = fields.Char(string='Invoice Marketplace')
-
diff --git a/fixco_custom/models/stock_picking.py b/fixco_custom/models/stock_picking.py
index 7437ca5..76c2ecf 100755
--- a/fixco_custom/models/stock_picking.py
+++ b/fixco_custom/models/stock_picking.py
@@ -125,10 +125,10 @@ class StockPicking(models.Model):
origin = self.origin or ''
if any(prefix in origin for prefix in ['PO/', 'SO/']) and not self.check_product_lines and not self.name.startswith('BU/INT'):
raise UserError(_("Belum ada check product, gabisa validate"))
-
+
if self.name.startswith('BU/INT') and self.picking_type_code == 'internal' and self.env.user.id not in [10,15,2] and self.location_dest_id.id == 86:
raise UserError(_("Hanya bang rafly hanggara yang bisa validate"))
-
+
res = super(StockPicking, self).button_validate()
@@ -388,7 +388,7 @@ class StockPicking(models.Model):
if 'Blibli' in self.partner_id.name or 'BLIBLI' in self.partner_id.name:
self.get_shipping_parameter_blibli()
return
-
+
order_id = self.order_reference
authorization = self.sign_request(1)
@@ -569,7 +569,7 @@ class StockPicking(models.Model):
if 'Blibli' in self.partner_id.name or 'BLIBLI' in self.partner_id.name:
self.ship_order_blibli()
return
-
+
order_id = self.order_reference
authorization = self.sign_request(2) # index 2 -> ship-order
@@ -904,7 +904,7 @@ class StockPicking(models.Model):
except Exception as e:
raise UserError(_("Error: %s") % str(e))
-
+
def sign_request(self, array_num):
signData = '$'.join(['POST', Request_URI[array_num]]) + '$'
authorization = ACCESS_KEY + ':' + base64.b64encode(
@@ -1178,3 +1178,21 @@ class PickingReportCustom(models.AbstractModel):
'docs': pickings,
'was_printed_map': was_printed_map,
}
+
+class PickingReportCustomNew(models.AbstractModel):
+ _name = 'report.fixco_custom.report_picking_list_custom_new'
+ _description = 'asjdkla'
+
+ def _get_report_values(self, docids, data=None):
+ pickings = self.env['stock.picking'].browse(docids)
+
+ was_printed_map = {p.id: p.is_printed for p in pickings}
+
+ pickings.write({'is_printed': True})
+
+ return {
+ 'doc_ids': docids,
+ 'doc_model': 'stock.picking',
+ 'docs': pickings,
+ 'was_printed_map': was_printed_map,
+ }
diff --git a/fixco_custom/models/stock_picking_print_picking_list.py b/fixco_custom/models/stock_picking_print_picking_list.py
index 7cc7995..13b27b1 100644
--- a/fixco_custom/models/stock_picking_print_picking_list.py
+++ b/fixco_custom/models/stock_picking_print_picking_list.py
@@ -11,7 +11,7 @@ class StockPickingPrintPickingList(models.TransientModel):
raise UserError("No stock picking selected.")
pickings = self.env['stock.picking'].browse(picking_ids)
-
+
print_picking_list = self.env['print.picking.list'].create({})
for picking in pickings:
@@ -27,5 +27,3 @@ class StockPickingPrintPickingList(models.TransientModel):
'res_id': print_picking_list.id,
'target': 'current',
}
-
-
diff --git a/fixco_custom/security/ir.model.access.csv b/fixco_custom/security/ir.model.access.csv
index a0ac394..91c309e 100755
--- a/fixco_custom/security/ir.model.access.csv
+++ b/fixco_custom/security/ir.model.access.csv
@@ -38,6 +38,7 @@ access_invoice_reklas,access.invoice.reklas,model_invoice_reklas,,1,1,1,1
access_uangmuka_pembelian,access.uangmuka.pembelian,model_uangmuka_pembelian,,1,1,1,1
access_coretax_faktur,access.coretax.faktur,model_coretax_faktur,,1,1,1,1
access_report.fixco_custom.report_picking_list_custom,access.report.fixco_custom.report_picking_list_custom,model_report_fixco_custom_report_picking_list_custom,,1,1,1,1
+access_report.fixco_custom.report_picking_list_custom_new,access.report.fixco_custom.report_picking_list_custom_new,model_report_fixco_custom_report_picking_list_custom_new,,1,1,1,1
access_token_log,access.token.log,model_token_log,,1,1,1,1
access_purchase_pricelist_wizard,purchase.pricelist.wizard,model_purchase_pricelist_wizard,,1,1,1,1
access_stock_return_picking,stock.return.picking,model_stock_return_picking,,1,1,1,1
@@ -45,4 +46,4 @@ access_stock_return_picking_line,stock.return.picking.line,model_stock_return_pi
access_upload_cancel_picking,access.upload.cancel.picking,model_upload_cancel_picking,,1,1,1,1
access_upload_cancel_picking_line,access.upload.cancel.picking.line,model_upload_cancel_picking_line,,1,1,1,1
access_queue_job,access.queue.job,model_queue_job,,1,1,1,1
-access_purchase_order_multi_bills,access.purchase.order.multi_bills,model_purchase_order_multi_bills,,1,1,1,1 \ No newline at end of file
+access_purchase_order_multi_bills,access.purchase.order.multi_bills,model_purchase_order_multi_bills,,1,1,1,1
diff --git a/fixco_custom/views/ir_sequence.xml b/fixco_custom/views/ir_sequence.xml
index e4845f7..59572d2 100644
--- a/fixco_custom/views/ir_sequence.xml
+++ b/fixco_custom/views/ir_sequence.xml
@@ -11,7 +11,7 @@
<field name="number_increment">1</field>
<field name="company_id">4</field>
</record>
-
+
<record id="sequence_upload_payments" model="ir.sequence">
<field name="name">Upload Payments</field>
<field name="code">upload.payments</field>
@@ -33,7 +33,7 @@
<field name="number_increment">1</field>
<field name="company_id">4</field>
</record>
-
+
<record id="sequence_shipment_group" model="ir.sequence">
<field name="name">Shipment Group</field>
<field name="code">shipment.group</field>
@@ -44,7 +44,7 @@
<field name="number_increment">1</field>
<field name="company_id">4</field>
</record>
-
+
<record id="sequence_print_picking_list" model="ir.sequence">
<field name="name">Print Picking List</field>
<field name="code">print.picking.list</field>
@@ -53,7 +53,7 @@
<field name="padding">5</field>
<field name="number_next">1</field>
<field name="number_increment">1</field>
- <field name="company_id">4</field>
+ <!-- <field name="company_id">4</field> -->
</record>
<record id="sequence_automatic_purchase" model="ir.sequence">
@@ -78,4 +78,4 @@
<field name="company_id">4</field>
</record>
</data>
-</odoo> \ No newline at end of file
+</odoo>
diff --git a/fixco_custom/views/print_picking_list.xml b/fixco_custom/views/print_picking_list.xml
index a6a33b5..fe826d0 100644
--- a/fixco_custom/views/print_picking_list.xml
+++ b/fixco_custom/views/print_picking_list.xml
@@ -28,12 +28,12 @@
<sheet>
<group>
<group>
- <field name="number" readonly="1"/>
+ <field name="number" readonly="1"/>
</group>
</group>
<notebook>
<page string="Line">
- <field name="print_picking_list_line"/>
+ <field name="print_picking_list_line"/>
</page>
</notebook>
</sheet>
diff --git a/fixco_custom/views/report_picking_list_new.xml b/fixco_custom/views/report_picking_list_new.xml
new file mode 100644
index 0000000..a91be31
--- /dev/null
+++ b/fixco_custom/views/report_picking_list_new.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+ <data>
+ <record id="action_print_picking_list_new" model="ir.actions.report">
+ <field name="name">Print Picking List new</field>
+ <field name="model">stock.picking</field>
+ <field name="report_type">qweb-pdf</field>
+ <field
+ name="report_name"
+ >fixco_custom.report_picking_list_custom_new</field>
+ <field
+ name="report_file"
+ >fixco_custom.report_picking_list_custom_new</field>
+ <field
+ name="print_report_name"
+ >'Print Picking List new- %s - %s' % (object.partner_id.name or '', object.name)</field>
+ <!-- <field
+ name="print_report_name"
+ >'ktl'</field> -->
+ <field name="binding_model_id" ref="model_stock_picking" />
+ <field name="binding_type">report</field>
+ </record>
+ <template id="report_picking_list_custom_new">
+ <t t-call="web.html_container">
+ <style>
+ .picking-page {
+ page-break-after: always;
+ }
+
+ .picking-page:last-child {
+ page-break-after: auto;
+ }
+
+ table {
+ page-break-inside: auto;
+ }
+
+ tr {
+ page-break-inside: avoid;
+ page-break-after: auto;
+ }
+
+ thead {
+ display: table-header-group;
+ }
+
+ tfoot {
+ display: table-footer-group;
+ }
+ </style>
+
+ <t t-foreach="docs" t-as="o">
+ <div class="picking-page">
+ <div class="page" style="font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto;">
+ <t t-set="duplicate_stamp">
+ data:image/jpeg;base64,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
+ </t>
+ <!-- DUPLICATE WATERMARK IMG -->
+
+ <!-- Main Header -->
+ <div style="text-align: center; margin-bottom: 15px;">
+ <!-- Barcode -->
+ <div style="text-center: center; margin-bottom: 10px;">
+ <img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' % ('QR', o.name, 100, 100)"
+ style="width:250px;height:250px;" alt="QR Code"/>
+ </div>
+ <t t-if="was_printed_map.get(o.id)">
+ <div style="
+ position: absolute;
+ left: 25%;
+ right: 150%;
+ bottom: 500%;
+ top: 30%;
+ width: 500px;
+ height: 500px;
+ transform: translate(-50%, -50%) rotate(-20deg);
+ opacity: 0.50;
+ z-index: 9999;
+ pointer-events: none;
+ ">
+ <img t-att-src="duplicate_stamp" style="width:50%; height:50%;" />
+ </div>
+ </t>
+ <h1 style="margin: 0; font-size: 24px; font-weight: bold;" t-field="o.name"/>
+ <div style="font-size: 18px; font-weight: bold; margin-top: 5px;">
+ Web Service
+ </div>
+
+ </div>
+
+ <!-- Order Information -->
+ <div style="display: flex; justify-content: space-between; margin-bottom: 20px; border-bottom: 1px solid #000; padding-bottom: 10px;">
+ <div>
+ <strong>Order:</strong>
+ <span t-field="o.origin"/>
+ </div>
+ <div>
+ <strong>Scheduled Date:</strong>
+ <span t-field="o.scheduled_date" t-options='{"format": "dd MMM yyyy HH:mm:ss"}'/>
+ </div>
+ <div>
+ <strong>Carrier:</strong>
+ <span t-field="o.carrier"/>
+ </div>
+ </div>
+
+ <!-- Product Table -->
+ <table style="width: 100%; border-collapse: collapse; margin-bottom: 30px;" class="product-table">
+ <thead>
+ <tr style="border-bottom: 2px solid #000;">
+ <th style="width: 5%; text-align: left; padding: 8px 5px;">No</th>
+ <th style="width: 40%; text-align: left; padding: 8px 5px;">Nama Product</th>
+ <th style="width: 10%; text-align: center; padding: 8px 5px;">Demand</th>
+ <th style="width: 10%; text-align: center; padding: 8px 5px;">Reserved</th>
+ <th style="width: 20%; text-align: left; padding: 8px 5px;">Location</th>
+ <th style="width: 15%; text-align: left; padding: 8px 5px;">Uom</th>
+ </tr>
+ </thead>
+ <tbody>
+ <t t-set="counter" t-value="0"/>
+ <t t-foreach="o.move_ids_without_package" t-as="move">
+ <t t-set="counter" t-value="counter + 1"/>
+ <tr style="border-bottom: 1px solid #ddd;">
+ <td style="padding: 8px 5px; vertical-align: top;"><t t-esc="counter"/></td>
+ <td style="padding: 8px 5px; vertical-align: top;">
+ <div style="font-weight: bold;">
+ [<span t-field="move.product_id.default_code"/>]
+ </div>
+ <div style="margin-top: 3px;">
+ <span t-field="move.product_id.name"/>
+ </div>
+ </td>
+ <td style="text-align: center; padding: 8px 5px; vertical-align: top;">
+ <t t-esc="int(move.product_uom_qty if move.product_uom_qty else 0)"/>
+ </td>
+ <td style="text-align: center; padding: 8px 5px; vertical-align: top;">
+ <t t-esc="int(move.reserved_availability if move.reserved_availability > 0 else 0)"/>
+ </td>
+ <td style="padding: 8px 5px; vertical-align: top;">
+ <span t-field="move.location_id.name"/>
+ </td>
+ <td style="padding: 8px 5px; vertical-align: top;">
+ <span t-field="move.product_uom.name"/>
+ </td>
+ </tr>
+ </t>
+ </tbody>
+ </table>
+
+ <!-- Footer Information -->
+ <div style="display: flex; justify-content: space-between; border-top: 1px solid #000; padding-top: 15px;">
+ <div style="font-weight: bold;">
+ Total Qty:
+ <t t-set="total_qty" t-value="0"/>
+ <t t-foreach="o.move_ids_without_package" t-as="move">
+ <t t-set="total_qty" t-value="total_qty + (move.product_uom_qty or 0)"/>
+ </t>
+ <t t-esc="total_qty"/>
+ </div>
+ <div style="font-weight: bold;">
+ Jumlah Barang:
+ <t t-esc="counter"/>
+ </div>
+ </div>
+
+ <!-- Notes Section -->
+ <div t-if="o.note" style="margin-top: 30px; padding: 10px; border: 1px solid #ddd; background-color: #f9f9f9;">
+ <strong>Catatan:</strong>
+ <p t-field="o.note"/>
+ </div>
+ </div>
+ </div>
+ </t>
+ </t>
+ </template>
+ </data>
+ </odoo>