diff --git a/wizard/pos_export_bc_wizard.py b/wizard/pos_export_bc_wizard.py index 51e307a..f425d69 100644 --- a/wizard/pos_export_bc_wizard.py +++ b/wizard/pos_export_bc_wizard.py @@ -20,6 +20,12 @@ class PosExportBcWizard(models.TransientModel): end_date = fields.Date(string="End Date", required=True, default=fields.Date.context_today) def action_export_bc(self): + return self._generate_export(old_format=False) + + def action_export_old_popcorn(self): + return self._generate_export(old_format=True) + + def _generate_export(self, old_format=False): self.ensure_one() if not xlsxwriter: raise UserError(_("The Python library 'xlsxwriter' is required. Please install it.")) @@ -44,15 +50,21 @@ class PosExportBcWizard(models.TransientModel): date_time_format = workbook.add_format({'num_format': 'dd-mm-yyyy hh:mm:ss'}) number_format = workbook.add_format({'num_format': '#,##0.00'}) - headers = [ - "No", "Date", "Outlet", "Table/Customer", "Invoice", "Category", "SKU", "Product", "Quantity", - "Price Type", "Price", "Price Cut", "Subtotal", "Discount", "Tax", "Service", "Takeaway Charge", - "Packaging Fee", "Rounding", "Charge", "Paid", "Pax", "Paid At", "Return", "Refund", "Payment", - "Note", "Dinein", "User", "Promo", "Order from", "Nama Penerima", "Alamat Penerima", "Link Maps" - ] + if old_format: + headers = [ + "No", "Date", "Outlet", "Table/Customer", "Invoice", "Category", "SKU", "Product", "Quantity", + "Price Type", "Price", "Price Cut", "Subtotal", "Discount", "Tax", "Service", "Rounding", + "Charge", "Paid", "Pax", "Return", "Refund", "Payment", "Note", "Dinein", "User" + ] + else: + headers = [ + "No", "Date", "Outlet", "Table/Customer", "Invoice", "Category", "SKU", "Product", "Quantity", + "Price Type", "Price", "Price Cut", "Subtotal", "Discount", "Tax", "Service", "Takeaway Charge", + "Packaging Fee", "Rounding", "Charge", "Paid", "Pax", "Paid At", "Return", "Refund", "Payment", + "Note", "Dinein", "User", "Promo", "Order from", "Nama Penerima", "Alamat Penerima", "Link Maps" + ] # Datetime timezone conversion - # We need these in UTC for the domain search user_tz_str = self.env.user.tz or 'UTC' user_tz = pytz.timezone(user_tz_str) @@ -66,8 +78,8 @@ class PosExportBcWizard(models.TransientModel): sheet = workbook.add_worksheet(sheet_name) # Title - sheet.merge_range('A1:AF1', 'MIE MAPAN', title_format) - sheet.merge_range('A2:AF2', 'INVOICES', subtitle_format) + sheet.merge_range('A1:Z1' if old_format else 'A1:AF1', 'MIE MAPAN', title_format) + sheet.merge_range('A2:Z2' if old_format else 'A2:AF2', 'INVOICES', subtitle_format) # Period start_dt_str = start_datetime.strftime('%d-%m-%Y 00:00') @@ -87,7 +99,7 @@ class PosExportBcWizard(models.TransientModel): for order in orders: if 'refund_orders_count' in order._fields and order.refund_orders_count > 0: continue - + local_date = order.date_order.replace(tzinfo=pytz.UTC).astimezone(user_tz) if order.date_order else False outlet = order.config_id.name or '' @@ -101,9 +113,6 @@ class PosExportBcWizard(models.TransientModel): discount_order = sum(abs(l.price_subtotal) for l in order.lines if l.price_unit < 0) tax = order.amount_tax charge = order.amount_total - # In Odoo, payment amount can be negative for change. - # To get the total amount tendered before change, we sum only the positive payments. - # The change/return is typically stored in order.amount_return paid = sum(p.amount for p in order.payment_ids if p.amount > 0) if paid == 0: continue @@ -112,8 +121,6 @@ class PosExportBcWizard(models.TransientModel): payment_methods = ', '.join(order.payment_ids.mapped('payment_method_id.name')) note = order.note if 'note' in order._fields else '' - # dinein = 'dinein' if table else 'takeaway' - # preset = order.preset_id.name if 'table_id' in order._fields and order.table_id: dinein = "dinein" else: @@ -153,26 +160,38 @@ class PosExportBcWizard(models.TransientModel): sheet.write(row_num, 13, discount_order, number_format) sheet.write(row_num, 14, tax, number_format) sheet.write(row_num, 15, 0, number_format) # Service - sheet.write(row_num, 16, 0, number_format) # Takeaway Charge - sheet.write(row_num, 17, 0, number_format) # Packaging Fee - sheet.write(row_num, 18, 0, number_format) # Rounding - sheet.write(row_num, 19, charge, number_format) - sheet.write(row_num, 20, paid, number_format) - sheet.write(row_num, 21, pax) - if local_date: - date_str = local_date.strftime('%d-%m-%Y %H:%M:%S') - sheet.write_string(row_num, 22, date_str) - sheet.write(row_num, 23, return_amt, number_format) - sheet.write(row_num, 24, 0, number_format) # Refund - sheet.write(row_num, 25, payment_methods) - sheet.write(row_num, 26, note) - sheet.write(row_num, 27, dinein) - sheet.write(row_num, 28, user) - sheet.write(row_num, 29, "") # Promo - sheet.write(row_num, 30, "cashier") # Order from - sheet.write(row_num, 31, "") - sheet.write(row_num, 32, "") - sheet.write(row_num, 33, "") + if old_format: + sheet.write(row_num, 16, 0, number_format) # Rounding + sheet.write(row_num, 17, charge, number_format) + sheet.write(row_num, 18, paid, number_format) + sheet.write(row_num, 19, pax) + sheet.write(row_num, 20, return_amt, number_format) + sheet.write(row_num, 21, 0, number_format) # Refund + sheet.write(row_num, 22, payment_methods) + sheet.write(row_num, 23, note) + sheet.write(row_num, 24, dinein) + sheet.write(row_num, 25, user) + else: + sheet.write(row_num, 16, 0, number_format) # Takeaway Charge + sheet.write(row_num, 17, 0, number_format) # Packaging Fee + sheet.write(row_num, 18, 0, number_format) # Rounding + sheet.write(row_num, 19, charge, number_format) + sheet.write(row_num, 20, paid, number_format) + sheet.write(row_num, 21, pax) + if local_date: + date_str = local_date.strftime('%d-%m-%Y %H:%M:%S') + sheet.write_string(row_num, 22, date_str) + sheet.write(row_num, 23, return_amt, number_format) + sheet.write(row_num, 24, 0, number_format) # Refund + sheet.write(row_num, 25, payment_methods) + sheet.write(row_num, 26, note) + sheet.write(row_num, 27, dinein) + sheet.write(row_num, 28, user) + sheet.write(row_num, 29, "") # Promo + sheet.write(row_num, 30, "cashier") # Order from + sheet.write(row_num, 31, "") + sheet.write(row_num, 32, "") + sheet.write(row_num, 33, "") is_first_line = False @@ -188,11 +207,20 @@ class PosExportBcWizard(models.TransientModel): company = self.env.company company_ident = (company.company_registry or company.name or '').upper().replace(' ', '') - company_ident = company_ident[:14] # Limit to ensure total name is <= 40 characters + + # Max length logic + # For old_format: len("POS__YYMMDD_to_YYMMDD_OLD.xlsx") = 30 chars -> leaves 10 chars for company_ident + # For new_format: len("POS__YYMMDD_to_YYMMDD.xlsx") = 26 chars -> leaves 14 chars for company_ident + company_len = 10 if old_format else 14 + company_ident = company_ident[:company_len] start_str = self.start_date.strftime('%y%m%d') end_str = self.end_date.strftime('%y%m%d') - file_name = f"POS_{company_ident}_{start_str}_to_{end_str}.xlsx" + + if old_format: + file_name = f"POS_{company_ident}_{start_str}_to_{end_str}_OLD.xlsx" + else: + file_name = f"POS_{company_ident}_{start_str}_to_{end_str}.xlsx" # Save as an ir.attachment and return action to download attachment = self.env['ir.attachment'].create({ diff --git a/wizard/pos_export_bc_wizard_views.xml b/wizard/pos_export_bc_wizard_views.xml index e5ee376..53007eb 100644 --- a/wizard/pos_export_bc_wizard_views.xml +++ b/wizard/pos_export_bc_wizard_views.xml @@ -18,6 +18,7 @@