diff options
| author | Azka Nathan <darizkyfaz@gmail.com> | 2024-07-25 15:44:26 +0700 |
|---|---|---|
| committer | Azka Nathan <darizkyfaz@gmail.com> | 2024-07-25 15:44:26 +0700 |
| commit | 34e3cc9c3307be1eacdc8744d377f03689aea0a7 (patch) | |
| tree | 44f3b44da4fa04e7da940f2ac09f681f70ee8b88 | |
| parent | c0a913efe390bad9dde397dd1627b3baf682a8f9 (diff) | |
email reminder cekout
| -rw-r--r-- | indoteknik_custom/models/website_user_cart.py | 82 | ||||
| -rwxr-xr-x | indoteknik_custom/views/website_user_cart.xml | 163 |
2 files changed, 207 insertions, 38 deletions
diff --git a/indoteknik_custom/models/website_user_cart.py b/indoteknik_custom/models/website_user_cart.py index bbff6035..793dda0b 100644 --- a/indoteknik_custom/models/website_user_cart.py +++ b/indoteknik_custom/models/website_user_cart.py @@ -1,5 +1,5 @@ from odoo import fields, models - +from datetime import datetime, timedelta class WebsiteUserCart(models.Model): _name = 'website.user.cart' @@ -15,6 +15,7 @@ class WebsiteUserCart(models.Model): ('buy', 'Buy') ], 'Source', default='add_to_cart') user_other_carts = fields.One2many('website.user.cart', 'id', 'Other Products', compute='_compute_user_other_carts') + is_reminder = fields.Boolean(string='Reminder?') def _compute_user_other_carts(self): for record in self: @@ -129,10 +130,83 @@ class WebsiteUserCart(models.Model): } return result - def action_mail_reminder_to_checkout(self, id): - template = self.env.ref('indoteknik_custom.mail_template_user_cart_reminder_to_checkout') - template.send_mail(int(id), force_send=True) + def action_mail_reminder_to_checkout(self): + # user_ids = self.search([]).mapped('user_id') + + user_ids = [101] + for user in user_ids: + latest_cart = self.search([('user_id', '=', user), ('is_reminder', '=', False)], order='create_date desc', limit=1) + + carts_to_remind = self.search([('user_id', '=', user)]) + if latest_cart and not latest_cart.is_reminder: + for cart in carts_to_remind: + if not cart.program_line_id: + cart.is_selected = True + cart.is_reminder = True + template = self.env.ref('indoteknik_custom.mail_template_user_cart_reminder_to_checkout') + template.send_mail(latest_cart.id, force_send=True) + + def calculate_discount(self, user_id): + carts = self.search([('user_id', '=', user_id)]) + voucher = self.env['voucher'].browse(146) + total_discount = 0.01 + total_voucher = 0.0 + subtotal_website = 0.0 + + for cart in carts: + product_manufacture = cart.product_id.x_manufacture.id + product_price = cart.get_price_website(cart.product_id.id) + subtotal = product_price['price'] * cart.qty + subtotal_website += product_price['price'] + discount_amount = 0.0 + for line in voucher.voucher_line: + if line.manufacture_id.id == product_manufacture: + discount_amount = line.discount_amount + break + + if discount_amount > 0 and subtotal > 0: + product_discount = subtotal - (subtotal * (discount_amount / 100.0)) + voucher_product = subtotal * (discount_amount / 100.0) + total_discount += product_discount + total_voucher += voucher_product + + if total_discount > 0: + ppn = total_discount * 0.11 + return { + 'total_discount': self.format_currency(total_discount), + 'total_voucher': self.format_currency(total_voucher), + 'subtotal_website': self.format_currency(subtotal_website), + 'ppn': self.format_currency(ppn), + 'grand_total': self.format_currency(total_discount + ppn) + } + return self.format_currency(0.0) + + def get_data_promo(self, program_line_id): + program_line_product = self.env['promotion.product'].search([ + ('program_line_id', '=', program_line_id) + ]) + return program_line_product + + def get_price_website(self, product_id): + price_website = self.env['product.pricelist.item'].search([('product_id', '=', product_id), ('pricelist_id', '=', 17022)], limit=1) + + price_tier = self.env['product.pricelist.item'].search([('product_id', '=', product_id), ('pricelist_id', '=', 17023)], limit=1) + + fixed_price = price_website.fixed_price if price_website else 0.0 + discount = price_tier.price_discount if price_tier else 0.0 + + discounted_price = fixed_price - (fixed_price * discount / 100) + + final_price = discounted_price / 1.11 + + return { + 'price': final_price, + 'web_price': discounted_price + } + + + def format_currency(self, number): number = int(number) return "{:,}".format(number).replace(',', '.')
\ No newline at end of file diff --git a/indoteknik_custom/views/website_user_cart.xml b/indoteknik_custom/views/website_user_cart.xml index e3630363..09ac7c67 100755 --- a/indoteknik_custom/views/website_user_cart.xml +++ b/indoteknik_custom/views/website_user_cart.xml @@ -16,6 +16,7 @@ <field name="program_line_id"/> <field name="qty"/> <field name="is_selected"/> + <field name="is_reminder"/> <field name="source"/> </tree> </field> @@ -34,6 +35,7 @@ <field name="program_line_id" /> <field name="qty" /> <field name="is_selected" /> + <field name="is_reminder" /> <field name="source" /> </group> <group></group> @@ -66,9 +68,10 @@ <record id="mail_template_user_cart_reminder_to_checkout" model="mail.template"> <field name="name">User Cart: Reminder to checkout</field> <field name="model_id" ref="indoteknik_custom.model_website_user_cart"/> - <field name="subject">Hello ${object.user_id.name}</field> - <field name="email_from">sales@indoteknik.com</field> - <field name="email_to">${object.user_id.login | safe}</field> + <field name="subject">Yuk, Checkout barang dikeranjang Kamu pakai Voucher Indoteknik</field> + <field name="email_from">noreply@indoteknik.com</field> + <field name="reply_to">sales@indoteknik.com</field> + <field name="email_to">${object.user_id.partner_id.email | safe}</field> <field name="body_html" type="html"> <table border="0" cellpadding="0" cellspacing="0" style="padding-top: 16px; background-color: #F1F1F1; font-family:Inter, Helvetica, Verdana, Arial,sans-serif; line-height: 24px; color: #454748; width: 100%; border-collapse:separate;"> <tr><td align="center"> @@ -79,8 +82,8 @@ <td align="center" style="min-width: 590px;"> <table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;"> <tr> - <td valign="middle"> - <span></span> + <td valign="middle" align="center"> + <img src="https://erp.indoteknik.com/api/image/ir.attachment/datas/2135765" alt="Indoteknik" style="max-width: 100%; height: auto;"></img> </td> </tr> @@ -98,49 +101,141 @@ <table border="0" cellpadding="0" cellspacing="0" width="590" style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;"> <tr><td style="padding-bottom: 24px;">Halo ${object.user_id.name},</td></tr> - <tr><td style="padding-bottom: 16px;">Kami harap Anda dalam keadaan baik. Kami ingin mengingatkan Anda bahwa Anda memiliki beberapa produk yang masih ada di keranjang belanja Anda di situs kami, tetapi belum selesai untuk proses checkout.</td></tr> - <tr><td style="padding-bottom: 16px;">Jika Anda masih tertarik dengan produk-produk tersebut, jangan ragu untuk segera melanjutkan proses pembayaran. Ini adalah kesempatan Anda untuk mendapatkan barang-barang yang Anda inginkan sebelum kehabisan stok.</td></tr> - <tr><td style="padding-bottom: 16px;">Berikut adalah daftar produk yang masih ada di keranjang belanja Anda:</td></tr> - <!-- PRODUCT TABLE --> + <tr><td style="padding-bottom: 16px;">Produk yang kamu pilih masih menunggu dikeranjang belanja nih! Yuk, lakukan checkout barang pilihan kamu pakai voucher lebih hemat dan selesaikan transaksimu sekarang.</td></tr> + <tr><td style="padding-bottom: 16px;">Rasakan kemudahan transaksi lebih praktis hanya di Indoteknik.com</td></tr> + <tr><td style="padding-bottom: 16px;">Voucher untuk Produk Keranjangmu :</td></tr> + % set voucher = object.env['voucher'].browse(146) + % set discount_amount = object.env['website.user.cart'].calculate_discount(object.user_id.id) + % if voucher: <tr><td> - % set base_url = object.env['ir.config_parameter'].get_param('web.base.url') - % for cart in object.user_other_carts: - % set user_pricelist = cart.user_id.partner_id.property_product_pricelist - % set product_price = cart.product_id.calculate_website_price(pricelist=user_pricelist) - % set product_template_id = cart.product_id.product_tmpl_id.id - % set subtotal = product_price['price_discount'] * cart.qty - <a href="https://indoteknik.com/shop/cart"> - <table style="box-shadow: rgba(0, 0, 0, 0.16) 0px 1px 4px; width: 100%; margin-bottom: 12px; color: black !important;"> - <tbody> + <table border="1" style="width: 100%; margin-bottom: 12px;"> + <thead> + <tr> + <th>Kode Voucher</th> + <th>Jumlah Diskon</th> + </tr> + </thead> + <tbody> + <tr> + <td style="text-align: center;">${voucher.code}</td> + <td style="text-align: center;">Rp${discount_amount['total_voucher']}</td> + </tr> + </tbody> + </table> + </td></tr> + % endif + + <tr><td style="padding-bottom: 16px;">Berikut adalah daftar produk yang masih ada di keranjang belanja Anda:</td></tr> + <tr> + <td> + <!-- Tabel Produk --> + % set base_url = object.env['ir.config_parameter'].get_param('web.base.url') + <table style="box-shadow: rgba(0, 0, 0, 0.16) 0px 1px 4px; width: 100%; margin-bottom: 12px; color: black !important; border-collapse: collapse;"> + <thead> + <tr> + <th style="border: 1px solid #dddddd; padding: 8px;">Nama Produk</th> + <th style="border: 1px solid #dddddd; padding: 8px;">Harga Diskon</th> + <th style="border: 1px solid #dddddd; padding: 8px;">Jumlah</th> + <th style="border: 1px solid #dddddd; padding: 8px;">Subtotal</th> + </tr> + </thead> + <tbody> + % for cart in object.user_other_carts: + % set product_price = cart.get_price_website(cart.product_id.id) + % set product_template_id = cart.product_id.product_tmpl_id.id + % set subtotal = product_price['price'] * cart.qty <tr> - <td style="width: 120px; padding: 8px !important;"> - <img src="${base_url}api/image/product.template/image_512/${product_template_id}" alt="${cart.product_id.name}" width="120" height="120" style="object-fit: fill; object-position: center;"/> + % if cart.program_line_id: + % set promo = cart.get_data_promo(cart.program_line_id.id) + % set subtotal = promo[0].program_line_id.price * cart.qty + <td style="border: 1px solid #dddddd; padding: 8px;"> + <div style="text-align: left; margin-bottom: 16px;"> + <img src="${base_url}api/image/promotion.program/image/${promo[0].program_line_id.program_id.id}" alt="${promo[0].program_line_id.program_id.name}" width="120" height="120" style="object-fit: fill; object-position: center;"/> + </div> + <div style="display: block; gap: 16px; justify-content: center;"> + % for data in promo: + <div style="text-align: center;"> + <img src="${base_url}api/image/product.template/image_512/${data.product_id.product_tmpl_id.id}" alt="${data.product_id.name}" width="100" height="100" style="object-fit: fill; object-position: center;"/> + <div style="font-weight: 600; margin-top: 4px;">${data.product_id.name}</div> + </div> + % endfor + </div> + </td> + <td style="border: 1px solid #dddddd; padding: 8px;"> + <div>Rp${cart.format_currency(promo[0].program_line_id.price)}</div> + </td> + <td style="border: 1px solid #dddddd; padding: 8px;"> + <div>${'%d pcs' % cart.qty}</div> </td> - <td style="vertical-align: top; padding: 8px;"> - <div style="font-weight: 600;">${cart.product_id.name}</div> - % if product_price['discount_percentage'] != 0: - <div><span style="text-decoration: line-through;">Rp${cart.format_currency(product_price['price'])}</span> (${'%d' % product_price['discount_percentage']}%)</div> - % endif - <div>Rp${cart.format_currency(product_price['price_discount'])} x ${'%d pcs' % cart.qty}</div> + <td style="border: 1px solid #dddddd; padding: 8px;"> <div style="font-weight: 600;">Rp${cart.format_currency(subtotal)}</div> </td> + % else + <td style="border: 1px solid #dddddd; padding: 8px;"> + <img src="${base_url}api/image/product.template/image_512/${product_template_id}" alt="${cart.product_id.name}" width="120" height="120" style="object-fit: fill; object-position: center;"/> + <div style="font-weight: 600;">${cart.product_id.name}</div> + </td> + <td style="border: 1px solid #dddddd; padding: 8px;"> + <div>Rp${cart.format_currency(product_price['price'])}</div> + </td> + <td style="border: 1px solid #dddddd; padding: 8px;"> + <div>${'%d pcs' % cart.qty}</div> + </td> + <td style="border: 1px solid #dddddd; padding: 8px;"> + <div style="font-weight: 600;">Rp${cart.format_currency(subtotal)}</div> + </td> + %endif </tr> - </tbody> - </table> - </a> - % endfor - </td></tr> + % endfor + </tbody> + </table> + % set totalan = object.calculate_discount(object.user_id.id) + + <table style="width: 100%; margin-top: 12px; color: black !important; border-collapse: collapse;"> + <tbody> + <tr> + <td style="text-align: right; padding: 8px;"><b>Subtotal:</b></td> + <td style="text-align: right; padding: 8px;">Rp${totalan['subtotal_website']}</td> + </tr> + <tr> + <td style="text-align: right; padding: 8px;"><b>Pakai Voucher:</b></td> + <td style="text-align: right; padding: 8px; color: green;"><b>(Potensi Potongan)</b> <b>Rp${totalan['total_voucher']}</b></td> + </tr> + <tr> + <td style="text-align: right; padding: 8px;"><b>Total:</b></td> + <td style="text-align: right; padding: 8px;">Rp${totalan['total_discount']}</td> + </tr> + <tr> + <td style="text-align: right; padding: 8px;"><b>PPN (11%):</b></td> + <td style="text-align: right; padding: 8px;">Rp${totalan['ppn']}</td> + </tr> + <tr> + <td style="text-align: right; padding: 8px;"><b>Grand Total:</b></td> + <td style="text-align: right; padding: 8px;"><b>Rp${totalan['grand_total']}</b></td> + </tr> + </tbody> + </table> + </td> + </tr> + + <tr> + <td style="text-align: center; padding: 20px;"> + <a href="https://indoteknik.com/shop/cart" style="background-color: #FFC107; color: black; padding: 10px 20px; text-decoration: none; border-radius: 4px; display: inline-block;">Cek Keranjang</a> + <a href="https://indoteknik.com/shop/checkout?voucher=PASTIHEMAT" style="background-color: #FF0000; color: white; padding: 10px 20px; text-decoration: none; border-radius: 4px; margin-left: 10px; display: inline-block;">Bayar Sekarang</a> + </td> + </tr> - <tr><td style="padding-bottom: 16px;">Kami juga ingin memberitahu Anda bahwa kami menyediakan layanan pelanggan yang siap membantu jika Anda memiliki pertanyaan atau memerlukan bantuan dalam proses pembayaran. Jangan ragu untuk menghubungi kami melalui email ini atau nomor layanan pelanggan kami yang tertera di situs.</td></tr> - <tr><td style="padding-bottom: 16px;">Terima kasih atas perhatian Anda dan kesempatan untuk melayani Anda. Kami berharap dapat segera melihat Anda menyelesaikan pembelian Anda.</td></tr> + <tr><td style="padding-bottom: 16px;">Terima kasih atas perhatian Anda dan kesempatan untuk melayani Anda. Kami berharap dapat segera melihat Anda menyelesaikan pembelian Anda. Untuk pertanyaan lebih lanjut dapat menghubungi nomor Whatsapp Resmi kami di <a href="https://api.whatsapp.com/send?phone=6281717181922">0817-1718-1922</a></td></tr> <tr><td style="padding-bottom: 2px;">Hormat kami,</td></tr> <tr><td style="padding-bottom: 2px;">PT. Indoteknik Dotcom Gemilang</td></tr> <tr><td style="padding-bottom: 2px;">sales@indoteknik.com</td></tr> + + <tr><td style="padding-bottom: 2px;">Email ini dibuat secara otomatis. Mohon tidak mengirimkan balasan ke email ini.</td></tr> <tr> <td style="text-align:center;"> <hr width="100%" - style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;" /> + style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;" /> </td> </tr> </table> |
