diff --git a/__init__.py b/__init__.py index 16869c3..22d638e 100644 --- a/__init__.py +++ b/__init__.py @@ -12,9 +12,14 @@ def register(): web_channel.SaleWebChannel, mercado_libre.MercadoLibre, sale.Sale, + sale.SaleForChannelStart, party.Party, product.Template, module='sale_web_channel', type_='model') Pool.register( sale.SaleUploadInvoice, + sale.SaleForChannel, module='sale_web_channel', type_='wizard') + Pool.register( + sale.SaleForChannelReport, + module='sale_web_channel', type_='report') diff --git a/locate/es.po b/locate/es.po new file mode 100644 index 0000000..c827b93 --- /dev/null +++ b/locate/es.po @@ -0,0 +1,639 @@ +# +msgid "" +msgstr "Content-Type: text/plain; charset=utf-8\n" + +msgctxt "error:sale.web_channel.mercado_libre:" +msgid "Product Not Found" +msgstr "" + +msgctxt "field:party.party,id_reference:" +msgid "ID Reference Api" +msgstr "" + +msgctxt "field:product.template,id_reference:" +msgid "ID Reference Api" +msgstr "" + +msgctxt "field:sale.sale,channel:" +msgid "channel" +msgstr "Canal" + +msgctxt "field:sale.sale,document_invoice:" +msgid "Document Invoice" +msgstr "" + +msgctxt "field:sale.sale,id_reference:" +msgid "Id Reference Api" +msgstr "" + +msgctxt "field:sale.sale,is_paymented:" +msgid "Is Paymented" +msgstr "" + +msgctxt "field:sale.sale,pack_id:" +msgid "Pack ID" +msgstr "" + +msgctxt "field:sale.sale,products_string:" +msgid "Products String" +msgstr "" + +msgctxt "field:sale.sale,tracking_number:" +msgid "Tracking Number" +msgstr "" + +msgctxt "field:sale.sale,uploaded_invoice:" +msgid "uploaded Invoice" +msgstr "" + +msgctxt "field:sale.web_channel,access_token:" +msgid "Access Token" +msgstr "" + +msgctxt "field:sale.web_channel,app_id:" +msgid "Application ID" +msgstr "" + +msgctxt "field:sale.web_channel,authorization_code:" +msgid "Authorization Code" +msgstr "" + +msgctxt "field:sale.web_channel,bonus_product:" +msgid "Bonus Product" +msgstr "" + +msgctxt "field:sale.web_channel,channel_name:" +msgid "Channel" +msgstr "Canal" + +msgctxt "field:sale.web_channel,create_date:" +msgid "Create Date" +msgstr "Fecha de Creación" + +msgctxt "field:sale.web_channel,create_uid:" +msgid "Create User" +msgstr "Usuario de creción" + +msgctxt "field:sale.web_channel,creation_time:" +msgid "Creation Time" +msgstr "" + +msgctxt "field:sale.web_channel,freight_product:" +msgid "Freight Product" +msgstr "" + +msgctxt "field:sale.web_channel,id:" +msgid "ID" +msgstr "ID" + +msgctxt "field:sale.web_channel,invoice_type:" +msgid "Type Invoice" +msgstr "Tipo de Factura" + +msgctxt "field:sale.web_channel,rec_name:" +msgid "Record Name" +msgstr "Nombre del registro" + +msgctxt "field:sale.web_channel,redirect_uri:" +msgid "Redirect URI" +msgstr "" + +msgctxt "field:sale.web_channel,refresh_token:" +msgid "Refresh Token" +msgstr "" + +msgctxt "field:sale.web_channel,report:" +msgid "Report" +msgstr "Reporte" + +msgctxt "field:sale.web_channel,secret_key:" +msgid "Secret Key" +msgstr "" + +msgctxt "field:sale.web_channel,state:" +msgid "State" +msgstr "Estado" + +msgctxt "field:sale.web_channel,status_token:" +msgid "Status Token" +msgstr "" + +msgctxt "field:sale.web_channel,write_date:" +msgid "Write Date" +msgstr "Modificado por Usuario" + +msgctxt "field:sale.web_channel,write_uid:" +msgid "Write User" +msgstr "Usuario modificación" + +msgctxt "field:sale.web_channel.mercado_libre,access_token:" +msgid "Access Token" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,app_id:" +msgid "Application ID" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,authorization_code:" +msgid "Authorization Code" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,bonus_product:" +msgid "Bonus Product" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,channel_name:" +msgid "Channel" +msgstr "Canal" + +msgctxt "field:sale.web_channel.mercado_libre,create_date:" +msgid "Create Date" +msgstr "Fecha de Creación" + +msgctxt "field:sale.web_channel.mercado_libre,create_uid:" +msgid "Create User" +msgstr "Usuario de creción" + +msgctxt "field:sale.web_channel.mercado_libre,creation_time:" +msgid "Creation Time" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,freight_product:" +msgid "Freight Product" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,id:" +msgid "ID" +msgstr "ID" + +msgctxt "field:sale.web_channel.mercado_libre,invoice_type:" +msgid "Type Invoice" +msgstr "Tipo de Factura" + +msgctxt "field:sale.web_channel.mercado_libre,rec_name:" +msgid "Record Name" +msgstr "Nombre del registro" + +msgctxt "field:sale.web_channel.mercado_libre,redirect_uri:" +msgid "Redirect URI" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,refresh_token:" +msgid "Refresh Token" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,report:" +msgid "Report" +msgstr "Reporte" + +msgctxt "field:sale.web_channel.mercado_libre,secret_key:" +msgid "Secret Key" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,state:" +msgid "State" +msgstr "Estado" + +msgctxt "field:sale.web_channel.mercado_libre,status_token:" +msgid "Status Token" +msgstr "" + +msgctxt "field:sale.web_channel.mercado_libre,write_date:" +msgid "Write Date" +msgstr "Modificado por Usuario" + +msgctxt "field:sale.web_channel.mercado_libre,write_uid:" +msgid "Write User" +msgstr "Usuario modificación" + +msgctxt "field:sale_web_channel.sale_for_channel.start,channels:" +msgid "Channel" +msgstr "Canal" + +msgctxt "field:sale_web_channel.sale_for_channel.start,end_date:" +msgid "End Date" +msgstr "Fin" + +msgctxt "field:sale_web_channel.sale_for_channel.start,id:" +msgid "ID" +msgstr "ID" + +msgctxt "field:sale_web_channel.sale_for_channel.start,include_canceled:" +msgid "Include Canceled" +msgstr "Incluir Canceladas" + +msgctxt "field:sale_web_channel.sale_for_channel.start,shop:" +msgid "Shop" +msgstr "Tienda" + +msgctxt "field:sale_web_channel.sale_for_channel.start,start_date:" +msgid "Start Date" +msgstr "Inicio" + +msgctxt "model:ir.action,name:act_sale_upload_invoice" +msgid "Sale Upload Invoice" +msgstr "" + +msgctxt "model:ir.action,name:act_sale_web_channel" +msgid "Channels" +msgstr "Canales" + +msgctxt "model:ir.action,name:sale_for_channel_report" +msgid "Sale For Channel" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "model:ir.action,name:wizard_sale_for_channel" +msgid "Sale For Channel Report" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "model:ir.ui.menu,name:menu_sale_for_channel" +msgid "Sale For Channel Report" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "model:ir.ui.menu,name:menu_web_channel" +msgid "Channels" +msgstr "Canales" + +msgctxt "model:sale.web_channel,name:" +msgid "Web Channel" +msgstr "" + +msgctxt "model:sale.web_channel.mercado_libre,name:" +msgid "MercadoLibre" +msgstr "" + +msgctxt "model:sale_web_channel.sale_for_channel.start,name:" +msgid "Sale For Channel Start" +msgstr "Reporte De Ventas Por Canal" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "$" +msgstr "$" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "%" +msgstr "%" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "(" +msgstr "(" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid ")" +msgstr ")" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "," +msgstr "," + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "-" +msgstr "-" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "/" +msgstr "/" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "/for" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "00/00/0000" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "00:00:00" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "???" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CAJA" +msgstr "CAJA" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CANAL" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CANALES:" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "CLIENTE" +msgstr "CLIENTE" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "DESDE" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "HASTA" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "HORA" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "IMPUESTO" +msgstr "IMPUESTO" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "NUMERO" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "No" +msgstr "No" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "Página" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "REPORTE DE" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "SUBTOTAL (BASE)" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "SUCURSAL" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "TOTAL" +msgstr "TOTAL" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "TRYTON ERP" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "VENDEDOR" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "VENTA POR CANAL" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "channels" +msgstr "Canales" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "company" +msgstr "empresa" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "end_date" +msgstr "Fecha Final" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "for each='sale in records'" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.channel" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.create_date - datetime.timedelta(hours=5)" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.number" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.party.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.sale_device and sale.sale_device.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.salesman and sale.salesman.party.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.sequence" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.shop and sale.shop.name" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.tax_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.total_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "sale.untaxed_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "shop" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "start_date" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "tax_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "total_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "untaxed_amount" +msgstr "" + +msgctxt "report:sale_web_channel.sale_for_channel_report:" +msgid "€" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "IFood" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "Melhous" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "Mercado Libre" +msgstr "" + +msgctxt "selection:sale.web_channel,channel_name:" +msgid "Rappi" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Computador" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Exportacion" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Factura por Contingencia DIAN" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Factura por Contingencia Facturador" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Manual" +msgstr "Manual" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Nota Crédito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Nota Débito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "POS" +msgstr "" + +msgctxt "selection:sale.web_channel,invoice_type:" +msgid "Venta Electronica" +msgstr "" + +msgctxt "selection:sale.web_channel,state:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel,state:" +msgid "Draft" +msgstr "Borrador" + +msgctxt "selection:sale.web_channel,state:" +msgid "Finished" +msgstr "Terminado" + +msgctxt "selection:sale.web_channel,status_token:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel,status_token:" +msgid "Expired" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "IFood" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "Melhous" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "Mercado Libre" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,channel_name:" +msgid "Rappi" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Computador" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Exportacion" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Factura por Contingencia DIAN" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Factura por Contingencia Facturador" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Manual" +msgstr "Manual" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Nota Crédito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Nota Débito Eléctronica" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "POS" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,invoice_type:" +msgid "Venta Electronica" +msgstr "" + +msgctxt "selection:sale.web_channel.mercado_libre,state:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel.mercado_libre,state:" +msgid "Draft" +msgstr "Borrador" + +msgctxt "selection:sale.web_channel.mercado_libre,state:" +msgid "Finished" +msgstr "Terminado" + +msgctxt "selection:sale.web_channel.mercado_libre,status_token:" +msgid "Active" +msgstr "Activo" + +msgctxt "selection:sale.web_channel.mercado_libre,status_token:" +msgid "Expired" +msgstr "" + +msgctxt "view:sale.web_channel:" +msgid "Active" +msgstr "Activo" + +msgctxt "view:sale.web_channel:" +msgid "Draft" +msgstr "Borrador" + +msgctxt "view:sale.web_channel:" +msgid "Finished" +msgstr "Terminado" + +msgctxt "wizard_button:sale_web_channel.sale_for_channel,start,end:" +msgid "Cancel" +msgstr "Cancelar" + +msgctxt "wizard_button:sale_web_channel.sale_for_channel,start,print_:" +msgid "Print" +msgstr "Imprimir" diff --git a/sale.py b/sale.py index 4ac35f8..30bde8e 100644 --- a/sale.py +++ b/sale.py @@ -1,9 +1,12 @@ -from trytond.model import fields +from trytond.model import fields, ModelView from trytond.pool import PoolMeta, Pool from trytond.transaction import Transaction -from trytond.wizard import ( - Wizard, StateTransition) +from trytond.wizard import (Wizard, StateView, Button, StateReport, + StateTransition) +from trytond.report import Report +from trytond.transaction import Transaction +from trytond.pyson import Eval __all__ = ['Sale'] @@ -70,6 +73,112 @@ class SaleUploadInvoice(Wizard): return 'end' +class SaleForChannelStart(ModelView): + 'Sale For Channel Start' + __name__ = 'sale_web_channel.sale_for_channel.start' + company = fields.Many2One('company.company', 'Company', required=True) + shop = fields.Many2One('sale.shop', 'Shop', required=True, domain=[ + ('company', '=', Eval('company')) + ]) + channels = fields.Many2Many('sale.web_channel', None, None, 'Channel') + start_date = fields.Date('Start Date', required=True) + end_date = fields.Date('End Date', required=True) + include_canceled = fields.Boolean('Include Canceled') + + @staticmethod + def default_company(): + return Transaction().context.get('company') + + +class SaleForChannel(Wizard): + 'Sale For Channel' + __name__ = 'sale_web_channel.sale_for_channel' + start = StateView('sale_web_channel.sale_for_channel.start', + 'sale_web_channel.sale_for_channel_start_view_form', [ + Button('Cancel', 'end', 'tryton-cancel'), + Button('Print', 'print_', 'tryton-ok', default=True), + ]) + print_ = StateReport('sale_web_channel.sale_for_channel_report') + + def do_print_(self, action): + report_context = { + 'company': self.start.company.id, + 'company_name': self.start.company.rec_name, + 'shop': self.start.shop.id, + 'shop_name': self.start.shop.name, + 'channel': [], + 'start_date': self.start.start_date, + 'end_date': self.start.end_date, + 'include_canceled': self.start.include_canceled, + } + report_context['channels'] = [{'id': c.id, 'name': c.rec_name} for c in self.start.channels] + return action, report_context + + def transition_print_(self): + return 'end' + + +class SaleForChannelReport(Report): + 'Sale For Channel Report' + __name__ = 'sale_web_channel.sale_for_channel_report' + + @classmethod + def get_context(cls, records, data): + report_context = super(SaleForChannelReport, cls).get_context(records, data) + pool = Pool() + Sale = pool.get('sale.sale') + channel_ids = [c['id'] for c in data['channels']] + channel_names = [c['name'] for c in data['channels']] + shop_id = data['shop'] + shop_name = data['shop_name'] + company_name = data['company_name'] + + dom_sales = [ + ('shop', '=', shop_id), + ('sale_date', '>=', data['start_date']), + ('sale_date', '<=', data['end_date']), + ] + states_sale = ['processing', 'done'] + if data['include_canceled']: + states_sale.append('cancel') + dom_sales.append(('state', 'in', states_sale)) + + if channel_ids: + dom_sales.append( + ('channel', 'in', channel_ids) + ) + + sales = Sale.search(dom_sales, order=[('sale_date', 'DESC')]) + + untaxed_amount_ = [] + tax_amount_ = [] + total_amount_ = [] + total_amount_ = [] + sequence = 0 + + for sale in sales: + sequence += 1 + setattr(sale, 'sequence', sequence) + + if not hasattr(sale, 'sale_device'): + setattr(sale, 'sale_device', None) + + untaxed_amount_.append(sale.untaxed_amount) + tax_amount_.append(sale.tax_amount) + total_amount_.append(sale.total_amount) + + report_context['records'] = sales + report_context['total_amount'] = sum(total_amount_) + report_context['tax_amount'] = sum(tax_amount_) + report_context['untaxed_amount'] = sum(untaxed_amount_) + report_context['start_date'] = data['start_date'] + report_context['end_date'] = data['end_date'] + report_context['shop'] = shop_name + report_context['channels'] = ', '.join(channel_names) + report_context['company'] = company_name + return report_context + + # class Invoice(metaclass=PoolMeta): # __name__ = 'account.invoice' # salesman = fields.Many2One('company.employee', 'Salesman', diff --git a/sale.xml b/sale.xml index c2a2d3c..8a56988 100644 --- a/sale.xml +++ b/sale.xml @@ -38,5 +38,24 @@ this repository contains the full copyright notices and license terms. --> sale_pos_form + + Sale For Channel + + sale_web_channel.sale_for_channel_report + sale_web_channel/sale_channels.ods + + + sale_web_channel.sale_for_channel.start + form + sale_for_channel_start_view_form + + + Sale For Channel Report + sale_web_channel.sale_for_channel + + + + diff --git a/sale_channels.ods b/sale_channels.ods new file mode 100644 index 0000000..da6abc9 Binary files /dev/null and b/sale_channels.ods differ diff --git a/view/sale_for_channel_start_view_form.xml b/view/sale_for_channel_start_view_form.xml new file mode 100644 index 0000000..edab353 --- /dev/null +++ b/view/sale_for_channel_start_view_form.xml @@ -0,0 +1,17 @@ + + +
+