diff options
| author | Stephane Wirtel <stw@openerp.com> | 2012-08-22 11:32:23 +0200 |
|---|---|---|
| committer | Stephane Wirtel <stw@openerp.com> | 2012-08-22 11:32:23 +0200 |
| commit | d0057766ab10aa2d33f35a28c4e5b2dff739a419 (patch) | |
| tree | 5cbdb62c0ade10b37209ae78498d6f79e0ebbb50 | |
| parent | 5ff60ccd9ffa6080288de64f8ab8dc1009eedcc3 (diff) | |
| parent | 197e6731005960058ae8ca5f5d9ad839ed056516 (diff) | |
[MERGE] merge the branch of the point_of_sale
bzr revid: stw@openerp.com-20120822093223-sdf72z5vhw2cejac
45 files changed, 6279 insertions, 15084 deletions
diff --git a/addons/crm/i18n/es_MX.po.moved b/addons/crm/i18n/es_MX.po.moved deleted file mode 100644 index bba19b80731..00000000000 --- a/addons/crm/i18n/es_MX.po.moved +++ /dev/null @@ -1,3672 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * crm -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-06 16:24+0000\n" -"PO-Revision-Date: 2011-07-06 16:24+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: crm -#: view:crm.lead.report:0 -msgid "# Leads" -msgstr "# Iniciativas" - -#. module: crm -#: view:crm.lead:0 -#: selection:crm.lead,type:0 -#: selection:crm.lead.report,type:0 -msgid "Lead" -msgstr "Iniciativa" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor3 -msgid "Need Services" -msgstr "Necesita servicios" - -#. module: crm -#: selection:crm.meeting,rrule_type:0 -msgid "Monthly" -msgstr "Mensual" - -#. module: crm -#: view:crm.opportunity2phonecall:0 -msgid "Schedule a PhoneCall" -msgstr "Planificar llamada telefónica" - -#. module: crm -#: model:ir.model,name:crm.model_crm_case_stage -msgid "Stage of case" -msgstr "Etapa del caso" - -#. module: crm -#: view:crm.meeting:0 -msgid "Visibility" -msgstr "Visibilidad" - -#. module: crm -#: field:crm.lead,title:0 -msgid "Title" -msgstr "Título" - -#. module: crm -#: field:crm.meeting,show_as:0 -msgid "Show as" -msgstr "Mostrar como" - -#. module: crm -#: field:crm.meeting,day:0 -#: selection:crm.meeting,select1:0 -msgid "Date of month" -msgstr "Día del mes" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.phonecall:0 -msgid "Today" -msgstr "Hoy" - -#. module: crm -#: view:crm.merge.opportunity:0 -msgid "Select Opportunities" -msgstr "Seleccionar oportunidades" - -#. module: crm -#: view:crm.meeting:0 -#: view:crm.phonecall2opportunity:0 -#: view:crm.phonecall2phonecall:0 -#: view:crm.send.mail:0 -msgid " " -msgstr " " - -#. module: crm -#: view:crm.lead.report:0 -#: field:crm.phonecall.report,delay_close:0 -msgid "Delay to close" -msgstr "Demora cierre" - -#. module: crm -#: view:crm.lead:0 -msgid "Previous Stage" -msgstr "Etapa anterior" - -#. module: crm -#: code:addons/crm/wizard/crm_add_note.py:26 -#, python-format -msgid "Can not add note!" -msgstr "¡No se puede añadir una nota!" - -#. module: crm -#: field:crm.case.stage,name:0 -msgid "Stage Name" -msgstr "Nombre de etapa" - -#. module: crm -#: view:crm.lead.report:0 -#: field:crm.lead.report,day:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,day:0 -msgid "Day" -msgstr "Día" - -#. module: crm -#: sql_constraint:crm.case.section:0 -msgid "The code of the sales team must be unique !" -msgstr "¡El código del equipo de ventas debe ser único!" - -#. module: crm -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:95 -#, python-format -msgid "Lead '%s' has been converted to an opportunity." -msgstr "La inicaitiva '%s' ha sido convertida en oportunidad" - -#. module: crm -#: code:addons/crm/crm_lead.py:228 -#, python-format -msgid "The lead '%s' has been closed." -msgstr "La iniciativa '%s' ha sido cerrada" - -#. module: crm -#: selection:crm.meeting,freq:0 -msgid "No Repeat" -msgstr "No repetir" - -#. module: crm -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:135 -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:260 -#: code:addons/crm/wizard/crm_lead_to_partner.py:55 -#: code:addons/crm/wizard/crm_phonecall_to_partner.py:52 -#, python-format -msgid "Warning !" -msgstr "Advertencia !" - -#. module: crm -#: selection:crm.meeting,rrule_type:0 -msgid "Yearly" -msgstr "Anual" - -#. module: crm -#: field:crm.segmentation.line,name:0 -msgid "Rule Name" -msgstr "Nombre de regla" - -#. module: crm -#: view:crm.case.resource.type:0 -#: view:crm.lead:0 -#: field:crm.lead,type_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,type_id:0 -#: model:ir.model,name:crm.model_crm_case_resource_type -msgid "Campaign" -msgstr "Campaña" - -#. module: crm -#: selection:crm.lead2opportunity.partner,action:0 -msgid "Do not create a partner" -msgstr "No crear una empresa" - -#. module: crm -#: view:crm.lead:0 -msgid "Search Opportunities" -msgstr "Busqueda de oportunidades" - -#. module: crm -#: code:addons/crm/wizard/crm_merge_opportunities.py:46 -#, python-format -msgid "Opportunity must have Partner assigned before merging with other Opportunity." -msgstr "La oportunidad debe de tener una empresa asignada antes de fusionarla con otra oportunidad." - -#. module: crm -#: code:addons/crm/wizard/crm_merge_opportunities.py:46 -#: code:addons/crm/wizard/crm_merge_opportunities.py:53 -#, python-format -msgid "Warning!" -msgstr "¡Aviso!" - -#. module: crm -#: code:addons/crm/wizard/crm_send_email.py:72 -#: code:addons/crm/wizard/crm_send_email.py:169 -#: code:addons/crm/wizard/crm_send_email.py:270 -#, python-format -msgid "Can not send mail!" -msgstr "¡No se pudo enviar el correo!" - -#. module: crm -#: field:crm.lead,partner_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,partner_id:0 -#: field:crm.lead2opportunity,partner_id:0 -#: field:crm.lead2opportunity.partner,partner_id:0 -#: field:crm.lead2partner,partner_id:0 -#: view:crm.meeting:0 -#: field:crm.meeting,partner_id:0 -#: field:crm.partner2opportunity,partner_id:0 -#: view:crm.phonecall:0 -#: field:crm.phonecall,partner_id:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,partner_id:0 -#: field:crm.phonecall2opportunity,partner_id:0 -#: field:crm.phonecall2partner,partner_id:0 -#: model:ir.model,name:crm.model_res_partner -#: model:process.node,name:crm.process_node_partner0 -msgid "Partner" -msgstr "Empresa" - -#. module: crm -#: field:crm.meeting,organizer:0 -#: field:crm.meeting,organizer_id:0 -msgid "Organizer" -msgstr "Organizador" - -#. module: crm -#: view:crm.phonecall:0 -#: view:crm.phonecall2phonecall:0 -#: model:ir.actions.act_window,name:crm.phonecall_to_phonecall_act -#: view:res.partner:0 -msgid "Schedule Other Call" -msgstr "Planificar otra llamada" - -#. module: crm -#: help:crm.meeting,edit_all:0 -msgid "Edit all Occurrences of recurrent Meeting." -msgstr "Editar todas las ocurrencias de la reunión recurrente." - -#. module: crm -#: code:addons/crm/wizard/crm_opportunity_to_phonecall.py:134 -#: code:addons/crm/wizard/crm_phonecall_to_phonecall.py:89 -#: model:crm.case.categ,name:crm.categ_meet3 -#: view:crm.phonecall:0 -#: model:ir.ui.menu,name:crm.menu_crm_config_phonecall -#: view:res.partner:0 -#, python-format -msgid "Phone Call" -msgstr "Llamada de telefono" - -#. module: crm -#: field:crm.lead,optout:0 -msgid "Opt-Out" -msgstr "No acepta recibir emails" - -#. module: crm -#: code:addons/crm/crm_opportunity.py:108 -#, python-format -msgid "The opportunity '%s' has been marked as lost." -msgstr "La oportunidad '%s' ha sido marcada como perdida." - -#. module: crm -#: model:ir.actions.act_window,help:crm.action_report_crm_lead -msgid "Leads Analysis allows you to check different CRM related information. Check for treatment delays, number of responses given and emails sent. You can sort out your leads analysis by different groups to get accurate grained analysis." -msgstr "El análisis de iniciativas le permite verificar información relacionada con el CRM. Puede verificar los retrasos, el número de respuestas realizadas y el número de emails enviados. Puede ordenar el análisis de sus iniciativas según diferentes grupos para obtener un análisis reagrupado preciso." - -#. module: crm -#: view:crm.lead:0 -msgid "Send New Email" -msgstr "Enviar nuevo email" - -#. module: crm -#: field:crm.segmentation,segmentation_line:0 -msgid "Criteria" -msgstr "Criterios" - -#. module: crm -#: field:crm.case.stage,section_ids:0 -msgid "Sections" -msgstr "Secciones" - -#. module: crm -#: view:crm.merge.opportunity:0 -msgid "_Merge" -msgstr "_Fusionar" - -#. module: crm -#: view:crm.lead.report:0 -#: model:ir.actions.act_window,name:crm.action_report_crm_lead -#: model:ir.ui.menu,name:crm.menu_report_crm_leads_tree -msgid "Leads Analysis" -msgstr "Análisis de iniciativas" - -#. module: crm -#: view:crm.lead2opportunity.action:0 -msgid "If you select Merge with existing Opportunity, the lead details(with the communication history) will be merged with existing Opportunity of Selected partner." -msgstr "Si selecciona fusionar con oportunidad existente, los detalles de la iniciativa (con el histórico de la comunicación) serán fusionados con la oportunidad existente de la empresa seleccionada" - -#. module: crm -#: selection:crm.meeting,class:0 -msgid "Public" -msgstr "Público" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_case_resource_type_act -#: model:ir.ui.menu,name:crm.menu_crm_case_resource_type_act -msgid "Campaigns" -msgstr "Campañas" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_lead_categ_action -#: model:ir.ui.menu,name:crm.menu_crm_case_phonecall-act -#: model:ir.ui.menu,name:crm.menu_crm_lead_categ -msgid "Categories" -msgstr "Categorías" - -#. module: crm -#: selection:crm.meeting,end_type:0 -msgid "Forever" -msgstr "Siempre" - -#. module: crm -#: help:crm.lead,optout:0 -msgid "If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign." -msgstr "Si opt-out está marcado, este contacto ha rehusado recibir correos electrónicos o ha eliminado su suscripción a una campaña." - -#. module: crm -#: model:process.transition,name:crm.process_transition_leadpartner0 -msgid "Prospect Partner" -msgstr "Socio prospecto" - -#. module: crm -#: field:crm.lead,contact_name:0 -msgid "Contact Name" -msgstr "Nombre de contacto" - -#. module: crm -#: selection:crm.lead2opportunity.partner,action:0 -#: selection:crm.lead2partner,action:0 -#: selection:crm.phonecall2partner,action:0 -msgid "Link to an existing partner" -msgstr "Enlace al socio existente" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.meeting:0 -#: field:crm.phonecall,partner_contact:0 -msgid "Contact" -msgstr "Contacto" - -#. module: crm -#: view:crm.installer:0 -msgid "Enhance your core CRM Application with additional functionalities." -msgstr "Mejore su aplicación CRM básica con funcionalidades adicionales." - -#. module: crm -#: field:crm.case.stage,on_change:0 -msgid "Change Probability Automatically" -msgstr "Cambiar la probabilidad automáticamente" - -#. module: crm -#: field:base.action.rule,regex_history:0 -msgid "Regular Expression on Case History" -msgstr "Expresiones Regulares en el Historial del Caso" - -#. module: crm -#: code:addons/crm/crm_lead.py:209 -#, python-format -msgid "The lead '%s' has been opened." -msgstr "La iniciativa '%s' ha sido abierta." - -#. module: crm -#: model:process.transition,name:crm.process_transition_opportunitymeeting0 -msgid "Opportunity Meeting" -msgstr "Oportunidad de Reunión" - -#. module: crm -#: help:crm.lead.report,delay_close:0 -#: help:crm.phonecall.report,delay_close:0 -msgid "Number of Days to close the case" -msgstr "Número de días para cerrar el caso" - -#. module: crm -#: model:process.node,note:crm.process_node_opportunities0 -msgid "When a real project/opportunity is detected" -msgstr "Cuando un proyecto/oportunidad real es detectado" - -#. module: crm -#: field:crm.installer,crm_fundraising:0 -msgid "Fundraising" -msgstr "Recaudación de fondos" - -#. module: crm -#: view:res.partner:0 -#: field:res.partner,opportunity_ids:0 -msgid "Leads and Opportunities" -msgstr "Iniciativas y oportunidades" - -#. module: crm -#: view:crm.send.mail:0 -msgid "_Send" -msgstr "_Enviar" - -#. module: crm -#: view:crm.lead:0 -msgid "Communication" -msgstr "Comunicación" - -#. module: crm -#: field:crm.case.section,change_responsible:0 -msgid "Change Responsible" -msgstr "Cambiar responsable" - -#. module: crm -#: field:crm.merge.opportunity,state:0 -msgid "Set State To" -msgstr "Cambiar estado a" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_outgoing0 -msgid "Outbound Calls list all the calls to be done by your sales team. A salesman can record the information about the call in the form view. This information will be stored in the partner form to trace every contact you have with a customer. You can also import a .CSV file with a list of calls to be done by your sales team." -msgstr "Llamadas salientes muestra todas las llamadas realizadas por su equipo de ventas. Un vendedor puede grabar la información sobre la llamada en la vista de formulario. Esta información se almacenará en el formulario de empresa para rastrear cada contacto que tenga con un cliente. También puede importar un archivo .CSV con una lista de llamadas a realizar por su equipo de ventas." - -#. module: crm -#: model:ir.model,name:crm.model_crm_lead2opportunity_action -msgid "Convert/Merge Opportunity" -msgstr "Convertir/Fusionar oportunidad" - -#. module: crm -#: field:crm.lead,write_date:0 -msgid "Update Date" -msgstr "Actualizar fecha" - -#. module: crm -#: view:crm.lead2opportunity.action:0 -#: field:crm.lead2opportunity.action,name:0 -msgid "Select Action" -msgstr "Seleccionar acción" - -#. module: crm -#: field:base.action.rule,trg_categ_id:0 -#: view:crm.lead:0 -#: field:crm.lead,categ_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,categ_id:0 -#: field:crm.opportunity2phonecall,categ_id:0 -#: field:crm.phonecall,categ_id:0 -#: field:crm.phonecall.report,categ_id:0 -#: field:crm.phonecall2phonecall,categ_id:0 -msgid "Category" -msgstr "Categoría" - -#. module: crm -#: view:crm.lead.report:0 -msgid "#Opportunities" -msgstr "# Oportunidades" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_oppor2 -msgid "Campaign 1" -msgstr "Campaña 1" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_oppor1 -msgid "Campaign 2" -msgstr "Campaña 2" - -#. module: crm -#: view:crm.meeting:0 -msgid "Privacy" -msgstr "Privada" - -#. module: crm -#: view:crm.lead.report:0 -msgid "Opportunity Analysis" -msgstr "Análisis de oportunidades" - -#. module: crm -#: help:crm.meeting,location:0 -msgid "Location of Event" -msgstr "Lacalización del evento" - -#. module: crm -#: field:crm.meeting,rrule:0 -msgid "Recurrent Rule" -msgstr "Regla recurrente" - -#. module: crm -#: help:crm.installer,fetchmail:0 -msgid "Allows you to receive E-Mails from POP/IMAP server." -msgstr "Le permite recibir e-mails desde un servidor POP/IMAP" - -#. module: crm -#: model:process.transition,note:crm.process_transition_opportunitymeeting0 -msgid "Normal or phone meeting for opportunity" -msgstr "Oportunidad de reunion normal ó telefonico." - -#. module: crm -#: model:process.node,note:crm.process_node_leads0 -msgid "Very first contact with new prospect" -msgstr "Primer contacto con nueva prospección" - -#. module: crm -#: code:addons/crm/crm_lead.py:278 -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:197 -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:231 -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:299 -#: view:crm.lead2opportunity:0 -#: view:crm.partner2opportunity:0 -#: model:ir.actions.act_window,name:crm.action_crm_lead2opportunity -#: model:ir.actions.act_window,name:crm.action_view_crm_partner2opportunity -#: model:ir.actions.act_window,name:crm.crm_partner2opportunity -#, python-format -msgid "Create Opportunity" -msgstr "Crear oportunidad" - -#. module: crm -#: view:crm.installer:0 -msgid "Configure" -msgstr "Configurar" - -#. module: crm -#: code:addons/crm/crm.py:378 -#: view:crm.lead:0 -#: view:res.partner:0 -#, python-format -msgid "Escalate" -msgstr "Escalado" - -#. module: crm -#: model:ir.module.module,shortdesc:crm.module_meta_information -msgid "Customer & Supplier Relationship Management" -msgstr "Gestión de las relaciones con los clientes y proveedores" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "June" -msgstr "Junio" - -#. module: crm -#: selection:crm.segmentation,state:0 -msgid "Not Running" -msgstr "No ejecutado" - -#. module: crm -#: view:crm.send.mail:0 -#: model:ir.actions.act_window,name:crm.action_crm_reply_mail -msgid "Reply to last Mail" -msgstr "Responder al último e-mail" - -#. module: crm -#: field:crm.lead,email:0 -msgid "E-Mail" -msgstr "E-mail" - -#. module: crm -#: field:crm.installer,wiki_sale_faq:0 -msgid "Sale FAQ" -msgstr "FAQ de ventas" - -#. module: crm -#: model:ir.model,name:crm.model_crm_send_mail_attachment -msgid "crm.send.mail.attachment" -msgstr "crm.enviar.mail.adjunto" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "October" -msgstr "Octubre" - -#. module: crm -#: help:crm.meeting,email_from:0 -#: help:crm.phonecall,email_from:0 -msgid "These people will receive email." -msgstr "Estas personas recibirán un email." - -#. module: crm -#: view:crm.meeting:0 -#: field:crm.meeting,name:0 -msgid "Summary" -msgstr "Resumen" - -#. module: crm -#: view:crm.segmentation:0 -msgid "State of Mind Computation" -msgstr "Cálculo grado de satisfacción" - -#. module: crm -#: help:crm.case.section,change_responsible:0 -msgid "Thick this box if you want that on escalation, the responsible of this sale team automatically becomes responsible of the lead/opportunity escaladed" -msgstr "Marque esta opción si quiere que el responsable del equipo de ventas sea automáticamente responsable de la iniciativa/oportunidad, en caso de ser escalada." - -#. module: crm -#: help:crm.installer,outlook:0 -#: help:crm.installer,thunderbird:0 -msgid "Allows you to link your e-mail to OpenERP's documents. You can attach it to any existing one in OpenERP or create a new one." -msgstr "Permite enlazar su e-mail a la gestión documental de OpenERP. Puede adjuntarlo a cualquier documento ya existente en OpenERP o crear uno de nuevo." - -#. module: crm -#: view:crm.case.categ:0 -msgid "Case Category" -msgstr "Categoría del caso" - -#. module: crm -#: help:crm.segmentation,som_interval_default:0 -msgid "Default state of mind for period preceeding the 'Max Interval' computation. This is the starting state of mind by default if the partner has no event." -msgstr "Grado de satisfacción por defecto para el período que precede el cálculo de 'Intervalo máx.'. Este es el grado de satisfacción inicial por defecto si la empresa no tiene ningún evento." - -#. module: crm -#: selection:crm.meeting,end_type:0 -msgid "End date" -msgstr "Fecha de fin" - -#. module: crm -#: constraint:base.action.rule:0 -msgid "Error: The mail is not well formated" -msgstr "Error: El email no está bien formateado" - -#. module: crm -#: view:crm.phonecall.report:0 -msgid "#Phone calls" -msgstr "#Llamadas telefónicas" - -#. module: crm -#: help:crm.segmentation,categ_id:0 -msgid "The partner category that will be added to partners that match the segmentation criterions after computation." -msgstr "La categoría de empresas que será añadida a las empresas que cumplan los criterios de segmentación después del cálculo." - -#. module: crm -#: view:crm.lead:0 -msgid "Communication history" -msgstr "Historial de comunicación" - -#. module: crm -#: help:crm.phonecall,canal_id:0 -msgid "The channels represent the different communication modes available with the customer. With each commercial opportunity, you can indicate the canall which is this opportunity source." -msgstr "Los canales representan los diferentes modos de comunicación posibles con el cliente. En cada oportunidad comercial, puede indicar el canal que ha sido el origen de esta oportunidad." - -#. module: crm -#: code:addons/crm/crm_meeting.py:93 -#, python-format -msgid "The meeting '%s' has been confirmed." -msgstr "La reunión '%s' ha sido confirmada" - -#. module: crm -#: field:crm.case.section,user_id:0 -msgid "Responsible User" -msgstr "Usuario responsable" - -#. module: crm -#: code:addons/crm/wizard/crm_phonecall_to_partner.py:53 -#, python-format -msgid "A partner is already defined on this phonecall." -msgstr "Una empresa ya esta definida para esta llamada." - -#. module: crm -#: help:crm.case.section,reply_to:0 -msgid "The email address put in the 'Reply-To' of all emails sent by OpenERP about cases in this sales team" -msgstr "La dirección de correo electrónico usada como \"Responder a\" de todos los correos electrónicos enviados por OpenERP para los casos de este equipo de ventas." - -#. module: crm -#: view:res.users:0 -msgid "Current Activity" -msgstr "Actividad actual" - -#. module: crm -#: help:crm.meeting,exrule:0 -msgid "Defines a rule or repeating pattern of time to exclude from the recurring rule." -msgstr "Define una regla o patrón de repetición de tiempo a excluir de la regla recurrente." - -#. module: crm -#: field:crm.case.section,resource_calendar_id:0 -msgid "Working Time" -msgstr "Horario de trabajo" - -#. module: crm -#: view:crm.segmentation.line:0 -msgid "Partner Segmentation Lines" -msgstr "Líneas de segmentación de empresa" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.meeting:0 -msgid "Details" -msgstr "Detalles" - -#. module: crm -#: help:crm.installer,crm_caldav:0 -msgid "Helps you to synchronize the meetings with other calendar clients and mobiles." -msgstr "Le permite sincronizar las reuniones con otros clientes de calendario y móviles." - -#. module: crm -#: selection:crm.meeting,freq:0 -msgid "Years" -msgstr "Años" - -#. module: crm -#: help:crm.installer,crm_claim:0 -msgid "Manages the suppliers and customers claims, including your corrective or preventive actions." -msgstr "Gestiona las reclamaciones de clientes y proveedores, incluyendo acciones correctivas o preventivas" - -#. module: crm -#: view:crm.lead:0 -msgid "Leads Form" -msgstr "Formulario de iniciativas" - -#. module: crm -#: view:crm.segmentation:0 -#: model:ir.model,name:crm.model_crm_segmentation -msgid "Partner Segmentation" -msgstr "Segmentación de empresa" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_case_categ_meet -msgid "The meeting calendar is shared between the sales teams and fully integrated with other applications such as the employee holidays or the business opportunities. You can also synchronize meetings with your mobile phone using the caldav interface.\n" -" " -msgstr "Las citas del calendario estan compartidas entre el equipo de ventas e integradas con otras aplicaciones como los dias festivos de los empleados o las oportunidades de negocio. Usted puede tambien sincronizar citas con su telefono movil usando la interfaz caldav.\n" -" " - -#. module: crm -#: field:crm.lead.report,probable_revenue:0 -msgid "Probable Revenue" -msgstr "Ingreso estimado" - -#. module: crm -#: help:crm.segmentation,name:0 -msgid "The name of the segmentation." -msgstr "El nombre de la segmentación." - -#. module: crm -#: field:crm.case.stage,probability:0 -#: field:crm.lead,probability:0 -msgid "Probability (%)" -msgstr "Probabilidad (%)" - -#. module: crm -#: view:crm.lead:0 -msgid "Leads Generation" -msgstr "Generación de iniciativas" - -#. module: crm -#: view:board.board:0 -#: model:ir.ui.menu,name:crm.menu_board_statistics_dash -msgid "Statistics Dashboard" -msgstr "Tablero de estadísticas" - -#. module: crm -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:88 -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:98 -#: code:addons/crm/wizard/crm_partner_to_opportunity.py:101 -#: code:addons/crm/wizard/crm_phonecall_to_opportunity.py:117 -#: view:crm.lead:0 -#: selection:crm.lead,type:0 -#: selection:crm.lead.report,type:0 -#: field:crm.lead2opportunity,name:0 -#: field:crm.meeting,opportunity_id:0 -#: field:crm.phonecall,opportunity_id:0 -#, python-format -msgid "Opportunity" -msgstr "Oportunidad" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead7 -msgid "Television" -msgstr "Televisión" - -#. module: crm -#: field:crm.installer,crm_caldav:0 -msgid "Calendar Synchronizing" -msgstr "Sincronización del calendario" - -#. module: crm -#: view:crm.segmentation:0 -msgid "Stop Process" -msgstr "Parar el proceso" - -#. module: crm -#: view:crm.phonecall:0 -msgid "Search Phonecalls" -msgstr "Buscar llamadas" - -#. module: crm -#: view:crm.lead2opportunity.partner:0 -#: view:crm.lead2partner:0 -#: view:crm.phonecall2partner:0 -msgid "Continue" -msgstr "Siguiente" - -#. module: crm -#: field:crm.segmentation,som_interval:0 -msgid "Days per Period" -msgstr "Días por período" - -#. module: crm -#: field:crm.meeting,byday:0 -msgid "By day" -msgstr "Por día" - -#. module: crm -#: field:base.action.rule,act_section_id:0 -msgid "Set Team to" -msgstr "Establecer equipo a" - -#. module: crm -#: view:calendar.attendee:0 -#: field:calendar.attendee,categ_id:0 -msgid "Event Type" -msgstr "Tipo de evento" - -#. module: crm -#: model:ir.model,name:crm.model_crm_installer -msgid "crm.installer" -msgstr "crm.instalador" - -#. module: crm -#: field:crm.segmentation,exclusif:0 -msgid "Exclusive" -msgstr "Exclusivo" - -#. module: crm -#: code:addons/crm/crm_opportunity.py:91 -#, python-format -msgid "The opportunity '%s' has been won." -msgstr "La oportunidad '%s' ha sido ganada" - -#. module: crm -#: help:crm.meeting,alarm_id:0 -msgid "Set an alarm at this time, before the event occurs" -msgstr "Configure una alarma en este momento, antes de que ocurra el evento" - -#. module: crm -#: field:crm.lead.report,create_date:0 -#: field:crm.phonecall.report,create_date:0 -msgid "Create Date" -msgstr "Fecha creación" - -#. module: crm -#: field:crm.lead,ref2:0 -msgid "Reference 2" -msgstr "Referencia 2" - -#. module: crm -#: view:crm.segmentation:0 -msgid "Sales Purchase" -msgstr "Compra Ventas" - -#. module: crm -#: view:crm.case.stage:0 -#: field:crm.case.stage,requirements:0 -msgid "Requirements" -msgstr "Requerimientos" - -#. module: crm -#: help:crm.meeting,exdate:0 -msgid "This property defines the list of date/time exceptions for a recurring calendar component." -msgstr "Esta propiedad define la lista de excepciones de fecha/hora para un evento de calendario recurrente." - -#. module: crm -#: view:crm.phonecall2opportunity:0 -msgid "Convert To Opportunity " -msgstr "Convertir a oportunidad " - -#. module: crm -#: help:crm.case.stage,sequence:0 -msgid "Gives the sequence order when displaying a list of case stages." -msgstr "Indica el orden de secuencia cuando se muestra un lista de etapas de casos." - -#. module: crm -#: view:crm.lead:0 -#: field:crm.merge.opportunity,opportunity_ids:0 -#: model:ir.actions.act_window,name:crm.crm_case_category_act_oppor11 -#: model:ir.ui.menu,name:crm.menu_crm_case_opp -#: model:process.node,name:crm.process_node_opportunities0 -msgid "Opportunities" -msgstr "Oportunidades" - -#. module: crm -#: field:crm.segmentation,categ_id:0 -msgid "Partner Category" -msgstr "Categoría de empresa" - -#. module: crm -#: view:crm.add.note:0 -#: model:ir.actions.act_window,name:crm.action_crm_add_note -msgid "Add Note" -msgstr "Añadir nota" - -#. module: crm -#: field:crm.lead,is_supplier_add:0 -msgid "Supplier" -msgstr "Proveedor" - -#. module: crm -#: help:crm.send.mail,reply_to:0 -msgid "Reply-to of the Sales team defined on this case" -msgstr "\"Responder a\" del equipo de ventas definido en este caso" - -#. module: crm -#: view:crm.lead:0 -msgid "Mark Won" -msgstr "Marcar ganado" - -#. module: crm -#: selection:crm.segmentation.line,expr_name:0 -msgid "Purchase Amount" -msgstr "Importe de compra" - -#. module: crm -#: view:crm.lead:0 -msgid "Mark Lost" -msgstr "Marcar perdido" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "March" -msgstr "Marzo" - -#. module: crm -#: code:addons/crm/crm_lead.py:230 -#, python-format -msgid "The opportunity '%s' has been closed." -msgstr "La oportunidad '%s' ha sido cerrada" - -#. module: crm -#: field:crm.lead,day_open:0 -msgid "Days to Open" -msgstr "Días para abrir" - -#. module: crm -#: view:crm.meeting:0 -msgid "Show Time as" -msgstr "Mostrar hora como" - -#. module: crm -#: code:addons/crm/crm_lead.py:264 -#: view:crm.phonecall2partner:0 -#, python-format -msgid "Create Partner" -msgstr "Crear empresa" - -#. module: crm -#: selection:crm.segmentation.line,expr_operator:0 -msgid "<" -msgstr "<" - -#. module: crm -#: field:crm.lead,mobile:0 -#: field:crm.phonecall,partner_mobile:0 -msgid "Mobile" -msgstr "Móvil" - -#. module: crm -#: field:crm.meeting,end_type:0 -msgid "Way to end reccurency" -msgstr "Forma de terminar recurrencia" - -#. module: crm -#: code:addons/crm/wizard/crm_merge_opportunities.py:53 -#, python-format -msgid "There are no other 'Open' or 'Pending' Opportunities for the partner '%s'." -msgstr "No existen más oportunidades 'Abiertas' o 'Pendientes' para la empresa '%s'." - -#. module: crm -#: view:crm.lead:0 -msgid "Next Stage" -msgstr "Siguiente etapa" - -#. module: crm -#: view:board.board:0 -msgid "My Meetings" -msgstr "Mis reuniones" - -#. module: crm -#: field:crm.lead,ref:0 -msgid "Reference" -msgstr "Referencia" - -#. module: crm -#: field:crm.lead,optin:0 -msgid "Opt-In" -msgstr "Acepta recibir emails" - -#. module: crm -#: code:addons/crm/crm_opportunity.py:208 -#: code:addons/crm/crm_phonecall.py:185 -#: code:addons/crm/wizard/crm_phonecall_to_meeting.py:55 -#: code:addons/crm/wizard/crm_phonecall_to_meeting.py:137 -#: view:crm.meeting:0 -#: model:ir.actions.act_window,name:crm.act_crm_opportunity_crm_meeting_new -#: model:ir.actions.act_window,name:crm.crm_case_categ_meet -#: model:ir.ui.menu,name:crm.menu_crm_case_categ_meet -#: model:ir.ui.menu,name:crm.menu_meeting_sale -#: view:res.partner:0 -#: field:res.partner,meeting_ids:0 -#, python-format -msgid "Meetings" -msgstr "Reuniones" - -#. module: crm -#: view:crm.meeting:0 -msgid "Choose day where repeat the meeting" -msgstr "Eligir día en el que repetir la cita" - -#. module: crm -#: field:crm.lead,date_action_next:0 -#: field:crm.lead,title_action:0 -#: field:crm.meeting,date_action_next:0 -#: field:crm.phonecall,date_action_next:0 -msgid "Next Action" -msgstr "Acción siguiente" - -#. module: crm -#: field:crm.meeting,end_date:0 -msgid "Repeat Until" -msgstr "Repetir hasta" - -#. module: crm -#: field:crm.meeting,date_deadline:0 -msgid "Deadline" -msgstr "Fecha límite" - -#. module: crm -#: help:crm.meeting,active:0 -msgid "If the active field is set to true, it will allow you to hide the event alarm information without removing it." -msgstr "Si el campo activo se establece en verdadero, se omitirá la alarma del evento, sin embargo no se eliminará." - -#. module: crm -#: code:addons/crm/wizard/crm_phonecall_to_opportunity.py:57 -#, python-format -msgid "Closed/Cancelled Phone Call Could not convert into Opportunity" -msgstr "Las llamadas telefónicas cerradas/canceladas no podrían ser convertidas en oportunidades" - -#. module: crm -#: view:crm.segmentation:0 -msgid "Partner Segmentations" -msgstr "Segmentaciones de empresa" - -#. module: crm -#: view:crm.meeting:0 -#: field:crm.meeting,user_id:0 -#: view:crm.phonecall:0 -#: field:crm.phonecall,user_id:0 -#: view:res.partner:0 -msgid "Responsible" -msgstr "Responsable" - -#. module: crm -#: view:res.partner:0 -msgid "Previous" -msgstr "Anterior" - -#. module: crm -#: view:crm.lead:0 -msgid "Statistics" -msgstr "Estadísticas" - -#. module: crm -#: view:crm.meeting:0 -#: field:crm.send.mail,email_from:0 -msgid "From" -msgstr "De" - -#. module: crm -#: view:crm.lead2opportunity.action:0 -#: view:res.partner:0 -msgid "Next" -msgstr "Siguiente" - -#. module: crm -#: view:crm.lead:0 -msgid "Stage:" -msgstr "Etapa:" - -#. module: crm -#: model:crm.case.stage,name:crm.stage_lead5 -#: model:crm.case.stage,name:crm.stage_opportunity5 -#: view:crm.lead:0 -msgid "Won" -msgstr "Ganado" - -#. module: crm -#: field:crm.lead.report,delay_expected:0 -msgid "Overpassed Deadline" -msgstr "Fecha límite sobrepasada" - -#. module: crm -#: model:crm.case.section,name:crm.section_sales_department -msgid "Sales Department" -msgstr "Departamento de ventas" - -#. module: crm -#: field:crm.send.mail,html:0 -msgid "HTML formatting?" -msgstr "Formato HTML?" - -#. module: crm -#: field:crm.case.stage,type:0 -#: field:crm.lead,type:0 -#: field:crm.lead.report,type:0 -#: view:crm.meeting:0 -#: view:crm.phonecall:0 -#: view:crm.phonecall.report:0 -#: view:res.partner:0 -msgid "Type" -msgstr "Tipo" - -#. module: crm -#: view:crm.segmentation:0 -msgid "Compute Segmentation" -msgstr "Calcular la segmentación" - -#. module: crm -#: selection:crm.lead,priority:0 -#: selection:crm.lead.report,priority:0 -#: selection:crm.phonecall,priority:0 -#: selection:crm.phonecall.report,priority:0 -msgid "Lowest" -msgstr "Muy bajo" - -#. module: crm -#: view:crm.add.note:0 -#: view:crm.send.mail:0 -#: field:crm.send.mail.attachment,binary:0 -msgid "Attachment" -msgstr "Adjunto" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "August" -msgstr "Agosto" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,create_date:0 -#: field:crm.lead.report,creation_date:0 -#: field:crm.meeting,create_date:0 -#: field:crm.phonecall,create_date:0 -#: field:crm.phonecall.report,creation_date:0 -msgid "Creation Date" -msgstr "Fecha creación" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor5 -msgid "Need a Website Design" -msgstr "Necesita un diseño de sitio web" - -#. module: crm -#: field:crm.meeting,recurrent_uid:0 -msgid "Recurrent ID" -msgstr "ID recurrente" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.meeting:0 -#: field:crm.send.mail,subject:0 -#: view:res.partner:0 -msgid "Subject" -msgstr "Asunto" - -#. module: crm -#: field:crm.meeting,tu:0 -msgid "Tue" -msgstr "Mar" - -#. module: crm -#: code:addons/crm/crm_lead.py:300 -#: view:crm.case.stage:0 -#: view:crm.lead:0 -#: field:crm.lead,stage_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,stage_id:0 -#, python-format -msgid "Stage" -msgstr "Etapa" - -#. module: crm -#: view:crm.lead:0 -msgid "History Information" -msgstr "Histórico información" - -#. module: crm -#: field:base.action.rule,act_mail_to_partner:0 -msgid "Mail to Partner" -msgstr "Correo a la empresa" - -#. module: crm -#: view:crm.lead:0 -msgid "Mailings" -msgstr "Correos" - -#. module: crm -#: field:crm.meeting,class:0 -msgid "Mark as" -msgstr "Marcar como" - -#. module: crm -#: field:crm.meeting,count:0 -msgid "Repeat" -msgstr "Repetir" - -#. module: crm -#: help:crm.meeting,rrule_type:0 -msgid "Let the event automatically repeat at that interval" -msgstr "Permite que el evento se repita en ese intervalo" - -#. module: crm -#: view:base.action.rule:0 -msgid "Condition Case Fields" -msgstr "Campos de condiciones de casos" - -#. module: crm -#: model:ir.module.module,description:crm.module_meta_information -msgid "The generic OpenERP Customer Relationship Management\n" -"system enables a group of people to intelligently and efficiently manage\n" -"leads, opportunities, meeting, phonecall etc.\n" -"It manages key tasks such as communication, identification, prioritization,\n" -"assignment, resolution and notification.\n" -"\n" -"OpenERP ensures that all cases are successfully tracked by users, customers and\n" -"suppliers. It can automatically send reminders, escalate the request, trigger\n" -"specific methods and lots of other actions based on your own enterprise rules.\n" -"\n" -"The greatest thing about this system is that users don't need to do anything\n" -"special. They can just send email to the request tracker. OpenERP will take\n" -"care of thanking them for their message, automatically routing it to the\n" -"appropriate staff, and make sure all future correspondence gets to the right\n" -"place.\n" -"\n" -"The CRM module has a email gateway for the synchronisation interface\n" -"between mails and OpenERP.\n" -"Create dashboard for CRM that includes:\n" -" * My Leads (list)\n" -" * Leads by Stage (graph)\n" -" * My Meetings (list)\n" -" * Sales Pipeline by Stage (graph)\n" -" * My Cases (list)\n" -" * Jobs Tracking (graph)\n" -"" -msgstr "El sistema de Gestion de Relaciones con Cliente en OpenERP \n" -"le permite a un grupo de personas \n" -"leads, opportunities, meeting, phonecall etc.\n" -"It manages key tasks such as communication, identification, prioritization,\n" -"assignment, resolution and notification.\n" -"\n" -"OpenERP ensures that all cases are successfully tracked by users, customers and\n" -"suppliers. It can automatically send reminders, escalate the request, trigger\n" -"specific methods and lots of other actions based on your own enterprise rules.\n" -"\n" -"The greatest thing about this system is that users don't need to do anything\n" -"special. They can just send email to the request tracker. OpenERP will take\n" -"care of thanking them for their message, automatically routing it to the\n" -"appropriate staff, and make sure all future correspondence gets to the right\n" -"place.\n" -"\n" -"The CRM module has a email gateway for the synchronisation interface\n" -"between mails and OpenERP.\n" -"Create dashboard for CRM that includes:\n" -" * My Leads (list)\n" -" * Leads by Stage (graph)\n" -" * My Meetings (list)\n" -" * Sales Pipeline by Stage (graph)\n" -" * My Cases (list)\n" -" * Jobs Tracking (graph)\n" -"" - -#. module: crm -#: view:crm.case.section:0 -#: field:crm.case.section,stage_ids:0 -#: view:crm.case.stage:0 -#: model:ir.actions.act_window,name:crm.crm_case_stage_act -#: model:ir.actions.act_window,name:crm.crm_lead_stage_act -#: model:ir.actions.act_window,name:crm.crm_opportunity_stage_act -#: model:ir.ui.menu,name:crm.menu_crm_lead_stage_act -#: model:ir.ui.menu,name:crm.menu_crm_opportunity_stage_act -msgid "Stages" -msgstr "Etapas" - -#. module: crm -#: field:crm.lead,planned_revenue:0 -#: field:crm.lead2opportunity,planned_revenue:0 -#: field:crm.partner2opportunity,planned_revenue:0 -#: field:crm.phonecall2opportunity,planned_revenue:0 -msgid "Expected Revenue" -msgstr "Ingreso estimado" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_phonecall_categ_action -msgid "Create specific phone call categories to better define the type of calls tracked in the system." -msgstr "Crear categorías específicas de llamada telefónica para definir mejor el tipo de llamadas en el sistema de seguimiento." - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "September" -msgstr "Setiembre" - -#. module: crm -#: field:crm.segmentation,partner_id:0 -msgid "Max Partner ID processed" -msgstr "Máx ID de empresa procesado" - -#. module: crm -#: model:ir.actions.act_window,name:crm.action_report_crm_phonecall -#: model:ir.ui.menu,name:crm.menu_report_crm_phonecalls_tree -msgid "Phone Calls Analysis" -msgstr "Análisis de llamadas" - -#. module: crm -#: field:crm.lead.report,opening_date:0 -#: field:crm.phonecall.report,opening_date:0 -msgid "Opening Date" -msgstr "Fecha de apertura" - -#. module: crm -#: help:crm.phonecall,duration:0 -msgid "Duration in Minutes" -msgstr "Duración en minutos" - -#. module: crm -#: help:crm.installer,crm_helpdesk:0 -msgid "Manages a Helpdesk service." -msgstr "Gestiona un servicio de soporte." - -#. module: crm -#: field:crm.partner2opportunity,name:0 -msgid "Opportunity Name" -msgstr "Nombre oportunidad" - -#. module: crm -#: help:crm.case.section,active:0 -msgid "If the active field is set to true, it will allow you to hide the sales team without removing it." -msgstr "Si el campo activo se marca, permite ocultar el equipo de ventas sin eliminarlo." - -#. module: crm -#: view:crm.lead.report:0 -#: view:crm.phonecall.report:0 -msgid " Year " -msgstr " Año " - -#. module: crm -#: field:crm.meeting,edit_all:0 -msgid "Edit All" -msgstr "Editar todo" - -#. module: crm -#: field:crm.meeting,fr:0 -msgid "Fri" -msgstr "Vie" - -#. module: crm -#: model:ir.model,name:crm.model_crm_lead -msgid "crm.lead" -msgstr "crm.iniciativa" - -#. module: crm -#: field:crm.meeting,write_date:0 -msgid "Write Date" -msgstr "Fecha escritura" - -#. module: crm -#: view:crm.meeting:0 -msgid "End of Recurrency" -msgstr "Fin de recurrencia" - -#. module: crm -#: view:crm.meeting:0 -msgid "Reminder" -msgstr "Recordatorio" - -#. module: crm -#: help:crm.segmentation,sales_purchase_active:0 -msgid "Check if you want to use this tab as part of the segmentation rule. If not checked, the criteria beneath will be ignored" -msgstr "Márquela si quiere utilizar esta pestaña como parte de la regla de segmentación. Si no se marca, los criterios que contenga serán ignorados" - -#. module: crm -#: view:crm.lead2opportunity.partner:0 -#: view:crm.lead2partner:0 -#: view:crm.phonecall:0 -#: view:crm.phonecall2partner:0 -#: model:ir.actions.act_window,name:crm.action_crm_lead2partner -#: model:ir.actions.act_window,name:crm.action_crm_phonecall2partner -#: view:res.partner:0 -msgid "Create a Partner" -msgstr "Crear una empresa" - -#. module: crm -#: field:crm.segmentation,state:0 -msgid "Execution Status" -msgstr "Estado ejecución" - -#. module: crm -#: selection:crm.meeting,week_list:0 -msgid "Monday" -msgstr "Lunes" - -#. module: crm -#: field:crm.lead,day_close:0 -msgid "Days to Close" -msgstr "Días para el cierre" - -#. module: crm -#: field:crm.add.note,attachment_ids:0 -#: field:crm.case.section,complete_name:0 -#: field:crm.send.mail,attachment_ids:0 -msgid "unknown" -msgstr "desconocido" - -#. module: crm -#: field:crm.lead,id:0 -#: field:crm.meeting,id:0 -#: field:crm.phonecall,id:0 -msgid "ID" -msgstr "ID" - -#. module: crm -#: model:ir.model,name:crm.model_crm_partner2opportunity -msgid "Partner To Opportunity" -msgstr "Empresa a oportunidad" - -#. module: crm -#: view:crm.meeting:0 -#: field:crm.meeting,date:0 -#: field:crm.opportunity2phonecall,date:0 -#: view:crm.phonecall:0 -#: field:crm.phonecall,date:0 -#: field:crm.phonecall2phonecall,date:0 -#: view:res.partner:0 -msgid "Date" -msgstr "Fecha" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.lead.report:0 -#: view:crm.meeting:0 -#: view:crm.phonecall.report:0 -msgid "Extended Filters..." -msgstr "Filtros extendidos..." - -#. module: crm -#: field:crm.phonecall2opportunity,name:0 -msgid "Opportunity Summary" -msgstr "Resumen oportunidad" - -#. module: crm -#: view:crm.phonecall.report:0 -msgid "Search" -msgstr "Buscar" - -#. module: crm -#: view:board.board:0 -msgid "Opportunities by Categories" -msgstr "Oportunidades por categorías" - -#. module: crm -#: view:crm.meeting:0 -msgid "Choose day in the month where repeat the meeting" -msgstr "Elija el día del mes en que se repetirá la cita." - -#. module: crm -#: view:crm.lead:0 -#: view:res.partner:0 -msgid "History" -msgstr "Historial" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_segmentation_tree-act -msgid "Create specific partner categories which you can assign to your partners to better manage your interactions with them. The segmentation tool is able to assign categories to partners according to criteria you set." -msgstr "Cree categorías de empresa específicas para gestionar mejor sus interacciones con ellas. La herramienta de segmentación es capaz de asignar categorías a empresas de acuerdo a los criterios que establezca." - -#. module: crm -#: field:crm.case.section,code:0 -msgid "Code" -msgstr "Código" - -#. module: crm -#: field:crm.case.section,child_ids:0 -msgid "Child Teams" -msgstr "Equipos hijos" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,state:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,state:0 -#: view:crm.meeting:0 -#: field:crm.meeting,state:0 -#: field:crm.phonecall,state:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,state:0 -msgid "State" -msgstr "Estado" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead1 -msgid "Telesales" -msgstr "Telesales" - -#. module: crm -#: field:crm.meeting,freq:0 -msgid "Frequency" -msgstr "Frecuencia" - -#. module: crm -#: view:crm.lead:0 -msgid "References" -msgstr "Referencias" - -#. module: crm -#: code:addons/crm/crm.py:392 -#: view:crm.lead:0 -#: view:crm.lead2opportunity:0 -#: view:crm.lead2opportunity.action:0 -#: view:crm.lead2opportunity.partner:0 -#: view:crm.lead2partner:0 -#: view:crm.phonecall:0 -#: view:crm.phonecall2partner:0 -#: view:res.partner:0 -#, python-format -msgid "Cancel" -msgstr "Cancelar" - -#. module: crm -#: model:ir.model,name:crm.model_res_users -msgid "res.users" -msgstr "res.usuarios" - -#. module: crm -#: model:ir.model,name:crm.model_crm_merge_opportunity -msgid "Merge two Opportunities" -msgstr "Fusionar dos oportunidades" - -#. module: crm -#: selection:crm.meeting,end_type:0 -msgid "Fix amout of times" -msgstr "Cantidad fija de veces" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.meeting:0 -#: view:crm.phonecall:0 -msgid "Current" -msgstr "Actual" - -#. module: crm -#: field:crm.meeting,exrule:0 -msgid "Exception Rule" -msgstr "Exception de regla" - -#. module: crm -#: help:base.action.rule,act_mail_to_partner:0 -msgid "Check this if you want the rule to send an email to the partner." -msgstr "Verifica esto si tu quieres enviar la norma en un correo electronico a el socio" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_phonecall_categ_action -msgid "Phonecall Categories" -msgstr "Categorías de llamadas" - -#. module: crm -#: view:crm.meeting:0 -msgid "Invite People" -msgstr "Invitar personas" - -#. module: crm -#: constraint:crm.case.section:0 -msgid "Error ! You cannot create recursive Sales team." -msgstr "¡Error! No puede crear equipos de ventas recursivos." - -#. module: crm -#: view:crm.meeting:0 -msgid "Search Meetings" -msgstr "Buscar reuniones" - -#. module: crm -#: selection:crm.segmentation.line,expr_name:0 -msgid "Sale Amount" -msgstr "Importe de venta" - -#. module: crm -#: code:addons/crm/wizard/crm_send_email.py:141 -#, python-format -msgid "Unable to send mail. Please check SMTP is configured properly." -msgstr "Imposible enviar el correo electrónico. Verifique que la configuración SMTP sea correcta." - -#. module: crm -#: selection:crm.segmentation.line,expr_operator:0 -msgid "=" -msgstr "=" - -#. module: crm -#: selection:crm.meeting,state:0 -msgid "Unconfirmed" -msgstr "No confirmado" - -#. module: crm -#: model:ir.actions.act_window,help:crm.action_report_crm_opportunity -msgid "Opportunities Analysis gives you an instant access to your opportunities with information such as the expected revenue, planned cost, missed deadlines or the number of interactions per opportunity. This report is mainly used by the sales manager in order to do the periodic review with the teams of the sales pipeline." -msgstr "El análisis de oportunidades le da acceso instantáneo a sus oportunidades con información como el ingreso previsto, coste planeado, fechas límite incumplidas o el número de interacciones por oportunidad. Este informe lo utiliza principalmente el responsable de ventas para hacer una revisión periódica del proceso de ventas con los equipos." - -#. module: crm -#: field:crm.case.categ,name:0 -#: field:crm.installer,name:0 -#: field:crm.lead,name:0 -#: field:crm.segmentation,name:0 -#: field:crm.send.mail.attachment,name:0 -msgid "Name" -msgstr "Nombre" - -#. module: crm -#: field:crm.meeting,alarm_id:0 -#: field:crm.meeting,base_calendar_alarm_id:0 -msgid "Alarm" -msgstr "Alarma" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_lead_stage_act -msgid "Add specific stages to leads and opportunities allowing your sales to better organise their sales pipeline. Stages will allow them to easily track how a specific lead or opportunity is positioned in the sales cycle." -msgstr "Agregar etapas específicas de iniciativas y oportunidades para organizar mejor su flujo de ventas. Estas etapas permitirán un fácil seguimiento de iniciativas u oportunidades en relación al ciclo de ventas." - -#. module: crm -#: view:crm.lead.report:0 -#: view:crm.phonecall.report:0 -msgid "My Case(s)" -msgstr "Mi(s) caso(s)" - -#. module: crm -#: field:crm.lead,birthdate:0 -msgid "Birthdate" -msgstr "Fecha de nacimiento" - -#. module: crm -#: view:crm.meeting:0 -msgid "The" -msgstr "El" - -#. module: crm -#: field:crm.send.mail.attachment,wizard_id:0 -msgid "Wizard" -msgstr "Asistente" - -#. module: crm -#: help:crm.lead,section_id:0 -msgid "Sales team to which this case belongs to. Defines responsible user and e-mail address for the mail gateway." -msgstr "El equipo de ventas al que pertenece este caso. Define el usuario responsable y la dirección de correo electrónico para la pasarela de correo." - -#. module: crm -#: view:crm.lead:0 -#: view:crm.phonecall:0 -msgid "Creation" -msgstr "Creación" - -#. module: crm -#: selection:crm.lead,priority:0 -#: selection:crm.lead.report,priority:0 -#: selection:crm.phonecall,priority:0 -#: selection:crm.phonecall.report,priority:0 -msgid "High" -msgstr "Alto" - -#. module: crm -#: model:process.node,note:crm.process_node_partner0 -msgid "Convert to prospect to business partner" -msgstr "Convertir prospección a empresa" - -#. module: crm -#: view:crm.phonecall2opportunity:0 -msgid "_Convert" -msgstr "_Convertir" - -#. module: crm -#: model:ir.actions.act_window,help:crm.action_view_attendee_form -msgid "With Meeting Invitations you can create and manage the meeting invitations sent/to be sent to your colleagues/partners. You can not only invite OpenERP users, but also external parties, such as a customer." -msgstr "Con invitaciones a reuniones puede crear y gesionar las invitaciones de reuniones enviadas / por enviar a sus compañeros de trabajo / empresas. La invitación no debe ser únicamente para usuarios de OpenERP, puede ser igualmente para terceros externos, como un cliente." - -#. module: crm -#: selection:crm.meeting,week_list:0 -msgid "Saturday" -msgstr "Sábado" - -#. module: crm -#: selection:crm.meeting,byday:0 -msgid "Fifth" -msgstr "Quinto" - -#. module: crm -#: view:crm.phonecall2phonecall:0 -msgid "_Schedule" -msgstr "_Calendario" - -#. module: crm -#: field:crm.lead.report,delay_close:0 -msgid "Delay to Close" -msgstr "Tiempo restante para el cierre" - -#. module: crm -#: field:crm.meeting,we:0 -msgid "Wed" -msgstr "Mier" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor6 -msgid "Potential Reseller" -msgstr "Distribuidor potencial" - -#. module: crm -#: field:crm.lead.report,planned_revenue:0 -msgid "Planned Revenue" -msgstr "Ingresos previstos" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.lead.report:0 -#: view:crm.meeting:0 -#: view:crm.phonecall:0 -#: view:crm.phonecall.report:0 -msgid "Group By..." -msgstr "Agrupar por..." - -#. module: crm -#: help:crm.lead,partner_id:0 -msgid "Optional linked partner, usually after conversion of the lead" -msgstr "Empresa relacionada opcional, normalmente después de la conversión de la iniciativa" - -#. module: crm -#: view:crm.meeting:0 -msgid "Invitation details" -msgstr "Detalles de la invitación" - -#. module: crm -#: field:crm.case.section,parent_id:0 -msgid "Parent Team" -msgstr "Equipo padre" - -#. module: crm -#: field:crm.lead,date_action:0 -msgid "Next Action Date" -msgstr "Fecha de la próxima acción" - -#. module: crm -#: selection:crm.segmentation,state:0 -msgid "Running" -msgstr "En proceso" - -#. module: crm -#: selection:crm.meeting,freq:0 -msgid "Hours" -msgstr "Horas" - -#. module: crm -#: field:crm.lead,zip:0 -msgid "Zip" -msgstr "Código postal" - -#. module: crm -#: code:addons/crm/crm_lead.py:213 -#, python-format -msgid "The case '%s' has been opened." -msgstr "El caso '%s' ha sido abierto" - -#. module: crm -#: view:crm.installer:0 -msgid "title" -msgstr "título" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_phone1 -#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_incoming0 -#: model:ir.ui.menu,name:crm.menu_crm_case_phone_inbound -msgid "Inbound" -msgstr "Entrante" - -#. module: crm -#: help:crm.case.stage,probability:0 -msgid "This percentage depicts the default/average probability of the Case for this stage to be a success" -msgstr "Este porcentaje representa la probabilidad por defecto / media para que los casos de esta etapa sean un éxito." - -#. module: crm -#: view:crm.phonecall.report:0 -#: model:ir.actions.act_window,name:crm.act_crm_opportunity_crm_phonecall_new -msgid "Phone calls" -msgstr "Llamadas telefónicas" - -#. module: crm -#: view:crm.lead:0 -msgid "Communication History" -msgstr "Historial de comunicaciones" - -#. module: crm -#: selection:crm.meeting,show_as:0 -msgid "Free" -msgstr "Libre" - -#. module: crm -#: view:crm.installer:0 -msgid "Synchronization" -msgstr "Sincronización" - -#. module: crm -#: field:crm.case.section,allow_unlink:0 -msgid "Allow Delete" -msgstr "Permitir eliminar" - -#. module: crm -#: field:crm.meeting,mo:0 -msgid "Mon" -msgstr "Lun" - -#. module: crm -#: selection:crm.lead,priority:0 -#: selection:crm.lead.report,priority:0 -#: selection:crm.phonecall,priority:0 -#: selection:crm.phonecall.report,priority:0 -msgid "Highest" -msgstr "Muy alto" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_incoming0 -msgid "The Inbound Calls tool allows you to log your inbound calls on the fly. Each call you get will appear on the partner form to trace every contact you have with a partner. From the phone call form, you can trigger a request for another call, a meeting or an opportunity." -msgstr "La herramienta de llamadas entrantes le permite seguir el rastro de sus llamadas entrantes en tiempo real. Cada llamada que reciba, aparecerá en el formulario de la empresa para dejar el rastro de cada contacto que tiene en una empresa. Desde el formulario de llamada telefónica, puede lanzar una solicitud para otra llamada, una reunión o una oportunidad" - -#. module: crm -#: help:crm.meeting,recurrency:0 -msgid "Recurrent Meeting" -msgstr "Reunión periódica" - -#. module: crm -#: view:crm.case.section:0 -#: view:crm.lead:0 -#: field:crm.lead,description:0 -msgid "Notes" -msgstr "Notas" - -#. module: crm -#: selection:crm.meeting,freq:0 -msgid "Days" -msgstr "Días" - -#. module: crm -#: field:crm.segmentation.line,expr_value:0 -msgid "Value" -msgstr "Valor" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.lead.report:0 -msgid "Opportunity by Categories" -msgstr "Oportunidades por categorías" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,partner_name:0 -msgid "Customer Name" -msgstr "Nombre del cliente" - -#. module: crm -#: model:ir.model,name:crm.model_crm_phonecall2opportunity -msgid "Phonecall To Opportunity" -msgstr "Llamada telefónica a oportunidad" - -#. module: crm -#: field:crm.case.section,reply_to:0 -msgid "Reply-To" -msgstr "Responder a" - -#. module: crm -#: view:crm.case.section:0 -msgid "Select Stages for this Sales Team" -msgstr "Seleccionar etapas para este equipo de ventas" - -#. module: crm -#: view:board.board:0 -msgid "Opportunities by Stage" -msgstr "Oportunidades por etapa" - -#. module: crm -#: view:crm.meeting:0 -msgid "Recurrency Option" -msgstr "Opción de recurrencia" - -#. module: crm -#: model:process.transition,note:crm.process_transition_leadpartner0 -msgid "Prospect is converting to business partner" -msgstr "El prospecto se convierte a partner" - -#. module: crm -#: view:crm.lead2opportunity:0 -#: view:crm.partner2opportunity:0 -#: model:ir.actions.act_window,name:crm.phonecall2opportunity_act -msgid "Convert To Opportunity" -msgstr "Convertir en oportunidad" - -#. module: crm -#: view:crm.phonecall:0 -#: view:crm.phonecall.report:0 -#: view:res.partner:0 -msgid "Held" -msgstr "Ocupado" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.phonecall:0 -#: view:res.partner:0 -msgid "Reset to Draft" -msgstr "Cambiar a borrador" - -#. module: crm -#: view:crm.lead:0 -msgid "Extra Info" -msgstr "Información extra" - -#. module: crm -#: view:crm.merge.opportunity:0 -#: model:ir.actions.act_window,name:crm.action_merge_opportunities -#: model:ir.actions.act_window,name:crm.merge_opportunity_act -msgid "Merge Opportunities" -msgstr "Fusionar oportunidades" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead5 -msgid "Google Adwords" -msgstr "Google Adwords" - -#. module: crm -#: model:ir.model,name:crm.model_crm_phonecall -msgid "crm.phonecall" -msgstr "crm.llamadateléfono" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead3 -msgid "Mail Campaign 2" -msgstr "Campaña mail 2" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead2 -msgid "Mail Campaign 1" -msgstr "Mail Campaign 1" - -#. module: crm -#: view:crm.lead:0 -msgid "Create" -msgstr "Crear" - -#. module: crm -#: view:crm.lead:0 -msgid "Dates" -msgstr "Fechas" - -#. module: crm -#: code:addons/crm/crm.py:492 -#, python-format -msgid "Send" -msgstr "Enviar" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,priority:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,priority:0 -#: field:crm.phonecall,priority:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,priority:0 -msgid "Priority" -msgstr "Prioridad" - -#. module: crm -#: field:crm.segmentation,sales_purchase_active:0 -msgid "Use The Sales Purchase Rules" -msgstr "Utiliza las reglas de compra ventas" - -#. module: crm -#: model:ir.model,name:crm.model_crm_lead2opportunity_partner -msgid "Lead To Opportunity Partner" -msgstr "Iniciativa a Oportunidad" - -#. module: crm -#: field:crm.meeting,location:0 -msgid "Location" -msgstr "Ubicación" - -#. module: crm -#: view:crm.lead:0 -msgid "Reply" -msgstr "Responder" - -#. module: crm -#: selection:crm.meeting,freq:0 -msgid "Weeks" -msgstr "Semanas" - -#. module: crm -#: model:process.node,note:crm.process_node_meeting0 -msgid "Schedule a normal or phone meeting" -msgstr "Programar una reunión normal o telefónica" - -#. module: crm -#: code:addons/crm/crm.py:375 -#, python-format -msgid "Error !" -msgstr "¡Error!" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_meeting_categ_action -msgid "Create different meeting categories to better organize and classify your meetings." -msgstr "Cree diferentes categorías de reuniones para organizarlas y clasificarlas mejor." - -#. module: crm -#: model:ir.model,name:crm.model_crm_segmentation_line -msgid "Segmentation line" -msgstr "Línea de segmentación" - -#. module: crm -#: view:crm.opportunity2phonecall:0 -#: view:crm.phonecall2phonecall:0 -msgid "Planned Date" -msgstr "Fecha prevista" - -#. module: crm -#: field:crm.meeting,base_calendar_url:0 -msgid "Caldav URL" -msgstr "URL de caldav" - -#. module: crm -#: view:crm.lead:0 -msgid "Expected Revenues" -msgstr "Ingresos esperados" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead6 -msgid "Google Adwords 2" -msgstr "Google Adwords 2" - -#. module: crm -#: help:crm.lead,type:0 -#: help:crm.lead.report,type:0 -msgid "Type is used to separate Leads and Opportunities" -msgstr "El tipo es utilizado para separar iniciativas y oportunidades" - -#. module: crm -#: view:crm.phonecall2partner:0 -msgid "Are you sure you want to create a partner based on this Phonecall ?" -msgstr "¿Está seguro que quiere crear una empresa basada en esta llamada telefónica?" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "July" -msgstr "Julio" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_case_section_act -msgid "Define a Sales Team to organize your different salesmen or sales departments into separate teams. Each team will work in its own list of opportunities, sales orders, etc. Each user can set a default team in his user preferences. The opportunities and sales order displayed, will automatically be filtered according to his team." -msgstr "Defina un equipo de ventas para organizar a sus diferentes vendedores o departamentos de ventas en equipos separados. Cada equipo trabajará en su propia lista de oportunidades, pedidos de venta, etc. Cada usuario puede configurar un equipo predeterminado en sus preferencias de usuario. Las oportunidades y pedidos de venta mostrados se filtrarán automáticamente de acuerdo a su equipo." - -#. module: crm -#: help:crm.meeting,count:0 -msgid "Repeat x times" -msgstr "Repetir x veces" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_case_section_act -#: model:ir.model,name:crm.model_crm_case_section -#: model:ir.ui.menu,name:crm.menu_crm_case_section_act -msgid "Sales Teams" -msgstr "Equipos de ventas" - -#. module: crm -#: model:ir.model,name:crm.model_crm_lead2partner -msgid "Lead to Partner" -msgstr "Inicaitiva a cliente" - -#. module: crm -#: field:crm.segmentation.line,segmentation_id:0 -#: model:ir.actions.act_window,name:crm.crm_segmentation-act -msgid "Segmentation" -msgstr "Segmentación" - -#. module: crm -#: view:crm.lead:0 -msgid "Team" -msgstr "Equipo" - -#. module: crm -#: field:crm.installer,outlook:0 -msgid "MS-Outlook" -msgstr "MS-Outlook" - -#. module: crm -#: view:crm.phonecall:0 -#: view:crm.phonecall.report:0 -#: view:res.partner:0 -msgid "Not Held" -msgstr "No ocupado" - -#. module: crm -#: field:crm.lead.report,probability:0 -msgid "Probability" -msgstr "Probabilidad" - -#. module: crm -#: view:crm.lead.report:0 -#: field:crm.lead.report,month:0 -#: field:crm.meeting,month_list:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,month:0 -msgid "Month" -msgstr "Mes" - -#. module: crm -#: view:crm.lead:0 -#: model:ir.actions.act_window,name:crm.crm_case_category_act_leads_all -#: model:ir.ui.menu,name:crm.menu_crm_case_categ0_act_leads -#: model:process.node,name:crm.process_node_leads0 -msgid "Leads" -msgstr "Iniciativas" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_case_category_act_leads_all -msgid "Leads allow you to manage and keep track of all initial contacts with a prospect or partner showing interest in your products or services. A lead is usually the first step in your sales cycle. Once qualified, a lead may be converted into a business opportunity, while creating the related partner for further detailed tracking of any linked activities. You can import a database of prospects, keep track of your business cards or integrate your website's contact form with the OpenERP Leads. Leads can be connected to the email gateway: new emails may create leads, each of them automatically gets the history of the conversation with the prospect." -msgstr "Las iniciativas le permiten gestionar y realizar un seguimiento de todos los contactos iniciales con un cliente potencial o socio que muestre interés en sus productos o servicios. Una iniciativa es generalmente el primer paso en su ciclo de ventas. Una vez identificada, una iniciativa se puede convertir en una oportunidad de negocio, creándose el socio correspondiente para el seguimiento detallado de cualquier actividad relacionada. Usted puede importar una base de datos de posibles clientes, realizar el seguimiento de sus tarjetas de visita o integrar el formulario de contacto de su sitio web con las iniciativas de OpenERP. Las iniciativas pueden ser conectadas a una pasarela de correo electrónico: los nuevos correos crearán nuevas iniciativas y cada una de ellas obtendrá automáticamente el historial de la conversación con el cliente potencial." - -#. module: crm -#: selection:crm.lead2opportunity.partner,action:0 -#: selection:crm.lead2partner,action:0 -#: selection:crm.phonecall2partner,action:0 -msgid "Create a new partner" -msgstr "Crear una nueva empresa" - -#. module: crm -#: view:crm.meeting:0 -#: view:res.partner:0 -msgid "Start Date" -msgstr "Fecha inicio" - -#. module: crm -#: selection:crm.phonecall,state:0 -#: view:crm.phonecall.report:0 -msgid "Todo" -msgstr "Por hacer" - -#. module: crm -#: view:crm.meeting:0 -msgid "Delegate" -msgstr "Delegar" - -#. module: crm -#: view:crm.meeting:0 -msgid "Decline" -msgstr "Rechazar" - -#. module: crm -#: help:crm.lead,optin:0 -msgid "If opt-in is checked, this contact has accepted to receive emails." -msgstr "Si opt-in está marcado, este contacto ha aceptado recibir correos electrónicos." - -#. module: crm -#: view:crm.meeting:0 -msgid "Reset to Unconfirmed" -msgstr "Restablecer a no confirmado" - -#. module: crm -#: code:addons/crm/wizard/crm_add_note.py:40 -#: view:crm.add.note:0 -#, python-format -msgid "Note" -msgstr "Nota" - -#. module: crm -#: constraint:res.users:0 -msgid "The chosen company is not in the allowed companies for this user" -msgstr "La compañía seleccionada no está en las compañías permitidas para este usuario" - -#. module: crm -#: selection:crm.lead,priority:0 -#: selection:crm.lead.report,priority:0 -#: selection:crm.phonecall,priority:0 -#: selection:crm.phonecall.report,priority:0 -msgid "Low" -msgstr "Bajo" - -#. module: crm -#: selection:crm.add.note,state:0 -#: field:crm.lead,date_closed:0 -#: selection:crm.lead,state:0 -#: view:crm.lead.report:0 -#: selection:crm.lead.report,state:0 -#: field:crm.meeting,date_closed:0 -#: selection:crm.merge.opportunity,state:0 -#: field:crm.phonecall,date_closed:0 -#: selection:crm.phonecall.report,state:0 -#: selection:crm.send.mail,state:0 -msgid "Closed" -msgstr "Cerrado" - -#. module: crm -#: view:crm.installer:0 -msgid "Plug-In" -msgstr "Conector" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_meet2 -msgid "Internal Meeting" -msgstr "Reunión interna" - -#. module: crm -#: code:addons/crm/crm.py:411 -#: selection:crm.add.note,state:0 -#: view:crm.lead:0 -#: selection:crm.lead,state:0 -#: view:crm.lead.report:0 -#: selection:crm.lead.report,state:0 -#: selection:crm.merge.opportunity,state:0 -#: selection:crm.phonecall,state:0 -#: selection:crm.phonecall.report,state:0 -#: selection:crm.send.mail,state:0 -#, python-format -msgid "Pending" -msgstr "Pendiente" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_meet1 -msgid "Customer Meeting" -msgstr "Reunión de cliente" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,email_cc:0 -msgid "Global CC" -msgstr "CC Global" - -#. module: crm -#: view:crm.phonecall:0 -#: model:ir.actions.act_window,name:crm.crm_case_categ_phone0 -#: model:ir.ui.menu,name:crm.menu_crm_case_phone -#: view:res.partner:0 -msgid "Phone Calls" -msgstr "Llamadas telefónicas" - -#. module: crm -#: help:crm.lead.report,delay_open:0 -#: help:crm.phonecall.report,delay_open:0 -msgid "Number of Days to open the case" -msgstr "Número de días para abrir el caso" - -#. module: crm -#: field:crm.lead,phone:0 -#: field:crm.phonecall,partner_phone:0 -msgid "Phone" -msgstr "Teléfono" - -#. module: crm -#: field:crm.case.section,active:0 -#: field:crm.lead,active:0 -#: view:crm.lead.report:0 -#: field:crm.meeting,active:0 -#: field:crm.phonecall,active:0 -msgid "Active" -msgstr "Activo" - -#. module: crm -#: code:addons/crm/crm_lead.py:306 -#, python-format -msgid "The stage of opportunity '%s' has been changed to '%s'." -msgstr "La fase de la oportunidad '%s' ha cambiado a '%s'." - -#. module: crm -#: selection:crm.segmentation.line,operator:0 -msgid "Mandatory Expression" -msgstr "Expresión obligatoria" - -#. module: crm -#: selection:crm.segmentation.line,expr_operator:0 -msgid ">" -msgstr ">" - -#. module: crm -#: view:crm.meeting:0 -msgid "Uncertain" -msgstr "Incierto" - -#. module: crm -#: field:crm.send.mail,email_cc:0 -msgid "CC" -msgstr "CC" - -#. module: crm -#: view:crm.send.mail:0 -#: model:ir.actions.act_window,name:crm.action_crm_send_mail -msgid "Send Mail" -msgstr "Enviar correo" - -#. module: crm -#: selection:crm.meeting,freq:0 -msgid "Months" -msgstr "Meses" - -#. module: crm -#: help:crm.installer,wiki_sale_faq:0 -msgid "Helps you manage wiki pages for Frequently Asked Questions on Sales Application." -msgstr "Le ayuda a organizar páginas wiki para preguntas frecuentes sobre la aplicación de ventas" - -#. module: crm -#: help:crm.installer,crm_fundraising:0 -msgid "This may help associations in their fundraising process and tracking." -msgstr "Puede ayudar a las asociaciones en su proceso de obtención de fondos y seguimiento." - -#. module: crm -#: field:crm.lead2opportunity.partner,action:0 -#: field:crm.lead2partner,action:0 -#: field:crm.phonecall2partner,action:0 -msgid "Action" -msgstr "Acción" - -#. module: crm -#: field:crm.installer,crm_claim:0 -msgid "Claims" -msgstr "Reclamaciones" - -#. module: crm -#: field:crm.segmentation,som_interval_decrease:0 -msgid "Decrease (0>1)" -msgstr "Disminuir (0>1)" - -#. module: crm -#: view:crm.add.note:0 -#: view:crm.lead:0 -#: view:crm.send.mail:0 -msgid "Attachments" -msgstr "Datos adjuntos" - -#. module: crm -#: selection:crm.meeting,rrule_type:0 -msgid "Weekly" -msgstr "Semanal" - -#. module: crm -#: view:crm.lead.report:0 -#: model:ir.actions.act_window,name:crm.action_report_crm_opportunity -#: model:ir.ui.menu,name:crm.menu_report_crm_opportunities_tree -msgid "Opportunities Analysis" -msgstr "Análisis de oportunidades" - -#. module: crm -#: view:crm.lead:0 -msgid "Misc" -msgstr "Varios" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor8 -#: view:crm.meeting:0 -msgid "Other" -msgstr "Otro" - -#. module: crm -#: view:crm.meeting:0 -#: selection:crm.meeting,state:0 -#: selection:crm.phonecall,state:0 -msgid "Done" -msgstr "Hecho" - -#. module: crm -#: help:crm.meeting,interval:0 -msgid "Repeat every (Days/Week/Month/Year)" -msgstr "Repetir cada (días/semana/mes/año)" - -#. module: crm -#: field:crm.segmentation,som_interval_max:0 -msgid "Max Interval" -msgstr "Intervalo máx" - -#. module: crm -#: view:crm.opportunity2phonecall:0 -msgid "_Schedule Call" -msgstr "_Programar llamada" - -#. module: crm -#: code:addons/crm/crm.py:326 -#: selection:crm.add.note,state:0 -#: view:crm.lead:0 -#: selection:crm.lead,state:0 -#: selection:crm.lead.report,state:0 -#: selection:crm.merge.opportunity,state:0 -#: view:crm.phonecall:0 -#: selection:crm.phonecall.report,state:0 -#: selection:crm.send.mail,state:0 -#: view:res.partner:0 -#, python-format -msgid "Open" -msgstr "Abierto" - -#. module: crm -#: selection:crm.meeting,week_list:0 -msgid "Tuesday" -msgstr "Martes" - -#. module: crm -#: field:crm.lead,city:0 -msgid "City" -msgstr "Ciudad" - -#. module: crm -#: selection:crm.meeting,show_as:0 -msgid "Busy" -msgstr "Ocupado" - -#. module: crm -#: field:crm.meeting,interval:0 -msgid "Repeat every" -msgstr "Repetir cada" - -#. module: crm -#: field:crm.installer,crm_helpdesk:0 -msgid "Helpdesk" -msgstr "Asistencia/Ayuda" - -#. module: crm -#: field:crm.meeting,recurrency:0 -msgid "Recurrent" -msgstr "Recurrente" - -#. module: crm -#: code:addons/crm/crm.py:397 -#, python-format -msgid "The case '%s' has been cancelled." -msgstr "El caso '%s' ha sido cancelado" - -#. module: crm -#: field:crm.installer,sale_crm:0 -msgid "Opportunity to Quotation" -msgstr "Oportunidad a presupuesto" - -#. module: crm -#: model:ir.model,name:crm.model_crm_send_mail -msgid "Send new email" -msgstr "Enviar nuevo email" - -#. module: crm -#: view:board.board:0 -#: model:ir.actions.act_window,name:crm.act_my_oppor -msgid "My Open Opportunities" -msgstr "Mis oportunidades abiertas" - -#. module: crm -#: model:ir.actions.act_window,name:crm.open_board_statistical_dash -msgid "CRM - Statistics Dashboard" -msgstr "CRM - Tablero de estadísticas" - -#. module: crm -#: help:crm.meeting,rrule:0 -msgid "Defines a rule or repeating pattern for recurring events\n" -"e.g.: Every other month on the last Sunday of the month for 10 occurrences: FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU" -msgstr "Define una regla o patrón repetitivo para eventos recurrentes.\n" -"Por ejemplo: Para 10 ocurrencias cada último domingo de cada dos meses : FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU" - -#. module: crm -#: field:base.action.rule,trg_max_history:0 -msgid "Maximum Communication History" -msgstr "Máximo historial de comunicaciones" - -#. module: crm -#: view:crm.lead2opportunity.partner:0 -#: view:crm.lead2partner:0 -msgid "Are you sure you want to create a partner based on this lead ?" -msgstr "¿Está seguro que quiere crear una empresa basada en esta iniciativa?" - -#. module: crm -#: view:crm.meeting:0 -#: field:crm.meeting,categ_id:0 -msgid "Meeting Type" -msgstr "Tipo de reunión" - -#. module: crm -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:314 -#, python-format -msgid "Merge with Existing Opportunity" -msgstr "Fusinar con oportunidad existente" - -#. module: crm -#: help:crm.lead,state:0 -#: help:crm.phonecall,state:0 -msgid "The state is set to 'Draft', when a case is created. \n" -"If the case is in progress the state is set to 'Open'. \n" -"When the case is over, the state is set to 'Done'. \n" -"If the case needs to be reviewed then the state is set to 'Pending'." -msgstr "El estado se establece a 'Borrador', cuando se crea un caso. \n" -"Si el caso está en progreso el estado se establece a 'Abierto'. \n" -"Cuando el caso se cierra, el estado se establece a 'Realizado'. \n" -"Si el caso necesita ser revisado entonces en estado se establece a 'Pendiente'." - -#. module: crm -#: view:crm.meeting:0 -#: view:res.partner:0 -msgid "End Date" -msgstr "Fecha final" - -#. module: crm -#: selection:crm.meeting,byday:0 -msgid "Third" -msgstr "Tercero" - -#. module: crm -#: help:crm.segmentation,som_interval_max:0 -msgid "The computation is made on all events that occured during this interval, the past X periods." -msgstr "El cálculo se realiza en todos los eventos que ocurran durante este intervalo, los X períodos anteriores." - -#. module: crm -#: view:board.board:0 -msgid "My Win/Lost Ratio for the Last Year" -msgstr "Mi coeficiente ganado/perdido del año anterior" - -#. module: crm -#: field:crm.installer,thunderbird:0 -msgid "Thunderbird" -msgstr "Thunderbird" - -#. module: crm -#: view:crm.lead.report:0 -msgid "# of Emails" -msgstr "Nº de e-mails" - -#. module: crm -#: view:crm.lead:0 -msgid "Search Leads" -msgstr "Buscar iniciativas" - -#. module: crm -#: view:crm.lead.report:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,delay_open:0 -msgid "Delay to open" -msgstr "Retraso de apertura" - -#. module: crm -#: view:crm.meeting:0 -msgid "Recurrency period" -msgstr "Periodo de recurrencia" - -#. module: crm -#: field:crm.meeting,week_list:0 -msgid "Weekday" -msgstr "Día de la semana" - -#. module: crm -#: view:crm.lead:0 -msgid "Referrer" -msgstr "Referenciado por" - -#. module: crm -#: model:ir.model,name:crm.model_crm_lead2opportunity -msgid "Lead To Opportunity" -msgstr "Iniciativa a opportunidad" - -#. module: crm -#: model:ir.model,name:crm.model_calendar_attendee -msgid "Attendee information" -msgstr "Información asistentes" - -#. module: crm -#: view:crm.segmentation:0 -msgid "Segmentation Test" -msgstr "Prueba de segmentación" - -#. module: crm -#: view:crm.segmentation:0 -msgid "Continue Process" -msgstr "Continuar el proceso" - -#. module: crm -#: view:crm.installer:0 -msgid "Configure Your CRM Application" -msgstr "Configure su aplicación CRM" - -#. module: crm -#: model:ir.model,name:crm.model_crm_phonecall2partner -msgid "Phonecall to Partner" -msgstr "Llamada telefónica a empresa" - -#. module: crm -#: help:crm.lead,partner_name:0 -msgid "The name of the future partner that will be created while converting the into opportunity" -msgstr "El nombre del futuro cliente que se creará cuando se convierta en oportunidad." - -#. module: crm -#: field:crm.opportunity2phonecall,user_id:0 -#: field:crm.phonecall2phonecall,user_id:0 -msgid "Assign To" -msgstr "Asignar a" - -#. module: crm -#: field:crm.add.note,state:0 -#: field:crm.send.mail,state:0 -msgid "Set New State To" -msgstr "Establecer nuevo estado a" - -#. module: crm -#: field:crm.lead,date_action_last:0 -#: field:crm.meeting,date_action_last:0 -#: field:crm.phonecall,date_action_last:0 -msgid "Last Action" -msgstr "Última acción" - -#. module: crm -#: field:crm.meeting,duration:0 -#: field:crm.phonecall,duration:0 -#: field:crm.phonecall.report,duration:0 -msgid "Duration" -msgstr "Duración" - -#. module: crm -#: field:crm.send.mail,reply_to:0 -msgid "Reply To" -msgstr "Responder a" - -#. module: crm -#: view:board.board:0 -#: model:ir.actions.act_window,name:crm.open_board_crm -#: model:ir.ui.menu,name:crm.menu_board_crm -msgid "Sales Dashboard" -msgstr "Tablero de ventas" - -#. module: crm -#: code:addons/crm/wizard/crm_lead_to_partner.py:56 -#, python-format -msgid "A partner is already defined on this lead." -msgstr "Una empresa ya ha sido definida en esta iniciativa." - -#. module: crm -#: field:crm.lead.report,nbr:0 -#: field:crm.phonecall.report,nbr:0 -msgid "# of Cases" -msgstr "# de casos" - -#. module: crm -#: help:crm.meeting,section_id:0 -#: help:crm.phonecall,section_id:0 -msgid "Sales team to which Case belongs to." -msgstr "Equipo de ventas al cual pertence el caso" - -#. module: crm -#: selection:crm.meeting,week_list:0 -msgid "Sunday" -msgstr "Domingo" - -#. module: crm -#: selection:crm.meeting,byday:0 -msgid "Fourth" -msgstr "Cuarto" - -#. module: crm -#: selection:crm.add.note,state:0 -#: selection:crm.merge.opportunity,state:0 -#: selection:crm.send.mail,state:0 -msgid "Unchanged" -msgstr "Sin cambios" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_segmentation_tree-act -#: model:ir.ui.menu,name:crm.menu_crm_segmentation-act -msgid "Partners Segmentation" -msgstr "Segmentación de empresas" - -#. module: crm -#: field:crm.lead,fax:0 -msgid "Fax" -msgstr "Fax" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_case_category_act_oppor11 -msgid "With opportunities you can manage and keep track of your sales pipeline by creating specific customer- or prospect-related sales documents to follow up potential sales. Information such as expected revenue, opportunity stage, expected closing date, communication history and much more can be stored. Opportunities can be connected to the email gateway: new emails may create opportunities, each of them automatically gets the history of the conversation with the customer.\n" -"\n" -"You and your team(s) will be able to plan meetings and phone calls from opportunities, convert them into quotations, manage related documents, track all customer related activities, and much more." -msgstr "Con las oportunidades puede gestionar y guardar el registro de su canal de ventas creando documentos específicos de venta por cliente - o potencial cliente - para el seguimiento de sus ventas potenciales. La información sobre ingresos esperados, etapa de la oportunidad, fecha estimada de cierre, histórico de las comunicaciones y muchos otros datos puede ser registrada. Las oportunidades pueden ser conectadas a la pasarela de correo electrónico: nuevos emails pueden crear oportunidades, y cada uno de ellos obtiene automáticamente el historial de la conversación con el cliente." - -#. module: crm -#: view:crm.meeting:0 -msgid "Assignment" -msgstr "Asignación" - -#. module: crm -#: field:crm.lead,company_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,company_id:0 -#: field:crm.phonecall,company_id:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,company_id:0 -msgid "Company" -msgstr "Compañía" - -#. module: crm -#: selection:crm.meeting,week_list:0 -msgid "Friday" -msgstr "Viernes" - -#. module: crm -#: field:crm.meeting,allday:0 -msgid "All Day" -msgstr "Todo el día" - -#. module: crm -#: field:crm.segmentation.line,operator:0 -msgid "Mandatory / Optional" -msgstr "Obligatorio / Opcional" - -#. module: crm -#: model:ir.actions.act_window,name:crm.action_view_attendee_form -#: model:ir.ui.menu,name:crm.menu_attendee_invitations -msgid "Meeting Invitations" -msgstr "Invitaciones a reunión" - -#. module: crm -#: field:crm.case.categ,object_id:0 -msgid "Object Name" -msgstr "Nombre del objeto" - -#. module: crm -#: help:crm.lead,email_from:0 -msgid "E-mail address of the contact" -msgstr "e-mail del contacto" - -#. module: crm -#: field:crm.lead,referred:0 -msgid "Referred by" -msgstr "Referenciado por" - -#. module: crm -#: view:crm.lead:0 -#: model:ir.model,name:crm.model_crm_add_note -msgid "Add Internal Note" -msgstr "Añadir nota interna" - -#. module: crm -#: code:addons/crm/crm_lead.py:304 -#, python-format -msgid "The stage of lead '%s' has been changed to '%s'." -msgstr "La etapa de la iniciativa '%s' ha sido cambiada por '%s'" - -#. module: crm -#: selection:crm.meeting,byday:0 -msgid "Last" -msgstr "Último" - -#. module: crm -#: field:crm.lead,message_ids:0 -#: field:crm.meeting,message_ids:0 -#: field:crm.phonecall,message_ids:0 -msgid "Messages" -msgstr "Mensajes" - -#. module: crm -#: help:crm.case.stage,on_change:0 -msgid "Change Probability on next and previous stages." -msgstr "Cambiar probabilidad para las etapas siguientes y anteriores." - -#. module: crm -#: code:addons/crm/crm.py:455 -#: code:addons/crm/crm.py:457 -#: code:addons/crm/crm_action_rule.py:66 -#: code:addons/crm/wizard/crm_send_email.py:141 -#, python-format -msgid "Error!" -msgstr "¡Error!" - -#. module: crm -#: field:crm.opportunity2phonecall,name:0 -#: field:crm.phonecall2phonecall,name:0 -msgid "Call summary" -msgstr "Resumen de la llamada" - -#. module: crm -#: selection:crm.add.note,state:0 -#: selection:crm.lead,state:0 -#: selection:crm.lead.report,state:0 -#: selection:crm.meeting,state:0 -#: selection:crm.merge.opportunity,state:0 -#: selection:crm.phonecall,state:0 -#: selection:crm.phonecall.report,state:0 -#: selection:crm.send.mail,state:0 -msgid "Cancelled" -msgstr "Cancelado" - -#. module: crm -#: field:crm.add.note,body:0 -msgid "Note Body" -msgstr "Contenido de la nota" - -#. module: crm -#: view:board.board:0 -msgid "My Planned Revenues by Stage" -msgstr "Mis ingresos previstos por etapa" - -#. module: crm -#: field:crm.lead.report,date_closed:0 -#: field:crm.phonecall.report,date_closed:0 -msgid "Close Date" -msgstr "Fecha cierre" - -#. module: crm -#: view:crm.lead.report:0 -#: view:crm.phonecall.report:0 -msgid " Month " -msgstr " Mes " - -#. module: crm -#: view:crm.lead:0 -msgid "Links" -msgstr "Enlaces" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_lead_categ_action -msgid "Create specific categories that fit your company's activities to better classify and analyse your leads and opportunities. Such categories could for instance reflect your product structure or the different types of sales you do." -msgstr "Crear categorías específicas que se adapten a las actividades de su compañía para clasificar y analizar mejor sus iniciativas y oportunidades. Estas categorías podrían, por ejemplo, reflejar la estructura de sus productos o de los distintos tipos de ventas que realice." - -#. module: crm -#: help:crm.segmentation,som_interval_decrease:0 -msgid "If the partner has not purchased (or bought) during a period, decrease the state of mind by this factor. It's a multiplication" -msgstr "Si la empresa no ha comprado durante un período, disminuir el grado de satisfacción por este factor. Es una multiplicación." - -#. module: crm -#: model:ir.actions.act_window,help:crm.action_report_crm_phonecall -msgid "From this report, you can analyse the performance of your sales team, based on their phone calls. You can group or filter the information according to several criteria and drill down the information, by adding more groups in the report." -msgstr "Desde este informe, puede analizar el rendimiento de su equipo de ventas basándose en sus llamadas telefónicas. Puede agrupar o filtrar la información de acuerdo a varios criterios y profundizar en la información añadiendo más grupos al informe." - -#. module: crm -#: view:crm.case.section:0 -msgid "Mailgateway" -msgstr "Pasarela de correo" - -#. module: crm -#: help:crm.lead,user_id:0 -msgid "By Default Salesman is Administrator when create New User" -msgstr "Por defecto el vendedor es administrador cuando se crea un nuevo usuario" - -#. module: crm -#: view:crm.lead.report:0 -msgid "# Mails" -msgstr "Nº de correos" - -#. module: crm -#: code:addons/crm/wizard/crm_phonecall_to_opportunity.py:57 -#, python-format -msgid "Warning" -msgstr "Aviso" - -#. module: crm -#: field:crm.phonecall,name:0 -#: view:res.partner:0 -msgid "Call Summary" -msgstr "Resumen de llamadas" - -#. module: crm -#: field:crm.segmentation.line,expr_operator:0 -msgid "Operator" -msgstr "Operador" - -#. module: crm -#: view:crm.lead:0 -msgid "Schedule/Log Call" -msgstr "Planificar/Registrar llamada" - -#. module: crm -#: field:crm.installer,fetchmail:0 -msgid "Fetch Emails" -msgstr "Buscar emails" - -#. module: crm -#: selection:crm.meeting,state:0 -msgid "Confirmed" -msgstr "Confirmado" - -#. module: crm -#: help:crm.send.mail,email_cc:0 -msgid "These addresses will receive a copy of this email. To modify the permanent CC list, edit the global CC field of this case" -msgstr "Estas direcciones recibirán una copia de este correo electrónico. Para modificar la lista CC permanente, edite el campo CC global de este caso." - -#. module: crm -#: view:crm.meeting:0 -msgid "Confirm" -msgstr "Confirmar" - -#. module: crm -#: field:crm.meeting,su:0 -msgid "Sun" -msgstr "Dom" - -#. module: crm -#: field:crm.phonecall.report,section_id:0 -msgid "Section" -msgstr "Sección" - -#. module: crm -#: view:crm.lead:0 -msgid "Total of Planned Revenue" -msgstr "Total ingresos previstos" - -#. module: crm -#: code:addons/crm/crm.py:375 -#, python-format -msgid "You can not escalate, You are already at the top level regarding your sales-team category." -msgstr "No puede escalar, ya está en el nivel más alto en su categoría de equipo de ventas." - -#. module: crm -#: selection:crm.segmentation.line,operator:0 -msgid "Optional Expression" -msgstr "Expresión opcional" - -#. module: crm -#: selection:crm.meeting,select1:0 -msgid "Day of month" -msgstr "Día del mes" - -#. module: crm -#: field:crm.lead2opportunity,probability:0 -msgid "Success Rate (%)" -msgstr "Tasa de éxito (%)" - -#. module: crm -#: model:crm.case.stage,name:crm.stage_lead1 -#: model:crm.case.stage,name:crm.stage_opportunity1 -msgid "New" -msgstr "Nuevo" - -#. module: crm -#: view:crm.meeting:0 -msgid "Mail TO" -msgstr "Enviar correo a" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,email_from:0 -#: field:crm.meeting,email_from:0 -#: field:crm.phonecall,email_from:0 -msgid "Email" -msgstr "Email" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,channel_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,channel_id:0 -#: field:crm.phonecall,canal_id:0 -msgid "Channel" -msgstr "Canal" - -#. module: crm -#: model:ir.actions.act_window,name:crm.opportunity2phonecall_act -msgid "Schedule Call" -msgstr "Planificar llamada" - -#. module: crm -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:135 -#: code:addons/crm/wizard/crm_lead_to_opportunity.py:260 -#, python-format -msgid "Closed/Cancelled Leads Could not convert into Opportunity" -msgstr "Las iniciativas cerradas/canceladas no podrían ser convertidas en oportunidades" - -#. module: crm -#: help:crm.segmentation,exclusif:0 -msgid "Check if the category is limited to partners that match the segmentation criterions. \n" -"If checked, remove the category from partners that doesn't match segmentation criterions" -msgstr "Marque esta opción si la categoría está limitada a empresas que coincidan con los criterios de segmentación. \n" -"Si está marcada, elimina la categoría de aquellas empresas que no coincidan con los criterios de segmentación." - -#. module: crm -#: field:crm.meeting,exdate:0 -msgid "Exception Date/Times" -msgstr "Fecha/horas excepción" - -#. module: crm -#: selection:crm.meeting,class:0 -msgid "Confidential" -msgstr "Confidencial" - -#. module: crm -#: field:crm.lead,state_id:0 -msgid "Fed. State" -msgstr "Provincia" - -#. module: crm -#: model:process.transition,note:crm.process_transition_leadopportunity0 -msgid "Creating business opportunities from Leads" -msgstr "Creando oportunidades de negocio desde iniciativas" - -#. module: crm -#: help:crm.send.mail,html:0 -msgid "Select this if you want to send email with HTML formatting." -msgstr "Seleccione esta opción si desea enviar emails con formato HTML" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor4 -msgid "Need Information" -msgstr "Necesita información" - -#. module: crm -#: model:process.transition,name:crm.process_transition_leadopportunity0 -msgid "Prospect Opportunity" -msgstr "Oportunidad de prospección" - -#. module: crm -#: view:crm.installer:0 -#: model:ir.actions.act_window,name:crm.action_crm_installer -msgid "CRM Application Configuration" -msgstr "Configuración de la aplicación CRM" - -#. module: crm -#: field:base.action.rule,act_categ_id:0 -msgid "Set Category to" -msgstr "Establecer categoría" - -#. module: crm -#: view:crm.case.section:0 -msgid "Configuration" -msgstr "Configuración" - -#. module: crm -#: field:crm.meeting,th:0 -msgid "Thu" -msgstr "Jue" - -#. module: crm -#: view:crm.add.note:0 -#: view:crm.merge.opportunity:0 -#: view:crm.opportunity2phonecall:0 -#: view:crm.partner2opportunity:0 -#: view:crm.phonecall2opportunity:0 -#: view:crm.phonecall2phonecall:0 -#: view:crm.send.mail:0 -msgid "_Cancel" -msgstr "_Cancelar" - -#. module: crm -#: view:crm.lead.report:0 -#: view:crm.phonecall.report:0 -msgid " Month-1 " -msgstr " Mes-1 " - -#. module: crm -#: help:crm.installer,sale_crm:0 -msgid "This module relates sale from opportunity cases in the CRM." -msgstr "Este módulo relaciona ventas con oportunidades en el CRM." - -#. module: crm -#: selection:crm.meeting,rrule_type:0 -msgid "Daily" -msgstr "Diario" - -#. module: crm -#: model:crm.case.stage,name:crm.stage_lead2 -#: model:crm.case.stage,name:crm.stage_opportunity2 -msgid "Qualification" -msgstr "Calificación" - -#. module: crm -#: view:crm.case.stage:0 -msgid "Stage Definition" -msgstr "Definición de etapa" - -#. module: crm -#: selection:crm.meeting,byday:0 -msgid "First" -msgstr "Primero" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "December" -msgstr "Diciembre" - -#. module: crm -#: field:crm.installer,config_logo:0 -msgid "Image" -msgstr "Imagen" - -#. module: crm -#: view:base.action.rule:0 -msgid "Condition on Communication History" -msgstr "Condición en el historial de comunicaciones" - -#. module: crm -#: help:crm.segmentation,som_interval:0 -msgid "A period is the average number of days between two cycle of sale or purchase for this segmentation. \n" -"It's mainly used to detect if a partner has not purchased or buy for a too long time, \n" -"so we suppose that his state of mind has decreased because he probably bought goods to another supplier. \n" -"Use this functionality for recurring businesses." -msgstr "Un periodo es el número medio de días entre dos ciclos de ventas o compras para esta segmentación. \n" -"Se utiliza principalmente para detectar si una empresa no ha comprado por un largo periodo de tiempo, \n" -"por lo que suponemos que su grado de satisfacción ha disminuido porqué seguramente compró bienes a otro proveedor. \n" -"Utilice esta funcionalidad para negocios recurrentes." - -#. module: crm -#: view:crm.send.mail:0 -msgid "_Send Reply" -msgstr "_Enviar respuesta" - -#. module: crm -#: field:crm.meeting,vtimezone:0 -msgid "Timezone" -msgstr "Zona horaria" - -#. module: crm -#: field:crm.lead2opportunity.partner,msg:0 -#: field:crm.lead2partner,msg:0 -#: view:crm.send.mail:0 -msgid "Message" -msgstr "Mensaje" - -#. module: crm -#: field:crm.meeting,sa:0 -msgid "Sat" -msgstr "Sáb" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,user_id:0 -#: view:crm.lead.report:0 -#: view:crm.phonecall.report:0 -msgid "Salesman" -msgstr "Comercial" - -#. module: crm -#: field:crm.lead,date_deadline:0 -msgid "Expected Closing" -msgstr "Cierre previsto" - -#. module: crm -#: model:ir.model,name:crm.model_crm_opportunity2phonecall -msgid "Opportunity to Phonecall" -msgstr "Oportunidad a llamada telefónica" - -#. module: crm -#: help:crm.case.section,allow_unlink:0 -msgid "Allows to delete non draft cases" -msgstr "Permite eliminar los casos en estado no borrador." - -#. module: crm -#: view:crm.lead:0 -msgid "Schedule Meeting" -msgstr "Programar reunión" - -#. module: crm -#: view:crm.lead:0 -msgid "Partner Name" -msgstr "Nombre empresa" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_phone2 -#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_outgoing0 -#: model:ir.ui.menu,name:crm.menu_crm_case_phone_outbound -msgid "Outbound" -msgstr "Saliente" - -#. module: crm -#: field:crm.lead,date_open:0 -#: field:crm.phonecall,date_open:0 -msgid "Opened" -msgstr "Abierto" - -#. module: crm -#: view:crm.case.section:0 -#: field:crm.case.section,member_ids:0 -msgid "Team Members" -msgstr "Miembros del equipo" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.meeting:0 -#: view:crm.phonecall:0 -#: view:res.partner:0 -msgid "Contacts" -msgstr "Contactos" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor1 -msgid "Interest in Computer" -msgstr "Interesado en ordenadores" - -#. module: crm -#: view:crm.meeting:0 -msgid "Invitation Detail" -msgstr "Detalle de la invitación" - -#. module: crm -#: field:crm.segmentation,som_interval_default:0 -msgid "Default (0=None)" -msgstr "Por defecto (0=Ninguno)" - -#. module: crm -#: help:crm.lead,email_cc:0 -msgid "These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma" -msgstr "Estas direcciones de correo serán añadidas al campo CC para todos los correos entrantes y salientes de este registro antes de ser enviados. Separe las diferentes direcciones de correo con una coma." - -#. module: crm -#: field:crm.partner2opportunity,probability:0 -#: field:crm.phonecall2opportunity,probability:0 -msgid "Success Probability" -msgstr "Probabilidad de éxito" - -#. module: crm -#: code:addons/crm/crm.py:426 -#: selection:crm.add.note,state:0 -#: selection:crm.lead,state:0 -#: selection:crm.lead.report,state:0 -#: selection:crm.merge.opportunity,state:0 -#: selection:crm.phonecall,state:0 -#: selection:crm.phonecall.report,state:0 -#: selection:crm.send.mail,state:0 -#, python-format -msgid "Draft" -msgstr "Borrador" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_case_section_act_tree -msgid "Cases by Sales Team" -msgstr "Casos por equipo de ventas" - -#. module: crm -#: field:crm.meeting,attendee_ids:0 -msgid "Attendees" -msgstr "Asistentes" - -#. module: crm -#: view:crm.meeting:0 -#: view:crm.phonecall:0 -#: model:ir.model,name:crm.model_crm_meeting -#: model:process.node,name:crm.process_node_meeting0 -#: model:res.request.link,name:crm.request_link_meeting -msgid "Meeting" -msgstr "Reunión" - -#. module: crm -#: model:ir.model,name:crm.model_crm_case_categ -msgid "Category of Case" -msgstr "Categoría de caso" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.phonecall:0 -msgid "7 Days" -msgstr "7 días" - -#. module: crm -#: view:board.board:0 -msgid "Planned Revenue by Stage and User" -msgstr "Ingresos previsto por etapa y usuario" - -#. module: crm -#: view:crm.lead:0 -msgid "Communication & History" -msgstr "Comunicación e Historial" - -#. module: crm -#: model:ir.model,name:crm.model_crm_lead_report -msgid "CRM Lead Report" -msgstr "Informe de iniciativas CRM" - -#. module: crm -#: field:crm.installer,progress:0 -msgid "Configuration Progress" -msgstr "Progreso de la configuración" - -#. module: crm -#: selection:crm.lead,priority:0 -#: selection:crm.lead.report,priority:0 -#: selection:crm.phonecall,priority:0 -#: selection:crm.phonecall.report,priority:0 -msgid "Normal" -msgstr "Normal" - -#. module: crm -#: field:crm.lead,street2:0 -msgid "Street2" -msgstr "Calle2" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_meeting_categ_action -#: model:ir.ui.menu,name:crm.menu_crm_case_meeting-act -msgid "Meeting Categories" -msgstr "Categorías de reuniones" - -#. module: crm -#: view:crm.lead2opportunity.partner:0 -#: view:crm.lead2partner:0 -#: view:crm.phonecall2partner:0 -msgid "You may have to verify that this partner does not exist already." -msgstr "Debería verificar que esta empresa no exista ya." - -#. module: crm -#: field:crm.lead.report,delay_open:0 -msgid "Delay to Open" -msgstr "Retraso de apertura" - -#. module: crm -#: field:crm.lead.report,user_id:0 -#: field:crm.phonecall.report,user_id:0 -msgid "User" -msgstr "Usuario" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "November" -msgstr "Noviembre" - -#. module: crm -#: code:addons/crm/crm_action_rule.py:67 -#, python-format -msgid "No E-Mail ID Found for your Company address!" -msgstr "¡No se ha encontrado Email en la dirección de su compañía!" - -#. module: crm -#: view:crm.lead.report:0 -msgid "Opportunities By Stage" -msgstr "Oportunidades por etapa" - -#. module: crm -#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_create_partner -msgid "Schedule Phone Call" -msgstr "Planificar llamada telefónica" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "January" -msgstr "Enero" - -#. module: crm -#: model:ir.actions.act_window,help:crm.crm_opportunity_stage_act -msgid "Create specific stages that will help your sales better organise their sales pipeline by maintaining them to their sales opportunities. It will allow them to easily track how is positioned a specific opportunity in the sales cycle." -msgstr "Crear pasos específicos que ayudarán a su departamento de ventas a organizar mejor el flujo de venta gestionando sus oportunidades de venta. Esto les permitirá seguir fácilmente como está posicionada una oportunidad en el ciclo de ventas." - -#. module: crm -#: model:process.process,name:crm.process_process_contractprocess0 -msgid "Contract" -msgstr "Contrato" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead4 -msgid "Twitter Ads" -msgstr "Anuncios Twiter" - -#. module: crm -#: code:addons/crm/wizard/crm_add_note.py:26 -#: code:addons/crm/wizard/crm_send_email.py:72 -#: code:addons/crm/wizard/crm_send_email.py:169 -#: code:addons/crm/wizard/crm_send_email.py:270 -#, python-format -msgid "Error" -msgstr "Error" - -#. module: crm -#: view:crm.lead.report:0 -msgid "Planned Revenues" -msgstr "Ingresos esperados" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor7 -msgid "Need Consulting" -msgstr "Necesita consultoría" - -#. module: crm -#: model:ir.model,name:crm.model_crm_phonecall2phonecall -msgid "Phonecall To Phonecall" -msgstr "Llamada telefónica a llamada telefónica" - -#. module: crm -#: code:addons/crm/crm_lead.py:232 -#, python-format -msgid "The case '%s' has been closed." -msgstr "El caso '%s' ha sido cerrado" - -#. module: crm -#: field:crm.lead,partner_address_id:0 -#: field:crm.meeting,partner_address_id:0 -#: field:crm.phonecall,partner_address_id:0 -msgid "Partner Contact" -msgstr "Contacto empresa" - -#. module: crm -#: field:crm.meeting,recurrent_id:0 -msgid "Recurrent ID date" -msgstr "ID fecha recurrente" - -#. module: crm -#: sql_constraint:res.users:0 -msgid "You can not have two users with the same login !" -msgstr "¡No puede tener dos usuarios con el mismo identificador de usuario!" - -#. module: crm -#: code:addons/crm/wizard/crm_merge_opportunities.py:100 -#, python-format -msgid "Merged into Opportunity: %s" -msgstr "Fusionado con la oportunidad '%s'" - -#. module: crm -#: code:addons/crm/crm.py:347 -#: view:crm.lead:0 -#: view:res.partner:0 -#, python-format -msgid "Close" -msgstr "Cerrado" - -#. module: crm -#: view:crm.lead:0 -#: view:crm.phonecall:0 -#: view:res.partner:0 -msgid "Categorization" -msgstr "Categorización" - -#. module: crm -#: model:ir.model,name:crm.model_base_action_rule -msgid "Action Rules" -msgstr "Reglas acción" - -#. module: crm -#: field:crm.meeting,rrule_type:0 -msgid "Recurrency" -msgstr "Recurrencia" - -#. module: crm -#: field:crm.meeting,phonecall_id:0 -msgid "Phonecall" -msgstr "Llamada telefónica" - -#. module: crm -#: selection:crm.meeting,week_list:0 -msgid "Thursday" -msgstr "Jueves" - -#. module: crm -#: view:crm.meeting:0 -#: field:crm.send.mail,email_to:0 -msgid "To" -msgstr "Para" - -#. module: crm -#: selection:crm.meeting,class:0 -msgid "Private" -msgstr "Privado" - -#. module: crm -#: field:crm.lead,function:0 -msgid "Function" -msgstr "Función" - -#. module: crm -#: view:crm.add.note:0 -msgid "_Add" -msgstr "_Añadir" - -#. module: crm -#: selection:crm.segmentation.line,expr_name:0 -msgid "State of Mind" -msgstr "Grado de satisfacción" - -#. module: crm -#: field:crm.case.section,note:0 -#: view:crm.meeting:0 -#: field:crm.meeting,description:0 -#: view:crm.phonecall:0 -#: field:crm.phonecall,description:0 -#: view:crm.segmentation:0 -#: field:crm.segmentation,description:0 -#: view:res.partner:0 -msgid "Description" -msgstr "Descripción" - -#. module: crm -#: field:base.action.rule,trg_section_id:0 -#: field:crm.case.categ,section_id:0 -#: field:crm.case.resource.type,section_id:0 -#: view:crm.case.section:0 -#: field:crm.case.section,name:0 -#: field:crm.lead,section_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,section_id:0 -#: field:crm.meeting,section_id:0 -#: field:crm.opportunity2phonecall,section_id:0 -#: view:crm.phonecall:0 -#: field:crm.phonecall,section_id:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall2phonecall,section_id:0 -#: field:res.partner,section_id:0 -#: field:res.users,context_section_id:0 -msgid "Sales Team" -msgstr "Equipo de ventas" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "May" -msgstr "Mayo" - -#. module: crm -#: model:crm.case.categ,name:crm.categ_oppor2 -msgid "Interest in Accessories" -msgstr "Interesado en accesorios" - -#. module: crm -#: code:addons/crm/crm_lead.py:211 -#, python-format -msgid "The opportunity '%s' has been opened." -msgstr "La oportunidad '%s' ha sido abierta" - -#. module: crm -#: field:crm.lead.report,email:0 -msgid "# Emails" -msgstr "Nº de emails" - -#. module: crm -#: field:crm.lead,street:0 -msgid "Street" -msgstr "Calle" - -#. module: crm -#: view:crm.lead.report:0 -msgid "Opportunities by User and Team" -msgstr "Oportunidades por usuario y equipo" - -#. module: crm -#: field:crm.case.section,working_hours:0 -msgid "Working Hours" -msgstr "Horario de trabajo" - -#. module: crm -#: view:crm.lead:0 -#: field:crm.lead,is_customer_add:0 -msgid "Customer" -msgstr "Cliente" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "February" -msgstr "Febrero" - -#. module: crm -#: view:crm.phonecall:0 -#: model:ir.actions.act_window,name:crm.crm_case_categ_meet_create_partner -#: view:res.partner:0 -msgid "Schedule a Meeting" -msgstr "Planificar una reunión" - -#. module: crm -#: model:crm.case.stage,name:crm.stage_lead6 -#: model:crm.case.stage,name:crm.stage_opportunity6 -#: view:crm.lead:0 -msgid "Lost" -msgstr "Perdido" - -#. module: crm -#: field:crm.lead,country_id:0 -#: view:crm.lead.report:0 -#: field:crm.lead.report,country_id:0 -msgid "Country" -msgstr "País" - -#. module: crm -#: view:crm.lead:0 -#: selection:crm.lead2opportunity.action,name:0 -#: view:crm.phonecall:0 -#: view:res.partner:0 -msgid "Convert to Opportunity" -msgstr "Convertir a oportunidad" - -#. module: crm -#: selection:crm.meeting,week_list:0 -msgid "Wednesday" -msgstr "Miércoles" - -#. module: crm -#: selection:crm.lead.report,month:0 -#: selection:crm.meeting,month_list:0 -#: selection:crm.phonecall.report,month:0 -msgid "April" -msgstr "Abril" - -#. module: crm -#: field:crm.case.resource.type,name:0 -msgid "Campaign Name" -msgstr "Nombre de la campaña" - -#. module: crm -#: model:ir.model,name:crm.model_crm_phonecall_report -msgid "Phone calls by user and section" -msgstr "Llamadas telefónicas por usuario y sección" - -#. module: crm -#: selection:crm.lead2opportunity.action,name:0 -msgid "Merge with existing Opportunity" -msgstr "Fusionado con oportunidad existente" - -#. module: crm -#: field:crm.meeting,select1:0 -msgid "Option" -msgstr "Opción" - -#. module: crm -#: model:crm.case.stage,name:crm.stage_lead4 -#: model:crm.case.stage,name:crm.stage_opportunity4 -msgid "Negotiation" -msgstr "Negociación" - -#. module: crm -#: view:crm.lead:0 -msgid "Exp.Closing" -msgstr "Cierre previsto" - -#. module: crm -#: field:crm.case.stage,sequence:0 -#: field:crm.meeting,sequence:0 -msgid "Sequence" -msgstr "Secuencia" - -#. module: crm -#: field:crm.send.mail,body:0 -msgid "Message Body" -msgstr "Cuerpo del mensaje" - -#. module: crm -#: view:crm.meeting:0 -msgid "Accept" -msgstr "Aceptar" - -#. module: crm -#: field:crm.segmentation.line,expr_name:0 -msgid "Control Variable" -msgstr "Variable de control" - -#. module: crm -#: selection:crm.meeting,byday:0 -msgid "Second" -msgstr "Segundo" - -#. module: crm -#: model:crm.case.stage,name:crm.stage_lead3 -#: model:crm.case.stage,name:crm.stage_opportunity3 -msgid "Proposition" -msgstr "Propuesta" - -#. module: crm -#: field:res.partner,phonecall_ids:0 -msgid "Phonecalls" -msgstr "Llamadas telefónicas" - -#. module: crm -#: view:crm.lead.report:0 -#: field:crm.lead.report,name:0 -#: view:crm.phonecall.report:0 -#: field:crm.phonecall.report,name:0 -msgid "Year" -msgstr "Año" - -#. module: crm -#: model:crm.case.resource.type,name:crm.type_lead8 -msgid "Newsletter" -msgstr "Boletín de noticias" - diff --git a/addons/point_of_sale/__openerp__.py b/addons/point_of_sale/__openerp__.py index d08a8163be6..e0722f12395 100644 --- a/addons/point_of_sale/__openerp__.py +++ b/addons/point_of_sale/__openerp__.py @@ -83,16 +83,16 @@ Main features: 'application': True, # Web client 'js': [ - 'static/lib/backbone/backbone-0.9.2.js', 'static/lib/mousewheel/jquery.mousewheel-3.0.6.js', - 'static/src/js/pos_models.js', - 'static/src/js/pos_basewidget.js', - 'static/src/js/pos_keyboard_widget.js', - 'static/src/js/pos_scrollbar_widget.js', - 'static/src/js/pos_widgets.js', - 'static/src/js/pos_devices.js', - 'static/src/js/pos_screens.js', - 'static/src/js/pos_main.js' + 'static/src/js/db.js', + 'static/src/js/models.js', + 'static/src/js/widget_base.js', + 'static/src/js/widget_keyboard.js', + 'static/src/js/widget_scrollbar.js', + 'static/src/js/widgets.js', + 'static/src/js/devices.js', + 'static/src/js/screens.js', + 'static/src/js/main.js' ], 'css': [ 'static/src/css/pos.css', diff --git a/addons/point_of_sale/account_bank_statement.py b/addons/point_of_sale/account_bank_statement.py index 5b989edb53d..eb7d791ebf9 100644 --- a/addons/point_of_sale/account_bank_statement.py +++ b/addons/point_of_sale/account_bank_statement.py @@ -34,8 +34,8 @@ class account_journal(osv.osv): 'self_checkout_payment_method' : fields.boolean('Self Checkout Payment Method'), } _defaults = { - 'opening_control' : True, - 'closing_control' : True, + 'opening_control' : False, + 'closing_control' : False, 'self_checkout_payment_method' : False, } diff --git a/addons/point_of_sale/controllers/__init__.py b/addons/point_of_sale/controllers/__init__.py new file mode 100644 index 00000000000..b5f0bcc9ec6 --- /dev/null +++ b/addons/point_of_sale/controllers/__init__.py @@ -0,0 +1,3 @@ +import main +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/point_of_sale/controllers.py b/addons/point_of_sale/controllers/main.py index 33a96dacf84..425a7e3d7f8 100644 --- a/addons/point_of_sale/controllers.py +++ b/addons/point_of_sale/controllers/main.py @@ -1,14 +1,71 @@ # -*- coding: utf-8 -*- import logging +import simplejson +import os +import openerp try: import openerp.addons.web.common.http as openerpweb + from openerp.addons.web.controllers.main import manifest_list, module_boot, html_template except ImportError: import web.common.http as openerpweb class PointOfSaleController(openerpweb.Controller): _cp_path = '/pos' + @openerpweb.httprequest + def app(self, req, s_action=None, **kw): + js = "\n ".join('<script type="text/javascript" src="%s"></script>' % i for i in manifest_list(req, None, 'js')) + css = "\n ".join('<link rel="stylesheet" href="%s">' % i for i in manifest_list(req, None, 'css')) + + cookie = req.httprequest.cookies.get("instance0|session_id") + session_id = cookie.replace("%22","") + template = html_template.replace('<html','<html manifest="/pos/manifest?session_id=%s"'%session_id) + r = template % { + 'js': js, + 'css': css, + 'modules': simplejson.dumps(module_boot(req)), + 'init': 'var wc = new s.web.WebClient();wc.appendTo($(document.body));' + } + return r + + @openerpweb.httprequest + def manifest(self, req, **kwargs): + """ This generates a HTML5 cache manifest files that preloads the categories and products thumbnails + and other ressources necessary for the point of sale to work offline """ + + ml = ["CACHE MANIFEST"] + + # loading all the images in the static/src/img/* directories + def load_css_img(srcdir,dstdir): + for f in os.listdir(srcdir): + path = os.path.join(srcdir,f) + dstpath = os.path.join(dstdir,f) + if os.path.isdir(path) : + load_css_img(path,dstpath) + elif f.endswith(('.png','.PNG','.jpg','.JPG','.jpeg','.JPEG','.gif','.GIF')): + ml.append(dstpath) + + imgdir = openerp.modules.get_module_resource('point_of_sale','static/src/img'); + load_css_img(imgdir,'/point_of_sale/static/src/img') + + products = req.session.model('product.product') + for p in products.search_read([('pos_categ_id','!=',False)], ['name']): + product_id = p['id'] + url = "/web/binary/image?session_id=%s&model=product.product&field=image&id=%s" % (req.session_id, product_id) + ml.append(url) + + categories = req.session.model('pos.category') + for c in categories.search_read([],['name']): + category_id = c['id'] + url = "/web/binary/image?session_id=%s&model=pos.category&field=image&id=%s" % (req.session_id, category_id) + ml.append(url) + + ml += ["NETWORK:","*"] + m = "\n".join(ml) + + return m + @openerpweb.jsonrequest def dispatch(self, request, iface, **kwargs): method = 'iface_%s' % iface @@ -109,3 +166,4 @@ class PointOfSaleController(openerpweb.Controller): print 'print_receipt' + str(receipt) return + diff --git a/addons/point_of_sale/doc/barcode_test_sheet2.svg b/addons/point_of_sale/doc/barcode_test_sheet2.svg new file mode 100644 index 00000000000..11f852bd5c9 --- /dev/null +++ b/addons/point_of_sale/doc/barcode_test_sheet2.svg @@ -0,0 +1,1108 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + version="1.1" + inkscape:version="0.48.3.1 r9886" + sodipodi:docname="barcode_test_sheet2.svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="0.86706515" + inkscape:cx="632.35885" + inkscape:cy="613.16261" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1855" + inkscape:window-height="1056" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:window-maximized="1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <text + xml:space="preserve" + style="font-size:43.10883331px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="167.93207" + y="105.20258" + id="text2985" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan2987" + x="167.93207" + y="105.20258" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">BARCODE TEST SHEET</tspan></text> + <g + id="g3347" + transform="matrix(0.54655779,0,0,0.54655779,40.964737,81.693618)"> + <image + width="163.36363" + height="107.96206" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADqUlEQVR4 nO3a226jMABFUYjy/7/MPCChDBfHARM4zVpP1dQY4u66JEw/DEO3S9/3XdeNh79+vRwz2hr5OmZr 5JH5t0YuX0X51W0dW3PNNa9xOWf5au8wsrxu9Ud95HHkYPg+yRJGsoSRLGEkSxjJEkayhJEsYSRL GMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJ EkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJG soSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKE kSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEs YSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEk SxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxh+mEY dh7Z913XjYe/fv3LrMlS8zWxyxJGsjuNGwbf91z911Z/1GY/18oJ689+cOTb7LZmPtJr/ZrcfOTu 1SucseaQlV221f6xnKdm5vqznzHy1Nn6vq9fk5SRrYzzry7RzHyXbd7r9HszXVP9b3bN/EdGlq/k 0y250uu0W2tSv3oXjvxo9d4ahmE6b/mP58ou2/BNbuUr3Hf2M0aOzthRVn8M5QurX71rR87sXr1h GGa/z6tT/Zds2y12+TpfP+nYOqp+/rYjZ4esXvzk0zkLlmtSv3rXjlx1/F3QMtzZgMfse1d9jvi1 t1zND2HScPUK2+2j+cl2uEmvl/Bh2Zat+4TH64gLruvzs599C3vSOqz+Yf1LvZ60estwn93ehdt9 ez5zk1vYJmrW5C9lWqNVJ5OnW4IjR31kudFWvqe5v/NWb/lE47n6jbOvo3xZhbOfMfLL7n97fRNb j9/WH9j+mgtTtsUW5hzNN6PVMx2/iMLO93ba798tfPp6d398tjyqfqFu+I9vv7XD1uY6Ofd/ci0/ o/5ZhR/2lvrVu3ZkK7PPX7ee2px1YzA9Mn77S/Nrlj/+1UdNlat37ciGCncCMyfuslsP/e7mazey y22j8Pi3fvWuHdlq9cYZap6H/wMqFm5yx9XfMwAAAABJRU5ErkJggg== " + id="image3083" + x="388.17426" + y="124.14642" /> + <rect + ry="3.5336394" + rx="3.5336394" + y="114.51707" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3086" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3856" + y="147.73848" + x="201.46712" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="147.73848" + x="201.46712" + id="tspan3858" + sodipodi:role="line">ADMIN</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="182.10147" + id="text3860" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3862" + x="154.5717" + y="182.10147" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 40</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3149" + y="200.85837" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="200.85837" + x="154.5717" + id="tspan3151" + sodipodi:role="line">ID: 4447190000</tspan></text> + </g> + <g + id="g3335" + transform="matrix(0.54655779,0,0,0.54655779,40.964737,257.20188)"> + <g + transform="translate(0,-3.2620699)" + id="g3173"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="341.12738" + id="text3153" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3155" + x="154.5717" + y="341.12738" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 42</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3157" + y="359.88428" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="359.88428" + x="154.5717" + id="tspan3159" + sodipodi:role="line">ID: 1182180000</tspan></text> + </g> + <g + transform="translate(0,-18.756902)" + id="g3954"> + <rect + ry="3.5336394" + rx="3.5336394" + y="284.96024" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3876" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3878" + y="318.18164" + x="151.59334" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="318.18164" + x="151.59334" + id="tspan3880" + sodipodi:role="line">CLIENT Joe Bloggs</tspan></text> + <image + y="294.58957" + x="388.17426" + id="image3951" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADyUlEQVR4 nO3a3Y6qShSFUTC+/yvXuSAxbCgQsPiZp8e46mgJq/ETxe6+lNId0vd913XDw8c/z+8d3zIYP2p8 y9LKLbcvbXN8y5Zt/jLn0jHZcnzm29z+m961cmn+vY/a5fXLg+F6kiWMZAkjWcJIljCSJYxkCSNZ wkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC 9KWUg4/s+67rhoePf/7LHJO55sfEWZYwj0t2eCG2XXmGe/f+l72rt7Z6U5s8r1832LbX+ZqlAc6b 85qpbln59SDs7afvN31MrZxlm5w/+r6fb6d644H9Huu1euOpcx6eqnrj0n7vXdnKsP31Iz+YnmWb TzZ+3Wx/wqoOrJzvfeml3HDO36ear1wa/saV62fovafYUspnv+tv8pWzbMPPA5NNjS8bL1Dd+9gt c36dqnrX+pNy78qJw8etlDJ53VY39U+ybZ+kjb9nGWm1cpfmc/5o6RwzfyHdu3LX8NvNw50seE3u a/J8XPC8bjH5bavXPdfP+XWqXG0TGm92fJTezXf2BJ8PRtsvzy/wzKkea3Je/yT6mqw41e0vjI27 vnjO/0evJx20+eeEd3f0vWnXx/OlC52TVA/f8P6yPsCPc64fk8NTRTt8GbfkffYZ5eJYu9ULiJU+ zp7z2FQpzqtocj4tpbyrdzSZY7zNJz8fKXP+NfNYhx/qf7BtuL+HR5Ay55OdcYpdOY+8Ss1n6Y9z pHTwqDmXvgGdl3HvypNMvtKa7/GU/+S695uB7Qf9yjkPpDD/hn/JvStbmcdaPSxnfTDoVn/PK783 +GXZBdcTS/utfoO7dPV218qGtl9RPO7/ZZuovkBv/5vcrqmqK5c2e+PKVu9Uwxa2PEf/AXnknj+O sxSLAAAAAElFTkSuQmCC " + height="107.26709" + width="162.31204" /> + </g> + </g> + <g + id="g3322" + transform="matrix(0.54655779,0,0,0.54655779,40.964737,259.54293)"> + <rect + ry="3.5336394" + rx="3.5336394" + y="419.52063" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3964" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3966" + y="452.74203" + x="151.59332" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="452.74203" + x="151.59332" + id="tspan3968" + sodipodi:role="line">CLIENT Bob Soap</tspan></text> + <image + y="429.14993" + x="387.35876" + id="image4065" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAAERElEQVR4 nO3a0ZKaQBRFUbX8/182D1QZInRzadDxTNZ6mjgNNrhBYHJ9PB6XIdfr9XK5TIvPf57/drJ8/ayR rVdaG9Wfc+Vd+vPc+3N/hv3XK68st2i5Xa09XNnS+sjKthfdjiwMnydZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiW MJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCS Jcz18XgMLnm9Xi6XafH5z/8z+2Tp9H3iLEuYDyU7HV7njuT/dH/+9NLKid9o5/Zan+fYFnW+vFrT 27uv+hPb3AnLt1su0prSO/beWeVcr6XL1Ns0dLnNqy+OzeOskfV5Dm9RZ8BZe2N1YgfXWXlx11u/ Y2TftFTlM7rP/zFv/B378eDIp+I8V89enUO5MpMjXz7P9S/nP59V/3zWOiX317k6/9aw5TqPj9z0 eDyea+vfpd1Wt/ny7y3eN6jP88jX9wdu8Jfzn2wuWD84W1cOm8Navz1rZN/LfmidcW/H36nz9pUP oz7yUs6uuLa5dx+cB5/vvOmRWeuAb52ex0bunVL/W/Se8uDw+Dw3r1MHTnVjs5qvpP6m9QuG7/lu HNa5Trg3F/oVKrfSR05ge5dt3awMH5DPj7b+0KA/n+/xcrZ+7qhmsm/6JjpdfZ6dMZuLd+5yBuxa ydgHsbxsnS4N407Gy3BXkm3d6KyuqzLyTSrzXH5Cex+Cdt5ifoabBlT2SSWmutZGtVb4+UxP7+Sf v34979EGbl8+aWye9RuIuoMnv039Ge66AVruqy//lCcvzw3+XhjsvSH4Ke+YZ+dR/DfvijFBW9S6 071fylcCP644z19T2wc25GsvZzvnpnvrF1/rxHl2rvZWL3lbTxuK77V6ifmZaPpH+8vlZmeeYyPH ptqa8C3lnPTjj5OW6xz7dlr9Q93YrFoP7Vfz6s+kOM+DI/uWl63r095c0VnP8A8+M9/cF8XHN8Xn WfUT6nCvm2uo7Lf6lu6af32eu7aoo36X8jv/i/fqAXrwBrm1zr0rKa6heJzXt3TXE4P6PI/vk/lS lc/oD6RX6TSeNJuDAAAAAElFTkSuQmCC " + height="107.14654" + width="162.12962" /> + <g + id="g3179" + transform="translate(0,140.26901)"> + <text + sodipodi:linespacing="125%" + id="text3181" + y="341.12738" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="341.12738" + x="154.5717" + id="tspan3183" + sodipodi:role="line">Prefix: 21</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="359.88428" + id="text3185" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3187" + x="154.5717" + y="359.88428" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 12345</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3189" + y="379.4567" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="379.4567" + x="154.5717" + id="tspan3191" + sodipodi:role="line">Value: 67.89Kg</tspan></text> + </g> + </g> + <g + id="g3269" + transform="matrix(0.54655779,0,0,0.54655779,306.11765,-335.23001)"> + <g + transform="translate(0,284.6156)" + id="g3061"> + <g + transform="translate(0,154.94832)" + id="g3063"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3065" + width="417.54495" + height="126.4052" + x="141.08452" + y="438.27753" + rx="3.5336394" + ry="3.5336394" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="272.54657" + y="471.49893" + id="text3067" + sodipodi:linespacing="125%"><tspan + id="tspan3083" + sodipodi:role="line" + x="272.54657" + y="471.49893" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">COCA COLA 33CL</tspan></text> + <g + id="g3071" + transform="translate(0,156.57936)" /> + </g> + </g> + <image + width="163.94308" + height="108.34499" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + id="image3146" + x="386.54324" + y="887.47076" /> + <g + transform="translate(0,598.58983)" + id="g3255"> + <text + sodipodi:linespacing="125%" + id="text3261" + y="351.81107" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="351.81107" + x="154.5717" + id="tspan3263" + sodipodi:role="line">ID: 5449000000996</tspan></text> + </g> + </g> + <g + id="g4150" + transform="matrix(0.92675002,0,0,0.92675002,-450.39648,546.91911)"> + <text + sodipodi:linespacing="125%" + id="text3357" + y="320.0275" + x="618.97778" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + y="320.0275" + x="618.97778" + id="tspan3359" + sodipodi:role="line">This is a test sheet intended to help you test the codebar aquisition in OpenERP's Point of Sale module. </tspan><tspan + id="tspan3363" + y="330.0275" + x="618.97778" + sodipodi:role="line">The codes provided in this list are randomly chosen and are encoded in the EAN13 format. Their codes</tspan><tspan + id="tspan3367" + y="340.0275" + x="618.97778" + sodipodi:role="line">and prefixes are not intended to match any specified standard. </tspan></text> + <text + xml:space="preserve" + style="font-size:6.53564215px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="618.99207" + y="349.54001" + id="text3369" + sodipodi:linespacing="125%"><tspan + style="fill:#b3b3b3;fill-opacity:1" + sodipodi:role="line" + x="618.99207" + y="349.54001" + id="tspan3375">This document is licensed by OpenERP S.A. under the Creative Commons CC BY 3.0 license htttp://www.creativecommons.org</tspan></text> + </g> + <g + transform="matrix(0.54655779,0,0,0.54655779,40.964737,517.95653)" + id="g3156"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3158" + width="417.54495" + height="126.4052" + x="141.08452" + y="419.52063" + rx="3.5336394" + ry="3.5336394" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="184.30057" + y="452.74203" + id="text3160" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3162" + x="184.30057" + y="452.74203" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ORANGES: 1.5Kg</tspan></text> + <image + width="162.12962" + height="107.14654" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAAERElEQVR4 nO3a0ZKaQBRFUbX8/182D1QZInRzadDxTNZ6mjgNNrhBYHJ9PB6XIdfr9XK5TIvPf57/drJ8/ayR rVdaG9Wfc+Vd+vPc+3N/hv3XK68st2i5Xa09XNnS+sjKthfdjiwMnydZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiW MJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCS Jcz18XgMLnm9Xi6XafH5z/8z+2Tp9H3iLEuYDyU7HV7njuT/dH/+9NLKid9o5/Zan+fYFnW+vFrT 27uv+hPb3AnLt1su0prSO/beWeVcr6XL1Ns0dLnNqy+OzeOskfV5Dm9RZ8BZe2N1YgfXWXlx11u/ Y2TftFTlM7rP/zFv/B378eDIp+I8V89enUO5MpMjXz7P9S/nP59V/3zWOiX317k6/9aw5TqPj9z0 eDyea+vfpd1Wt/ny7y3eN6jP88jX9wdu8Jfzn2wuWD84W1cOm8Navz1rZN/LfmidcW/H36nz9pUP oz7yUs6uuLa5dx+cB5/vvOmRWeuAb52ex0bunVL/W/Se8uDw+Dw3r1MHTnVjs5qvpP6m9QuG7/lu HNa5Trg3F/oVKrfSR05ge5dt3awMH5DPj7b+0KA/n+/xcrZ+7qhmsm/6JjpdfZ6dMZuLd+5yBuxa ydgHsbxsnS4N407Gy3BXkm3d6KyuqzLyTSrzXH5Cex+Cdt5ifoabBlT2SSWmutZGtVb4+UxP7+Sf v34979EGbl8+aWye9RuIuoMnv039Ge66AVruqy//lCcvzw3+XhjsvSH4Ke+YZ+dR/DfvijFBW9S6 071fylcCP644z19T2wc25GsvZzvnpnvrF1/rxHl2rvZWL3lbTxuK77V6ifmZaPpH+8vlZmeeYyPH ptqa8C3lnPTjj5OW6xz7dlr9Q93YrFoP7Vfz6s+kOM+DI/uWl63r095c0VnP8A8+M9/cF8XHN8Xn WfUT6nCvm2uo7Lf6lu6af32eu7aoo36X8jv/i/fqAXrwBrm1zr0rKa6heJzXt3TXE4P6PI/vk/lS lc/oD6RX6TSeNJuDAAAAAElFTkSuQmCC " + id="image3164" + x="387.35876" + y="429.14993" /> + <g + transform="translate(0,140.26901)" + id="g3166"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="341.12738" + id="text3168" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3170" + x="154.5717" + y="341.12738" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 21</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3172" + y="359.88428" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="359.88428" + x="154.5717" + id="tspan3174" + sodipodi:role="line">ID: 12345</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="379.4567" + id="text3176" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3178" + x="154.5717" + y="379.4567" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Value: 67.89Kg</tspan></text> + </g> + </g> + <g + transform="matrix(0.54655779,0,0,0.54655779,40.964737,167.83146)" + id="g3180"> + <image + y="124.14642" + x="388.17426" + id="image3182" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADqUlEQVR4 nO3a226jMABFUYjy/7/MPCChDBfHARM4zVpP1dQY4u66JEw/DEO3S9/3XdeNh79+vRwz2hr5OmZr 5JH5t0YuX0X51W0dW3PNNa9xOWf5au8wsrxu9Ud95HHkYPg+yRJGsoSRLGEkSxjJEkayhJEsYSRL GMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJ EkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJG soSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKE kSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEs YSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEk SxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxh+mEY dh7Z913XjYe/fv3LrMlS8zWxyxJGsjuNGwbf91z911Z/1GY/18oJ689+cOTb7LZmPtJr/ZrcfOTu 1SucseaQlV221f6xnKdm5vqznzHy1Nn6vq9fk5SRrYzzry7RzHyXbd7r9HszXVP9b3bN/EdGlq/k 0y250uu0W2tSv3oXjvxo9d4ahmE6b/mP58ou2/BNbuUr3Hf2M0aOzthRVn8M5QurX71rR87sXr1h GGa/z6tT/Zds2y12+TpfP+nYOqp+/rYjZ4esXvzk0zkLlmtSv3rXjlx1/F3QMtzZgMfse1d9jvi1 t1zND2HScPUK2+2j+cl2uEmvl/Bh2Zat+4TH64gLruvzs599C3vSOqz+Yf1LvZ60estwn93ehdt9 ez5zk1vYJmrW5C9lWqNVJ5OnW4IjR31kudFWvqe5v/NWb/lE47n6jbOvo3xZhbOfMfLL7n97fRNb j9/WH9j+mgtTtsUW5hzNN6PVMx2/iMLO93ba798tfPp6d398tjyqfqFu+I9vv7XD1uY6Ofd/ci0/ o/5ZhR/2lvrVu3ZkK7PPX7ee2px1YzA9Mn77S/Nrlj/+1UdNlat37ciGCncCMyfuslsP/e7mazey y22j8Pi3fvWuHdlq9cYZap6H/wMqFm5yx9XfMwAAAABJRU5ErkJggg== " + height="107.96206" + width="163.36363" /> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3184" + width="417.54495" + height="126.4052" + x="141.08452" + y="114.51707" + rx="3.5336394" + ry="3.5336394" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="155.04395" + y="147.73848" + id="text3186" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3188" + x="155.04395" + y="147.73848" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">CASHIER J.Smith</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3190" + y="182.10147" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="182.10147" + x="154.5717" + id="tspan3192" + sodipodi:role="line">Prefix: 40</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="200.85837" + id="text3194" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3196" + x="154.5717" + y="200.85837" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 4447190000</tspan></text> + </g> + <g + id="g3198" + transform="matrix(0.54655779,0,0,0.54655779,40.964737,253.96929)"> + <image + width="163.36363" + height="107.96206" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADqUlEQVR4 nO3a226jMABFUYjy/7/MPCChDBfHARM4zVpP1dQY4u66JEw/DEO3S9/3XdeNh79+vRwz2hr5OmZr 5JH5t0YuX0X51W0dW3PNNa9xOWf5au8wsrxu9Ud95HHkYPg+yRJGsoSRLGEkSxjJEkayhJEsYSRL GMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJ EkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJG soSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKE kSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEs YSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEk SxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxh+mEY dh7Z913XjYe/fv3LrMlS8zWxyxJGsjuNGwbf91z911Z/1GY/18oJ689+cOTb7LZmPtJr/ZrcfOTu 1SucseaQlV221f6xnKdm5vqznzHy1Nn6vq9fk5SRrYzzry7RzHyXbd7r9HszXVP9b3bN/EdGlq/k 0y250uu0W2tSv3oXjvxo9d4ahmE6b/mP58ou2/BNbuUr3Hf2M0aOzthRVn8M5QurX71rR87sXr1h GGa/z6tT/Zds2y12+TpfP+nYOqp+/rYjZ4esXvzk0zkLlmtSv3rXjlx1/F3QMtzZgMfse1d9jvi1 t1zND2HScPUK2+2j+cl2uEmvl/Bh2Zat+4TH64gLruvzs599C3vSOqz+Yf1LvZ60estwn93ehdt9 ez5zk1vYJmrW5C9lWqNVJ5OnW4IjR31kudFWvqe5v/NWb/lE47n6jbOvo3xZhbOfMfLL7n97fRNb j9/WH9j+mgtTtsUW5hzNN6PVMx2/iMLO93ba798tfPp6d398tjyqfqFu+I9vv7XD1uY6Ofd/ci0/ o/5ZhR/2lvrVu3ZkK7PPX7ee2px1YzA9Mn77S/Nrlj/+1UdNlat37ciGCncCMyfuslsP/e7mazey y22j8Pi3fvWuHdlq9cYZap6H/wMqFm5yx9XfMwAAAABJRU5ErkJggg== " + id="image3200" + x="388.17426" + y="124.14642" /> + <rect + ry="3.5336394" + rx="3.5336394" + y="114.51707" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3202" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3204" + y="147.73848" + x="153.98886" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="147.73848" + x="153.98886" + id="tspan3206" + sodipodi:role="line">CASHIER J.Doe</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="182.10147" + id="text3208" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3210" + x="154.5717" + y="182.10147" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 40</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3212" + y="200.85837" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="200.85837" + x="154.5717" + id="tspan3214" + sodipodi:role="line">ID: 4447190000</tspan></text> + </g> + <g + transform="matrix(0.54655779,0,0,0.54655779,306.11765,-249.11351)" + id="g3216"> + <g + id="g3218" + transform="translate(0,284.6156)"> + <g + id="g3220" + transform="translate(0,154.94832)"> + <rect + ry="3.5336394" + rx="3.5336394" + y="438.27753" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3222" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3224" + y="471.49893" + x="272.54657" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="471.49893" + x="272.54657" + sodipodi:role="line" + id="tspan3226">COCA COLA 1.5L</tspan></text> + <g + transform="translate(0,156.57936)" + id="g3228" /> + </g> + </g> + <image + y="887.47076" + x="386.54324" + id="image3230" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + height="108.34499" + width="163.94308" /> + <g + id="g3232" + transform="translate(0,598.58983)"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="351.81107" + id="text3235" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3237" + x="154.5717" + y="351.81107" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 5449000000996</tspan></text> + </g> + </g> + <g + id="g3239" + transform="matrix(0.54655779,0,0,0.54655779,306.11765,-162.997)"> + <g + transform="translate(0,284.6156)" + id="g3241"> + <g + transform="translate(0,154.94832)" + id="g3243"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3245" + width="417.54495" + height="126.4052" + x="141.08452" + y="438.27753" + rx="3.5336394" + ry="3.5336394" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="272.54657" + y="471.49893" + id="text3247" + sodipodi:linespacing="125%"><tspan + id="tspan3249" + sodipodi:role="line" + x="272.54657" + y="471.49893" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">CHIMAY BLEUE 33CL</tspan></text> + <g + id="g3251" + transform="translate(0,156.57936)" /> + </g> + </g> + <image + width="163.94308" + height="108.34499" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + id="image3253" + x="386.54324" + y="887.47076" /> + <g + transform="translate(0,598.58983)" + id="g3256"> + <text + sodipodi:linespacing="125%" + id="text3258" + y="351.81107" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="351.81107" + x="154.5717" + id="tspan3260" + sodipodi:role="line">ID: 5449000000996</tspan></text> + </g> + </g> + <g + transform="matrix(0.54655779,0,0,0.54655779,306.11765,-76.880434)" + id="g3262"> + <g + id="g3264" + transform="translate(0,284.6156)"> + <g + id="g3266" + transform="translate(0,154.94832)"> + <rect + ry="3.5336394" + rx="3.5336394" + y="438.27753" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3268" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3270" + y="471.49893" + x="272.54657" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="471.49893" + x="272.54657" + sodipodi:role="line" + id="tspan3272">PIZZA HAWAII</tspan></text> + <g + transform="translate(0,156.57936)" + id="g3274" /> + </g> + </g> + <image + y="887.47076" + x="386.54324" + id="image3276" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + height="108.34499" + width="163.94308" /> + <g + id="g3278" + transform="translate(0,598.58983)"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="351.81107" + id="text3280" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3282" + x="154.5717" + y="351.81107" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 5449000000996</tspan></text> + </g> + </g> + <g + id="g3284" + transform="matrix(0.54655779,0,0,0.54655779,306.11765,9.2360758)"> + <g + transform="translate(0,284.6156)" + id="g3286"> + <g + transform="translate(0,154.94832)" + id="g3288"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290" + width="417.54495" + height="126.4052" + x="141.08452" + y="438.27753" + rx="3.5336394" + ry="3.5336394" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="272.54657" + y="471.49893" + id="text3292" + sodipodi:linespacing="125%"><tspan + id="tspan3294" + sodipodi:role="line" + x="272.54657" + y="471.49893" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">CROKY PAPRIKA</tspan></text> + <g + id="g3296" + transform="translate(0,156.57936)" /> + </g> + </g> + <image + width="163.94308" + height="108.34499" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + id="image3298" + x="386.54324" + y="887.47076" /> + <g + transform="translate(0,598.58983)" + id="g3300"> + <text + sodipodi:linespacing="125%" + id="text3302" + y="351.81107" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="351.81107" + x="154.5717" + id="tspan3304" + sodipodi:role="line">ID: 5449000000996</tspan></text> + </g> + </g> + <g + transform="matrix(0.54655779,0,0,0.54655779,306.11765,95.352583)" + id="g3306"> + <g + id="g3308" + transform="translate(0,284.6156)"> + <g + id="g3310" + transform="translate(0,154.94832)"> + <rect + ry="3.5336394" + rx="3.5336394" + y="438.27753" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3312" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3314" + y="471.49893" + x="272.54657" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="471.49893" + x="272.54657" + sodipodi:role="line" + id="tspan3316">MOKA ICE CREAM</tspan></text> + <g + transform="translate(0,156.57936)" + id="g3318" /> + </g> + </g> + <image + y="887.47076" + x="386.54324" + id="image3320" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + height="108.34499" + width="163.94308" /> + <g + id="g3323" + transform="translate(0,598.58983)"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="351.81107" + id="text3325" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3327" + x="154.5717" + y="351.81107" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 5449000000996</tspan></text> + </g> + </g> + <g + id="g3329" + transform="matrix(0.54655779,0,0,0.54655779,40.964737,431.81867)"> + <rect + ry="3.5336394" + rx="3.5336394" + y="419.52063" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3331" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3333" + y="452.74203" + x="184.30057" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="452.74203" + x="184.30057" + id="tspan3335" + sodipodi:role="line">ORANGES: 0.5Kg</tspan></text> + <image + y="429.14993" + x="387.35876" + id="image3337" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAAERElEQVR4 nO3a0ZKaQBRFUbX8/182D1QZInRzadDxTNZ6mjgNNrhBYHJ9PB6XIdfr9XK5TIvPf57/drJ8/ayR rVdaG9Wfc+Vd+vPc+3N/hv3XK68st2i5Xa09XNnS+sjKthfdjiwMnydZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiW MJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCS Jcz18XgMLnm9Xi6XafH5z/8z+2Tp9H3iLEuYDyU7HV7njuT/dH/+9NLKid9o5/Zan+fYFnW+vFrT 27uv+hPb3AnLt1su0prSO/beWeVcr6XL1Ns0dLnNqy+OzeOskfV5Dm9RZ8BZe2N1YgfXWXlx11u/ Y2TftFTlM7rP/zFv/B378eDIp+I8V89enUO5MpMjXz7P9S/nP59V/3zWOiX317k6/9aw5TqPj9z0 eDyea+vfpd1Wt/ny7y3eN6jP88jX9wdu8Jfzn2wuWD84W1cOm8Navz1rZN/LfmidcW/H36nz9pUP oz7yUs6uuLa5dx+cB5/vvOmRWeuAb52ex0bunVL/W/Se8uDw+Dw3r1MHTnVjs5qvpP6m9QuG7/lu HNa5Trg3F/oVKrfSR05ge5dt3awMH5DPj7b+0KA/n+/xcrZ+7qhmsm/6JjpdfZ6dMZuLd+5yBuxa ydgHsbxsnS4N407Gy3BXkm3d6KyuqzLyTSrzXH5Cex+Cdt5ifoabBlT2SSWmutZGtVb4+UxP7+Sf v34979EGbl8+aWye9RuIuoMnv039Ge66AVruqy//lCcvzw3+XhjsvSH4Ke+YZ+dR/DfvijFBW9S6 071fylcCP644z19T2wc25GsvZzvnpnvrF1/rxHl2rvZWL3lbTxuK77V6ifmZaPpH+8vlZmeeYyPH ptqa8C3lnPTjj5OW6xz7dlr9Q93YrFoP7Vfz6s+kOM+DI/uWl63r095c0VnP8A8+M9/cF8XHN8Xn WfUT6nCvm2uo7Lf6lu6af32eu7aoo36X8jv/i/fqAXrwBrm1zr0rKa6heJzXt3TXE4P6PI/vk/lS lc/oD6RX6TSeNJuDAAAAAElFTkSuQmCC " + height="107.14654" + width="162.12962" /> + <g + id="g3339" + transform="translate(0,140.26901)"> + <text + sodipodi:linespacing="125%" + id="text3341" + y="341.12738" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="341.12738" + x="154.5717" + id="tspan3343" + sodipodi:role="line">Prefix: 21</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="359.88428" + id="text3345" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3347" + x="154.5717" + y="359.88428" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 12345</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3349" + y="379.4567" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="379.4567" + x="154.5717" + id="tspan3351" + sodipodi:role="line">Value: 67.89Kg</tspan></text> + </g> + </g> + <g + transform="matrix(0.54655779,0,0,0.54655779,306.11765,431.96792)" + id="g3353"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3355" + width="417.54495" + height="126.4052" + x="141.08452" + y="419.52063" + rx="3.5336394" + ry="3.5336394" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="184.30057" + y="452.74203" + id="text3358" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3360" + x="184.30057" + y="452.74203" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">PEACH: 0.89€</tspan></text> + <image + width="162.12962" + height="107.14654" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAAERElEQVR4 nO3a0ZKaQBRFUbX8/182D1QZInRzadDxTNZ6mjgNNrhBYHJ9PB6XIdfr9XK5TIvPf57/drJ8/ayR rVdaG9Wfc+Vd+vPc+3N/hv3XK68st2i5Xa09XNnS+sjKthfdjiwMnydZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiW MJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCS Jcz18XgMLnm9Xi6XafH5z/8z+2Tp9H3iLEuYDyU7HV7njuT/dH/+9NLKid9o5/Zan+fYFnW+vFrT 27uv+hPb3AnLt1su0prSO/beWeVcr6XL1Ns0dLnNqy+OzeOskfV5Dm9RZ8BZe2N1YgfXWXlx11u/ Y2TftFTlM7rP/zFv/B378eDIp+I8V89enUO5MpMjXz7P9S/nP59V/3zWOiX317k6/9aw5TqPj9z0 eDyea+vfpd1Wt/ny7y3eN6jP88jX9wdu8Jfzn2wuWD84W1cOm8Navz1rZN/LfmidcW/H36nz9pUP oz7yUs6uuLa5dx+cB5/vvOmRWeuAb52ex0bunVL/W/Se8uDw+Dw3r1MHTnVjs5qvpP6m9QuG7/lu HNa5Trg3F/oVKrfSR05ge5dt3awMH5DPj7b+0KA/n+/xcrZ+7qhmsm/6JjpdfZ6dMZuLd+5yBuxa ydgHsbxsnS4N407Gy3BXkm3d6KyuqzLyTSrzXH5Cex+Cdt5ifoabBlT2SSWmutZGtVb4+UxP7+Sf v34979EGbl8+aWye9RuIuoMnv039Ge66AVruqy//lCcvzw3+XhjsvSH4Ke+YZ+dR/DfvijFBW9S6 071fylcCP644z19T2wc25GsvZzvnpnvrF1/rxHl2rvZWL3lbTxuK77V6ifmZaPpH+8vlZmeeYyPH ptqa8C3lnPTjj5OW6xz7dlr9Q93YrFoP7Vfz6s+kOM+DI/uWl63r095c0VnP8A8+M9/cF8XHN8Xn WfUT6nCvm2uo7Lf6lu6af32eu7aoo36X8jv/i/fqAXrwBrm1zr0rKa6heJzXt3TXE4P6PI/vk/lS lc/oD6RX6TSeNJuDAAAAAElFTkSuQmCC " + id="image3362" + x="387.35876" + y="429.14993" /> + <g + transform="translate(0,140.26901)" + id="g3364"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="341.12738" + id="text3366" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3368" + x="154.5717" + y="341.12738" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 21</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3370" + y="359.88428" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="359.88428" + x="154.5717" + id="tspan3372" + sodipodi:role="line">ID: 12345</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="379.4567" + id="text3374" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3376" + x="154.5717" + y="379.4567" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Value: 67.89Kg</tspan></text> + </g> + </g> + <g + id="g3378" + transform="matrix(0.54655779,0,0,0.54655779,306.11765,518.08445)"> + <rect + ry="3.5336394" + rx="3.5336394" + y="419.52063" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3380" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3382" + y="452.74203" + x="184.30057" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="452.74203" + x="184.30057" + id="tspan3384" + sodipodi:role="line">PEACH: 1.56€</tspan></text> + <image + y="429.14993" + x="387.35876" + id="image3386" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAAERElEQVR4 nO3a0ZKaQBRFUbX8/182D1QZInRzadDxTNZ6mjgNNrhBYHJ9PB6XIdfr9XK5TIvPf57/drJ8/ayR rVdaG9Wfc+Vd+vPc+3N/hv3XK68st2i5Xa09XNnS+sjKthfdjiwMnydZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiW MJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCS Jcz18XgMLnm9Xi6XafH5z/8z+2Tp9H3iLEuYDyU7HV7njuT/dH/+9NLKid9o5/Zan+fYFnW+vFrT 27uv+hPb3AnLt1su0prSO/beWeVcr6XL1Ns0dLnNqy+OzeOskfV5Dm9RZ8BZe2N1YgfXWXlx11u/ Y2TftFTlM7rP/zFv/B378eDIp+I8V89enUO5MpMjXz7P9S/nP59V/3zWOiX317k6/9aw5TqPj9z0 eDyea+vfpd1Wt/ny7y3eN6jP88jX9wdu8Jfzn2wuWD84W1cOm8Navz1rZN/LfmidcW/H36nz9pUP oz7yUs6uuLa5dx+cB5/vvOmRWeuAb52ex0bunVL/W/Se8uDw+Dw3r1MHTnVjs5qvpP6m9QuG7/lu HNa5Trg3F/oVKrfSR05ge5dt3awMH5DPj7b+0KA/n+/xcrZ+7qhmsm/6JjpdfZ6dMZuLd+5yBuxa ydgHsbxsnS4N407Gy3BXkm3d6KyuqzLyTSrzXH5Cex+Cdt5ifoabBlT2SSWmutZGtVb4+UxP7+Sf v34979EGbl8+aWye9RuIuoMnv039Ge66AVruqy//lCcvzw3+XhjsvSH4Ke+YZ+dR/DfvijFBW9S6 071fylcCP644z19T2wc25GsvZzvnpnvrF1/rxHl2rvZWL3lbTxuK77V6ifmZaPpH+8vlZmeeYyPH ptqa8C3lnPTjj5OW6xz7dlr9Q93YrFoP7Vfz6s+kOM+DI/uWl63r095c0VnP8A8+M9/cF8XHN8Xn WfUT6nCvm2uo7Lf6lu6af32eu7aoo36X8jv/i/fqAXrwBrm1zr0rKa6heJzXt3TXE4P6PI/vk/lS lc/oD6RX6TSeNJuDAAAAAElFTkSuQmCC " + height="107.14654" + width="162.12962" /> + <g + id="g3388" + transform="translate(0,140.26901)"> + <text + sodipodi:linespacing="125%" + id="text3390" + y="341.12738" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="341.12738" + x="154.5717" + id="tspan3392" + sodipodi:role="line">Prefix: 21</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="359.88428" + id="text3394" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3396" + x="154.5717" + y="359.88428" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 12345</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3398" + y="379.4567" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="379.4567" + x="154.5717" + id="tspan3400" + sodipodi:role="line">Value: 67.89Kg</tspan></text> + </g> + </g> + <g + transform="matrix(0.54655779,0,0,0.54655779,40.964737,95.182008)" + id="g3402"> + <g + id="g3404" + transform="translate(0,284.6156)"> + <g + id="g3406" + transform="translate(0,154.94832)"> + <rect + ry="3.5336394" + rx="3.5336394" + y="438.27753" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3408" + style="fill:none;stroke:#c3c3c3;stroke-width:1.82963264;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3410" + y="471.49893" + x="272.54657" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;text-align:center;text-anchor:middle;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="471.49893" + x="272.54657" + sodipodi:role="line" + id="tspan3412">OIGNONS 4Kg</tspan></text> + <g + transform="translate(0,156.57936)" + id="g3414" /> + </g> + </g> + <image + y="887.47076" + x="386.54324" + id="image3416" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + height="108.34499" + width="163.94308" /> + <g + id="g3418" + transform="translate(0,598.58983)"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="351.81107" + id="text3420" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3422" + x="154.5717" + y="351.81107" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 5449000000996</tspan></text> + </g> + </g> + </g> +</svg> diff --git a/addons/point_of_sale/doc/barcode_test_sheet4.pdf b/addons/point_of_sale/doc/barcode_test_sheet4.pdf Binary files differnew file mode 100644 index 00000000000..aff24aefd9d --- /dev/null +++ b/addons/point_of_sale/doc/barcode_test_sheet4.pdf diff --git a/addons/point_of_sale/doc/barcode_test_sheet4.svg b/addons/point_of_sale/doc/barcode_test_sheet4.svg new file mode 100644 index 00000000000..671d862519c --- /dev/null +++ b/addons/point_of_sale/doc/barcode_test_sheet4.svg @@ -0,0 +1,1210 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="297mm" + height="210mm" + id="svg3298" + version="1.1" + inkscape:version="0.48.3.1 r9886" + sodipodi:docname="New document 5"> + <defs + id="defs3300" /> + <sodipodi:namedview + inkscape:document-units="mm" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.61399264" + inkscape:cx="476.4606" + inkscape:cy="245.10408" + inkscape:current-layer="layer1" + id="namedview3302" + showgrid="false" + inkscape:window-width="1312" + inkscape:window-height="776" + inkscape:window-x="805" + inkscape:window-y="268" + inkscape:window-maximized="0" /> + <metadata + id="metadata3304"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <image + y="550.11414" + x="317.29758" + id="image3447" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAABQCAIAAAC72Xj2AAAAA3NCSVQICAjb4U/gAAAI70lEQVR4 +nO3ca0jT3x8H8PP10prOXMtb2nRI1iptliynqatUFpVGF8MkiR6kohFCT6LLgx5kkAlSJBXlE30Q +FUUkKIEYIZLRxZCal8oboWglNq+s3O/B+f0Ostn+O/O7yx/er0dfz/l+P+dz9o23m9+RYLFYCAAA +Dx9PNwAA/38QHADADcEBANwQHADADcEBANwQHADADcEBANxcEhz19fWCIAiCIJFI2GBubi4dLCws +pCMzMzPCfxoaGuwU3LNnDz0tLS2NHshkMtvTamtr2Syr3NTUZHXaxMQEm33+/LmddbOysuhpGRkZ +9EChULDZzMxMOlhSUmJ77c6dO62uDQ0NtT3t5s2bdDYsLMxOJyMjI6xnjUZDD06fPk1nh4eH2Wxr +a6udOqmpqfQ0vV5PD9asWcNmdTodHTxz5gwdGRwcZJXb29vp4LVr1+hITEwMu1ar1dLBHTt20AOl +UsmuffPmjVUnX79+ZbNv376lg1euXGGV2axaraYH586ds90RezUuXLhAR7q7u9m169ats+pKrVbb +Frl06RKd3bhxIxvctGmT1bVr165llY1Go1WRzs5ONtvV1UUHL168aNWJIAgqlYoeXL582baZuLg4 +OltRUUFH3r17x6798uULHTx79iwdSUpKsi2yKLZuZWUlHXn9+jWrPDAw4GAdgnccAOAEBAcAcENw +AAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3 +BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcA +cENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENw +AAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3P0+u7edXXl5Oj2NjY+2ceeDA +gfXr1xNCQkJCtFotIUQikdieFh8fTwv6+/ubzWY6qFKprE6TSCRs3ZiYGDvrHjp0KCEhga6blJRE +CAkMDGSzhw8f3rx5MyFk+/btttfm5eUlJiYuvFYmk9melpiYSJsJCgqy00lgYCDrOTg4eNeuXYSQ +jIwMOiKTydhsVFSUnTr5+fnJycmEkNDQ0K1btxJC5HI5mz169GhKSgohRK/X2ymyqIKCgrS0NFp5 +y5YthJCAgIDp6Wk6Gx4ebnW+XC5nPbPZbdu20cHAwMCpqSk6GBQUZDKZCCG0vpXCwsJv376RBXdB +oVCwyjKZbHJycmFXtp0QQlJSUuglERERbPD48ePDw8MLr2XVCCGrVq2yKhISEsLWVSgU9CA1NZUO +LryW7Y7eCysnTpwYGxujrwZ7fVhldr/S09Pn5uYIIUql0raIy1lcoK6ujhZftmwZG8zJyaGDx44d +c8Wi4AoDAwPsn8qrV6/oYGVlJR2Jjo72bHvAhf2avHr1Kh1pb29n97e/v9/xUhwfVRobG5VKpSAI +vr6+eXl59JeAi4yNjalUKrlc3tfXx3ttV1fXqVOndDqdQqHYt2+f0z0sfb9idSJKM2IV8dS6YjXv +Pc2ItSOTyVRUVBQQEEBL7d6927k6XBwNjp6enoMHD+bk5IyOjra1tbW1tRUXF7uurbKyMh8fn4mJ +iT9//vBe+/Hjx46ODp1OFx4ezt4c8hJlv6J0IlYzbr6D4q4rVvPe04xYO5qfn9+/f//Tp09v375t +NBpbW1sNBoMTdbg5+M6ktLR09erVZrOZ/nj37l1BEAYHBxc9eYkfVR4/fqxUKmtrawkhvb29DnZo +y2Aw6PV6567l2q9LOxGrGeeKLP2jigeb9+ZmxNpRfX29j49PZ2enIyd74KNKS0tLZmamn9+/f0w1 +GAwWi+XFixdOB9bfjI+Pl5aW1tTU2P9joau5bb9ua8ZTO/Kq5r2nGbF2dP/+/dTU1Pj4eKPR2N3d +7cQ7dOc4Ghx9fX0LH09ERUX5+fk58QeI/6m8vFyv1y/xLwJL57b9uq0ZT+3Iq5r3nmbE2tGHDx8i +IiK0Wm1CQsKGDRsiIyOfPXvGW8QJjj6OnZ2dDQgIYD8KgiCVStnDNitxcXEnT54khPj7+7NBg8FA +n3XpdLq/rdLY2NjQ0GA0Gh3synW49utSFotFlGacKyKTyeitJISEhYXRA41GQwdtH0mKta4rinj2 +lXRFEULIr1+/Hj16VFZW9vLlS7PZXFRUlJ+f/+nTp0W/Z1BQUPD9+3dCiEajoSNhYWHs/nK9x3c0 +OCQSyezs7MKR2dlZqVS66MnJycm2D6jLysrsL2EymYqLi6uqqtg/UA/i2q9LCYIgSjPOFVEoFHfu +3LEazM7Ozs7Odum6riji2VfSFUUIIcuXL7dYLFVVVRKJRCqV1tTUPHjw4MmTJ+x7HwtVVFRYjahU +Ktv76whHgyM6OnpwcJD9ODIyYjabo6OjnVjyb9rb24eGhqqrq6urqwkhExMThJDc3NysrKzr16+L +uJAj3LBfNzfjqR15VfPe04xYO1KpVJOTk+z7kAqFYuXKlUNDQ7x1eDkaHOnp6c3NzfPz8z4+PoSQ +5uZmOihiK2q1+saNG+zHjo6Oe/fuHTlyhH5V1M3csF83N+OpHXlV897TjFg70uv1t27dmpubo9nx +48eP8fFx229Li8/Bpy/v37/39fU9f/682Wz+/PlzbGzs3r17HX9444SHDx8Spx7HTk9Pt7S0tLS0 +aLVajUZDj3mLiLLfRTuZmprySDPuv4MiritW897TjFg76u/vl0qlJSUlJpPp58+feXl5crl8eHjY +iVJcOL5yXldXt2LFCvoASa/Xj46Ouq4tyxKCo7e31+l8XGjp+120E6PR6JFmxCriqXXFat57mhFr +R42NjREREYIgEEIiIyObmpqcq8NFsFgsjr89mZmZ6enpCQ4Odsd7IS/gVfsVpRlP7cirmveeZsTa +0e/fv7u6ugRBUKvVvr6+SynlIL7gAAAg+P84AMAJCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABu +/wCMwdtAmXYtOgAAAABJRU5ErkJggg== +" + height="40.830791" + width="183.73856" /> + <image + y="485.14542" + x="317.29758" + id="image3458" + xlink:href="data:image/png;base64,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 +" + height="40.830791" + width="183.73856" /> + <image + y="420.17667" + x="317.29758" + id="image3469" + xlink:href="data:image/png;base64,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 +" + height="40.830791" + width="183.73856" /> + <image + y="355.20795" + x="317.29758" + id="image3480" + xlink:href="data:image/png;base64,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 +n0klknBtbW2EEKvVeuLEiZycnKGhoQW/7lFTU+MUMRgMrvvrCU8/qsTGxo6OjvKHFovFbrfL/W5J +V1fXly9f6uvrk5OTk5OTz58/TwjJz8+vrKyUOIuHpKxX1oqkFLMEO6jcvLKK959ilNgOjUZTXV09 +NTX18uVLX/J4wtN3HJmZmW1tbb9//w4ICCB/OlxmZqbEUhITE2/fvs0f9vT0NDQ0HDlyhH1VdIlJ +Wa+sFUkpZgl2ULl5ZRXvP8UotB3sK6cLfq9aMg/vvrx79y4wMLC6utputw8ODsbHx+/fv9/zmzde +aG5uJl7dvJydnW1vb29vb09JSTEajexYNIkS6/V6RVKKWfodlDivrOL9pxhZK7py5UpHR4fFYpmY +mGhpaYmPjzcYDDabzYtUQgS+ct7U1LRy5Up2A8lsNk9MTChXlsOHf2YDAwNe98f5pK/X6xXJKmaJ +d1DuvLKK959ipCQpKCjg93QppQcPHhwcHPQijyjqcDg8f3syNzfX398fFhbm+pdj/0t+tV4pxSzX +ivyqeP8pRkoSq9XKvqcXFxc3/48wFSXWOAAACP4/DgDwAhoHAAhD4wAAYWgcACAMjQMAhKFxAIAw +NA4AEPYPxQz1KjysjN4AAAAASUVORK5CYII= +" + height="40.830791" + width="183.73856" /> + <image + y="290.23923" + x="317.29758" + id="image3491" + xlink:href="data:image/png;base64,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 +AElFTkSuQmCC +" + height="40.830791" + width="183.73856" /> + <image + y="225.27045" + x="317.29758" + id="image3502" + xlink:href="data:image/png;base64,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 +QIbGAQBkfwGMfBx9p8Zw1QAAAABJRU5ErkJggg== +" + height="40.830791" + width="183.73856" /> + <image + y="160.30176" + x="317.29758" + id="image3513" + xlink:href="data:image/png;base64,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 + +" + height="40.830791" + width="183.73856" /> + <image + y="616.89185" + x="756.41528" + id="image3524" + xlink:href="data:image/png;base64,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 +/wGl0FVoZvDCKwAAAABJRU5ErkJggg== +" + height="40.830791" + width="183.73856" /> + <image + y="95.332993" + x="317.29758" + id="image3535" + xlink:href="data:image/png;base64,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 +rkJggg== +" + height="40.830791" + width="183.73856" /> + <image + y="551.9231" + x="756.41528" + id="image3546" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAABQCAIAAAC72Xj2AAAAA3NCSVQICAjb4U/gAAAIiUlEQVR4 +nO3ab0hTXRwH8HPSNnTT6ZxaiDokwzRdWaaVa/ZHfJFWDMPSNIKiqIj+vBCygpA0sqS3/SPIiKCX +BYFkswjLygp6YS7TlERRI8pWM7U9L87zHPbsquzoVe/G9/Pq7nfu/e3ce9bXrXupy+UiAAAi5s31 +BADA9yA4AEAYggMAhCE4AEAYggMAhCE4AEAYggMAhM1IcNy+fZtSSilVq9W8uGXLFlYsLS2VHpKf +n89Gs7Oz2UZwcLB0t5s3b7JRrVY7yQSGhobof1asWME29u7dy0a/f//OR+vr61nx2rVrrBIWFiZt +eOXKFTYaHh7Oj01PT2cbBw4cYLt9/fqVjz5+/NijycDAAB9dtmwZ27BYLGwjKipqkjPq6+vjx5pM +JrZx5MgRNtrb28tHnz175nFsT08PH01NTWUbx44dY6Nfvnzho0uXLmUbJ06cYKPd3d18tLm5mRUv +XrzIKvHx8fxdMjIyWDEnJ4dtxMbG8mNfv37tMauOjg4+2tLSworV1dW8Mx9NSkpiGydPnpReGX41 +Tp06xSptbW382MWLF3vMKikpSdrk7NmzbDQ5OZkXU1JSPI5dtGgR79za2urR5P3793z0w4cPrHj6 +9GmPmVBKjUYj2zh37px0MomJiWy0qqqKVd68ecOP/fTpk/QQqfLycrb/ypUreZG/b01NDau8fPmS +d+7q6vKmM4NvHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAg +DMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEB +AMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQ +HAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAgDMEBAMIQHAAg +LHCuJ/Cvbdu2JSYmEkIiIiIyMjIIISqVSrpbSkrK0aNHCSFqtXqSbiqViu1GCAkLC1u3bh0hJCsr +i1XUajUfjY+PZxupqamsGBQUJG2YlpbGRlUq1Z8/f3hni8VCCFm7di2rBAUF8c5xcXEeTYKDg91n +tX79ekKIwWBIT08nhISEhExyRhqNhh+r0+k2bNhACGHnRQjRarV8NCYmxuNY91GdTrdp0yZCSE5O +DquEhITw0dDQ0NzcXEIIOy8hxcXF2dnZhJDIyMjly5ez8/316xcbjY6O9tg/LCyMvy8fXbVqFStq +NBqHw8FnODQ0RAhh/T2Ulpb29PQQt1XQ6/W8s1ar/fnzp/uspDMhhKxevZodsmDBAl7cvXt3b2+v ++7G8GyEkIiLCo4nBYODvq9fr2caaNWtY0f1YfnaZmZnSyezZs2dgYIBdDX593D850kOkzGYz+6BK +P4fycM2Auro61lylUvFiQUEBK+7atWsm3hRmQldXF/+ovHjxghVrampYJS4ubm6nB0L4n8kLFy6w +SnNzM1/fz58/e9/K258qtbW1ycnJlFJKaUhISHl5+fDw8DQzS+rw4cNZWVl6vT4/P386fR4+fBgb +G0spDQgI2L59O/t75btNZOkzOys4Lj+7kopqcuPGjZiYGLasgYGBhYWF7FvSTPM2OOrr60tKSl69 +etXW1lZZWXnp0qXjx4/LPpt3795lZWVFR0fzL3VTYLfbrVZrQUFBf39/U1NTU1PT/v37fbeJXH1m +ZwWl/O9KKqcJIcRgMFRWVra0tHz8+PHOnTtPnz7dsWPHFPoI8/KbydjYmPvL0tJSvV4/0c7T/KmS +l5dnsVi8nJjUwYMHFy5cODIywl5ev36dUtrd3e2jTeTqI7SC3PR/qvjflVROE6nq6mpKqcPhGHd0 +Dn6qzJv3vz11Op1HRTlsNtvGjRsDA//9f9+8vDyXy9XY2OijTeTqM1cr6H9XUjlNpHp6egwGw7j/ +wS+vqXx0BgcH7969a7VaZZ+NLDo7O41GI38ZExMTGBjY2dnpo01k7MPN5gr635VUThPu8uXL1dXV +RUVF9+7du3XrFqV0an28J3w7dnh4uLCwUKvVnj9/fqJ9EhMT9+3bRwiZP38+L+bl5bF7Xfy26Exw +uVxOpzM4OJhXKKVBQUH8vqCXlNNErjPivFlBTqvVsqUkhERFRbENk8nEitJbklL+dyWV04S7f//+ +jx8/7HZ7WlpaZGTkRLsVFxcPDg4SQkwmE6tERUXx9Z38gQAPYsExOjpaVFRkt9ufPHkSHh4+0W6Z +mZnSG9SHDh0Seq+poZSq1Wqn0+ledDqdol/elNNErjNivFxBTq/XX7161aOYm5vLHvfwhv9dSeU0 +4RoaGgghDoejrKwsNze3o6Nj3Mc9qqqqPCpGo1G6vt4Q+KkyOjq6c+fOpqamhoYG9rCWMsXFxXV3 +d/OXfX19IyMjoo/BKKeJjH3mZAX970oqp4kHjUZTUVHx7du358+fT6ePN7wNjrGxsZKSEpvN9ujR +oyVLlszonKbJbDbbbLa/f/+ylyyMzWazjzaRq89craD/XUnlNJFij5xO/ly1PLy8+1JWVkYpra2t +tbkZHR31/v6NN1jbjIwMk8nEtie6sTSJt2/fBgQEVFRUjIyMtLe3JyQkbN682XebyNVndlZQyv+u +pHKauFyuM2fONDY29vX19ff3P3jwICEhwWg0Op3OKbQS4m1wjPuE/9DQkMyzkWhtbZ1Cn7q6utDQ +UHavy2Kx9Pf3+3QTWfrMzgqOy8+upKKaWK1Wfk+XUrp169b29vYp9BFFXeP9c/UDv3//ttvtOp3O +/aaX7zaRsc+c8L8rqZwmDoeDPacXHx+v0Wim3EeI3wYHAMwchT79CQBKhuAAAGEIDgAQhuAAAGEI +DgAQhuAAAGEIDgAQ9g8gquH2n03rCAAAAABJRU5ErkJggg== +" + height="40.830791" + width="183.73856" /> + <image + y="486.95435" + x="756.41528" + id="image3557" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAABQCAIAAAC72Xj2AAAAA3NCSVQICAjb4U/gAAAJkElEQVR4 +nO3bW0hU2x8H8LVTZxwdb6OOlXktozQbNbxQ1ngsmQe1QrJSmyIw7EYXI4TKiCSLNN/VwD8YFr2F +D4FlJoTktSjBC3lF0bxUYt7H5jys81/MmTGZZVsdD9/P05611v7NWnvZ1xn3TtDr9QQAgMe61Z4A +AKw9CA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuyxIcT548EQRBEASpVMoaDx48SBu1Wq3pKQkJ +CbQ3OjqaHtjZ2ZkOKykpob1yuXyRCYyPjwv/t2vXLnqQnp5Oe8fGxlhvRUUFbSwuLqYtzs7OpgUL +Cwtpr4uLCzs3LCyMHpw9e5YOGx0dZb1v3rwxKjI8PMx6Q0JC6IFaraYHSqVykRUNDg6yc1UqFT24 +dOkS7R0YGGC97969Mzq3v7+f9QYHB9ODq1ev0t6+vj7Wu2PHDnpw7do12tvb28t6a2traWN+fj5t +8fHxYe8SHh5OG2NiYuiBl5cXO7ehocFoVp2dnay3sbGRNt6/f59VZr3btm2jBzdu3DC9Muxq3Lp1 +i7a0tbWxcz99+mQ0vqWlhfUGBAQYzTkwMJCNDAoKMurdsmULO7elpcWo8ufPn1lva2srbczOzqYt +W7duZb2+vr704N69e6YrYrPKzc2lLU1NTezcjo4Oo/GNjY2st7Oz07Qgw943Ly+PttTV1bFze3p6 +FjnXCD5xAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcA +cENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENw +AAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3 +BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA3BAcAcENwAAA369We +wD8OHz4cEBBACHF1dQ0PDyeESCQS02FBQUFXrlwhhEil0kWqSSQSOowQ4uzsvG/fPkJIVFQUbZFK +pazXx8eHHgQHB9NGmUxmWnDnzp20VyKRzM7OsspqtZoQsmfPHtoik8lYZW9vb6MidnZ2hrP666+/ +CCFubm5hYWGEEAcHh0VWZG9vz851cnKKjY0lhNB1EULkcjnr9fT0NDrXsNfJyenAgQOEkJiYGNri +4ODAeh0dHePi4gghdF1cUlNTo6OjCSHu7u6hoaF0vZOTk7TXw8PDaLyzszN7X9YbERFBG+3t7Scm +JtgMx8fHCSG0vhGtVtvf308MdkGhULDK7u7uRuNdXV1Zr1wu//nzp+Gc169fz0aeOnVqYGDAsJeN +p3WMKru5ubHKCoWCHuzevZs2Gp7LVhcZGWm6otOnTw8PD9Orwa6P4U+O0fjFe5eLfhmUlpbS4hKJ +hDUmJibSxhMnTizHm8Jy6OnpYT8q79+/p415eXm0xdvbe3WnB1zYr8mHDx/SltraWra/3d3d5pcy +96tKQUFBYGCgIAiCIDg4OGRlZc3MzPxhZpm6ePFiVFSUQqFISEj4kzovX7708vISBMHKyio5OZn+ +vlq7RUSpszI7uCDLuZJlZWXO/1ZcXLxakxGliF6vv337tqOjI93Z8PDwhoaGJdThZW5wVFRUpKWl +1dfXt7W15eTkPHr0KDMzU/TZfPz4MSoqysPDg32oW4L29vakpKTExMShoaGampqampqMjIy1W0Ss +Oiuzg6Ys6krOzs5OTk7+zwD94rbykxFrRUVFRTk5Obm5uSMjI83NzTY2NgkJCVNTU0soxcfMTybz +8/OGL7VarUKh+N3gP/yqotFo1Gq1mRMzdf78+Q0bNszNzdGXjx8/FgSht7d3jRYRqw7XDjJ//lXF +oq5kSUmJVCrlPWs5JiPWipKTk1UqFXtZUVFBCKmrq1tw8Cp8VVm37l8jnZycjFosR1VV1f79+62t +//m7r0aj0ev1b9++XaNFxKqzWjtoUVeS6urqqq+vHxkZWdrpFrUiT0/P0dFRnU5HXw4ODq5bt87w +T7zLZCk/OiMjI8+ePUtKShJ9NqLo6ury9fVlLz09Pa2trbu6utZoERHrMCu5gxZ1JQkhMzMz/v7+ +ERERSqUyOTn5x48fvBUsakVZWVlubm7x8fGFhYU5OTnXr1/Pzc318vLircOL+3bszMzMkSNH5HL5 +gwcPfjcmICDgzJkzhBAbGxvWqNFoaBCy26LLQa/XT09P29nZsRZBEGQyGbsvaCbLKSLWihhzdpCR +y+V0KwkhSqWSHqhUKtpoekvSlOVcSUJISEjIq1evQkNDdTpdeXn55cuXtVpteXn5yk9GrBW5ubkd +OnQoPz+/o6Pj+/fvfn5+7Ca9qdTUVPo5S6VS0RalUsn2d/EHAozwBYdOpzt27Fh7e3t1dbWLi8vv +hkVGRpreoL5w4QLXey2NIAhSqXR6etqwcXp6esGnMxZhOUXEWhFl5g4yCoWiqKjIqDEuLo4+7mEO +y7mShJCQkBB2nJ6ePjg4mJ2d3d/fb/rwy3JPRqwVZWZmlpWV1dbWBgUFzc/PZ2VlxcbGNjc3b968 +2XRwbm6uUYuvr6/p/pqD46uKTqdLSUmpqamprKykD2tZJm9v797eXvZycHBwbm7O9HGstVJExDqr +soMWdSWN0Me66PNjKzwZsVb09OnTlJSUoKAgQoiVldWdO3dmZmZevHjBW4eXucExPz+flpZWVVX1 ++vXr7du3L+uc/tDevXurqqp+/fpFX1ZWVtLGNVpErDqrtYMWdSWNNDU1EUI2bdq08pMRa0W2traG +n1ymp6f1er2trS1vHW5m3n05efKkIAgFBQVVBnQ6nfn3b8xBy4aHh6tUKno8MTHBW+TDhw9WVlY3 +b96cm5v78uWLv79/fHz82i0iVp2V2UFTFnUl7969W11d/fXr1/7+/sLCQplMlpiYuCqTEWtFGRkZ +MpmsvLxcp9MNDw8fPXpUIpG0trYuoRQXc4PD9P8aEELGx8dFno2JlpaWJdQpLS11dHSk97rUavXQ +0NCaLiJKnZXZwQVZzpXUaDRs7dbW1ufOnRsbG1utyYhSZGxs7Pjx4/TxU0LIxo0bnz9/voQ6vAT9 +Qv9c/wOmpqba29udnJwMb3qt3SIi1lkVlnMlv3371tfXJ5VK/fz8FvyPlCs5GbH2dHx8vLu728HB +wcvLiybIcvvPBgcALB8LffoTACwZggMAuCE4AIAbggMAuCE4AIAbggMAuCE4AIDb35dk94l+Z3As +AAAAAElFTkSuQmCC +" + height="40.830791" + width="183.73856" /> + <image + y="421.9856" + x="756.41528" + id="image3568" + xlink:href="data:image/png;base64,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 +/Rd1zqZZsxMHwwAAAABJRU5ErkJggg== +" + height="40.830791" + width="183.73856" /> + <image + y="357.01688" + x="756.41528" + id="image3579" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAABQCAIAAAC72Xj2AAAAA3NCSVQICAjb4U/gAAAJh0lEQVR4 +nO3caUhUXx8H8HNdxm3cxnFJGTXLMC2nDJdKmzLEF2qCaG5pBIVREWGEkCXFkEaa+FYrggyLehUW +gWRahKRpBRnuK4nikpi55dh9XpznOfifKZkz//FxlO/n1Znfuec3Z+7Y1xnvJUEURQIAwMNsrTcA +AOsPggMAuCE4AIAbggMAuCE4AIAbggMAuCE4AIDbqgTHw4cPBUEQBMHKyooVjxw5QotZWVm0Mjc3 +J/xPWFgYHURGRtKBra0tm33x4gVdcv/+fVqRSqUrbGB6epqt3bNnDx2cPHmSzk5NTbHZmpoaWrxz +5w6tODk56TYsLy+ns87OzmxtSEgIHZw+fZoeNjExwWZfv36t1WRsbIzN7tq1iw5UKhUduLm5rfCK +RkZG2FqlUkkH58+fp7PDw8Ns9t27d7RYVlZGKx4eHmy2oaFBq/O3b9/Y7I4dO+jg4sWLdHZwcJDN +NjY20mJJSQmt+Pj4sD6hoaG0ePDgQTpQKBRsbXNzs9bz9vb2stmWlhZaLCoqYp3ZbEBAAB1cvnxZ +98yws3HlyhVa6ejoYGu3bdumtauAgADdJtevX6ezgYGBrBgUFKS1duvWraxzW1ubVpMvX76w2fb2 +dlq8evWq1k4EQfD19aWDGzdu6G7G39+fzhYWFtLKx48f2dqenh6t41taWthsb2+vbkOGPW9xcTGt +NDU1sbUDAwMrrNWCTxwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDc +EBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwA +wA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3B +AQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDcEBwAwA3BAQDc +EBwAwM1iLZ/bwuLChQt07OzsvH//fkKIi4tLaGgondVoNHTWz8+PDoKCgugSKyurFTpLJBLW2cnJ +6cCBA4SQiIgIWrGysmKzPj4+dLBz505atLGx0W0YHBxMZyUSya9fv1hnlUpFCKE7p2tZZ29vb60m +tra2y3d16NAhQohcLg8JCSGE2Nvbr/CK7Ozs2FpHR8fo6GhCCH1dhBCpVMpmvby86CAkJIQWra2t +5+fnadHT01Ors729PVvr4OAQExNDCKGvi0tGRkZkZCQhxNXVdffu3fT1zs7O0ll3d3et452cnNjz +stmwsDBatLOzm5mZYTucnp4mhND+WrKysoaGhsiyd0Emk7HOUqn058+fy3eluxNCyN69e+kSDw8P +Vjx+/Pjw8PDytawbIcTFxUWriVwuZ88rk8noYN++fbS4fC17deHh4bqbOXHixNjYGD0b7Pws/8nR +On7l2dUiroLKykraXCKRsGJCQgItHjt2bDWeFFbDwMAA+1F5//49LRYXF9OKt7f32m4PuLBfk7du +3aKVxsZG9v729/fr30rfryqlpaWBgYGCIAiCYG9vn5eXt7Cw8C8zS9e9e/e8vLzos1hYWCQnJ9PI +5/Xy5UuFQiEIgrm5eUpKCv19tX6bGKVPe3v7uXPnIiIiZDJZfHy8YdswzAY7kybVRBTFgoICBwcH ++q8mNDS0ubnZgD689A2OmpqazMzMDx8+dHR0qNXq27dv5+bmGn03crlcrVa3tLR0dXVVVVW9ffs2 +LS2Nt0lnZ2dSUlJCQsLo6GhDQ0NDQ0NOTs76bWKsPl+/fv38+XNERIS7uzv7zPx/sPHOpOk0IYRU +VFSo1erCwsLx8fHW1lZLS8v4+Pi5uTkDWvHR85PJ0tLS8odZWVkymexvBxvrq0pRUZEgCHoezJw5 +c2bTpk2Li4v04d27dwVBGBwcXKdNjNiHio2NValUeh7877+qbLwzaTpNRFFMSUlRKpXsYU1NDSGk +qanpjwevwVcVM7N/HOno6KhVWQ1DQ0NyuZx3VV1d3eHDhy0s/vt339jYWFEU6+vr12kTI/ZZExvv +TJpOE0KIl5fXxMQEu4wwMjJiZma2/E+8q8SQf/zj4+OPHz9OSkoy+m6osrKyoqKi1NTUp0+fPnjw +gHd5X1+fr68ve+jl5WVhYdHX17dOmxixz5rYeGfSdJoQQvLy8uRyeVxcXHl5uVqtvnTpUmFhoUKh +4O3Di/ty7MLCQnJyslQqvXnz5t+O8ff3P3XqFCHE0tKSFWNjY2kQssuif1NdXf3jx4/Ozs7g4GBX +V1eu7YmiOD8/b2tryyqCINjY2LDrgnoynSbGekWGkUql9K0khLi5udGBUqmkRd1Lkro23pk0nSaE +ELlcnpiYWFJS0tPTMzk5uXnzZnaRXldGRsb4+DghRKlU0oqbmxt7f1e+IUALX3BoNJrU1NTOzs43 +b944Ozv/7bDw8HDdC9Rnz57V81lqa2sJITMzM9nZ2TExMd+/f9d/h4IgWFlZsdsWqPn5+T/enbEC +02lirFdkGJlMVlFRoVWMiYmht3voY+OdSdNpQgjJzc2tqqpqbGwMCgpaWlrKy8uLjo5ubW3dsmWL +7sGFhYVaFV9fX933Vx8cX1U0Gk16enpDQ0Ntba2/v78BT8bFzs4uPz9/cnKSd6G3t/fg4CB7ODIy +sri4qHs71nppYsQ+a2LjnUnTaUIIefToUXp6elBQECHE3Nz82rVrCwsLz5494+3DS9/gWFpayszM +rKure/Xq1fbt21d1Twy9f45XVFRUXV3d79+/6UP6+SUqKmqdNjFinzWx8c6k6TQh/7wtmBAyPz8v +iqK1tTVvH256Xn3Jzs4WBKG0tLRuGY1Go//1G30UFBTU19ePjIyMjo4+f/7cz8/P19eXt8mnT5/M +zc3z8/MXFxe7u7v9/Pzi4uLWbxNj9ZmdnaXvWmhoqFKppOOZmRkD9sNl451J02kiimJOTo6NjU11 +dbVGoxkbGzt69KhEImlvbzegFRd9g+OPd/hPT08bdzdJSUnsApUgCImJid3d3Qb0qaysdHBwoK1U +KtXo6Oi6bmKUPl1dXbrvYFtbm2H74bLBzqRJNZmamkpLS6O3nxJCPD09nzx5YkAfXoIoiqvxQcZg +MzMz9KYjHx8fOzs7g/vMzc11dnY6Ojouv+i1fpsYsc+a2Hhn0nSaEEKmp6f7+/vt7e0VCgVNkNVm +csEBAKYP/x8HAHBDcAAANwQHAHBDcAAANwQHAHBDcAAANwQHAHD7D6vNDk78iVEhAAAAAElFTkSu +QmCC +" + height="40.830791" + width="183.73856" /> + <image + y="292.04813" + x="756.41528" + id="image3590" + xlink:href="data:image/png;base64,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 +gg== +" + height="40.830791" + width="183.73856" /> + <image + y="227.07941" + x="756.41528" + id="image3601" + xlink:href="data:image/png;base64,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 +" + height="40.830791" + width="183.73856" /> + <image + y="162.11064" + x="756.41528" + id="image3612" + xlink:href="data:image/png;base64,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 +9gAAAABJRU5ErkJggg== +" + height="40.830791" + width="183.73856" /> + <image + y="97.141937" + x="756.41528" + id="image3623" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAABQCAIAAAC72Xj2AAAAA3NCSVQICAjb4U/gAAALmklEQVR4 +nO3cfUxbVR8H8HOhtEARymth2NI2zs2AlA2LOKc1OsOcskUQXVA0ok7cDFtiXIzoXLYomcyMZC8Z +cWxT5jSZWzLBoFsW2EJQNJv42g0QNlYCUnkfHdCN+sd5nhMeO3n6u1xEk+/nr3vPued7T3vvftzb +ezPJ6/UyAACKgLmeAAD8+6BwAAAZCgcAkKFwAAAZCgcAkKFwAAAZCgcAkM1K4Th06JAkSZIkaTQa +0bhy5UreWFBQwFuuXr0q/VdNTc00gStWrOCbLV26lC+EhYX5brZ//37RK5LT09P5wvPPP883Gxoa +Er0nTpz4U8jg4KDoPXnyJG+sqKjgLZGRkaJ38eLFfKGoqGiaye/Zs4dvFh0dLcbW19fz3t27d/OW +uLi4aUJ6enrEWKvVyheKi4t5b3d3t+htaGjgjeXl5bwlMTHRN3DHjh28NyEhQYxNSUnhC6+88grf +rLOzU/Q2NTXxxu3bt/OWpKQkEWiz2XjjfffdxxfMZrPvfrdt28Z7jUajSD579izvLS0t5S233HLL +NN/GVOLbeOONN3jLhQsXRPIPP/wwzVjxed966y3f3uTkZN67efNm3vLTTz+JZIfD4c/03nzzTb79 +rbfeKsaaTCa+8Pbbb/sOmT9/Pu995513eMu5c+fEWPG9ie85PT1djLVYLLxx27Ztvsliv2VlZbzl +m2++EcmXLl3y5xNxuOIAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAg +Q+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EA +ADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIU +DgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAgQ+EAADIUDgAg +Q+EAADLVXO5bpdqwYQNftlgs02z56KOPLliwgDEWExNjs9kYYxqNxnezlJQUHhgUFOTxeHijTqe7 +9957GWOZmZm8RaPRiP0mJSX9KSQ4ONi3NzU1lTeq1eqJiQmRbLfbGWN33333NJO3Wq18rEajGR8f +540Gg4EvpKWl8d6bbrppmhCtVitmFRERcf/99zPG+OdijIWFhYnexMREvrB48WLeqNPpfANFb3Bw +8NjYGG8MDw9/8MEHGWP8c5Hk5+cvXbqUMRYbG7to0SLGWHR0tO9mNpuN7zc0NNTtdvNGvV7PFzIy +MnhvbGysn/stKCjo6upiU45CVFSU+Damz3n66ae7u7sZY3fddZdv7zPPPPOn3piYGJF8w0/na8mS +JXxIWFjYlStXeKNWqx0dHWWM3Xnnnb5Dnn32WZfLxRjLyMjgLXq9XuxXfG/iexbnEmOssLCwr6+P +Mcb/mcwi7yyoqqri4Wq1WjRmZ2fzxqeeemo2dgqz4dKlS+JU+frrr3ljWVkZbzEajXM7PSARfwjf +ffdd3tLU1CSO78WLF/2P8vdW5fDhw7r/9f7778+wZk3D5XKZTCadTtfR0TEnIdevX3/ttde0Wq0k +SRqNpqioSFzCkNTW1hoMBkmSAgMD8/LyRkZGZIQolaPUZEjOnz//8ssvZ2ZmRkVFPfLII/JCKisr +ExMTJUmSJEmlUj322GP8WoDqoYce0vlobGyk5oyMjKxZsyY0NJR/mcuXL5cxGUUOh1InKpW/hWNi +YsLtdh+cYtmyZbM3rXXr1gUEBAwNDV2/fn1OQsrLy997771du3a5XK7PPvvs6NGjGzdupIa0tLTk +5ORkZ2f39vY2NjY2Nja++OKL1BClcpSaDNXPP//c3NycmZmp1+vFtTpVTEzM1q1bz54929raevjw +4TNnzqxevVpGzuuvvz71HE5NTVWpVHfccQcpZHJyctWqVcePH6+oqHA4HA0NDVlZWdSZKHU4FDlR +5fDzyuTAgQMajcbPjWd4q3Ls2DGDwbB//37GWGtrq587VTbEaDQ++eSTYrWsrEytVg8ODpJC1q5d +m5CQ4PF4+Oq+ffskSers7KRORpEceSEK3qpkZWXZ7XbSnP9KaWmpJEmjo6MzCXG73REREcXFxdSB +hw4dCggI+PHHH2eyd6XODdKJOge3KlxHR8e33377+++/y6xSfhgYGFi7du2ePXum/7FwtkM6OztT +UlLEanJy8sTERENDAymkrq7ugQceUKn+8wt0VlaW1+utr6+nTkaRHKUm80/Q1dUVExMTEhIyk5Cj +R48ODQ0999xz1IGffPLJkiVLUlJSHA7HhQsX5F0UK3I4JiYmFDlRZSAUjvHxcYvFkpGRERcXl5eX +Nzg4OBsT2rBhg91ul30zrFRIdHT05cuXxarT6WSM/frrr6SQjo4Ok8kkVhMTE1UqlYwfXBTJUWoy +c6i8vLy0tPSJJ544cuTIhx9+KEnSTNIqKyvT09NTU1OpA7///vv4+HibzXb77bffdttt8+bNq66u +poYocjjUarUiJ6oM/j6OTUtLO3ny5KJFi65du1ZdXb1+/fqCgoK/+r7mz5//wgsvMMaCgoJEY1ZW +Vnx8PJvyWNRXbW1tTU2Nw+EgfILZCcnNza2qqiosLExPT3c6ndu3b2eMiceHfhobGwsNDRWrkiSF +hIRQQ7xeryI58kLCwsL4oWSMxcXF8QWr1cob/XwkqZTq6urh4eGWlpbU1FT/n9feUHt7++nTp3fv +3i1j7PDw8Keffrpu3bozZ854PJ41a9asXr36l19+8X20Pw1Fjikjnqj5+fn8dsFqtfKWuLg4cXxp +l+fUeypu69atjDGn0ylv+A0NDw8bDIYDBw7w1SNHjjD6zxOKhHi93v7+/hUrVjDG9Hq9SqVav349 +Y2zXrl2kEI1Gs2nTpqktQUFBmzdvpk5GkRylJiObUr9xXLlyJScnJzIycmBgQHZISUlJcHCwvAS9 +Xh8eHj42NsZX+/r6JEnasWMHKUSpw6HIiSqDzDdH+Zsn/MUbpTQ1NV2+fLm8vDwtLS0tLe3VV19l +jK1cubK4uPhvDmGMRUZGfv755+3t7R999FFbW1t+fj5jLDk5mRRiNBo7OzvFak9Pj8fjMRqNpBCl +cpSazJzTarUlJSUDAwNfffWVvITJyckPPvggNzf3hq/G/V8mk8lgMIhXEKOioiIjI6feL/hDqcOh +yIkqg8w3R8+dO8cYu/nmmxWcysKFC3fu3ClWm5ubKysrH3/8cdI7cIqECGaz2Ww2M8ZKS0sTEhL4 +m5H+u+eee06dOjU5ORkQEMAYO3XqFG+kTkORHKUm80/AX6y84dvD/vjyyy+dTmdhYaG84Xa7fe/e +vePj43wCfX19AwMDU3+w8Ieyh2OGJ6ocfl6ZbNmy5fTp07/99ltXV1dFRUVISEh2dvasXgvJvstQ +JKS5ufnEiRMul6ulpWXjxo2SJH388cfUkO+++y4wMLCkpMTj8bS1tVkslocffpgaolSOUpOhcrvd +dXV1dXV1NpvNarXyZeqT1E2bNtXX1/f09PT29tbU1FgsFpPJJG4WqHJzc81m8+TkpLzhFy9eDAkJ +KSoqGhkZ6e/vz8vL0+l03d3dpBClDociJ6oM/haOqa+4qFSql156aWhoaFZnNreFo6amRvxBi42N +PXjwoLwJVFVVhYeH86dudru9t7d3DnOUmgxJa2ur758rh8NBCsnJyRFPLiVJWrVqVVtbm7z5uFyu +oKCgLVu2yBvO1dbWxsfH88c68+bN++KLL2SEKHI4lDpRqSSv1+vntUl/f7/T6dRoNGazWa1Wk69t +/m3cbnd7e7skSQsWLBBnrQxXr15taWmJiIigXs3ORo5Sk/n7jY6O8rfRkpKStFrtXE+HXbt27fz5 +85IkLVy4MDAwUF6IIodDqROVhFA4AAA4/H8cAECGwgEAZCgcAECGwgEAZCgcAECGwgEAZCgcAED2 +B0ILempS29CcAAAAAElFTkSuQmCC +" + height="40.830791" + width="183.73856" /> + <image + y="615.08289" + x="317.29758" + id="image3634" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAABQCAIAAAC72Xj2AAAAA3NCSVQICAjb4U/gAAAM20lEQVR4 +nO3bfUxTVx8H8HOxUCrl/U1kCCVhoBjBYRVfsFv8o1NhbAUciszNTWWIL5mLLJKRKclYBqKJY5kv +6DKMM87tH4hsOFdYjFE3ELMJWORFBoGBgKWAYCl9/jjPc9LBHuy5LY/uyffz173n3PO7p7e3X+69 +LYLZbCYAADwcnvYEAOCfB8EBANwQHADADcEBANwQHADADcEBANwQHADAbUaC4+zZs4IgCIIglUpZ +4yuvvEIb09PTpw6Jj4+nvVu2bJnau27dOtq7atUquiCXy1nv2rVraWNcXBzrFf4jJiaGLrzzzjt0 +e71ez3orKysn7evhw4es94UXXqALq1evpgteXl5syzVr1tDGjIwM2tLX18fGRkdH04XMzMxpjlVx +cTHdzM/P7wmH9T/Yy9y9ezdt6erqYvu9evXqpO07OztZ77Vr16apHBsbSzfbt28fbWlvb2djb9y4 +QRsLCwtpS3BwMBurVCpp4/79+6dWXrJkCe3Nzs6eZgL5+fmsMttvREQEXThw4ADdTKfTsd7bt29P +KnL37l3W+/zzz9OFF198kVWbut+DBw/S3gULFrDGyMjISWMjIyOnjs3NzaW9YWFhbL+NjY2098MP +P5w0E0EQdDod7c3JyaEt4eHhrLepqWnSLmpra1lvc3PzpN6amhrW29LSMs3hDQkJoZsVFBTQlps3 +b7Kx9+/fn2bsJLjiAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4Ibg +AABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABu +CA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A +4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4IbgAABuCA4A4Ibg +AABukqc9gX979dVXw8LCCCFLly6d2vvaa6+Fh4cTQnx8fJRKJSFEKpVa9kZERNDeJUuWEEIcHR2N +RiPt9fDwWL16NSEkNjaWtkil0r1799Ll4ODgSftydnZmvR4eHiqVilaOiYkhhLi4uLAtk5OTFy1a +RAhZuXIlbZHJZJZjX3rpJULIqlWrpnnh0dHRdIirq+s0m1l6/fXX6cukr4sQIpfL2X4DAwMnbW/Z +O3fu3Gkqb9y4cfny5YQQ+qq5bNq0ib7SuLi4qb1paWm0/W97maVLl9Kpuri4DA8P00ZXV1eDwUAs +jqSnpyd7Rb6+vpOKeHl5sV65XD40NEQ3W7x4MSHE399/6n6XL19Oh8yZM4c1btmypaury3JsQEDA +1LErVqygY9m+6Bym6fX09KQLK1euZO8+fY2WvYy/v7/lecXVO1PMM6C0tJQWd3JyYo0JCQm0cfPm +zTOxU5gJ9+/fZ6fK9evXaWNBQQFtmTdv3tOdHnBhfyY//fRT2nLjxg32/ra1tVlfytpblcbGxqys +rNjYWC8vr/j4eBvT6r8pKipasGCBIAiCILi6umZnZ4+NjfEWKSkpCQwMpEUkEklycjL9uyFOb29v +SEiIh4dHa2uriOHnzp3z+KuTJ0+KqGMwGLZv3z579mxBEGbNmvXyyy/zVli7dq3HFNeuXRMxGS5m +szk3N9fNzY2+I0ql8tdff+UtYjKZPvjgAxcXF0EQpFJpRkYGu6LkVVFRERQURA9jSkoK+ztvPXt9 +Fuxyttvl8Ipg7a3KnTt36urqYmNj9Xo9u+Kyu8rKyrS0NLVa7ebmdunSpffff39oaKi4uJiriI+P +T15eXnR0tJubW21tbVZWVmpqanV1tbgp7dy508HBQa/Xm0wmEcMfP348MjJy4cIF1hIVFcVbZGJi +IjEx8c6dO8ePH1cqlQMDA9evX+ctcuDAgb6+PrZaVFRUX19Pb3lm1IkTJ/Ly8o4dO7Zx48bu7u5t +27bFx8e3trbKZDLrixw9evTw4cMnTpxISEioqanZvHmzTCY7cuQI72R0Op1Go3nrrbcOHjzY0tKi +0Wh27Nhx7tw5riL2+izY5Wy3y+EVg/dqR61Wq1Sq6bcRfatiMpksV9PT0728vHhnOEl+fr4gCMPD +wyLGfvfdd0FBQadPnyaENDU1iahw5swZqVQqYqCls2fPOjg4/PbbbzbWYUZGRtzd3Xfv3v3ELW2/ +VUlJSYmKimKrlZWVhJCbN29yTXjevHlpaWlstaCgwMnJ6eHDh1xFzGZzZmZmQECA0Wikq6dOnRIE +ob29nbcOZc1nYRp2Odu5Du9TuFX533Bw+Mt83N3dJ7WI0NnZ6ePjIyKABwYGMjMzP//8c+sfW/43 +ra2tv/zyy4MHD8QNP3/+/IoVKxYuXNjQ0HD37l1x1z6Wvv32W71e//bbb9tYxxqBgYF9fX3j4+N0 +tbu728HBwfIZpDXa29sXLlzIViMjIx8/fnz16lXeyWi12jVr1kgk/77QVqvVZrO5qqqKt45d2OVs +t8vhFeFZ+VZlqgcPHpw/f16j0YgbfvTo0UePHtXV1VVXV3/11VeCIPBW2Lt3r0qlio+Pv3jxorg5 +UGNjY6GhoYQQQRCSkpJOnjzJ++j79u3by5YtUyqVt27dmpiY8PX1PXXqFLuCE6GkpCQmJoZ+JTTT +srOzq6qq1q9fr9Foenp6iouLP/7446CgIK4i3t7ef/zxB1vt6OgghDQ3N/NOprW1NSkpia0GBgZK +JBJxT6/sS/TZbpfDK8KMBEdYWNi2bdsIIY6OjqxRrVbTIGRfi05jbGwsOTlZLpd/8skn4uZQVlY2 +ODio0+kWLVo09Ru7J6qoqCgvL29oaBC3dyY6Ovry5cuLFy8eHx8vKyvbs2dPenp6WVkZV5HBwcGL +Fy/u3Lnz559/NhqN27dvT01Nra+vn/pdsjVaWlqqq6utvJeWy+X0rSSE+Pn50YWoqCja6O3t/cQK +Pj4+iYmJhYWFzc3NAwMDCoWCfYtsvaSkpNLS0q1bt8bExHR0dBQWFhJCRkZGuIqYzebR0dHZs2ez +FkEQZDIZbx27s+Vs5zq8mzZtope97EGbn58fe3/5rqx576lsvK+zhtFoTExMDAgI0Ol0NpYaGhrS +aDSenp4DAwPWjxocHAwKCjpz5gxd/eabb4jYZxyT5OXliTjm/v7+bm5uo6OjdLWvr08QhCNHjoib +Q05OjrOzM9cBscWuXbu8vb1///13s9k8Pj6+b98+Z2fne/fucRXp7+9ft24dIcTf318ikezZs4cQ +8tlnn/FORiqV5ubmWrY4Ojp+9NFHvHUou3wWbDzb7XJ4RXjmgsNoNCYnJ/v6+tbX19ulYE1NDSHk +0qVL1g+5fPkyTWUqJCSEEDJ//vxdu3bZOJny8nIRwbFs2bLIyEjLFi8vr/fee0/EBEwm03PPPWf5 +oHGm+fj4ZGVlsVWDwSAIwuHDh0WUamlp+fHHH9va2ugjPa1Wy1shLCzszTffZKv0e/rTp0+LmIzZ +Hp8F2892Ox5eLs/WMw6TyZSWlqbVan/66af58+fbpWZvby/56y9NnygiIuLYsWNsta6urqSkZMOG +DfRHq7aora0VMUqlUn3xxRdjY2P0VfT19Q0MDNA44/XDDz90dHRs3bpVxFhxnJ2dR0dH2Sq9bnJ2 +dhZRSqFQKBQKQkh+fn5AQMD0P8n9W3FxcVeuXJmYmKCPIa9cuUKe9GPWmWOXs92Oh5ePlQEzMjKi +1Wq1Wq1SqYyKiqLL4r7jnMYbb7whCEJRUZHWAm+R3Nzcqqqq7u7unp6e8vLy0NDQkJAQdp0vgi23 +KocOHaqurv7zzz87OzuPHz8uk8kSEhJ4i7S1tclksoyMDIPB0N/fn5KS4uHh0dXVJWI+SUlJCoVi +YmJCxFhxduzYIZPJysrKxsfHe3t7N2zY4OTk1NjYyFWkrq6usrKyt7dXp9Pt379fEISvv/5axGRu +3bo1a9asnJwco9F479690NDQ9evX8xax12fBLme7XQ6vCNYGR1NT09TQaWhosO9s/vb/CHiLaDQa +9n2bIAiJiYk23vLZEhxqtZq9EIlE8u677+r1ehF1Kioq5syZQ78bmjt37vfffy+iSG9vr6Oj46FD +h0SMFU2v16emptJfatLJX7hwgbdIeXk5u2b09fX98ssvRc+ntLTUzc2NniEqlaqnp4e3gr0+C3Y5 +2+1yeEUQzGYz1xXKP8Lw8DD95VJwcLDlv6U9Ff39/R0dHVKpVKFQODk5ia4zPj7e2NgoCEJERAQ9 +S/5BDAZDW1ubq6trUFCQuMmPjIy0tLQIghAeHs7+MIjz6NEjnU7n7u4u7nbvGWT74eX1/xkcADCj +nq1fjgLAPwKCAwC4ITgAgBuCAwC4ITgAgBuCAwC4ITgAgNu/AAuHr5qD38PCAAAAAElFTkSuQmCC + +" + height="40.830791" + width="183.73856" /> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="295.97495" + y="121.04993" + id="text3637" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3639" + x="295.97495" + y="121.04993" + style="font-size:20px">Oignons 4Kg</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3641" + y="186.69418" + x="295.97495" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="186.69418" + x="295.97495" + id="tspan3643" + sodipodi:role="line">Oignons</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="295.97495" + y="249.39851" + id="text3645" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3647" + x="295.97495" + y="249.39851" + style="font-size:20px">Bob Soap (Client)</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3649" + y="316.17456" + x="295.97495" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="316.17456" + x="295.97495" + id="tspan3651" + sodipodi:role="line">Joe Bloggs (Client)</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="295.97495" + y="376.43588" + id="text3653" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3655" + x="295.97495" + y="376.43588" + style="font-size:20px">J.Doe (Cashier)</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3657" + y="441.58325" + x="295.97495" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="441.58325" + x="295.97495" + id="tspan3659" + sodipodi:role="line">J.Smith (Cashier)</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="295.97495" + y="511.61667" + id="text3661" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3663" + x="295.97495" + y="511.61667" + style="font-size:20px">Demo User (Cashier)</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3665" + y="575.94971" + x="295.97495" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="575.94971" + x="295.97495" + id="tspan3667" + sodipodi:role="line">Admin (Cashier)</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="295.97495" + y="641.09705" + id="text3669" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3671" + x="295.97495" + y="641.09705" + style="font-size:20px">Unknown</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3673" + y="121.04993" + x="735.90662" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="121.04993" + x="735.90662" + id="tspan3675" + sodipodi:role="line">Coca Cola Zero 1.5l</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="735.90662" + y="185.54253" + id="text3677" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3679" + x="735.90662" + y="185.54253" + style="font-size:20px">Coca Cola 33cl</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3681" + y="252.33842" + x="735.90662" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="252.33842" + x="735.90662" + id="tspan3683" + sodipodi:role="line">Peaches 1.56€</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="735.90662" + y="315.67938" + id="text3685" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3687" + x="735.90662" + y="315.67938" + style="font-size:20px">Peaches 0.89€</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3689" + y="383.62695" + x="735.90662" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="383.62695" + x="735.90662" + id="tspan3691" + sodipodi:role="line">Peaches</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="735.90662" + y="448.11954" + id="text3693" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3695" + x="735.90662" + y="448.11954" + style="font-size:20px">Oranges 1.5Kg</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3697" + y="510.88464" + x="735.90662" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="510.88464" + x="735.90662" + id="tspan3699" + sodipodi:role="line">Oranges 0.5Kg</tspan></text> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="735.90662" + y="577.10474" + id="text3701" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3703" + x="735.90662" + y="577.10474" + style="font-size:20px">Oranges</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3705" + y="642.17316" + x="735.90662" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + style="font-size:20px" + y="642.17316" + x="735.90662" + id="tspan3707" + sodipodi:role="line">Oignons 1.567Kg</tspan></text> + </g> +</svg> diff --git a/addons/point_of_sale/doc/barcode_test_sheet_new.svg b/addons/point_of_sale/doc/barcode_test_sheet_new.svg new file mode 100644 index 00000000000..57dce3dc013 --- /dev/null +++ b/addons/point_of_sale/doc/barcode_test_sheet_new.svg @@ -0,0 +1,506 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + version="1.1" + inkscape:version="0.48.3.1 r9886" + sodipodi:docname="barcode_test_sheet.svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="0.86706515" + inkscape:cx="381.55817" + inkscape:cy="597.57819" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1301" + inkscape:window-height="744" + inkscape:window-x="1985" + inkscape:window-y="24" + inkscape:window-maximized="1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g4158" + transform="matrix(0.92675002,0,0,0.92675002,27.597551,38.360312)"> + <text + sodipodi:linespacing="125%" + id="text2985" + y="72.12545" + x="140.86679" + style="font-size:46.51613998px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="72.12545" + x="140.86679" + id="tspan2987" + sodipodi:role="line">BARCODE TEST SHEET</tspan></text> + <g + transform="translate(0,-5.3405762e-5)" + id="g3347"> + <image + y="124.14642" + x="388.17426" + id="image3083" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADqUlEQVR4 nO3a226jMABFUYjy/7/MPCChDBfHARM4zVpP1dQY4u66JEw/DEO3S9/3XdeNh79+vRwz2hr5OmZr 5JH5t0YuX0X51W0dW3PNNa9xOWf5au8wsrxu9Ud95HHkYPg+yRJGsoSRLGEkSxjJEkayhJEsYSRL GMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJ EkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJG soSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKE kSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEs YSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEk SxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxh+mEY dh7Z913XjYe/fv3LrMlS8zWxyxJGsjuNGwbf91z911Z/1GY/18oJ689+cOTb7LZmPtJr/ZrcfOTu 1SucseaQlV221f6xnKdm5vqznzHy1Nn6vq9fk5SRrYzzry7RzHyXbd7r9HszXVP9b3bN/EdGlq/k 0y250uu0W2tSv3oXjvxo9d4ahmE6b/mP58ou2/BNbuUr3Hf2M0aOzthRVn8M5QurX71rR87sXr1h GGa/z6tT/Zds2y12+TpfP+nYOqp+/rYjZ4esXvzk0zkLlmtSv3rXjlx1/F3QMtzZgMfse1d9jvi1 t1zND2HScPUK2+2j+cl2uEmvl/Bh2Zat+4TH64gLruvzs599C3vSOqz+Yf1LvZ60estwn93ehdt9 ez5zk1vYJmrW5C9lWqNVJ5OnW4IjR31kudFWvqe5v/NWb/lE47n6jbOvo3xZhbOfMfLL7n97fRNb j9/WH9j+mgtTtsUW5hzNN6PVMx2/iMLO93ba798tfPp6d398tjyqfqFu+I9vv7XD1uY6Ofd/ci0/ o/5ZhR/2lvrVu3ZkK7PPX7ee2px1YzA9Mn77S/Nrlj/+1UdNlat37ciGCncCMyfuslsP/e7mazey y22j8Pi3fvWuHdlq9cYZap6H/wMqFm5yx9XfMwAAAABJRU5ErkJggg== " + height="107.96206" + width="163.36363" /> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.07903957;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3086" + width="417.54495" + height="126.4052" + x="141.08452" + y="114.51707" + rx="2.0839903" + ry="2.0839903" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="201.46712" + y="147.73848" + id="text3856" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3858" + x="201.46712" + y="147.73848" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">CASHIER</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3860" + y="182.10147" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="182.10147" + x="154.5717" + id="tspan3862" + sodipodi:role="line">Prefix: 40</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="200.85837" + id="text3149" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3151" + x="154.5717" + y="200.85837" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 4447190000</tspan></text> + </g> + <g + transform="translate(0,0.97855377)" + id="g3335"> + <g + id="g3173" + transform="translate(0,-3.2620699)"> + <text + sodipodi:linespacing="125%" + id="text3153" + y="341.12738" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="341.12738" + x="154.5717" + id="tspan3155" + sodipodi:role="line">Prefix: 42</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="359.88428" + id="text3157" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3159" + x="154.5717" + y="359.88428" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 1182180000</tspan></text> + </g> + <g + id="g3954" + transform="translate(0,-18.756902)"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.07903957;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3876" + width="417.54495" + height="126.4052" + x="141.08452" + y="284.96024" + rx="2.0839903" + ry="2.0839903" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="209.6223" + y="318.18164" + id="text3878" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3880" + x="209.6223" + y="318.18164" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">CLIENT</tspan></text> + <image + width="162.31204" + height="107.26709" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADyUlEQVR4 nO3a3Y6qShSFUTC+/yvXuSAxbCgQsPiZp8e46mgJq/ETxe6+lNId0vd913XDw8c/z+8d3zIYP2p8 y9LKLbcvbXN8y5Zt/jLn0jHZcnzm29z+m961cmn+vY/a5fXLg+F6kiWMZAkjWcJIljCSJYxkCSNZ wkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC 9KWUg4/s+67rhoePf/7LHJO55sfEWZYwj0t2eCG2XXmGe/f+l72rt7Z6U5s8r1832LbX+ZqlAc6b 85qpbln59SDs7afvN31MrZxlm5w/+r6fb6d644H9Huu1euOpcx6eqnrj0n7vXdnKsP31Iz+YnmWb TzZ+3Wx/wqoOrJzvfeml3HDO36ear1wa/saV62fovafYUspnv+tv8pWzbMPPA5NNjS8bL1Dd+9gt c36dqnrX+pNy78qJw8etlDJ53VY39U+ybZ+kjb9nGWm1cpfmc/5o6RwzfyHdu3LX8NvNw50seE3u a/J8XPC8bjH5bavXPdfP+XWqXG0TGm92fJTezXf2BJ8PRtsvzy/wzKkea3Je/yT6mqw41e0vjI27 vnjO/0evJx20+eeEd3f0vWnXx/OlC52TVA/f8P6yPsCPc64fk8NTRTt8GbfkffYZ5eJYu9ULiJU+ zp7z2FQpzqtocj4tpbyrdzSZY7zNJz8fKXP+NfNYhx/qf7BtuL+HR5Ay55OdcYpdOY+8Ss1n6Y9z pHTwqDmXvgGdl3HvypNMvtKa7/GU/+S695uB7Qf9yjkPpDD/hn/JvStbmcdaPSxnfTDoVn/PK783 +GXZBdcTS/utfoO7dPV218qGtl9RPO7/ZZuovkBv/5vcrqmqK5c2e+PKVu9Uwxa2PEf/AXnknj+O sxSLAAAAAElFTkSuQmCC " + id="image3951" + x="388.17426" + y="294.58957" /> + </g> + </g> + <g + transform="translate(0,0.3261795)" + id="g3322"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.07903957;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3964" + width="417.54495" + height="126.4052" + x="141.08452" + y="419.52063" + rx="2.0839903" + ry="2.0839903" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="209.6223" + y="452.74203" + id="text3966" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3968" + x="209.6223" + y="452.74203" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">WEIGHT</tspan></text> + <image + width="162.12962" + height="107.14654" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAAERElEQVR4 nO3a0ZKaQBRFUbX8/182D1QZInRzadDxTNZ6mjgNNrhBYHJ9PB6XIdfr9XK5TIvPf57/drJ8/ayR rVdaG9Wfc+Vd+vPc+3N/hv3XK68st2i5Xa09XNnS+sjKthfdjiwMnydZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiW MJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCS Jcz18XgMLnm9Xi6XafH5z/8z+2Tp9H3iLEuYDyU7HV7njuT/dH/+9NLKid9o5/Zan+fYFnW+vFrT 27uv+hPb3AnLt1su0prSO/beWeVcr6XL1Ns0dLnNqy+OzeOskfV5Dm9RZ8BZe2N1YgfXWXlx11u/ Y2TftFTlM7rP/zFv/B378eDIp+I8V89enUO5MpMjXz7P9S/nP59V/3zWOiX317k6/9aw5TqPj9z0 eDyea+vfpd1Wt/ny7y3eN6jP88jX9wdu8Jfzn2wuWD84W1cOm8Navz1rZN/LfmidcW/H36nz9pUP oz7yUs6uuLa5dx+cB5/vvOmRWeuAb52ex0bunVL/W/Se8uDw+Dw3r1MHTnVjs5qvpP6m9QuG7/lu HNa5Trg3F/oVKrfSR05ge5dt3awMH5DPj7b+0KA/n+/xcrZ+7qhmsm/6JjpdfZ6dMZuLd+5yBuxa ydgHsbxsnS4N407Gy3BXkm3d6KyuqzLyTSrzXH5Cex+Cdt5ifoabBlT2SSWmutZGtVb4+UxP7+Sf v34979EGbl8+aWye9RuIuoMnv039Ge66AVruqy//lCcvzw3+XhjsvSH4Ke+YZ+dR/DfvijFBW9S6 071fylcCP644z19T2wc25GsvZzvnpnvrF1/rxHl2rvZWL3lbTxuK77V6ifmZaPpH+8vlZmeeYyPH ptqa8C3lnPTjj5OW6xz7dlr9Q93YrFoP7Vfz6s+kOM+DI/uWl63r095c0VnP8A8+M9/cF8XHN8Xn WfUT6nCvm2uo7Lf6lu6af32eu7aoo36X8jv/i/fqAXrwBrm1zr0rKa6heJzXt3TXE4P6PI/vk/lS lc/oD6RX6TSeNJuDAAAAAElFTkSuQmCC " + id="image4065" + x="387.35876" + y="429.14993" /> + <g + transform="translate(0,140.26901)" + id="g3179"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="341.12738" + id="text3181" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3183" + x="154.5717" + y="341.12738" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 21</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3185" + y="359.88428" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="359.88428" + x="154.5717" + id="tspan3187" + sodipodi:role="line">ID: 12345</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="379.4567" + id="text3189" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3191" + x="154.5717" + y="379.4567" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Value: 67.89Kg</tspan></text> + </g> + </g> + <g + transform="translate(0,-1.9572678)" + id="g3308"> + <rect + ry="2.0839903" + rx="2.0839903" + y="574.46893" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect4081" + style="fill:none;stroke:#c3c3c3;stroke-width:1.07903957;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <g + id="g3296"> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="195.7585" + y="607.69037" + id="text4083" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4085" + x="195.7585" + y="607.69037" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">DISCOUNT</tspan></text> + <image + y="584.09827" + x="385.72772" + id="image4202" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADsElEQVR4 nO3aXXOiMACGUej4//8ye+EMZYHECBF96zlXHTd8iE8jYTtO0zQcMo7jMAz3zUs/b8ffLUcuXymN bHn92ZHtR3l2ZOnnpfazOvauS3toP3rLyPr5tGx1wM+ZjeF6kiWMZAkjWcJIljCSJYxkCSNZwkiW MJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCS JYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWM ZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJ I1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZ wkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCjNM0 HdxyHIdhuG++/PmbuSZb3a+JWZYwH5fs/RfxL42kr9vuq6/4UmvZZ0qFZ3pdbVu5II0jSyezO777 0XdP4Fg549h0m7ozy75i/mjZZ0qFHXst7W0cx92RjZufPPrJkc+e1XKT3fe4sp5lr+81pb/zV2be wzyXzJ9TaXZZvl45gZbJqf3oZ0ZWBtdN0zTvrf6FvDPLvmKRa+E8W16K+nf36l+Xi+7XHf3kyIeD 6/tZpb/7Zv+bZd9yS9A4kQSN3FWaOe6zy3ZOumYhsT36s+fZ3eo3c3vE32TfteRi5cDlal8qvcKq qi4TX+U+4bb7ahd6fZfLrvwcVq+HBts9bMO9rUb0pdeOtiFWVj/v1fFz34Z7G46+yfrt+SdcuOu1 L1meUl+Qbc/h2Jr98IltHyMsD939mvy4Jfhk86p5tZquu+bKVxZqQ785a/Xc4PfGoPJA+OTfzfTd 5/dYfU5vPJN3Ka0p9//Dlvcq3Ql8j8pv7K3yNPvMM+Hu+0xXeq5ZuSwPr1Vp2931e+PRD5xnXw8f 2H3cX3L9ecuPpMu902on9Rn64dHbR5buWQ/Hvb1t3d2JG4PrlJ5itvzJ1e74px6Lth/9qfOsn2q7 9nt3s+ylSuvrMzts32f3kaWjH3hT901atv0Hm+wpnHOLKX0AAAAASUVORK5CYII= " + height="108.34499" + width="163.94308" + inkscape:transform-center-x="-24.4145" + inkscape:transform-center-y="6.3942733" /> + <g + transform="translate(0,296.03285)" + id="g3210"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="341.12738" + id="text3212" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3214" + x="154.5717" + y="341.12738" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 44</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3216" + y="359.88428" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="359.88428" + x="154.5717" + id="tspan3218" + sodipodi:role="line">ID: 11111</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="379.4567" + id="text3220" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3222" + x="154.5717" + y="379.4567" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Value: 25%</tspan></text> + </g> + </g> + </g> + <g + transform="translate(0,-0.97866058)" + id="g3283"> + <rect + style="fill:none;stroke:#c3c3c3;stroke-width:1.07903957;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4115" + width="417.54495" + height="126.4052" + x="141.08452" + y="726.15521" + rx="2.0839903" + ry="2.0839903" /> + <text + xml:space="preserve" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="212.88437" + y="759.37659" + id="text4117" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan4119" + x="212.88437" + y="759.37659" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">PRICE</tspan></text> + <image + width="163.36363" + height="107.96206" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAAD70lEQVR4 nO3Z3XKbOhiGUezJ/d8yPfBsbwaB+Phz/aZrHaWukDB+goE8xnEcDnk8HsMwvDaf/tz+7/SVl3bR drbEkWvHZG3O/gytyvxrq6yt265emWfvyMq7K3qe2Rg+T7KEkSxhJEsYyRJGsoSRLGEkSxjJEkay hJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSR LGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxh JEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRL GMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJ EkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJG soSRLGEkSxjJEkayhJEsYSRLGMkSRrKEkSxhJEsYyRJGsoSRLGEkSxjJEkayhJEsYSRLmMc4jge3 fDyGYXhtPv35X+aYtC4/Js6yhJHsX/M65bDXz/un2RG85ButPufvG9lX6fXYWp0v37VFK4M/c0wq 2z4XV118Ze/yi3PWX6zP+W0jN21uVT9Q9Zl37Wr9nV57TCrv8We6xrvx9/bnz7XTGTp70w5bWz1l ZGvvZzmbdnO5yvyVXa33cGE54zi+Z+vfpT2n2yz+fED7Tqb/nB7ZxZ3rfE99/8jzdn19HxhTVO/h qnLGcZydERYPxXOt6DavA3twctv6aeP7Rw7/fSSzD6YzrDLn21U3c/UebiqnDXc24Ge4gYeRd9i8 Tt31pf/ytZ9U5zrhlmTPq/+Opow8pp2/jaze69r83xnu7Gz93tWPPpdtD9Dil8hiBykj79O5Wths bnp3cezC429prxOOn2V3XXSv3ZC1AzZ988gLb2HbSRbPiPXL6MUXL3w0VFn6klVuP8u+7/vWfrPb 19NH3qR+A7R3zm82e24wjuON17KzlfqD68cuZeTHrP3hY/jKva1bu1O8K9nNK4Hi5r9mZN0vqO28 zvnu53VBs/aHjZMH7uQ17uLzuS8f+UmL63YuedeeNszmLPZwUzmbj+Gei0NPnjzqO9056KEjr9JO fv4ksvbEY/Pd9d/pVeW0l63LO7b4+Oa9zeG1+wMWT2Cbq6eMrOj31zmAxS+uk/t/x294X/3O5/+z +oV/F9mVbLvJxh6HjOyrnDKPfSK7fhk6c94xsq/4rO0Pc0/7XuEpWE8AAAAASUVORK5CYII= " + id="image4264" + x="386.54324" + y="734.96906" /> + <g + transform="translate(0,442.82599)" + id="g3224"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="341.12738" + id="text3226" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3228" + x="154.5717" + y="341.12738" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Prefix: 02</tspan></text> + <text + sodipodi:linespacing="125%" + id="text3230" + y="359.88428" + x="154.5717" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="359.88428" + x="154.5717" + id="tspan3232" + sodipodi:role="line">ID: 99999</tspan></text> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="379.4567" + id="text3234" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3236" + x="154.5717" + y="379.4567" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">Value: 134.50€</tspan></text> + </g> + </g> + <g + id="g3269"> + <g + id="g3061" + transform="translate(0,284.6156)"> + <g + id="g3063" + transform="translate(0,154.94832)"> + <rect + ry="2.0839903" + rx="2.0839903" + y="438.27753" + x="141.08452" + height="126.4052" + width="417.54495" + id="rect3065" + style="fill:none;stroke:#c3c3c3;stroke-width:1.07903957;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3067" + y="471.49893" + x="216.61778" + style="font-size:27.53050041px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="471.49893" + x="216.61778" + sodipodi:role="line" + id="tspan3083">UNIT</tspan></text> + <g + transform="translate(0,156.57936)" + id="g3071" /> + </g> + </g> + <image + y="887.47076" + x="386.54324" + id="image3146" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAACYCAIAAAB/IAJdAAAAA3NCSVQICAjb4U/gAAADz0lEQVR4 nO3Z0ZKaMACGUdnx/V+ZXjBjGWKyEQjyt+fcdIsBY/ZTgZ3meX7sMk3T4/FYdq/9XI5frB9db18/ Wh6nfJZyr/Yz9s+t/Yp65tw/22+N3Pe6asevhdQ/stPPkZ3hepIljGQJI1nCSJYwkiWMZAkjWcJI ljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYw kiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIl jGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxk CSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkj WcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nC SJYwkiWMZAkjWcJIljCSJYxkCSNZwkiWMJIljGQJI1nCSJYwkiWMZAkjWcJIljCSJYxkCSNZwkzz PO/cc5oej8ey+/rn/5k1KZ2+Jj5lCSNZwjyXf5ZP7NKJ32v9XwrtkZupNg743ZH3nNWgV3p8WZaD 9Oz4Uz7fCP1P0Rg5TVP5aG38d0fWfHFW/av36TofX5bXLm+PtvF8/TTuQuGUXl/W83y9zs3kX8d5 bb9yZM0dZtWzev0jy2f/9bA18zy/jtb+mr3oXLZ/9u3zgc2j7cOuH71+5K1m1b96B9d5+e+isUvt OJv0336EDU/23I/Y0vruyfo45ZJdM7LmnrM6MnLQXbwy3M2AZ+2xU6Zy1iUXN7eO55RfYuM84Vnb 53hD1/R6wbXjP+z4d2Dt2ut4uJvP9ddhf9Zn0LvPQtrPesrIt19heu3Uv3r71nlEPOsjr2fyrF0t /nrd1z7lH3cKe+dMj1+cjTbi91Jefi1XTsv209ekevl1w1OC8k084m39r+pfvY/WefT6b+4bzPNc PZc95clqGzevs3/k2y30O/FUbbTa/YCByV7jzucJ9zf6FuRujVsQb/56sdnnrHfbwbOF2nwag7+1 ccfrGr2xf/XOWudye6dfb7b+vB13eq/HvZ1J+61f3ve+cuStZtW/emet845yytPW95NZ37PdOLfX 49dkH83zst/cR6v0xVn1r96gdW7r/2PE33tYI/76Vc7p+G2ED15b9ysaMfKes9q3emetc1vjjura Hwkp3Xa7HcbMAAAAAElFTkSuQmCC " + height="108.34499" + width="163.94308" /> + <g + id="g3255" + transform="translate(0,598.58983)"> + <text + xml:space="preserve" + style="font-size:17.41555405px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="154.5717" + y="351.81107" + id="text3261" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3263" + x="154.5717" + y="351.81107" + style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">ID: 5449000000996</tspan></text> + </g> + </g> + <g + transform="matrix(0,-1,1,0,261.82237,1622.2884)" + id="g4150"> + <text + xml:space="preserve" + style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + x="618.97778" + y="320.0275" + id="text3357" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3359" + x="618.97778" + y="320.0275">This is a test sheet intended to help you test the codebar aquisition in OpenERP's Point of Sale module. </tspan><tspan + sodipodi:role="line" + x="618.97778" + y="330.0275" + id="tspan3363">The codes provided in this list are randomly chosen and are encoded in the EAN13 format. Their codes</tspan><tspan + sodipodi:role="line" + x="618.97778" + y="340.0275" + id="tspan3367">and prefixes are not intended to match any specified standard. </tspan></text> + <text + sodipodi:linespacing="125%" + id="text3369" + y="349.54001" + x="618.99207" + style="font-size:6.53564215px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#b3b3b3;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans" + xml:space="preserve"><tspan + id="tspan3375" + y="349.54001" + x="618.99207" + sodipodi:role="line" + style="fill:#b3b3b3;fill-opacity:1">This document is licensed by OpenERP S.A. under the Creative Commons CC BY 3.0 license htttp://www.creativecommons.org</tspan></text> + </g> + </g> + </g> +</svg> diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py index 690d371e9db..f4d32985688 100644 --- a/addons/point_of_sale/point_of_sale.py +++ b/addons/point_of_sale/point_of_sale.py @@ -22,6 +22,7 @@ import pdb import openerp import addons +import openerp.addons.product.product import time from datetime import datetime @@ -59,16 +60,9 @@ class pos_config(osv.osv): help="Accounting journal used to post sales entries."), 'iface_self_checkout' : fields.boolean('Self Checkout Mode', help="Check this if this point of sale should open by default in a self checkout mode. If unchecked, OpenERP uses the normal cashier mode by default."), - 'iface_websql' : fields.boolean('WebSQL (Faster but Chrome Only)', - help="If have more than 200 products, it's highly suggested to use WebSQL "\ - "to store the data in the browser, instead of localStore mechanism. "\ - "It's more efficient but works on the Chrome browser only." - ), - 'iface_led' : fields.boolean('Help Notification'), 'iface_cashdrawer' : fields.boolean('Cashdrawer Interface'), 'iface_payment_terminal' : fields.boolean('Payment Terminal Interface'), 'iface_electronic_scale' : fields.boolean('Electronic Scale Interface'), - 'iface_barscan' : fields.boolean('BarScan Interface'), 'iface_vkeyboard' : fields.boolean('Virtual KeyBoard Interface'), 'iface_print_via_proxy' : fields.boolean('Print via Proxy'), @@ -77,7 +71,7 @@ class pos_config(osv.osv): help="This sequence is automatically created by OpenERP but you can change it "\ "to customize the reference numbers of your orders."), 'session_ids': fields.one2many('pos.session', 'config_id', 'Sessions'), - 'group_by' : fields.boolean('Group By', help="Check this if you want to group the Journal Items by Product while closing a Session"), + 'group_by' : fields.boolean('Group Journal Items', help="Check this if you want to group the Journal Items by Product while closing a Session"), } def name_get(self, cr, uid, ids, context=None): @@ -93,7 +87,7 @@ class pos_config(osv.osv): result.append((record.id, record.name+' ('+_('not used')+')')) continue session = record.session_ids[0] - result.append((record.id, record.name + ' ('+session.user_id.name+', '+states[session.state]+')')) + result.append((record.id, record.name + ' ('+session.user_id.name+')')) #, '+states[session.state]+')')) return result @@ -143,8 +137,6 @@ class pos_config(osv.osv): obj.sequence_id.unlink() return super(pos_config, self).unlink(cr, uid, ids, context=context) -pos_config() - class pos_session(osv.osv): _name = 'pos.session' _order = 'id desc' @@ -459,8 +451,6 @@ class pos_session(osv.osv): 'context' : context, } -pos_session() - class pos_order(osv.osv): _name = "pos.order" _description = "Point of Sale" @@ -1079,8 +1069,6 @@ class pos_order(osv.osv): self.create_account_move(cr, uid, ids, context=context) return True -pos_order() - class account_bank_statement(osv.osv): _inherit = 'account.bank.statement' _columns= { @@ -1179,8 +1167,6 @@ class pos_order_line(osv.osv): }) return super(pos_order_line, self).copy_data(cr, uid, id, default, context=context) -pos_order_line() - class pos_category(osv.osv): _name = 'pos.category' _description = "Point of Sale Category" @@ -1230,6 +1216,11 @@ class pos_category(osv.osv): 'parent_id': fields.many2one('pos.category','Parent Category', select=True), 'child_id': fields.one2many('pos.category', 'parent_id', string='Children Categories'), 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of product categories."), + + # NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail + # for at least one category, then we display a default image on the other, so that the buttons have consistent styling. + # In this case, the default image is set by the js code. + 'image': fields.binary("Image", help="This field holds the image used for the category. "\ "The image is base64 encoded, and PIL-supported. "\ @@ -1252,21 +1243,40 @@ class pos_category(osv.osv): "Use this field anywhere a small image is required."), } - def _get_default_image(self, cr, uid, context=None): - image_path = openerp.modules.get_module_resource('point_of_sale', 'images', 'default_category_photo.png') - return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64')) +import io, StringIO - _defaults = { - 'image': _get_default_image, +class ean_wizard(osv.osv_memory): + _name = 'pos.ean_wizard' + _columns = { + 'ean13_pattern': fields.char('Ean13 Pattern', size=32, required=True, translate=True), } - -pos_category() - -import io, StringIO + def sanitize_ean13(self, cr, uid, ids, context): + for r in self.browse(cr,uid,ids): + ean13 = openerp.addons.product.product.sanitize_ean13(r.ean13_pattern) + m = context.get('active_model') + m_id = context.get('active_id') + self.pool.get(m).write(cr,uid,[m_id],{'ean13':ean13}) + return { 'type' : 'ir.actions.act_window_close' } class product_product(osv.osv): _inherit = 'product.product' + + #def _get_small_image(self, cr, uid, ids, prop, unknow_none, context=None): + # result = {} + # for obj in self.browse(cr, uid, ids, context=context): + # if not obj.product_image: + # result[obj.id] = False + # continue + + # image_stream = io.BytesIO(obj.product_image.decode('base64')) + # img = Image.open(image_stream) + # img.thumbnail((120, 100), Image.ANTIALIAS) + # img_stream = StringIO.StringIO() + # img.save(img_stream, "JPEG") + # result[obj.id] = img_stream.getvalue().encode('base64') + # return result + _columns = { 'income_pdt': fields.boolean('Point of Sale Cash In', help="This is a product you can use to put cash into a statement for the point of sale backend."), 'expense_pdt': fields.boolean('Point of Sale Cash Out', help="This is a product you can use to take cash from a statement for the point of sale backend, exemple: money lost, transfer to bank, etc."), @@ -1278,7 +1288,16 @@ class product_product(osv.osv): 'to_weight' : False, } -product_product() - + def edit_ean(self, cr, uid, ids, context): + return { + 'name': "Edit Ean", + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'pos.ean_wizard', + 'target' : 'new', + 'view_id': False, + 'context':context, + } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/point_of_sale_demo.xml b/addons/point_of_sale/point_of_sale_demo.xml index 6836d0e7c4d..db8caaadf3b 100644 --- a/addons/point_of_sale/point_of_sale_demo.xml +++ b/addons/point_of_sale/point_of_sale_demo.xml @@ -1,12 +1,40 @@ <?xml version="1.0"?> <openerp> <data> + <record id="base.user_root" model="res.users"> + <field name="ean13">0410100000006</field> + </record> <record id="base.user_demo" model="res.users"> <field name="groups_id" eval="[(4,ref('group_pos_user'))]"/> + <field name="ean13">0410200000005</field> </record> - <record id="account.cash_journal" model="account.journal"> + <record id="account.cash_journal" model="account.journal"> <field eval="True" name="journal_user"/> </record> + <record id="base.user_jsmith" model="res.users"> + <field name="name">John Smith (Cashier)</field> + <field name="login">jsmith</field> + <field name="ean13">0410300000004</field> + <field name="groups_id" eval="[(4,ref('group_pos_manager'))]"/> + </record> + <record id="base.user_jdoe" model="res.users"> + <field name="name">John Doe (Cashier)</field> + <field name="login">jdoe</field> + <field name="ean13">0410400000003</field> + <field name="groups_id" eval="[(4,ref('group_pos_manager'))]"/> + </record> + <record id="base.user_jbloggs" model="res.users"> + <field name="name">Joe Bloggs (Client)</field> + <field name="login">jbloggs</field> + <field name="ean13">0420100000005</field> + <field name="groups_id" eval="[(4,ref('group_pos_user'))]"/> + </record> + <record id="base.user_bsoap" model="res.users"> + <field name="name">Bob Soap (Client)</field> + <field name="login">bsoap</field> + <field name="ean13">0420200000004</field> + <field name="groups_id" eval="[(4,ref('group_pos_user'))]"/> + </record> <!-- Resource: pos.category --> @@ -154,6 +182,7 @@ <field name="list_price">1.98</field> <field name="name">Boni Oranges</field> <field name="to_weight">True</field> + <field name="ean13">2100002000003</field> <field name="pos_categ_id" ref="oranges"/> <field name="uom_id" ref="product.product_uom_kgm" /> <field name="uom_po_id" ref="product.product_uom_kgm" /> @@ -248,6 +277,7 @@ <field name="list_price">5.10</field> <field name="name">Fishing</field> <field name="to_weight">True</field> + <field name="ean13">2300001000008</field> <field name="pos_categ_id" ref="rouges_noyau_fruits"/> <field name="uom_id" ref="product.product_uom_kgm" /> <field name="uom_po_id" ref="product.product_uom_kgm" /> @@ -316,6 +346,7 @@ <field name="list_price">1.28</field> <field name="name">Onions</field> <field name="to_weight">True</field> + <field name="ean13">2100001000004</field> <field name="pos_categ_id" ref="oignons_ail_echalotes"/> <field name="uom_id" ref="product.product_uom_kgm" /> <field name="uom_po_id" ref="product.product_uom_kgm" /> @@ -389,6 +420,7 @@ <record id="coca_regular_33cl" model="product.product"> <field name="list_price">0.51</field> <field name="name">Coca-Cola Regular 33cl</field> + <field name="ean13">5449000000996</field> <field name="pos_categ_id" ref="coke"/> <field name="image">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</field> </record> @@ -1022,3 +1054,4 @@ </data> </openerp> + diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 47a41260378..6487eebbe4f 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -55,10 +55,14 @@ </group> </form> </field> - <group class="oe_subtotal_footer"> + <group class="oe_subtotal_footer oe_right" colspan="2" name="order_total"> <field name="amount_tax"/> - <field name="amount_total"/> - <button name="button_dummy" string="Update" class="oe_link" states="draft"/> + <div class="oe_subtotal_footer_separator oe_inline"> + <label for="amount_total" /> + <button name="button_dummy" + states="draft" string="(update)" type="object" class="oe_edit_only oe_link"/> + </div> + <field name="amount_total" nolabel="1" class="oe_subtotal_footer_separator"/> </group> </page> <page string="Payments"> @@ -630,6 +634,9 @@ <field name="expense_pdt"/> </group> </group> + <field name="ean13" position="after"> + <button name="edit_ean" type="object" string="Edit" /> + </field> </field> </record> @@ -773,10 +780,10 @@ <sheet> <group> <field name="name"/> - <field name="shop_id" widget="selection" /> + <field name="shop_id" widget="selection" groups="stock.group_locations" /> <field name="journal_id" widget="selection" /> - <field name="sequence_id" readonly="1"/> - <field name="group_by" /> + <field name="sequence_id" readonly="1" groups="base.group_no_one" /> + <field name="group_by" groups="account.group_account_user" /> </group> <separator string="Available Payment Methods" colspan="4"/> <field name="journal_ids" colspan="4" nolabel="1"> @@ -791,14 +798,11 @@ <group string="Material Interfaces" > <group> <field name="iface_self_checkout" /> - <field name="iface_websql" /> - <field name="iface_led" /> <field name="iface_cashdrawer" /> <field name="iface_payment_terminal" /> </group> <group> <field name="iface_electronic_scale" /> - <field name="iface_barscan" /> <field name="iface_vkeyboard" /> <field name="iface_print_via_proxy" /> </group> @@ -877,7 +881,7 @@ class="oe_highlight"/> <button name="close" type="workflow" string="Validate Closing & Post Entries" states="closing_control" class="oe_highlight"/> - <button name="open_frontend_cb" type="object" string="Start Selling" states="opened"/> + <button name="open_frontend_cb" type="object" string="Continue Selling" states="opened"/> <div class="oe_right"> <field name="state" widget="statusbar" statusbar_visible="opening_control,opened,closing_control,closed" nolabel="1"/> </div> @@ -888,7 +892,7 @@ <button name="%(action_pos_box_out)d" string="Take Money Out" type="action" states="opened,closing_control"/> </div> <h1 class="oe_title"> - Point of Sale Session: + Session: <field name="name" attrs="{'invisible': [('name','=','/')]}" class="oe_inline"/> </h1> <field name="has_opening_control" invisible="1" /> @@ -1057,5 +1061,20 @@ parent="menu_point_of_sale" id="menu_pos_session_opening" sequence="0"/> + <record model="ir.ui.view" id="pos_ean13_generator"> + <field name="name">pos.ean_wizard</field> + <field name="model">pos.ean_wizard</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form string="Ean13 Generator" version="7.0"> + <field name="ean13_pattern"/> + <footer> + <button name="sanitize_ean13" type="object" string="Apply"/> + </footer> + </form> + </field> + </record> + + </data> </openerp> diff --git a/addons/point_of_sale/report/pos_sales_user.py b/addons/point_of_sale/report/pos_sales_user.py index e49528441b9..6ac2e1892c1 100644 --- a/addons/point_of_sale/report/pos_sales_user.py +++ b/addons/point_of_sale/report/pos_sales_user.py @@ -37,14 +37,14 @@ class pos_sales_user(report_sxw.rml_parse): dt1 = form['date_start'] + ' 00:00:00' dt2 = form['date_end'] + ' 23:59:59' data={} - self.cr.execute("select po.name as pos,po.date_order,ru.name as user,po.state,rc.name " \ - "from pos_order as po,res_users as ru,res_company as rc " \ + self.cr.execute("select po.name as pos,po.date_order,rp.name as user,po.state,rc.name " \ + "from pos_order as po,res_users as ru,res_company as rc, res_partner as rp " \ "where po.date_order >= %s and po.date_order <= %s " \ - "and po.company_id=rc.id and po.user_id=ru.id and po.user_id IN %s " \ + "and po.company_id=rc.id and po.user_id=ru.id and po.user_id IN %s and ru.partner_id = rp.id" \ ,(dt1,dt2,tuple(form['user_id']))) return self.cr.dictfetchall() report_sxw.report_sxw('report.pos.sales.user', 'pos.order', 'addons/point_of_sale/report/pos_sales_user.rml', parser=pos_sales_user,header='internal') -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/point_of_sale/res_users.py b/addons/point_of_sale/res_users.py index d64f05d1391..f1c613d5f06 100644 --- a/addons/point_of_sale/res_users.py +++ b/addons/point_of_sale/res_users.py @@ -1,38 +1,8 @@ #!/usr/bin/env python from osv import osv, fields import math +import openerp.addons.product.product -def is_pair(x): - return not x%2 -# This code is a duplicate of product#check_ean function -def check_ean(eancode): - if not eancode: - return True - if len(eancode) <> 13: - return False - try: - int(eancode) - except: - return False - oddsum=0 - evensum=0 - total=0 - eanvalue=eancode - reversevalue = eanvalue[::-1] - finalean=reversevalue[1:] - - for i in range(len(finalean)): - if is_pair(i): - oddsum += int(finalean[i]) - else: - evensum += int(finalean[i]) - total=(oddsum * 3) + evensum - - check = int(10 - math.ceil(total % 10.0)) %10 - - if check != int(eancode[-1]): - return False - return True class res_users(osv.osv): _inherit = 'res.users' @@ -43,10 +13,22 @@ class res_users(osv.osv): def _check_ean(self, cr, uid, ids, context=None): return all( - check_ean(user.ean13) == True + openerp.addons.product.product.check_ean(user.ean13) == True for user in self.browse(cr, uid, ids, context=context) ) + def edit_ean(self, cr, uid, ids, context): + return { + 'name': "Edit Ean", + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'pos.ean_wizard', + 'target' : 'new', + 'view_id': False, + 'context':context, + } + _constraints = [ (_check_ean, "Error: Invalid ean code", ['ean13'],), ] diff --git a/addons/point_of_sale/res_users_view.xml b/addons/point_of_sale/res_users_view.xml index f561ccf9b80..2a510b1d575 100644 --- a/addons/point_of_sale/res_users_view.xml +++ b/addons/point_of_sale/res_users_view.xml @@ -20,8 +20,11 @@ <field name="arch" type="xml"> <notebook position="inside"> <page string="Point Of Sale"> - <field name="ean13" /> - <field name="pos_config" /> + <group> + <field name="pos_config" /> + <field name="ean13" /> + <button name="edit_ean" type="object" string="Edit" /> + </group> </page> </notebook> </field> diff --git a/addons/point_of_sale/security/ir.model.access.csv b/addons/point_of_sale/security/ir.model.access.csv index 06673fc3da8..74b4bbf5753 100644 --- a/addons/point_of_sale/security/ir.model.access.csv +++ b/addons/point_of_sale/security/ir.model.access.csv @@ -60,7 +60,8 @@ access_product_uom_manager,product.uom manager,product.model_product_uom,group_p access_res_partner_manager,res.partner manager,base.model_res_partner,group_pos_manager,1,0,0,0
access_product_category_manager,product.category manager,product.model_product_category,group_pos_manager,1,1,1,1
access_product_pricelist_manager,product.pricelist manager,product.model_product_pricelist,group_pos_manager,1,0,0,0
-access_product_category_pos_manager,pos.category manager,model_pos_category,group_pos_manager,1,1,1,"1"""
-access_product_category_pos_user,pos.category user,model_pos_category,group_pos_user,1,0,0,"0"""
+access_product_category_pos_manager,pos.category manager,model_pos_category,group_pos_manager,1,1,1,1
+access_product_category_pos_user,pos.category user,model_pos_category,group_pos_user,1,0,0,0
access_pos_session_user,pos.session user,model_pos_session,group_pos_user,1,1,1,0
access_pos_config_user,pos.config user,model_pos_config,group_pos_user,1,1,1,0
+access_ir_sequence_manager,ir.sequence manager,base.model_ir_sequence,group_pos_manager,1,1,1,1
diff --git a/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js b/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js deleted file mode 100644 index 8958c798466..00000000000 --- a/addons/point_of_sale/static/lib/backbone/backbone-0.5.3.js +++ /dev/null @@ -1,1158 +0,0 @@ -// Backbone.js 0.5.3 -// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc. -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://documentcloud.github.com/backbone - -(function(){ - - // Initial Setup - // ------------- - - // Save a reference to the global object. - var root = this; - - // Save the previous value of the `Backbone` variable. - var previousBackbone = root.Backbone; - - // The top-level namespace. All public Backbone classes and modules will - // be attached to this. Exported for both CommonJS and the browser. - var Backbone; - if (typeof exports !== 'undefined') { - Backbone = exports; - } else { - Backbone = root.Backbone = {}; - } - - // Current version of the library. Keep in sync with `package.json`. - Backbone.VERSION = '0.5.3'; - - // Require Underscore, if we're on the server, and it's not already present. - var _ = root._; - if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._; - - // For Backbone's purposes, jQuery or Zepto owns the `$` variable. - var $ = root.jQuery || root.Zepto; - - // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable - // to its previous owner. Returns a reference to this Backbone object. - Backbone.noConflict = function() { - root.Backbone = previousBackbone; - return this; - }; - - // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option will - // fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and set a - // `X-Http-Method-Override` header. - Backbone.emulateHTTP = false; - - // Turn on `emulateJSON` to support legacy servers that can't deal with direct - // `application/json` requests ... will encode the body as - // `application/x-www-form-urlencoded` instead and will send the model in a - // form param named `model`. - Backbone.emulateJSON = false; - - // Backbone.Events - // ----------------- - - // A module that can be mixed in to *any object* in order to provide it with - // custom events. You may `bind` or `unbind` a callback function to an event; - // `trigger`-ing an event fires all callbacks in succession. - // - // var object = {}; - // _.extend(object, Backbone.Events); - // object.bind('expand', function(){ alert('expanded'); }); - // object.trigger('expand'); - // - Backbone.Events = { - - // Bind an event, specified by a string name, `ev`, to a `callback` function. - // Passing `"all"` will bind the callback to all events fired. - bind : function(ev, callback, context) { - var calls = this._callbacks || (this._callbacks = {}); - var list = calls[ev] || (calls[ev] = []); - list.push([callback, context]); - return this; - }, - - // Remove one or many callbacks. If `callback` is null, removes all - // callbacks for the event. If `ev` is null, removes all bound callbacks - // for all events. - unbind : function(ev, callback) { - var calls; - if (!ev) { - this._callbacks = {}; - } else if (calls = this._callbacks) { - if (!callback) { - calls[ev] = []; - } else { - var list = calls[ev]; - if (!list) return this; - for (var i = 0, l = list.length; i < l; i++) { - if (list[i] && callback === list[i][0]) { - list[i] = null; - break; - } - } - } - } - return this; - }, - - // Trigger an event, firing all bound callbacks. Callbacks are passed the - // same arguments as `trigger` is, apart from the event name. - // Listening for `"all"` passes the true event name as the first argument. - trigger : function(eventName) { - var list, calls, ev, callback, args; - var both = 2; - if (!(calls = this._callbacks)) return this; - while (both--) { - ev = both ? eventName : 'all'; - if (list = calls[ev]) { - for (var i = 0, l = list.length; i < l; i++) { - if (!(callback = list[i])) { - list.splice(i, 1); i--; l--; - } else { - args = both ? Array.prototype.slice.call(arguments, 1) : arguments; - callback[0].apply(callback[1] || this, args); - } - } - } - } - return this; - } - - }; - - // Backbone.Model - // -------------- - - // Create a new model, with defined attributes. A client id (`cid`) - // is automatically generated and assigned for you. - Backbone.Model = function(attributes, options) { - var defaults; - attributes || (attributes = {}); - if (defaults = this.defaults) { - if (_.isFunction(defaults)) defaults = defaults.call(this); - attributes = _.extend({}, defaults, attributes); - } - this.attributes = {}; - this._escapedAttributes = {}; - this.cid = _.uniqueId('c'); - this.set(attributes, {silent : true}); - this._changed = false; - this._previousAttributes = _.clone(this.attributes); - if (options && options.collection) this.collection = options.collection; - this.initialize(attributes, options); - }; - - // Attach all inheritable methods to the Model prototype. - _.extend(Backbone.Model.prototype, Backbone.Events, { - - // A snapshot of the model's previous attributes, taken immediately - // after the last `"change"` event was fired. - _previousAttributes : null, - - // Has the item been changed since the last `"change"` event? - _changed : false, - - // The default name for the JSON `id` attribute is `"id"`. MongoDB and - // CouchDB users may want to set this to `"_id"`. - idAttribute : 'id', - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize : function(){}, - - // Return a copy of the model's `attributes` object. - toJSON : function() { - return _.clone(this.attributes); - }, - - // Get the value of an attribute. - get : function(attr) { - return this.attributes[attr]; - }, - - // Get the HTML-escaped value of an attribute. - escape : function(attr) { - var html; - if (html = this._escapedAttributes[attr]) return html; - var val = this.attributes[attr]; - return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : '' + val); - }, - - // Returns `true` if the attribute contains a value that is not null - // or undefined. - has : function(attr) { - return this.attributes[attr] != null; - }, - - // Set a hash of model attributes on the object, firing `"change"` unless you - // choose to silence it. - set : function(attrs, options) { - - // Extract attributes and options. - options || (options = {}); - if (!attrs) return this; - if (attrs.attributes) attrs = attrs.attributes; - var now = this.attributes, escaped = this._escapedAttributes; - - // Run validation. - if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; - - // Check for changes of `id`. - if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; - - // We're about to start triggering change events. - var alreadyChanging = this._changing; - this._changing = true; - - // Update attributes. - for (var attr in attrs) { - var val = attrs[attr]; - if (!_.isEqual(now[attr], val)) { - now[attr] = val; - delete escaped[attr]; - this._changed = true; - if (!options.silent) this.trigger('change:' + attr, this, val, options); - } - } - - // Fire the `"change"` event, if the model has been changed. - if (!alreadyChanging && !options.silent && this._changed) this.change(options); - this._changing = false; - return this; - }, - - // Remove an attribute from the model, firing `"change"` unless you choose - // to silence it. `unset` is a noop if the attribute doesn't exist. - unset : function(attr, options) { - if (!(attr in this.attributes)) return this; - options || (options = {}); - var value = this.attributes[attr]; - - // Run validation. - var validObj = {}; - validObj[attr] = void 0; - if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false; - - // Remove the attribute. - delete this.attributes[attr]; - delete this._escapedAttributes[attr]; - if (attr == this.idAttribute) delete this.id; - this._changed = true; - if (!options.silent) { - this.trigger('change:' + attr, this, void 0, options); - this.change(options); - } - return this; - }, - - // Clear all attributes on the model, firing `"change"` unless you choose - // to silence it. - clear : function(options) { - options || (options = {}); - var attr; - var old = this.attributes; - - // Run validation. - var validObj = {}; - for (attr in old) validObj[attr] = void 0; - if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false; - - this.attributes = {}; - this._escapedAttributes = {}; - this._changed = true; - if (!options.silent) { - for (attr in old) { - this.trigger('change:' + attr, this, void 0, options); - } - this.change(options); - } - return this; - }, - - // Fetch the model from the server. If the server's representation of the - // model differs from its current attributes, they will be overriden, - // triggering a `"change"` event. - fetch : function(options) { - options || (options = {}); - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - if (!model.set(model.parse(resp, xhr), options)) return false; - if (success) success(model, resp); - }; - options.error = wrapError(options.error, model, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Set a hash of model attributes, and sync the model to the server. - // If the server returns an attributes hash that differs, the model's - // state will be `set` again. - save : function(attrs, options) { - options || (options = {}); - if (attrs && !this.set(attrs, options)) return false; - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - if (!model.set(model.parse(resp, xhr), options)) return false; - if (success) success(model, resp, xhr); - }; - options.error = wrapError(options.error, model, options); - var method = this.isNew() ? 'create' : 'update'; - return (this.sync || Backbone.sync).call(this, method, this, options); - }, - - // Destroy this model on the server if it was already persisted. Upon success, the model is removed - // from its collection, if it has one. - destroy : function(options) { - options || (options = {}); - if (this.isNew()) return this.trigger('destroy', this, this.collection, options); - var model = this; - var success = options.success; - options.success = function(resp) { - model.trigger('destroy', model, model.collection, options); - if (success) success(model, resp); - }; - options.error = wrapError(options.error, model, options); - return (this.sync || Backbone.sync).call(this, 'delete', this, options); - }, - - // Default URL for the model's representation on the server -- if you're - // using Backbone's restful methods, override this to change the endpoint - // that will be called. - url : function() { - var base = getUrl(this.collection) || this.urlRoot || urlError(); - if (this.isNew()) return base; - return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); - }, - - // **parse** converts a response into the hash of attributes to be `set` on - // the model. The default implementation is just to pass the response along. - parse : function(resp, xhr) { - return resp; - }, - - // Create a new model with identical attributes to this one. - clone : function() { - return new this.constructor(this); - }, - - // A model is new if it has never been saved to the server, and lacks an id. - isNew : function() { - return this.id == null; - }, - - // Call this method to manually fire a `change` event for this model. - // Calling this will cause all objects observing the model to update. - change : function(options) { - this.trigger('change', this, options); - this._previousAttributes = _.clone(this.attributes); - this._changed = false; - }, - - // Determine if the model has changed since the last `"change"` event. - // If you specify an attribute name, determine if that attribute has changed. - hasChanged : function(attr) { - if (attr) return this._previousAttributes[attr] != this.attributes[attr]; - return this._changed; - }, - - // Return an object containing all the attributes that have changed, or false - // if there are no changed attributes. Useful for determining what parts of a - // view need to be updated and/or what attributes need to be persisted to - // the server. - changedAttributes : function(now) { - now || (now = this.attributes); - var old = this._previousAttributes; - var changed = false; - for (var attr in now) { - if (!_.isEqual(old[attr], now[attr])) { - changed = changed || {}; - changed[attr] = now[attr]; - } - } - return changed; - }, - - // Get the previous value of an attribute, recorded at the time the last - // `"change"` event was fired. - previous : function(attr) { - if (!attr || !this._previousAttributes) return null; - return this._previousAttributes[attr]; - }, - - // Get all of the attributes of the model at the time of the previous - // `"change"` event. - previousAttributes : function() { - return _.clone(this._previousAttributes); - }, - - // Run validation against a set of incoming attributes, returning `true` - // if all is well. If a specific `error` callback has been passed, - // call that instead of firing the general `"error"` event. - _performValidation : function(attrs, options) { - var error = this.validate(attrs); - if (error) { - if (options.error) { - options.error(this, error, options); - } else { - this.trigger('error', this, error, options); - } - return false; - } - return true; - } - - }); - - // Backbone.Collection - // ------------------- - - // Provides a standard collection class for our sets of models, ordered - // or unordered. If a `comparator` is specified, the Collection will maintain - // its models in sort order, as they're added and removed. - Backbone.Collection = function(models, options) { - options || (options = {}); - if (options.comparator) this.comparator = options.comparator; - _.bindAll(this, '_onModelEvent', '_removeReference'); - this._reset(); - if (models) this.reset(models, {silent: true}); - this.initialize.apply(this, arguments); - }; - - // Define the Collection's inheritable methods. - _.extend(Backbone.Collection.prototype, Backbone.Events, { - - // The default model for a collection is just a **Backbone.Model**. - // This should be overridden in most cases. - model : Backbone.Model, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize : function(){}, - - // The JSON representation of a Collection is an array of the - // models' attributes. - toJSON : function() { - return this.map(function(model){ return model.toJSON(); }); - }, - - // Add a model, or list of models to the set. Pass **silent** to avoid - // firing the `added` event for every new model. - add : function(models, options) { - if (_.isArray(models)) { - for (var i = 0, l = models.length; i < l; i++) { - this._add(models[i], options); - } - } else { - this._add(models, options); - } - return this; - }, - - // Remove a model, or a list of models from the set. Pass silent to avoid - // firing the `removed` event for every model removed. - remove : function(models, options) { - if (_.isArray(models)) { - for (var i = 0, l = models.length; i < l; i++) { - this._remove(models[i], options); - } - } else { - this._remove(models, options); - } - return this; - }, - - // Get a model from the set by id. - get : function(id) { - if (id == null) return null; - return this._byId[id.id != null ? id.id : id]; - }, - - // Get a model from the set by client id. - getByCid : function(cid) { - return cid && this._byCid[cid.cid || cid]; - }, - - // Get the model at the given index. - at: function(index) { - return this.models[index]; - }, - - // Force the collection to re-sort itself. You don't need to call this under normal - // circumstances, as the set will maintain sort order as each item is added. - sort : function(options) { - options || (options = {}); - if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); - this.models = this.sortBy(this.comparator); - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Pluck an attribute from each model in the collection. - pluck : function(attr) { - return _.map(this.models, function(model){ return model.get(attr); }); - }, - - // When you have more items than you want to add or remove individually, - // you can reset the entire set with a new list of models, without firing - // any `added` or `removed` events. Fires `reset` when finished. - reset : function(models, options) { - models || (models = []); - options || (options = {}); - this.each(this._removeReference); - this._reset(); - this.add(models, {silent: true}); - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Fetch the default set of models for this collection, resetting the - // collection when they arrive. If `add: true` is passed, appends the - // models to the collection instead of resetting. - fetch : function(options) { - options || (options = {}); - var collection = this; - var success = options.success; - options.success = function(resp, status, xhr) { - collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options); - if (success) success(collection, resp); - }; - options.error = wrapError(options.error, collection, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Create a new instance of a model in this collection. After the model - // has been created on the server, it will be added to the collection. - // Returns the model, or 'false' if validation on a new model fails. - create : function(model, options) { - var coll = this; - options || (options = {}); - model = this._prepareModel(model, options); - if (!model) return false; - var success = options.success; - options.success = function(nextModel, resp, xhr) { - coll.add(nextModel, options); - if (success) success(nextModel, resp, xhr); - }; - model.save(null, options); - return model; - }, - - // **parse** converts a response into a list of models to be added to the - // collection. The default implementation is just to pass it through. - parse : function(resp, xhr) { - return resp; - }, - - // Proxy to _'s chain. Can't be proxied the same way the rest of the - // underscore methods are proxied because it relies on the underscore - // constructor. - chain: function () { - return _(this.models).chain(); - }, - - // Reset all internal state. Called when the collection is reset. - _reset : function(options) { - this.length = 0; - this.models = []; - this._byId = {}; - this._byCid = {}; - }, - - // Prepare a model to be added to this collection - _prepareModel: function(model, options) { - if (!(model instanceof Backbone.Model)) { - var attrs = model; - model = new this.model(attrs, {collection: this}); - if (model.validate && !model._performValidation(attrs, options)) model = false; - } else if (!model.collection) { - model.collection = this; - } - return model; - }, - - // Internal implementation of adding a single model to the set, updating - // hash indexes for `id` and `cid` lookups. - // Returns the model, or 'false' if validation on a new model fails. - _add : function(model, options) { - options || (options = {}); - model = this._prepareModel(model, options); - if (!model) return false; - var already = this.getByCid(model); - if (already) throw new Error(["Can't add the same model to a set twice", already.id]); - this._byId[model.id] = model; - this._byCid[model.cid] = model; - var index = options.at != null ? options.at : - this.comparator ? this.sortedIndex(model, this.comparator) : - this.length; - this.models.splice(index, 0, model); - model.bind('all', this._onModelEvent); - this.length++; - if (!options.silent) model.trigger('add', model, this, options); - return model; - }, - - // Internal implementation of removing a single model from the set, updating - // hash indexes for `id` and `cid` lookups. - _remove : function(model, options) { - options || (options = {}); - model = this.getByCid(model) || this.get(model); - if (!model) return null; - delete this._byId[model.id]; - delete this._byCid[model.cid]; - this.models.splice(this.indexOf(model), 1); - this.length--; - if (!options.silent) model.trigger('remove', model, this, options); - this._removeReference(model); - return model; - }, - - // Internal method to remove a model's ties to a collection. - _removeReference : function(model) { - if (this == model.collection) { - delete model.collection; - } - model.unbind('all', this._onModelEvent); - }, - - // Internal method called every time a model in the set fires an event. - // Sets need to update their indexes when models change ids. All other - // events simply proxy through. "add" and "remove" events that originate - // in other collections are ignored. - _onModelEvent : function(ev, model, collection, options) { - if ((ev == 'add' || ev == 'remove') && collection != this) return; - if (ev == 'destroy') { - this._remove(model, options); - } - if (model && ev === 'change:' + model.idAttribute) { - delete this._byId[model.previous(model.idAttribute)]; - this._byId[model.id] = model; - } - this.trigger.apply(this, arguments); - } - - }); - - // Underscore methods that we want to implement on the Collection. - var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect', - 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include', - 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size', - 'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty', 'groupBy']; - - // Mix in each Underscore method as a proxy to `Collection#models`. - _.each(methods, function(method) { - Backbone.Collection.prototype[method] = function() { - return _[method].apply(_, [this.models].concat(_.toArray(arguments))); - }; - }); - - // Backbone.Router - // ------------------- - - // Routers map faux-URLs to actions, and fire events when routes are - // matched. Creating a new one sets its `routes` hash, if not set statically. - Backbone.Router = function(options) { - options || (options = {}); - if (options.routes) this.routes = options.routes; - this._bindRoutes(); - this.initialize.apply(this, arguments); - }; - - // Cached regular expressions for matching named param parts and splatted - // parts of route strings. - var namedParam = /:([\w\d]+)/g; - var splatParam = /\*([\w\d]+)/g; - var escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g; - - // Set up all inheritable **Backbone.Router** properties and methods. - _.extend(Backbone.Router.prototype, Backbone.Events, { - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize : function(){}, - - // Manually bind a single named route to a callback. For example: - // - // this.route('search/:query/p:num', 'search', function(query, num) { - // ... - // }); - // - route : function(route, name, callback) { - Backbone.history || (Backbone.history = new Backbone.History); - if (!_.isRegExp(route)) route = this._routeToRegExp(route); - Backbone.history.route(route, _.bind(function(fragment) { - var args = this._extractParameters(route, fragment); - callback.apply(this, args); - this.trigger.apply(this, ['route:' + name].concat(args)); - }, this)); - }, - - // Simple proxy to `Backbone.history` to save a fragment into the history. - navigate : function(fragment, triggerRoute) { - Backbone.history.navigate(fragment, triggerRoute); - }, - - // Bind all defined routes to `Backbone.history`. We have to reverse the - // order of the routes here to support behavior where the most general - // routes can be defined at the bottom of the route map. - _bindRoutes : function() { - if (!this.routes) return; - var routes = []; - for (var route in this.routes) { - routes.unshift([route, this.routes[route]]); - } - for (var i = 0, l = routes.length; i < l; i++) { - this.route(routes[i][0], routes[i][1], this[routes[i][1]]); - } - }, - - // Convert a route string into a regular expression, suitable for matching - // against the current location hash. - _routeToRegExp : function(route) { - route = route.replace(escapeRegExp, "\\$&") - .replace(namedParam, "([^\/]*)") - .replace(splatParam, "(.*?)"); - return new RegExp('^' + route + '$'); - }, - - // Given a route, and a URL fragment that it matches, return the array of - // extracted parameters. - _extractParameters : function(route, fragment) { - return route.exec(fragment).slice(1); - } - - }); - - // Backbone.History - // ---------------- - - // Handles cross-browser history management, based on URL fragments. If the - // browser does not support `onhashchange`, falls back to polling. - Backbone.History = function() { - this.handlers = []; - _.bindAll(this, 'checkUrl'); - }; - - // Cached regex for cleaning hashes. - var hashStrip = /^#*/; - - // Cached regex for detecting MSIE. - var isExplorer = /msie [\w.]+/; - - // Has the history handling already been started? - var historyStarted = false; - - // Set up all inheritable **Backbone.History** properties and methods. - _.extend(Backbone.History.prototype, { - - // The default interval to poll for hash changes, if necessary, is - // twenty times a second. - interval: 50, - - // Get the cross-browser normalized URL fragment, either from the URL, - // the hash, or the override. - getFragment : function(fragment, forcePushState) { - if (fragment == null) { - if (this._hasPushState || forcePushState) { - fragment = window.location.pathname; - var search = window.location.search; - if (search) fragment += search; - if (fragment.indexOf(this.options.root) == 0) fragment = fragment.substr(this.options.root.length); - } else { - fragment = window.location.hash; - } - } - return decodeURIComponent(fragment.replace(hashStrip, '')); - }, - - // Start the hash change handling, returning `true` if the current URL matches - // an existing route, and `false` otherwise. - start : function(options) { - - // Figure out the initial configuration. Do we need an iframe? - // Is pushState desired ... is it available? - if (historyStarted) throw new Error("Backbone.history has already been started"); - this.options = _.extend({}, {root: '/'}, this.options, options); - this._wantsPushState = !!this.options.pushState; - this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState); - var fragment = this.getFragment(); - var docMode = document.documentMode; - var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); - if (oldIE) { - this.iframe = $('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow; - this.navigate(fragment); - } - - // Depending on whether we're using pushState or hashes, and whether - // 'onhashchange' is supported, determine how we check the URL state. - if (this._hasPushState) { - $(window).bind('popstate', this.checkUrl); - } else if ('onhashchange' in window && !oldIE) { - $(window).bind('hashchange', this.checkUrl); - } else { - setInterval(this.checkUrl, this.interval); - } - - // Determine if we need to change the base url, for a pushState link - // opened by a non-pushState browser. - this.fragment = fragment; - historyStarted = true; - var loc = window.location; - var atRoot = loc.pathname == this.options.root; - if (this._wantsPushState && !this._hasPushState && !atRoot) { - this.fragment = this.getFragment(null, true); - window.location.replace(this.options.root + '#' + this.fragment); - // Return immediately as browser will do redirect to new url - return true; - } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) { - this.fragment = loc.hash.replace(hashStrip, ''); - window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment); - } - - if (!this.options.silent) { - return this.loadUrl(); - } - }, - - // Add a route to be tested when the fragment changes. Routes added later may - // override previous routes. - route : function(route, callback) { - this.handlers.unshift({route : route, callback : callback}); - }, - - // Checks the current URL to see if it has changed, and if it has, - // calls `loadUrl`, normalizing across the hidden iframe. - checkUrl : function(e) { - var current = this.getFragment(); - if (current == this.fragment && this.iframe) current = this.getFragment(this.iframe.location.hash); - if (current == this.fragment || current == decodeURIComponent(this.fragment)) return false; - if (this.iframe) this.navigate(current); - this.loadUrl() || this.loadUrl(window.location.hash); - }, - - // Attempt to load the current URL fragment. If a route succeeds with a - // match, returns `true`. If no defined routes matches the fragment, - // returns `false`. - loadUrl : function(fragmentOverride) { - var fragment = this.fragment = this.getFragment(fragmentOverride); - var matched = _.any(this.handlers, function(handler) { - if (handler.route.test(fragment)) { - handler.callback(fragment); - return true; - } - }); - return matched; - }, - - // Save a fragment into the hash history. You are responsible for properly - // URL-encoding the fragment in advance. This does not trigger - // a `hashchange` event. - navigate : function(fragment, triggerRoute) { - var frag = (fragment || '').replace(hashStrip, ''); - if (this.fragment == frag || this.fragment == decodeURIComponent(frag)) return; - if (this._hasPushState) { - var loc = window.location; - if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag; - this.fragment = frag; - window.history.pushState({}, document.title, loc.protocol + '//' + loc.host + frag); - } else { - window.location.hash = this.fragment = frag; - if (this.iframe && (frag != this.getFragment(this.iframe.location.hash))) { - this.iframe.document.open().close(); - this.iframe.location.hash = frag; - } - } - if (triggerRoute) this.loadUrl(fragment); - } - - }); - - // Backbone.View - // ------------- - - // Creating a Backbone.View creates its initial element outside of the DOM, - // if an existing element is not provided... - Backbone.View = function(options) { - this.cid = _.uniqueId('view'); - this._configure(options || {}); - this._ensureElement(); - this.delegateEvents(); - this.initialize.apply(this, arguments); - }; - - // Element lookup, scoped to DOM elements within the current view. - // This should be prefered to global lookups, if you're dealing with - // a specific view. - var selectorDelegate = function(selector) { - return $(selector, this.el); - }; - - // Cached regex to split keys for `delegate`. - var eventSplitter = /^(\S+)\s*(.*)$/; - - // List of view options to be merged as properties. - var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName']; - - // Set up all inheritable **Backbone.View** properties and methods. - _.extend(Backbone.View.prototype, Backbone.Events, { - - // The default `tagName` of a View's element is `"div"`. - tagName : 'div', - - // Attach the `selectorDelegate` function as the `$` property. - $ : selectorDelegate, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize : function(){}, - - // **render** is the core function that your view should override, in order - // to populate its element (`this.el`), with the appropriate HTML. The - // convention is for **render** to always return `this`. - render : function() { - return this; - }, - - // Remove this view from the DOM. Note that the view isn't present in the - // DOM by default, so calling this method may be a no-op. - remove : function() { - $(this.el).remove(); - return this; - }, - - // For small amounts of DOM Elements, where a full-blown template isn't - // needed, use **make** to manufacture elements, one at a time. - // - // var el = this.make('li', {'class': 'row'}, this.model.escape('title')); - // - make : function(tagName, attributes, content) { - var el = document.createElement(tagName); - if (attributes) $(el).attr(attributes); - if (content) $(el).html(content); - return el; - }, - - // Set callbacks, where `this.callbacks` is a hash of - // - // *{"event selector": "callback"}* - // - // { - // 'mousedown .title': 'edit', - // 'click .button': 'save' - // } - // - // pairs. Callbacks will be bound to the view, with `this` set properly. - // Uses event delegation for efficiency. - // Omitting the selector binds the event to `this.el`. - // This only works for delegate-able events: not `focus`, `blur`, and - // not `change`, `submit`, and `reset` in Internet Explorer. - delegateEvents : function(events) { - if (!(events || (events = this.events))) return; - if (_.isFunction(events)) events = events.call(this); - $(this.el).unbind('.delegateEvents' + this.cid); - for (var key in events) { - var method = this[events[key]]; - if (!method) throw new Error('Event "' + events[key] + '" does not exist'); - var match = key.match(eventSplitter); - var eventName = match[1], selector = match[2]; - method = _.bind(method, this); - eventName += '.delegateEvents' + this.cid; - if (selector === '') { - $(this.el).bind(eventName, method); - } else { - $(this.el).delegate(selector, eventName, method); - } - } - }, - - // Performs the initial configuration of a View with a set of options. - // Keys with special meaning *(model, collection, id, className)*, are - // attached directly to the view. - _configure : function(options) { - if (this.options) options = _.extend({}, this.options, options); - for (var i = 0, l = viewOptions.length; i < l; i++) { - var attr = viewOptions[i]; - if (options[attr]) this[attr] = options[attr]; - } - this.options = options; - }, - - // Ensure that the View has a DOM element to render into. - // If `this.el` is a string, pass it through `$()`, take the first - // matching element, and re-assign it to `el`. Otherwise, create - // an element from the `id`, `className` and `tagName` proeprties. - _ensureElement : function() { - if (!this.el) { - var attrs = this.attributes || {}; - if (this.id) attrs.id = this.id; - if (this.className) attrs['class'] = this.className; - this.el = this.make(this.tagName, attrs); - } else if (_.isString(this.el)) { - this.el = $(this.el).get(0); - } - } - - }); - - // The self-propagating extend function that Backbone classes use. - var extend = function (protoProps, classProps) { - var child = inherits(this, protoProps, classProps); - child.extend = this.extend; - return child; - }; - - // Set up inheritance for the model, collection, and view. - Backbone.Model.extend = Backbone.Collection.extend = - Backbone.Router.extend = Backbone.View.extend = extend; - - // Map from CRUD to HTTP for our default `Backbone.sync` implementation. - var methodMap = { - 'create': 'POST', - 'update': 'PUT', - 'delete': 'DELETE', - 'read' : 'GET' - }; - - // Backbone.sync - // ------------- - - // Override this function to change the manner in which Backbone persists - // models to the server. You will be passed the type of request, and the - // model in question. By default, uses makes a RESTful Ajax request - // to the model's `url()`. Some possible customizations could be: - // - // * Use `setTimeout` to batch rapid-fire updates into a single request. - // * Send up the models as XML instead of JSON. - // * Persist models via WebSockets instead of Ajax. - // - // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests - // as `POST`, with a `_method` parameter containing the true HTTP method, - // as well as all requests with the body as `application/x-www-form-urlencoded` instead of - // `application/json` with the model in a param named `model`. - // Useful when interfacing with server-side languages like **PHP** that make - // it difficult to read the body of `PUT` requests. - Backbone.sync = function(method, model, options) { - var type = methodMap[method]; - - // Default JSON-request options. - var params = _.extend({ - type: type, - dataType: 'json' - }, options); - - // Ensure that we have a URL. - if (!params.url) { - params.url = getUrl(model) || urlError(); - } - - // Ensure that we have the appropriate request data. - if (!params.data && model && (method == 'create' || method == 'update')) { - params.contentType = 'application/json'; - params.data = JSON.stringify(model.toJSON()); - } - - // For older servers, emulate JSON by encoding the request into an HTML-form. - if (Backbone.emulateJSON) { - params.contentType = 'application/x-www-form-urlencoded'; - params.data = params.data ? {model : params.data} : {}; - } - - // For older servers, emulate HTTP by mimicking the HTTP method with `_method` - // And an `X-HTTP-Method-Override` header. - if (Backbone.emulateHTTP) { - if (type === 'PUT' || type === 'DELETE') { - if (Backbone.emulateJSON) params.data._method = type; - params.type = 'POST'; - params.beforeSend = function(xhr) { - xhr.setRequestHeader('X-HTTP-Method-Override', type); - }; - } - } - - // Don't process data on a non-GET request. - if (params.type !== 'GET' && !Backbone.emulateJSON) { - params.processData = false; - } - - // Make the request. - return $.ajax(params); - }; - - // Helpers - // ------- - - // Shared empty constructor function to aid in prototype-chain creation. - var ctor = function(){}; - - // Helper function to correctly set up the prototype chain, for subclasses. - // Similar to `goog.inherits`, but uses a hash of prototype properties and - // class properties to be extended. - var inherits = function(parent, protoProps, staticProps) { - var child; - - // The constructor function for the new subclass is either defined by you - // (the "constructor" property in your `extend` definition), or defaulted - // by us to simply call `super()`. - if (protoProps && protoProps.hasOwnProperty('constructor')) { - child = protoProps.constructor; - } else { - child = function(){ return parent.apply(this, arguments); }; - } - - // Inherit class (static) properties from parent. - _.extend(child, parent); - - // Set the prototype chain to inherit from `parent`, without calling - // `parent`'s constructor function. - ctor.prototype = parent.prototype; - child.prototype = new ctor(); - - // Add prototype properties (instance properties) to the subclass, - // if supplied. - if (protoProps) _.extend(child.prototype, protoProps); - - // Add static properties to the constructor function, if supplied. - if (staticProps) _.extend(child, staticProps); - - // Correctly set child's `prototype.constructor`. - child.prototype.constructor = child; - - // Set a convenience property in case the parent's prototype is needed later. - child.__super__ = parent.prototype; - - return child; - }; - - // Helper function to get a URL from a Model or Collection as a property - // or as a function. - var getUrl = function(object) { - if (!(object && object.url)) return null; - return _.isFunction(object.url) ? object.url() : object.url; - }; - - // Throw an error when a URL is needed, and none is supplied. - var urlError = function() { - throw new Error('A "url" property or function must be specified'); - }; - - // Wrap an optional error callback with a fallback error event. - var wrapError = function(onError, model, options) { - return function(resp) { - if (onError) { - onError(model, resp, options); - } else { - model.trigger('error', model, resp, options); - } - }; - }; - - // Helper function to escape a string for HTML rendering. - var escapeHTML = function(string) { - return string.replace(/&(?!\w+;|#\d+;|#x[\da-f]+;)/gi, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/'); - }; - -}).call(this);
\ No newline at end of file diff --git a/addons/point_of_sale/static/lib/backbone/backbone-0.9.2.js b/addons/point_of_sale/static/lib/backbone/backbone-0.9.2.js deleted file mode 100644 index 3373c952bfa..00000000000 --- a/addons/point_of_sale/static/lib/backbone/backbone-0.9.2.js +++ /dev/null @@ -1,1431 +0,0 @@ -// Backbone.js 0.9.2 - -// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://backbonejs.org - -(function(){ - - // Initial Setup - // ------------- - - // Save a reference to the global object (`window` in the browser, `global` - // on the server). - var root = this; - - // Save the previous value of the `Backbone` variable, so that it can be - // restored later on, if `noConflict` is used. - var previousBackbone = root.Backbone; - - // Create a local reference to slice/splice. - var slice = Array.prototype.slice; - var splice = Array.prototype.splice; - - // The top-level namespace. All public Backbone classes and modules will - // be attached to this. Exported for both CommonJS and the browser. - var Backbone; - if (typeof exports !== 'undefined') { - Backbone = exports; - } else { - Backbone = root.Backbone = {}; - } - - // Current version of the library. Keep in sync with `package.json`. - Backbone.VERSION = '0.9.2'; - - // Require Underscore, if we're on the server, and it's not already present. - var _ = root._; - if (!_ && (typeof require !== 'undefined')) _ = require('underscore'); - - // For Backbone's purposes, jQuery, Zepto, or Ender owns the `$` variable. - var $ = root.jQuery || root.Zepto || root.ender; - - // Set the JavaScript library that will be used for DOM manipulation and - // Ajax calls (a.k.a. the `$` variable). By default Backbone will use: jQuery, - // Zepto, or Ender; but the `setDomLibrary()` method lets you inject an - // alternate JavaScript library (or a mock library for testing your views - // outside of a browser). - Backbone.setDomLibrary = function(lib) { - $ = lib; - }; - - // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable - // to its previous owner. Returns a reference to this Backbone object. - Backbone.noConflict = function() { - root.Backbone = previousBackbone; - return this; - }; - - // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option - // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and - // set a `X-Http-Method-Override` header. - Backbone.emulateHTTP = false; - - // Turn on `emulateJSON` to support legacy servers that can't deal with direct - // `application/json` requests ... will encode the body as - // `application/x-www-form-urlencoded` instead and will send the model in a - // form param named `model`. - Backbone.emulateJSON = false; - - // Backbone.Events - // ----------------- - - // Regular expression used to split event strings - var eventSplitter = /\s+/; - - // A module that can be mixed in to *any object* in order to provide it with - // custom events. You may bind with `on` or remove with `off` callback functions - // to an event; trigger`-ing an event fires all callbacks in succession. - // - // var object = {}; - // _.extend(object, Backbone.Events); - // object.on('expand', function(){ alert('expanded'); }); - // object.trigger('expand'); - // - var Events = Backbone.Events = { - - // Bind one or more space separated events, `events`, to a `callback` - // function. Passing `"all"` will bind the callback to all events fired. - on: function(events, callback, context) { - - var calls, event, node, tail, list; - if (!callback) return this; - events = events.split(eventSplitter); - calls = this._callbacks || (this._callbacks = {}); - - // Create an immutable callback list, allowing traversal during - // modification. The tail is an empty object that will always be used - // as the next node. - while (event = events.shift()) { - list = calls[event]; - node = list ? list.tail : {}; - node.next = tail = {}; - node.context = context; - node.callback = callback; - calls[event] = {tail: tail, next: list ? list.next : node}; - } - - return this; - }, - - // Remove one or many callbacks. If `context` is null, removes all callbacks - // with that function. If `callback` is null, removes all callbacks for the - // event. If `events` is null, removes all bound callbacks for all events. - off: function(events, callback, context) { - var event, calls, node, tail, cb, ctx; - - // No events, or removing *all* events. - if (!(calls = this._callbacks)) return; - if (!(events || callback || context)) { - delete this._callbacks; - return this; - } - - // Loop through the listed events and contexts, splicing them out of the - // linked list of callbacks if appropriate. - events = events ? events.split(eventSplitter) : _.keys(calls); - while (event = events.shift()) { - node = calls[event]; - delete calls[event]; - if (!node || !(callback || context)) continue; - // Create a new list, omitting the indicated callbacks. - tail = node.tail; - while ((node = node.next) !== tail) { - cb = node.callback; - ctx = node.context; - if ((callback && cb !== callback) || (context && ctx !== context)) { - this.on(event, cb, ctx); - } - } - } - - return this; - }, - - // Trigger one or many events, firing all bound callbacks. Callbacks are - // passed the same arguments as `trigger` is, apart from the event name - // (unless you're listening on `"all"`, which will cause your callback to - // receive the true name of the event as the first argument). - trigger: function(events) { - var event, node, calls, tail, args, all, rest; - if (!(calls = this._callbacks)) return this; - all = calls.all; - events = events.split(eventSplitter); - rest = slice.call(arguments, 1); - - // For each event, walk through the linked list of callbacks twice, - // first to trigger the event, then to trigger any `"all"` callbacks. - while (event = events.shift()) { - if (node = calls[event]) { - tail = node.tail; - while ((node = node.next) !== tail) { - node.callback.apply(node.context || this, rest); - } - } - if (node = all) { - tail = node.tail; - args = [event].concat(rest); - while ((node = node.next) !== tail) { - node.callback.apply(node.context || this, args); - } - } - } - - return this; - } - - }; - - // Aliases for backwards compatibility. - Events.bind = Events.on; - Events.unbind = Events.off; - - // Backbone.Model - // -------------- - - // Create a new model, with defined attributes. A client id (`cid`) - // is automatically generated and assigned for you. - var Model = Backbone.Model = function(attributes, options) { - var defaults; - attributes || (attributes = {}); - if (options && options.parse) attributes = this.parse(attributes); - if (defaults = getValue(this, 'defaults')) { - attributes = _.extend({}, defaults, attributes); - } - if (options && options.collection) this.collection = options.collection; - this.attributes = {}; - this._escapedAttributes = {}; - this.cid = _.uniqueId('c'); - this.changed = {}; - this._silent = {}; - this._pending = {}; - this.set(attributes, {silent: true}); - // Reset change tracking. - this.changed = {}; - this._silent = {}; - this._pending = {}; - this._previousAttributes = _.clone(this.attributes); - this.initialize.apply(this, arguments); - }; - - // Attach all inheritable methods to the Model prototype. - _.extend(Model.prototype, Events, { - - // A hash of attributes whose current and previous value differ. - changed: null, - - // A hash of attributes that have silently changed since the last time - // `change` was called. Will become pending attributes on the next call. - _silent: null, - - // A hash of attributes that have changed since the last `'change'` event - // began. - _pending: null, - - // The default name for the JSON `id` attribute is `"id"`. MongoDB and - // CouchDB users may want to set this to `"_id"`. - idAttribute: 'id', - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // Return a copy of the model's `attributes` object. - toJSON: function(options) { - return _.clone(this.attributes); - }, - - // Get the value of an attribute. - get: function(attr) { - return this.attributes[attr]; - }, - - // Get the HTML-escaped value of an attribute. - escape: function(attr) { - var html; - if (html = this._escapedAttributes[attr]) return html; - var val = this.get(attr); - return this._escapedAttributes[attr] = _.escape(val == null ? '' : '' + val); - }, - - // Returns `true` if the attribute contains a value that is not null - // or undefined. - has: function(attr) { - return this.get(attr) != null; - }, - - // Set a hash of model attributes on the object, firing `"change"` unless - // you choose to silence it. - set: function(key, value, options) { - var attrs, attr, val; - - // Handle both `"key", value` and `{key: value}` -style arguments. - if (_.isObject(key) || key == null) { - attrs = key; - options = value; - } else { - attrs = {}; - attrs[key] = value; - } - - // Extract attributes and options. - options || (options = {}); - if (!attrs) return this; - if (attrs instanceof Model) attrs = attrs.attributes; - if (options.unset) for (attr in attrs) attrs[attr] = void 0; - - // Run validation. - if (!this._validate(attrs, options)) return false; - - // Check for changes of `id`. - if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; - - var changes = options.changes = {}; - var now = this.attributes; - var escaped = this._escapedAttributes; - var prev = this._previousAttributes || {}; - - // For each `set` attribute... - for (attr in attrs) { - val = attrs[attr]; - - // If the new and current value differ, record the change. - if (!_.isEqual(now[attr], val) || (options.unset && _.has(now, attr))) { - delete escaped[attr]; - (options.silent ? this._silent : changes)[attr] = true; - } - - // Update or delete the current value. - options.unset ? delete now[attr] : now[attr] = val; - - // If the new and previous value differ, record the change. If not, - // then remove changes for this attribute. - if (!_.isEqual(prev[attr], val) || (_.has(now, attr) != _.has(prev, attr))) { - this.changed[attr] = val; - if (!options.silent) this._pending[attr] = true; - } else { - delete this.changed[attr]; - delete this._pending[attr]; - } - } - - // Fire the `"change"` events. - if (!options.silent) this.change(options); - return this; - }, - - // Remove an attribute from the model, firing `"change"` unless you choose - // to silence it. `unset` is a noop if the attribute doesn't exist. - unset: function(attr, options) { - (options || (options = {})).unset = true; - return this.set(attr, null, options); - }, - - // Clear all attributes on the model, firing `"change"` unless you choose - // to silence it. - clear: function(options) { - (options || (options = {})).unset = true; - return this.set(_.clone(this.attributes), options); - }, - - // Fetch the model from the server. If the server's representation of the - // model differs from its current attributes, they will be overriden, - // triggering a `"change"` event. - fetch: function(options) { - options = options ? _.clone(options) : {}; - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - if (!model.set(model.parse(resp, xhr), options)) return false; - if (success) success(model, resp); - }; - options.error = Backbone.wrapError(options.error, model, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Set a hash of model attributes, and sync the model to the server. - // If the server returns an attributes hash that differs, the model's - // state will be `set` again. - save: function(key, value, options) { - var attrs, current; - - // Handle both `("key", value)` and `({key: value})` -style calls. - if (_.isObject(key) || key == null) { - attrs = key; - options = value; - } else { - attrs = {}; - attrs[key] = value; - } - options = options ? _.clone(options) : {}; - - // If we're "wait"-ing to set changed attributes, validate early. - if (options.wait) { - if (!this._validate(attrs, options)) return false; - current = _.clone(this.attributes); - } - - // Regular saves `set` attributes before persisting to the server. - var silentOptions = _.extend({}, options, {silent: true}); - if (attrs && !this.set(attrs, options.wait ? silentOptions : options)) { - return false; - } - - // After a successful server-side save, the client is (optionally) - // updated with the server-side state. - var model = this; - var success = options.success; - options.success = function(resp, status, xhr) { - var serverAttrs = model.parse(resp, xhr); - if (options.wait) { - delete options.wait; - serverAttrs = _.extend(attrs || {}, serverAttrs); - } - if (!model.set(serverAttrs, options)) return false; - if (success) { - success(model, resp); - } else { - model.trigger('sync', model, resp, options); - } - }; - - // Finish configuring and sending the Ajax request. - options.error = Backbone.wrapError(options.error, model, options); - var method = this.isNew() ? 'create' : 'update'; - var xhr = (this.sync || Backbone.sync).call(this, method, this, options); - if (options.wait) this.set(current, silentOptions); - return xhr; - }, - - // Destroy this model on the server if it was already persisted. - // Optimistically removes the model from its collection, if it has one. - // If `wait: true` is passed, waits for the server to respond before removal. - destroy: function(options) { - options = options ? _.clone(options) : {}; - var model = this; - var success = options.success; - - var triggerDestroy = function() { - model.trigger('destroy', model, model.collection, options); - }; - - if (this.isNew()) { - triggerDestroy(); - return false; - } - - options.success = function(resp) { - if (options.wait) triggerDestroy(); - if (success) { - success(model, resp); - } else { - model.trigger('sync', model, resp, options); - } - }; - - options.error = Backbone.wrapError(options.error, model, options); - var xhr = (this.sync || Backbone.sync).call(this, 'delete', this, options); - if (!options.wait) triggerDestroy(); - return xhr; - }, - - // Default URL for the model's representation on the server -- if you're - // using Backbone's restful methods, override this to change the endpoint - // that will be called. - url: function() { - var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') || urlError(); - if (this.isNew()) return base; - return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id); - }, - - // **parse** converts a response into the hash of attributes to be `set` on - // the model. The default implementation is just to pass the response along. - parse: function(resp, xhr) { - return resp; - }, - - // Create a new model with identical attributes to this one. - clone: function() { - return new this.constructor(this.attributes); - }, - - // A model is new if it has never been saved to the server, and lacks an id. - isNew: function() { - return this.id == null; - }, - - // Call this method to manually fire a `"change"` event for this model and - // a `"change:attribute"` event for each changed attribute. - // Calling this will cause all objects observing the model to update. - change: function(options) { - options || (options = {}); - var changing = this._changing; - this._changing = true; - - // Silent changes become pending changes. - for (var attr in this._silent) this._pending[attr] = true; - - // Silent changes are triggered. - var changes = _.extend({}, options.changes, this._silent); - this._silent = {}; - for (var attr in changes) { - this.trigger('change:' + attr, this, this.get(attr), options); - } - if (changing) return this; - - // Continue firing `"change"` events while there are pending changes. - while (!_.isEmpty(this._pending)) { - this._pending = {}; - this.trigger('change', this, options); - // Pending and silent changes still remain. - for (var attr in this.changed) { - if (this._pending[attr] || this._silent[attr]) continue; - delete this.changed[attr]; - } - this._previousAttributes = _.clone(this.attributes); - } - - this._changing = false; - return this; - }, - - // Determine if the model has changed since the last `"change"` event. - // If you specify an attribute name, determine if that attribute has changed. - hasChanged: function(attr) { - if (!arguments.length) return !_.isEmpty(this.changed); - return _.has(this.changed, attr); - }, - - // Return an object containing all the attributes that have changed, or - // false if there are no changed attributes. Useful for determining what - // parts of a view need to be updated and/or what attributes need to be - // persisted to the server. Unset attributes will be set to undefined. - // You can also pass an attributes object to diff against the model, - // determining if there *would be* a change. - changedAttributes: function(diff) { - if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; - var val, changed = false, old = this._previousAttributes; - for (var attr in diff) { - if (_.isEqual(old[attr], (val = diff[attr]))) continue; - (changed || (changed = {}))[attr] = val; - } - return changed; - }, - - // Get the previous value of an attribute, recorded at the time the last - // `"change"` event was fired. - previous: function(attr) { - if (!arguments.length || !this._previousAttributes) return null; - return this._previousAttributes[attr]; - }, - - // Get all of the attributes of the model at the time of the previous - // `"change"` event. - previousAttributes: function() { - return _.clone(this._previousAttributes); - }, - - // Check if the model is currently in a valid state. It's only possible to - // get into an *invalid* state if you're using silent changes. - isValid: function() { - return !this.validate(this.attributes); - }, - - // Run validation against the next complete set of model attributes, - // returning `true` if all is well. If a specific `error` callback has - // been passed, call that instead of firing the general `"error"` event. - _validate: function(attrs, options) { - if (options.silent || !this.validate) return true; - attrs = _.extend({}, this.attributes, attrs); - var error = this.validate(attrs, options); - if (!error) return true; - if (options && options.error) { - options.error(this, error, options); - } else { - this.trigger('error', this, error, options); - } - return false; - } - - }); - - // Backbone.Collection - // ------------------- - - // Provides a standard collection class for our sets of models, ordered - // or unordered. If a `comparator` is specified, the Collection will maintain - // its models in sort order, as they're added and removed. - var Collection = Backbone.Collection = function(models, options) { - options || (options = {}); - if (options.model) this.model = options.model; - if (options.comparator) this.comparator = options.comparator; - this._reset(); - this.initialize.apply(this, arguments); - if (models) this.reset(models, {silent: true, parse: options.parse}); - }; - - // Define the Collection's inheritable methods. - _.extend(Collection.prototype, Events, { - - // The default model for a collection is just a **Backbone.Model**. - // This should be overridden in most cases. - model: Model, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // The JSON representation of a Collection is an array of the - // models' attributes. - toJSON: function(options) { - return this.map(function(model){ return model.toJSON(options); }); - }, - - // Add a model, or list of models to the set. Pass **silent** to avoid - // firing the `add` event for every new model. - add: function(models, options) { - var i, index, length, model, cid, id, cids = {}, ids = {}, dups = []; - options || (options = {}); - models = _.isArray(models) ? models.slice() : [models]; - - // Begin by turning bare objects into model references, and preventing - // invalid models or duplicate models from being added. - for (i = 0, length = models.length; i < length; i++) { - if (!(model = models[i] = this._prepareModel(models[i], options))) { - throw new Error("Can't add an invalid model to a collection"); - } - cid = model.cid; - id = model.id; - if (cids[cid] || this._byCid[cid] || ((id != null) && (ids[id] || this._byId[id]))) { - dups.push(i); - continue; - } - cids[cid] = ids[id] = model; - } - - // Remove duplicates. - i = dups.length; - while (i--) { - models.splice(dups[i], 1); - } - - // Listen to added models' events, and index models for lookup by - // `id` and by `cid`. - for (i = 0, length = models.length; i < length; i++) { - (model = models[i]).on('all', this._onModelEvent, this); - this._byCid[model.cid] = model; - if (model.id != null) this._byId[model.id] = model; - } - - // Insert models into the collection, re-sorting if needed, and triggering - // `add` events unless silenced. - this.length += length; - index = options.at != null ? options.at : this.models.length; - splice.apply(this.models, [index, 0].concat(models)); - if (this.comparator) this.sort({silent: true}); - if (options.silent) return this; - for (i = 0, length = this.models.length; i < length; i++) { - if (!cids[(model = this.models[i]).cid]) continue; - options.index = i; - model.trigger('add', model, this, options); - } - return this; - }, - - // Remove a model, or a list of models from the set. Pass silent to avoid - // firing the `remove` event for every model removed. - remove: function(models, options) { - var i, l, index, model; - options || (options = {}); - models = _.isArray(models) ? models.slice() : [models]; - for (i = 0, l = models.length; i < l; i++) { - model = this.getByCid(models[i]) || this.get(models[i]); - if (!model) continue; - delete this._byId[model.id]; - delete this._byCid[model.cid]; - index = this.indexOf(model); - this.models.splice(index, 1); - this.length--; - if (!options.silent) { - options.index = index; - model.trigger('remove', model, this, options); - } - this._removeReference(model); - } - return this; - }, - - // Add a model to the end of the collection. - push: function(model, options) { - model = this._prepareModel(model, options); - this.add(model, options); - return model; - }, - - // Remove a model from the end of the collection. - pop: function(options) { - var model = this.at(this.length - 1); - this.remove(model, options); - return model; - }, - - // Add a model to the beginning of the collection. - unshift: function(model, options) { - model = this._prepareModel(model, options); - this.add(model, _.extend({at: 0}, options)); - return model; - }, - - // Remove a model from the beginning of the collection. - shift: function(options) { - var model = this.at(0); - this.remove(model, options); - return model; - }, - - // Get a model from the set by id. - get: function(id) { - if (id == null) return void 0; - return this._byId[id.id != null ? id.id : id]; - }, - - // Get a model from the set by client id. - getByCid: function(cid) { - return cid && this._byCid[cid.cid || cid]; - }, - - // Get the model at the given index. - at: function(index) { - return this.models[index]; - }, - - // Return models with matching attributes. Useful for simple cases of `filter`. - where: function(attrs) { - if (_.isEmpty(attrs)) return []; - return this.filter(function(model) { - for (var key in attrs) { - if (attrs[key] !== model.get(key)) return false; - } - return true; - }); - }, - - // Force the collection to re-sort itself. You don't need to call this under - // normal circumstances, as the set will maintain sort order as each item - // is added. - sort: function(options) { - options || (options = {}); - if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); - var boundComparator = _.bind(this.comparator, this); - if (this.comparator.length == 1) { - this.models = this.sortBy(boundComparator); - } else { - this.models.sort(boundComparator); - } - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Pluck an attribute from each model in the collection. - pluck: function(attr) { - return _.map(this.models, function(model){ return model.get(attr); }); - }, - - // When you have more items than you want to add or remove individually, - // you can reset the entire set with a new list of models, without firing - // any `add` or `remove` events. Fires `reset` when finished. - reset: function(models, options) { - models || (models = []); - options || (options = {}); - for (var i = 0, l = this.models.length; i < l; i++) { - this._removeReference(this.models[i]); - } - this._reset(); - this.add(models, _.extend({silent: true}, options)); - if (!options.silent) this.trigger('reset', this, options); - return this; - }, - - // Fetch the default set of models for this collection, resetting the - // collection when they arrive. If `add: true` is passed, appends the - // models to the collection instead of resetting. - fetch: function(options) { - options = options ? _.clone(options) : {}; - if (options.parse === undefined) options.parse = true; - var collection = this; - var success = options.success; - options.success = function(resp, status, xhr) { - collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options); - if (success) success(collection, resp); - }; - options.error = Backbone.wrapError(options.error, collection, options); - return (this.sync || Backbone.sync).call(this, 'read', this, options); - }, - - // Create a new instance of a model in this collection. Add the model to the - // collection immediately, unless `wait: true` is passed, in which case we - // wait for the server to agree. - create: function(model, options) { - var coll = this; - options = options ? _.clone(options) : {}; - model = this._prepareModel(model, options); - if (!model) return false; - if (!options.wait) coll.add(model, options); - var success = options.success; - options.success = function(nextModel, resp, xhr) { - if (options.wait) coll.add(nextModel, options); - if (success) { - success(nextModel, resp); - } else { - nextModel.trigger('sync', model, resp, options); - } - }; - model.save(null, options); - return model; - }, - - // **parse** converts a response into a list of models to be added to the - // collection. The default implementation is just to pass it through. - parse: function(resp, xhr) { - return resp; - }, - - // Proxy to _'s chain. Can't be proxied the same way the rest of the - // underscore methods are proxied because it relies on the underscore - // constructor. - chain: function () { - return _(this.models).chain(); - }, - - // Reset all internal state. Called when the collection is reset. - _reset: function(options) { - this.length = 0; - this.models = []; - this._byId = {}; - this._byCid = {}; - }, - - // Prepare a model or hash of attributes to be added to this collection. - _prepareModel: function(model, options) { - options || (options = {}); - if (!(model instanceof Model)) { - var attrs = model; - options.collection = this; - model = new this.model(attrs, options); - if (!model._validate(model.attributes, options)) model = false; - } else if (!model.collection) { - model.collection = this; - } - return model; - }, - - // Internal method to remove a model's ties to a collection. - _removeReference: function(model) { - if (this == model.collection) { - delete model.collection; - } - model.off('all', this._onModelEvent, this); - }, - - // Internal method called every time a model in the set fires an event. - // Sets need to update their indexes when models change ids. All other - // events simply proxy through. "add" and "remove" events that originate - // in other collections are ignored. - _onModelEvent: function(event, model, collection, options) { - if ((event == 'add' || event == 'remove') && collection != this) return; - if (event == 'destroy') { - this.remove(model, options); - } - if (model && event === 'change:' + model.idAttribute) { - delete this._byId[model.previous(model.idAttribute)]; - this._byId[model.id] = model; - } - this.trigger.apply(this, arguments); - } - - }); - - // Underscore methods that we want to implement on the Collection. - var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', - 'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', - 'include', 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', - 'toArray', 'size', 'first', 'initial', 'rest', 'last', 'without', 'indexOf', - 'shuffle', 'lastIndexOf', 'isEmpty', 'groupBy']; - - // Mix in each Underscore method as a proxy to `Collection#models`. - _.each(methods, function(method) { - Collection.prototype[method] = function() { - return _[method].apply(_, [this.models].concat(_.toArray(arguments))); - }; - }); - - // Backbone.Router - // ------------------- - - // Routers map faux-URLs to actions, and fire events when routes are - // matched. Creating a new one sets its `routes` hash, if not set statically. - var Router = Backbone.Router = function(options) { - options || (options = {}); - if (options.routes) this.routes = options.routes; - this._bindRoutes(); - this.initialize.apply(this, arguments); - }; - - // Cached regular expressions for matching named param parts and splatted - // parts of route strings. - var namedParam = /:\w+/g; - var splatParam = /\*\w+/g; - var escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g; - - // Set up all inheritable **Backbone.Router** properties and methods. - _.extend(Router.prototype, Events, { - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // Manually bind a single named route to a callback. For example: - // - // this.route('search/:query/p:num', 'search', function(query, num) { - // ... - // }); - // - route: function(route, name, callback) { - Backbone.history || (Backbone.history = new History); - if (!_.isRegExp(route)) route = this._routeToRegExp(route); - if (!callback) callback = this[name]; - Backbone.history.route(route, _.bind(function(fragment) { - var args = this._extractParameters(route, fragment); - callback && callback.apply(this, args); - this.trigger.apply(this, ['route:' + name].concat(args)); - Backbone.history.trigger('route', this, name, args); - }, this)); - return this; - }, - - // Simple proxy to `Backbone.history` to save a fragment into the history. - navigate: function(fragment, options) { - Backbone.history.navigate(fragment, options); - }, - - // Bind all defined routes to `Backbone.history`. We have to reverse the - // order of the routes here to support behavior where the most general - // routes can be defined at the bottom of the route map. - _bindRoutes: function() { - if (!this.routes) return; - var routes = []; - for (var route in this.routes) { - routes.unshift([route, this.routes[route]]); - } - for (var i = 0, l = routes.length; i < l; i++) { - this.route(routes[i][0], routes[i][1], this[routes[i][1]]); - } - }, - - // Convert a route string into a regular expression, suitable for matching - // against the current location hash. - _routeToRegExp: function(route) { - route = route.replace(escapeRegExp, '\\$&') - .replace(namedParam, '([^\/]+)') - .replace(splatParam, '(.*?)'); - return new RegExp('^' + route + '$'); - }, - - // Given a route, and a URL fragment that it matches, return the array of - // extracted parameters. - _extractParameters: function(route, fragment) { - return route.exec(fragment).slice(1); - } - - }); - - // Backbone.History - // ---------------- - - // Handles cross-browser history management, based on URL fragments. If the - // browser does not support `onhashchange`, falls back to polling. - var History = Backbone.History = function() { - this.handlers = []; - _.bindAll(this, 'checkUrl'); - }; - - // Cached regex for cleaning leading hashes and slashes . - var routeStripper = /^[#\/]/; - - // Cached regex for detecting MSIE. - var isExplorer = /msie [\w.]+/; - - // Has the history handling already been started? - History.started = false; - - // Set up all inheritable **Backbone.History** properties and methods. - _.extend(History.prototype, Events, { - - // The default interval to poll for hash changes, if necessary, is - // twenty times a second. - interval: 50, - - // Gets the true hash value. Cannot use location.hash directly due to bug - // in Firefox where location.hash will always be decoded. - getHash: function(windowOverride) { - var loc = windowOverride ? windowOverride.location : window.location; - var match = loc.href.match(/#(.*)$/); - return match ? match[1] : ''; - }, - - // Get the cross-browser normalized URL fragment, either from the URL, - // the hash, or the override. - getFragment: function(fragment, forcePushState) { - if (fragment == null) { - if (this._hasPushState || forcePushState) { - fragment = window.location.pathname; - var search = window.location.search; - if (search) fragment += search; - } else { - fragment = this.getHash(); - } - } - if (!fragment.indexOf(this.options.root)) fragment = fragment.substr(this.options.root.length); - return fragment.replace(routeStripper, ''); - }, - - // Start the hash change handling, returning `true` if the current URL matches - // an existing route, and `false` otherwise. - start: function(options) { - if (History.started) throw new Error("Backbone.history has already been started"); - History.started = true; - - // Figure out the initial configuration. Do we need an iframe? - // Is pushState desired ... is it available? - this.options = _.extend({}, {root: '/'}, this.options, options); - this._wantsHashChange = this.options.hashChange !== false; - this._wantsPushState = !!this.options.pushState; - this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState); - var fragment = this.getFragment(); - var docMode = document.documentMode; - var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); - - if (oldIE) { - this.iframe = $('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow; - this.navigate(fragment); - } - - // Depending on whether we're using pushState or hashes, and whether - // 'onhashchange' is supported, determine how we check the URL state. - if (this._hasPushState) { - $(window).bind('popstate', this.checkUrl); - } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) { - $(window).bind('hashchange', this.checkUrl); - } else if (this._wantsHashChange) { - this._checkUrlInterval = setInterval(this.checkUrl, this.interval); - } - - // Determine if we need to change the base url, for a pushState link - // opened by a non-pushState browser. - this.fragment = fragment; - var loc = window.location; - var atRoot = loc.pathname == this.options.root; - - // If we've started off with a route from a `pushState`-enabled browser, - // but we're currently in a browser that doesn't support it... - if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) { - this.fragment = this.getFragment(null, true); - window.location.replace(this.options.root + '#' + this.fragment); - // Return immediately as browser will do redirect to new url - return true; - - // Or if we've started out with a hash-based route, but we're currently - // in a browser where it could be `pushState`-based instead... - } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) { - this.fragment = this.getHash().replace(routeStripper, ''); - window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment); - } - - if (!this.options.silent) { - return this.loadUrl(); - } - }, - - // Disable Backbone.history, perhaps temporarily. Not useful in a real app, - // but possibly useful for unit testing Routers. - stop: function() { - $(window).unbind('popstate', this.checkUrl).unbind('hashchange', this.checkUrl); - clearInterval(this._checkUrlInterval); - History.started = false; - }, - - // Add a route to be tested when the fragment changes. Routes added later - // may override previous routes. - route: function(route, callback) { - this.handlers.unshift({route: route, callback: callback}); - }, - - // Checks the current URL to see if it has changed, and if it has, - // calls `loadUrl`, normalizing across the hidden iframe. - checkUrl: function(e) { - var current = this.getFragment(); - if (current == this.fragment && this.iframe) current = this.getFragment(this.getHash(this.iframe)); - if (current == this.fragment) return false; - if (this.iframe) this.navigate(current); - this.loadUrl() || this.loadUrl(this.getHash()); - }, - - // Attempt to load the current URL fragment. If a route succeeds with a - // match, returns `true`. If no defined routes matches the fragment, - // returns `false`. - loadUrl: function(fragmentOverride) { - var fragment = this.fragment = this.getFragment(fragmentOverride); - var matched = _.any(this.handlers, function(handler) { - if (handler.route.test(fragment)) { - handler.callback(fragment); - return true; - } - }); - return matched; - }, - - // Save a fragment into the hash history, or replace the URL state if the - // 'replace' option is passed. You are responsible for properly URL-encoding - // the fragment in advance. - // - // The options object can contain `trigger: true` if you wish to have the - // route callback be fired (not usually desirable), or `replace: true`, if - // you wish to modify the current URL without adding an entry to the history. - navigate: function(fragment, options) { - if (!History.started) return false; - if (!options || options === true) options = {trigger: options}; - var frag = (fragment || '').replace(routeStripper, ''); - if (this.fragment == frag) return; - - // If pushState is available, we use it to set the fragment as a real URL. - if (this._hasPushState) { - if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag; - this.fragment = frag; - window.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, frag); - - // If hash changes haven't been explicitly disabled, update the hash - // fragment to store history. - } else if (this._wantsHashChange) { - this.fragment = frag; - this._updateHash(window.location, frag, options.replace); - if (this.iframe && (frag != this.getFragment(this.getHash(this.iframe)))) { - // Opening and closing the iframe tricks IE7 and earlier to push a history entry on hash-tag change. - // When replace is true, we don't want this. - if(!options.replace) this.iframe.document.open().close(); - this._updateHash(this.iframe.location, frag, options.replace); - } - - // If you've told us that you explicitly don't want fallback hashchange- - // based history, then `navigate` becomes a page refresh. - } else { - window.location.assign(this.options.root + fragment); - } - if (options.trigger) this.loadUrl(fragment); - }, - - // Update the hash location, either replacing the current entry, or adding - // a new one to the browser history. - _updateHash: function(location, fragment, replace) { - if (replace) { - location.replace(location.toString().replace(/(javascript:|#).*$/, '') + '#' + fragment); - } else { - location.hash = fragment; - } - } - }); - - // Backbone.View - // ------------- - - // Creating a Backbone.View creates its initial element outside of the DOM, - // if an existing element is not provided... - var View = Backbone.View = function(options) { - this.cid = _.uniqueId('view'); - this._configure(options || {}); - this._ensureElement(); - this.initialize.apply(this, arguments); - this.delegateEvents(); - }; - - // Cached regex to split keys for `delegate`. - var delegateEventSplitter = /^(\S+)\s*(.*)$/; - - // List of view options to be merged as properties. - var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName']; - - // Set up all inheritable **Backbone.View** properties and methods. - _.extend(View.prototype, Events, { - - // The default `tagName` of a View's element is `"div"`. - tagName: 'div', - - // jQuery delegate for element lookup, scoped to DOM elements within the - // current view. This should be prefered to global lookups where possible. - $: function(selector) { - return this.$el.find(selector); - }, - - // Initialize is an empty function by default. Override it with your own - // initialization logic. - initialize: function(){}, - - // **render** is the core function that your view should override, in order - // to populate its element (`this.el`), with the appropriate HTML. The - // convention is for **render** to always return `this`. - render: function() { - return this; - }, - - // Remove this view from the DOM. Note that the view isn't present in the - // DOM by default, so calling this method may be a no-op. - remove: function() { - this.$el.remove(); - return this; - }, - - // For small amounts of DOM Elements, where a full-blown template isn't - // needed, use **make** to manufacture elements, one at a time. - // - // var el = this.make('li', {'class': 'row'}, this.model.escape('title')); - // - make: function(tagName, attributes, content) { - var el = document.createElement(tagName); - if (attributes) $(el).attr(attributes); - if (content) $(el).html(content); - return el; - }, - - // Change the view's element (`this.el` property), including event - // re-delegation. - setElement: function(element, delegate) { - if (this.$el) this.undelegateEvents(); - this.$el = (element instanceof $) ? element : $(element); - this.el = this.$el[0]; - if (delegate !== false) this.delegateEvents(); - return this; - }, - - // Set callbacks, where `this.events` is a hash of - // - // *{"event selector": "callback"}* - // - // { - // 'mousedown .title': 'edit', - // 'click .button': 'save' - // 'click .open': function(e) { ... } - // } - // - // pairs. Callbacks will be bound to the view, with `this` set properly. - // Uses event delegation for efficiency. - // Omitting the selector binds the event to `this.el`. - // This only works for delegate-able events: not `focus`, `blur`, and - // not `change`, `submit`, and `reset` in Internet Explorer. - delegateEvents: function(events) { - if (!(events || (events = getValue(this, 'events')))) return; - this.undelegateEvents(); - for (var key in events) { - var method = events[key]; - if (!_.isFunction(method)) method = this[events[key]]; - if (!method) throw new Error('Method "' + events[key] + '" does not exist'); - var match = key.match(delegateEventSplitter); - var eventName = match[1], selector = match[2]; - method = _.bind(method, this); - eventName += '.delegateEvents' + this.cid; - if (selector === '') { - this.$el.bind(eventName, method); - } else { - this.$el.delegate(selector, eventName, method); - } - } - }, - - // Clears all callbacks previously bound to the view with `delegateEvents`. - // You usually don't need to use this, but may wish to if you have multiple - // Backbone views attached to the same DOM element. - undelegateEvents: function() { - this.$el.unbind('.delegateEvents' + this.cid); - }, - - // Performs the initial configuration of a View with a set of options. - // Keys with special meaning *(model, collection, id, className)*, are - // attached directly to the view. - _configure: function(options) { - if (this.options) options = _.extend({}, this.options, options); - for (var i = 0, l = viewOptions.length; i < l; i++) { - var attr = viewOptions[i]; - if (options[attr]) this[attr] = options[attr]; - } - this.options = options; - }, - - // Ensure that the View has a DOM element to render into. - // If `this.el` is a string, pass it through `$()`, take the first - // matching element, and re-assign it to `el`. Otherwise, create - // an element from the `id`, `className` and `tagName` properties. - _ensureElement: function() { - if (!this.el) { - var attrs = getValue(this, 'attributes') || {}; - if (this.id) attrs.id = this.id; - if (this.className) attrs['class'] = this.className; - this.setElement(this.make(this.tagName, attrs), false); - } else { - this.setElement(this.el, false); - } - } - - }); - - // The self-propagating extend function that Backbone classes use. - var extend = function (protoProps, classProps) { - var child = inherits(this, protoProps, classProps); - child.extend = this.extend; - return child; - }; - - // Set up inheritance for the model, collection, and view. - Model.extend = Collection.extend = Router.extend = View.extend = extend; - - // Backbone.sync - // ------------- - - // Map from CRUD to HTTP for our default `Backbone.sync` implementation. - var methodMap = { - 'create': 'POST', - 'update': 'PUT', - 'delete': 'DELETE', - 'read': 'GET' - }; - - // Override this function to change the manner in which Backbone persists - // models to the server. You will be passed the type of request, and the - // model in question. By default, makes a RESTful Ajax request - // to the model's `url()`. Some possible customizations could be: - // - // * Use `setTimeout` to batch rapid-fire updates into a single request. - // * Send up the models as XML instead of JSON. - // * Persist models via WebSockets instead of Ajax. - // - // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests - // as `POST`, with a `_method` parameter containing the true HTTP method, - // as well as all requests with the body as `application/x-www-form-urlencoded` - // instead of `application/json` with the model in a param named `model`. - // Useful when interfacing with server-side languages like **PHP** that make - // it difficult to read the body of `PUT` requests. - Backbone.sync = function(method, model, options) { - var type = methodMap[method]; - - // Default options, unless specified. - options || (options = {}); - - // Default JSON-request options. - var params = {type: type, dataType: 'json'}; - - // Ensure that we have a URL. - if (!options.url) { - params.url = getValue(model, 'url') || urlError(); - } - - // Ensure that we have the appropriate request data. - if (!options.data && model && (method == 'create' || method == 'update')) { - params.contentType = 'application/json'; - params.data = JSON.stringify(model.toJSON()); - } - - // For older servers, emulate JSON by encoding the request into an HTML-form. - if (Backbone.emulateJSON) { - params.contentType = 'application/x-www-form-urlencoded'; - params.data = params.data ? {model: params.data} : {}; - } - - // For older servers, emulate HTTP by mimicking the HTTP method with `_method` - // And an `X-HTTP-Method-Override` header. - if (Backbone.emulateHTTP) { - if (type === 'PUT' || type === 'DELETE') { - if (Backbone.emulateJSON) params.data._method = type; - params.type = 'POST'; - params.beforeSend = function(xhr) { - xhr.setRequestHeader('X-HTTP-Method-Override', type); - }; - } - } - - // Don't process data on a non-GET request. - if (params.type !== 'GET' && !Backbone.emulateJSON) { - params.processData = false; - } - - // Make the request, allowing the user to override any Ajax options. - return $.ajax(_.extend(params, options)); - }; - - // Wrap an optional error callback with a fallback error event. - Backbone.wrapError = function(onError, originalModel, options) { - return function(model, resp) { - resp = model === originalModel ? resp : model; - if (onError) { - onError(originalModel, resp, options); - } else { - originalModel.trigger('error', originalModel, resp, options); - } - }; - }; - - // Helpers - // ------- - - // Shared empty constructor function to aid in prototype-chain creation. - var ctor = function(){}; - - // Helper function to correctly set up the prototype chain, for subclasses. - // Similar to `goog.inherits`, but uses a hash of prototype properties and - // class properties to be extended. - var inherits = function(parent, protoProps, staticProps) { - var child; - - // The constructor function for the new subclass is either defined by you - // (the "constructor" property in your `extend` definition), or defaulted - // by us to simply call the parent's constructor. - if (protoProps && protoProps.hasOwnProperty('constructor')) { - child = protoProps.constructor; - } else { - child = function(){ parent.apply(this, arguments); }; - } - - // Inherit class (static) properties from parent. - _.extend(child, parent); - - // Set the prototype chain to inherit from `parent`, without calling - // `parent`'s constructor function. - ctor.prototype = parent.prototype; - child.prototype = new ctor(); - - // Add prototype properties (instance properties) to the subclass, - // if supplied. - if (protoProps) _.extend(child.prototype, protoProps); - - // Add static properties to the constructor function, if supplied. - if (staticProps) _.extend(child, staticProps); - - // Correctly set child's `prototype.constructor`. - child.prototype.constructor = child; - - // Set a convenience property in case the parent's prototype is needed later. - child.__super__ = parent.prototype; - - return child; - }; - - // Helper function to get a value from a Backbone object as a property - // or as a function. - var getValue = function(object, prop) { - if (!(object && object[prop])) return null; - return _.isFunction(object[prop]) ? object[prop]() : object[prop]; - }; - - // Throw an error when a URL is needed, and none is supplied. - var urlError = function() { - throw new Error('A "url" property or function must be specified'); - }; - -}).call(this); diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 114e6ccee9e..a9baf041942 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -31,6 +31,7 @@ background: -ms-linear-gradient(top,rgba(0,0,0,0.09),rgba(0,0,0,0)); background: linear-gradient(top,rgba(0,0,0,0.09),rgba(0,0,0,0)); } + .point-of-sale .darker-shadow-top{ position: absolute; top:0; @@ -42,6 +43,7 @@ background: -ms-linear-gradient(top,rgba(0,0,0,0.15),rgba(0,0,0,0)); background: linear-gradient(top,rgba(0,0,0,0.15),rgba(0,0,0,0)); } + /* ********* The black loading screen ********* */ .point-of-sale .loader{ @@ -156,11 +158,11 @@ } .point-of-sale #rightheader button { - color: black; - height:29px; - margin:2px; + color: #273072; + height:27px; + margin:3px; margin-right:0px; - border: 1px solid black; + border: 1px solid #353A7E; background: #7f82ac; background: -webkit-gradient(linear, left top, left bottom, from(#b2b3d7), to(#7f82ac)); background: -moz-linear-gradient(#b2b3d7, #7f82ac); @@ -187,6 +189,33 @@ font-weight: 900; } +/* c) The session buttons */ + +.point-of-sale #rightheader .header-button{ + float:right; + height:32px; + padding-left:10px; + padding-right:10px; + border-right: 1px solid #3a3a3a; + border-left: 1px solid #3a3a3a; + color:#DDD; + line-height:32px; + text-align:center; + cursor: pointer; + + -webkit-transition-property: background; + -webkit-transition-duration: 0.2s; + -webkit-transition-timing-function: ease-out; +} +.point-of-sale #rightheader .header-button:last-child{ + border-left: 1px solid #3a3a3a; +} +.point-of-sale #rightheader .header-button:hover{ + background: rgba(0,0,0,0.2); + text-shadow: #000 0px 0px 3px; + color:#EEE; +} + /* c) The notifications indicator */ .point-of-sale .oe_pos_synch-notification{ @@ -234,7 +263,8 @@ left:0; width:440px; top:0px; - bottom:105px; + /*bottom:105px;*/ + bottom:0; border-right: solid 1px #CECBCB; background-color: white; } @@ -318,7 +348,8 @@ .point-of-sale #rightpane { position: absolute; top: 0; - bottom: 105px; + /*bottom: 105px;*/ + bottom:0; left: 440px; right: 0; vertical-align: top; @@ -454,6 +485,42 @@ cursor: pointer; } +.point-of-sale .category-simple-button{ + position: relative; + display: inline-block; + font-size: 14px; + margin-right:10px; + padding:5px; + + cursor: pointer; + border: 1px solid #cacaca; + border-radius: 4px; + + background: #e2e2e2; + background: -webkit-linear-gradient(#f0f0f0, #e2e2e2); + background: -moz-linear-gradient(#f0f0f0, #e2e2e2); + background: -ms-linear-gradient(#f0f0f0, #e2e2e2); + background: linear-gradient(#f0f0f0, #e2e2e2); + -webkit-box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); + -moz-box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); + box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); +} +.point-of-sale .category-simple-button:hover { + color: white; + background: #7f82ac; + border: 1px solid #7f82ac; + background: -webkit-linear-gradient(#9d9fc5, #7f82ac); + background: -moz-linear-gradient(#9d9fc5, #7f82ac); + background: -ms-linear-gradient(#9d9fc5, #7f82ac); + background: linear-gradient(#9d9fc5, #7f82ac); + + -webkit-transition-property: background, border; + -webkit-transition-duration: 0.2s; + -webkit-transition-timing-function: ease-out; +} + + + .point-of-sale .category-button .category-img { position: relative; width: 120px; @@ -463,7 +530,8 @@ } .point-of-sale .category-button .category-img img { - height: 100px; + max-height: 100px; + max-width: 120px; } .point-of-sale .category-button .category-name { @@ -490,6 +558,7 @@ position:relative; vertical-align: top; display: inline-block; + line-height: 100px; font-size: 11px; margin: 5px; width: 120px; @@ -497,9 +566,9 @@ background:#fff; border: 1px solid #fff; border-radius: 3px; - -webkit-box-shadow: 0px 1px 8px rgba(0,0,0,0.2); - -moz-box-shadow: 0px 1px 8px rgba(0,0,0,0.2); - box-shadow: 0px 1px 8px rgba(0,0,0,0.2); + -webkit-box-shadow: 0px 1px 8px rgba(127,130,172,0.4); + -moz-box-shadow: 0px 1px 8px rgba(127,130,172,0.4); + box-shadow: 0px 1px 8px rgba(127,130,172,0.4); } .point-of-sale .product .product-img { @@ -511,7 +580,8 @@ } .point-of-sale .product .product-img img { - height: 100px; + max-height: 100px; + max-width: 120px; } .point-of-sale .product .price-tag { @@ -520,6 +590,7 @@ right: 2px; vertical-align: top; color: white; + line-height: 14px; background: #7f82ac; padding: 2px 5px; border-radius: 3px; @@ -533,6 +604,7 @@ box-sizing: border-box; bottom:0; top:auto; + line-height: 14px; width:100%; background: -webkit-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); background: -moz-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1)); @@ -598,8 +670,16 @@ display: inline-block; font-size: 1.5em; } +.point-of-sale .greyed-out{ + color: #AAA; +} +.point-of-sale .pos-step-container input{ + font-size: 1em; +} + .point-of-sale .pos-payment-container { text-align: left; + min-width: 500px; } .point-of-sale .pos-payment-container .left-block{ display: inline-block; @@ -648,8 +728,17 @@ width: 300px; background-color: white; margin: 20px; - padding: 10px; + padding: 15px; + padding-bottom:30px; display: inline-block; + font-family: "Inconsolata"; + -webkit-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3); + -moz-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3); + box-shadow: 0px 5px 16px rgba(0,0,0, 0.3); +} +.point-of-sale .pos-sale-ticket .emph{ + font-size: 20px; + margin:5px; } .point-of-sale .pos-sale-ticket table { width: 100%; @@ -660,18 +749,18 @@ } @media print { - #oe_header, #oe_menu, .point-of-sale #topheader, .point-of-sale #leftpane { - display: none; + .point-of-sale #topheader, .point-of-sale #leftpane { + display: none !important; } .point-of-sale #content { - top: 0px; + top: 0px !important; } .point-of-sale #rightpane { - left: 0px; + left: 0px !important; background-color: white; } #receipt-screen header { - display: none; + display: none !important; } #receipt-screen { text-align: left; @@ -761,6 +850,28 @@ font-family: "Inconsolata"; } +/* e) The Welcome Screen */ +.point-of-sale .goodbye-message{ + position: absolute; + left:50%; + top:30%; + width:500px; + height:400px; + margin-left: -250px; + margin-top: -200px; + padding:10px; + padding-top:20px; + text-align:center; + font-size:20px; + font-weight:bold; + background-color: #F0EEEE; + border: 1px solid #E0DDDD; + -webkit-box-shadow: 0px 10px 20px rgba(0,0,0, 0.3); + -moz-box-shadow: 0px 10px 20px rgba(0,0,0, 0.3); + -ms-box-shadow: 0px 10px 20px rgba(0,0,0, 0.3); + z-index:1150; +} + /* ********* The OrderWidget ********* */ .point-of-sale .order-container{ @@ -846,6 +957,10 @@ -moz-transition: background 50ms ease-in-out; transition: background 50ms ease-in-out; } +.point-of-sale .order .orderline.empty:hover{ + background: transparent; + cursor: default; +} .point-of-sale .order .orderline.selected{ background: rgba(140,143,183,0.2); @@ -933,9 +1048,9 @@ background: -moz-linear-gradient(#f0f0f0, #e2e2e2); background: -ms-linear-gradient(#f0f0f0, #e2e2e2); background: linear-gradient(#f0f0f0, #e2e2e2); - -webkit-box-shadow: 0px 2px 2px rgba(0,0,0, 0.3); - -moz-box-shadow: 0px 2px 2px rgba(0,0,0, 0.3); - box-shadow: 0px 2px 2px rgba(0,0,0, 0.3); + -webkit-box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); + -moz-box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); + box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); } .point-of-sale .pos-actionbar .button .label{ margin-top: 37px; @@ -957,6 +1072,23 @@ -webkit-transition-timing-function: ease-out; } +.point-of-sale .pos-actionbar .button.disabled{ + color:#AAA; +} +.point-of-sale .pos-actionbar .button.disabled:hover{ + border: 1px solid #cacaca; + border-radius: 4px; + + background: #e2e2e2; + background: -webkit-linear-gradient(#f0f0f0, #e2e2e2); + background: -moz-linear-gradient(#f0f0f0, #e2e2e2); + background: -ms-linear-gradient(#f0f0f0, #e2e2e2); + background: linear-gradient(#f0f0f0, #e2e2e2); + -webkit-box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); + -moz-box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); + box-shadow: 0px 2px 2px rgba(0,0,0, 0.1); +} + .point-of-sale .pos-actionbar .button.rightalign{ float:right; } diff --git a/addons/point_of_sale/static/src/img/default_category_photo.png b/addons/point_of_sale/static/src/img/default_category_photo.png Binary files differnew file mode 100644 index 00000000000..25af75ee815 --- /dev/null +++ b/addons/point_of_sale/static/src/img/default_category_photo.png diff --git a/addons/point_of_sale/static/src/img/icons/bancontact.svg b/addons/point_of_sale/static/src/img/icons/bancontact.svg new file mode 100644 index 00000000000..70604078014 --- /dev/null +++ b/addons/point_of_sale/static/src/img/icons/bancontact.svg @@ -0,0 +1,1114 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + overflow="visible" + enable-background="new 0 0 128 129.396" + xml:space="preserve" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.48.3.1 r9886" + sodipodi:docname="scan.svg" + version="1.0" + inkscape:export-filename="/home/fva/Code/openerp/src/addons/trunk-pos-fva/point_of_sale/static/src/img/scan.png" + inkscape:export-xdpi="600" + inkscape:export-ydpi="600" + inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata + id="metadata367"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><cc:license + rdf:resource="http://creativecommons.org/licenses/publicdomain/" /><dc:title></dc:title><dc:creator><cc:Agent><dc:title>Jakub Steiner</dc:title></cc:Agent></dc:creator><dc:source>http://jimmac.musichall.cz</dc:source><dc:subject><rdf:Bag><rdf:li>home</rdf:li><rdf:li>return</rdf:li><rdf:li>go</rdf:li><rdf:li>default</rdf:li><rdf:li>user</rdf:li><rdf:li>directory</rdf:li></rdf:Bag></dc:subject><dc:contributor><cc:Agent><dc:title>Tuomas Kuosmanen</dc:title></cc:Agent></dc:contributor></cc:Work><cc:License + rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits + rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits + rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF></metadata><defs + id="defs365"><linearGradient + inkscape:collect="always" + id="linearGradient4977"><stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="0" + id="stop4979" /><stop + style="stop-color:#ff0000;stop-opacity:0" + offset="1" + id="stop4981" /></linearGradient><inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 24 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="48 : 24 : 1" + inkscape:persp3d-origin="24 : 16 : 1" + id="perspective92" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5031" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + inkscape:collect="always" + id="linearGradient5060"><stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop5062" /><stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5064" /></linearGradient><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5029" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + id="linearGradient5048"><stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop5050" /><stop + id="stop5056" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /><stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5052" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient5027" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><linearGradient + id="linearGradient2406"><stop + style="stop-color:#7c7e79;stop-opacity:1;" + offset="0" + id="stop2408" /><stop + id="stop2414" + offset="0.1724138" + style="stop-color:#848681;stop-opacity:1;" /><stop + style="stop-color:#898c86;stop-opacity:1;" + offset="1" + id="stop2410" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2390"><stop + style="stop-color:#919191;stop-opacity:1;" + offset="0" + id="stop2392" /><stop + style="stop-color:#919191;stop-opacity:0;" + offset="1" + id="stop2394" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2378"><stop + style="stop-color:#575757;stop-opacity:1;" + offset="0" + id="stop2380" /><stop + style="stop-color:#575757;stop-opacity:0;" + offset="1" + id="stop2382" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2368"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop2370" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop2372" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2349"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop2351" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop2353" /></linearGradient><linearGradient + id="linearGradient2341"><stop + id="stop2343" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /><stop + id="stop2345" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient2329"><stop + style="stop-color:#000000;stop-opacity:0.18556701;" + offset="0" + id="stop2331" /><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop2333" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2319"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop2321" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop2323" /></linearGradient><linearGradient + id="linearGradient2307"><stop + style="stop-color:#edd400;stop-opacity:1;" + offset="0" + id="stop2309" /><stop + style="stop-color:#998800;stop-opacity:1;" + offset="1" + id="stop2311" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2299"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop2301" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop2303" /></linearGradient><linearGradient + id="XMLID_2_" + gradientUnits="userSpaceOnUse" + x1="80.223602" + y1="117.5205" + x2="48.046001" + y2="59.7995" + gradientTransform="matrix(0.314683,0.000000,0.000000,0.314683,4.128264,3.742874)"> + <stop + offset="0" + style="stop-color:#CCCCCC" + id="stop17" /> + <stop + offset="0.9831" + style="stop-color:#FFFFFF" + id="stop19" /> + <midPointStop + offset="0" + style="stop-color:#CCCCCC" + id="midPointStop48" /> + <midPointStop + offset="0.5" + style="stop-color:#CCCCCC" + id="midPointStop50" /> + <midPointStop + offset="0.9831" + style="stop-color:#FFFFFF" + id="midPointStop52" /> + </linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient1514" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.336922,0,0,0.166888,209.74433,15.46151)" + x1="52.006104" + y1="166.1331" + x2="14.049017" + y2="-42.218513" /><linearGradient + id="XMLID_39_" + gradientUnits="userSpaceOnUse" + x1="64.387703" + y1="65.124001" + x2="64.387703" + y2="35.569" + gradientTransform="matrix(0.354101,0,0,0.354101,193.40013,-0.08364921)"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop336" /> + <stop + offset="0.8539" + style="stop-color:#FF6200" + id="stop338" /> + <stop + offset="1" + style="stop-color:#F25D00" + id="stop340" /> + <midPointStop + offset="0" + style="stop-color:#FFFFFF" + id="midPointStop335" /> + <midPointStop + offset="0.5" + style="stop-color:#FFFFFF" + id="midPointStop337" /> + <midPointStop + offset="0.8539" + style="stop-color:#FF6200" + id="midPointStop339" /> + <midPointStop + offset="0.5" + style="stop-color:#FF6200" + id="midPointStop341" /> + <midPointStop + offset="1" + style="stop-color:#F25D00" + id="midPointStop343" /> + </linearGradient><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2299" + id="radialGradient2305" + cx="7.5326638" + cy="24.202574" + fx="7.5326638" + fy="24.202574" + r="8.2452128" + gradientTransform="matrix(4.100086,0,0,4.201322,166.34639,-78.53967)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2307" + id="radialGradient2313" + cx="19.985598" + cy="36.77816" + fx="19.985598" + fy="36.77816" + r="1.0821035" + gradientTransform="matrix(1.125263,0,0,0.982744,188.33278,0.565787)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2319" + id="radialGradient2325" + cx="20.443665" + cy="37.425829" + fx="20.443665" + fy="37.425829" + r="1.0821035" + gradientTransform="matrix(1.125263,0,0,0.982744,188.33278,0.731106)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2329" + id="linearGradient2335" + x1="17.602522" + y1="26.057423" + x2="17.682528" + y2="32.654099" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.898789,0,0,1.071914,192.23948,-2.080838)" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2341" + id="radialGradient2339" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(4.100086,0,0,-4.201322,186.56334,105.3535)" + cx="11.68129" + cy="19.554111" + fx="11.68129" + fy="19.554111" + r="8.2452126" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2349" + id="radialGradient2355" + cx="24.023088" + cy="40.56913" + fx="24.023088" + fy="40.56913" + r="16.28684" + gradientTransform="matrix(1.000000,0.000000,0.000000,0.431250,1.157278e-15,23.07369)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2368" + id="radialGradient2374" + cx="29.913452" + cy="30.442923" + fx="29.913452" + fy="30.442923" + r="4.0018832" + gradientTransform="matrix(3.751495,0,0,3.147818,109.75238,-65.70704)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2378" + id="radialGradient2384" + cx="24.195112" + cy="10.577631" + fx="24.195112" + fy="10.577631" + r="15.242914" + gradientTransform="matrix(1.125263,-3.585417e-8,4.269819e-8,1.340059,188.75475,1.355395)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2390" + id="linearGradient2396" + x1="30.603519" + y1="37.337803" + x2="30.603519" + y2="36.112415" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.263867,0,0,0.859794,-6.499556,8.390924)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2406" + id="linearGradient2412" + x1="17.850183" + y1="28.939463" + x2="19.040216" + y2="41.03223" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.888785,0,0,1.08932,194.17244,-1.524336)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient4689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4691" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4693" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient4894" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4896" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4898" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><filter + inkscape:collect="always" + id="filter4971" + x="-0.064853556" + width="1.1297071" + y="-1.9456067" + height="4.8912134"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.81066946" + id="feGaussianBlur4973" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient5083" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5085" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5087" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4977" + id="linearGradient5089" + gradientUnits="userSpaceOnUse" + x1="23.6875" + y1="32" + x2="23.75" + y2="45.25" /><filter + inkscape:collect="always" + id="filter5243"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.6535853" + id="feGaussianBlur5245" /></filter></defs><sodipodi:namedview + inkscape:cy="24.435456" + inkscape:cx="20.268092" + inkscape:zoom="8" + inkscape:window-height="1176" + inkscape:window-width="1855" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="0.21568627" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:showpageshadow="false" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:current-layer="svg2" + fill="#555753" + showgrid="true" + stroke="#a40000" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false" + inkscape:window-maximized="1"><inkscape:grid + type="xygrid" + id="grid3818" /></sodipodi:namedview> + <g + style="display:inline" + id="g5022" + transform="matrix(0.02158196,0,0,0.01859457,234.88396,41.63767)"><rect + y="-150.69685" + x="-1559.2523" + height="478.35718" + width="1339.6335" + id="rect4173" + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path + sodipodi:nodetypes="cccc" + id="path5058" + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + id="path5018" + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" /></g><path + style="color:#000000;fill:url(#linearGradient1514);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.0000006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 213.38103,8.1833733 5.95746,0 c 0.83973,0 13.88647,15.4353277 13.88647,16.3406587 l -0.44352,18.496745 c 0,0.905333 -0.67603,1.634177 -1.51576,1.634177 l -31.45728,0 c -0.83973,0 -1.51576,-0.728844 -1.51576,-1.634177 l 0.0565,-18.496745 c 0,-0.905331 14.19218,-16.3406587 15.03191,-16.3406587 z" + id="rect1512" + sodipodi:nodetypes="ccccccccc" + inkscape:connector-curvature="0" /><path + style="fill:none" + id="path5" + d="m 238.72503,45.735573 -45.3249,0 0,-45.32489746 45.3249,0 0,45.32489746 z" + inkscape:connector-curvature="0" /><path + style="fill:url(#linearGradient2335);fill-opacity:1;fill-rule:evenodd" + id="path2327" + d="m 214.76145,29 -0.0457,15.090942 -11.84279,0 L 202.76145,29 l 12,0 z" + clip-rule="evenodd" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><path + sodipodi:nodetypes="ccccccccc" + id="path2357" + d="m 213.54191,9.405584 5.5591,0 c 0.78358,0 13.00087,14.399588 13.00087,15.244172 l -0.34716,18.212311 c 0,0.459259 -0.14374,0.653465 -0.51237,0.653465 l -31.38721,0.01428 c -0.36863,0 -0.58396,-0.07992 -0.58396,-0.45355 l 0.21534,-18.426506 c 0,-0.844584 13.27181,-15.244172 14.05539,-15.244172 z" + style="opacity:0.3125;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + clip-rule="evenodd" + d="m 198.96898,27.943053 -0.0543,2.595194 18.36817,-13.179254 15.28639,11.154428 0.0713,-0.311714 -16.37045,-15.904131 -17.30116,15.645477 z" + id="path23" + style="opacity:0.2;fill:url(#radialGradient2384);fill-opacity:1;fill-rule:evenodd" + sodipodi:nodetypes="ccccccc" + inkscape:connector-curvature="0" /><path + clip-rule="evenodd" + d="m 213.76145,30 0,14.090942 -9.81103,0 L 203.76145,30 l 10,0 z" + id="path188" + style="fill:url(#linearGradient2412);fill-opacity:1;fill-rule:evenodd" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><path + style="opacity:0.40909089;fill:url(#radialGradient2325);fill-opacity:1;fill-rule:evenodd" + id="path2315" + d="m 211.33831,36.44767 c 0.67279,0 1.21662,0.474605 1.21662,1.058507 0,0.589811 -0.54383,1.068355 -1.21662,1.068355 -0.67227,0 -1.21869,-0.478544 -1.21869,-1.068355 5.2e-4,-0.583902 0.54642,-1.058507 1.21869,-1.058507 z" + clip-rule="evenodd" + inkscape:connector-curvature="0" /><path + clip-rule="evenodd" + d="m 211.22377,35.932229 c 0.67279,0 1.21661,0.474605 1.21661,1.058507 0,0.589809 -0.54382,1.068353 -1.21661,1.068353 -0.67228,0 -1.21869,-0.478544 -1.21869,-1.068353 5.2e-4,-0.583902 0.54641,-1.058507 1.21869,-1.058507 z" + id="path217" + style="fill:url(#radialGradient2313);fill-opacity:1;fill-rule:evenodd" + inkscape:connector-curvature="0" /><path + d="m 216.2092,11.559337 18.92706,17.169868 0.49468,0.391991 0.40368,-0.171385 -0.37287,-0.761673 -0.27762,-0.223436 -19.17493,-15.572306 -19.38951,15.743335 -0.23761,0.14412 -0.21671,0.706786 0.43342,0.129248 0.38456,-0.308423 19.02585,-17.248125 z" + id="path342" + style="fill:url(#XMLID_39_)" + sodipodi:nodetypes="ccccccccccccc" + inkscape:connector-curvature="0" /><path + style="fill:#ef2929;stroke:#a40000" + id="path362" + d="m 216.09162,2.2713382 -21.88174,18.1013368 -0.62473,7.165928 1.99994,2.064323 c 0,0 20.40738,-17.157285 20.62409,-17.327963 l 19.63254,17.54326 1.89843,-2.323997 -1.61579,-7.111374 -19.91518,-18.2159732 -0.11756,0.1044594 z" + sodipodi:nodetypes="cccccccccc" + inkscape:connector-curvature="0" /> +<path + style="opacity:0.40909089;color:#000000;fill:url(#radialGradient2305);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="M 194.6028,20.613129 194.31124,27.236494 216.13067,8.980075 216.06034,3.0867443 194.6028,20.613129 z" + id="path1536" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><path + sodipodi:nodetypes="ccccc" + id="path2337" + d="m 216.24522,8.7509884 0.0995,-5.8411017 19.32896,17.6519533 1.49181,6.500812 -20.92023,-18.3116636 z" + style="opacity:0.13636367;color:#000000;fill:url(#radialGradient2339);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + style="opacity:0.31818183;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999934;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 218.86368,27.719824 9.04,0 c 0.77059,0 1.39096,0.62037 1.39096,1.390967 l -0.008,9.079221 c 0,0.770596 -0.59632,1.265969 -1.36691,1.265969 l -9.05609,0 c -0.77059,0 -1.39096,-0.620373 -1.39096,-1.390969 l 0,-8.954221 c 0,-0.770597 0.62037,-1.390967 1.39096,-1.390967 z" + id="rect2361" + sodipodi:nodetypes="ccccccccc" + inkscape:connector-curvature="0" /><rect + style="color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect3263" + width="10.001333" + height="9.9624557" + x="218.26923" + y="28.514256" + rx="0.38128215" + ry="0.38128215" /><path + style="opacity:0.39772728;color:#000000;fill:url(#radialGradient2374);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999958;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 218.86857,34.408261 c 3.61798,0.331177 5.52773,-1.445704 8.86815,-1.55274 l 0.0247,-3.849491 -8.91161,-0.006 0.0187,5.408261 z" + id="rect2363" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><g + transform="translate(132.18771,2.0108349)" + id="g4739"><path + sodipodi:type="arc" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4741" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" /><path + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4743" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /></g><g + id="g4733" + transform="translate(143.14786,5.0160386)"><path + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4735" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4737" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" /></g><g + transform="translate(137.13746,7.0268736)" + id="g4727"><path + sodipodi:type="arc" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4729" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" /><path + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4731" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /></g><g + id="g4723" + transform="translate(125.91213,5.9662134)"><path + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4719" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4721" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" /></g><g + id="g4695" + transform="matrix(1.1326331,0,0,0.44340824,131.83019,2.4215088)"><rect + style="fill:#8a8a8a;fill-opacity:1;stroke:none" + id="rect4697" + width="29.256544" + height="18.119614" + x="10.297243" + y="27.449707" + rx="1.7190553" + ry="4.3911204" /><g + id="g4699"><g + id="g4701"><rect + rx="1.7051755" + y="27.517153" + x="10.510214" + height="17.982044" + width="29.020325" + id="rect4703" + style="fill:none;stroke:#646464;stroke-width:1.41005611;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + ry="4.3556657" /></g><rect + rx="0.88575488" + y="29.624025" + x="11.337327" + height="13.83156" + width="27.319036" + id="rect4705" + style="fill:none;stroke:#b3b3b3;stroke-width:1.40048993;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + ry="2.2625546" /></g></g><g + transform="matrix(0.01936185,0,0,0.01859457,177.66659,40.621203)" + id="g4681" + style="display:inline"><rect + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient4689);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect4683" + width="1339.6335" + height="478.35718" + x="-1559.2523" + y="-150.69685" /><path + inkscape:connector-curvature="0" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4691);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" + id="path4685" + sodipodi:nodetypes="cccc" /><path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" + id="path4687" + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4693);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /></g><g + id="g4672" + transform="translate(135.19291,-2.9168155)"><rect + ry="1.9470588" + rx="1.9470588" + y="27.449707" + x="10.297243" + height="18.119614" + width="29.256544" + id="rect4658" + style="fill:#dddddd;fill-opacity:1;stroke:none" /><g + id="g4667"><g + id="g4664"><rect + ry="1.9313381" + style="fill:none;stroke:#646464;stroke-width:0.99927008;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4660" + width="29.020325" + height="17.982044" + x="10.510214" + y="27.517153" + rx="1.9313381" /></g><rect + ry="1.0032353" + style="fill:none;stroke:#f6f6f6;stroke-width:0.99249077;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4662" + width="26.967867" + height="16.005489" + x="11.532422" + y="28.489801" + rx="1.0032353" /></g></g><path + transform="matrix(1.0023678,0,0,0.95596394,135.13372,-0.0273148)" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + sodipodi:ry="10" + sodipodi:rx="10" + sodipodi:cy="33" + sodipodi:cx="25" + id="path4679" + style="fill:#b8b8b8;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:#b8b8b8;fill-opacity:1;fill-rule:evenodd;stroke:#646464;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path3820" + sodipodi:cx="25" + sodipodi:cy="33" + sodipodi:rx="10" + sodipodi:ry="10" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + transform="matrix(0.94933484,0,0,0.95596394,136.45954,-1.4857225)" /><path + transform="matrix(0.6928006,0,0,0.69727163,142.8508,8.0344445)" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + sodipodi:ry="10" + sodipodi:rx="10" + sodipodi:cy="33" + sodipodi:cx="25" + id="path4590" + style="fill:#f4f4f4;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:type="arc" /><g + id="g4644" + transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,165.84459,-10.924363)"><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4646" + width="0.68500972" + height="1.1490486" + x="24.638252" + y="26.853086" /><rect + y="37.990021" + x="24.660349" + height="1.1490486" + width="0.68500972" + id="rect4648" + style="fill:#232323;fill-opacity:1;stroke:none" /></g><g + id="g4600" + style="fill:#a2a2a2;fill-opacity:1" + transform="translate(135.2592,-2.3643883)"><rect + style="fill:#a2a2a2;fill-opacity:1;stroke:none" + id="rect4602" + width="1" + height="5.9375" + x="40.742825" + y="-1.6325631" + transform="matrix(0.67898035,0.73415645,-0.73415645,0.67898035,0,0)" /><path + sodipodi:type="arc" + style="fill:#a2a2a2;fill-opacity:1;stroke:none" + id="path4604" + sodipodi:cx="25.03125" + sodipodi:cy="33.03125" + sodipodi:rx="1.03125" + sodipodi:ry="0.96875" + d="M 26.0625,33.03125 C 26.0625,33.566276 25.600794,34 25.03125,34 24.461706,34 24,33.566276 24,33.03125 c 0,-0.535026 0.461706,-0.96875 1.03125,-0.96875 0.569544,0 1.03125,0.433724 1.03125,0.96875 z" + transform="matrix(0.95714504,0,0,1.0228099,1.028519,-0.77553647)" /></g><g + id="g4596" + transform="translate(135.19291,-2.9168155)"><rect + transform="matrix(0.67898035,0.73415645,-0.73415645,0.67898035,0,0)" + y="-1.6325631" + x="40.742825" + height="5.9375" + width="1" + id="rect4592" + style="fill:#ff2121;fill-opacity:1;stroke:none" /><path + transform="matrix(0.95714504,0,0,1.0228099,1.028519,-0.77553647)" + d="M 26.0625,33.03125 C 26.0625,33.566276 25.600794,34 25.03125,34 24.461706,34 24,33.566276 24,33.03125 c 0,-0.535026 0.461706,-0.96875 1.03125,-0.96875 0.569544,0 1.03125,0.433724 1.03125,0.96875 z" + sodipodi:ry="0.96875" + sodipodi:rx="1.03125" + sodipodi:cy="33.03125" + sodipodi:cx="25.03125" + id="path4594" + style="fill:#ff2121;fill-opacity:1;stroke:none" + sodipodi:type="arc" /></g><path + sodipodi:type="arc" + style="fill:none;stroke:#646464;stroke-width:1.37966764;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4608" + sodipodi:cx="25" + sodipodi:cy="33" + sodipodi:rx="10" + sodipodi:ry="10" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + transform="matrix(0.74693846,0,0,0.74919978,141.5084,5.3595919)" /><g + id="g4628" + transform="translate(135.19291,-2.9168155)"><rect + y="26.853086" + x="24.638252" + height="1.1490486" + width="0.68500972" + id="rect4624" + style="fill:#232323;fill-opacity:1;stroke:none" /><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4626" + width="0.68500972" + height="1.1490486" + x="24.660349" + y="37.990021" /></g><g + id="g4632" + transform="matrix(0,1,-1,0,193.18079,5.087457)"><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4634" + width="0.68500972" + height="1.1490486" + x="24.638252" + y="26.853086" /><rect + y="37.990021" + x="24.660349" + height="1.1490486" + width="0.68500972" + id="rect4636" + style="fill:#232323;fill-opacity:1;stroke:none" /></g><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4640" + width="0.68500972" + height="1.1490486" + x="-92.352005" + y="-140.67993" + transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)" /><rect + y="-129.543" + x="-92.329903" + height="1.1490486" + width="0.68500972" + id="rect4642" + style="fill:#232323;fill-opacity:1;stroke:none" + transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)" /><g + transform="matrix(1.2021267,0,0,0.11694557,130.11353,11.401153)" + id="g4707"><rect + ry="16.649275" + rx="1.6196786" + y="27.449707" + x="10.297243" + height="18.119614" + width="29.256544" + id="rect4709" + style="fill:#d4d4d4;fill-opacity:1;stroke:none" /><g + id="g4711"><g + id="g4713"><rect + ry="16.514845" + style="fill:none;stroke:#646464;stroke-width:2.66511464;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4715" + width="29.020325" + height="17.982044" + x="10.510214" + y="27.517153" + rx="1" /></g></g></g><g + style="display:inline" + id="g4874" + transform="matrix(0.01936185,0,0,0.01859457,41.505849,29.496203)"><rect + y="-150.69685" + x="-1559.2523" + height="478.35718" + width="1339.6335" + id="rect4876" + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient4894);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path + sodipodi:nodetypes="cccc" + id="path4878" + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4896);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4898);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + id="path4880" + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" /></g><g + transform="translate(89,-11.125)" + id="g5031"><g + style="display:inline" + id="g5033" + transform="matrix(0.01936185,0,0,0.01859457,41.505849,40.621203)"><rect + y="-150.69685" + x="-1559.2523" + height="478.35718" + width="1339.6335" + id="rect5035" + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5083);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path + sodipodi:nodetypes="cccc" + id="path5037" + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5085);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5087);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + id="path5039" + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" /></g><g + transform="translate(-0.96783034,-2.9168155)" + id="g5041"><rect + style="fill:#eaeaea;fill-opacity:1;stroke:none" + id="rect5043" + width="29.256544" + height="18.119614" + x="10.297243" + y="27.449707" + rx="1.9470588" + ry="1.9470588" /><g + id="g5045"><g + id="g5047"><rect + rx="1.9313381" + y="27.517153" + x="10.510214" + height="17.982044" + width="29.020325" + id="rect5049" + style="fill:none;stroke:#646464;stroke-width:0.99927008;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + ry="1.9313381" /></g><rect + rx="1.0032353" + y="28.489801" + x="11.532422" + height="16.005489" + width="26.967867" + id="rect5051" + style="fill:none;stroke:#ffffff;stroke-width:0.99249077;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + ry="1.0032353" /></g></g><g + id="g5053" + transform="matrix(1,0,0,0.9039548,0,2.5932203)"><rect + y="27" + x="13.0625" + height="11.0625" + width="1" + id="rect5055" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect5057" + width="1" + height="11.0625" + x="15.0625" + y="27" /><rect + y="27" + x="18" + height="11.0625" + width="1" + id="rect5059" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect5061" + width="2" + height="11.0625" + x="19.9375" + y="27" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect5063" + width="1" + height="11.0625" + x="22.9375" + y="27" /><rect + y="27" + x="25.9375" + height="11.0625" + width="2.0625" + id="rect5065" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect5067" + width="1.125" + height="11.0625" + x="28.9375" + y="27" /><rect + y="27" + x="30.9375" + height="11.0625" + width="1.125" + id="rect5069" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect5071" + width="1.125" + height="11.0625" + x="33.9375" + y="27" /></g><text + xml:space="preserve" + style="font-size:36.59571838px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="12.981453" + y="40.195068" + id="text5073" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5075" + x="12.981453" + y="40.195068" + style="font-size:3.65957189px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium">5 92102431 8</tspan></text> +<rect + style="fill:#ff0000;fill-opacity:1;stroke:none" + id="rect5077" + width="30" + height="1" + x="9.0625" + y="31.0625" /><rect + y="31.0625" + x="9.0625" + height="1" + width="30" + id="rect5079" + style="fill:#ff0000;fill-opacity:1;stroke:none;filter:url(#filter4971)" /><path + style="opacity:0.29787233;fill:url(#linearGradient5089);fill-opacity:1;stroke:none" + d="M 9.0625,32.0625 20,47.875 28.9375,47.9375 39,32.0625 z" + id="path5081" + inkscape:connector-curvature="0" /></g><g + id="g5153" + transform="translate(-0.375,0.125)"><rect + style="fill:#eaeaea;fill-opacity:1;stroke:none" + id="rect4884" + width="29.256544" + height="18.119614" + x="9.3294125" + y="13.407891" + rx="1.9470588" + ry="1.9470588" /><rect + rx="1.9313381" + y="12.503065" + x="9.5423832" + height="18.954315" + width="29.020325" + id="rect4890" + style="fill:none;stroke:#2055a8;stroke-width:0.99927008;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + ry="1.9313381" /><rect + ry="1.0032355" + style="fill:none;stroke:#ffffff;stroke-width:0.99249083;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4892" + width="26.967867" + height="16.933567" + x="10.564591" + y="13.519909" + rx="1.0032353" /><text + sodipodi:linespacing="125%" + id="text5127" + y="17.738876" + x="12.598053" + style="font-size:4.47580385px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#2055a8;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#2055a8;fill-opacity:1;font-family:Umpush;-inkscape-font-specification:Umpush Bold" + y="17.738876" + x="12.598053" + id="tspan5129" + sodipodi:role="line">Bancontact</tspan></text> +<text + xml:space="preserve" + style="font-size:4.67030001px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#2055a8;fill-opacity:1;stroke:none;font-family:Sans" + x="12.626733" + y="29.062328" + id="text5131" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5133" + x="12.626733" + y="29.062328" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#2055a8;fill-opacity:1;font-family:Umpush;-inkscape-font-specification:Umpush Bold">Mistercash</tspan></text> +<rect + y="21.973692" + x="13.037281" + height="2.032932" + width="12.241786" + id="rect5135" + style="fill:#2055a8;fill-opacity:1;stroke:none" /><rect + transform="scale(-1,-1)" + style="fill:#ffd91c;fill-opacity:1;stroke:none" + id="rect5145" + width="12.330174" + height="2.032932" + x="-35.045982" + y="-22.058022" /><rect + y="-27.366743" + x="-38.048687" + height="3.6166389" + width="2.9610093" + id="rect5147" + style="fill:#ffd91c;fill-opacity:1;stroke:none" + transform="matrix(-1,0,0.53766595,-0.84315795,0,0)" /><rect + transform="matrix(1,0,-0.53766595,0.84315795,0,0)" + style="fill:#2055a8;fill-opacity:1;stroke:none" + id="rect5137" + width="2.9610093" + height="3.6166389" + x="37.977596" + y="24.850821" /></g></svg>
\ No newline at end of file diff --git a/addons/point_of_sale/static/src/img/icons/scan.svg b/addons/point_of_sale/static/src/img/icons/scan.svg new file mode 100644 index 00000000000..4d753acf638 --- /dev/null +++ b/addons/point_of_sale/static/src/img/icons/scan.svg @@ -0,0 +1,984 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48" + height="48" + overflow="visible" + enable-background="new 0 0 128 129.396" + xml:space="preserve" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.48.3.1 r9886" + sodipodi:docname="scale.svg" + version="1.0" + inkscape:export-filename="/home/fva/Code/openerp/src/addons/trunk-pos-fva/point_of_sale/static/src/img/scale.png" + inkscape:export-xdpi="600" + inkscape:export-ydpi="600" + inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata + id="metadata367"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><cc:license + rdf:resource="http://creativecommons.org/licenses/publicdomain/" /><dc:title></dc:title><dc:creator><cc:Agent><dc:title>Jakub Steiner</dc:title></cc:Agent></dc:creator><dc:source>http://jimmac.musichall.cz</dc:source><dc:subject><rdf:Bag><rdf:li>home</rdf:li><rdf:li>return</rdf:li><rdf:li>go</rdf:li><rdf:li>default</rdf:li><rdf:li>user</rdf:li><rdf:li>directory</rdf:li></rdf:Bag></dc:subject><dc:contributor><cc:Agent><dc:title>Tuomas Kuosmanen</dc:title></cc:Agent></dc:contributor></cc:Work><cc:License + rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits + rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits + rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF></metadata><defs + id="defs365"><linearGradient + inkscape:collect="always" + id="linearGradient4977"><stop + style="stop-color:#ff0000;stop-opacity:1;" + offset="0" + id="stop4979" /><stop + style="stop-color:#ff0000;stop-opacity:0" + offset="1" + id="stop4981" /></linearGradient><inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 24 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="48 : 24 : 1" + inkscape:persp3d-origin="24 : 16 : 1" + id="perspective92" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5031" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + inkscape:collect="always" + id="linearGradient5060"><stop + style="stop-color:black;stop-opacity:1;" + offset="0" + id="stop5062" /><stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5064" /></linearGradient><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient5029" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + id="linearGradient5048"><stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop5050" /><stop + id="stop5056" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /><stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop5052" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient5027" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><linearGradient + id="linearGradient2406"><stop + style="stop-color:#7c7e79;stop-opacity:1;" + offset="0" + id="stop2408" /><stop + id="stop2414" + offset="0.1724138" + style="stop-color:#848681;stop-opacity:1;" /><stop + style="stop-color:#898c86;stop-opacity:1;" + offset="1" + id="stop2410" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2390"><stop + style="stop-color:#919191;stop-opacity:1;" + offset="0" + id="stop2392" /><stop + style="stop-color:#919191;stop-opacity:0;" + offset="1" + id="stop2394" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2378"><stop + style="stop-color:#575757;stop-opacity:1;" + offset="0" + id="stop2380" /><stop + style="stop-color:#575757;stop-opacity:0;" + offset="1" + id="stop2382" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2368"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop2370" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop2372" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2349"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop2351" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop2353" /></linearGradient><linearGradient + id="linearGradient2341"><stop + id="stop2343" + offset="0" + style="stop-color:#000000;stop-opacity:1;" /><stop + id="stop2345" + offset="1" + style="stop-color:#000000;stop-opacity:0;" /></linearGradient><linearGradient + id="linearGradient2329"><stop + style="stop-color:#000000;stop-opacity:0.18556701;" + offset="0" + id="stop2331" /><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop2333" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2319"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop2321" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop2323" /></linearGradient><linearGradient + id="linearGradient2307"><stop + style="stop-color:#edd400;stop-opacity:1;" + offset="0" + id="stop2309" /><stop + style="stop-color:#998800;stop-opacity:1;" + offset="1" + id="stop2311" /></linearGradient><linearGradient + inkscape:collect="always" + id="linearGradient2299"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop2301" /><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop2303" /></linearGradient><linearGradient + id="XMLID_2_" + gradientUnits="userSpaceOnUse" + x1="80.223602" + y1="117.5205" + x2="48.046001" + y2="59.7995" + gradientTransform="matrix(0.314683,0.000000,0.000000,0.314683,4.128264,3.742874)"> + <stop + offset="0" + style="stop-color:#CCCCCC" + id="stop17" /> + <stop + offset="0.9831" + style="stop-color:#FFFFFF" + id="stop19" /> + <midPointStop + offset="0" + style="stop-color:#CCCCCC" + id="midPointStop48" /> + <midPointStop + offset="0.5" + style="stop-color:#CCCCCC" + id="midPointStop50" /> + <midPointStop + offset="0.9831" + style="stop-color:#FFFFFF" + id="midPointStop52" /> + </linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#XMLID_2_" + id="linearGradient1514" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.336922,0,0,0.166888,143.49433,15.46151)" + x1="52.006104" + y1="166.1331" + x2="14.049017" + y2="-42.218513" /><linearGradient + id="XMLID_39_" + gradientUnits="userSpaceOnUse" + x1="64.387703" + y1="65.124001" + x2="64.387703" + y2="35.569" + gradientTransform="matrix(0.354101,0,0,0.354101,127.15013,-0.08364921)"> + <stop + offset="0" + style="stop-color:#FFFFFF" + id="stop336" /> + <stop + offset="0.8539" + style="stop-color:#FF6200" + id="stop338" /> + <stop + offset="1" + style="stop-color:#F25D00" + id="stop340" /> + <midPointStop + offset="0" + style="stop-color:#FFFFFF" + id="midPointStop335" /> + <midPointStop + offset="0.5" + style="stop-color:#FFFFFF" + id="midPointStop337" /> + <midPointStop + offset="0.8539" + style="stop-color:#FF6200" + id="midPointStop339" /> + <midPointStop + offset="0.5" + style="stop-color:#FF6200" + id="midPointStop341" /> + <midPointStop + offset="1" + style="stop-color:#F25D00" + id="midPointStop343" /> + </linearGradient><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2299" + id="radialGradient2305" + cx="7.5326638" + cy="24.202574" + fx="7.5326638" + fy="24.202574" + r="8.2452128" + gradientTransform="matrix(4.100086,0,0,4.201322,100.09639,-78.53967)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2307" + id="radialGradient2313" + cx="19.985598" + cy="36.77816" + fx="19.985598" + fy="36.77816" + r="1.0821035" + gradientTransform="matrix(1.125263,0,0,0.982744,122.08278,0.565787)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2319" + id="radialGradient2325" + cx="20.443665" + cy="37.425829" + fx="20.443665" + fy="37.425829" + r="1.0821035" + gradientTransform="matrix(1.125263,0,0,0.982744,122.08278,0.731106)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2329" + id="linearGradient2335" + x1="17.602522" + y1="26.057423" + x2="17.682528" + y2="32.654099" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.898789,0,0,1.071914,125.98948,-2.080838)" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2341" + id="radialGradient2339" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(4.100086,0,0,-4.201322,120.31334,105.3535)" + cx="11.68129" + cy="19.554111" + fx="11.68129" + fy="19.554111" + r="8.2452126" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2349" + id="radialGradient2355" + cx="24.023088" + cy="40.56913" + fx="24.023088" + fy="40.56913" + r="16.28684" + gradientTransform="matrix(1.000000,0.000000,0.000000,0.431250,1.157278e-15,23.07369)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2368" + id="radialGradient2374" + cx="29.913452" + cy="30.442923" + fx="29.913452" + fy="30.442923" + r="4.0018832" + gradientTransform="matrix(3.751495,0,0,3.147818,43.502383,-65.70704)" + gradientUnits="userSpaceOnUse" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2378" + id="radialGradient2384" + cx="24.195112" + cy="10.577631" + fx="24.195112" + fy="10.577631" + r="15.242914" + gradientTransform="matrix(1.125263,-3.585417e-8,4.269819e-8,1.340059,122.50475,1.355395)" + gradientUnits="userSpaceOnUse" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2390" + id="linearGradient2396" + x1="30.603519" + y1="37.337803" + x2="30.603519" + y2="36.112415" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.263867,0,0,0.859794,-6.499556,8.390924)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2406" + id="linearGradient2412" + x1="17.850183" + y1="28.939463" + x2="19.040216" + y2="41.03223" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.888785,0,0,1.08932,127.92244,-1.524336)" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient4689" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4691" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4693" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5048" + id="linearGradient4894" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4896" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5060" + id="radialGradient4898" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /><filter + inkscape:collect="always" + id="filter4971" + x="-0.064853556" + width="1.1297071" + y="-1.9456067" + height="4.8912134"><feGaussianBlur + inkscape:collect="always" + stdDeviation="0.81066946" + id="feGaussianBlur4973" /></filter><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient4977" + id="linearGradient4983" + x1="23.6875" + y1="32" + x2="23.75" + y2="45.25" + gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview + inkscape:cy="-2.746436" + inkscape:cx="31.130127" + inkscape:zoom="8" + inkscape:window-height="1176" + inkscape:window-width="1855" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="0.21568627" + bordercolor="#666666" + pagecolor="#ffffff" + id="base" + inkscape:showpageshadow="false" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:current-layer="svg2" + fill="#555753" + showgrid="true" + stroke="#a40000" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false" + inkscape:window-maximized="1"><inkscape:grid + type="xygrid" + id="grid3818" /></sodipodi:namedview> + <g + style="display:inline" + id="g5022" + transform="matrix(0.02158196,0,0,0.01859457,168.63396,41.63767)"><rect + y="-150.69685" + x="-1559.2523" + height="478.35718" + width="1339.6335" + id="rect4173" + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient5027);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /><path + sodipodi:nodetypes="cccc" + id="path5058" + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5029);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient5031);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + id="path5018" + sodipodi:nodetypes="cccc" + inkscape:connector-curvature="0" /></g><path + style="color:#000000;fill:url(#linearGradient1514);fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:1.0000006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 147.13103,8.1833733 5.95746,0 c 0.83973,0 13.88647,15.4353277 13.88647,16.3406587 l -0.44352,18.496745 c 0,0.905333 -0.67603,1.634177 -1.51576,1.634177 l -31.45728,0 c -0.83973,0 -1.51576,-0.728844 -1.51576,-1.634177 l 0.0565,-18.496745 c 0,-0.905331 14.19218,-16.3406587 15.03191,-16.3406587 z" + id="rect1512" + sodipodi:nodetypes="ccccccccc" + inkscape:connector-curvature="0" /><path + style="fill:none" + id="path5" + d="m 172.47503,45.735573 -45.3249,0 0,-45.32489746 45.3249,0 0,45.32489746 z" + inkscape:connector-curvature="0" /><path + style="fill:url(#linearGradient2335);fill-opacity:1;fill-rule:evenodd" + id="path2327" + d="m 148.51145,29 -0.0457,15.090942 -11.84279,0 L 136.51145,29 l 12,0 z" + clip-rule="evenodd" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><path + sodipodi:nodetypes="ccccccccc" + id="path2357" + d="m 147.29191,9.405584 5.5591,0 c 0.78358,0 13.00087,14.399588 13.00087,15.244172 l -0.34716,18.212311 c 0,0.459259 -0.14374,0.653465 -0.51237,0.653465 l -31.38721,0.01428 c -0.36863,0 -0.58396,-0.07992 -0.58396,-0.45355 l 0.21534,-18.426506 c 0,-0.844584 13.27181,-15.244172 14.05539,-15.244172 z" + style="opacity:0.3125;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + clip-rule="evenodd" + d="m 132.71898,27.943053 -0.0543,2.595194 18.36817,-13.179254 15.28639,11.154428 0.0713,-0.311714 -16.37045,-15.904131 -17.30116,15.645477 z" + id="path23" + style="opacity:0.2;fill:url(#radialGradient2384);fill-opacity:1;fill-rule:evenodd" + sodipodi:nodetypes="ccccccc" + inkscape:connector-curvature="0" /><path + clip-rule="evenodd" + d="m 147.51145,30 0,14.090942 -9.81103,0 L 137.51145,30 l 10,0 z" + id="path188" + style="fill:url(#linearGradient2412);fill-opacity:1;fill-rule:evenodd" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><path + style="opacity:0.40909089;fill:url(#radialGradient2325);fill-opacity:1;fill-rule:evenodd" + id="path2315" + d="m 145.08831,36.44767 c 0.67279,0 1.21662,0.474605 1.21662,1.058507 0,0.589811 -0.54383,1.068355 -1.21662,1.068355 -0.67227,0 -1.21869,-0.478544 -1.21869,-1.068355 5.2e-4,-0.583902 0.54642,-1.058507 1.21869,-1.058507 z" + clip-rule="evenodd" + inkscape:connector-curvature="0" /><path + clip-rule="evenodd" + d="m 144.97377,35.932229 c 0.67279,0 1.21661,0.474605 1.21661,1.058507 0,0.589809 -0.54382,1.068353 -1.21661,1.068353 -0.67228,0 -1.21869,-0.478544 -1.21869,-1.068353 5.2e-4,-0.583902 0.54641,-1.058507 1.21869,-1.058507 z" + id="path217" + style="fill:url(#radialGradient2313);fill-opacity:1;fill-rule:evenodd" + inkscape:connector-curvature="0" /><path + d="m 149.9592,11.559337 18.92706,17.169868 0.49468,0.391991 0.40368,-0.171385 -0.37287,-0.761673 -0.27762,-0.223436 -19.17493,-15.572306 -19.38951,15.743335 -0.23761,0.14412 -0.21671,0.706786 0.43342,0.129248 0.38456,-0.308423 19.02585,-17.248125 z" + id="path342" + style="fill:url(#XMLID_39_)" + sodipodi:nodetypes="ccccccccccccc" + inkscape:connector-curvature="0" /><path + style="fill:#ef2929;stroke:#a40000" + id="path362" + d="m 149.84162,2.2713382 -21.88174,18.1013368 -0.62473,7.165928 1.99994,2.064323 c 0,0 20.40738,-17.157285 20.62409,-17.327963 l 19.63254,17.54326 1.89843,-2.323997 -1.61579,-7.111374 -19.91518,-18.2159732 -0.11756,0.1044594 z" + sodipodi:nodetypes="cccccccccc" + inkscape:connector-curvature="0" /> +<path + style="opacity:0.40909089;color:#000000;fill:url(#radialGradient2305);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="M 128.3528,20.613129 128.06124,27.236494 149.88067,8.980075 149.81034,3.0867443 128.3528,20.613129 z" + id="path1536" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><path + sodipodi:nodetypes="ccccc" + id="path2337" + d="m 149.99522,8.7509884 0.0995,-5.8411017 19.32896,17.6519533 1.49181,6.500812 -20.92023,-18.3116636 z" + style="opacity:0.13636367;color:#000000;fill:url(#radialGradient2339);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + inkscape:connector-curvature="0" /><path + style="opacity:0.31818183;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999934;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 152.61368,27.719824 9.04,0 c 0.77059,0 1.39096,0.62037 1.39096,1.390967 l -0.008,9.079221 c 0,0.770596 -0.59632,1.265969 -1.36691,1.265969 l -9.05609,0 c -0.77059,0 -1.39096,-0.620373 -1.39096,-1.390969 l 0,-8.954221 c 0,-0.770597 0.62037,-1.390967 1.39096,-1.390967 z" + id="rect2361" + sodipodi:nodetypes="ccccccccc" + inkscape:connector-curvature="0" /><rect + style="color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#757575;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect3263" + width="10.001333" + height="9.9624557" + x="152.01923" + y="28.514256" + rx="0.38128215" + ry="0.38128215" /><path + style="opacity:0.39772728;color:#000000;fill:url(#radialGradient2374);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999958;marker:none;visibility:visible;display:inline;overflow:visible" + d="m 152.61857,34.408261 c 3.61798,0.331177 5.52773,-1.445704 8.86815,-1.55274 l 0.0247,-3.849491 -8.91161,-0.006 0.0187,5.408261 z" + id="rect2363" + sodipodi:nodetypes="ccccc" + inkscape:connector-curvature="0" /><g + transform="translate(65.937707,2.0108349)" + id="g4739"><path + sodipodi:type="arc" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4741" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" /><path + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4743" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /></g><g + id="g4733" + transform="translate(76.897863,5.0160386)"><path + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4735" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4737" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" /></g><g + transform="translate(70.887455,7.0268736)" + id="g4727"><path + sodipodi:type="arc" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4729" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" /><path + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4731" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /></g><g + id="g4723" + transform="translate(59.662134,5.9662134)"><path + transform="matrix(0.95416667,0,0,0.94583333,1.405743,0.73519001)" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + sodipodi:ry="5.3033009" + sodipodi:rx="5.3033009" + sodipodi:cy="8.2694378" + sodipodi:cx="25.367456" + id="path4719" + style="fill:#6adb4d;fill-opacity:1;stroke:#34781d;stroke-width:1.05264175;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:none;stroke:#b3ff9a;stroke-width:1.29034114;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4721" + sodipodi:cx="25.367456" + sodipodi:cy="8.2694378" + sodipodi:rx="5.3033009" + sodipodi:ry="5.3033009" + d="m 30.670757,8.2694378 c 0,2.9289322 -2.374368,5.3033012 -5.303301,5.3033012 -2.928932,0 -5.3033,-2.374369 -5.3033,-5.3033012 0,-2.9289322 2.374368,-5.3033009 5.3033,-5.3033009 2.928933,0 5.303301,2.3743687 5.303301,5.3033009 z" + transform="matrix(0.77083333,0,0,0.77916666,6.0564434,2.1576238)" /></g><g + id="g4695" + transform="matrix(1.1326331,0,0,0.44340824,65.580189,2.4215088)"><rect + style="fill:#8a8a8a;fill-opacity:1;stroke:none" + id="rect4697" + width="29.256544" + height="18.119614" + x="10.297243" + y="27.449707" + rx="1.7190553" + ry="4.3911204" /><g + id="g4699"><g + id="g4701"><rect + rx="1.7051755" + y="27.517153" + x="10.510214" + height="17.982044" + width="29.020325" + id="rect4703" + style="fill:none;stroke:#646464;stroke-width:1.41005611;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + ry="4.3556657" /></g><rect + rx="0.88575488" + y="29.624025" + x="11.337327" + height="13.83156" + width="27.319036" + id="rect4705" + style="fill:none;stroke:#b3b3b3;stroke-width:1.40048993;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + ry="2.2625546" /></g></g><g + transform="matrix(0.01936185,0,0,0.01859457,111.41659,40.621203)" + id="g4681" + style="display:inline"><rect + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient4689);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect4683" + width="1339.6335" + height="478.35718" + x="-1559.2523" + y="-150.69685" /><path + inkscape:connector-curvature="0" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4691);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" + id="path4685" + sodipodi:nodetypes="cccc" /><path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" + id="path4687" + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4693);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /></g><g + id="g4672" + transform="translate(68.942911,-2.9168155)"><rect + ry="1.9470588" + rx="1.9470588" + y="27.449707" + x="10.297243" + height="18.119614" + width="29.256544" + id="rect4658" + style="fill:#dddddd;fill-opacity:1;stroke:none" /><g + id="g4667"><g + id="g4664"><rect + ry="1.9313381" + style="fill:none;stroke:#646464;stroke-width:0.99927008;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4660" + width="29.020325" + height="17.982044" + x="10.510214" + y="27.517153" + rx="1.9313381" /></g><rect + ry="1.0032353" + style="fill:none;stroke:#f6f6f6;stroke-width:0.99249077;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4662" + width="26.967867" + height="16.005489" + x="11.532422" + y="28.489801" + rx="1.0032353" /></g></g><path + transform="matrix(1.0023678,0,0,0.95596394,68.883716,-0.0273148)" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + sodipodi:ry="10" + sodipodi:rx="10" + sodipodi:cy="33" + sodipodi:cx="25" + id="path4679" + style="fill:#b8b8b8;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:type="arc" /><path + sodipodi:type="arc" + style="fill:#b8b8b8;fill-opacity:1;fill-rule:evenodd;stroke:#646464;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path3820" + sodipodi:cx="25" + sodipodi:cy="33" + sodipodi:rx="10" + sodipodi:ry="10" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + transform="matrix(0.94933484,0,0,0.95596394,70.209541,-1.4857225)" /><path + transform="matrix(0.6928006,0,0,0.69727163,76.6008,8.0344445)" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + sodipodi:ry="10" + sodipodi:rx="10" + sodipodi:cy="33" + sodipodi:cx="25" + id="path4590" + style="fill:#f4f4f4;fill-opacity:1;fill-rule:evenodd;stroke:none" + sodipodi:type="arc" /><g + id="g4644" + transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,99.594592,-10.924363)"><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4646" + width="0.68500972" + height="1.1490486" + x="24.638252" + y="26.853086" /><rect + y="37.990021" + x="24.660349" + height="1.1490486" + width="0.68500972" + id="rect4648" + style="fill:#232323;fill-opacity:1;stroke:none" /></g><g + id="g4600" + style="fill:#a2a2a2;fill-opacity:1" + transform="translate(69.009202,-2.3643883)"><rect + style="fill:#a2a2a2;fill-opacity:1;stroke:none" + id="rect4602" + width="1" + height="5.9375" + x="40.742825" + y="-1.6325631" + transform="matrix(0.67898035,0.73415645,-0.73415645,0.67898035,0,0)" /><path + sodipodi:type="arc" + style="fill:#a2a2a2;fill-opacity:1;stroke:none" + id="path4604" + sodipodi:cx="25.03125" + sodipodi:cy="33.03125" + sodipodi:rx="1.03125" + sodipodi:ry="0.96875" + d="M 26.0625,33.03125 C 26.0625,33.566276 25.600794,34 25.03125,34 24.461706,34 24,33.566276 24,33.03125 c 0,-0.535026 0.461706,-0.96875 1.03125,-0.96875 0.569544,0 1.03125,0.433724 1.03125,0.96875 z" + transform="matrix(0.95714504,0,0,1.0228099,1.028519,-0.77553647)" /></g><g + id="g4596" + transform="translate(68.942911,-2.9168155)"><rect + transform="matrix(0.67898035,0.73415645,-0.73415645,0.67898035,0,0)" + y="-1.6325631" + x="40.742825" + height="5.9375" + width="1" + id="rect4592" + style="fill:#ff2121;fill-opacity:1;stroke:none" /><path + transform="matrix(0.95714504,0,0,1.0228099,1.028519,-0.77553647)" + d="M 26.0625,33.03125 C 26.0625,33.566276 25.600794,34 25.03125,34 24.461706,34 24,33.566276 24,33.03125 c 0,-0.535026 0.461706,-0.96875 1.03125,-0.96875 0.569544,0 1.03125,0.433724 1.03125,0.96875 z" + sodipodi:ry="0.96875" + sodipodi:rx="1.03125" + sodipodi:cy="33.03125" + sodipodi:cx="25.03125" + id="path4594" + style="fill:#ff2121;fill-opacity:1;stroke:none" + sodipodi:type="arc" /></g><path + sodipodi:type="arc" + style="fill:none;stroke:#646464;stroke-width:1.37966764;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path4608" + sodipodi:cx="25" + sodipodi:cy="33" + sodipodi:rx="10" + sodipodi:ry="10" + d="m 35,33 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z" + transform="matrix(0.74693846,0,0,0.74919978,75.258402,5.3595919)" /><g + id="g4628" + transform="translate(68.942911,-2.9168155)"><rect + y="26.853086" + x="24.638252" + height="1.1490486" + width="0.68500972" + id="rect4624" + style="fill:#232323;fill-opacity:1;stroke:none" /><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4626" + width="0.68500972" + height="1.1490486" + x="24.660349" + y="37.990021" /></g><g + id="g4632" + transform="matrix(0,1,-1,0,126.93079,5.087457)"><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4634" + width="0.68500972" + height="1.1490486" + x="24.638252" + y="26.853086" /><rect + y="37.990021" + x="24.660349" + height="1.1490486" + width="0.68500972" + id="rect4636" + style="fill:#232323;fill-opacity:1;stroke:none" /></g><rect + style="fill:#232323;fill-opacity:1;stroke:none" + id="rect4640" + width="0.68500972" + height="1.1490486" + x="-45.50618" + y="-93.834114" + transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)" /><rect + y="-82.697182" + x="-45.484081" + height="1.1490486" + width="0.68500972" + id="rect4642" + style="fill:#232323;fill-opacity:1;stroke:none" + transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)" /><g + transform="matrix(1.2021267,0,0,0.11694557,63.863529,11.401153)" + id="g4707"><rect + ry="16.649275" + rx="1.6196786" + y="27.449707" + x="10.297243" + height="18.119614" + width="29.256544" + id="rect4709" + style="fill:#d4d4d4;fill-opacity:1;stroke:none" /><g + id="g4711"><g + id="g4713"><rect + ry="16.514845" + style="fill:none;stroke:#646464;stroke-width:2.66511464;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4715" + width="29.020325" + height="17.982044" + x="10.510214" + y="27.517153" + rx="1" /></g></g></g><g + id="g4985" + transform="translate(0,-11.125)"><g + transform="matrix(0.01936185,0,0,0.01859457,41.505849,40.621203)" + id="g4874" + style="display:inline"><rect + style="opacity:0.40206185;color:#000000;fill:url(#linearGradient4894);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + id="rect4876" + width="1339.6335" + height="478.35718" + x="-1559.2523" + y="-150.69685" /><path + inkscape:connector-curvature="0" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4896);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" + d="m -219.61876,-150.68038 c 0,0 0,478.33079 0,478.33079 142.874166,0.90045 345.40022,-107.16966 345.40014,-239.196175 0,-132.026537 -159.436816,-239.134595 -345.40014,-239.134615 z" + id="path4878" + sodipodi:nodetypes="cccc" /><path + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" + id="path4880" + d="m -1559.2523,-150.68038 c 0,0 0,478.33079 0,478.33079 -142.8742,0.90045 -345.4002,-107.16966 -345.4002,-239.196175 0,-132.026537 159.4368,-239.134595 345.4002,-239.134615 z" + style="opacity:0.40206185;color:#000000;fill:url(#radialGradient4898);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" /></g><g + id="g4882" + transform="translate(-0.96783034,-2.9168155)"><rect + ry="1.9470588" + rx="1.9470588" + y="27.449707" + x="10.297243" + height="18.119614" + width="29.256544" + id="rect4884" + style="fill:#eaeaea;fill-opacity:1;stroke:none" /><g + id="g4886"><g + id="g4888"><rect + ry="1.9313381" + style="fill:none;stroke:#646464;stroke-width:0.99927008;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4890" + width="29.020325" + height="17.982044" + x="10.510214" + y="27.517153" + rx="1.9313381" /></g><rect + ry="1.0032353" + style="fill:none;stroke:#ffffff;stroke-width:0.99249077;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect4892" + width="26.967867" + height="16.005489" + x="11.532422" + y="28.489801" + rx="1.0032353" /></g></g><g + transform="matrix(1,0,0,0.9039548,0,2.5932203)" + id="g4922"><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4900" + width="1" + height="11.0625" + x="13.0625" + y="27" /><rect + y="27" + x="15.0625" + height="11.0625" + width="1" + id="rect4902" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4904" + width="1" + height="11.0625" + x="18" + y="27" /><rect + y="27" + x="19.9375" + height="11.0625" + width="2" + id="rect4906" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + y="27" + x="22.9375" + height="11.0625" + width="1" + id="rect4908" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4910" + width="2.0625" + height="11.0625" + x="25.9375" + y="27" /><rect + y="27" + x="28.9375" + height="11.0625" + width="1.125" + id="rect4912" + style="fill:#000000;fill-opacity:1;stroke:none" /><rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4914" + width="1.125" + height="11.0625" + x="30.9375" + y="27" /><rect + y="27" + x="33.9375" + height="11.0625" + width="1.125" + id="rect4916" + style="fill:#000000;fill-opacity:1;stroke:none" /></g><text + sodipodi:linespacing="125%" + id="text4918" + y="40.195068" + x="12.981453" + style="font-size:36.59571838px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + xml:space="preserve"><tspan + style="font-size:3.65957189px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-family:Inconsolata;-inkscape-font-specification:Inconsolata Medium" + y="40.195068" + x="12.981453" + id="tspan4920" + sodipodi:role="line">5 92102431 8</tspan></text> +<rect + y="31.0625" + x="9.0625" + height="1" + width="30" + id="rect4933" + style="fill:#ff0000;fill-opacity:1;stroke:none" /><rect + style="fill:#ff0000;fill-opacity:1;stroke:none;filter:url(#filter4971)" + id="rect4957" + width="30" + height="1" + x="9.0625" + y="31.0625" /><path + inkscape:connector-curvature="0" + id="path4975" + d="M 9.0625,32.0625 20,47.875 28.9375,47.9375 39,32.0625 z" + style="opacity:0.29787233;fill:url(#linearGradient4983);fill-opacity:1;stroke:none" /></g></svg>
\ No newline at end of file diff --git a/addons/point_of_sale/static/src/js/TODO.txt b/addons/point_of_sale/static/src/js/TODO.txt new file mode 100644 index 00000000000..edadbe188ea --- /dev/null +++ b/addons/point_of_sale/static/src/js/TODO.txt @@ -0,0 +1,62 @@ +v Affichage Catégories doivent respecter le poids +v Affichage Catégories par poids doivent avoir une hiérarchie plate +v Le Onscreen keyboard ne fonctionne plus +v Scrolling dans la sélection produit et dans + la liste de courses +v Réductions +v Redesign liste de courses +v bugs scans produits par prix par poids +v si pas photo photo par defaut +v WebSQL +v Redesign header, bouton retour aux backend en mode caissière +v bouton exit en mode caissière doit retourner au backend. +v posting orders +v bug ajout ligne payment à zero + curseur dedans + suppression + design plus grand +v si case print via proxy cochée, alors on skip l'ecran receipt +v bouton exit self checkout +v demarrage en mode self-checkout si self-checkout +v produits poid code barre non reconnus +v activer popup client aux écrans self-checkout +v discount pas plus grand que 100 +v numpad dans l'écran payment pour pouvoir entrer le montant +v différence de total. Methode d'arrondis + +- login alternatif +- user preferences : désactiver la balance etc. +- numpad state parfois sans state +- numpad state en mode pesée ?? le cacher ? +- Redesign du receipt +- retirer le receipt screen +- le numpad en mode paymenet marche pas +- l'écran de payement est hyper laid +- l'écran de pesée est hyper laid +x générer les données de printing +x popups d'erreur certainement buggés + +TODO AUG 20 +----------- + +* GREEN STATUS + - make it green ! + +* TRUNK + - Connection status tooltip + v Remove receipt screen + - Finish the receipt JSON generation + - Modifie le widget de liste course + v supprimer l'écran + v bloquer sur l'impression + v L'impression est foireuse + +* CLIENT + - create a new branch + - Self-checkout welcome screen + - removal of products for the root category + - Terminal de payement + - Code à barres + - Vidanges + - Design + - Backport + - CSS pour écran résistif + - Test sur matos + diff --git a/addons/point_of_sale/static/src/js/db.js b/addons/point_of_sale/static/src/js/db.js new file mode 100644 index 00000000000..77f7307b48f --- /dev/null +++ b/addons/point_of_sale/static/src/js/db.js @@ -0,0 +1,235 @@ +function openerp_pos_db(instance, module){ + + /* PosLS is a LocalStorage based implementation of the point of sale database, + it performs better for few products, but does not scale beyond 500 products. + */ + module.PosLS = instance.web.Class.extend({ + name: 'openerp_pos_ls', //the prefix of the localstorage data + limit: 100, // the maximum number of results returned by a search + init: function(options){ + options = options || {}; + this.name = options.name || this.name; + this.limit = options.limit || this.limit; + + //cache the data in memory to avoid roundtrips to the localstorage + this.cache = {}; + + this.category_by_id = {}; + this.root_category_id = 0; + this.category_products = {}; + this.category_ancestors = {}; + this.category_childs = {}; + this.category_parent = {}; + this.category_search_string = {}; + }, + /* returns the category object from its id. If you pass a list of id as parameters, you get + * a list of category objects. + */ + get_category_by_id: function(categ_id){ + if(categ_id instanceof Array){ + var list = []; + for(var i = 0, len = categ_id.length; i < len; i++){ + var cat = this.category_by_id[categ_id[i]]; + if(cat){ + list.push(cat); + }else{ + console.error("get_category_by_id: no category has id:",categ_id[i]); + } + } + return list; + }else{ + return this.category_by_id[categ_id]; + } + }, + /* returns a list of the category's child categories ids, or an empty list + * if a category has no childs */ + get_category_childs_ids: function(categ_id){ + return this.category_childs[categ_id] || []; + }, + /* returns a list of all ancestors (parent, grand-parent, etc) categories ids + * starting from the root category to the direct parent */ + get_category_ancestors_ids: function(categ_id){ + return this.category_ancestors[categ_id] || []; + }, + /* returns the parent category's id of a category, or the root_category_id if no parent. + * the root category is parent of itself. */ + get_category_parent_id: function(categ_id){ + return this.category_parent[categ_id] || this.root_category_id; + }, + /* adds categories definitions to the database. categories is a list of categories objects as + * returned by the openerp server. Categories must be inserted before the products or the + * product/ categories association may (will) not work properly */ + add_categories: function(categories){ + var self = this; + if(!this.category_by_id[this.root_category_id]){ + this.category_by_id[this.root_category_id] = { + id : this.root_category_id, + name : 'Root', + }; + } + for(var i=0, len = categories.length; i < len; i++){ + this.category_by_id[categories[i].id] = categories[i]; + } + for(var i=0, len = categories.length; i < len; i++){ + var cat = categories[i]; + var parent_id = cat.parent_id[0] || this.root_category_id; + this.category_parent[cat.id] = cat.parent_id[0]; + if(!this.category_childs[parent_id]){ + this.category_childs[parent_id] = []; + } + this.category_childs[parent_id].push(cat.id); + } + function make_ancestors(cat_id, ancestors){ + self.category_ancestors[cat_id] = ancestors; + + ancestors = ancestors.slice(0); + ancestors.push(cat_id); + + var childs = self.category_childs[cat_id] || []; + for(var i=0, len = childs.length; i < len; i++){ + make_ancestors(childs[i], ancestors); + } + } + make_ancestors(this.root_category_id, []); + }, + /* loads a record store from the database. returns default if nothing is found */ + load: function(store,deft){ + if(this.cache[store] !== undefined){ + return this.cache[store]; + } + var data = localStorage[this.name + '_' + store]; + if(data !== undefined){ + data = JSON.parse(data); + this.cache[store] = data; + return data; + }else{ + return deft; + } + }, + /* saves a record store to the database */ + save: function(store,data){ + localStorage[this.name + '_' + store] = JSON.stringify(data); + this.cache[store] = data; + }, + _product_search_string: function(product){ + var str = '' + product.id + ':' + product.name; + if(product.ean13){ + str += '|' + product.ean13; + } + return str + '\n'; + }, + add_products: function(products){ + var stored_products = this.load('products',{}); + var stored_categories = this.load('categories',{}); + + if(!products instanceof Array){ + products = [products]; + } + for(var i = 0, len = products.length; i < len; i++){ + var product = products[i]; + var search_string = this._product_search_string(product); + var categ_id = product.pos_categ_id[0]; + if(!stored_categories[categ_id]){ + stored_categories[categ_id] = []; + } + stored_categories[categ_id].push(product.id); + + if(this.category_search_string[categ_id] === undefined){ + this.category_search_string[categ_id] = ''; + } + this.category_search_string[categ_id] += search_string; + + var ancestors = this.get_category_ancestors_ids(categ_id) || []; + + for(var j = 0; j < ancestors.length; j++){ + var ancestor = ancestors[j]; + if(! stored_categories[ancestor]){ + stored_categories[ancestor] = []; + } + stored_categories[ancestor].push(product.id); + + if( this.category_search_string[ancestor] === undefined){ + this.category_search_string[ancestor] = ''; + } + this.category_search_string[ancestor] += search_string; + } + stored_products[product.id] = product; + } + this.save('products',stored_products); + this.save('categories',stored_categories); + }, + /* removes all the data from the database. TODO : being able to selectively remove data */ + clear: function(stores){ + for(var i = 0, len = arguments.length; i < len; i++){ + localStorage.removeItem(this.name + '_' + arguments[i]); + } + }, + /* this internal methods returns the count of properties in an object. */ + _count_props : function(obj){ + var count = 0; + for(var prop in obj){ + if(obj.hasOwnProperty(prop)){ + count++; + } + } + return count; + }, + get_product_by_id: function(id){ + return this.load('products',{})[id]; + }, + get_product_by_ean13: function(ean13){ + var products = this.load('products',{}); + for(var i in products){ + if( products[i] && products[i].ean13 === ean13){ + return products[i]; + } + } + return undefined; + }, + get_product_by_category: function(category_id){ + var stored_categories = this.load('categories',{}); + var stored_products = this.load('products',{}); + var product_ids = stored_categories[category_id]; + var list = []; + for(var i = 0, len = Math.min(product_ids.length,this.limit); i < len; i++){ + list.push(stored_products[product_ids[i]]); + } + return list; + }, + /* returns a list of products with : + * - a category that is or is a child of category_id, + * - a name, package or ean13 containing the query (case insensitive) + */ + search_product_in_category: function(category_id, query){ + var re = RegExp("([0-9]+):.*?"+query,"gi"); + var results = []; + for(var i = 0; i < this.limit; i++){ + r = re.exec(this.category_search_string[category_id]); + if(r){ + var id = Number(r[1]); + results.push(this.get_product_by_id(id)); + }else{ + break; + } + } + return results; + }, + add_order: function(order){ + var last_id = this.load('last_order_id',0); + var orders = this.load('orders',[]); + orders.push({id: last_id + 1, data: order}); + this.save('last_order_id',last_id+1); + this.save('orders',orders); + }, + remove_order: function(order_id){ + var orders = this.load('orders',[]); + orders = _.filter(orders, function(order){ + return order.id !== order_id; + }); + this.save('orders',orders); + }, + get_orders: function(){ + return this.load('orders',[]); + }, + }); +} diff --git a/addons/point_of_sale/static/src/js/pos_devices.js b/addons/point_of_sale/static/src/js/devices.js index 2857fc39937..a6be16b3835 100644 --- a/addons/point_of_sale/static/src/js/pos_devices.js +++ b/addons/point_of_sale/static/src/js/devices.js @@ -17,7 +17,9 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal delay_payment: function(){ this.activate(); this.payment_status = 'waiting_for_payment'; }, }))(); - //window.debug_devices = debug_devices; + if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){ + window.debug_devices = debug_devices; + } // this object interfaces with the local proxy to communicate to the various hardware devices // connected to the Point of Sale. As the communication only goes from the POS to the proxy, @@ -42,21 +44,26 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal success_callback = success_callback || function(){}; error_callback = error_callback || function(){}; - if(debug_devices && debug_devices.active){ + + if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){ console.log('PROXY:',name,params); - }else{ + } + + if(!(debug_devices && debug_devices.active)){ this.connection.rpc('/pos/'+name, params || {}, success_callback, error_callback); } }, //a product has been scanned and recognized with success - scan_item_success: function(){ - this.message('scan_item_success'); + // ean is a parsed ean object + scan_item_success: function(ean){ + this.message('scan_item_success',ean); }, - //a product has been scanned but not recognized - scan_item_error_unrecognized: function(){ - this.message('scan_item_error_unrecognized'); + // a product has been scanned but not recognized + // ean is a parsed ean object + scan_item_error_unrecognized: function(ean){ + this.message('scan_item_error_unrecognized',ean); }, //the client is asking for help @@ -222,11 +229,11 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.action_callback_stack = []; - this.price_prefix_set = attributes.price_prefix_set || {'02':'', '22':'', '24':'', '26':'', '28':''}; - this.weight_prefix_set = attributes.weight_prefix_set || {'21':'','23':'','27':'','29':'','25':''}; - this.client_prefix_set = attributes.weight_prefix_set || {'42':''}; - this.cashier_prefix_set = attributes.weight_prefix_set || {'40':''}; - this.discount_prefix_set = attributes.weight_prefix_set || {'44':''}; + this.weight_prefix_set = attributes.weight_prefix_set || {'21':''}; + this.discount_prefix_set = attributes.discount_prefix_set || {'22':''}; + this.price_prefix_set = attributes.price_prefix_set || {'23':''}; + this.cashier_prefix_set = attributes.cashier_prefix_set || {'041':''}; + this.client_prefix_set = attributes.client_prefix_set || {'042':''}; }, save_callbacks: function(){ var callbacks = {}; @@ -270,41 +277,37 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.action_callback[action] = undefined; } }, - - - // returns true if the ean is a valid EAN codebar number by checking the control digit. - // ean must be a string - check_ean: function(ean){ + // returns the checksum of the ean, or -1 if the ean has not the correct length, ean must be a string + ean_checksum: function(ean){ var code = ean.split(''); + if(code.length !== 13){ + return -1; + } + var oddsum = 0, evensum = 0, total = 0; + code = code.reverse().splice(1); for(var i = 0; i < code.length; i++){ - code[i] = Number(code[i]); + if(i % 2 == 0){ + oddsum += Number(code[i]); + }else{ + evensum += Number(code[i]); + } } - var st1 = code.slice(); - var st2 = st1.slice(0,st1.length-1).reverse(); - // some EAN13 barcodes have a length of 12, as they start by 0 - while (st2.length < 12) { - st2.push(0); + total = oddsum * 3 + evensum; + return Number((10 - total % 10) % 10); + }, + // returns true if the ean is a valid EAN codebar number by checking the control digit. + // ean must be a string + check_ean: function(ean){ + return this.ean_checksum(ean) === Number(ean[ean.length-1]); + }, + // returns a valid zero padded ean13 from an ean prefix. the ean prefix must be a string. + sanitize_ean:function(ean){ + ean = ean.substr(0,13); + + for(var n = 0, count = (13 - ean.length); n < count; n++){ + ean = ean + '0'; } - var countSt3 = 1; - var st3 = 0; - $.each(st2, function() { - if (countSt3%2 === 1) { - st3 += this; - } - countSt3 ++; - }); - st3 *= 3; - var st4 = 0; - var countSt4 = 1; - $.each(st2, function() { - if (countSt4%2 === 0) { - st4 += this; - } - countSt4 ++; - }); - var st5 = st3 + st4; - var cd = (10 - (st5%10)) % 10; - return code[code.length-1] === cd; + return ean.substr(0,12) + this.ean_checksum(ean); }, // attempts to interpret an ean (string encoding an ean) @@ -327,41 +330,47 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal type:'unknown', // prefix:'', ean:ean, + base_ean: ean, id:'', value: 0, unit: 'none', }; - var prefix2 = ean.substring(0,2); + console.log('ean',ean); + + function match_prefix(prefix_set, type){ + for(prefix in prefix_set){ + if(ean.substring(0,prefix.length) === prefix){ + parse_result.prefix = prefix; + parse_result.type = type; + return true; + } + } + return false; + } - if(!this.check_ean(ean)){ + if (!this.check_ean(ean)){ parse_result.type = 'error'; - }else if (prefix2 in this.price_prefix_set){ - parse_result.type = 'price'; - parse_result.prefix = prefix2; + } else if( match_prefix(this.price_prefix_set,'price')){ parse_result.id = ean.substring(0,7); + parse_result.base_ean = this.sanitize_ean(ean.substring(0,7)); parse_result.value = Number(ean.substring(7,12))/100.0; parse_result.unit = 'euro'; - } else if (prefix2 in this.weight_prefix_set){ - parse_result.type = 'weight'; - parse_result.prefix = prefix2; + } else if( match_prefix(this.weight_prefix_set,'weight')){ parse_result.id = ean.substring(0,7); parse_result.value = Number(ean.substring(7,12))/1000.0; + parse_result.base_ean = this.sanitize_ean(ean.substring(0,7)); parse_result.unit = 'Kg'; - }else if (prefix2 in this.client_prefix_set){ - parse_result.type = 'client'; - parse_result.prefix = prefix2; + } else if( match_prefix(this.client_prefix_set,'client')){ parse_result.id = ean.substring(0,7); - }else if (prefix2 in this.cashier_prefix_set){ - parse_result.type = 'cashier'; - parse_result.prefix = prefix2; + parse_result.unit = 'Kg'; + } else if( match_prefix(this.cashier_prefix_set,'cashier')){ parse_result.id = ean.substring(0,7); - }else if (prefix2 in this.discount_prefix_set){ - parse_result.type = 'discount'; - parse_result.prefix = prefix2; + } else if( match_prefix(this.discount_prefix_set,'discount')){ parse_result.id = ean.substring(0,7); + parse_result.base_ean = this.sanitize_ean(ean.substring(0,7)); parse_result.value = Number(ean.substring(7,12))/100.0; parse_result.unit = '%'; - }else{ + } else { parse_result.type = 'unit'; parse_result.prefix = ''; parse_result.id = ean; @@ -402,7 +411,7 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal var parse_result = self.parse_ean(codeNumbers.join('')); if (parse_result.type === 'error') { //most likely a checksum error, raise warning - console.error('ERROR: barcode checksum error:',parse_result); + console.warn('WARNING: barcode checksum error:',parse_result); }else if(parse_result.type in {'unit':'', 'weight':'', 'price':''}){ //ean is associated to a product if(self.action_callback['product']){ self.action_callback['product'](parse_result); diff --git a/addons/point_of_sale/static/src/js/pos_main.js b/addons/point_of_sale/static/src/js/main.js index 71ac69c6067..b9263b91314 100644 --- a/addons/point_of_sale/static/src/js/pos_main.js +++ b/addons/point_of_sale/static/src/js/main.js @@ -5,6 +5,8 @@ openerp.point_of_sale = function(instance) { var module = instance.point_of_sale; + openerp_pos_db(instance,module); // import db.js + openerp_pos_models(instance,module); // import pos_models.js openerp_pos_basewidget(instance,module); // import pos_basewidget.js diff --git a/addons/point_of_sale/static/src/js/pos_models.js b/addons/point_of_sale/static/src/js/models.js index 8a1506769bd..a1f6def6bf3 100644 --- a/addons/point_of_sale/static/src/js/pos_models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -1,51 +1,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sale var QWeb = instance.web.qweb; - module.LocalStorageDAO = instance.web.Class.extend({ - add_operation: function(operation) { - var self = this; - return $.async_when().pipe(function() { - var tmp = self._get('oe_pos_operations', []); - var last_id = self._get('oe_pos_operations_sequence', 1); - tmp.push({'id': last_id, 'data': operation}); - self._set('oe_pos_operations', tmp); - self._set('oe_pos_operations_sequence', last_id + 1); - }); - }, - remove_operation: function(id) { - var self = this; - return $.async_when().pipe(function() { - var tmp = self._get('oe_pos_operations', []); - tmp = _.filter(tmp, function(el) { - return el.id !== id; - }); - self._set('oe_pos_operations', tmp); - }); - }, - get_operations: function() { - var self = this; - return $.async_when().pipe(function() { - return self._get('oe_pos_operations', []); - }); - }, - _get: function(key, default_) { - var txt = localStorage['oe_pos_dao_'+key]; - if (! txt) - return default_; - return JSON.parse(txt); - }, - _set: function(key, value) { - localStorage['oe_pos_dao_'+key] = JSON.stringify(value); - }, - reset_stored_data: function(){ - for(key in localStorage){ - if(key.indexOf('oe_pos_dao_') === 0){ - delete localStorage[key]; - } - } - }, - }); - var fetch = function(model, fields, domain, ctx){ return new instance.web.Model(model).query(fields).filter(domain).context(ctx).all() }; @@ -58,29 +13,20 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal // this is done asynchronously, a ready deferred alows the GUI to wait interactively // for the loading to be completed // There is a single instance of the PosModel for each Front-End instance, it is usually called - // 'pos' and is available to almost all widgets. + // 'pos' and is available to all widgets extending PosWidget. module.PosModel = Backbone.Model.extend({ initialize: function(session, attributes) { Backbone.Model.prototype.initialize.call(this, attributes); var self = this; - this.dao = new module.LocalStorageDAO(); // used to store the order's data on the Hard Drive + this.session = session; this.ready = $.Deferred(); // used to notify the GUI that the PosModel has loaded all resources this.flush_mutex = new $.Mutex(); // used to make sure the orders are sent to the server once at time - //this.build_tree = _.bind(this.build_tree, this); // ??? - this.session = session; - this.categories = {}; - this.root_category = null; - this.weightable_categories = []; // a flat list of all categories that directly contain weightable products - this.barcode_reader = new module.BarcodeReader({'pos': this}); // used to read barcodes - this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy - // pos settings - this.use_scale = false; - this.use_proxy_printer = false; - this.use_virtual_keyboard = false; - this.use_websql = false; - this.use_barcode_scanner = false; + this.barcode_reader = new module.BarcodeReader({'pos': this}); // used to read barcodes + this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy + this.db = new module.PosLS(); // a database used to store the products and categories + this.db.clear('products','categories'); // default attributes values. If null, it will be loaded below. this.set({ @@ -98,12 +44,12 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal 'products': new module.ProductCollection(), 'cashRegisters': null, - 'product_list': null, // the list of all products, does not change. 'bank_statements': null, 'taxes': null, 'pos_session': null, 'pos_config': null, - 'categories': null, + 'units': null, + 'units_by_id': null, 'selectedOrder': undefined, }); @@ -113,10 +59,9 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal // We fetch the backend data on the server asynchronously. this is done only when the pos user interface is launched, // Any change on this data made on the server is thus not reflected on the point of sale until it is relaunched. - var user_def = fetch('res.users',['name','company_id'],[['id','=',this.session.uid]]) + var loaded = fetch('res.users',['name','company_id'],[['id','=',this.session.uid]]) .pipe(function(users){ - var user = users[0]; - self.set('user',user); + self.set('user',users[0]); return fetch('res.company', [ @@ -124,171 +69,114 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal 'email', 'website', 'company_registry', - //TODO contact_address 'vat', 'name', - 'phone' + 'phone', + 'partner_id', ], - [['id','=',user.company_id[0]]]) + [['id','=',users[0].company_id[0]]]); }).pipe(function(companies){ - var company = companies[0]; - self.set('company',company); + self.set('company',companies[0]); - return fetch('res.currency',['symbol','position'],[['id','=',company.currency_id[0]]]); - }).pipe(function (currencies){ - self.set('currency',currencies[0]); - }); + return fetch('res.partner',['contact_address'],[['id','=',companies[0].partner_id[0]]]); + }).pipe(function(company_partners){ + self.get('company').contact_address = company_partners[0].contact_address; - var cat_def = fetch('pos.category', ['id','name', 'parent_id', 'child_id', 'image_medium']) - .pipe(function(result){ - return self.set({'categories': result}); - }); + return fetch('res.currency',['symbol','position'],[['id','=',self.get('company').currency_id[0]]]); + }).pipe(function(currencies){ + self.set('currency',currencies[0]); - var uom_def = fetch( //unit of measure - 'product.uom', - null, - null - ).then(function(result){ - self.set({'units': result}); + return fetch('product.uom', null, null); + }).pipe(function(units){ + self.set('units',units); var units_by_id = {}; - for(var i = 0, len = result.length; i < len; i++){ - units_by_id[result[i].id] = result[i]; + for(var i = 0, len = units.length; i < len; i++){ + units_by_id[units[i].id] = units[i]; } - self.set({'units_by_id':units_by_id}); - }); - - var pack_def = fetch( - 'product.packaging', - null, - null - ).then(function(packaging){ - self.set('product.packaging',packaging); - }); - - var users_def = fetch( - 'res.users', - ['name','ean13'], - [['ean13', '!=', false]] - ).then(function(result){ - self.set({'user_list':result}); - }); - - var tax_def = fetch('account.tax', ['amount','price_include','type']) - .then(function(result){ - self.set({'taxes': result}); - }); - - var session_def = fetch( // loading the PoS Session. - 'pos.session', - ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at'], - [['state', '=', 'opened'], ['user_id', '=', this.session.uid]] - ).pipe(function(result) { - - // some data are associated with the pos session, like the pos config and bank statements. - // we must have a valid session before we can read those. + self.set('units_by_id',units_by_id); - var session_data_def = new $.Deferred(); - - if( result.length !== 0 ) { - var pos_session = result[0]; - - self.set({'pos_session': pos_session}); - - var pos_config_def = fetch( - 'pos.config', - ['name','journal_ids','shop_id','journal_id', - 'iface_self_checkout', 'iface_websql', 'iface_led', 'iface_cashdrawer', - 'iface_payment_terminal', 'iface_electronic_scale', 'iface_barscan', 'iface_vkeyboard', - 'iface_print_via_proxy','iface_cashdrawer','state','sequence_id','session_ids'], - [['id','=', pos_session.config_id[0]]] - ).pipe(function(result){ - var pos_config = result[0] - - self.set({'pos_config': pos_config}); - self.use_scale = pos_config.iface_electronic_scale || false; - self.use_proxy_printer = pos_config.iface_print_via_proxy || false; - self.use_virtual_keyboard = pos_config.iface_vkeyboard || false; - self.use_websql = pos_config.iface_websql || false; - self.use_barcode_scanner = pos_config.iface_barscan || false; - self.use_selfcheckout = pos_config.iface_self_checkout || false; - self.use_cashbox = pos_config.iface_cashdrawer || false; - - return shop_def = fetch('sale.shop',[], [['id','=',pos_config.shop_id[0]]]) - }).pipe(function(shops){ - self.set('shop',shops[0]); - return fetch( - 'product.product', - //context {pricelist: shop.pricelist_id[0]} - ['name', 'list_price','price','pos_categ_id', 'taxes_id','image_medium', 'ean13', 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type'], - [['pos_categ_id','!=', false]], - {pricelist: shops[0].pricelist_id[0]} // context for price - ); - }).pipe( function(product_list){ - self.set({'product_list': product_list}); - }); - - var bank_def = fetch( - 'account.bank.statement', - ['account_id','currency','journal_id','state','name','user_id','pos_session_id'], - [['state','=','open'],['pos_session_id', '=', pos_session.id]] - ).then(function(result){ - self.set({'bank_statements':result}); - }); - - var journal_def = fetch( - 'account.journal', - undefined, - [['user_id','=',pos_session.user_id[0]]] - ).then(function(result){ - self.set({'journals':result}); - }); - - // associate the bank statements with their journals. - var bank_process_def = $.when(bank_def, journal_def) - .then(function(){ - var bank_statements = self.get('bank_statements'); - var journals = self.get('journals'); - for(var i = 0, ilen = bank_statements.length; i < ilen; i++){ - for(var j = 0, jlen = journals.length; j < jlen; j++){ - if(bank_statements[i].journal_id[0] === journals[j].id){ - bank_statements[i].journal = journals[j]; - bank_statements[i].self_checkout_payment_method = journals[j].self_checkout_payment_method; - } - } - } - }); - - session_data_def = $.when(pos_config_def,bank_def,journal_def,bank_process_def); - - }else{ - session_data_def.reject(); - } - return session_data_def; - }); - - // associate the products with their categories - var prod_process_def = $.when(cat_def, session_def) - .pipe(function(){ - var product_list = self.get('product_list'); - var categories = self.get('categories'); - var cat_by_id = {}; - for(var i = 0; i < categories.length; i++){ - cat_by_id[categories[i].id] = categories[i]; - } - //set the parent in the category - for(var i = 0; i < categories.length; i++){ - categories[i].parent_category = cat_by_id[categories[i].parent_id[0]]; - } - for(var i = 0; i < product_list.length; i++){ - product_list[i].pos_category = cat_by_id[product_list[i].pos_categ_id[0]]; + return fetch('product.packaging', null, null); + }).pipe(function(packagings){ + self.set('product.packaging',packagings); + + return fetch('res.users', ['name','ean13'], [['ean13', '!=', false]]); + }).pipe(function(users){ + self.set('user_list',users); + + return fetch('account.tax', ['amount', 'price_include', 'type']); + }).pipe(function(taxes){ + self.set('taxes', taxes); + + return fetch( + 'pos.session', + ['id', 'journal_ids','name','user_id','config_id','start_at','stop_at'], + [['state', '=', 'opened'], ['user_id', '=', self.session.uid]] + ); + }).pipe(function(sessions){ + self.set('pos_session', sessions[0]); + + return fetch( + 'pos.config', + ['name','journal_ids','shop_id','journal_id', + 'iface_self_checkout', 'iface_led', 'iface_cashdrawer', + 'iface_payment_terminal', 'iface_electronic_scale', 'iface_barscan', 'iface_vkeyboard', + 'iface_print_via_proxy','iface_cashdrawer','state','sequence_id','session_ids'], + [['id','=', self.get('pos_session').config_id[0]]] + ); + }).pipe(function(configs){ + var pos_config = configs[0]; + self.set('pos_config', pos_config); + self.iface_electronic_scale = !!pos_config.iface_electronic_scale; + self.iface_print_via_proxy = !!pos_config.iface_print_via_proxy; + self.iface_vkeyboard = !!pos_config.iface_vkeyboard; + self.iface_self_checkout = !!pos_config.iface_self_checkout; + self.iface_cashdrawer = !!pos_config.iface_cashdrawer; + + return fetch('sale.shop',[],[['id','=',pos_config.shop_id[0]]]); + }).pipe(function(shops){ + self.set('shop',shops[0]); + + return fetch('pos.category', ['id','name','parent_id','child_id','image']) + }).pipe(function(categories){ + self.db.add_categories(categories); + + return fetch( + 'product.product', + ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type'], + [['pos_categ_id','!=', false]], + {pricelist: self.get('shop').pricelist_id[0]} // context for price + ); + }).pipe(function(products){ + self.db.add_products(products); + + return fetch( + 'account.bank.statement', + ['account_id','currency','journal_id','state','name','user_id','pos_session_id'], + [['state','=','open'],['pos_session_id', '=', self.get('pos_session').id]] + ); + }).pipe(function(bank_statements){ + self.set('bank_statements', bank_statements); + + return fetch('account.journal', undefined, [['user_id','=', self.get('pos_session').user_id[0]]]); + }).pipe(function(journals){ + self.set('journals',journals); + + // associate the bank statements with their journals. + var bank_statements = self.get('bank_statements'); + for(var i = 0, ilen = bank_statements.length; i < ilen; i++){ + for(var j = 0, jlen = journals.length; j < jlen; j++){ + if(bank_statements[i].journal_id[0] === journals[j].id){ + bank_statements[i].journal = journals[j]; + bank_statements[i].self_checkout_payment_method = journals[j].self_checkout_payment_method; + } + } } + self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))}); }); // when all the data has loaded, we compute some stuff, and declare the Pos ready to be used. - $.when(pack_def, cat_def, user_def, users_def, uom_def, session_def, tax_def, prod_process_def, user_def, this.flush()) + $.when(loaded) .then(function(){ - self.build_categories(); - self.set({'cashRegisters' : new module.CashRegisterCollection(self.get('bank_statements'))}); //self.log_loaded_data(); //Uncomment if you want to log the data to the console for easier debugging self.ready.resolve(); },function(){ @@ -302,7 +190,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal log_loaded_data: function(){ console.log('PosModel data has been loaded:'); console.log('PosModel: categories:',this.get('categories')); - console.log('PosModel: product_list:',this.get('product_list')); console.log('PosModel: units:',this.get('units')); console.log('PosModel: bank_statements:',this.get('bank_statements')); console.log('PosModel: journals:',this.get('journals')); @@ -316,7 +203,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal console.log('PosModel: user_list:',this.get('user_list')); console.log('PosModel: user:',this.get('user')); console.log('PosModel.session:',this.session); - console.log('PosModel.categories:',this.categories); console.log('PosModel end of data log.'); }, @@ -324,7 +210,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal // order and a valid selected order on_removed_order: function(removed_order){ if( this.get('orders').isEmpty()){ - this.add_and_select_order(new module.Order({ pos: this })); + this.add_new_order(); } if( this.get('selectedOrder') === removed_order){ this.set({ selectedOrder: this.get('orders').last() }); @@ -333,175 +219,70 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal // saves the order locally and try to send it to the backend. 'record' is a bizzarely defined JSON version of the Order push_order: function(record) { - var self = this; - return this.dao.add_operation(record).pipe(function(){ - return self.flush(); - }); + this.db.add_order(record); + this.flush(); }, - add_and_select_order: function(newOrder) { - (this.get('orders')).add(newOrder); - return this.set({ - selectedOrder: newOrder - }); + //creates a new empty order and sets it as the current order + add_new_order: function(){ + var order = new module.Order({pos:this}); + this.get('orders').add(order); + this.set('selectedOrder', order); }, - - // attemps to send all pending orders ( stored in the DAO ) to the server. - // it will do it one by one, and remove the successfully sent ones from the DAO once - // it has been confirmed that they have been received. + + // attemps to send all pending orders ( stored in the pos_db ) to the server, + // and remove the successfully sent ones from the db once + // it has been confirmed that they have been sent correctly. flush: function() { //this makes sure only one _int_flush is called at the same time return this.flush_mutex.exec(_.bind(function() { - return this._int_flush(); + return this._flush(0); }, this)); }, - _int_flush : function() { + // attempts to send an order of index 'index' in the list of order to send. The index + // is used to skip orders that failed. do not call this method outside the mutex provided + // by flush() + _flush: function(index){ var self = this; + var orders = this.db.get_orders(); + self.set('nbr_pending_operations',orders.length); - this.dao.get_operations().pipe(function(operations) { - // operations are really Orders that are converted to json. - // they are saved to disk and then we attempt to send them to the backend so that they can - // be applied. - // since the network is not reliable we potentially have many 'pending operations' that have not been sent. - self.set( {'nbr_pending_operations':operations.length} ); - if(operations.length === 0){ - return $.when(); - } - var order = operations[0]; - - // we prevent the default error handler and assume errors - // are a normal use case, except we stop the current iteration - - return (new instance.web.Model('pos.order')).get_func('create_from_ui')([order]) - .fail(function(unused, event){ - // wtf ask niv - event.preventDefault(); - }) - .pipe(function(){ - // success: remove the successfully sent operation, and try to send the next one - self.dao.remove_operation(operations[0].id).pipe(function(){ - return self._int_flush(); - }); - }, function(){ - // in case of error we just sit there and do nothing. wtf ask niv - return $.when(); - }); - }); - }, - - // this adds several properties to the categories in order to make it easier to diplay them - // fields added include the list of product relevant to each category, list of child categories, - // list of ancestors, etc. - build_categories : function(){ - var categories = this.get('categories'); - var products = this.get('product_list'); - - //append the content of array2 into array1 - function append(array1, array2){ - for(var i = 0, len = array2.length; i < len; i++){ - array1.push(array2[i]); - } - } - - function appendSet(set1, set2){ - for(key in set2){ - set1[key] = set2[key]; - } - } - - var categories_by_id = {}; - for(var i = 0; i < categories.length; i++){ - categories_by_id[categories[i].id] = categories[i]; - } - this.categories_by_id = categories_by_id; - - var root_category = { - name : 'Root', - id : 0, - parent : null, - childrens : [], - }; - - // add parent and childrens field to categories, find root_categories - for(var i = 0; i < categories.length; i++){ - var cat = categories[i]; - - cat.parent = categories_by_id[cat.parent_id[0]]; - if(!cat.parent){ - root_category.childrens.push(cat); - cat.parent = root_category; - } - - cat.childrens = []; - for(var j = 0; j < cat.child_id.length; j++){ - cat.childrens.push(categories_by_id[ cat.child_id[j] ]); - } - } - - categories.push(root_category); - - // set some default fields for next steps - for(var i = 0; i < categories.length; i++){ - var cat = categories[i]; - - cat.product_list = []; //list of all products in the category - cat.product_set = {}; // [product.id] === true if product is in category - cat.weightable_product_list = []; - cat.weightable_product_set = {}; - cat.weightable = false; //true if directly contains weightable products - } - - this.root_category = root_category; - - //we add the products to the categories. - for(var i = 0, len = products.length; i < len; i++){ - var product = products[i]; - var cat = categories_by_id[product.pos_categ_id[0]]; - if(cat){ - cat.product_list.push(product); - cat.product_set[product.id] = true; - if(product.to_weight){ - cat.weightable_product_list.push(product); - cat.weightable_product_set[product.id] = true; - cat.weightable = true; - } - } + var order = orders[index]; + if(!order){ + return; } + //try to push an order to the server + (new instance.web.Model('pos.order')).get_func('create_from_ui')([order]) + .fail(function(unused, event){ + //don't show error popup if it fails + event.preventDefault(); + console.error('Failed to send order:',order); + self._flush(index+1); + }) + .done(function(){ + //remove from db if success + self.db.remove_order(order.id); + self._flush(index); + }); + }, - // we build a flat list of all categories that directly contains weightable products - this.weightable_categories = []; - for(var i = 0, len = categories.length; i < len; i++){ - var cat = categories[i]; - if(cat.weightable){ - this.weightable_categories.push(cat); - } - } - - // add ancestor field to categories, contains the list of parents of parents, from root to parent - function make_ancestors(cat, ancestors){ - cat.ancestors = ancestors.slice(0); - ancestors.push(cat); + scan_product: function(parsed_ean){ + var self = this; + var product = this.db.get_product_by_ean13(parsed_ean.base_ean); + var selectedOrder = this.get('selectedOrder'); - for(var i = 0; i < cat.childrens.length; i++){ - make_ancestors(cat.childrens[i], ancestors.slice(0)); - } + if(!product){ + return false; } - - //add the products of the subcategories to the parent categories - function make_products(cat){ - for(var i = 0; i < cat.childrens.length; i++){ - make_products(cat.childrens[i]); - - append(cat.product_list, cat.childrens[i].product_list); - append(cat.weightable_product_list, cat.childrens[i].weightable_product_list); - appendSet(cat.product_set, cat.childrens[i].product_set); - appendSet(cat.weightable_product_set, cat.childrens[i].weightable_product_set); - } + if(parsed_ean.type === 'price'){ + selectedOrder.addProduct(new module.Product(product), {price:parsed_ean.value}); + }else if(parsed_ean.type === 'weight'){ + selectedOrder.addProduct(new module.Product(product), {quantity:parsed_ean.value, merge:false}); + }else{ + selectedOrder.addProduct(new module.Product(product)); } - - make_ancestors(root_category,[]); - make_products(root_category); + return true; }, }); @@ -608,15 +389,10 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal return false; }else if(this.get_discount() > 0){ // we don't merge discounted orderlines return false; - }else if(this.get_product_type() === 'unit'){ - return true; - }else if(this.get_product_type() === 'weight'){ - return true; - }else if(this.get_product_type() === 'price'){ - return this.get_product().get('list_price') === orderline.get_product().get('list_price'); - }else{ - console.error('point_of_sale/pos_models.js/Orderline.can_be_merged_with() : unknown product type:',this.get('product_type')); + }else if(this.price !== orderline.price){ return false; + }else{ + return true; } }, merge: function(orderline){ @@ -882,6 +658,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal change: this.getChange(), name : this.getName(), client: client ? client.name : null , + invoice_id: null, //TODO cashier: cashier ? cashier.name : null, date: { year: date.getFullYear(), @@ -895,7 +672,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal email: company.email, website: company.website, company_registry: company.company_registry, - contact_address: null, //TODO + contact_address: company.contact_address, vat: company.vat, name: company.name, phone: company.phone, diff --git a/addons/point_of_sale/static/src/js/pos_screens.js b/addons/point_of_sale/static/src/js/screens.js index 0515eb9807b..738eadb08c5 100644 --- a/addons/point_of_sale/static/src/js/pos_screens.js +++ b/addons/point_of_sale/static/src/js/screens.js @@ -152,14 +152,6 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.pos_widget.screen_selector.show_popup('help'); }, - logout_button_action: function(){ - this.pos_widget.screen_selector.set_user_mode('client'); - }, - - close_button_action: function(){ - this.pos_widget.try_close(); - }, - barcode_product_screen: 'products', //if defined, this screen will be loaded when a product is scanned barcode_product_error_popup: 'error', //if defined, this popup will be loaded when there's an error in the popup @@ -167,14 +159,16 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa // it will add the product to the order and go to barcode_product_screen. Or show barcode_product_error_popup if // there's an error. barcode_product_action: function(ean){ - if(this.pos_widget.scan_product(ean)){ - this.pos.proxy.scan_item_success(); - if(this.barcode_product_screen){ - this.pos_widget.screen_selector.set_current_screen(this.barcode_product_screen); + var self = this; + if(self.pos.scan_product(ean)){ + self.pos.proxy.scan_item_success(ean); + if(self.barcode_product_screen){ + self.pos_widget.screen_selector.set_current_screen(self.barcode_product_screen); } }else{ - if(this.barcode_product_error_popup){ - this.pos_widget.screen_selector.show_popup(this.barcode_product_error_popup); + self.pos.proxy.scan_item_error_unrecognized(ean); + if(self.barcode_product_error_popup && self.pos_widget.screen_selector.get_user_mode() !== 'cashier'){ + self.pos_widget.screen_selector.show_popup(self.barcode_product_error_popup); } } }, @@ -194,6 +188,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa return true; } } + this.pos.proxy.scan_item_unrecognized(ean); return false; }, @@ -207,9 +202,11 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa if(users[i].ean13 === ean.ean){ this.pos.get('selectedOrder').set_client(users[i]); this.pos_widget.username.refresh(); + this.pos.proxy.scan_item_success(ean); return true; } } + this.pos.proxy.scan_item_unrecognized(ean); return false; //TODO start the transaction }, @@ -217,29 +214,78 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa // what happens when a discount barcode is scanned : the default behavior // is to set the discount on the last order. barcode_discount_action: function(ean){ + this.pos.proxy.scan_item_success(ean); var last_orderline = this.pos.get('selectedOrder').getLastOrderline(); if(last_orderline){ last_orderline.set_discount(ean.value) } }, + // shows an action bar on the screen. The actionbar is automatically shown when you add a button + // with add_action_button() + show_action_bar: function(){ + this.pos_widget.action_bar.show(); + this.$element.css({'bottom':'105px'}); + }, + + // hides the action bar. The actionbar is automatically hidden when it is empty + hide_action_bar: function(){ + this.pos_widget.action_bar.hide(); + this.$element.css({'bottom':'0px'}); + }, + + // adds a new button to the action bar. The button definition takes three parameters, all optional : + // - label: the text below the button + // - icon: a small icon that will be shown + // - click: a callback that will be executed when the button is clicked. + // the method returns a reference to the button widget, and automatically show the actionbar. + add_action_button: function(button_def){ + this.show_action_bar(); + return this.pos_widget.action_bar.add_new_button(button_def); + }, + // this method shows the screen and sets up all the widget related to this screen. Extend this method // if you want to alter the behavior of the screen. show: function(){ + var self = this; + this.hidden = false; if(this.$element){ this.$element.show(); } + if(this.pos_widget.action_bar.get_button_count() > 0){ + this.show_action_bar(); + }else{ + this.hide_action_bar(); + } + + // we add the help button by default. we do this because the buttons are cleared on each refresh so that + // the button stay local to each screen + this.pos_widget.left_action_bar.add_new_button({ + label: 'help', + icon: '/point_of_sale/static/src/img/icons/png48/help.png', + click: function(){ self.help_button_action(); }, + }); + var self = this; var cashier_mode = this.pos_widget.screen_selector.get_user_mode() === 'cashier'; this.pos_widget.set_numpad_visible(this.show_numpad && cashier_mode); this.pos_widget.set_leftpane_visible(this.show_leftpane); + this.pos_widget.set_left_action_bar_visible(this.show_leftpane && !cashier_mode); this.pos_widget.set_cashier_controls_visible(cashier_mode); - this.pos_widget.action_bar.set_element_visible('help-button', !cashier_mode, function(){ self.help_button_action(); }); - this.pos_widget.action_bar.set_element_visible('logout-button', cashier_mode && this.pos.use_selfcheckout, function(){ self.logout_button_action(); }); - this.pos_widget.action_bar.set_element_visible('close-button', cashier_mode, function(){ self.close_button_action(); }); + + if(cashier_mode && this.pos.iface_self_checkout){ + this.pos_widget.client_button.show(); + }else{ + this.pos_widget.client_button.hide(); + } + if(cashier_mode){ + this.pos_widget.close_button.show(); + }else{ + this.pos_widget.close_button.hide(); + } this.pos_widget.username.set_user_mode(this.pos_widget.screen_selector.get_user_mode()); @@ -251,16 +297,14 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa }); }, - // this method is called when the screen is closed to make place for a new screen. this is a good place // to put your cleanup stuff as it is guaranteed that for each show() there is one and only one close() close: function(){ if(this.pos.barcode_reader){ this.pos.barcode_reader.reset_action_callbacks(); } - if(this.pos_widget.action_bar){ - this.pos_widget.action_bar.destroy_buttons(); - } + this.pos_widget.action_bar.destroy_buttons(); + this.pos_widget.left_action_bar.destroy_buttons(); }, // this methods hides the screen. It's not a good place to put your cleanup stuff as it is called on the @@ -349,6 +393,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ScaleInviteScreenWidget = module.ScreenWidget.extend({ template:'ScaleInviteScreenWidget', + next_screen:'scale', + previous_screen:'products', + show: function(){ this._super(); var self = this; @@ -359,21 +406,19 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa var weight = self.pos.proxy.weighting_read_kg(); if(weight > 0.001){ clearInterval(this.intervalID); - self.pos_widget.screen_selector.set_current_screen('scale'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); } },500); - this.pos_widget.action_bar.add_new_button( - { + this.add_action_button({ label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ clearInterval(this.intervalID); self.pos.proxy.weighting_end(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } - } - ); + }); }, close: function(){ this._super(); @@ -383,25 +428,30 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ScaleScreenWidget = module.ScreenWidget.extend({ template:'ScaleScreenWidget', + + next_screen: 'products', + previous_screen: 'products', + show: function(){ this._super(); this.renderElement(); var self = this; - this.pos_widget.action_bar.add_new_button({ + + this.add_action_button({ label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } }); - this.validate_button = this.pos_widget.action_bar.add_new_button({ + this.validate_button = this.add_action_button({ label: 'Validate', icon: '/point_of_sale/static/src/img/icons/png48/validate.png', click: function(){ self.order_product(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); }, }); @@ -419,7 +469,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this._super(); this.$('.product-picture').click(function(){ self.order_product(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); }); }, get_product: function(){ @@ -444,7 +494,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa }, get_product_image: function(){ var product = this.get_product(); - return product ? product.get('image_medium') : undefined; + return product ? product.get('image') : undefined; }, get_product_weight: function(){ return this.weight || 0; @@ -458,6 +508,10 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.ClientPaymentScreenWidget = module.ScreenWidget.extend({ template:'ClientPaymentScreenWidget', + + next_screen: 'welcome', + previous_screen: 'products', + show: function(){ this._super(); var self = this; @@ -486,7 +540,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa self.pos.push_order(currentOrder.exportAsJSON()).then(function() { currentOrder.destroy(); self.pos.proxy.transaction_end(); - self.pos_widget.screen_selector.set_current_screen('welcome'); + self.pos_widget.screen_selector.set_current_screen(self.next_screen); }); }else if(payment === 'payment_rejected'){ clearInterval(this.intervalID); @@ -494,17 +548,15 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa } },500); - this.pos_widget.action_bar.add_new_button( - { + this.add_action_button({ label: 'back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', - click: function(){ //TODO Go to ask for weighting screen + click: function(){ clearInterval(this.intervalID); self.pos.proxy.payment_canceled(); - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.previous_screen); } - } - ); + }); }, close: function(){ this._super(); @@ -515,23 +567,32 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.WelcomeScreenWidget = module.ScreenWidget.extend({ template:'WelcomeScreenWidget', + next_screen: 'products', + show_numpad: false, show_leftpane: false, barcode_client_action: function(ean){ this._super(ean); - this.pos_widget.screen_selector.set_current_screen('products'); + this.pos_widget.screen_selector.set_current_screen(this.next_screen); }, show: function(){ this._super(); var self = this; + $('.goodbye-message').css({opacity:1}).show(); + setTimeout(function(){ + $('.goodbye-message').animate({opacity:0},500,'swing',function(){$('.goodbye-message').hide();}); + },3000); }, }); module.ProductScreenWidget = module.ScreenWidget.extend({ template:'ProductScreenWidget', + scale_screen: 'scale_invite', + client_next_screen: 'client_payment', + show_numpad: true, show_leftpane: true, @@ -542,8 +603,8 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.product_list_widget = new module.ProductListWidget(this,{ click_product_action: function(product){ - if(product.get('to_weight') && self.pos.use_scale){ - self.pos_widget.screen_selector.set_current_screen('scale_invite', {product: product}); + if(product.get('to_weight') && self.pos.iface_electronic_scale){ + self.pos_widget.screen_selector.set_current_screen(self.scale_screen, {product: product}); }else{ self.pos.get('selectedOrder').addProduct(product); } @@ -559,16 +620,16 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.product_categories_widget.reset_category(); this.pos_widget.order_widget.set_numpad_state(this.pos_widget.numpad.state); - if(this.pos.use_virtual_keyboard){ + if(this.pos.iface_vkeyboard){ this.pos_widget.onscreen_keyboard.connect(); } if(this.pos_widget.screen_selector.current_mode === 'client'){ - this.pos_widget.action_bar.add_new_button({ + this.add_action_button({ label: 'pay', icon: '/point_of_sale/static/src/img/icons/png48/go-next.png', click: function(){ - self.pos_widget.screen_selector.set_current_screen('client_payment'); + self.pos_widget.screen_selector.set_current_screen(self.client_next_screen); } }); } @@ -604,17 +665,19 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this._super(); var self = this; - this.pos_widget.action_bar.add_new_button({ + this.add_action_button({ label: 'Print', icon: '/point_of_sale/static/src/img/icons/png48/printer.png', click: function(){ self.print(); }, }); - this.pos_widget.action_bar.add_new_button({ + this.add_action_button({ label: 'Next Order', icon: '/point_of_sale/static/src/img/icons/png48/go-next.png', click: function() { self.finishOrder(); }, }); + + window.print(); }, print: function() { window.print(); @@ -643,6 +706,8 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa module.PaymentScreenWidget = module.ScreenWidget.extend({ template: 'PaymentScreenWidget', + back_screen: 'products', + next_screen: 'receipt', init: function(parent, options) { this._super(parent,options); this.model = options.model; @@ -654,21 +719,21 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this._super(); var self = this; - if(this.pos.use_cashbox){ + if(this.pos.iface_cashdrawer){ this.pos.proxy.open_cashbox(); } this.set_numpad_state(this.pos_widget.numpad.state); - this.back_button = this.pos_widget.action_bar.add_new_button({ + this.back_button = this.add_action_button({ label: 'Back', icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png', click: function(){ - self.pos_widget.screen_selector.set_current_screen('products'); + self.pos_widget.screen_selector.set_current_screen(self.back_screen); }, }); - this.validate_button = this.pos_widget.action_bar.add_new_button({ + this.validate_button = this.add_action_button({ label: 'Validate', icon: '/point_of_sale/static/src/img/icons/png48/validate.png', click: function(){ @@ -682,24 +747,18 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa this.pos_widget.payment_screen.set_numpad_state(null); }, back: function() { - this.pos_widget.screen_selector.set_current_screen('products'); + this.pos_widget.screen_selector.set_current_screen(self.back_screen); }, validateCurrentOrder: function() { - var self = this; var currentOrder = this.pos.get('selectedOrder'); - this.validate_button.$element.attr('disabled','disabled'); //FIXME is the css actually using this attr ? - this.pos.push_order(currentOrder.exportAsJSON()) - .then(function() { - self.validate_button.$element.removeAttr('disabled'); - if(self.pos.use_proxy_printer){ - self.pos.proxy.print_receipt(currentOrder.export_for_printing()); - self.pos.get('selectedOrder').destroy(); //finish order and go back to scan screen - }else{ - self.pos_widget.screen_selector.set_current_screen('receipt'); - } - }); + if(this.pos.iface_print_via_proxy){ + this.pos.proxy.print_receipt(currentOrder.export_for_printing()); + this.pos.get('selectedOrder').destroy(); //finish order and go back to scan screen + }else{ + this.pos_widget.screen_selector.set_current_screen(this.next_screen); + } }, bindPaymentLineEvents: function() { this.currentPaymentLines = (this.pos.get('selectedOrder')).get('paymentLines'); diff --git a/addons/point_of_sale/static/src/js/pos_basewidget.js b/addons/point_of_sale/static/src/js/widget_base.js index 62097f39db3..62097f39db3 100644 --- a/addons/point_of_sale/static/src/js/pos_basewidget.js +++ b/addons/point_of_sale/static/src/js/widget_base.js diff --git a/addons/point_of_sale/static/src/js/pos_keyboard_widget.js b/addons/point_of_sale/static/src/js/widget_keyboard.js index 2e683edb1e1..2e683edb1e1 100644 --- a/addons/point_of_sale/static/src/js/pos_keyboard_widget.js +++ b/addons/point_of_sale/static/src/js/widget_keyboard.js diff --git a/addons/point_of_sale/static/src/js/pos_scrollbar_widget.js b/addons/point_of_sale/static/src/js/widget_scrollbar.js index d4f6903c435..7c765028231 100644 --- a/addons/point_of_sale/static/src/js/pos_scrollbar_widget.js +++ b/addons/point_of_sale/static/src/js/widget_scrollbar.js @@ -65,6 +65,7 @@ function openerp_pos_scrollbar(instance, module){ //module is instance.point_of_ this.auto_hide(false); this.$element.bind('mousewheel',function(event,delta){ self.scroll(delta*self.wheel_step); + return false; }); this.$element.bind('click',function(event){ var vpos = event.pageY - self.$element.offset().top; diff --git a/addons/point_of_sale/static/src/js/pos_widgets.js b/addons/point_of_sale/static/src/js/widgets.js index 9a27be29381..c3bd73ca35a 100644 --- a/addons/point_of_sale/static/src/js/pos_widgets.js +++ b/addons/point_of_sale/static/src/js/widgets.js @@ -1,6 +1,57 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sale var QWeb = instance.web.qweb; + // The ImageCache is used to hide the latency of the application cache on-disk access in chrome + // that causes annoying flickering on product pictures. Why the hell a simple access to + // the application cache involves such latency is beyond me, hopefully one day this can be + // removed. + module.ImageCache = instance.web.Class.extend({ + init: function(options){ + options = options || {}; + this.max_size = options.max_size || 500; + + this.cache = {}; + this.access_time = {}; + this.size = 0; + }, + get_image_uncached: function(url){ + var img = new Image(); + img.src = url; + return img; + }, + // returns a DOM Image object from an url, and cache the last 500 (by default) results + get_image: function(url){ + var cached = this.cache[url]; + if(cached){ + this.access_time[url] = (new Date()).getTime(); + return cached; + }else{ + var img = new Image(); + img.src = url; + while(this.size >= this.max_size){ + var oldestUrl = null; + var oldestTime = (new Date()).getTime(); + for(var url in this.cache){ + var time = this.access_time[url]; + if(time <= oldestTime){ + oldestTime = time; + oldestUrl = url; + } + } + if(oldestUrl){ + delete this.cache[oldestUrl]; + delete this.access_time[oldestUrl]; + } + this.size--; + } + this.cache[url] = img; + this.access_time[url] = (new Date()).getTime(); + this.size++; + return img; + } + }, + }); + module.NumpadWidget = module.PosBaseWidget.extend({ template:'NumpadWidget', init: function(parent, options) { @@ -112,7 +163,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa template:'OrderWidget', init: function(parent, options) { this._super(parent,options); - this.compact = false; + this.display_mode = options.display_mode || 'numpad'; // 'maximized' | 'actionbar' | 'numpad' this.set_numpad_state(options.numpadState); this.pos.bind('change:selectedOrder', this.change_selected_order, this); this.bind_orderline_events(); @@ -165,8 +216,12 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa var self = this; this._super(); - if(!this.compact){ + if(this.display_mode === 'maximized'){ $('.point-of-sale .order-container').css({'bottom':'0px'}); + }else if(this.display_mode === 'actionbar'){ + $('.point-of-sale .order-container').css({'bottom':'105px'}); + }else if(this.display_mode !== 'numpad'){ + console.error('ERROR: OrderWidget renderElement(): wrong display_mode:',this.display_mode); } var $content = this.$('.orderlines'); @@ -211,9 +266,9 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa var total = order ? order.getTotal() : 0; this.$('.summary .value.total').html(this.format_currency(total)); }, - set_compact: function(compact){ - if(this.compact !== compact){ - this.compact = compact; + set_display_mode: function(mode){ + if(this.display_mode !== mode){ + this.display_mode = mode; this.renderElement(); } }, @@ -225,20 +280,16 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this._super(parent,options); this.model = options.model; this.model.attributes.weight = options.weight; - this.next_screen = options.next_screen; - this.click_product_action = options.click_product_action; + this.next_screen = options.next_screen; //when a product is clicked, this screen is set + this.click_product_action = options.click_product_action; }, - add_to_order: function(event) { - /* Preserve the category URL */ - event.preventDefault(); - return (this.pos.get('selectedOrder')).addProduct(this.model); - }, - set_weight: function(weight){ - this.model.attributes.weight = weight; - this.renderElement(); + // returns the url of the product thumbnail + get_image_url: function() { + return '/web/binary/image?session_id='+instance.session.session_id+'&model=product.product&field=image&id='+this.model.get('id'); }, renderElement: function() { this._super(); + this.$('img').replaceWith(this.pos_widget.image_cache.get_image(this.get_image_url())); var self = this; $("a", this.$element).click(function(e){ if(self.click_product_action){ @@ -313,6 +364,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa module.ActionButtonWidget = instance.web.Widget.extend({ template:'ActionButtonWidget', + icon_template:'ActionButtonWidgetWithIcon', init: function(parent, options){ this._super(parent, options); this.label = options.label || 'button'; @@ -320,7 +372,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.click_action = options.click; if(options.icon){ this.icon = options.icon; - this.template = 'ActionButtonWidgetWithIcon'; + this.template = this.icon_template; } }, renderElement: function(){ @@ -359,21 +411,25 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.button_list = []; return this; }, + get_button_count: function(){ + return this.button_list.length; + }, add_new_button: function(button_options){ - if(arguments.length == 1){ - var button = new module.ActionButtonWidget(this,button_options); - this.button_list.push(button); - button.appendTo($('.pos-actionbar-button-list')); - return button; - }else{ - for(var i = 0; i < arguments.length; i++){ - this.add_new_button(arguments[i]); - } - } - return undefined; + var button = new module.ActionButtonWidget(this,button_options); + this.button_list.push(button); + button.appendTo(this.$('.pos-actionbar-button-list')); + return button; + }, + show:function(){ + this.$element.show(); + }, + hide:function(){ + this.$element.hide(); }, }); + module.CategoryButton = module.PosBaseWidget.extend({ + }); module.ProductCategoriesWidget = module.PosBaseWidget.extend({ template: 'ProductCategoriesWidget', init: function(parent, options){ @@ -389,41 +445,53 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // changes the category. if undefined, sets to root category set_category : function(category){ + var db = this.pos.db; if(!category){ - this.category = this.pos.root_category; + this.category = db.get_category_by_id(db.root_category_id); }else{ this.category = category; } - this.breadcrumb = []; - for(var i = 1; i < this.category.ancestors.length; i++){ - this.breadcrumb.push(this.category.ancestors[i]); + var ancestors_ids = db.get_category_ancestors_ids(this.category.id); + for(var i = 1; i < ancestors_ids.length; i++){ + this.breadcrumb.push(db.get_category_by_id(ancestors_ids[i])); } - if(this.category !== this.pos.root_category){ + if(this.category.id !== db.root_category_id){ this.breadcrumb.push(this.category); } - if(this.product_type === 'weightable'){ - this.subcategories = []; - for(var i = 0; i < this.category.childrens.length; i++){ - if(this.category.childrens[i].weightable_product_list.length > 0){ - this.subcategories.push( this.category.childrens[i]); - } - } - }else{ - this.subcategories = this.category.childrens || []; - } + this.subcategories = db.get_category_by_id(db.get_category_childs_ids(this.category.id)); + }, + + get_image_url: function(category){ + return '/web/binary/image?session_id='+instance.session.session_id+'&model=pos.category&field=image&id='+category.id; }, renderElement: function(){ var self = this; this._super(); + + var hasimages = false; //if none of the subcategories have images, we don't display buttons with icons + _.each(this.subcategories, function(category){ + if(category.image){ + hasimages = true; + } + }); + _.each(this.subcategories, function(category){ - var button = QWeb.render('CategoryButton',{category:category}); - button = _.str.trim(button); + if(hasimages){ + var button = QWeb.render('CategoryButton',{category:category}); + var button = _.str.trim(button); + var button = $(button); + button.find('img').replaceWith(self.pos_widget.image_cache.get_image(self.get_image_url(category))); + }else{ + var button = QWeb.render('CategorySimpleButton',{category:category}); + button = _.str.trim(button); // we remove whitespace between buttons to fix spacing + var button = $(button); + } - $(button).appendTo(this.$('.category-list')).click(function(event){ + button.appendTo(this.$('.category-list')).click(function(event){ var id = category.id; - var cat = self.pos.categories_by_id[id]; + var cat = self.pos.db.get_category_by_id(id); self.set_category(cat); self.renderElement(); self.search_and_categories(cat); @@ -432,7 +500,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // breadcrumb click actions this.$(".oe-pos-categories-list a").click(function(event){ var id = $(event.target).data("category-id"); - var category = self.pos.categories_by_id[id]; + var category = self.pos.db.get_category_by_id(id); self.set_category(category); self.renderElement(); self.search_and_categories(category); @@ -455,47 +523,30 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // filters the products, and sets up the search callbacks search_and_categories: function(category){ var self = this; - - var all_products = this.pos.get('product_list'); - var all_packages = this.pos.get('product.packaging'); // find all products belonging to the current category - var products = []; - if(this.product_type === 'weightable'){ - products = all_products.filter( function(product){ - return self.category.weightable_product_set[product.id]; - }); - }else{ - products = all_products.filter( function(product){ - return self.category.product_set[product.id]; - }); - } + var products = this.pos.db.get_product_by_category(this.category.id); + self.pos.get('products').reset(products); - // product lists watch for reset events on 'products' to re-render. - // FIXME that means all productlist widget re-render... even the hidden ones ! - this.pos.get('products').reset(products); - - // find all the products whose name match the query in the searchbox + // filter the products according to the search string this.$('.searchbox input').keyup(function(){ - var results, search_str; - search_str = $(this).val().toLowerCase(); - if(search_str){ - results = products.filter( function(p){ - return p.name.toLowerCase().indexOf(search_str) != -1 || - (p.ean13 && p.ean13.indexOf(search_str) != -1); - }); - self.$element.find('.search-clear').fadeIn(); + query = $(this).val().toLowerCase(); + if(query){ + var products = self.pos.db.search_product_in_category(self.category.id, query); + self.pos.get('products').reset(products); + self.$('.search-clear').fadeIn(); }else{ - results = products; - self.$element.find('.search-clear').fadeOut(); + var products = self.pos.db.get_product_by_category(self.category.id); + self.pos.get('products').reset(products); + self.$('.search-clear').fadeOut(); } - self.pos.get('products').reset(results); - }); - this.$('.searchbox input').click(function(){ }); + this.$('.searchbox input').click(function(){}); //Why ??? + //reset the search when clicking on reset this.$('.search-clear').click(function(){ + var products = self.pos.db.get_product_by_category(self.category.id); self.pos.get('products').reset(products); self.$('.searchbox input').val('').focus(); self.$('.search-clear').fadeOut(); @@ -519,11 +570,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.renderElement(); }); }, - set_weight: function(weight){ - for(var i = 0; i < this.product_list.length; i++){ - this.product_list[i].set_weight(weight); - } - }, renderElement: function() { var self = this; this._super(); @@ -586,14 +632,35 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }, }); + module.HeaderButtonWidget = module.PosBaseWidget.extend({ + template: 'HeaderButtonWidget', + init: function(parent, options){ + options = options || {}; + this._super(parent, options); + this.action = options.action; + this.label = options.label; + }, + renderElement: function(){ + var self = this; + this._super(); + if(this.action){ + this.$element.click(function(){ self.action(); }); + } + }, + show: function(){ this.$element.show(); }, + hide: function(){ this.$element.hide(); }, + + }); + + // ---------- Main Point of Sale Widget ---------- // this is used to notify the user that data is being synchronized on the network module.SynchNotificationWidget = module.PosBaseWidget.extend({ template: "SynchNotificationWidget", - init: function(parent,options) { + init: function(parent, options){ options = options || {}; - this._super(parent,options); + this._super(parent, options); }, renderElement: function() { var self = this; @@ -632,9 +699,19 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa this.pos_widget = this; //So that pos_widget's childs have pos_widget set automatically this.numpad_visible = true; + this.left_action_bar_visible = true; this.leftpane_visible = true; this.leftpane_width = '440px'; this.cashier_controls_visible = true; + this.image_cache = new module.ImageCache(); // for faster products image display + + /* + //Epileptic mode + setInterval(function(){ + $('body').css({'-webkit-filter':'hue-rotate('+Math.random()*360+'deg)' }); + },100); + */ + }, start: function() { @@ -643,7 +720,9 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.build_currency_template(); self.renderElement(); - self.$('.neworder-button').click(_.bind(self.create_new_order, self)); + self.$('.neworder-button').click(function(){ + self.pos.add_new_order(); + }); //when a new order is created, add an order button widget self.pos.get('orders').bind('add', function(new_order){ @@ -659,6 +738,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.build_widgets(); + self.screen_selector.set_default_screen(); + + self.pos.barcode_reader.connect(); + instance.webclient.set_content_full_screen(true); if (!self.pos.get('pos_session')) { @@ -667,9 +750,14 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa self.screen_selector.show_popup('error', 'Sorry, we could not find any PoS Configuration for this session'); } - self.$('.loader').animate({opacity:0},3000,'swing',function(){$('.loader').hide();}); + self.$('.loader').animate({opacity:0},1500,'swing',function(){self.$('.loader').hide();}); self.$('.loader img').hide(); + if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){ + window.pos = self.pos; + window.pos_widget = self.pos_widget; + } + },function(){ // error when loading models data from the backend self.$('.loader img').hide(); return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_session_opening']], ['res_id']) @@ -682,8 +770,11 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }, self)); }); }, - + + // This method instantiates all the screens, widgets, etc. If you want to add new screens change the + // startup screen, etc, override this method. build_widgets: function() { + var self = this; // -------- Screens --------- @@ -725,13 +816,16 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa // -------- Misc --------- this.notification = new module.SynchNotificationWidget(this,{}); - this.notification.replace(this.$('.placeholder-SynchNotificationWidget')); + this.notification.appendTo(this.$('#rightheader')); this.username = new module.UsernameWidget(this,{}); this.username.replace(this.$('.placeholder-UsernameWidget')); this.action_bar = new module.ActionBarWidget(this); - this.action_bar.appendTo($(".point-of-sale #content")); + this.action_bar.appendTo($(".point-of-sale #rightpane")); + + this.left_action_bar = new module.ActionBarWidget(this); + this.left_action_bar.appendTo($(".point-of-sale #leftpane")); this.paypad = new module.PaypadWidget(this, {}); this.paypad.replace($('#placeholder-PaypadWidget')); @@ -746,6 +840,19 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa 'keyboard_model': 'simple' }); this.onscreen_keyboard.appendTo($(".point-of-sale #content")); + + this.close_button = new module.HeaderButtonWidget(this,{ + label:'Close', + action: function(){ self.try_close(); }, + }); + this.close_button.appendTo(this.$('#rightheader')); + + this.client_button = new module.HeaderButtonWidget(this,{ + label:'Self-Checkout', + action: function(){ self.screen_selector.set_user_mode('client'); }, + }); + this.client_button.appendTo(this.$('#rightheader')); + // -------- Screen Selector --------- @@ -768,59 +875,11 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }, default_client_screen: 'welcome', default_cashier_screen: 'products', - default_mode: this.pos.use_selfcheckout ? 'client' : 'cashier', + default_mode: this.pos.iface_self_checkout ? 'client' : 'cashier', }); - this.screen_selector.set_default_screen(); - - this.pos.barcode_reader.connect(); - }, - - //FIXME this method is probably not at the right place ... - scan_product: function(parsed_ean){ - var selectedOrder = this.pos.get('selectedOrder'); - var scannedProductModel = this.get_product_by_ean(parsed_ean); - if (!scannedProductModel){ - return false; - } else { - if(parsed_ean.type === 'price'){ - selectedOrder.addProduct(new module.Product(scannedProductModel), { price:parsed_ean.value}); - }else if(parsed_ean.type === 'weight'){ - selectedOrder.addProduct(new module.Product(scannedProductModel), { quantity:parsed_ean.value, merge:false}); - }else{ - selectedOrder.addProduct(new module.Product(scannedProductModel)); - } - return true; - } }, - get_product_by_ean: function(parsed_ean) { - var allProducts = this.pos.get('product_list'); - var allPackages = this.pos.get('product.packaging'); - var scannedProductModel = undefined; - - if (parsed_ean.type === 'price' || parsed_ean.type === 'weight') { - var itemCode = parsed_ean.id; - var scannedPackaging = _.detect(allPackages, function(pack) { - return pack.ean && pack.ean.substring(0,7) === itemCode; - }); - if (scannedPackaging) { - scannedProductModel = _.detect(allProducts, function(pc) { return pc.id === scannedPackaging.product_id[0];}); - }else{ - scannedProductModel = _.detect(allProducts, function(pc) { return pc.ean13 && (pc.ean13.substring(0,7) === parsed_ean.id);}); - } - } else if(parsed_ean.type === 'unit'){ - scannedProductModel = _.detect(allProducts, function(pc) { return pc.ean13 === parsed_ean.ean;}); //TODO DOES NOT SCALE - } - return scannedProductModel; - }, - // creates a new order, and add it to the list of orders. - create_new_order: function() { - var new_order; - new_order = new module.Order({ pos: this.pos }); - this.pos.get('orders').add(new_order); - this.pos.set({ selectedOrder: new_order }); - }, changed_pending_operations: function () { var self = this; this.synch_notification.on_change_nbr_pending(self.pos.get('nbr_pending_operations').length); @@ -830,16 +889,35 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa if(visible !== this.numpad_visible){ this.numpad_visible = visible; if(visible){ + this.set_left_action_bar_visible(false); this.numpad.show(); this.paypad.show(); - this.order_widget.set_compact(true); + this.order_widget.set_display_mode('numpad'); }else{ this.numpad.hide(); this.paypad.hide(); - this.order_widget.set_compact(false); + if(this.order_widget.display_mode === 'numpad'){ + this.order_widget.set_display_mode('maximized'); + } + } + } + }, + set_left_action_bar_visible: function(visible){ + if(visible !== this.left_action_bar_visible){ + this.left_action_bar_visible = visible; + if(visible){ + this.set_numpad_visible(false); + this.left_action_bar.show(); + this.order_widget.set_display_mode('actionbar'); + }else{ + this.left_action_bar.hide(); + if(this.order_widget.display_mode === 'actionbar'){ + this.order_widget.set_display_mode('maximized'); + } } } }, + //shows or hide the leftpane (contains the list of orderlines, the numpad, the paypad, etc.) set_leftpane_visible: function(visible){ if(visible !== this.leftpane_visible){ @@ -874,12 +952,14 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa }); }, close: function() { + var self = this; this.pos.barcode_reader.disconnect(); return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_client_pos_menu']], ['res_id']).pipe( _.bind(function(res) { return this.rpc('/web/action/load', {'action_id': res[0]['res_id']}).pipe(_.bind(function(result) { var action = result.result; action.context = _.extend(action.context || {}, {'cancel_action': {type: 'ir.actions.client', tag: 'reload'}}); + //self.destroy(); this.do_action(action); }, this)); }, this)); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index 9bdac93d990..81f929d50e2 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -15,7 +15,7 @@ <button class="neworder-button">+</button> <ol id="orders"></ol> </div> - <span class="placeholder-SynchNotificationWidget"></span> + <!-- here goes header buttons --> </div> </div> <div id="content"> @@ -44,6 +44,12 @@ </div> </t> + <t t-name="HeaderButtonWidget"> + <div class="header-button"> + <t t-esc="widget.label" /> + </div> + </t> + <t t-name="PosCloseWarning"> <div>There are pending operations that could not be saved into the database, are you sure you want to exit?</div> </t> @@ -83,7 +89,7 @@ <t t-name="CategoryButton"> <li class='category-button'> <div class="category-img"> - <img t-att-src="'data:image/gif;base64,'+ category.image_medium" /> + <img src="" /> </div> <div class="category-name"> <t t-esc="category.name"/> @@ -91,6 +97,12 @@ </li> </t> + <t t-name="CategorySimpleButton"> + <li class='category-simple-button'> + <t t-esc="category.name"/> + </li> + </t> + <t t-name="ProductCategoriesWidget"> <header> <ol class="breadcrumb"> @@ -220,7 +232,7 @@ <t t-if="widget.currency.position == 'after'" t-esc="widget.currency.symbol"/> </span> </div> - <div class="infoline"> + <div class="infoline" > <span class='left-block'> Change: </span> @@ -252,6 +264,9 @@ <img src="/point_of_sale/static/src/img/scan.png" /> <p> Please scan an item or your member card </p> </div> + <div class="goodbye-message"> + <p>Thank you for shopping with us.</p> + </div> </t> @@ -342,7 +357,7 @@ <li class='product'> <a href="#"> <div class="product-img"> - <img t-att-src="'data:image/gif;base64,'+ widget.model.get('image_medium')" /> + <img src='' /> <!-- the product thumbnail --> <t t-if="!widget.model.get('to_weight')"> <span class="price-tag"> <t t-esc="widget.format_currency(widget.model.get('list_price'))"/> @@ -493,7 +508,7 @@ <tr><td>Tax:</td><td class="pos-right-align"> <t t-esc="widget.format_currency(widget.currentOrder.getTax().toFixed(2))"/> </td></tr> - <tr><td>Total:</td><td class="pos-right-align"> + <tr class="emph"><td>Total:</td><td class="pos-right-align"> <t t-esc="widget.format_currency(widget.currentOrder.getTotal().toFixed(2))"/> </td></tr> </table> @@ -519,30 +534,7 @@ <t t-name="ActionBarWidget"> <div class="pos-actionbar"> - <div class="pos-actionbar-left-pane"> - <div class="button help-button"> - <div class='icon'> - <img src="/point_of_sale/static/src/img/icons/png48/help.png" /> - <div class='iconlabel'>Help</div> - </div> - </div> - <div class="button close-button"> - <div class='icon'> - <img src="/point_of_sale/static/src/img/icons/png48/shut-down.png" /> - <div class='iconlabel'>Close</div> - </div> - </div> - <div class="button logout-button"> - <div class='icon'> - <img src="/point_of_sale/static/src/img/icons/png48/system-log-out.png" /> - <div class='iconlabel'>Client Mode</div> - </div> - </div> - </div> <ul class="pos-actionbar-button-list"> - <!-- <li class="button">BUTTOOON</li> - <li class="button">JEEENKIINS</li> - <li class="button rightalign">ARGH</li> --> </ul> </div> </t> diff --git a/addons/point_of_sale/static/test.html b/addons/point_of_sale/static/test.html deleted file mode 100644 index d1d58e208c0..00000000000 --- a/addons/point_of_sale/static/test.html +++ /dev/null @@ -1,22 +0,0 @@ -<!doctype html> -<html> - <head> - <title>JSON</title> - - <script type="text/javascript" src="http://localhost:8069/web/webclient/js"></script> - </head> - - <body> - <h1>JSON</h1> - - <p id="response"></p> - - <script type="text/javascript"> - var c = new openerp.init(['web', 'point_of_sale']); - c.connection.session_bind('http://localhost:8069').then(function() { - var w = new c.point_of_sale.test(); - w.appendTo($("#response")); - }); - </script> - </body> -</html> diff --git a/addons/point_of_sale/test/00_register_open.yml b/addons/point_of_sale/test/00_register_open.yml index 7d5aabbcdc3..ce13f3c0f26 100644 --- a/addons/point_of_sale/test/00_register_open.yml +++ b/addons/point_of_sale/test/00_register_open.yml @@ -9,9 +9,3 @@ - !python {model: pos.open.statement}: | self.open_statement(cr, uid, [ref('new_statement_open')], context={}) -- - I check that I have some bank statements open for the admin user -- - !python {model: account.bank.statement}: | - ids = self.search(cr, uid, [('state', 'in', ('open','new')), ('user_id', '=', 1)]) - assert (len(ids)>0), 'No statement open for the admin user!' diff --git a/addons/point_of_sale/tools/eanmaker b/addons/point_of_sale/tools/eanmaker new file mode 100755 index 00000000000..463bd3dedfd --- /dev/null +++ b/addons/point_of_sale/tools/eanmaker @@ -0,0 +1,56 @@ +#!/usr/bin/python + +import sys +import re +import math + +def ean_checksum(eancode): + """returns the checksum of an ean string of length 13, returns -1 if the string has the wrong length""" + if len(eancode) <> 13: + return -1 + oddsum=0 + evensum=0 + total=0 + eanvalue=eancode + reversevalue = eanvalue[::-1] + finalean=reversevalue[1:] + + for i in range(len(finalean)): + if i % 2 == 0: + oddsum += int(finalean[i]) + else: + evensum += int(finalean[i]) + total=(oddsum * 3) + evensum + + check = int(10 - math.ceil(total % 10.0)) %10 + return check + +def check_ean(eancode): + """returns True if eancode is a valid ean13 string, or null""" + if not eancode: + return True + if len(eancode) <> 13: + return False + try: + int(eancode) + except: + return False + return ean_checksum(eancode) == int(eancode[-1]) + +def sanitize_ean13(ean13): + """Creates and returns a valid ean13 from an invalid one""" + if not ean13: + return "0000000000000" + ean13 = re.sub("[A-Za-z]","0",ean13); + ean13 = re.sub("[^0-9]","",ean13); + ean13 = ean13[:13] + if len(ean13) < 13: + ean13 = ean13 + '0' * (13-len(ean13)) + return ean13[:-1] + str(ean_checksum(ean13)) + +def main(): + for arg in sys.argv[1:]: + print sanitize_ean13(arg) + +if __name__ == '__main__': + main() diff --git a/addons/point_of_sale/wizard/pos_session_opening.py b/addons/point_of_sale/wizard/pos_session_opening.py index f7f231b3aa0..d3b6ea28b17 100644 --- a/addons/point_of_sale/wizard/pos_session_opening.py +++ b/addons/point_of_sale/wizard/pos_session_opening.py @@ -4,13 +4,17 @@ from osv import osv, fields from tools.translate import _ import netsvc +from openerp.addons.point_of_sale.point_of_sale import pos_session + class pos_session_opening(osv.osv_memory): _name = 'pos.session.opening' _columns = { 'pos_config_id' : fields.many2one('pos.config', 'Point of Sale', required=True), 'pos_session_id' : fields.many2one('pos.session', 'PoS Session'), - 'pos_state' : fields.char('Session State'), + 'pos_state' : fields.selection(pos_session.POS_SESSION_STATE, + 'Session State', readonly=True), + 'show_config' : fields.boolean('Show Config', readonly=True), } def open_ui(self, cr, uid, ids, context=None): @@ -19,7 +23,7 @@ class pos_session_opening(osv.osv_memory): context['active_id'] = data.pos_session_id.id return { 'type' : 'ir.actions.client', - 'name' : 'Start Point Of Sale', + 'name' : _('Start Point Of Sale'), 'tag' : 'pos.ui', 'context' : context } @@ -87,7 +91,11 @@ class pos_session_opening(osv.osv_memory): if not result: r = self.pool.get('pos.config').search(cr, uid, [], context=context) result = r and r[0] or False + + count = self.pool.get('pos.config').search_count(cr, uid, [('state', '=', 'active')], context=context) + show_config = bool(count > 1) return { - 'pos_config_id' : result + 'pos_config_id' : result, + 'show_config' : show_config, } pos_session_opening() diff --git a/addons/point_of_sale/wizard/pos_session_opening.xml b/addons/point_of_sale/wizard/pos_session_opening.xml index 38f8932bd56..948f1db8c61 100644 --- a/addons/point_of_sale/wizard/pos_session_opening.xml +++ b/addons/point_of_sale/wizard/pos_session_opening.xml @@ -6,14 +6,15 @@ <field name="model">pos.session.opening</field> <field name="arch" type="xml"> <form string="PoS Session Opening" version="7.0"> - <separator string="Select your Point of Sale" colspan="4" /> - <group> + <field name="show_config" invisible="1" /> + <separator string="Select your Point of Sale" colspan="4" attrs="{'invisible' : [('show_config', '=', False)]}" /> + <group attrs="{'invisible' : [('show_config', '=', False)]}"> <field name="pos_config_id" on_change="on_change_config(pos_config_id)" widget="selection" domain="[('state','=','active')]" class="oe_inline"/> + <field name="pos_state" class="oe_inline" attrs="{'invisible' : [('pos_state', '=', False)]}" /> </group> <field name="pos_session_id" invisible="1"/> - <field name="pos_state" invisible="1"/> <button name="open_ui" type="object" string="Start Selling" attrs="{'invisible' : [('pos_state', 'not in', ('opened',))]}" class="oe_highlight" diff --git a/addons/product/product.py b/addons/product/product.py index ae99711a5ec..58f47f9adc3 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -28,18 +28,10 @@ import re import tools from tools.translate import _ -def is_pair(x): - return not x%2 - -def check_ean(eancode): - if not eancode: - return True +def ean_checksum(eancode): + """returns the checksum of an ean string of length 13, returns -1 if the string has the wrong length""" if len(eancode) <> 13: - return False - try: - int(eancode) - except: - return False + return -1 oddsum=0 evensum=0 total=0 @@ -48,17 +40,38 @@ def check_ean(eancode): finalean=reversevalue[1:] for i in range(len(finalean)): - if is_pair(i): + if i % 2 == 0: oddsum += int(finalean[i]) else: evensum += int(finalean[i]) total=(oddsum * 3) + evensum check = int(10 - math.ceil(total % 10.0)) %10 + return check - if check != int(eancode[-1]): +def check_ean(eancode): + """returns True if eancode is a valid ean13 string, or null""" + if not eancode: + return True + if len(eancode) <> 13: + return False + try: + int(eancode) + except: return False - return True + return ean_checksum(eancode) == int(eancode[-1]) + +def sanitize_ean13(ean13): + """Creates and returns a valid ean13 from an invalid one""" + if not ean13: + return "0000000000000" + ean13 = re.sub("[A-Za-z]","0",ean13); + ean13 = re.sub("[^0-9]","",ean13); + ean13 = ean13[:13] + if len(ean13) < 13: + ean13 = ean13 + '0' * (13-len(ean13)) + return ean13[:-1] + str(ean_checksum(ean13)) + #---------------------------------------------------------- # UOM #---------------------------------------------------------- @@ -195,8 +208,10 @@ product_ul() class product_category(osv.osv): def name_get(self, cr, uid, ids, context=None): - if not len(ids): + if isinstance(ids, (list, tuple)) and not len(ids): return [] + if isinstance(ids, (long, int)): + ids = [ids] reads = self.read(cr, uid, ids, ['name','parent_id'], context=context) res = [] for record in reads: @@ -594,6 +609,7 @@ class product_product(osv.osv): res = check_ean(product['ean13']) return res + _constraints = [(_check_ean_key, 'Error: Invalid ean code', ['ean13'])] def on_order(self, cr, uid, ids, orderline, quantity): diff --git a/addons/purchase/i18n/es_MX.po.moved b/addons/purchase/i18n/es_MX.po.moved deleted file mode 100644 index 17eef8e71ff..00000000000 --- a/addons/purchase/i18n/es_MX.po.moved +++ /dev/null @@ -1,1730 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * purchase -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-05 17:03+0000\n" -"PO-Revision-Date: 2011-07-05 17:03+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_confirmingpurchaseorder0 -msgid "The buyer has to approve the RFQ before being sent to the supplier. The RFQ becomes a confirmed Purchase Order." -msgstr "El comprador debe aprobar el RFQ antes de ser enviado al proveedor. El RFQ se convierte en una orden de compra confirmada." - -#. module: purchase -#: code:addons/purchase/purchase.py:292 -#, python-format -msgid "You can not confirm purchase order without Purchase Order Lines." -msgstr "No puede confirmar un pedido de compra sin líneas de pedido de compra" - -#. module: purchase -#: field:purchase.order,invoiced:0 -msgid "Invoiced & Paid" -msgstr "Facturada & Pagada (conciliada)" - -#. module: purchase -#: field:purchase.order,location_id:0 -#: view:purchase.report:0 -#: field:purchase.report,location_id:0 -msgid "Destination" -msgstr "Destino" - -#. module: purchase -#: code:addons/purchase/purchase.py:721 -#, python-format -msgid "You have to select a product UOM in the same category than the purchase UOM of the product" -msgstr "Debe seleccionar una UdM del producto de la misma categoría que la UdM de compra del producto" - -#. module: purchase -#: help:purchase.report,date:0 -msgid "Date on which this document has been created" -msgstr "Fecha en el que fue creado este documento." - -#. module: purchase -#: model:ir.actions.act_window,help:purchase.purchase_rfq -msgid "You can create a request for quotation when you want to buy products to a supplier but the purchase is not confirmed yet. Use also this menu to review requests for quotation created automatically based on your logistic rules (minimum stock, MTO, etc). You can convert the request for quotation into a purchase order once the order is confirmed. If you use the extended interface (from user's preferences), you can select the way to control your supplier invoices: based on the order, based on the receptions or manual encoding." -msgstr "Puede crear una petición de presupuesto cuando quiera obtener productos de un proveedor pero la compra todavía no se haya confirmado. Utilice asimismo este menú para revisar las peticiones de compra creadas automáticamente en base a sus reglas de logística (stock mínimo, obtener bajo pedido, etc). Puede convertir la petición en una compra una vez el pedido se haya confirmado. Si utiliza la interfaz extendida (desde las Preferencias de Usuario), puede elegir la forma de controlar sus facturas de proveedor: basadas en pedido, basadas en recepciones o codificación manual." - -#. module: purchase -#: selection:purchase.order,invoice_method:0 -msgid "From Picking" -msgstr "Desde lista de empaque" - -#. module: purchase -#: view:purchase.order:0 -msgid "Not Invoiced" -msgstr "No facturado" - -#. module: purchase -#: field:purchase.order,dest_address_id:0 -msgid "Destination Address" -msgstr "Dirección destinatario" - -#. module: purchase -#: report:purchase.order:0 -#: field:purchase.report,validator:0 -msgid "Validated By" -msgstr "Validado por" - -#. module: purchase -#: model:ir.model,name:purchase.model_stock_invoice_onshipping -msgid "Stock Invoice Onshipping" -msgstr "Stock factura en el envío" - -#. module: purchase -#: view:purchase.order:0 -#: field:purchase.order,partner_id:0 -#: view:purchase.order.line:0 -#: view:purchase.report:0 -#: field:purchase.report,partner_id:0 -msgid "Supplier" -msgstr "Proveedor" - -#. module: purchase -#: view:purchase.order.line_invoice:0 -msgid "Do you want to generate the supplier invoices?" -msgstr "¿Desea generar las facturas de proveedor?" - -#. module: purchase -#: model:ir.actions.act_window,help:purchase.purchase_form_action -msgid "Use this menu to search within your purchase orders by references, supplier, products, etc. For each purchase order, you can track the products received, and control the supplier invoices." -msgstr "Utilice este menú para buscar en sus pedidos de compra por referencia, proveedor, producto, etc. Para cada pedido de compra, puede obtener los productos recibidos, y controlar las facturas de los proveedores." - -#. module: purchase -#: code:addons/purchase/wizard/purchase_line_invoice.py:156 -#, python-format -msgid "Supplier Invoices" -msgstr "Facturas de proveedor" - -#. module: purchase -#: sql_constraint:purchase.order:0 -msgid "Order Reference must be unique !" -msgstr "¡La referencia del pedido debe ser única!" - -#. module: purchase -#: model:process.transition,name:purchase.process_transition_packinginvoice0 -#: model:process.transition,name:purchase.process_transition_productrecept0 -msgid "From a Pick list" -msgstr "Desde una lista de empaque" - -#. module: purchase -#: code:addons/purchase/purchase.py:660 -#, python-format -msgid "No Pricelist !" -msgstr "¡Sin Lista de precio!" - -#. module: purchase -#: field:purchase.order.line,product_qty:0 -#: view:purchase.report:0 -#: field:purchase.report,quantity:0 -msgid "Quantity" -msgstr "Cantidad" - -#. module: purchase -#: view:purchase.order.line_invoice:0 -msgid "Select an Open Sale Order" -msgstr "Seleccionar un pedido de compra abierto" - -#. module: purchase -#: field:purchase.order,company_id:0 -#: field:purchase.order.line,company_id:0 -#: view:purchase.report:0 -#: field:purchase.report,company_id:0 -msgid "Company" -msgstr "Compañía" - -#. module: purchase -#: view:board.board:0 -#: model:ir.actions.act_window,name:purchase.action_purchase_order_monthly_categ_graph -#: view:purchase.report:0 -msgid "Monthly Purchase by Category" -msgstr "Compra mensual por categoría" - -#. module: purchase -#: view:purchase.order:0 -msgid "Set to Draft" -msgstr "Cambiar a borrador" - -#. module: purchase -#: selection:purchase.order,state:0 -#: selection:purchase.report,state:0 -msgid "Invoice Exception" -msgstr "Excepción de factura" - -#. module: purchase -#: model:product.pricelist,name:purchase.list0 -msgid "Default Purchase Pricelist" -msgstr "Tarifa de compra por defecto" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_current_purchases -msgid "Current purchases" -msgstr "Compras actuales" - -#. module: purchase -#: help:purchase.order,dest_address_id:0 -msgid "Put an address if you want to deliver directly from the supplier to the customer.In this case, it will remove the warehouse link and set the customer location." -msgstr "Introduzca una dirección si quiere enviar directamente desde el proveedor al cliente. En este caso, se eliminará el enlace al almacén y pondrá la ubicación del cliente." - -#. module: purchase -#: help:res.partner,property_product_pricelist_purchase:0 -msgid "This pricelist will be used, instead of the default one, for purchases from the current partner" -msgstr "Esta tarifa será utilizada en lugar de la por defecto para las compras de la empresa actual" - -#. module: purchase -#: report:purchase.order:0 -msgid "Fax :" -msgstr "Fax :" - -#. module: purchase -#: help:purchase.order,pricelist_id:0 -msgid "The pricelist sets the currency used for this purchase order. It also computes the supplier price for the selected products/quantities." -msgstr "La lista de precios fija la moneda utilizada en este pedido de compra. También calcula el precio del proveedor para los productos/cantidades seleccionados." - -#. module: purchase -#: model:ir.model,name:purchase.model_stock_partial_picking -msgid "Partial Picking" -msgstr "Empaquetado parcial" - -#. module: purchase -#: code:addons/purchase/purchase.py:296 -#, python-format -msgid "Purchase order '%s' is confirmed." -msgstr "Pedido de compra '%s' está confirmado." - -#. module: purchase -#: view:purchase.order:0 -msgid "Approve Purchase" -msgstr "Aprobar compra" - -#. module: purchase -#: model:process.node,name:purchase.process_node_approvepurchaseorder0 -#: view:purchase.order:0 -#: selection:purchase.order,state:0 -#: selection:purchase.report,state:0 -msgid "Approved" -msgstr "Aprobado" - -#. module: purchase -#: view:purchase.report:0 -msgid "Reference UOM" -msgstr "Referencia UdM" - -#. module: purchase -#: view:purchase.order:0 -msgid "Origin" -msgstr "Origen" - -#. module: purchase -#: field:purchase.report,product_uom:0 -msgid "Reference UoM" -msgstr "Referencia UdM" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_purchase_line_product_tree -msgid "Purchases" -msgstr "Compras" - -#. module: purchase -#: view:purchase.order:0 -#: field:purchase.order,notes:0 -#: view:purchase.order.line:0 -#: field:purchase.order.line,notes:0 -msgid "Notes" -msgstr "Notas" - -#. module: purchase -#: code:addons/purchase/purchase.py:660 -#, python-format -msgid "You have to select a pricelist or a supplier in the purchase form !\n" -"Please set one before choosing a product." -msgstr "¡Debe seleccionar una tarifa o un proveedor en el formulario de compra!\n" -"Indique uno antes de seleccionar un producto." - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "September" -msgstr "Septiembre" - -#. module: purchase -#: report:purchase.order:0 -#: field:purchase.order,amount_tax:0 -#: view:purchase.order.line:0 -#: field:purchase.order.line,taxes_id:0 -msgid "Taxes" -msgstr "Impuestos" - -#. module: purchase -#: model:ir.actions.report.xml,name:purchase.report_purchase_order -#: model:ir.model,name:purchase.model_purchase_order -#: model:process.node,name:purchase.process_node_purchaseorder0 -#: field:procurement.order,purchase_id:0 -#: view:purchase.order:0 -#: model:res.request.link,name:purchase.req_link_purchase_order -#: field:stock.picking,purchase_id:0 -msgid "Purchase Order" -msgstr "Pedido de compra" - -#. module: purchase -#: field:purchase.order,name:0 -#: view:purchase.order.line:0 -#: field:purchase.order.line,order_id:0 -msgid "Order Reference" -msgstr "Referencia del pedido" - -#. module: purchase -#: report:purchase.order:0 -msgid "Net Total :" -msgstr "Total neto :" - -#. module: purchase -#: view:purchase.installer:0 -msgid "Configure Your Purchases Management Application" -msgstr "Configure su aplicación de gestión de compras" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_procurement_management_product -#: model:ir.ui.menu,name:purchase.menu_procurement_partner_contact_form -msgid "Products" -msgstr "Productos" - -#. module: purchase -#: field:purchase.installer,progress:0 -msgid "Configuration Progress" -msgstr "Progreso configuración" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_packinginvoice0 -msgid "A Pick list generates an invoice. Depending on the Invoicing control of the sale order, the invoice is based on delivered or on ordered quantities." -msgstr "Una lista de empaque genera una factura. Según el control de facturación en el pedido de venta, la factura se basa en las cantidades enviadas u ordenadas." - -#. module: purchase -#: selection:purchase.order,state:0 -#: selection:purchase.order.line,state:0 -#: selection:purchase.report,state:0 -msgid "Cancelled" -msgstr "Cancelado" - -#. module: purchase -#: code:addons/purchase/purchase.py:315 -#, python-format -msgid "Purchase amount over the limit" -msgstr "Importe de compra por encima del límite" - -#. module: purchase -#: view:purchase.order:0 -msgid "Convert to Purchase Order" -msgstr "Convertir a pedido de compra" - -#. module: purchase -#: field:purchase.order,pricelist_id:0 -#: field:purchase.report,pricelist_id:0 -msgid "Pricelist" -msgstr "Lista de precio" - -#. module: purchase -#: selection:purchase.order,state:0 -#: selection:purchase.report,state:0 -msgid "Shipping Exception" -msgstr "Excepción de envío" - -#. module: purchase -#: field:purchase.order.line,invoice_lines:0 -msgid "Invoice Lines" -msgstr "Líneas de factura" - -#. module: purchase -#: model:process.node,name:purchase.process_node_packinglist0 -#: model:process.node,name:purchase.process_node_productrecept0 -msgid "Incoming Products" -msgstr "Productos de entrada" - -#. module: purchase -#: model:process.node,name:purchase.process_node_packinginvoice0 -msgid "Outgoing Products" -msgstr "Productos de salida" - -#. module: purchase -#: view:purchase.order:0 -msgid "Manually Corrected" -msgstr "Corregido manualmente" - -#. module: purchase -#: view:purchase.report:0 -msgid " Month " -msgstr " Mes " - -#. module: purchase -#: view:purchase.order:0 -msgid "Reference" -msgstr "Referencia" - -#. module: purchase -#: code:addons/purchase/purchase.py:244 -#, python-format -msgid "Cannot delete Purchase Order(s) which are in %s State!" -msgstr "¡No se pueden eliminar pedido(s) de compra que estén en estado %s!" - -#. module: purchase -#: field:purchase.report,dest_address_id:0 -msgid "Dest. Address Contact Name" -msgstr "Nombre contacto dirección dest." - -#. module: purchase -#: model:ir.model,name:purchase.model_stock_move -msgid "Stock Move" -msgstr "Movimiento stock" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,day:0 -msgid "Day" -msgstr "Día" - -#. module: purchase -#: code:addons/purchase/purchase.py:344 -#, python-format -msgid "Purchase order '%s' has been set in draft state." -msgstr "Pedido de compra '%s' se ha cambiado al estado borrador." - -#. module: purchase -#: field:purchase.order.line,account_analytic_id:0 -msgid "Analytic Account" -msgstr "Cuenta analítica" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,nbr:0 -msgid "# of Lines" -msgstr "Nº de líneas" - -#. module: purchase -#: code:addons/purchase/purchase.py:696 -#: code:addons/purchase/purchase.py:735 -#: code:addons/purchase/wizard/purchase_order_group.py:47 -#, python-format -msgid "Warning" -msgstr "Aviso" - -#. module: purchase -#: field:purchase.installer,purchase_analytic_plans:0 -msgid "Purchase Analytic Plans" -msgstr "Planes analíticos de compra" - -#. module: purchase -#: model:ir.model,name:purchase.model_purchase_installer -msgid "purchase.installer" -msgstr "compra.instalador" - -#. module: purchase -#: selection:purchase.order.line,state:0 -msgid "Draft" -msgstr "Borrador" - -#. module: purchase -#: report:purchase.order:0 -msgid "Net Price" -msgstr "Precio neto" - -#. module: purchase -#: view:purchase.order.line:0 -msgid "Order Line" -msgstr "Línea del pedido" - -#. module: purchase -#: help:purchase.order,shipped:0 -msgid "It indicates that a picking has been done" -msgstr "Indica que una orden ha sido realizada." - -#. module: purchase -#: code:addons/purchase/purchase.py:721 -#, python-format -msgid "Wrong Product UOM !" -msgstr "¡UdM del producto errónea!" - -#. module: purchase -#: model:process.node,name:purchase.process_node_confirmpurchaseorder0 -#: selection:purchase.order.line,state:0 -msgid "Confirmed" -msgstr "Confirmado" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,price_average:0 -msgid "Average Price" -msgstr "Precio medio" - -#. module: purchase -#: report:purchase.order:0 -msgid "Total :" -msgstr "Total :" - -#. module: purchase -#: model:process.transition.action,name:purchase.process_transition_action_confirmpurchaseorder0 -#: view:purchase.order.line_invoice:0 -msgid "Confirm" -msgstr "Confirmar" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_procurement_management_invoice -#: view:purchase.order:0 -msgid "Invoice Control" -msgstr "Control factura" - -#. module: purchase -#: constraint:res.company:0 -msgid "Error! You can not create recursive companies." -msgstr "¡Error! No se pueden crear compañías recursivas." - -#. module: purchase -#: field:purchase.order,partner_ref:0 -msgid "Supplier Reference" -msgstr "Referencia del proveedor" - -#. module: purchase -#: help:purchase.order,amount_tax:0 -msgid "The tax amount" -msgstr "El importe de los impuestos." - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_productrecept0 -msgid "A Pick list generates a supplier invoice. Depending on the Invoicing control of the purchase order, the invoice is based on received or on ordered quantities." -msgstr "Una lista de empaque genera una factura de proveedor. Según el control de facturación del pedido de compra, la factura se basa en las cantidades recibidas o pedidas." - -#. module: purchase -#: view:purchase.order:0 -#: field:purchase.order,state:0 -#: view:purchase.order.line:0 -#: field:purchase.order.line,state:0 -#: view:purchase.report:0 -msgid "State" -msgstr "Estado" - -#. module: purchase -#: model:ir.actions.act_window,help:purchase.action_stock_move_report_po -msgid "Reception Analysis allows you to easily check and analyse your company order receptions and the performance of your supplier's deliveries." -msgstr "El análisis de recepción permite comprobar y analizar fácilmente las recepciones de su compañía y el rendimiento de las entregas de su proveedor." - -#. module: purchase -#: report:purchase.quotation:0 -msgid "Tel.:" -msgstr "Tel.:" - -#. module: purchase -#: model:ir.model,name:purchase.model_stock_picking -#: field:purchase.order,picking_ids:0 -msgid "Picking List" -msgstr "Lista de empaque" - -#. module: purchase -#: view:purchase.order:0 -msgid "Print" -msgstr "Imprimir" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_view_purchase_order_group -msgid "Merge Purchase orders" -msgstr "Fusionar pedidos de compra" - -#. module: purchase -#: field:purchase.order,order_line:0 -msgid "Order Lines" -msgstr "Líneas del pedido" - -#. module: purchase -#: code:addons/purchase/purchase.py:662 -#, python-format -msgid "No Partner!" -msgstr "¡Falta empresa!" - -#. module: purchase -#: report:purchase.quotation:0 -msgid "Fax:" -msgstr "Fax:" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,price_total:0 -msgid "Total Price" -msgstr "Precio total" - -#. module: purchase -#: view:purchase.order:0 -msgid "Untaxed amount" -msgstr "Monto sin impuestos" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_product_pricelist_action2_purchase -#: model:ir.ui.menu,name:purchase.menu_purchase_config_pricelist -msgid "Pricelists" -msgstr "Lista de precios" - -#. module: purchase -#: field:purchase.report,partner_address_id:0 -msgid "Address Contact Name" -msgstr "Nombre contacto dirección" - -#. module: purchase -#: help:purchase.order,invoice_method:0 -msgid "From Order: a draft invoice will be pre-generated based on the purchase order. The accountant will just have to validate this invoice for control.\n" -"From Picking: a draft invoice will be pre-generated based on validated receptions.\n" -"Manual: allows you to generate suppliers invoices by chosing in the uninvoiced lines of all manual purchase orders." -msgstr "Desde pedido: se generará una factura borrador basándose en los pedidos de compra. El contador sólo tendrá que validar la factura para su control.\n" -"Desde la orden: se generará una factura borrador basándose en recepciones validadas.\n" -"Manual: le permite generar facturas de proveedor eligiendo en las líneas no facturadas de todos los pedidos de compra manuales." - -#. module: purchase -#: help:purchase.order,invoice_ids:0 -msgid "Invoices generated for a purchase order" -msgstr "Facturas generadas para un pedido de compra" - -#. module: purchase -#: code:addons/purchase/purchase.py:292 -#: code:addons/purchase/purchase.py:362 -#: code:addons/purchase/purchase.py:372 -#: code:addons/purchase/wizard/purchase_line_invoice.py:122 -#, python-format -msgid "Error !" -msgstr "¡Error!" - -#. module: purchase -#: view:purchase.order.line:0 -msgid "General Information" -msgstr "Información general" - -#. module: purchase -#: view:board.board:0 -msgid "My Board" -msgstr "Mi tablero" - -#. module: purchase -#: report:purchase.order:0 -msgid "Purchase Order Confirmation N°" -msgstr "Confirmación pedido de compra Nº" - -#. module: purchase -#: model:ir.actions.act_window,help:purchase.action_purchase_order_report_all -msgid "Purchase Analysis allows you to easily check and analyse your company purchase history and performance. From this menu you can track your negotiation performance, the delivery performance of your suppliers, etc." -msgstr "Los análisis de compra le permite comprobar y analizar fácilmente el historial de compras de su compañía y su rendimiento. Desde este menú puede controlar el rendimiento de su negociación, el funcionamiento de las entregas de sus proveedores, etc." - -#. module: purchase -#: code:addons/purchase/purchase.py:735 -#, python-format -msgid "The selected supplier only sells this product by %s" -msgstr "El proveedor seleccionado sólo vende este producto por %s" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_invoicefrompackinglist0 -msgid "The invoice is created automatically if the Invoice control of the purchase order is 'On picking'. The invoice can also be generated manually by the accountant (Invoice control = Manual)." -msgstr "La factura se crea de forma automática si el control de factura del pedido de compra es 'Desde orden'. La factura también puede ser generada manualmente por el contador (control de factura = Manual)." - -#. module: purchase -#: selection:purchase.order,invoice_method:0 -msgid "From Order" -msgstr "Desde pedido" - -#. module: purchase -#: model:process.transition.action,name:purchase.process_transition_action_invoicefrompurchaseorder0 -msgid "Create invoice" -msgstr "Crear factura" - -#. module: purchase -#: field:purchase.order.line,move_dest_id:0 -msgid "Reservation Destination" -msgstr "Reserva de Destino" - -#. module: purchase -#: code:addons/purchase/purchase.py:244 -#, python-format -msgid "Invalid action !" -msgstr "¡Acción no válida!" - -#. module: purchase -#: selection:purchase.order,state:0 -#: selection:purchase.order.line,state:0 -#: selection:purchase.report,state:0 -msgid "Done" -msgstr "Realizado" - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "July" -msgstr "Julio" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_purchase_config_purchase -#: view:res.company:0 -msgid "Configuration" -msgstr "Configuración" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_purchase_by_supplier -#: view:purchase.report:0 -msgid "Purchase by supplier" -msgstr "Compra por proveedor" - -#. module: purchase -#: view:purchase.order:0 -msgid "Total amount" -msgstr "Importe total" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.act_purchase_order_2_stock_picking -msgid "Receptions" -msgstr "Recepciones" - -#. module: purchase -#: field:purchase.order,validator:0 -#: view:purchase.report:0 -msgid "Validated by" -msgstr "Validada por" - -#. module: purchase -#: model:ir.actions.act_window,help:purchase.action_invoice_pending -msgid "Use this menu to control the invoices to be received from your supplier. OpenERP pregenerates draft invoices from your purchase orders or receptions, according to your settings. Once you receive a supplier invoice, you can match it with the draft invoice and validate it." -msgstr "Use este menú para controlar las facturas a recibir de su proveedor. OpenERP pregenera facturas borrador a partir de sus pedidos de compra o recepciones, en función de los parámetros. En cuanto reciba la factura del proveedor, puede verificarla con la factura borrador y validarla." - -#. module: purchase -#: model:process.node,name:purchase.process_node_draftpurchaseorder0 -#: model:process.node,name:purchase.process_node_draftpurchaseorder1 -msgid "RFQ" -msgstr "Petición de presupuesto" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_procurement_management_pending_invoice -msgid "Supplier Invoices to Receive" -msgstr "Facturas de proveedor a recibir" - -#. module: purchase -#: help:purchase.installer,purchase_requisition:0 -msgid "Manages your Purchase Requisition and allows you to easily keep track and manage all your purchase orders." -msgstr "Gestiona sus peticiones de compras y permite controlar y gestionar fácilmente todos sus pedidos de compra." - -#. module: purchase -#: view:purchase.report:0 -msgid " Month-1 " -msgstr " Mes-1 " - -#. module: purchase -#: code:addons/purchase/purchase.py:373 -#, python-format -msgid "There is no purchase journal defined for this company: \"%s\" (id:%d)" -msgstr "No se ha definido un diario para esta compañía: \"%s\" (id:%d)" - -#. module: purchase -#: selection:purchase.order,state:0 -msgid "Waiting Approval" -msgstr "Esperando aprobacion" - -#. module: purchase -#: selection:purchase.order,invoice_method:0 -msgid "Manual" -msgstr "Manual" - -#. module: purchase -#: code:addons/purchase/purchase.py:410 -#, python-format -msgid "You must first cancel all picking attached to this purchase order." -msgstr "Debe primero cancelar todos las listas d empaque relacionadas a este pedido de compra." - -#. module: purchase -#: view:purchase.order:0 -#: field:purchase.order.line,date_order:0 -#: field:purchase.report,date:0 -msgid "Order Date" -msgstr "Fecha de pedido" - -#. module: purchase -#: model:process.node,note:purchase.process_node_productrecept0 -msgid "Incoming products to control" -msgstr "Productos de entrada a controlar" - -#. module: purchase -#: model:process.transition,name:purchase.process_transition_approvingpurchaseorder0 -msgid "Approbation" -msgstr "Aprobación" - -#. module: purchase -#: view:purchase.report:0 -msgid "Purchase Orders Statistics" -msgstr "Estadísticas de pedidos de compra" - -#. module: purchase -#: model:ir.actions.act_window,help:purchase.purchase_line_form_action2 -msgid "If you set the invoicing control on a purchase order as \"Manual\", you can track here all the purchase order lines for which you have not received the supplier invoice yet. Once you are ready to receive a supplier invoice, you can generate a draft supplier invoice based on the lines from this menu." -msgstr "Si establece el control de facturación de un pedido de compra a \"Manual\", puede controlar aquí todas las líneas de los pedidos de compra para los cuales no ha recibido todavía la factura de proveedor correspondiente. Una vez esté listo para recibir una factura de proveedor, puede generar una factura de proveedor en borrador basada en las lineas desde este menú." - -#. module: purchase -#: model:process.node,name:purchase.process_node_invoiceafterpacking0 -#: model:process.node,name:purchase.process_node_invoicecontrol0 -msgid "Draft Invoice" -msgstr "Factura borrador" - -#. module: purchase -#: help:purchase.installer,purchase_analytic_plans:0 -msgid "Manages analytic distribution and purchase orders." -msgstr "Gestiona distribución analítica y pedidos de compra." - -#. module: purchase -#: help:purchase.order,minimum_planned_date:0 -msgid "This is computed as the minimum scheduled date of all purchase order lines' products." -msgstr "Ésto se calcula como la mínima fecha planificada para todos los productos de las líneas del pedido de compra." - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "August" -msgstr "Agosto" - -#. module: purchase -#: field:purchase.installer,purchase_requisition:0 -msgid "Purchase Requisition" -msgstr "Petición de compra" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_purchase_uom_categ_form_action -msgid "Units of Measure Categories" -msgstr "Categorías de unidades de medida" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,delay_pass:0 -msgid "Days to Deliver" -msgstr "Días para entregar" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_action_picking_tree_in_move -#: model:ir.ui.menu,name:purchase.menu_procurement_management_inventory -msgid "Receive Products" -msgstr "Recibir productos" - -#. module: purchase -#: model:ir.model,name:purchase.model_procurement_order -msgid "Procurement" -msgstr "Abastecimiento" - -#. module: purchase -#: view:purchase.order:0 -#: field:purchase.order,invoice_ids:0 -msgid "Invoices" -msgstr "Facturas" - -#. module: purchase -#: model:process.node,note:purchase.process_node_purchaseorder0 -msgid "Confirmed purchase order to invoice" -msgstr "Pedido de compra confirmado para facturar" - -#. module: purchase -#: field:purchase.installer,config_logo:0 -msgid "Image" -msgstr "Imagen" - -#. module: purchase -#: view:purchase.report:0 -msgid "Total Orders Lines by User per month" -msgstr "Total de líneas de pedidos por usuario por mes" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,month:0 -msgid "Month" -msgstr "Mes" - -#. module: purchase -#: selection:purchase.report,state:0 -msgid "Waiting Supplier Ack" -msgstr "Esperando aceptación de proveedor" - -#. module: purchase -#: report:purchase.quotation:0 -msgid "Request for Quotation :" -msgstr "Presupuesto solicitado:" - -#. module: purchase -#: view:board.board:0 -#: model:ir.actions.act_window,name:purchase.purchase_waiting -msgid "Purchase Order Waiting Approval" -msgstr "Esperando aprobacion de Pedido de compra" - -#. module: purchase -#: view:purchase.order:0 -msgid "Total Untaxed amount" -msgstr "Total de monto sin impuestos" - -#. module: purchase -#: field:purchase.order,shipped:0 -#: field:purchase.order,shipped_rate:0 -msgid "Received" -msgstr "Recibido" - -#. module: purchase -#: model:process.node,note:purchase.process_node_packinglist0 -msgid "List of ordered products." -msgstr "Lista de productos solicitados." - -#. module: purchase -#: help:purchase.order,picking_ids:0 -msgid "This is the list of picking list that have been generated for this purchase" -msgstr "Ésta es la lista de ordenes generadas por esta compra" - -#. module: purchase -#: model:ir.module.module,shortdesc:purchase.module_meta_information -#: model:ir.ui.menu,name:purchase.menu_procurement_management -msgid "Purchase Management" -msgstr "Gestion de Compras" - -#. module: purchase -#: model:process.node,note:purchase.process_node_invoiceafterpacking0 -#: model:process.node,note:purchase.process_node_invoicecontrol0 -msgid "To be reviewed by the accountant." -msgstr "Para ser revisado por el contador." - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.purchase_line_form_action2 -#: model:ir.ui.menu,name:purchase.menu_purchase_line_order_draft -msgid "Purchase Lines Not Invoiced" -msgstr "Líneas de compra no facturadas" - -#. module: purchase -#: report:purchase.order:0 -msgid "Taxes :" -msgstr "Impuestos :" - -#. module: purchase -#: field:purchase.order,invoiced_rate:0 -#: field:purchase.order.line,invoiced:0 -msgid "Invoiced" -msgstr "Facturado" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,category_id:0 -msgid "Category" -msgstr "Categoría" - -#. module: purchase -#: model:process.node,note:purchase.process_node_approvepurchaseorder0 -#: model:process.node,note:purchase.process_node_confirmpurchaseorder0 -msgid "State of the Purchase Order." -msgstr "Estado del pedido de compra." - -#. module: purchase -#: view:purchase.report:0 -msgid " Year " -msgstr " Año " - -#. module: purchase -#: field:purchase.report,state:0 -msgid "Order State" -msgstr "Estado del pedido" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_view_purchase_line_invoice -msgid "Create invoices" -msgstr "Crear facturas" - -#. module: purchase -#: model:ir.model,name:purchase.model_purchase_order_line -#: view:purchase.order.line:0 -#: field:stock.move,purchase_line_id:0 -msgid "Purchase Order Line" -msgstr "Línea de pedido de compra" - -#. module: purchase -#: view:purchase.order:0 -msgid "Calendar View" -msgstr "Vista calendario" - -#. module: purchase -#: model:ir.model,name:purchase.model_purchase_order_group -msgid "Purchase Order Merge" -msgstr "Fusión pedido compra" - -#. module: purchase -#: report:purchase.quotation:0 -msgid "Regards," -msgstr "Recuerdos," - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_negotiation_by_supplier -#: view:purchase.report:0 -msgid "Negotiation by Supplier" -msgstr "Negociación por el proveedor" - -#. module: purchase -#: view:res.partner:0 -msgid "Purchase Properties" -msgstr "Propiedades de compra" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_purchaseinvoice0 -msgid "A purchase order generates a supplier invoice, as soon as it is confirmed by the buyer. Depending on the Invoicing control of the purchase order, the invoice is based on received or on ordered quantities." -msgstr "Un pedido de compra genera una factura de proveedor, tan pronto como la confirme el comprador. En función del control de facturación del pedido de compra, la factura se basa en las cantidades recibidas u ordenadas." - -#. module: purchase -#: field:purchase.order,amount_untaxed:0 -msgid "Untaxed Amount" -msgstr "Monto sin impuestos" - -#. module: purchase -#: help:purchase.order,invoiced:0 -msgid "It indicates that an invoice has been paid" -msgstr "Indica que una factura ha sido pagada." - -#. module: purchase -#: model:process.node,note:purchase.process_node_packinginvoice0 -msgid "Outgoing products to invoice" -msgstr "Productos salientes a facturar" - -#. module: purchase -#: view:purchase.installer:0 -msgid "Configure" -msgstr "Configurar" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_qty_per_product -#: view:purchase.report:0 -msgid "Qty. per product" -msgstr "Ctdad por producto" - -#. module: purchase -#: constraint:stock.move:0 -msgid "You try to assign a lot which is not from the same product" -msgstr "Está intentando asignar un lote que no es del mismo producto" - -#. module: purchase -#: help:purchase.order,date_order:0 -msgid "Date on which this document has been created." -msgstr "Fecha de la creación de este documento." - -#. module: purchase -#: view:res.partner:0 -msgid "Sales & Purchases" -msgstr "Ventas & Compras" - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "June" -msgstr "Junio" - -#. module: purchase -#: model:ir.model,name:purchase.model_purchase_report -msgid "Purchases Orders" -msgstr "Pedidos de compras" - -#. module: purchase -#: view:purchase.order.line:0 -msgid "Manual Invoices" -msgstr "Facturas manuales" - -#. module: purchase -#: code:addons/purchase/purchase.py:318 -#, python-format -msgid "Somebody has just confirmed a purchase with an amount over the defined limit" -msgstr "Alguien ha confirmado un pedido con un importe por encima del límite definido" - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "November" -msgstr "Noviembre" - -#. module: purchase -#: view:purchase.report:0 -msgid "Extended Filters..." -msgstr "Filtros extendidos..." - -#. module: purchase -#: code:addons/purchase/purchase.py:362 -#: code:addons/purchase/wizard/purchase_line_invoice.py:123 -#, python-format -msgid "There is no expense account defined for this product: \"%s\" (id:%d)" -msgstr "No se ha definido una cuenta de gastos para este producto: \"%s\" (id:%d)" - -#. module: purchase -#: code:addons/purchase/purchase.py:418 -#, python-format -msgid "You must first cancel all invoices attached to this purchase order." -msgstr "Primero debe cancelar todas las facturas asociadas a este pedido de compra." - -#. module: purchase -#: code:addons/purchase/wizard/purchase_order_group.py:48 -#, python-format -msgid "Please select multiple order to merge in the list view." -msgstr "Seleccione múltiples pedidos a fusionar en la vista listado." - -#. module: purchase -#: model:process.transition,name:purchase.process_transition_createpackinglist0 -msgid "Pick list generated" -msgstr "Orden generada" - -#. module: purchase -#: view:purchase.order:0 -msgid "Exception" -msgstr "Excepción" - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "October" -msgstr "Octubre" - -#. module: purchase -#: view:purchase.order:0 -msgid "Compute" -msgstr "Calcular" - -#. module: purchase -#: model:ir.module.module,description:purchase.module_meta_information -msgid "\n" -" Purchase module is for generating a purchase order for purchase of goods from a supplier.\n" -" A supplier invoice is created for the particular order placed\n" -" Dashboard for purchase management that includes:\n" -" * Current Purchase Orders\n" -" * Draft Purchase Orders\n" -" * Graph for quantity and amount per month \n" -"\n" -" " -msgstr "\n" -" El módulo de compras permite generar pedidos de compra para adquirir bienes de un proveedor.\n" -" Se crea una factura de proveedor para un pedido en concreto.\n" -" El tablero para la gestión de compras incluye:\n" -" * Pedidos actuales de compra.\n" -" * Pedidos de compra en borrador.\n" -" * Gráfico de cantidad e importe por mes. \n" -"\n" -" " - -#. module: purchase -#: code:addons/purchase/purchase.py:696 -#, python-format -msgid "The selected supplier has a minimal quantity set to %s, you cannot purchase less." -msgstr "El proveedor seleccionado tiene establecida una cantidad mínima a %s, no puede comprar menos." - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "January" -msgstr "Enero" - -#. module: purchase -#: model:ir.model,name:purchase.model_res_company -msgid "Companies" -msgstr "Compañías" - -#. module: purchase -#: view:purchase.order:0 -msgid "Cancel Purchase Order" -msgstr "Cancelar pedido de compra" - -#. module: purchase -#: constraint:stock.move:0 -msgid "You must assign a production lot for this product" -msgstr "Debe asignar un lote de producción para este producto" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_createpackinglist0 -msgid "A pick list is generated to track the incoming products." -msgstr "Se genera una lista de empaque para el seguimiento de los productos entrantes." - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_purchase_deshboard -msgid "Dashboard" -msgstr "Tablero" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,price_standard:0 -msgid "Products Value" -msgstr "Valor de productos" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_purchase_product_pricelist_type -msgid "Pricelists Types" -msgstr "Tipos de lista de precios" - -#. module: purchase -#: view:purchase.order:0 -#: view:purchase.report:0 -msgid "Quotations" -msgstr "Presupuestos" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_po_per_month_tree -#: view:purchase.report:0 -msgid "Purchase order per month" -msgstr "Pedido de compra por mes" - -#. module: purchase -#: view:purchase.order.line:0 -msgid "History" -msgstr "Historia" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_product_by_category_purchase_form -msgid "Products by Category" -msgstr "Productos por categoría" - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,delay:0 -msgid "Days to Validate" -msgstr "Días a validar" - -#. module: purchase -#: help:purchase.order,origin:0 -msgid "Reference of the document that generated this purchase order request." -msgstr "Referencia al documento que ha generado esta solicitud de pedido de compra." - -#. module: purchase -#: help:purchase.order,state:0 -msgid "The state of the purchase order or the quotation request. A quotation is a purchase order in a 'Draft' state. Then the order has to be confirmed by the user, the state switch to 'Confirmed'. Then the supplier must confirm the order to change the state to 'Approved'. When the purchase order is paid and received, the state becomes 'Done'. If a cancel action occurs in the invoice or in the reception of goods, the state becomes in exception." -msgstr "El estado del pedido de compra o de la solicitud de presupuesto. Un presupuesto es un pedido de compra en estado 'Borrador'. Entonces, si el pedido es confirmado por el usuario, el estado cambiará a 'Confirmado'. Entonces el proveedor debe confirmar el pedido para cambiar el estado a 'Aprobado'. Cuando el pedido de compra está pagado y recibido, el estado se convierte en 'Relizado'. Si una acción de cancelación ocurre en la factura o en la recepción de mercancías, el estado se convierte en 'Excepción'." - -#. module: purchase -#: field:purchase.order.line,price_subtotal:0 -msgid "Subtotal" -msgstr "Subtotal" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.purchase_rfq -#: model:ir.ui.menu,name:purchase.menu_purchase_rfq -msgid "Requests for Quotation" -msgstr "Solicitudes de presupuesto" - -#. module: purchase -#: help:purchase.order,date_approve:0 -msgid "Date on which purchase order has been approved" -msgstr "Fecha en que el pedido de compra ha sido aprobado." - -#. module: purchase -#: selection:purchase.order,state:0 -#: selection:purchase.report,state:0 -msgid "Waiting" -msgstr "En espera" - -#. module: purchase -#: model:product.pricelist.version,name:purchase.ver0 -msgid "Default Purchase Pricelist Version" -msgstr "Versión lista de precio de compra por defecto" - -#. module: purchase -#: view:purchase.installer:0 -msgid "Extend your Purchases Management Application with additional functionalities." -msgstr "Extienda su aplicación de gestión de compras con funcionalidades adicionales." - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_purchase_install_module -#: view:purchase.installer:0 -msgid "Purchases Application Configuration" -msgstr "Configuración aplicación compras" - -#. module: purchase -#: field:purchase.order,fiscal_position:0 -msgid "Fiscal Position" -msgstr "Posición fiscal" - -#. module: purchase -#: report:purchase.order:0 -msgid "Request for Quotation N°" -msgstr "Petición de presupuesto Nº" - -#. module: purchase -#: model:process.transition,name:purchase.process_transition_invoicefrompackinglist0 -#: model:process.transition,name:purchase.process_transition_invoicefrompurchase0 -msgid "Invoice" -msgstr "Factura" - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "December" -msgstr "Diciembre" - -#. module: purchase -#: model:process.transition.action,name:purchase.process_transition_action_approvingcancelpurchaseorder0 -#: model:process.transition.action,name:purchase.process_transition_action_cancelpurchaseorder0 -#: view:purchase.order:0 -#: view:purchase.order.group:0 -#: view:purchase.order.line_invoice:0 -msgid "Cancel" -msgstr "Cancelar" - -#. module: purchase -#: view:purchase.order:0 -#: view:purchase.order.line:0 -msgid "Purchase Order Lines" -msgstr "Líneas pedido de compra" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_approvingpurchaseorder0 -msgid "The supplier approves the Purchase Order." -msgstr "El proveedor aprueba el pedido de compra." - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.act_res_partner_2_purchase_order -#: model:ir.actions.act_window,name:purchase.purchase_form_action -#: model:ir.ui.menu,name:purchase.menu_purchase_form_action -#: view:purchase.report:0 -msgid "Purchase Orders" -msgstr "Pedidos de compra" - -#. module: purchase -#: field:purchase.order,origin:0 -msgid "Source Document" -msgstr "Documento origen" - -#. module: purchase -#: view:purchase.order.group:0 -msgid "Merge orders" -msgstr "Fusionar pedidos" - -#. module: purchase -#: model:ir.model,name:purchase.model_purchase_order_line_invoice -msgid "Purchase Order Line Make Invoice" -msgstr "Línea pedido de compra realiza factura" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_action_picking_tree4 -msgid "Incoming Shipments" -msgstr "Ordenes de entrada" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_purchase_order_by_user_all -msgid "Total Orders by User per month" -msgstr "Total pedidos por usuario mensual" - -#. module: purchase -#: model:ir.actions.report.xml,name:purchase.report_purchase_quotation -#: selection:purchase.order,state:0 -#: selection:purchase.report,state:0 -msgid "Request for Quotation" -msgstr "Solicitud de presupuesto" - -#. module: purchase -#: report:purchase.order:0 -msgid "Tél. :" -msgstr "Tel. :" - -#. module: purchase -#: field:purchase.order,create_uid:0 -#: view:purchase.report:0 -#: field:purchase.report,user_id:0 -msgid "Responsible" -msgstr "Responsable" - -#. module: purchase -#: report:purchase.order:0 -msgid "Our Order Reference" -msgstr "Nuestra referencia" - -#. module: purchase -#: view:purchase.order:0 -#: view:purchase.order.line:0 -msgid "Search Purchase Order" -msgstr "Buscar pedido de compra" - -#. module: purchase -#: field:purchase.order,warehouse_id:0 -#: view:purchase.report:0 -#: field:purchase.report,warehouse_id:0 -msgid "Warehouse" -msgstr "Almacén" - -#. module: purchase -#: model:process.node,note:purchase.process_node_draftpurchaseorder0 -#: model:process.node,note:purchase.process_node_draftpurchaseorder1 -msgid "Request for Quotations." -msgstr "Solicitud de presupuesto" - -#. module: purchase -#: report:purchase.order:0 -msgid "Date Req." -msgstr "Fecha solicitud" - -#. module: purchase -#: field:purchase.order,date_approve:0 -#: field:purchase.report,date_approve:0 -msgid "Date Approved" -msgstr "Fecha aprobación" - -#. module: purchase -#: code:addons/purchase/purchase.py:417 -#, python-format -msgid "Could not cancel this purchase order !" -msgstr "¡No se puede cancelar este pedido de compra!" - -#. module: purchase -#: report:purchase.order:0 -#: field:purchase.order.line,price_unit:0 -msgid "Unit Price" -msgstr "Precio unidad" - -#. module: purchase -#: view:purchase.order:0 -msgid "Delivery & Invoicing" -msgstr "Envío y Facturación" - -#. module: purchase -#: field:purchase.order.line,date_planned:0 -msgid "Scheduled Date" -msgstr "Fecha planificada" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_product_in_config_purchase -#: field:purchase.order,product_id:0 -#: view:purchase.order.line:0 -#: field:purchase.order.line,product_id:0 -#: view:purchase.report:0 -#: field:purchase.report,product_id:0 -msgid "Product" -msgstr "Producto" - -#. module: purchase -#: model:process.transition,name:purchase.process_transition_confirmingpurchaseorder0 -#: model:process.transition,name:purchase.process_transition_confirmingpurchaseorder1 -msgid "Confirmation" -msgstr "Confirmación" - -#. module: purchase -#: report:purchase.order:0 -#: field:purchase.order.line,name:0 -#: report:purchase.quotation:0 -msgid "Description" -msgstr "Descripción" - -#. module: purchase -#: help:res.company,po_lead:0 -msgid "This is the leads/security time for each purchase order." -msgstr "Este es el plazo de tiempo de seguridad para cada pedido de compra." - -#. module: purchase -#: report:purchase.quotation:0 -msgid "Expected Delivery address:" -msgstr "Dirección de entrega prevista:" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_stock_move_report_po -#: model:ir.ui.menu,name:purchase.menu_action_stock_move_report_po -msgid "Receptions Analysis" -msgstr "Análisis recepciones" - -#. module: purchase -#: help:purchase.order,amount_untaxed:0 -msgid "The amount without tax" -msgstr "El importe sin impuestos." - -#. module: purchase -#: model:ir.actions.act_window,help:purchase.action_supplier_address_form -msgid "Access your supplier records and maintain a good relationship with your suppliers. You can track all your interactions with them through the History tab: emails, orders, meetings, etc." -msgstr "Acceda a los registros de sus proveedores y mantenga una buena relación con ellos. Puede mantener el registro de todas sus interacciones con ellos gracias a la pestaña histórico: emails, reuniones, etc." - -#. module: purchase -#: view:purchase.order:0 -msgid "Delivery" -msgstr "Entrega" - -#. module: purchase -#: view:board.board:0 -#: model:ir.actions.act_window,name:purchase.purchase_draft -msgid "Request for Quotations" -msgstr "Solicitud de presupuestos" - -#. module: purchase -#: field:purchase.order.line,product_uom:0 -msgid "Product UOM" -msgstr "UdM del producto" - -#. module: purchase -#: report:purchase.order:0 -#: report:purchase.quotation:0 -msgid "Qty" -msgstr "Ctdad" - -#. module: purchase -#: field:purchase.order,partner_address_id:0 -msgid "Address" -msgstr "Dirección" - -#. module: purchase -#: field:purchase.order.line,move_ids:0 -msgid "Reservation" -msgstr "Reserva" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_purchase_order_report_graph -#: view:purchase.report:0 -msgid "Total Qty and Amount by month" -msgstr "Ctdad total e importe por mes" - -#. module: purchase -#: code:addons/purchase/purchase.py:409 -#, python-format -msgid "Could not cancel purchase order !" -msgstr "¡No se puede cancelar el pedido de compra!" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_confirmingpurchaseorder1 -msgid "In case there is no supplier for this product, the buyer can fill the form manually and confirm it. The RFQ becomes a confirmed Purchase Order." -msgstr "En caso de que no exista ningún proveedor de este producto, el comprador puede rellenar el formulario manualmente y confirmarlo. La solicitud de presupuesto se convierte en un pedido de compra confirmado." - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "February" -msgstr "Febrero" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_product_category_config_purchase -msgid "Products Categories" -msgstr "Categorías de productos" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_purchase_order_report_all -#: model:ir.ui.menu,name:purchase.menu_action_purchase_order_report_all -msgid "Purchase Analysis" -msgstr "Análisis de compra" - -#. module: purchase -#: report:purchase.order:0 -msgid "Your Order Reference" -msgstr "Su referencia de orden" - -#. module: purchase -#: view:purchase.order:0 -#: field:purchase.order,minimum_planned_date:0 -#: report:purchase.quotation:0 -#: field:purchase.report,expected_date:0 -msgid "Expected Date" -msgstr "Fecha prevista" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_total_price_by_product_by_state -#: view:purchase.report:0 -msgid "Total price by product by state" -msgstr "Total precio por producto por estado" - -#. module: purchase -#: report:purchase.quotation:0 -msgid "TVA:" -msgstr "IVA:" - -#. module: purchase -#: report:purchase.order:0 -#: field:purchase.order,date_order:0 -msgid "Order Date" -msgstr "Ordenado por Fecha" - -#. module: purchase -#: report:purchase.order:0 -msgid "Shipping address :" -msgstr "Dirección de envío: " - -#. module: purchase -#: view:purchase.order:0 -msgid "Purchase Control" -msgstr "Control de compra" - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "March" -msgstr "Marzo" - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "April" -msgstr "Abril" - -#. module: purchase -#: view:purchase.order.group:0 -msgid " Please note that: \n" -" \n" -" Orders will only be merged if: \n" -" * Purchase Orders are in draft \n" -" * Purchase Orders belong to the same supplier \n" -" * Purchase Orders are have same stock location, same pricelist \n" -" \n" -" Lines will only be merged if: \n" -" * Order lines are exactly the same except for the product,quantity and unit \n" -" " -msgstr " Tenga en cuenta que: \n" -" \n" -" Los pedidos sólo se fusionarán si: \n" -" * Los pedidos de compra están en borrador. \n" -" * Los pedidos pertenecen al mismo proveedor. \n" -" * Los pedidos tienen la misma ubicación de stock y la misma lista de precios. \n" -" \n" -" Las líneas sólo se fusionarán si: \n" -" * Las líneas de pedido son exactamente iguales excepto por el producto, cantidad y unidades. \n" -" " - -#. module: purchase -#: view:purchase.report:0 -#: field:purchase.report,name:0 -msgid "Year" -msgstr "Año" - -#. module: purchase -#: field:purchase.report,negociation:0 -msgid "Purchase-Standard Price" -msgstr "Precio compra-estándar" - -#. module: purchase -#: model:product.pricelist.type,name:purchase.pricelist_type_purchase -#: field:res.partner,property_product_pricelist_purchase:0 -msgid "Purchase Pricelist" -msgstr "Lista de precios de compra" - -#. module: purchase -#: field:purchase.order,invoice_method:0 -msgid "Invoicing Control" -msgstr "Método de facturación" - -#. module: purchase -#: model:process.transition.action,name:purchase.process_transition_action_approvingpurchaseorder0 -msgid "Approve" -msgstr "Aprobar" - -#. module: purchase -#: view:purchase.order:0 -msgid "To Approve" -msgstr "Para aprobar" - -#. module: purchase -#: view:purchase.order.line:0 -msgid "Invoicing" -msgstr "Facturación" - -#. module: purchase -#: help:purchase.order.line,state:0 -msgid " * The 'Draft' state is set automatically when purchase order in draft state. \n" -"* The 'Confirmed' state is set automatically as confirm when purchase order in confirm state. \n" -"* The 'Done' state is set automatically when purchase order is set as done. \n" -"* The 'Cancelled' state is set automatically when user cancel purchase order." -msgstr " * El estado 'Borrador' se establece automáticamente cuando crea un pedido (presupuesto) de compra. \n" -"* El estado 'Confirmado' se establece automáticamente al confirmar el pedido de compra. \n" -"* El estado 'Hecho' se establece automáticamente cuando el pedido de compra se realiza. \n" -"* El estado 'Cancelado' se establece automáticamente cuando el usuario cancela un pedido de compra." - -#. module: purchase -#: code:addons/purchase/purchase.py:424 -#, python-format -msgid "Purchase order '%s' is cancelled." -msgstr "El pedido de compra '%s' está cancelado." - -#. module: purchase -#: field:purchase.order,amount_total:0 -msgid "Total" -msgstr "Total" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_product_pricelist_action_purhase -msgid "Pricelist Versions" -msgstr "Versiones de tarifa" - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.action_supplier_address_form -msgid "Addresses" -msgstr "Direcciones" - -#. module: purchase -#: view:purchase.order.group:0 -msgid "Are you sure you want to merge these orders?" -msgstr "¿Está seguro que quiere fusionar estos pedidos?" - -#. module: purchase -#: view:purchase.order:0 -#: view:purchase.order.line:0 -#: view:purchase.report:0 -msgid "Group By..." -msgstr "Agrupar por..." - -#. module: purchase -#: model:process.transition,name:purchase.process_transition_purchaseinvoice0 -msgid "From a purchase order" -msgstr "Desde un pedido de compra" - -#. module: purchase -#: report:purchase.order:0 -msgid "TVA :" -msgstr "RFC:" - -#. module: purchase -#: help:purchase.order,amount_total:0 -msgid "The total amount" -msgstr "El importe total." - -#. module: purchase -#: selection:purchase.report,month:0 -msgid "May" -msgstr "Mayo" - -#. module: purchase -#: field:res.company,po_lead:0 -msgid "Purchase Lead Time" -msgstr "Plazo de tiempo de compra" - -#. module: purchase -#: model:process.transition,note:purchase.process_transition_invoicefrompurchase0 -msgid "The invoice is created automatically if the Invoice control of the purchase order is 'On order'. The invoice can also be generated manually by the accountant (Invoice control = Manual)." -msgstr "Se crea automáticamente la factura si el control de facturación del pedido de compra es 'Desde pedido'. La factura también puede ser generada manualmente por el contador (control facturación = Manual)." - -#. module: purchase -#: model:process.process,name:purchase.process_process_purchaseprocess0 -msgid "Purchase" -msgstr "Compra" - -#. module: purchase -#: model:ir.model,name:purchase.model_res_partner -#: field:purchase.order.line,partner_id:0 -msgid "Partner" -msgstr "Empresa" - -#. module: purchase -#: code:addons/purchase/purchase.py:662 -#, python-format -msgid "You have to select a partner in the purchase form !\n" -"Please set one partner before choosing a product." -msgstr "¡Debe seleccionar una empresa en el formulario de compra!\n" -"Por favor seleccione una empresa antes de seleccionar un producto." - -#. module: purchase -#: view:purchase.installer:0 -msgid "title" -msgstr "título" - -#. module: purchase -#: model:ir.model,name:purchase.model_stock_partial_move -msgid "Partial Move" -msgstr "Movimiento parcial" - -#. module: purchase -#: view:purchase.order.line:0 -msgid "Stock Moves" -msgstr "Movimientos de stock" - -#. module: purchase -#: model:ir.ui.menu,name:purchase.menu_purchase_unit_measure_purchase -#: model:ir.ui.menu,name:purchase.menu_purchase_uom_form_action -msgid "Units of Measure" -msgstr "Unidades de medida" - -#. module: purchase -#: view:purchase.report:0 -msgid "Orders" -msgstr "Pedidos" - -#. module: purchase -#: help:purchase.order,name:0 -msgid "unique number of the purchase order,computed automatically when the purchase order is created" -msgstr "Número único del pedido de compra, calculado de forma automática cuando el pedido de compra se crea." - -#. module: purchase -#: model:ir.actions.act_window,name:purchase.open_board_purchase -#: model:ir.ui.menu,name:purchase.menu_board_purchase -msgid "Purchase Dashboard" -msgstr "Tablero de compras" - diff --git a/addons/sale/i18n/es_MX.po.moved b/addons/sale/i18n/es_MX.po.moved deleted file mode 100644 index cb43f04eb09..00000000000 --- a/addons/sale/i18n/es_MX.po.moved +++ /dev/null @@ -1,1987 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * sale -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-05 15:17+0000\n" -"PO-Revision-Date: 2011-07-05 15:17+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: sale -#: view:board.board:0 -#: model:ir.actions.act_window,name:sale.action_sales_by_salesman -msgid "Sales by Salesman in last 90 days" -msgstr "Ventas por vendedor últimos 90 días" - -#. module: sale -#: help:sale.installer,delivery:0 -msgid "Allows you to compute delivery costs on your quotations." -msgstr "Le permite calcular los costos de envío en sus presupuestos." - -#. module: sale -#: help:sale.order,picking_policy:0 -msgid "If you don't have enough stock available to deliver all at once, do you accept partial shipments or not?" -msgstr "Si no dispone de suficientes existencias para enviarlo todo de una vez, ¿acepta envíos parciales o no?" - -#. module: sale -#: help:sale.order,partner_shipping_id:0 -msgid "Shipping address for current sales order." -msgstr "Dirección de envío para el pedido de venta actual." - -#. module: sale -#: field:sale.advance.payment.inv,qtty:0 -#: report:sale.order:0 -msgid "Quantity" -msgstr "Cantidad" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,day:0 -msgid "Day" -msgstr "Día" - -#. module: sale -#: model:process.transition.action,name:sale.process_transition_action_cancelorder0 -#: view:sale.order:0 -msgid "Cancel Order" -msgstr "Cancelar pedido" - -#. module: sale -#: view:sale.config.picking_policy:0 -msgid "Configure Sales Order Logistics" -msgstr "Configurar logística pedidos de venta" - -#. module: sale -#: code:addons/sale/sale.py:603 -#, python-format -msgid "The quotation '%s' has been converted to a sales order." -msgstr "El presupuesto '%s' ha sido convertido a un pedido de venta." - -#. module: sale -#: selection:sale.order,order_policy:0 -msgid "Payment Before Delivery" -msgstr "Pago antes del envío" - -#. module: sale -#: code:addons/sale/wizard/sale_make_invoice.py:42 -#, python-format -msgid "Warning !" -msgstr "¡Aviso!" - -#. module: sale -#: report:sale.order:0 -msgid "VAT" -msgstr "IVA" - -#. module: sale -#: model:process.node,note:sale.process_node_saleorderprocurement0 -msgid "Drives procurement orders for every sales order line." -msgstr "Genera órdenes de abastecimiento para cada línea de pedido de venta." - -#. module: sale -#: selection:sale.config.picking_policy,picking_policy:0 -msgid "All at Once" -msgstr "Todo a la vez" - -#. module: sale -#: field:sale.order,project_id:0 -#: view:sale.report:0 -#: field:sale.report,analytic_account_id:0 -#: field:sale.shop,project_id:0 -msgid "Analytic Account" -msgstr "Cuenta analítica" - -#. module: sale -#: model:ir.actions.act_window,help:sale.action_order_line_tree2 -msgid "Here is a list of each sales order line to be invoiced. You can invoice sales orders partially, by lines of sales order. You do not need this list if you invoice from the delivery orders or if you invoice sales totally." -msgstr "Esta es una lista de todas las líneas de pedidos de venta a facturar. Puede facturar pedidos de venta parcialmente, por líneas de pedido. No necesita esta lista si factura desde ordenes de salida o si factura pedidos de venta completos." - -#. module: sale -#: model:process.node,name:sale.process_node_saleprocurement0 -msgid "Procurement Order" -msgstr "Orden de abastecimiento" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,partner_id:0 -msgid "Partner" -msgstr "Empresa" - -#. module: sale -#: view:sale.order:0 -msgid "Order Line" -msgstr "Línea del pedido" - -#. module: sale -#: model:ir.actions.act_window,help:sale.action_order_form -msgid "Sales Orders help you manage quotations and orders from your customers. OpenERP suggests that you start by creating a quotation. Once it is confirmed, the quotation will be converted into a Sales Order. OpenERP can handle several types of products so that a sales order may trigger tasks, delivery orders, manufacturing orders, purchases and so on. Based on the configuration of the sales order, a draft invoice will be generated so that you just have to confirm it when you want to bill your customer." -msgstr "Los pedidos de ventas le ayudan a gestionar presupuestos y pedidos de sus clientes. OpenERP sugiere que comience por crear un presupuesto. Una vez esté confirmado, el presupuesto se convertirá en un pedido de venta. OpenERP puede gestionar varios tipos de productos de forma que un pedido de venta puede generar tareas, órdenes de entrega, órdenes de fabricación, compras, etc. Según la configuración del pedido de venta, se generará una factura en borrador de manera que sólo hay que confirmarla cuando se quiera facturar a su cliente." - -#. module: sale -#: help:sale.order,invoice_quantity:0 -msgid "The sale order will automatically create the invoice proposition (draft invoice). Ordered and delivered quantities may not be the same. You have to choose if you want your invoice based on ordered or shipped quantities. If the product is a service, shipped quantities means hours spent on the associated tasks." -msgstr "El pedido de venta creará automáticamente la proposición de la factura (factura borrador). Las cantidades pedidas y entregadas pueden no ser las mismas. Debe elegir si desea que su factura se base en las cantidades pedidas o entregadas. Si el producto es un servicio, las cantidades enviadas son las horas dedicadas a las tareas asociadas." - -#. module: sale -#: field:sale.shop,payment_default_id:0 -msgid "Default Payment Term" -msgstr "Plazo de pago por defecto" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_config_picking_policy -msgid "Configure Picking Policy for Sales Order" -msgstr "Configurar la política envío para pedidos de venta" - -#. module: sale -#: view:sale.order:0 -#: view:sale.order.line:0 -#: field:sale.order.line,state:0 -#: view:sale.report:0 -msgid "State" -msgstr "Estado" - -#. module: sale -#: report:sale.order:0 -msgid "Disc.(%)" -msgstr "Desc.(%)" - -#. module: sale -#: model:process.transition.action,name:sale.process_transition_action_forceassignation0 -msgid "Force Assignation" -msgstr "Forzar asignación" - -#. module: sale -#: help:sale.make.invoice,grouped:0 -msgid "Check the box to group the invoices for the same customers" -msgstr "Marque esta opción para agrupar las facturas de los mismos clientes." - -#. module: sale -#: selection:sale.order,invoice_quantity:0 -msgid "Ordered Quantities" -msgstr "Cantidades ordenadas" - -#. module: sale -#: view:sale.report:0 -msgid "Sales by Salesman" -msgstr "Ventas por vendedor" - -#. module: sale -#: field:sale.order.line,move_ids:0 -msgid "Inventory Moves" -msgstr "Movimientos de inventario" - -#. module: sale -#: field:sale.order,name:0 -#: field:sale.order.line,order_id:0 -msgid "Order Reference" -msgstr "Referencia del pedido" - -#. module: sale -#: view:sale.order:0 -msgid "Other Information" -msgstr "Otra información" - -#. module: sale -#: view:sale.order:0 -msgid "Dates" -msgstr "Fechas" - -#. module: sale -#: model:process.transition,note:sale.process_transition_invoiceafterdelivery0 -msgid "The invoice is created automatically if the shipping policy is 'Invoice from pick' or 'Invoice on order after delivery'." -msgstr "La factura se crea de forma automática si la política de facturación es \"Facturar desde la recoleccion\" o \"Facturar pedido después del envío\"." - -#. module: sale -#: model:ir.model,name:sale.model_sale_make_invoice -msgid "Sales Make Invoice" -msgstr "Ventas. Realizar factura" - -#. module: sale -#: view:sale.order:0 -msgid "Recreate Packing" -msgstr "Recrear Packing" - -#. module: sale -#: field:sale.order.line,discount:0 -msgid "Discount (%)" -msgstr "Descuento (%)" - -#. module: sale -#: help:res.company,security_lead:0 -msgid "This is the days added to what you promise to customers for security purpose" -msgstr "Estos días por razones de seguridad se añaden a los que promete a los clientes." - -#. module: sale -#: view:board.board:0 -#: model:ir.actions.act_window,name:sale.open_board_sales_manager -#: model:ir.ui.menu,name:sale.menu_board_sales_manager -msgid "Sales Manager Dashboard" -msgstr "Tablero responsable ventas" - -#. module: sale -#: field:sale.order.line,product_packaging:0 -msgid "Packaging" -msgstr "Empaquetado" - -#. module: sale -#: model:process.transition,name:sale.process_transition_saleinvoice0 -msgid "From a sales order" -msgstr "Desde un pedido de venta" - -#. module: sale -#: field:sale.shop,name:0 -msgid "Shop Name" -msgstr "Nombre tienda" - -#. module: sale -#: code:addons/sale/sale.py:1014 -#, python-format -msgid "No Customer Defined !" -msgstr "¡No se ha definido un cliente!" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_tree2 -msgid "Sales in Exception" -msgstr "Ventas en excepción" - -#. module: sale -#: view:sale.order:0 -msgid "Set to Draft" -msgstr "Cambiar a borrador" - -#. module: sale -#: view:sale.order:0 -msgid "Conditions" -msgstr "Condiciones" - -#. module: sale -#: help:sale.order,order_policy:0 -msgid "The Shipping Policy is used to synchronise invoice and delivery operations.\n" -" - The 'Pay Before delivery' choice will first generate the invoice and then generate the picking order after the payment of this invoice.\n" -" - The 'Shipping & Manual Invoice' will create the picking order directly and wait for the user to manually click on the 'Invoice' button to generate the draft invoice.\n" -" - The 'Invoice On Order After Delivery' choice will generate the draft invoice based on sales order after all picking lists have been finished.\n" -" - The 'Invoice From The Picking' choice is used to create an invoice during the picking process." -msgstr "La política de envío se utiliza para sincronizar las operaciones de envío y facturación.\n" -" -La opción 'Pagar antes del envío' primero generará la factura y más tarde la orden después del pago de dicha factura.\n" -" -La opción 'Envío y factura manual' creará la orden directamente y esperará a que un usuario haga clic manualemente sobre el botón 'Facturar' para generar la factura en el estado borrador.\n" -" -La opción 'Facturar pedido después del envío' generará la factura en estado borrador basándose en el pedido de venta después de que todas las ordenes hayan sido realizadas.\n" -" -La opción 'Facturar desde orden' se utiliza para crear una factura durante el proceso de preparación del pedido." - -#. module: sale -#: code:addons/sale/sale.py:939 -#, python-format -msgid "There is no income category account defined in default Properties for Product Category or Fiscal Position is not defined !" -msgstr "¡No hay ninguna cuenta de categoría de ingresos definida en las propiedades por defecto de la categoría del producto o la posición fiscal no está definida!" - -#. module: sale -#: view:sale.installer:0 -msgid "Configure" -msgstr "Configurar" - -#. module: sale -#: constraint:stock.move:0 -msgid "You try to assign a lot which is not from the same product" -msgstr "Está intentando asignar un lote que no es del mismo producto" - -#. module: sale -#: code:addons/sale/sale.py:620 -#, python-format -msgid "invalid mode for test_state" -msgstr "Modo no válido para test_state" - -#. module: sale -#: selection:sale.report,month:0 -msgid "June" -msgstr "Junio" - -#. module: sale -#: code:addons/sale/sale.py:584 -#, python-format -msgid "Could not cancel this sales order !" -msgstr "¡No se puede cancelar este pedido de venta!" - -#. module: sale -#: model:ir.model,name:sale.model_sale_report -msgid "Sales Orders Statistics" -msgstr "Estadísticas pedidos de venta" - -#. module: sale -#: help:sale.order,project_id:0 -msgid "The analytic account related to a sales order." -msgstr "La cuenta analítica relacionada con un pedido de venta." - -#. module: sale -#: selection:sale.report,month:0 -msgid "October" -msgstr "Octubre" - -#. module: sale -#: view:board.board:0 -#: model:ir.actions.act_window,name:sale.action_quotation_for_sale -#: view:sale.order:0 -#: view:sale.report:0 -msgid "Quotations" -msgstr "Presupuestos" - -#. module: sale -#: help:sale.order,pricelist_id:0 -msgid "Pricelist for current sales order." -msgstr "Tarifa para el pedido de venta actual." - -#. module: sale -#: selection:sale.config.picking_policy,step:0 -msgid "Delivery Order Only" -msgstr "Sólo orden de entrega" - -#. module: sale -#: report:sale.order:0 -msgid "TVA :" -msgstr "IVA :" - -#. module: sale -#: help:sale.order.line,delay:0 -msgid "Number of days between the order confirmation the shipping of the products to the customer" -msgstr "Número de días entre la confirmación del pedido y el envío de los productos al cliente." - -#. module: sale -#: report:sale.order:0 -msgid "Quotation Date" -msgstr "Fecha presupuesto" - -#. module: sale -#: field:sale.order,fiscal_position:0 -msgid "Fiscal Position" -msgstr "Posición fiscal" - -#. module: sale -#: view:sale.order:0 -#: view:sale.order.line:0 -msgid "UoM" -msgstr "UdM" - -#. module: sale -#: field:sale.order.line,number_packages:0 -msgid "Number Packages" -msgstr "Número paquetes" - -#. module: sale -#: selection:sale.order,state:0 -#: selection:sale.report,state:0 -msgid "In Progress" -msgstr "En proceso" - -#. module: sale -#: model:process.transition,note:sale.process_transition_confirmquotation0 -msgid "The salesman confirms the quotation. The state of the sales order becomes 'In progress' or 'Manual in progress'." -msgstr "El vendedor confirma el presupuesto. El estado del pedido de venta se convierte 'En proceso' o 'Manual en proceso'." - -#. module: sale -#: code:addons/sale/sale.py:971 -#, python-format -msgid "You must first cancel stock moves attached to this sales order line." -msgstr "Debe cancelar primero los movimientos de stock asociados a esta línea de pedido de venta." - -#. module: sale -#: code:addons/sale/sale.py:1042 -#, python-format -msgid "(n/a)" -msgstr "(n/a)" - -#. module: sale -#: help:sale.advance.payment.inv,product_id:0 -msgid "Select a product of type service which is called 'Advance Product'. You may have to create it and set it as a default value on this field." -msgstr "Seleccione un producto del tipo de servicio que se llama 'Producto avanzado'. Puede que tenga que crearlo y configurarlo como un valor por defecto para este campo." - -#. module: sale -#: report:sale.order:0 -msgid "Tel. :" -msgstr "Tel. :" - -#. module: sale -#: code:addons/sale/wizard/sale_make_invoice_advance.py:64 -#, python-format -msgid "You cannot make an advance on a sales order that is defined as 'Automatic Invoice after delivery'." -msgstr "No puede realizar un anticipo de un pedido de venta que está definido como 'Factura automática después envío'." - -#. module: sale -#: view:sale.order:0 -#: field:sale.order,note:0 -#: view:sale.order.line:0 -#: field:sale.order.line,notes:0 -msgid "Notes" -msgstr "Notas" - -#. module: sale -#: help:sale.order,partner_invoice_id:0 -msgid "Invoice address for current sales order." -msgstr "Dirección de facturación para el pedido de venta actual." - -#. module: sale -#: view:sale.installer:0 -msgid "Enhance your core Sales Application with additional functionalities." -msgstr "Optimizar su aplicación de ventas con funcionalidades adicionales." - -#. module: sale -#: field:sale.order,invoiced_rate:0 -#: field:sale.order.line,invoiced:0 -msgid "Invoiced" -msgstr "Facturado" - -#. module: sale -#: model:process.node,name:sale.process_node_deliveryorder0 -msgid "Delivery Order" -msgstr "Orden de entrega" - -#. module: sale -#: field:sale.order,date_confirm:0 -msgid "Confirmation Date" -msgstr "Fecha confirmación" - -#. module: sale -#: field:sale.order.line,address_allotment_id:0 -msgid "Allotment Partner" -msgstr "Ubicación empresa" - -#. module: sale -#: sql_constraint:sale.order:0 -msgid "Order Reference must be unique !" -msgstr "¡La referencia del pedido debe ser única!" - -#. module: sale -#: selection:sale.report,month:0 -msgid "March" -msgstr "Marzo" - -#. module: sale -#: help:sale.order,amount_total:0 -msgid "The total amount." -msgstr "El importe total." - -#. module: sale -#: field:sale.order.line,price_subtotal:0 -msgid "Subtotal" -msgstr "Subtotal" - -#. module: sale -#: report:sale.order:0 -msgid "Invoice address :" -msgstr "Dirección de factura :" - -#. module: sale -#: model:process.transition,note:sale.process_transition_saleorderprocurement0 -msgid "For every sales order line, a procurement order is created to supply the sold product." -msgstr "Para cada línea de pedido de venta, se crea una orden de abastecimiento para suministrar el producto vendido." - -#. module: sale -#: help:sale.order,incoterm:0 -msgid "Incoterm which stands for 'International Commercial terms' implies its a series of sales terms which are used in the commercial transaction." -msgstr "Incoterm, que significa 'Términos de Comercio Internacional', implica una serie de condiciones de venta que se utilizan en la transacción comercial." - -#. module: sale -#: field:sale.order,partner_invoice_id:0 -msgid "Invoice Address" -msgstr "Dirección de factura" - -#. module: sale -#: view:sale.order.line:0 -msgid "Search Uninvoiced Lines" -msgstr "Buscar líneas no facturadas" - -#. module: sale -#: model:ir.actions.report.xml,name:sale.report_sale_order -msgid "Quotation / Order" -msgstr "Presupuesto / Pedido" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,nbr:0 -msgid "# of Lines" -msgstr "# de líneas" - -#. module: sale -#: model:ir.model,name:sale.model_sale_open_invoice -msgid "Sales Open Invoice" -msgstr "Ventas. Abrir factura" - -#. module: sale -#: model:ir.model,name:sale.model_sale_order_line -#: field:stock.move,sale_line_id:0 -msgid "Sales Order Line" -msgstr "Línea pedido de venta" - -#. module: sale -#: view:sale.config.picking_policy:0 -msgid "Setup your sales workflow and default values." -msgstr "Configurar su flujo de ventas y valores por defecto." - -#. module: sale -#: field:sale.shop,warehouse_id:0 -msgid "Warehouse" -msgstr "Almacén" - -#. module: sale -#: report:sale.order:0 -msgid "Order N°" -msgstr "Pedido Nº" - -#. module: sale -#: field:sale.order,order_line:0 -msgid "Order Lines" -msgstr "Líneas del pedido" - -#. module: sale -#: view:sale.order:0 -msgid "Untaxed amount" -msgstr "Monto sin impuestos" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_line_tree2 -#: model:ir.ui.menu,name:sale.menu_invoicing_sales_order_lines -msgid "Lines to Invoice" -msgstr "Líneas a facturar" - -#. module: sale -#: field:sale.order.line,product_uom_qty:0 -msgid "Quantity (UoM)" -msgstr "Cantidad (UdM)" - -#. module: sale -#: field:sale.order,create_date:0 -msgid "Creation Date" -msgstr "Fecha de creación" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_line_tree3 -msgid "Uninvoiced and Delivered Lines" -msgstr "Líneas no facturadas y entregadas" - -#. module: sale -#: report:sale.order:0 -msgid "Total :" -msgstr "Total :" - -#. module: sale -#: view:sale.report:0 -msgid "My Sales" -msgstr "Mis ventas" - -#. module: sale -#: code:addons/sale/sale.py:290 -#: code:addons/sale/sale.py:966 -#: code:addons/sale/sale.py:1165 -#, python-format -msgid "Invalid action !" -msgstr "¡Acción no válida!" - -#. module: sale -#: field:sale.order,pricelist_id:0 -#: field:sale.report,pricelist_id:0 -#: field:sale.shop,pricelist_id:0 -msgid "Pricelist" -msgstr "Lista de precios" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,product_uom_qty:0 -msgid "# of Qty" -msgstr "Nº de ctdad" - -#. module: sale -#: view:sale.order:0 -msgid "Order Date" -msgstr "Fecha pedido" - -#. module: sale -#: view:sale.order.line:0 -#: field:sale.report,shipped:0 -msgid "Shipped" -msgstr "Enviado" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_tree5 -msgid "All Quotations" -msgstr "Todos los presupuestos" - -#. module: sale -#: selection:sale.order,order_policy:0 -msgid "Invoice On Order After Delivery" -msgstr "Facturar pedido después de envío" - -#. module: sale -#: selection:sale.report,month:0 -msgid "September" -msgstr "Septiembre" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,categ_id:0 -msgid "Category of Product" -msgstr "Categoría de producto" - -#. module: sale -#: report:sale.order:0 -msgid "Taxes :" -msgstr "Impuestos :" - -#. module: sale -#: view:sale.order:0 -msgid "Stock Moves" -msgstr "Movimientos de stock" - -#. module: sale -#: view:sale.report:0 -msgid " Year " -msgstr " Año " - -#. module: sale -#: field:sale.order,state:0 -#: field:sale.report,state:0 -msgid "Order State" -msgstr "Estado del pedido" - -#. module: sale -#: view:sale.make.invoice:0 -#: view:sale.order.line.make.invoice:0 -msgid "Do you really want to create the invoice(s)?" -msgstr "¿Desea crear la(s) factura(s)?" - -#. module: sale -#: view:sale.report:0 -msgid "Sales By Month" -msgstr "Ventas por mes" - -#. module: sale -#: code:addons/sale/sale.py:970 -#, python-format -msgid "Could not cancel sales order line!" -msgstr "¡No se puede cancelar línea pedido de venta!" - -#. module: sale -#: field:res.company,security_lead:0 -msgid "Security Days" -msgstr "Días seguridad" - -#. module: sale -#: model:process.transition,name:sale.process_transition_saleorderprocurement0 -msgid "Procurement of sold material" -msgstr "Abastecimiento de material vendido" - -#. module: sale -#: view:sale.order:0 -msgid "Create Final Invoice" -msgstr "Crear factura final" - -#. module: sale -#: field:sale.order,partner_shipping_id:0 -msgid "Shipping Address" -msgstr "Dirección de envío" - -#. module: sale -#: help:sale.order,shipped:0 -msgid "It indicates that the sales order has been delivered. This field is updated only after the scheduler(s) have been launched." -msgstr "Indica que el pedido de venta ha sido entregado. Este campo se actualiza sólo después que el planificador(es) se ha ejecutado." - -#. module: sale -#: view:sale.report:0 -msgid "Extended Filters..." -msgstr "Filtros extendidos..." - -#. module: sale -#: model:ir.module.module,description:sale.module_meta_information -msgid "\n" -" The base module to manage quotations and sales orders.\n" -"\n" -" * Workflow with validation steps:\n" -" - Quotation -> Sales order -> Invoice\n" -" * Invoicing methods:\n" -" - Invoice on order (before or after shipping)\n" -" - Invoice on delivery\n" -" - Invoice on timesheets\n" -" - Advance invoice\n" -" * Partners preferences (shipping, invoicing, incoterm, ...)\n" -" * Products stocks and prices\n" -" * Delivery methods:\n" -" - all at once, multi-parcel\n" -" - delivery costs\n" -" * Dashboard for salesman that includes:\n" -" * Your open quotations\n" -" * Top 10 sales of the month\n" -" * Cases statistics\n" -" * Graph of sales by product\n" -" * Graph of cases of the month\n" -" " -msgstr "\n" -" El módulo base para gestionar presupuestos y pedidos de venta.\n" -"\n" -" * Flujo de trabajo con etapas de validación:\n" -" - Presupuesto -> Pedido de venta -> Factura\n" -" * Métodos de facturación:\n" -" - Factura del pedido (antes o después del envío)\n" -" - Factura de la orden\n" -" - Factura de la hoja de servicios\n" -" - Avanzar factura\n" -" * Preferencias de los clientes (envío, facturación, incoterm, ...)\n" -" * Existencias de los productos y precios\n" -" * Formas de envío:\n" -" - Todo a la vez, En varios paquetes\n" -" - Gastos de envío\n" -" * El tablero para el comercial incluye:\n" -" * Sus presupuestos abiertos\n" -" * Las 10 mejores ventas del mes\n" -" * Estadísticas de casos\n" -" * Gráfico de las ventas por producto\n" -" * Gráfico de los casos por mes\n" -" " - -#. module: sale -#: model:ir.model,name:sale.model_sale_shop -#: view:sale.shop:0 -msgid "Sales Shop" -msgstr "Tienda ventas" - -#. module: sale -#: model:ir.model,name:sale.model_res_company -msgid "Companies" -msgstr "Compañías" - -#. module: sale -#: selection:sale.report,month:0 -msgid "November" -msgstr "Noviembre" - -#. module: sale -#: view:sale.order:0 -msgid "History" -msgstr "Historial" - -#. module: sale -#: field:sale.config.picking_policy,picking_policy:0 -msgid "Picking Default Policy" -msgstr "Política de empaquetado por defecto" - -#. module: sale -#: help:sale.order,invoice_ids:0 -msgid "This is the list of invoices that have been generated for this sales order. The same sales order may have been invoiced in several times (by line for example)." -msgstr "Esta es la lista de facturas que han sido generadas para este pedido de venta. El mismo pedido de venta puede haber sido facturado varias veces (línea a línea, por ejemplo)." - -#. module: sale -#: report:sale.order:0 -msgid "Your Reference" -msgstr "Su referencia" - -#. module: sale -#: help:sale.order,partner_order_id:0 -msgid "The name and address of the contact who requested the order or quotation." -msgstr "El nombre y la dirección del contacto que ha solicitado el pedido o presupuesto." - -#. module: sale -#: code:addons/sale/sale.py:966 -#, python-format -msgid "You cannot cancel a sales order line that has already been invoiced !" -msgstr "¡No puede cancelar una línea de pedido de venta que ya ha sido facturada!" - -#. module: sale -#: view:sale.order:0 -#: view:sale.order.line:0 -msgid "Qty" -msgstr "Ctdad" - -#. module: sale -#: view:sale.order:0 -msgid "References" -msgstr "Referencias" - -#. module: sale -#: model:process.transition.action,name:sale.process_transition_action_cancel0 -#: model:process.transition.action,name:sale.process_transition_action_cancel1 -#: model:process.transition.action,name:sale.process_transition_action_cancel2 -#: view:sale.advance.payment.inv:0 -#: view:sale.make.invoice:0 -#: view:sale.order.line:0 -#: view:sale.order.line.make.invoice:0 -msgid "Cancel" -msgstr "Cancelar" - -#. module: sale -#: field:sale.installer,sale_order_dates:0 -msgid "Sales Order Dates" -msgstr "Fechas en pedidos de venta" - -#. module: sale -#: selection:sale.order.line,state:0 -msgid "Exception" -msgstr "Excepción" - -#. module: sale -#: model:process.transition,name:sale.process_transition_invoice0 -#: model:process.transition,name:sale.process_transition_invoiceafterdelivery0 -#: model:process.transition.action,name:sale.process_transition_action_createinvoice0 -#: view:sale.advance.payment.inv:0 -#: view:sale.order.line:0 -msgid "Create Invoice" -msgstr "Crear factura" - -#. module: sale -#: field:sale.installer,sale_margin:0 -msgid "Margins in Sales Orders" -msgstr "Márgenes en pedidos de venta" - -#. module: sale -#: view:sale.order:0 -msgid "Total Tax Excluded" -msgstr "Total sin impuestos" - -#. module: sale -#: view:sale.order:0 -msgid "Compute" -msgstr "Calcular" - -#. module: sale -#: view:sale.report:0 -msgid "Sales by Partner" -msgstr "Ventas por empresa" - -#. module: sale -#: field:sale.order,partner_order_id:0 -msgid "Ordering Contact" -msgstr "Contacto del pedido" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_view_sale_open_invoice -#: view:sale.open.invoice:0 -msgid "Open Invoice" -msgstr "Abrir factura" - -#. module: sale -#: report:sale.order:0 -#: view:sale.order.line:0 -msgid "Price" -msgstr "Precio" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_sale_installer -#: view:sale.config.picking_policy:0 -#: view:sale.installer:0 -msgid "Sales Application Configuration" -msgstr "Configuración aplicaciones de ventas" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,price_total:0 -msgid "Total Price" -msgstr "Precio total" - -#. module: sale -#: selection:sale.order.line,type:0 -msgid "on order" -msgstr "bajo pedido" - -#. module: sale -#: model:process.node,note:sale.process_node_invoiceafterdelivery0 -msgid "Based on the shipped or on the ordered quantities." -msgstr "Basado en las cantidades enviadas o ordenadas." - -#. module: sale -#: field:sale.order,picking_ids:0 -msgid "Related Picking" -msgstr "Orden relacionada" - -#. module: sale -#: field:sale.config.picking_policy,name:0 -msgid "Name" -msgstr "Nombre" - -#. module: sale -#: report:sale.order:0 -msgid "Shipping address :" -msgstr "Dirección de envío :" - -#. module: sale -#: view:board.board:0 -#: model:ir.actions.act_window,name:sale.action_sales_by_partner -msgid "Sales per Customer in last 90 days" -msgstr "Ventas por cliente últimos 90 días" - -#. module: sale -#: model:process.node,note:sale.process_node_quotation0 -msgid "Draft state of sales order" -msgstr "Estado borrador del pedido de venta" - -#. module: sale -#: model:process.transition,name:sale.process_transition_deliver0 -msgid "Create Delivery Order" -msgstr "Crear orden de entrega" - -#. module: sale -#: field:sale.installer,delivery:0 -msgid "Delivery Costs" -msgstr "Costes de envío" - -#. module: sale -#: view:sale.order:0 -msgid "Total Tax Included" -msgstr "Total impuestos incluidos" - -#. module: sale -#: model:process.transition,name:sale.process_transition_packing0 -msgid "Create Pick List" -msgstr "Crear lista empaque" - -#. module: sale -#: view:sale.report:0 -msgid "Sales by Product Category" -msgstr "Ventas por categoría de producto" - -#. module: sale -#: selection:sale.order,picking_policy:0 -msgid "Partial Delivery" -msgstr "Envío parcial" - -#. module: sale -#: model:process.transition,name:sale.process_transition_confirmquotation0 -msgid "Confirm Quotation" -msgstr "Confirmar presupuesto" - -#. module: sale -#: help:sale.order,origin:0 -msgid "Reference of the document that generated this sales order request." -msgstr "Referencia del documento que ha generado esta solicitud de pedido de venta." - -#. module: sale -#: view:sale.order:0 -#: view:sale.order.line:0 -#: view:sale.report:0 -msgid "Group By..." -msgstr "Agrupar por..." - -#. module: sale -#: view:sale.order:0 -msgid "Recreate Invoice" -msgstr "Volver a Crear factura" - -#. module: sale -#: model:ir.actions.act_window,name:sale.outgoing_picking_list_to_invoice -#: model:ir.ui.menu,name:sale.menu_action_picking_list_to_invoice -msgid "Deliveries to Invoice" -msgstr "Ordenes a facturar" - -#. module: sale -#: selection:sale.order,state:0 -#: selection:sale.report,state:0 -msgid "Waiting Schedule" -msgstr "Esperando fecha planificada" - -#. module: sale -#: field:sale.order.line,type:0 -msgid "Procurement Method" -msgstr "Método abastecimiento" - -#. module: sale -#: view:sale.config.picking_policy:0 -#: view:sale.installer:0 -msgid "title" -msgstr "título" - -#. module: sale -#: model:process.node,name:sale.process_node_packinglist0 -msgid "Pick List" -msgstr "Lista de empaque" - -#. module: sale -#: view:sale.order:0 -msgid "Order date" -msgstr "Fecha pedido" - -#. module: sale -#: model:process.node,note:sale.process_node_packinglist0 -msgid "Document of the move to the output or to the customer." -msgstr "Documento del movimiento a la salida o al cliente." - -#. module: sale -#: model:process.transition.action,name:sale.process_transition_action_validate0 -msgid "Validate" -msgstr "Validar" - -#. module: sale -#: view:sale.order:0 -msgid "Confirm Order" -msgstr "Confirmar pedido" - -#. module: sale -#: model:process.transition,name:sale.process_transition_saleprocurement0 -msgid "Create Procurement Order" -msgstr "Crear orden de abastecimiento" - -#. module: sale -#: view:sale.order:0 -#: field:sale.order,amount_tax:0 -#: field:sale.order.line,tax_id:0 -msgid "Taxes" -msgstr "Impuestos" - -#. module: sale -#: field:sale.order,order_policy:0 -msgid "Shipping Policy" -msgstr "Política de facturación" - -#. module: sale -#: help:sale.order,create_date:0 -msgid "Date on which sales order is created." -msgstr "Fecha en la que se crea el pedido de venta." - -#. module: sale -#: model:ir.model,name:sale.model_stock_move -msgid "Stock Move" -msgstr "Movimiento stock" - -#. module: sale -#: view:sale.make.invoice:0 -#: view:sale.order.line.make.invoice:0 -msgid "Create Invoices" -msgstr "Crear facturas" - -#. module: sale -#: view:sale.order:0 -msgid "Extra Info" -msgstr "Información extra" - -#. module: sale -#: report:sale.order:0 -msgid "Fax :" -msgstr "Fax :" - -#. module: sale -#: field:sale.advance.payment.inv,amount:0 -msgid "Advance Amount" -msgstr "Importe avanzado" - -#. module: sale -#: selection:sale.order,invoice_quantity:0 -msgid "Shipped Quantities" -msgstr "Cantidades enviadas" - -#. module: sale -#: selection:sale.config.picking_policy,order_policy:0 -msgid "Invoice Based on Sales Orders" -msgstr "Factura basada en pedidos de venta" - -#. module: sale -#: model:ir.model,name:sale.model_stock_picking -msgid "Picking List" -msgstr "Lista de empaque" - -#. module: sale -#: code:addons/sale/sale.py:387 -#: code:addons/sale/sale.py:920 -#: code:addons/sale/sale.py:938 -#, python-format -msgid "Error !" -msgstr "¡Error!" - -#. module: sale -#: code:addons/sale/sale.py:570 -#, python-format -msgid "Could not cancel sales order !" -msgstr "¡No se puede cancelar el pedido de venta!" - -#. module: sale -#: selection:sale.report,month:0 -msgid "July" -msgstr "Julio" - -#. module: sale -#: field:sale.order.line,procurement_id:0 -msgid "Procurement" -msgstr "Abastecimiento" - -#. module: sale -#: selection:sale.order,state:0 -#: selection:sale.report,state:0 -msgid "Shipping Exception" -msgstr "Excepción de envío" - -#. module: sale -#: field:sale.make.invoice,grouped:0 -msgid "Group the invoices" -msgstr "Agrupar las facturas" - -#. module: sale -#: selection:sale.order,order_policy:0 -msgid "Shipping & Manual Invoice" -msgstr "Enviar & Factura manual" - -#. module: sale -#: code:addons/sale/sale.py:1051 -#, python-format -msgid "Picking Information !" -msgstr "¡Información de la Lista de empaque!" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,month:0 -msgid "Month" -msgstr "Mes" - -#. module: sale -#: model:ir.module.module,shortdesc:sale.module_meta_information -msgid "Sales Management" -msgstr "Ventas" - -#. module: sale -#: selection:sale.order,order_policy:0 -msgid "Invoice From The Picking" -msgstr "Factura desde la orden" - -#. module: sale -#: model:process.node,note:sale.process_node_invoice0 -msgid "To be reviewed by the accountant." -msgstr "Para ser revisado por el contador." - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,uom_name:0 -msgid "Reference UoM" -msgstr "Referencia UdM" - -#. module: sale -#: model:ir.model,name:sale.model_sale_order_line_make_invoice -msgid "Sale OrderLine Make_invoice" -msgstr "Venta Línea_pedido Realizar_factura" - -#. module: sale -#: help:sale.config.picking_policy,step:0 -msgid "By default, OpenERP is able to manage complex routing and paths of products in your warehouse and partner locations. This will configure the most common and simple methods to deliver products to the customer in one or two operations by the worker." -msgstr "Por defecto, OpenERP es capaz de gestionar complejas rutas y caminos de los productos en su almacén y en las ubicaciones de otras empresas. Esto configurará los métodos más comunes y sencillos para entregar los productos al cliente en una o dos operaciones realizadas por el trabajador." - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_tree -msgid "Old Quotations" -msgstr "Presupuestos antiguos" - -#. module: sale -#: field:sale.order,invoiced:0 -msgid "Paid" -msgstr "Pagado" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_report_all -#: model:ir.ui.menu,name:sale.menu_report_product_all -#: view:sale.report:0 -msgid "Sales Analysis" -msgstr "Análisis de ventas" - -#. module: sale -#: field:sale.order.line,property_ids:0 -msgid "Properties" -msgstr "Propiedades" - -#. module: sale -#: model:process.node,name:sale.process_node_quotation0 -#: selection:sale.order,state:0 -#: selection:sale.report,state:0 -msgid "Quotation" -msgstr "Presupuesto" - -#. module: sale -#: model:process.transition,note:sale.process_transition_invoice0 -msgid "The Salesman creates an invoice manually, if the sales order shipping policy is 'Shipping and Manual in Progress'. The invoice is created automatically if the shipping policy is 'Payment before Delivery'." -msgstr "El vendedor crea una factura manualmente si la política de facturación del pedido de venta es \"Envío y Factura manual\". La factura se crea de forma automática si la política de facturación es 'Pago antes del envío'." - -#. module: sale -#: help:sale.config.picking_policy,order_policy:0 -msgid "You can generate invoices based on sales orders or based on shippings." -msgstr "Puede generar facturas basadas en pedidos de venta o basadas en envíos." - -#. module: sale -#: model:ir.actions.act_window,name:sale.act_res_partner_2_sale_order -#: model:process.process,name:sale.process_process_salesprocess0 -#: view:sale.order:0 -#: view:sale.report:0 -msgid "Sales" -msgstr "Ventas" - -#. module: sale -#: report:sale.order:0 -#: field:sale.order.line,price_unit:0 -msgid "Unit Price" -msgstr "Precio unidad" - -#. module: sale -#: selection:sale.order,state:0 -#: view:sale.order.line:0 -#: selection:sale.order.line,state:0 -#: selection:sale.report,state:0 -msgid "Done" -msgstr "Realizado" - -#. module: sale -#: model:ir.model,name:sale.model_sale_installer -msgid "sale.installer" -msgstr "venta.instalador" - -#. module: sale -#: model:process.node,name:sale.process_node_invoice0 -#: model:process.node,name:sale.process_node_invoiceafterdelivery0 -msgid "Invoice" -msgstr "Factura" - -#. module: sale -#: code:addons/sale/sale.py:1014 -#, python-format -msgid "You have to select a customer in the sales form !\n" -"Please set one customer before choosing a product." -msgstr "¡Debe seleccionar un cliente en el formulario de ventas!\n" -"Introduzca un cliente antes de seleccionar un producto." - -#. module: sale -#: selection:sale.config.picking_policy,step:0 -msgid "Picking List & Delivery Order" -msgstr "Orden y Orden de entrega" - -#. module: sale -#: field:sale.order,origin:0 -msgid "Source Document" -msgstr "Documento origen" - -#. module: sale -#: view:sale.order.line:0 -msgid "To Do" -msgstr "Para hacer" - -#. module: sale -#: field:sale.order,picking_policy:0 -msgid "Picking Policy" -msgstr "Política de envío" - -#. module: sale -#: model:process.node,note:sale.process_node_deliveryorder0 -msgid "Document of the move to the customer." -msgstr "Documento del movimiento al cliente." - -#. module: sale -#: help:sale.order,amount_untaxed:0 -msgid "The amount without tax." -msgstr "El importe sin impuestos." - -#. module: sale -#: code:addons/sale/sale.py:571 -#, python-format -msgid "You must first cancel all picking attached to this sales order." -msgstr "Debe primero cancelar todas las ordenes relacionadas con este pedido de venta." - -#. module: sale -#: model:ir.model,name:sale.model_sale_advance_payment_inv -msgid "Sales Advance Payment Invoice" -msgstr "Ventas. Anticipo pago factura" - -#. module: sale -#: field:sale.order,incoterm:0 -msgid "Incoterm" -msgstr "Incoterm" - -#. module: sale -#: view:sale.order.line:0 -#: field:sale.order.line,product_id:0 -#: view:sale.report:0 -#: field:sale.report,product_id:0 -msgid "Product" -msgstr "Producto" - -#. module: sale -#: model:ir.ui.menu,name:sale.menu_invoiced -msgid "Invoicing" -msgstr "Facturación" - -#. module: sale -#: model:process.transition.action,name:sale.process_transition_action_cancelassignation0 -msgid "Cancel Assignation" -msgstr "Cancelar asignación" - -#. module: sale -#: model:ir.model,name:sale.model_sale_config_picking_policy -msgid "sale.config.picking_policy" -msgstr "sale.config.picking_policy" - -#. module: sale -#: help:sale.order,state:0 -msgid "Gives the state of the quotation or sales order. \n" -"The exception state is automatically set when a cancel operation occurs in the invoice validation (Invoice Exception) or in the picking list process (Shipping Exception). \n" -"The 'Waiting Schedule' state is set when the invoice is confirmed but waiting for the scheduler to run on the date 'Ordered Date'." -msgstr "Indica el estado del presupuesto o pedido de venta. \n" -"El estado de excepción se establece automáticamente cuando se produce una operación de cancelación en la validación de factura (excepción de factura) o en el procesado de la orden (excepción de envío). \n" -"El estado 'Esperando planificación' se establece cuando se confirma la factura, pero está esperando que el planificador la active en la fecha de \"Fecha ordenada\"." - -#. module: sale -#: field:sale.order,invoice_quantity:0 -msgid "Invoice on" -msgstr "Facturar las" - -#. module: sale -#: report:sale.order:0 -msgid "Date Ordered" -msgstr "Fecha ordenada" - -#. module: sale -#: field:sale.order.line,product_uos:0 -msgid "Product UoS" -msgstr "UdV del producto" - -#. module: sale -#: selection:sale.order,state:0 -#: selection:sale.report,state:0 -msgid "Manual In Progress" -msgstr "Manual en proceso" - -#. module: sale -#: field:sale.order.line,product_uom:0 -msgid "Product UoM" -msgstr "UdM del producto" - -#. module: sale -#: view:sale.order:0 -msgid "Logistic" -msgstr "Logística" - -#. module: sale -#: view:sale.order.line:0 -msgid "Order" -msgstr "Pedido" - -#. module: sale -#: code:addons/sale/sale.py:921 -#, python-format -msgid "There is no income account defined for this product: \"%s\" (id:%d)" -msgstr "No se ha definido una cuenta de ingresos para este producto: \"%s\" (id:%d)" - -#. module: sale -#: view:sale.order:0 -msgid "Ignore Exception" -msgstr "Ignorar excepción" - -#. module: sale -#: model:process.transition,note:sale.process_transition_saleinvoice0 -msgid "Depending on the Invoicing control of the sales order, the invoice can be based on delivered or on ordered quantities. Thus, a sales order can generates an invoice or a delivery order as soon as it is confirmed by the salesman." -msgstr "En función del control de facturación de los pedidos de venta, la factura puede estar basada en las cantidades enviadas o vendidas. Por lo tanto, un pedido de venta puede generar una factura o una orden tan pronto como sea confirmada por el vendedor." - -#. module: sale -#: code:addons/sale/sale.py:1116 -#, python-format -msgid "You plan to sell %.2f %s but you only have %.2f %s available !\n" -"The real stock is %.2f %s. (without reservations)" -msgstr "¡Prevé vender %.2f %s pero sólo %.2f %s están disponibles!\n" -"El stock real es %.2f %s. (sin reservas)" - -#. module: sale -#: view:sale.order:0 -msgid "States" -msgstr "Estados" - -#. module: sale -#: view:sale.config.picking_policy:0 -msgid "res_config_contents" -msgstr "res_config_contenidos" - -#. module: sale -#: field:sale.order,client_order_ref:0 -msgid "Customer Reference" -msgstr "Referencia cliente" - -#. module: sale -#: field:sale.order,amount_total:0 -#: view:sale.order.line:0 -msgid "Total" -msgstr "Total" - -#. module: sale -#: code:addons/sale/sale.py:388 -#, python-format -msgid "There is no sales journal defined for this company: \"%s\" (id:%d)" -msgstr "No se ha definido un diario de ventas para esta compañía: \"%s\" (id:%d)" - -#. module: sale -#: model:process.transition,note:sale.process_transition_deliver0 -msgid "Depending on the configuration of the location Output, the move between the output area and the customer is done through the Delivery Order manually or automatically." -msgstr "Dependiendo de la configuración de la ubicación de salida, el movimiento entre la zona de salida y el cliente se realiza a través de la orden de entrega de forma manual o automática." - -#. module: sale -#: code:addons/sale/sale.py:1165 -#, python-format -msgid "Cannot delete a sales order line which is %s !" -msgstr "¡No se puede eliminar una línea de pedido de venta que está %s!" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_sale_order_make_invoice -#: model:ir.actions.act_window,name:sale.action_view_sale_order_line_make_invoice -#: view:sale.order:0 -msgid "Make Invoices" -msgstr "Realizar facturas" - -#. module: sale -#: view:sale.order:0 -#: view:sale.order.line:0 -msgid "To Invoice" -msgstr "Para facturar" - -#. module: sale -#: help:sale.order,date_confirm:0 -msgid "Date on which sales order is confirmed." -msgstr "Fecha en la que se confirma el pedido de venta." - -#. module: sale -#: field:sale.order,company_id:0 -#: field:sale.order.line,company_id:0 -#: view:sale.report:0 -#: field:sale.report,company_id:0 -#: field:sale.shop,company_id:0 -msgid "Company" -msgstr "Compañía" - -#. module: sale -#: field:sale.make.invoice,invoice_date:0 -msgid "Invoice Date" -msgstr "Fecha factura" - -#. module: sale -#: help:sale.advance.payment.inv,amount:0 -msgid "The amount to be invoiced in advance." -msgstr "El importe a facturar por adelantado." - -#. module: sale -#: selection:sale.order,state:0 -#: selection:sale.report,state:0 -msgid "Invoice Exception" -msgstr "Excepción de factura" - -#. module: sale -#: help:sale.order,picking_ids:0 -msgid "This is a list of picking that has been generated for this sales order." -msgstr "Esta es la lista de ordenes que han sido generados para este pedido de venta." - -#. module: sale -#: help:sale.installer,sale_margin:0 -msgid "Gives the margin of profitability by calculating the difference between Unit Price and Cost Price." -msgstr "Indica el margen de rentabilidad mediante el cálculo de la diferencia entre el precio unitario y el precio de coste." - -#. module: sale -#: view:sale.make.invoice:0 -#: view:sale.order.line.make.invoice:0 -msgid "Create invoices" -msgstr "Crear facturas" - -#. module: sale -#: report:sale.order:0 -msgid "Net Total :" -msgstr "Total neto :" - -#. module: sale -#: selection:sale.order,state:0 -#: selection:sale.order.line,state:0 -#: selection:sale.report,state:0 -msgid "Cancelled" -msgstr "Cancelado" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_shop_form -#: model:ir.ui.menu,name:sale.menu_action_shop_form -#: field:sale.order,shop_id:0 -#: view:sale.report:0 -#: field:sale.report,shop_id:0 -msgid "Shop" -msgstr "Tienda" - -#. module: sale -#: view:sale.report:0 -msgid " Month " -msgstr " Mes " - -#. module: sale -#: field:sale.report,date_confirm:0 -msgid "Date Confirm" -msgstr "Fecha confirmación" - -#. module: sale -#: code:addons/sale/wizard/sale_line_invoice.py:111 -#, python-format -msgid "Warning" -msgstr "Aviso" - -#. module: sale -#: view:board.board:0 -#: model:ir.actions.act_window,name:sale.action_view_sales_by_month -msgid "Sales by Month" -msgstr "Ventas por mes" - -#. module: sale -#: code:addons/sale/sale.py:1045 -#, python-format -msgid "You selected a quantity of %d Units.\n" -"But it's not compatible with the selected packaging.\n" -"Here is a proposition of quantities according to the packaging:\n" -"\n" -"EAN: %s Quantity: %s Type of ul: %s" -msgstr "Ha seleccionado una cantidad de %d unidades.\n" -"Pero no es compatible con el empaquetado seleccionado.\n" -"Aquí tiene una propuesta de cantidades acordes con este empaquetado:\n" -"\n" -"EAN: %s Cantidad: %s Tipo de ul: %s" - -#. module: sale -#: model:ir.model,name:sale.model_sale_order -#: model:process.node,name:sale.process_node_order0 -#: model:process.node,name:sale.process_node_saleorder0 -#: model:res.request.link,name:sale.req_link_sale_order -#: view:sale.order:0 -#: field:stock.picking,sale_id:0 -msgid "Sales Order" -msgstr "Pedido de venta" - -#. module: sale -#: field:sale.order.line,product_uos_qty:0 -msgid "Quantity (UoS)" -msgstr "Cantidad (UdV)" - -#. module: sale -#: model:process.transition,note:sale.process_transition_packing0 -msgid "The Pick List form is created as soon as the sales order is confirmed, in the same time as the procurement order. It represents the assignment of parts to the sales order. There is 1 pick list by sales order line which evolves with the availability of parts." -msgstr "La orden se crea tan pronto como se confirma el pedido de venta, a la vez que la orden de abastecimiento. Representa la asignación de los componentes del pedido de venta. Hay una orden por línea del pedido de venta que evoluciona con la disponibilidad de los componentes." - -#. module: sale -#: selection:sale.order.line,state:0 -msgid "Confirmed" -msgstr "Confirmado" - -#. module: sale -#: model:process.transition.action,name:sale.process_transition_action_confirm0 -msgid "Confirm" -msgstr "Confirmar" - -#. module: sale -#: constraint:res.company:0 -msgid "Error! You can not create recursive companies." -msgstr "¡Error! No se pueden crear compañías recursivas." - -#. module: sale -#: view:board.board:0 -#: model:ir.actions.act_window,name:sale.action_sales_product_total_price -msgid "Sales by Product's Category in last 90 days" -msgstr "Ventas por categoría de producto últimos 90 días" - -#. module: sale -#: view:sale.order:0 -#: field:sale.order.line,invoice_lines:0 -msgid "Invoice Lines" -msgstr "Líneas de factura" - -#. module: sale -#: view:sale.order:0 -#: view:sale.order.line:0 -msgid "Sales Order Lines" -msgstr "Líneas pedido de ventas" - -#. module: sale -#: field:sale.order.line,delay:0 -msgid "Delivery Lead Time" -msgstr "Tiempo inicial entrega" - -#. module: sale -#: view:res.company:0 -msgid "Configuration" -msgstr "Configuración" - -#. module: sale -#: selection:sale.order,picking_policy:0 -msgid "Complete Delivery" -msgstr "Envío completo" - -#. module: sale -#: view:sale.report:0 -msgid " Month-1 " -msgstr " Mes-1 " - -#. module: sale -#: help:sale.config.picking_policy,picking_policy:0 -msgid "The Shipping Policy is used to configure per order if you want to deliver as soon as possible when one product is available or you wait that all products are available.." -msgstr "La política de envío se utiliza para configurar el pedido si debe entregarse tan pronto como sea posible cuando un producto está disponible o debe esperar a que todos los productos están disponibles." - -#. module: sale -#: selection:sale.report,month:0 -msgid "August" -msgstr "Agosto" - -#. module: sale -#: code:addons/sale/wizard/sale_line_invoice.py:111 -#, python-format -msgid "Invoice cannot be created for this Sales Order Line due to one of the following reasons:\n" -"1.The state of this sales order line is either \"draft\" or \"cancel\"!\n" -"2.The Sales Order Line is Invoiced!" -msgstr "No se puede crear la factura a partir de esta línea de pedido de venta por las siguientes razones:\n" -"1. El estado de esta línea del pedido de venta está en estado \"borrador\" o \"cancelada\".\n" -"2. La línea del pedido de venta está facturada." - -#. module: sale -#: field:sale.order.line,th_weight:0 -msgid "Weight" -msgstr "Peso" - -#. module: sale -#: view:sale.open.invoice:0 -#: view:sale.order:0 -#: field:sale.order,invoice_ids:0 -msgid "Invoices" -msgstr "Facturas" - -#. module: sale -#: selection:sale.report,month:0 -msgid "December" -msgstr "Diciembre" - -#. module: sale -#: field:sale.config.picking_policy,config_logo:0 -#: field:sale.installer,config_logo:0 -msgid "Image" -msgstr "Imagen" - -#. module: sale -#: model:process.transition,note:sale.process_transition_saleprocurement0 -msgid "A procurement order is automatically created as soon as a sales order is confirmed or as the invoice is paid. It drives the purchasing and the production of products regarding to the rules and to the sales order's parameters. " -msgstr "Se crea automáticamente una orden de abastecimiento tan pronto como se confirma un pedido de venta o se paga la factura. Provoca la compra y la producción de productos según las reglas y los parámetros del pedido de venta. " - -#. module: sale -#: view:sale.order.line:0 -msgid "Uninvoiced" -msgstr "No facturada" - -#. module: sale -#: report:sale.order:0 -#: view:sale.order:0 -#: field:sale.order,user_id:0 -#: view:sale.order.line:0 -#: field:sale.order.line,salesman_id:0 -#: view:sale.report:0 -#: field:sale.report,user_id:0 -msgid "Salesman" -msgstr "Vendedor" - -#. module: sale -#: model:process.node,note:sale.process_node_saleorder0 -msgid "Drives procurement and invoicing" -msgstr "Genera abastecimiento y facturación" - -#. module: sale -#: field:sale.order,amount_untaxed:0 -msgid "Untaxed Amount" -msgstr "Monto sin impuestos" - -#. module: sale -#: code:addons/sale/wizard/sale_make_invoice_advance.py:163 -#: model:ir.actions.act_window,name:sale.action_view_sale_advance_payment_inv -#: view:sale.advance.payment.inv:0 -#: view:sale.order:0 -#, python-format -msgid "Advance Invoice" -msgstr "Avanzar factura" - -#. module: sale -#: code:addons/sale/sale.py:591 -#, python-format -msgid "The sales order '%s' has been cancelled." -msgstr "El pedido de venta '%s' ha sido cancelado." - -#. module: sale -#: selection:sale.order.line,state:0 -msgid "Draft" -msgstr "Borrador" - -#. module: sale -#: help:sale.order.line,state:0 -msgid "* The 'Draft' state is set when the related sales order in draft state. \n" -"* The 'Confirmed' state is set when the related sales order is confirmed. \n" -"* The 'Exception' state is set when the related sales order is set as exception. \n" -"* The 'Done' state is set when the sales order line has been picked. \n" -"* The 'Cancelled' state is set when a user cancel the sales order related." -msgstr "* El estado 'Borrador' se establece cuando se crea el pedido de venta.\n" -"* El estado 'Confirmado' se establece cuando se confirma el pedido de venta.\n" -"* El estado 'Excepción' se establece cuando el pedido de venta tiene una excepción.\n" -"* El estado 'Realizado' se establece cuando las líneas del pedido de venta se han enviado.\n" -"* El estado 'Cancelado' se establece cuando un usuario cancela el pedido de venta." - -#. module: sale -#: help:sale.order,amount_tax:0 -msgid "The tax amount." -msgstr "El importe de los impuestos." - -#. module: sale -#: view:sale.order:0 -msgid "Packings" -msgstr "Paquetes" - -#. module: sale -#: field:sale.config.picking_policy,progress:0 -#: field:sale.installer,progress:0 -msgid "Configuration Progress" -msgstr "Progreso de configuración" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_line_product_tree -msgid "Product sales" -msgstr "Ventas de producto" - -#. module: sale -#: field:sale.order,date_order:0 -msgid "Ordered Date" -msgstr "Fecha ordenada" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_form -#: model:ir.ui.menu,name:sale.menu_sale_order -#: view:sale.order:0 -msgid "Sales Orders" -msgstr "Pedidos de ventas" - -#. module: sale -#: selection:sale.config.picking_policy,picking_policy:0 -msgid "Direct Delivery" -msgstr "Envío directo" - -#. module: sale -#: field:sale.installer,sale_journal:0 -msgid "Invoicing journals" -msgstr "Diarios de facturación" - -#. module: sale -#: field:sale.advance.payment.inv,product_id:0 -msgid "Advance Product" -msgstr "Producto avanzado" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,shipped_qty_1:0 -msgid "Shipped Qty" -msgstr "Ctdad enviada" - -#. module: sale -#: view:sale.open.invoice:0 -msgid "You invoice has been successfully created!" -msgstr "¡La factura ha sido creada correctamente!" - -#. module: sale -#: code:addons/sale/sale.py:585 -#, python-format -msgid "You must first cancel all invoices attached to this sales order." -msgstr "Primero debe cancelar todas las facturas relacionadas con este pedido de venta." - -#. module: sale -#: selection:sale.report,month:0 -msgid "January" -msgstr "Enero" - -#. module: sale -#: view:sale.installer:0 -msgid "Configure Your Sales Management Application" -msgstr "Configurar su aplicación de gestión de ventas" - -#. module: sale -#: model:ir.actions.act_window,name:sale.action_order_tree4 -msgid "Sales Order in Progress" -msgstr "Pedidos de ventas en proceso" - -#. module: sale -#: field:sale.installer,sale_layout:0 -msgid "Sales Order Layout Improvement" -msgstr "Mejora plantilla pedido de venta" - -#. module: sale -#: code:addons/sale/wizard/sale_make_invoice_advance.py:63 -#, python-format -msgid "Error" -msgstr "Error" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,delay:0 -msgid "Commitment Delay" -msgstr "Retraso realización" - -#. module: sale -#: model:process.node,note:sale.process_node_saleprocurement0 -msgid "One Procurement order for each sales order line and for each of the components." -msgstr "Una orden de abastecimiento para cada línea del pedido de venta y para cada uno de los componentes." - -#. module: sale -#: model:process.transition.action,name:sale.process_transition_action_assign0 -msgid "Assign" -msgstr "Asignar" - -#. module: sale -#: field:sale.report,date:0 -msgid "Date Order" -msgstr "Fecha pedido" - -#. module: sale -#: model:process.node,note:sale.process_node_order0 -msgid "Confirmed sales order to invoice." -msgstr "Pedido de venta confirmado a factura." - -#. module: sale -#: code:addons/sale/sale.py:290 -#, python-format -msgid "Cannot delete Sales Order(s) which are already confirmed !" -msgstr "¡No se puede eliminar pedido(s) de venta que ya está confirmado!" - -#. module: sale -#: code:addons/sale/sale.py:316 -#, python-format -msgid "The sales order '%s' has been set in draft state." -msgstr "El pedido de venta '%s' ha sido cambiado a estado borrador." - -#. module: sale -#: selection:sale.order.line,type:0 -msgid "from stock" -msgstr "desde stock" - -#. module: sale -#: field:sale.config.picking_policy,order_policy:0 -msgid "Shipping Default Policy" -msgstr "Política de envío por defecto" - -#. module: sale -#: view:sale.open.invoice:0 -msgid "Close" -msgstr "Cerrar" - -#. module: sale -#: field:sale.order,shipped:0 -msgid "Delivered" -msgstr "Entregado" - -#. module: sale -#: code:addons/sale/sale.py:1115 -#, python-format -msgid "Not enough stock !" -msgstr "¡No hay stock suficiente!" - -#. module: sale -#: constraint:stock.move:0 -msgid "You must assign a production lot for this product" -msgstr "Debe asignar un lote de producción para este producto" - -#. module: sale -#: field:sale.order.line,sequence:0 -msgid "Layout Sequence" -msgstr "Secuencia plantilla" - -#. module: sale -#: model:ir.actions.act_window,help:sale.action_shop_form -msgid "If you have more than one shop reselling your company products, you can create and manage that from here. Whenever you will record a new quotation or sales order, it has to be linked to a shop. The shop also defines the warehouse from which the products will be delivered for each particular sales." -msgstr "Si tiene más de una tienda donde vende los productos de su compañía, puede crearlas y gestionarlas desde aquí. Cada vez que codifique un nuevo presupuesto o pedido de venta, debe estar vinculado a una tienda. La tienda también define desde que almacén serán entregados los productos para cada venta." - -#. module: sale -#: help:sale.order,invoiced:0 -msgid "It indicates that an invoice has been paid." -msgstr "Indica que una factura ha sido pagada." - -#. module: sale -#: report:sale.order:0 -#: field:sale.order.line,name:0 -msgid "Description" -msgstr "Descripción" - -#. module: sale -#: selection:sale.report,month:0 -msgid "May" -msgstr "Mayo" - -#. module: sale -#: help:sale.installer,sale_order_dates:0 -msgid "Adds commitment, requested and effective dates on Sales Orders." -msgstr "Añade fechas de realización, solicitud y efectivo en pedidos de venta." - -#. module: sale -#: view:sale.order:0 -#: field:sale.order,partner_id:0 -#: field:sale.order.line,order_partner_id:0 -msgid "Customer" -msgstr "Cliente" - -#. module: sale -#: selection:sale.report,month:0 -msgid "February" -msgstr "Febrero" - -#. module: sale -#: help:sale.installer,sale_journal:0 -msgid "Allows you to group and invoice your delivery orders according to different invoicing types: daily, weekly, etc." -msgstr "Permite agrupar y facturar sus ordenes de acuerdo a diferentes tipos de facturación: diaria, semanal, etc." - -#. module: sale -#: selection:sale.report,month:0 -msgid "April" -msgstr "Abril" - -#. module: sale -#: view:sale.shop:0 -msgid "Accounting" -msgstr "Contabilidad" - -#. module: sale -#: field:sale.config.picking_policy,step:0 -msgid "Steps To Deliver a Sales Order" -msgstr "Pasos para entregar un pedido de venta" - -#. module: sale -#: view:sale.order:0 -#: view:sale.order.line:0 -msgid "Search Sales Order" -msgstr "Buscar pedido de venta" - -#. module: sale -#: model:process.node,name:sale.process_node_saleorderprocurement0 -msgid "Sales Order Requisition" -msgstr "Solicitud pedido de venta" - -#. module: sale -#: report:sale.order:0 -#: field:sale.order,payment_term:0 -msgid "Payment Term" -msgstr "Plazo de pago" - -#. module: sale -#: help:sale.installer,sale_layout:0 -msgid "Provides some features to improve the layout of the Sales Order reports." -msgstr "Proporciona algunas funcionalidades para mejorar la plantilla de los informes de pedidos de ventas." - -#. module: sale -#: model:ir.actions.act_window,help:sale.action_order_report_all -msgid "This report performs analysis on your quotations and sales orders. Analysis check your sales revenues and sort it by different group criteria (salesman, partner, product, etc.) Use this report to perform analysis on sales not having invoiced yet. If you want to analyse your turnover, you should use the Invoice Analysis report in the Accounting application." -msgstr "Este informe realiza un análisis de sus presupuestos y pedidos de venta. El análisis verifica los ingresos de sus ventas y las ordena por diferentes grupos de criterios (comercial, empresa, producto, etc.). Utilice este informe para realizar un análisis sobre sus ventas todavía no facturadas. Si desea analizar sus ingresos, debería utilizar el informe de análisis de facturas en la aplicación de Contabilidad." - -#. module: sale -#: report:sale.order:0 -msgid "Quotation N°" -msgstr "Presupuesto Nº" - -#. module: sale -#: field:sale.order,picked_rate:0 -#: view:sale.report:0 -msgid "Picked" -msgstr "Enviada" - -#. module: sale -#: view:sale.report:0 -#: field:sale.report,year:0 -msgid "Year" -msgstr "Año" - -#. module: sale -#: selection:sale.config.picking_policy,order_policy:0 -msgid "Invoice Based on Deliveries" -msgstr "Facturar basado en las entregas" - diff --git a/addons/sale_crm/i18n/es_MX.po.moved b/addons/sale_crm/i18n/es_MX.po.moved deleted file mode 100644 index e834f299d4e..00000000000 --- a/addons/sale_crm/i18n/es_MX.po.moved +++ /dev/null @@ -1,167 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * sale_crm -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-05 15:46+0000\n" -"PO-Revision-Date: 2011-07-05 15:46+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: sale_crm -#: field:crm.make.sale,partner_id:0 -msgid "Customer" -msgstr "Cliente" - -#. module: sale_crm -#: view:crm.make.sale:0 -msgid "Convert to Quotation" -msgstr "Convertir a presupuesto" - -#. module: sale_crm -#: code:addons/sale_crm/wizard/crm_make_sale.py:108 -#, python-format -msgid "is converted to Quotation." -msgstr "se ha convertido a presupuesto." - -#. module: sale_crm -#: code:addons/sale_crm/wizard/crm_make_sale.py:89 -#, python-format -msgid "Data Insufficient!" -msgstr "¡Datos insuficientes!" - -#. module: sale_crm -#: code:addons/sale_crm/wizard/crm_make_sale.py:89 -#, python-format -msgid "Customer has no addresses defined!" -msgstr "¡El cliente no tiene definidas direcciones!" - -#. module: sale_crm -#: model:ir.model,name:sale_crm.model_crm_make_sale -msgid "Make sales" -msgstr "Crear ventas" - -#. module: sale_crm -#: model:ir.module.module,description:sale_crm.module_meta_information -msgid "\n" -"This module adds a shortcut on one or several opportunity cases in the CRM.\n" -"This shortcut allows you to generate a sales order based on the selected case.\n" -"If different cases are open (a list), it generates one sale order by\n" -"case.\n" -"The case is then closed and linked to the generated sales order.\n" -"\n" -"We suggest you to install this module if you installed both the sale and the\n" -"crm modules.\n" -" " -msgstr "\n" -"Este módulo añade un acceso directo a uno o varios casos de oportunidades en el CRM.\n" -"Este acceso directo le permite generar un pedido de venta a partir del caso seleccionado.\n" -"Si están abiertos distintos casos (una lista), genera un pedido de venta por\n" -"caso.\n" -"El caso se cierra y es enlazado al pedido ventas generado.\n" -"\n" -"Le sugerimos que instale este módulo si ha instalado ambos módulos sale y crm.\n" -" " - -#. module: sale_crm -#: view:crm.make.sale:0 -msgid "_Create" -msgstr "_Crear" - -#. module: sale_crm -#: sql_constraint:sale.order:0 -msgid "Order Reference must be unique !" -msgstr "¡La referencia del pedido debe ser única!" - -#. module: sale_crm -#: help:crm.make.sale,close:0 -msgid "Check this to close the opportunity after having created the sale order." -msgstr "Marque esta opción para cerrar la oportunidad después de haber creado el pedido de venta." - -#. module: sale_crm -#: view:crm.lead:0 -msgid "Convert to Quote" -msgstr "Convertir a presupuesto" - -#. module: sale_crm -#: view:account.invoice.report:0 -#: view:board.board:0 -msgid "Monthly Turnover" -msgstr "Volumen mensual" - -#. module: sale_crm -#: code:addons/sale_crm/wizard/crm_make_sale.py:110 -#, python-format -msgid "Converted to Sales Quotation(id: %s)." -msgstr "Convertido a presupuesto de venta (id: %s)." - -#. module: sale_crm -#: code:addons/sale_crm/wizard/crm_make_sale.py:108 -#, python-format -msgid "Opportunity " -msgstr "Oportunidad " - -#. module: sale_crm -#: code:addons/sale_crm/wizard/crm_make_sale.py:92 -#, python-format -msgid "Opportunity: %s" -msgstr "Oportunidad: %s" - -#. module: sale_crm -#: model:ir.module.module,shortdesc:sale_crm.module_meta_information -msgid "Creates Sales order from Opportunity" -msgstr "Crea pedido de venta desde oportunidad" - -#. module: sale_crm -#: model:ir.actions.act_window,name:sale_crm.action_quotation_for_sale_crm -msgid "Quotations" -msgstr "Presupuestos" - -#. module: sale_crm -#: field:crm.make.sale,shop_id:0 -msgid "Shop" -msgstr "Tienda" - -#. module: sale_crm -#: view:board.board:0 -msgid "Opportunities by Stage" -msgstr "Oportunidades por etapa" - -#. module: sale_crm -#: view:board.board:0 -msgid "My Quotations" -msgstr "Mis presupuestos" - -#. module: sale_crm -#: field:crm.make.sale,close:0 -msgid "Close Opportunity" -msgstr "Cerrar oportunidad" - -#. module: sale_crm -#: view:sale.order:0 -#: field:sale.order,section_id:0 -msgid "Sales Team" -msgstr "Equipo de ventas" - -#. module: sale_crm -#: model:ir.actions.act_window,name:sale_crm.action_crm_make_sale -msgid "Make Quotation" -msgstr "Realizar un presupuesto" - -#. module: sale_crm -#: view:crm.make.sale:0 -msgid "Cancel" -msgstr "Cancelar" - -#. module: sale_crm -#: model:ir.model,name:sale_crm.model_sale_order -msgid "Sales Order" -msgstr "Pedido de venta" - diff --git a/addons/sale_margin/i18n/es_MX.po.moved b/addons/sale_margin/i18n/es_MX.po.moved deleted file mode 100644 index ac02278b28a..00000000000 --- a/addons/sale_margin/i18n/es_MX.po.moved +++ /dev/null @@ -1,335 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * sale_margin -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-05 15:57+0000\n" -"PO-Revision-Date: 2011-07-05 15:57+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Category" -msgstr "Categoría" - -#. module: sale_margin -#: selection:report.account.invoice.product,type:0 -msgid "Customer Refund" -msgstr "Factura de abono de cliente" - -#. module: sale_margin -#: selection:report.account.invoice.product,type:0 -msgid "Customer Invoice" -msgstr "Factura de cliente" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "February" -msgstr "Febrero" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Current" -msgstr "Actual" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Group By..." -msgstr "Agrupar por..." - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: field:report.account.invoice.product,state:0 -msgid "State" -msgstr "Estado" - -#. module: sale_margin -#: model:ir.module.module,description:sale_margin.module_meta_information -msgid " \n" -" This module adds the 'Margin' on sales order,\n" -" which gives the profitability by calculating the difference between the Unit Price and Cost Price\n" -" " -msgstr " \n" -" Este módulo añade el 'Margen' en el pedido de venta,\n" -" que proporciona la rentabilidad calculando la diferencia entre el precio unidad y el precio de coste\n" -" " - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: selection:report.account.invoice.product,state:0 -msgid "Draft" -msgstr "Borrador" - -#. module: sale_margin -#: selection:report.account.invoice.product,state:0 -msgid "Paid" -msgstr "Pagado" - -#. module: sale_margin -#: model:ir.model,name:sale_margin.model_stock_picking -msgid "Picking List" -msgstr "Lista de Empaque" - -#. module: sale_margin -#: help:sale.order,margin:0 -msgid "It gives profitability by calculating the difference between the Unit Price and Cost Price." -msgstr "Proporciona la rentabilidad calculando la diferencia entre el precio unidad y el precio de coste." - -#. module: sale_margin -#: field:report.account.invoice.product,type:0 -msgid "Type" -msgstr "Tipo" - -#. module: sale_margin -#: model:ir.model,name:sale_margin.model_report_account_invoice_product -msgid "Invoice Statistics" -msgstr "Estadísticas de facturas" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: field:report.account.invoice.product,product_id:0 -msgid "Product" -msgstr "Producto" - -#. module: sale_margin -#: sql_constraint:sale.order:0 -msgid "Order Reference must be unique !" -msgstr "¡La referencia del pedido debe ser única!" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Invoice by Partner" -msgstr "Facturas por empresa" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "August" -msgstr "Agosto" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: selection:report.account.invoice.product,state:0 -msgid "Pro-forma" -msgstr "Pro-forma" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "May" -msgstr "Mayo" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "June" -msgstr "Junio" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Date Invoiced" -msgstr "Fecha de facturación" - -#. module: sale_margin -#: model:ir.module.module,shortdesc:sale_margin.module_meta_information -msgid "Margins in Sales Order" -msgstr "Márgenes en pedidos de venta" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Search Margin" -msgstr "Buscar margen" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "This Year" -msgstr "Este año" - -#. module: sale_margin -#: field:report.account.invoice.product,date:0 -msgid "Date" -msgstr "Fecha" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "July" -msgstr "Julio" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Extended Filters..." -msgstr "Filtros extendidos..." - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "This Month" -msgstr "Este Mes" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: field:report.account.invoice.product,day:0 -msgid "Day" -msgstr "Día" - -#. module: sale_margin -#: field:report.account.invoice.product,categ_id:0 -msgid "Categories" -msgstr "Categorias" - -#. module: sale_margin -#: field:account.invoice.line,cost_price:0 -#: field:report.account.invoice.product,cost_price:0 -#: field:sale.order.line,purchase_price:0 -msgid "Cost Price" -msgstr "Precio coste" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "October" -msgstr "Octubre" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "January" -msgstr "Enero" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: field:report.account.invoice.product,year:0 -msgid "Year" -msgstr "Año" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "September" -msgstr "Septiembre" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "April" -msgstr "Abril" - -#. module: sale_margin -#: field:report.account.invoice.product,amount:0 -msgid "Amount" -msgstr "Importe" - -#. module: sale_margin -#: selection:report.account.invoice.product,type:0 -msgid "Supplier Refund" -msgstr "Factura de abono de proveedor" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "March" -msgstr "Marzo" - -#. module: sale_margin -#: field:report.account.invoice.product,margin:0 -#: field:sale.order,margin:0 -#: field:sale.order.line,margin:0 -msgid "Margin" -msgstr "Margen" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "November" -msgstr "Noviembre" - -#. module: sale_margin -#: field:report.account.invoice.product,quantity:0 -msgid "Quantity" -msgstr "Cantidad" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Invoices by product" -msgstr "Facturas por producto" - -#. module: sale_margin -#: selection:report.account.invoice.product,type:0 -msgid "Supplier Invoice" -msgstr "Factura de proveedor" - -#. module: sale_margin -#: field:stock.picking,invoice_ids:0 -msgid "Invoices" -msgstr "Facturas" - -#. module: sale_margin -#: selection:report.account.invoice.product,month:0 -msgid "December" -msgstr "Diciembre" - -#. module: sale_margin -#: model:ir.model,name:sale_margin.model_account_invoice_line -msgid "Invoice Line" -msgstr "Línea de factura" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: field:report.account.invoice.product,month:0 -msgid "Month" -msgstr "Mes" - -#. module: sale_margin -#: selection:report.account.invoice.product,state:0 -msgid "Canceled" -msgstr "Cancelada" - -#. module: sale_margin -#: model:ir.actions.act_window,help:sale_margin.action_report_account_invoice_report -msgid "This report gives you an overview of all the invoices generated by the system. You can sort and group your results by specific selection criteria to quickly find what you are looking for." -msgstr "Este informe ofrece una visión general de todas las facturas generadas por el sistema. Puede ordenar y agrupar los resultados por criterios específicos de selección para encontrar rápidamente lo que busca." - -#. module: sale_margin -#: model:ir.ui.menu,name:sale_margin.menu_report_account_invoice_product -msgid "Invoice Report" -msgstr "Informe de factura" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -msgid "Done" -msgstr "Realizado" - -#. module: sale_margin -#: model:ir.ui.menu,name:sale_margin.menu_report_account_invoice_reoirt -msgid "Invoice" -msgstr "Factura" - -#. module: sale_margin -#: view:stock.picking:0 -msgid "Customer Invoices" -msgstr "Facturas de cliente" - -#. module: sale_margin -#: view:report.account.invoice.product:0 -#: field:report.account.invoice.product,partner_id:0 -msgid "Partner" -msgstr "Socio" - -#. module: sale_margin -#: model:ir.model,name:sale_margin.model_sale_order -msgid "Sales Order" -msgstr "Pedido de venta" - -#. module: sale_margin -#: selection:report.account.invoice.product,state:0 -msgid "Open" -msgstr "Abierta" - -#. module: sale_margin -#: model:ir.actions.act_window,name:sale_margin.action_report_account_invoice_report -msgid "Invoice Analysis" -msgstr "Análisis de facturas" - -#. module: sale_margin -#: model:ir.model,name:sale_margin.model_sale_order_line -msgid "Sales Order Line" -msgstr "Línea pedido de venta" - diff --git a/addons/sale_order_dates/i18n/es_MX.po.moved b/addons/sale_order_dates/i18n/es_MX.po.moved deleted file mode 100644 index b682cb925d7..00000000000 --- a/addons/sale_order_dates/i18n/es_MX.po.moved +++ /dev/null @@ -1,71 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * sale_order_dates -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-05 16:02+0000\n" -"PO-Revision-Date: 2011-07-05 16:02+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: sale_order_dates -#: sql_constraint:sale.order:0 -msgid "Order Reference must be unique !" -msgstr "¡La referencia del pedido debe ser única!" - -#. module: sale_order_dates -#: help:sale.order,requested_date:0 -msgid "Date on which customer has requested for sales." -msgstr "Fecha en que el cliente ha solicitado la venta." - -#. module: sale_order_dates -#: field:sale.order,commitment_date:0 -msgid "Commitment Date" -msgstr "Fecha compromiso" - -#. module: sale_order_dates -#: field:sale.order,effective_date:0 -msgid "Effective Date" -msgstr "Fecha efectiva" - -#. module: sale_order_dates -#: model:ir.module.module,shortdesc:sale_order_dates.module_meta_information -msgid "Sales Order Dates" -msgstr "Fechas en pedidos de venta" - -#. module: sale_order_dates -#: help:sale.order,effective_date:0 -msgid "Date on which picking is created." -msgstr "Fecha en que la orden ha sido creada." - -#. module: sale_order_dates -#: field:sale.order,requested_date:0 -msgid "Requested Date" -msgstr "Fecha solicitud" - -#. module: sale_order_dates -#: model:ir.model,name:sale_order_dates.model_sale_order -msgid "Sales Order" -msgstr "Pedido de venta" - -#. module: sale_order_dates -#: model:ir.module.module,description:sale_order_dates.module_meta_information -msgid "\n" -"Add commitment, requested and effective dates on the sales order.\n" -"" -msgstr "\n" -"Añade las fechas de compromiso, solicitada y efectiva en el pedido de venta.\n" -"" - -#. module: sale_order_dates -#: help:sale.order,commitment_date:0 -msgid "Date on which delivery of products is to be made." -msgstr "Fecha en que la entrega de productos se va a realizar." - diff --git a/addons/stock/i18n/es_MX.po.moved b/addons/stock/i18n/es_MX.po.moved deleted file mode 100644 index 419b2cb95f5..00000000000 --- a/addons/stock/i18n/es_MX.po.moved +++ /dev/null @@ -1,3696 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * stock -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 6.0.2\n" -"Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2011-07-05 16:05+0000\n" -"PO-Revision-Date: 2011-07-05 16:05+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: stock -#: field:product.product,track_outgoing:0 -msgid "Track Outgoing Lots" -msgstr "Lotes de seguimiento en salida" - -#. module: stock -#: model:ir.model,name:stock.model_stock_ups_upload -msgid "Stock ups upload" -msgstr "Stock ups carga" - -#. module: stock -#: code:addons/stock/product.py:76 -#, python-format -msgid "Variation Account is not specified for Product Category: %s" -msgstr "No se ha especificado la cuenta de variación para la categoría de producto: %s" - -#. module: stock -#: field:stock.location,chained_location_id:0 -msgid "Chained Location If Fixed" -msgstr "Ubicación encadenada si fija" - -#. module: stock -#: view:stock.inventory:0 -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Put in a new pack" -msgstr "Poner en un paquete nuevo" - -#. module: stock -#: field:stock.move.split.lines,action:0 -msgid "Action" -msgstr "Acción" - -#. module: stock -#: view:stock.production.lot:0 -msgid "Upstream Traceability" -msgstr "Trazabilidad hacia arriba" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_stock_line_date -#: model:ir.ui.menu,name:stock.menu_report_stock_line_date -msgid "Last Product Inventories" -msgstr "Último inventario de productos" - -#. module: stock -#: view:stock.move:0 -msgid "Today" -msgstr "Hoy" - -#. module: stock -#: field:stock.production.lot.revision,indice:0 -msgid "Revision Number" -msgstr "Número de revisión" - -#. module: stock -#: view:stock.move.memory.in:0 -#: view:stock.move.memory.out:0 -msgid "Product Moves" -msgstr "Movimientos de productos" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_stock_move_report -#: model:ir.ui.menu,name:stock.menu_action_stock_move_report -#: view:report.stock.move:0 -msgid "Moves Analysis" -msgstr "Análisis de movimientos" - -#. module: stock -#: help:stock.production.lot,ref:0 -msgid "Internal reference number in case it differs from the manufacturer's serial number" -msgstr "Número interno de referencia en caso de que sea diferente del número de serie del fabricante." - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_inventory_form -msgid "Periodical Inventories are used to count the number of products available per location. You can use it once a year when you do the general inventory or whenever you need it, to correct the current stock level of a product." -msgstr "Los inventarios periódicos se utilizan para contar el número de productos disponibles por ubicación. Lo puede utilizar una vez al año cuando realice el inventario general, o cuando lo necesite, para corregir el nivel actual de stock de un producto." - -#. module: stock -#: view:stock.picking:0 -msgid "Picking list" -msgstr "Lista de empaque" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -#: field:report.stock.inventory,product_qty:0 -#: field:report.stock.move,product_qty:0 -#: field:stock.change.product.qty,new_quantity:0 -#: field:stock.inventory.line,product_qty:0 -#: field:stock.inventory.line.split,qty:0 -#: report:stock.inventory.move:0 -#: field:stock.move,product_qty:0 -#: field:stock.move.consume,product_qty:0 -#: field:stock.move.memory.in,quantity:0 -#: field:stock.move.memory.out,quantity:0 -#: field:stock.move.scrap,product_qty:0 -#: field:stock.move.split,qty:0 -#: field:stock.move.split.lines,quantity:0 -#: field:stock.move.split.lines.exist,quantity:0 -#: report:stock.picking.list:0 -#: field:stock.report.prodlots,qty:0 -#: field:stock.report.tracklots,name:0 -#: field:stock.split.into,quantity:0 -msgid "Quantity" -msgstr "Cantidad" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_picking_tree -msgid "This is the list of all delivery orders that have to be prepared, according to your different sales orders and your logistics rules." -msgstr "Esta es la lista de ordenes de salida que deben ser preparados, en función de sus pedidos de venta y sus reglas logísticas." - -#. module: stock -#: view:report.stock.move:0 -#: field:report.stock.move,day:0 -msgid "Day" -msgstr "Día" - -#. module: stock -#: view:stock.inventory:0 -#: field:stock.inventory.line.split,product_uom:0 -#: view:stock.move:0 -#: field:stock.move.split,product_uom:0 -#: view:stock.picking:0 -#: view:stock.production.lot:0 -msgid "UoM" -msgstr "UdM" - -#. module: stock -#: field:product.category,property_stock_journal:0 -#: view:report.stock.move:0 -#: field:stock.change.standard.price,stock_journal:0 -msgid "Stock journal" -msgstr "Diario de inventario" - -#. module: stock -#: view:report.stock.move:0 -msgid "Incoming" -msgstr "Entrada" - -#. module: stock -#: help:product.category,property_stock_account_output_categ:0 -msgid "When doing real-time inventory valuation, counterpart Journal Items for all outgoing stock moves will be posted in this account. This is the default value for all products in this category, it can also directly be set on each product." -msgstr "Al hacer la valoración de inventario en tiempo real, la contrapartida de los asientos del diario para todos los movimientos de stock de salida se creará en esta cuenta. Este es el valor por defecto para todos los productos de esta categoría, también puede indicarse directamente en cada producto." - -#. module: stock -#: code:addons/stock/stock.py:1170 -#: code:addons/stock/stock.py:2412 -#, python-format -msgid "Missing partial picking data for move #%s" -msgstr "Faltan datos de la orden parcial para el movimiento #%s" - -#. module: stock -#: model:ir.actions.server,name:stock.action_partial_move_server -msgid "Deliver/Receive Products" -msgstr "Entrega/Recepcion de Productos" - -#. module: stock -#: code:addons/stock/report/report_stock.py:78 -#: code:addons/stock/report/report_stock.py:135 -#, python-format -msgid "You cannot delete any record!" -msgstr "¡No puede eliminar ningún registro!" - -#. module: stock -#: code:addons/stock/wizard/stock_splitinto.py:49 -#, python-format -msgid "The current move line is already assigned to a pack, please remove it first if you really want to change it ' # 'for this product: \"%s\" (id: %d)" -msgstr "La línea de movimiento actual ya está asignada a una orden, elimínela primero si realmente quiere cambiarla ' # 'para este este producto: \"%s\" (id: %d)" - -#. module: stock -#: selection:stock.picking,invoice_state:0 -msgid "Not Applicable" -msgstr "No aplicable" - -#. module: stock -#: help:stock.tracking,serial:0 -msgid "Other reference or serial number" -msgstr "Otra referencia o número de serie." - -#. module: stock -#: field:stock.move,origin:0 -#: view:stock.picking:0 -#: field:stock.picking,origin:0 -msgid "Origin" -msgstr "Origen" - -#. module: stock -#: view:report.stock.lines.date:0 -msgid "Non Inv" -msgstr "No factura" - -#. module: stock -#: view:stock.tracking:0 -msgid "Pack Identification" -msgstr "Identificación de paquete" - -#. module: stock -#: view:stock.move:0 -#: field:stock.move,picking_id:0 -#: field:stock.picking,name:0 -#: view:stock.production.lot:0 -msgid "Reference" -msgstr "Referencia" - -#. module: stock -#: code:addons/stock/stock.py:666 -#: code:addons/stock/stock.py:1472 -#, python-format -msgid "Products to Process" -msgstr "Productos a procesar" - -#. module: stock -#: constraint:product.category:0 -msgid "Error ! You can not create recursive categories." -msgstr "¡Error! No puede crear categorías recursivas." - -#. module: stock -#: help:stock.fill.inventory,set_stock_zero:0 -msgid "If checked, all product quantities will be set to zero to help ensure a real physical inventory is done" -msgstr "Si se marca, todas las cantidades de producto se ponen a cero para ayudar a realizar un inventario físico real." - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_split_lines -msgid "Split lines" -msgstr "Dividir líneas" - -#. module: stock -#: code:addons/stock/stock.py:1120 -#, python-format -msgid "You cannot cancel picking because stock move is in done state !" -msgstr "¡No puede cancelar la lista de empaque porqué el movimiento de stock está en estado realizado!" - -#. module: stock -#: code:addons/stock/stock.py:2230 -#: code:addons/stock/stock.py:2271 -#: code:addons/stock/stock.py:2331 -#, python-format -msgid "Warning!" -msgstr "¡Aviso!" - -#. module: stock -#: field:stock.invoice.onshipping,group:0 -msgid "Group by partner" -msgstr "Agrupar por empresa" - -#. module: stock -#: model:ir.model,name:stock.model_res_partner -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,partner_id:0 -#: view:report.stock.move:0 -#: field:report.stock.move,partner_id:0 -#: view:stock.move:0 -#: field:stock.move,partner_id:0 -#: view:stock.picking:0 -#: field:stock.picking,partner_id:0 -msgid "Partner" -msgstr "Empresa" - -#. module: stock -#: help:stock.move.memory.in,currency:0 -#: help:stock.move.memory.out,currency:0 -msgid "Currency in which Unit cost is expressed" -msgstr "Moneda en la que se expresa el coste unidad." - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:126 -#, python-format -msgid "No invoicing" -msgstr "No facturación" - -#. module: stock -#: help:stock.location,valuation_out_account_id:0 -msgid "This account will be used to value stock moves that have this location as source, instead of the stock input account from the product." -msgstr "Esta cuenta sera usada para valorar los movimientos de stock que tengan este lugar como origen, en lugar de la cuenta de stock de entrada del producto." - -#. module: stock -#: model:ir.model,name:stock.model_stock_production_lot -#: field:stock.production.lot.revision,lot_id:0 -#: field:stock.report.prodlots,prodlot_id:0 -msgid "Production lot" -msgstr "Lote de producción" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_stock_uom_categ_form_action -msgid "Units of Measure Categories" -msgstr "Categorías de unidades de medida" - -#. module: stock -#: help:stock.incoterms,code:0 -msgid "Code for Incoterms" -msgstr "Código para Incoterms" - -#. module: stock -#: field:stock.tracking,move_ids:0 -msgid "Moves for this pack" -msgstr "Movimientos para este paquete" - -#. module: stock -#: selection:report.stock.inventory,location_type:0 -#: selection:stock.location,usage:0 -msgid "Internal Location" -msgstr "Ubicación interna" - -#. module: stock -#: view:stock.inventory:0 -msgid "Confirm Inventory" -msgstr "Confirmar el inventario" - -#. module: stock -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,state:0 -#: view:report.stock.move:0 -#: field:report.stock.move,state:0 -#: view:stock.inventory:0 -#: field:stock.inventory,state:0 -#: field:stock.inventory.line,state:0 -#: view:stock.move:0 -#: field:stock.move,state:0 -#: view:stock.picking:0 -#: field:stock.picking,state:0 -#: report:stock.picking.list:0 -msgid "State" -msgstr "Estado" - -#. module: stock -#: view:stock.location:0 -msgid "Accounting Information" -msgstr "Informacion Contable" - -#. module: stock -#: field:stock.location,stock_real_value:0 -msgid "Real Stock Value" -msgstr "Valor stock real" - -#. module: stock -#: field:report.stock.move,day_diff2:0 -msgid "Lag (Days)" -msgstr "Retraso (días)" - -#. module: stock -#: model:ir.model,name:stock.model_action_traceability -msgid "Action traceability " -msgstr "Acción trazabilidad " - -#. module: stock -#: view:stock.move:0 -msgid "UOM" -msgstr "UdM" - -#. module: stock -#: selection:report.stock.inventory,state:0 -#: selection:report.stock.move,state:0 -#: view:stock.move:0 -#: selection:stock.move,state:0 -#: view:stock.picking:0 -#: selection:stock.picking,state:0 -#: view:stock.production.lot:0 -#: field:stock.production.lot,stock_available:0 -msgid "Available" -msgstr "Reservado" - -#. module: stock -#: view:stock.picking:0 -#: field:stock.picking,min_date:0 -msgid "Expected Date" -msgstr "Fecha prevista" - -#. module: stock -#: view:board.board:0 -#: model:ir.actions.act_window,name:stock.action_outgoing_product_board -msgid "Outgoing Product" -msgstr "Orden de salida" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_warehouse_form -msgid "Create and manage your warehouses and assign them a location from here" -msgstr "Cree y gestione sus almacenes y asígneles una ubicación desde aquí." - -#. module: stock -#: field:report.stock.move,product_qty_in:0 -msgid "In Qty" -msgstr "En cantidad" - -#. module: stock -#: code:addons/stock/wizard/stock_fill_inventory.py:115 -#, python-format -msgid "No product in this location." -msgstr "No hay producto en esta ubicación." - -#. module: stock -#: field:stock.warehouse,lot_output_id:0 -msgid "Location Output" -msgstr "Ubicación de salida" - -#. module: stock -#: model:ir.actions.act_window,name:stock.split_into -#: model:ir.model,name:stock.model_stock_split_into -msgid "Split into" -msgstr "Dividir en" - -#. module: stock -#: field:stock.move,price_currency_id:0 -msgid "Currency for average price" -msgstr "Moneda para precio promedio" - -#. module: stock -#: help:product.template,property_stock_account_input:0 -msgid "When doing real-time inventory valuation, counterpart Journal Items for all incoming stock moves will be posted in this account. If not set on the product, the one from the product category is used." -msgstr "Al hacer la valoración de inventario en tiempo real, la contrapartida de los asientos del diario para todos los movimientos de stock de entrada se creará en esta cuenta. Si no se indica en el producto, se utilizará la definida en la categoría del producto." - -#. module: stock -#: field:report.stock.inventory,location_type:0 -#: field:stock.location,usage:0 -msgid "Location Type" -msgstr "Tipo de ubicación" - -#. module: stock -#: help:report.stock.move,type:0 -#: help:stock.picking,type:0 -msgid "Shipping type specify, goods coming in or going out." -msgstr "Indica el tipo de envío, recepción o envío de mercancías." - -#. module: stock -#: model:ir.actions.report.xml,name:stock.report_move_labels -msgid "Item Labels" -msgstr "Etiquetas artículos" - -#. module: stock -#: model:ir.model,name:stock.model_report_stock_move -msgid "Moves Statistics" -msgstr "Estadísticas de movimientos" - -#. module: stock -#: view:stock.production.lot:0 -msgid "Product Lots Filter" -msgstr "Filtro lotes de producto" - -#. module: stock -#: code:addons/stock/stock.py:2615 -#, python-format -msgid "You can not cancel inventory which has any account move with posted state." -msgstr "No podra cancelar el inventario que tenga algun movimiento de cuenta con lo ultimo publicado." - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -#: report:stock.inventory.move:0 -#: report:stock.picking.list:0 -msgid "[" -msgstr "[" - -#. module: stock -#: help:stock.production.lot,stock_available:0 -msgid "Current quantity of products with this Production Lot Number available in company warehouses" -msgstr "Cantidad actual de productos con este número de lote de producción disponible en almacenes de la compañía." - -#. module: stock -#: field:stock.move,move_history_ids:0 -msgid "Move History (child moves)" -msgstr "Historial movimientos (movimientos hijos)" - -#. module: stock -#: code:addons/stock/stock.py:2015 -#, python-format -msgid "There is no stock output account defined for this product or its category: \"%s\" (id: %d)" -msgstr "No se ha definido una cuenta de salida de stock para este producto o su categoría: \"%s\" (id: %d)" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_picking_tree6 -#: model:ir.ui.menu,name:stock.menu_action_picking_tree6 -#: field:stock.picking,move_lines:0 -msgid "Internal Moves" -msgstr "Movimientos internos" - -#. module: stock -#: field:stock.move,location_dest_id:0 -msgid "Destination Location" -msgstr "Ubicación destino" - -#. module: stock -#: code:addons/stock/stock.py:754 -#, python-format -msgid "You can not process picking without stock moves" -msgstr "No puede procesar una orden sin movimientos de stock" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_product_packaging_stock_action -#: field:stock.move,product_packaging:0 -msgid "Packaging" -msgstr "Empaquetado" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Order(Origin)" -msgstr "Pedido (origen)" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -msgid "Grand Total:" -msgstr "Total:" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_out_picking_move -msgid "You will find in this list all products you have to deliver to your customers. You can process the deliveries directly from this list using the buttons on the right of each line. You can filter the products to deliver by customer, products or sale order (using the Origin field)." -msgstr "En esta lista encontrará todos los productos que ha de entregar a sus clientes. Puede procesar las entregas directamente desde esta lista usando los botones a la derecha de cada línea. Puede filtrar los productos a entregar por cliente, producto o pedido de venta (utilizando el campo origen)." - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_stock_inventory_control -msgid "Inventory Control" -msgstr "Control inventario" - -#. module: stock -#: view:stock.location:0 -#: field:stock.location,comment:0 -msgid "Additional Information" -msgstr "Información adicional" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -msgid "Location / Product" -msgstr "Ubicación / Producto" - -#. module: stock -#: code:addons/stock/stock.py:1303 -#, python-format -msgid "Reception" -msgstr "Recepción" - -#. module: stock -#: field:stock.tracking,serial:0 -msgid "Additional Reference" -msgstr "Referencia adicional" - -#. module: stock -#: view:stock.production.lot.revision:0 -msgid "Production Lot Revisions" -msgstr "Revisiones de lote de producción" - -#. module: stock -#: help:product.product,track_outgoing:0 -msgid "Forces to specify a Production Lot for all moves containing this product and going to a Customer Location" -msgstr "Fuerza a indicar un lote de producción para todos los movimientos que contienen este producto y van a una ubicación del cliente." - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_stock_journal_form -msgid "The stock journal system allows you to assign each stock operation to a specific journal according to the type of operation to perform or the worker/team that should perform the operation. Examples of stock journals may be: quality control, pick lists, packing, etc." -msgstr "El sistema de existencias diarias le permite asignar a cada operación de existencias a un diario específico según el tipo de operación a realizar por el trabajador/equipo que debe realizar la operación. Ejemplos de diarios de existencias pueden ser: control de calidad, listas de selección, embalaje, etc." - -#. module: stock -#: field:stock.location,complete_name:0 -#: field:stock.location,name:0 -msgid "Location Name" -msgstr "Nombre ubicación" - -#. module: stock -#: view:stock.inventory:0 -msgid "Posted Inventory" -msgstr "Inventario enviado" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Move Information" -msgstr "Información de movimiento" - -#. module: stock -#: view:report.stock.move:0 -msgid "Outgoing" -msgstr "Salida" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "August" -msgstr "Agosto" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_tracking_form -#: model:ir.model,name:stock.model_stock_tracking -#: model:ir.ui.menu,name:stock.menu_action_tracking_form -#: view:stock.tracking:0 -msgid "Packs" -msgstr "Paquetes" - -#. module: stock -#: constraint:stock.move:0 -msgid "You try to assign a lot which is not from the same product" -msgstr "Está intentando asignar un lote que no es del mismo producto" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_picking_tree4 -#: model:ir.ui.menu,name:stock.menu_action_picking_tree4 -#: view:stock.picking:0 -msgid "Incoming Shipments" -msgstr "Ordenes de entrada" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "June" -msgstr "Junio" - -#. module: stock -#: field:product.template,property_stock_procurement:0 -msgid "Procurement Location" -msgstr "Ubicación de abastecimiento" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_production_lot_form -#: model:ir.ui.menu,name:stock.menu_action_production_lot_form -#: field:stock.inventory.line.split,line_exist_ids:0 -#: field:stock.inventory.line.split,line_ids:0 -#: field:stock.move.split,line_exist_ids:0 -#: field:stock.move.split,line_ids:0 -msgid "Production Lots" -msgstr "Lotes de producción" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Recipient" -msgstr "Destinatario" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_location_tree -#: model:ir.ui.menu,name:stock.menu_action_location_tree -msgid "Location Structure" -msgstr "Estructura ubicaciones" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "October" -msgstr "Octubre" - -#. module: stock -#: model:ir.model,name:stock.model_stock_inventory_line -msgid "Inventory Line" -msgstr "Línea inventario" - -#. module: stock -#: help:product.category,property_stock_journal:0 -msgid "When doing real-time inventory valuation, this is the Accounting Journal in which entries will be automatically posted when stock moves are processed." -msgstr "Al hacer la valoración de inventario en tiempo real, este es el diario contable donde los asientos se crearán automáticamente cuando los movimientos de stock se procesen." - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_partial_picking -msgid "Process Picking" -msgstr "Procesar Lista de empaque" - -#. module: stock -#: code:addons/stock/product.py:355 -#, python-format -msgid "Future Receptions" -msgstr "Recepciones futuras" - -#. module: stock -#: help:stock.inventory.line.split,use_exist:0 -#: help:stock.move.split,use_exist:0 -msgid "Check this option to select existing lots in the list below, otherwise you should enter new ones line by line." -msgstr "Marque esta opción para seleccionar lotes existentes en la lista inferior, de lo contrario debe introducir otros de nuevos línea por la línea." - -#. module: stock -#: field:stock.move,move_dest_id:0 -msgid "Destination Move" -msgstr "Movimiento destino" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Process Now" -msgstr "Procesar ahora" - -#. module: stock -#: field:stock.location,address_id:0 -msgid "Location Address" -msgstr "Dirección ubicación" - -#. module: stock -#: code:addons/stock/stock.py:2382 -#, python-format -msgid "is consumed with" -msgstr "es consumido con" - -#. module: stock -#: help:stock.move,prodlot_id:0 -msgid "Production lot is used to put a serial number on the production" -msgstr "Lote de producción se utiliza para poner un número de serie a la producción." - -#. module: stock -#: field:stock.warehouse,lot_input_id:0 -msgid "Location Input" -msgstr "Ubicación de entrada" - -#. module: stock -#: help:stock.picking,date:0 -msgid "Date of Order" -msgstr "Fecha de la orden." - -#. module: stock -#: selection:product.product,valuation:0 -msgid "Periodical (manual)" -msgstr "Periódico (manual)" - -#. module: stock -#: model:stock.location,name:stock.location_procurement -msgid "Procurements" -msgstr "Abastecimientos" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_inventory_form_draft -msgid "Draft Physical Inventories" -msgstr "Inventarios físicos borrador" - -#. module: stock -#: selection:report.stock.inventory,location_type:0 -#: selection:stock.location,usage:0 -msgid "Transit Location for Inter-Companies Transfers" -msgstr "Ubicación de tránsito para transferencias inter-compañías" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_view_change_product_quantity -#: model:ir.model,name:stock.model_stock_change_product_qty -#: view:stock.change.product.qty:0 -msgid "Change Product Quantity" -msgstr "Cambiar cantidad producto" - -#. module: stock -#: model:ir.model,name:stock.model_stock_inventory_merge -msgid "Merge Inventory" -msgstr "Fusionar inventario" - -#. module: stock -#: code:addons/stock/product.py:371 -#, python-format -msgid "Future P&L" -msgstr "P&L futuras" - -#. module: stock -#: model:stock.location,name:stock.stock_location_company -msgid "Grupo Pessah Textil SA de CV" -msgstr "Grupo Pessah Textil SA de CV" - -#. module: stock -#: view:report.stock.inventory:0 -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Scrap" -msgstr "Desecho" - -#. module: stock -#: field:stock.location,child_ids:0 -msgid "Contains" -msgstr "Contiene" - -#. module: stock -#: view:board.board:0 -msgid "Incoming Products Delay" -msgstr "Retraso ordenes entrada" - -#. module: stock -#: code:addons/stock/product.py:377 -#, python-format -msgid "Future Qty" -msgstr "Ctdad futura" - -#. module: stock -#: view:stock.location:0 -msgid "Stock Locations" -msgstr "Ubicaciones stock" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -#: field:stock.move,price_unit:0 -msgid "Unit Price" -msgstr "Precio un." - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_split_lines_exist -msgid "Exist Split lines" -msgstr "Dividir líneas existentes" - -#. module: stock -#: field:stock.move,date_expected:0 -msgid "Scheduled Date" -msgstr "Fecha prevista" - -#. module: stock -#: view:stock.tracking:0 -msgid "Pack Search" -msgstr "Buscar paquete" - -#. module: stock -#: selection:stock.move,priority:0 -msgid "Urgent" -msgstr "Urgente" - -#. module: stock -#: view:stock.picking:0 -#: report:stock.picking.list:0 -msgid "Journal" -msgstr "Diario" - -#. module: stock -#: help:stock.picking,location_id:0 -msgid "Keep empty if you produce at the location where the finished products are needed.Set a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations." -msgstr "Déjelo vacío si produce en la ubicación donde los productos terminados son necesarios. Indique un lugar si produce en una ubicación fija. Esto puede ser una ubicación de empresa si subcontrata las operaciones de fabricación." - -#. module: stock -#: view:res.partner:0 -msgid "Inventory Properties" -msgstr "Propiedades inventario" - -#. module: stock -#: field:report.stock.move,day_diff:0 -msgid "Execution Lead Time (Days)" -msgstr "Tiempo inicial de ejecución (días)" - -#. module: stock -#: model:ir.actions.act_window,name:stock.act_stock_product_location_open -msgid "Stock by Location" -msgstr "Existencias por ubicacion" - -#. module: stock -#: help:stock.move,address_id:0 -msgid "Optional address where goods are to be delivered, specifically used for allotment" -msgstr "Dirección opcional cuando las mercancías deben ser entregadas, utilizado específicamente para lotes." - -#. module: stock -#: view:report.stock.move:0 -msgid "Month-1" -msgstr "Mes-1" - -#. module: stock -#: help:stock.location,active:0 -msgid "By unchecking the active field, you may hide a location without deleting it." -msgstr "Si el campo activo se desmarca, permite ocultar la ubicación sin eliminarla." - -#. module: stock -#: model:ir.actions.report.xml,name:stock.report_picking_list -msgid "Packing list" -msgstr "Packing List" - -#. module: stock -#: field:stock.location,stock_virtual:0 -msgid "Virtual Stock" -msgstr "Stock virtual" - -#. module: stock -#: selection:report.stock.inventory,location_type:0 -#: selection:stock.location,usage:0 -msgid "View" -msgstr "Vista" - -#. module: stock -#: field:stock.location,parent_left:0 -msgid "Left Parent" -msgstr "Padre izquierdo" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:132 -#, python-format -msgid "Delivery Information" -msgstr "Información de envío" - -#. module: stock -#: code:addons/stock/wizard/stock_fill_inventory.py:48 -#, python-format -msgid "Stock Inventory is done" -msgstr "Inventario de stock realizado" - -#. module: stock -#: constraint:product.product:0 -msgid "Error: Invalid ean code" -msgstr "Error: Código EAN erróneo" - -#. module: stock -#: code:addons/stock/product.py:148 -#, python-format -msgid "There is no stock output account defined for this product: \"%s\" (id: %d)" -msgstr "No se ha definido una cuenta de salida de stock para este producto: \"%s\" (id: %d)" - -#. module: stock -#: field:product.template,property_stock_production:0 -msgid "Production Location" -msgstr "Ubicación de producción" - -#. module: stock -#: help:stock.picking,address_id:0 -msgid "Address of partner" -msgstr "Dirección de la empresa." - -#. module: stock -#: field:report.stock.lines.date,date:0 -msgid "Latest Inventory Date" -msgstr "Fecha último inventario" - -#. module: stock -#: help:stock.location,usage:0 -msgid "* Supplier Location: Virtual location representing the source location for products coming from your suppliers\n" -" \n" -"* View: Virtual location used to create a hierarchical structures for your warehouse, aggregating its child locations ; can't directly contain products\n" -" \n" -"* Internal Location: Physical locations inside your own warehouses,\n" -" \n" -"* Customer Location: Virtual location representing the destination location for products sent to your customers\n" -" \n" -"* Inventory: Virtual location serving as counterpart for inventory operations used to correct stock levels (Physical inventories)\n" -" \n" -"* Procurement: Virtual location serving as temporary counterpart for procurement operations when the source (supplier or production) is not known yet. This location should be empty when the procurement scheduler has finished running.\n" -" \n" -"* Production: Virtual counterpart location for production operations: this location consumes the raw material and produces finished products\n" -" " -msgstr "* Ubicación proveedor: Ubicación virtual que representa la ubicación de origen para los productos procedentes de sus proveedores.\n" -"\n" -"* Vista: Ubicación virtual para crear una estructura jerárquica de su almacén, agregando sus ubicaciones hijas. No puede contener los productos directamente.\n" -"\n" -"* Ubicación interna: Ubicación física dentro de su propios almacenes.\n" -"\n" -"* Ubicación cliente: Ubicación virtual que representa la ubicación de destino para los productos enviados a sus clientes.\n" -"\n" -"* Inventario: Ubicación virtual que actúa como contrapartida de las operaciones de inventario utilizadas para corregir los niveles de existencias (inventarios físicos).\n" -"\n" -"* Abastecimiento: Ubicación virtual que actúa como contrapartida temporal de las operaciones de abastecimiento cuando el origen (proveedor o producción) no se conoce todavía. Esta ubicación debe estar vacía cuando el planificador de abastecimientos haya terminado de ejecutarse.\n" -"\n" -"* Producción: Ubicación virtual de contrapartida para operaciones de producción: esta ubicación consume la materia prima y produce los productos terminados.\n" -" " - -#. module: stock -#: field:stock.production.lot.revision,author_id:0 -msgid "Author" -msgstr "Autor" - -#. module: stock -#: code:addons/stock/stock.py:1302 -#, python-format -msgid "Delivery Order" -msgstr "Orden de salida" - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_memory_in -msgid "stock.move.memory.in" -msgstr "stock.movimiento.memoria.entrada" - -#. module: stock -#: selection:stock.location,chained_auto_packing:0 -msgid "Manual Operation" -msgstr "Operación manual" - -#. module: stock -#: view:stock.location:0 -#: view:stock.move:0 -msgid "Supplier" -msgstr "Proveedor" - -#. module: stock -#: field:stock.picking,date_done:0 -msgid "Date Done" -msgstr "Fecha realizado" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Expected Shipping Date" -msgstr "Fecha de envío prevista" - -#. module: stock -#: selection:stock.move,state:0 -msgid "Not Available" -msgstr "No disponible" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "March" -msgstr "Marzo" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_view_stock_inventory_line_split -#: model:ir.model,name:stock.model_stock_inventory_line_split -#: view:stock.inventory:0 -#: view:stock.inventory.line:0 -msgid "Split inventory lines" -msgstr "Dividir líneas de inventario" - -#. module: stock -#: view:stock.inventory:0 -msgid "Physical Inventory" -msgstr "Inventario físico" - -#. module: stock -#: help:stock.location,chained_company_id:0 -msgid "The company the Picking List containing the chained move will belong to (leave empty to use the default company determination rules" -msgstr "La compañía a la que pertenece la orden que contiene el movimiento encadenado (dejarlo vacío para utilizar las reglas por defecto para determinar la compañía)." - -#. module: stock -#: help:stock.location,chained_picking_type:0 -msgid "Shipping Type of the Picking List that will contain the chained move (leave empty to automatically detect the type based on the source and destination locations)." -msgstr "Tipo de envío de la orden que va a contener el movimiento encadenado (dejar vacío para detectar automáticamente el tipo basado en las ubicaciones de origen y destino)." - -#. module: stock -#: view:stock.move.split:0 -msgid "Lot number" -msgstr "Número de lote" - -#. module: stock -#: field:stock.inventory.line,product_uom:0 -#: field:stock.move.consume,product_uom:0 -#: field:stock.move.scrap,product_uom:0 -msgid "Product UOM" -msgstr "UdM del producto" - -#. module: stock -#: model:stock.location,name:stock.stock_location_locations_partner -msgid "Partner Locations" -msgstr "Ubicaciones de empresas" - -#. module: stock -#: view:report.stock.inventory:0 -#: view:report.stock.move:0 -msgid "Total quantity" -msgstr "Cantidad total" - -#. module: stock -#: model:ir.actions.act_window,name:stock.move_consume -#: view:stock.move.consume:0 -msgid "Consume Move" -msgstr "Movimiento consumo" - -#. module: stock -#: model:stock.location,name:stock.stock_location_suppliers -msgid "Suppliers" -msgstr "Proveedores" - -#. module: stock -#: help:stock.location,chained_delay:0 -msgid "Delay between original move and chained move in days" -msgstr "Retraso entre movimiento original y movimiento encadenado en días." - -#. module: stock -#: view:stock.fill.inventory:0 -msgid "Import current product inventory from the following location" -msgstr "Importar inventario de productos actual para la siguiente ubicación" - -#. module: stock -#: help:stock.location,chained_auto_packing:0 -msgid "This is used only if you select a chained location type.\n" -"The 'Automatic Move' value will create a stock move after the current one that will be validated automatically. With 'Manual Operation', the stock move has to be validated by a worker. With 'Automatic No Step Added', the location is replaced in the original move." -msgstr "Se utiliza sólo si selecciona un tipo de ubicación encadenada.\n" -"La opción 'Movimiento automático' creará un movimiento de stock después del actual que se validará automáticamente. Con 'Operación manual', el movimiento de stock debe ser validado por un trabajador. Con 'Mov. automático, paso no añadido', la ubicación se reemplaza en el movimiento original." - -#. module: stock -#: view:stock.production.lot:0 -msgid "Downstream Traceability" -msgstr "Trazabilidad hacia abajo" - -#. module: stock -#: help:product.template,property_stock_production:0 -msgid "For the current product, this stock location will be used, instead of the default one, as the source location for stock moves generated by production orders" -msgstr "Para los productos actuales, esta ubicación de stock se utilizará, en lugar de la de por defecto, como la ubicación de origen para los movimientos de stock generados por las órdenes de producción." - -#. module: stock -#: code:addons/stock/stock.py:2006 -#, python-format -msgid "Can not create Journal Entry, Output Account defined on this product and Variant account on category of this product are same." -msgstr "No se puede crear el asiento, la cuenta de salida definida en este producto y la cuenta variante de la categoría de producto son la misma." - -#. module: stock -#: code:addons/stock/stock.py:1319 -#, python-format -msgid "is in draft state." -msgstr "está en estado borrador." - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_tracking_form -msgid "This is the list of all your packs. When you select a Pack, you can get the upstream or downstream traceability of the products contained in the pack." -msgstr "Esta es la lista de todas sus ordenes. Cuando selecciona una orden, puede obtener la trazabilidad hacia arriba o hacia abajo de los productos que forman este paquete." - -#. module: stock -#: model:ir.model,name:stock.model_stock_ups_final -msgid "Stock ups final" -msgstr "Stock ups final" - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:126 -#, python-format -msgid "To be refunded/invoiced" -msgstr "Para ser abonado/facturado" - -#. module: stock -#: code:addons/stock/stock.py:2207 -#, python-format -msgid "You can only delete draft moves." -msgstr "Sólo puede eliminar movimientos borrador." - -#. module: stock -#: view:stock.change.product.qty:0 -#: view:stock.change.standard.price:0 -#: view:stock.fill.inventory:0 -#: view:stock.inventory.merge:0 -#: view:stock.invoice.onshipping:0 -#: view:stock.location.product:0 -#: view:stock.move:0 -#: view:stock.move.track:0 -#: view:stock.picking:0 -#: view:stock.split.into:0 -msgid "_Cancel" -msgstr "_Cancelar" - -#. module: stock -#: view:stock.move:0 -msgid "Ready" -msgstr "Preparado" - -#. module: stock -#: view:stock.picking:0 -msgid "Calendar View" -msgstr "Vista calendario" - -#. module: stock -#: view:stock.picking:0 -msgid "Additional Info" -msgstr "Información adicional" - -#. module: stock -#: code:addons/stock/stock.py:1619 -#, python-format -msgid "Operation forbidden" -msgstr "Operación prohibida" - -#. module: stock -#: field:stock.location.product,from_date:0 -msgid "From" -msgstr "Desde" - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:77 -#, python-format -msgid "You may only return pickings that are Confirmed, Available or Done!" -msgstr "¡Sólo puede devolver ordenes que estén confirmadas, reservadas o realizadas!" - -#. module: stock -#: view:stock.picking:0 -#: field:stock.picking,invoice_state:0 -msgid "Invoice Control" -msgstr "Control factura" - -#. module: stock -#: model:ir.model,name:stock.model_stock_production_lot_revision -msgid "Production lot revisions" -msgstr "Revisiones de lote de producción" - -#. module: stock -#: view:stock.picking:0 -msgid "Internal Picking List" -msgstr "Lista de empaque interno" - -#. module: stock -#: selection:report.stock.inventory,state:0 -#: selection:report.stock.move,state:0 -#: selection:stock.move,state:0 -#: selection:stock.picking,state:0 -msgid "Waiting" -msgstr "En espera" - -#. module: stock -#: view:stock.move:0 -#: selection:stock.move.split.lines,action:0 -#: view:stock.picking:0 -msgid "Split" -msgstr "Dividir" - -#. module: stock -#: view:stock.picking:0 -msgid "Search Stock Picking" -msgstr "Buscar empaque stock" - -#. module: stock -#: code:addons/stock/product.py:93 -#, python-format -msgid "Company is not specified in Location" -msgstr "No se ha especificado una compañía en la ubicación" - -#. module: stock -#: view:report.stock.move:0 -#: field:stock.partial.move,type:0 -msgid "Type" -msgstr "Tipo" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Picking List:" -msgstr "Lista de empaque:" - -#. module: stock -#: field:stock.inventory,date:0 -#: field:stock.move,create_date:0 -#: field:stock.production.lot,date:0 -#: field:stock.tracking,date:0 -msgid "Creation Date" -msgstr "Fecha creación" - -#. module: stock -#: field:report.stock.lines.date,id:0 -msgid "Inventory Line Id" -msgstr "Id línea de inventario" - -#. module: stock -#: help:stock.location,address_id:0 -msgid "Address of customer or supplier." -msgstr "Dirección del cliente o proveedor." - -#. module: stock -#: view:report.stock.move:0 -#: field:report.stock.move,picking_id:0 -msgid "Packing" -msgstr "Empaque" - -#. module: stock -#: selection:report.stock.inventory,location_type:0 -#: field:res.partner,property_stock_customer:0 -#: selection:stock.location,usage:0 -msgid "Customer Location" -msgstr "Ubicación del cliente" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:85 -#, python-format -msgid "Invalid action !" -msgstr "¡Acción no válida!" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:139 -#, python-format -msgid "Receive Information" -msgstr "Información de recepción" - -#. module: stock -#: model:ir.actions.report.xml,name:stock.report_location_overview -#: report:lot.stock.overview:0 -msgid "Location Inventory Overview" -msgstr "Resumen inventario ubicación" - -#. module: stock -#: model:ir.model,name:stock.model_stock_replacement -msgid "Stock Replacement" -msgstr "Reemplazo stock" - -#. module: stock -#: view:stock.inventory:0 -msgid "General Informations" -msgstr "Información general" - -#. module: stock -#: selection:stock.location,chained_location_type:0 -msgid "None" -msgstr "Ninguno" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action3 -#: view:stock.tracking:0 -msgid "Downstream traceability" -msgstr "Trazabilidad hacia abajo" - -#. module: stock -#: code:addons/stock/wizard/stock_invoice_onshipping.py:101 -#, python-format -msgid "No Invoices were created" -msgstr "No se han creado facturas" - -#. module: stock -#: field:stock.location,posy:0 -msgid "Shelves (Y)" -msgstr "Estantería (Y)" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:140 -#, python-format -msgid "Receive" -msgstr "Recibir" - -#. module: stock -#: help:stock.incoterms,active:0 -msgid "By unchecking the active field, you may hide an INCOTERM without deleting it." -msgstr "Si el campo activo se desmarca, permite ocultar un INCOTERM sin eliminarlo." - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -#: field:stock.picking,date:0 -msgid "Order Date" -msgstr "Fecha orden" - -#. module: stock -#: field:stock.location,location_id:0 -msgid "Parent Location" -msgstr "Ubicación padre" - -#. module: stock -#: help:stock.picking,state:0 -msgid "* Draft: not confirmed yet and will not be scheduled until confirmed\n" -"* Confirmed: still waiting for the availability of products\n" -"* Available: products reserved, simply waiting for confirmation.\n" -"* Waiting: waiting for another move to proceed before it becomes automatically available (e.g. in Make-To-Order flows)\n" -"* Done: has been processed, can't be modified or cancelled anymore\n" -"* Cancelled: has been cancelled, can't be confirmed anymore" -msgstr "* Borrador: No se ha confirmado todavía y no se planificará hasta que se confirme.\n" -"* Confirmado: A la espera de la disponibilidad de productos.\n" -"* Reservado: Productos reservados, esperando la confirmación del envío.\n" -"* En espera: Esperando que otro movimiento se realice antes de que sea disponible de forma automática (por ejemplo, en flujos Obtener_bajo_pedido).\n" -"* Realizado: Ha sido procesado, no se puede modificar o cancelar nunca más.\n" -"* Cancelado: Se ha cancelado, no se puede confirmar nunca más." - -#. module: stock -#: help:stock.location,company_id:0 -msgid "Let this field empty if this location is shared between all companies" -msgstr "Deje este campo vacío si esta ubicación está compartida entre todas las compañías." - -#. module: stock -#: code:addons/stock/stock.py:2230 -#, python-format -msgid "Please provide a positive quantity to scrap!" -msgstr "¡Introduzca una cantidad positiva a desechar!" - -#. module: stock -#: field:stock.location,chained_delay:0 -msgid "Chaining Lead Time" -msgstr "Tiempo inicial encadenado" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:85 -#, python-format -msgid "Cannot deliver products which are already delivered !" -msgstr "¡No se pueden enviar productos que ya están enviados!" - -#. module: stock -#: model:ir.model,name:stock.model_stock_invoice_onshipping -msgid "Stock Invoice Onshipping" -msgstr "Stock factura en el envío" - -#. module: stock -#: help:stock.move,state:0 -msgid "When the stock move is created it is in the 'Draft' state.\n" -" After that, it is set to 'Not Available' state if the scheduler did not find the products.\n" -" When products are reserved it is set to 'Available'.\n" -" When the picking is done the state is 'Done'. \n" -"The state is 'Waiting' if the move is waiting for another one." -msgstr "Cuando se crea un movimiento de stock está en estado 'Borrador'.\n" -" Después se establece en estado 'No disponible' si el planificador no ha encontrado los productos.\n" -" Cuando los productos están reservados se establece como 'Reservado'.\n" -" Cuando la orden se envía el estado es 'Realizado'. \n" -"El estado es 'En espera' si el movimiento está a la espera de otro." - -#. module: stock -#: selection:report.stock.inventory,location_type:0 -#: field:res.partner,property_stock_supplier:0 -#: selection:stock.location,usage:0 -msgid "Supplier Location" -msgstr "Ubicación del proveedor" - -#. module: stock -#: code:addons/stock/stock.py:2251 -#, python-format -msgid "were scrapped" -msgstr "estaban desechados" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Partial" -msgstr "Parcial" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "September" -msgstr "Septiembre" - -#. module: stock -#: help:stock.picking,backorder_id:0 -msgid "If this picking was split this field links to the picking that contains the other part that has been processed already." -msgstr "Si este empaque se dividió, este campo enlaza con el empaque que contiene la otra parte que ya ha sido procesada." - -#. module: stock -#: model:ir.model,name:stock.model_report_stock_inventory -msgid "Stock Statistics" -msgstr "Estadísticas de stock" - -#. module: stock -#: field:stock.move.memory.in,currency:0 -#: field:stock.move.memory.out,currency:0 -msgid "Currency" -msgstr "Moneda" - -#. module: stock -#: field:product.product,track_production:0 -msgid "Track Manufacturing Lots" -msgstr "Lotes seguimiento de fabricación" - -#. module: stock -#: code:addons/stock/wizard/stock_inventory_merge.py:44 -#, python-format -msgid "Please select multiple physical inventories to merge in the list view." -msgstr "Seleccione varios inventarios físicos para fusionar en la vista lista." - -#. module: stock -#: model:ir.actions.act_window,name:stock.act_product_stock_move_open -#: model:ir.actions.act_window,name:stock.action_move_form2 -#: model:ir.ui.menu,name:stock.menu_action_move_form2 -#: view:stock.inventory:0 -#: view:stock.move:0 -#: view:stock.picking:0 -#: view:stock.production.lot:0 -#: view:stock.tracking:0 -msgid "Stock Moves" -msgstr "Movimientos de stock" - -#. module: stock -#: selection:report.stock.move,type:0 -#: selection:stock.location,chained_picking_type:0 -#: selection:stock.picking,type:0 -msgid "Sending Goods" -msgstr "Envío de mercancías" - -#. module: stock -#: view:stock.picking:0 -msgid "Cancel Availability" -msgstr "Cancelar disponibilidad" - -#. module: stock -#: help:stock.move,date_expected:0 -msgid "Scheduled date for the processing of this move" -msgstr "Fecha planificada para el procesado de este movimiento." - -#. module: stock -#: field:stock.inventory,move_ids:0 -msgid "Created Moves" -msgstr "Movimientos creados" - -#. module: stock -#: field:stock.report.tracklots,tracking_id:0 -msgid "Tracking lot" -msgstr "Lote seguimiento" - -#. module: stock -#: view:stock.picking:0 -msgid "Back Orders" -msgstr "Ordenes pendientes" - -#. module: stock -#: view:product.product:0 -#: view:product.template:0 -msgid "Counter-Part Locations Properties" -msgstr "Propiedades de las ubicaciones parte recíproca" - -#. module: stock -#: view:stock.location:0 -msgid "Localization" -msgstr "Ubicación" - -#. module: stock -#: model:ir.model,name:stock.model_stock_report_tracklots -msgid "Stock report by tracking lots" -msgstr "Informe de stock por lotes de seguimiento" - -#. module: stock -#: code:addons/stock/product.py:367 -#, python-format -msgid "Delivered Qty" -msgstr "Ctdad enviada" - -#. module: stock -#: model:ir.actions.act_window,name:stock.track_line -#: view:stock.inventory.line.split:0 -#: view:stock.move.split:0 -msgid "Split in lots" -msgstr "Dividir en lotes" - -#. module: stock -#: view:stock.move.split:0 -msgid "Production Lot Numbers" -msgstr "Números lote de producción" - -#. module: stock -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,date:0 -#: field:report.stock.move,date:0 -#: view:stock.inventory:0 -#: report:stock.inventory.move:0 -#: view:stock.move:0 -#: field:stock.move,date:0 -#: field:stock.partial.move,date:0 -#: field:stock.partial.picking,date:0 -#: view:stock.picking:0 -msgid "Date" -msgstr "Fecha" - -#. module: stock -#: view:report.stock.inventory:0 -#: view:report.stock.move:0 -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Extended Filters..." -msgstr "Filtros extendidos..." - -#. module: stock -#: field:stock.warehouse,lot_stock_id:0 -msgid "Location Stock" -msgstr "Ubicación stock" - -#. module: stock -#: code:addons/stock/wizard/stock_inventory_merge.py:64 -#, python-format -msgid "Merging is only allowed on draft inventories." -msgstr "La fusión sólo es permitida en inventarios borrador." - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_dashboard_stock -msgid "Dashboard" -msgstr "Tablero" - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_track -msgid "Track moves" -msgstr "Movimientos seguimiento" - -#. module: stock -#: field:stock.incoterms,code:0 -msgid "Code" -msgstr "Código" - -#. module: stock -#: view:stock.inventory.line.split:0 -msgid "Lots Number" -msgstr "Número lotes" - -#. module: stock -#: model:ir.actions.act_window,name:stock.open_board_warehouse -#: model:ir.ui.menu,name:stock.menu_board_warehouse -msgid "Warehouse Dashboard" -msgstr "Tablero almacén" - -#. module: stock -#: code:addons/stock/stock.py:512 -#, python-format -msgid "You can not remove a lot line !" -msgstr "¡No puede eliminar una línea de lote!" - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_scrap -#: view:stock.move:0 -#: view:stock.move.scrap:0 -#: view:stock.picking:0 -msgid "Scrap Products" -msgstr "Desechar productos" - -#. module: stock -#: code:addons/stock/stock.py:1128 -#, python-format -msgid "You cannot remove the picking which is in %s state !" -msgstr "¡No puede eliminar la orden que está en estado %s!" - -#. module: stock -#: view:stock.inventory.line.split:0 -#: view:stock.move.consume:0 -#: view:stock.move.scrap:0 -#: view:stock.move.split:0 -#: view:stock.picking:0 -msgid "Cancel" -msgstr "Cancelar" - -#. module: stock -#: model:ir.actions.act_window,name:stock.act_stock_return_picking -#: model:ir.model,name:stock.model_stock_return_picking -msgid "Return Picking" -msgstr "Devolver orden" - -#. module: stock -#: view:stock.inventory:0 -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Split in production lots" -msgstr "Dividir en lotes de producción" - -#. module: stock -#: model:ir.model,name:stock.model_stock_location -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,location_id:0 -#: field:stock.change.product.qty,location_id:0 -#: field:stock.fill.inventory,location_id:0 -#: field:stock.inventory.line,location_id:0 -#: report:stock.inventory.move:0 -#: view:stock.location:0 -#: view:stock.move:0 -#: field:stock.move.consume,location_id:0 -#: field:stock.move.scrap,location_id:0 -#: field:stock.picking,location_id:0 -#: report:stock.picking.list:0 -#: field:stock.report.prodlots,location_id:0 -#: field:stock.report.tracklots,location_id:0 -msgid "Location" -msgstr "Ubicación" - -#. module: stock -#: view:product.template:0 -msgid "Information" -msgstr "Información" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Shipping Address :" -msgstr "Dirección de envío:" - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:115 -#, python-format -msgid "Provide the quantities of the returned products." -msgstr "Indique las cantidades de los productos devueltos." - -#. module: stock -#: code:addons/stock/stock.py:2009 -#, python-format -msgid "Can not create Journal Entry, Input Account defined on this product and Variant account on category of this product are same." -msgstr "No se puede crear el asiento, la cuenta de entrada definido en este producto y la cuenta variante en la categoría del producto son la misma." - -#. module: stock -#: view:stock.change.standard.price:0 -msgid "Cost Price" -msgstr "Precio coste" - -#. module: stock -#: view:product.product:0 -#: field:product.product,valuation:0 -msgid "Inventory Valuation" -msgstr "Valoración inventario" - -#. module: stock -#: view:stock.picking:0 -msgid "Create Invoice" -msgstr "Crear factura" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Process Later" -msgstr "Procesar más tarde" - -#. module: stock -#: help:res.partner,property_stock_supplier:0 -msgid "This stock location will be used, instead of the default one, as the source location for goods you receive from the current partner" -msgstr "Esta ubicación de stock será utilizada, en lugar de la ubicación por defecto, como la ubicación de origen para recibir mercancías desde esta empresa" - -#. module: stock -#: field:stock.warehouse,partner_address_id:0 -msgid "Owner Address" -msgstr "Dirección propietario" - -#. module: stock -#: help:stock.move,price_unit:0 -msgid "Technical field used to record the product cost set by the user during a picking confirmation (when average price costing method is used)" -msgstr "Campo técnico utilizado para registrar el coste del producto indicado por el usuario durante una confirmación de orden (cuando se utiliza el método del precio medio de coste)." - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_stock_move_report -msgid "Moves Analysis allows you to easily check and analyse your company stock moves. Use this report when you want to analyse the different routes taken by your products and inventory management performance." -msgstr "El análisis de movimientos le permite analizar y verificar fácilmente los movimientos de stock de su compañía. Utilice este informe cuando quiera analizar las diferentes rutas tomadas por sus productos y el rendimiento de la gestión de su inventario." - -#. module: stock -#: field:report.stock.move,day_diff1:0 -msgid "Planned Lead Time (Days)" -msgstr "Tiempo inicial planificado (días)" - -#. module: stock -#: field:stock.change.standard.price,new_price:0 -msgid "Price" -msgstr "Precio" - -#. module: stock -#: view:stock.inventory:0 -msgid "Search Inventory" -msgstr "Buscar inventario" - -#. module: stock -#: field:stock.move.track,quantity:0 -msgid "Quantity per lot" -msgstr "Cantidad por lote" - -#. module: stock -#: code:addons/stock/stock.py:2012 -#, python-format -msgid "There is no stock input account defined for this product or its category: \"%s\" (id: %d)" -msgstr "No se ha definido una cuenta de entrada de stock para este producto o su categoría: \"%s\" (id: %d)" - -#. module: stock -#: code:addons/stock/product.py:357 -#, python-format -msgid "Received Qty" -msgstr "Ctdad recibida" - -#. module: stock -#: field:stock.production.lot,ref:0 -msgid "Internal Reference" -msgstr "Referencia interna" - -#. module: stock -#: help:stock.production.lot,prefix:0 -msgid "Optional prefix to prepend when displaying this serial number: PREFIX/SERIAL [INT_REF]" -msgstr "Prefijo opcional a añadir cuando se muestre el número de serie: PREFIJO/SERIE [REF_INT]" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_view_stock_fill_inventory -#: model:ir.model,name:stock.model_stock_fill_inventory -#: view:stock.fill.inventory:0 -msgid "Import Inventory" -msgstr "Importar inventario" - -#. module: stock -#: field:stock.incoterms,name:0 -#: field:stock.move,name:0 -#: field:stock.warehouse,name:0 -msgid "Name" -msgstr "Nombre" - -#. module: stock -#: view:product.product:0 -msgid "Stocks" -msgstr "Stocks" - -#. module: stock -#: model:ir.module.module,description:stock.module_meta_information -msgid "OpenERP Inventory Management module can manage multi-warehouses, multi and structured stock locations.\n" -"Thanks to the double entry management, the inventory controlling is powerful and flexible:\n" -"* Moves history and planning,\n" -"* Different inventory methods (FIFO, LIFO, ...)\n" -"* Stock valuation (standard or average price, ...)\n" -"* Robustness faced with Inventory differences\n" -"* Automatic reordering rules (stock level, JIT, ...)\n" -"* Bar code supported\n" -"* Rapid detection of mistakes through double entry system\n" -"* Traceability (upstream/downstream, production lots, serial number, ...)\n" -"* Dashboard for warehouse that includes:\n" -" * Products to receive in delay (date < = today)\n" -" * Procurement in exception\n" -" * Graph : Number of Receive products vs planned (bar graph on week par day)\n" -" * Graph : Number of Delivery products vs planned (bar graph on week par day)\n" -" " -msgstr "El módulo de OpenERP de gestión de inventario puede gestionar múltiples almacenes, y varias ubicaciones estructuradas.\n" -"Gracias a la gestión de doble entrada, el control de inventario es potente y flexible:\n" -"* Historial de movimientos y planificación,\n" -"* Diferentes métodos de inventario (FIFO, LIFO, ...)\n" -"* Valoración de existencias (precio estándar o medio, ...)\n" -"* Robustez frente a las diferencias de inventario\n" -"* Normas de reordenación automática (nivel de existencias, JIT, ...)\n" -"* Código de barras soportado\n" -"* Detección rápida de errores a través del sistema de entrada doble\n" -"* Trazabilidad (hacia arriba/hacia abajo, lotes de producción, número de serie, ...)\n" -"* Panel de almacén que incluye:\n" -" * Productos a recibir con retraso (fecha <= hoy)\n" -" * Compras en excepción\n" -" * Gráfico: Número de productos Recibidos frente al previsto (gráfico de barras semanal por día)\n" -" * Gráfico: Número de productos Entregados frente al previsto (gráfico de barras semanal por día)\n" -" " - -#. module: stock -#: help:product.template,property_stock_inventory:0 -msgid "For the current product, this stock location will be used, instead of the default one, as the source location for stock moves generated when you do an inventory" -msgstr "Para los productos actuales, esta ubicación de stock se utilizará, en lugar de la por defecto, como la ubicación de origen para los movimientos de stock generados cuando realiza un inventario." - -#. module: stock -#: view:report.stock.lines.date:0 -msgid "Stockable" -msgstr "Almacenable" - -#. module: stock -#: selection:product.product,valuation:0 -msgid "Real Time (automated)" -msgstr "Tiempo real (automatizado)" - -#. module: stock -#: help:stock.move,tracking_id:0 -msgid "Logistical shipping unit: pallet, box, pack ..." -msgstr "Unidad de envío logística: Palet, caja, paquete, ..." - -#. module: stock -#: view:stock.change.product.qty:0 -#: view:stock.change.standard.price:0 -msgid "_Apply" -msgstr "_Aplicar" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -#: report:stock.inventory.move:0 -#: report:stock.picking.list:0 -msgid "]" -msgstr "]" - -#. module: stock -#: field:product.template,property_stock_inventory:0 -msgid "Inventory Location" -msgstr "Ubicación de inventario" - -#. module: stock -#: view:report.stock.inventory:0 -#: view:report.stock.move:0 -msgid "Total value" -msgstr "Valor total" - -#. module: stock -#: help:stock.location,chained_journal_id:0 -msgid "Inventory Journal in which the chained move will be written, if the Chaining Type is not Transparent (no journal is used if left empty)" -msgstr "Diario de inventario en el que el movimiento encadenado será escrito, si el tipo de encadenamiento no es transparente (no se utiliza ningún diario si se deja vacío)." - -#. module: stock -#: view:board.board:0 -#: model:ir.actions.act_window,name:stock.action_incoming_product_board -msgid "Incoming Product" -msgstr "Orden de entrada" - -#. module: stock -#: view:stock.move:0 -msgid "Creation" -msgstr "Creación" - -#. module: stock -#: field:stock.move.memory.in,cost:0 -#: field:stock.move.memory.out,cost:0 -msgid "Cost" -msgstr "Coste" - -#. module: stock -#: field:product.category,property_stock_account_input_categ:0 -#: field:product.template,property_stock_account_input:0 -#: field:stock.change.standard.price,stock_account_input:0 -#: field:stock.location,valuation_in_account_id:0 -msgid "Stock Input Account" -msgstr "Cuenta entrada stock" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_stock_warehouse_mgmt -#: model:ir.ui.menu,name:stock.menu_warehouse_config -msgid "Warehouse Management" -msgstr "Gestión de almacenes" - -#. module: stock -#: selection:stock.picking,move_type:0 -msgid "Partial Delivery" -msgstr "Entrega parcial" - -#. module: stock -#: selection:stock.location,chained_auto_packing:0 -msgid "Automatic No Step Added" -msgstr "Mov. automático, paso no añadido" - -#. module: stock -#: code:addons/stock/stock.py:2382 -#, python-format -msgid "Product " -msgstr "Producto " - -#. module: stock -#: view:stock.location.product:0 -msgid "Stock Location Analysis" -msgstr "Análisis ubicación stock" - -#. module: stock -#: help:stock.move,date:0 -msgid "Move date: scheduled date until move is done, then date of actual move processing" -msgstr "Fecha del movimiento: Fecha planificada hasta que el movimiento esté realizado, después fecha real en que el movimiento ha sido procesado." - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_memory_out -msgid "stock.move.memory.out" -msgstr "stock.movimiento.memoria.salida" - -#. module: stock -#: view:report.stock.inventory:0 -#: view:report.stock.move:0 -#: view:stock.inventory:0 -#: view:stock.move:0 -#: view:stock.picking:0 -#: view:stock.production.lot:0 -msgid "Group By..." -msgstr "Agrupar por..." - -#. module: stock -#: view:stock.location:0 -msgid "Chained Locations" -msgstr "Ubicaciones encadenadas" - -#. module: stock -#: model:stock.location,name:stock.location_inventory -msgid "Inventory loss" -msgstr "Pérdidas de inventario" - -#. module: stock -#: code:addons/stock/stock.py:1311 -#, python-format -msgid "Document" -msgstr "Documento" - -#. module: stock -#: view:stock.picking:0 -msgid "Input Picking List" -msgstr "Lista de empaque de entrada" - -#. module: stock -#: field:stock.move,product_uom:0 -#: field:stock.move.memory.in,product_uom:0 -#: field:stock.move.memory.out,product_uom:0 -msgid "Unit of Measure" -msgstr "Unidad de medida" - -#. module: stock -#: code:addons/stock/product.py:176 -#, python-format -msgid "Products: " -msgstr "Productos: " - -#. module: stock -#: help:product.product,track_production:0 -msgid "Forces to specify a Production Lot for all moves containing this product and generated by a Manufacturing Order" -msgstr "Fuerza a especificar un lote de producción para todos los movimientos que contienen este producto y generados por una orden de fabricación." - -#. module: stock -#: model:ir.actions.act_window,name:stock.track_line_old -#: view:stock.move.track:0 -msgid "Tracking a move" -msgstr "Seguimiento de un movimiento" - -#. module: stock -#: view:product.product:0 -msgid "Update" -msgstr "Actualizar" - -#. module: stock -#: view:stock.inventory:0 -msgid "Set to Draft" -msgstr "Cambiar a borrador" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_stock_journal_form -#: model:ir.ui.menu,name:stock.menu_action_stock_journal_form -msgid "Stock Journals" -msgstr "Diarios de stock" - -#. module: stock -#: selection:report.stock.move,type:0 -msgid "Others" -msgstr "Otros" - -#. module: stock -#: code:addons/stock/product.py:90 -#, python-format -msgid "Could not find any difference between standard price and new price!" -msgstr "¡No se puede encontrar ninguna diferencia entre precio estándar y precio nuevo!" - -#. module: stock -#: model:ir.model,name:stock.model_stock_partial_picking -msgid "Partial Picking" -msgstr "Empaquetado parcial" - -#. module: stock -#: model:stock.location,name:stock.stock_location_scrapped -#: field:stock.move,scrapped:0 -msgid "Scrapped" -msgstr "Desechado" - -#. module: stock -#: view:stock.inventory:0 -msgid "Products " -msgstr "Productos " - -#. module: stock -#: field:product.product,track_incoming:0 -msgid "Track Incoming Lots" -msgstr "Lotes de seguimiento de entrada" - -#. module: stock -#: view:board.board:0 -msgid "Warehouse board" -msgstr "Tablero almacén" - -#. module: stock -#: code:addons/stock/wizard/stock_change_product_qty.py:104 -#: model:ir.actions.act_window,name:stock.action_inventory_form -#: model:ir.ui.menu,name:stock.menu_action_inventory_form -#, python-format -msgid "Physical Inventories" -msgstr "Inventarios físicos" - -#. module: stock -#: field:product.category,property_stock_variation:0 -msgid "Stock Variation Account" -msgstr "Cuenta variación stock" - -#. module: stock -#: field:stock.move,note:0 -#: view:stock.picking:0 -#: field:stock.picking,note:0 -msgid "Notes" -msgstr "Notas" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -msgid "Value" -msgstr "Valor" - -#. module: stock -#: field:report.stock.move,type:0 -#: field:stock.location,chained_picking_type:0 -#: field:stock.picking,type:0 -msgid "Shipping Type" -msgstr "Tipo de envío" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_picking.py:97 -#: model:ir.actions.act_window,name:stock.act_product_location_open -#: model:ir.ui.menu,name:stock.menu_stock_products_menu -#: view:stock.inventory:0 -#: view:stock.picking:0 -#, python-format -msgid "Products" -msgstr "Productos" - -#. module: stock -#: view:stock.change.standard.price:0 -msgid "Change Price" -msgstr "Cambiar precio" - -#. module: stock -#: field:stock.picking,move_type:0 -msgid "Delivery Method" -msgstr "Método entrega" - -#. module: stock -#: help:report.stock.move,location_dest_id:0 -#: help:stock.move,location_dest_id:0 -#: help:stock.picking,location_dest_id:0 -msgid "Location where the system will stock the finished products." -msgstr "Ubicación donde el sistema almacenará los productos finalizados." - -#. module: stock -#: help:product.category,property_stock_variation:0 -msgid "When real-time inventory valuation is enabled on a product, this account will hold the current value of the products." -msgstr "Cuando está activada una valoración de inventario en tiempo real de un producto, esta cuenta contiene el valor actual de los productos." - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_reception_picking_move -msgid "Here you can receive individual products, no matter what purchase order or picking order they come from. You will find the list of all products you are waiting for. Once you receive an order, you can filter based on the name of the supplier or the purchase order reference. Then you can confirm all products received using the buttons on the right of each line." -msgstr "Aquí podrá recibir los productos individuales, sin importar de que pedido de compra u orden de entrada provienen. Encontrará la lista de todos los productos que está esperando. Una vez recibida la orden, puede filtrar basándose en el nombre del proveedor o en la referencia del pedido de compra. Entonces, puede confirmar todos los productos recibidos usando los botones a la derecha de cada línea." - -#. module: stock -#: model:ir.model,name:stock.model_stock_move -msgid "Stock Move" -msgstr "Movimiento de stock" - -#. module: stock -#: view:report.stock.move:0 -msgid "Delay(Days)" -msgstr "Retraso (días)" - -#. module: stock -#: field:stock.move.memory.in,move_id:0 -#: field:stock.move.memory.out,move_id:0 -msgid "Move" -msgstr "Movimiento" - -#. module: stock -#: help:stock.picking,min_date:0 -msgid "Expected date for the picking to be processed" -msgstr "Fecha prevista para procesar el empaque." - -#. module: stock -#: code:addons/stock/product.py:373 -#, python-format -msgid "P&L Qty" -msgstr "Ctdad P&L" - -#. module: stock -#: view:stock.production.lot:0 -#: field:stock.production.lot,revisions:0 -msgid "Revisions" -msgstr "Revisiones" - -#. module: stock -#: view:stock.picking:0 -msgid "This operation will cancel the shipment. Do you want to continue?" -msgstr "Esta operación cancelará el envío. ¿Desea continuar?" - -#. module: stock -#: help:product.product,valuation:0 -msgid "If real-time valuation is enabled for a product, the system will automatically write journal entries corresponding to stock moves.The inventory variation account set on the product category will represent the current inventory value, and the stock input and stock output account will hold the counterpart moves for incoming and outgoing products." -msgstr "Si la valoración en tiempo real está habilitada para un producto, el sistema automáticamente escribirá asientos en el diario correspondientes a los movimientos de stock. La cuenta de variación de inventario especificada en la categoría del producto representará el valor de inventario actual, y la cuenta de entrada y salida de stock contendrán las contrapartidas para los productos entrantes y salientes." - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_stock_inventory_report -msgid "Inventory Analysis allows you to easily check and analyse your company stock levels. Sort and group by selection criteria in order to better analyse and manage your company activities." -msgstr "El análisis de inventario le permite verificar y analizar fácilmente los niveles de stock de su compañia. Ordene y agrupe por criterios de selección para analizar y gestionar mejor las actividades de su empresa." - -#. module: stock -#: help:report.stock.move,location_id:0 -#: help:stock.move,location_id:0 -msgid "Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations." -msgstr "Indica una ubicación si se producen en una ubicación fija. Puede ser una ubicación de empresa si subcontrata las operaciones de fabricación." - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_location_form -msgid "Define your locations to reflect your warehouse structure and organization. OpenERP is able to manage physical locations (warehouses, shelves, bin, etc), partner locations (customers, suppliers) and virtual locations which are the counterpart of the stock operations like the manufacturing orders consumptions, inventories, etc. Every stock operation in OpenERP moves the products from one location to another one. For instance, if you receive products from a supplier, OpenERP will move products from the Supplier location to the Stock location. Each report can be performed on physical, partner or virtual locations." -msgstr "Defina sus ubicaciones para reflejar la estructura de su almacén y organización. OpenERP es capaz de manejar ubicaciones físicas (almacén, estante, caja, etc.), ubicaciones de empresa (clientes, proveedores) y ubicaciones virtuales que son la contrapartida de las operaciones de stock como los consumos por órdenes de la fabricación, inventarios, etc. Cada operación de stock en OpenERP mueve los productos de una ubicación a otra. Por ejemplo, si recibe productos de un proveedor, OpenERP moverá productos desde la ubicación del proveedor a la ubicación del stock. Cada informe puede ser realizado sobre ubicaciones físicas, de empresa o virtuales." - -#. module: stock -#: view:stock.invoice.onshipping:0 -msgid "Create" -msgstr "Crear" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Dates" -msgstr "Fechas" - -#. module: stock -#: field:stock.move,priority:0 -msgid "Priority" -msgstr "Prioridad" - -#. module: stock -#: view:stock.move:0 -msgid "Source" -msgstr "Origen" - -#. module: stock -#: code:addons/stock/stock.py:2586 -#: model:ir.model,name:stock.model_stock_inventory -#: selection:report.stock.inventory,location_type:0 -#: field:stock.inventory.line,inventory_id:0 -#: report:stock.inventory.move:0 -#: selection:stock.location,usage:0 -#, python-format -msgid "Inventory" -msgstr "Inventario" - -#. module: stock -#: model:ir.model,name:stock.model_stock_picking -msgid "Picking List" -msgstr "Lista de empaque" - -#. module: stock -#: sql_constraint:stock.production.lot:0 -msgid "The combination of serial number and internal reference must be unique !" -msgstr "¡La combinación de número de serie y referencia interna debe ser única!" - -#. module: stock -#: model:ir.model,name:stock.model_stock_ups -msgid "Stock ups" -msgstr "Stock ups" - -#. module: stock -#: view:stock.inventory:0 -msgid "Cancel Inventory" -msgstr "Cancelar el inventario" - -#. module: stock -#: field:stock.move.split.lines,name:0 -#: field:stock.move.split.lines.exist,name:0 -msgid "Tracking serial" -msgstr "Seguimiento nº serie" - -#. module: stock -#: code:addons/stock/report/report_stock.py:78 -#: code:addons/stock/report/report_stock.py:135 -#: code:addons/stock/stock.py:754 -#, python-format -msgid "Error !" -msgstr "¡Error!" - -#. module: stock -#: model:ir.model,name:stock.model_stock_replacement_result -msgid "Stock Replacement result" -msgstr "Resultado reemplazo stock" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_stock_unit_measure_stock -#: model:ir.ui.menu,name:stock.menu_stock_uom_form_action -msgid "Units of Measure" -msgstr "Unidades de medida" - -#. module: stock -#: selection:stock.location,chained_location_type:0 -msgid "Fixed Location" -msgstr "Ubicaciones fijas" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "July" -msgstr "Julio" - -#. module: stock -#: view:report.stock.lines.date:0 -msgid "Consumable" -msgstr "Consumible" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_stock_line_date -msgid "Display the last inventories done on your products and easily sort them with specific filtering criteria. If you do frequent and partial inventories, you need this report in order to ensure that the stock of each product is controlled at least once a year." -msgstr "Muestra los últimos inventarios realizados sobre sus productos y los ordena fácilmente con filtros específicos. Si realiza inventarios parciales frecuentemente, necesita este informe para asegurar que el stock de cada producto ha sido controlado al menos una vez al año." - -#. module: stock -#: model:ir.actions.report.xml,name:stock.report_product_history -msgid "Stock Level Forecast" -msgstr "Previsión nivel de stock" - -#. module: stock -#: model:ir.model,name:stock.model_stock_journal -#: field:report.stock.move,stock_journal:0 -#: view:stock.journal:0 -#: field:stock.journal,name:0 -#: field:stock.picking,stock_journal_id:0 -msgid "Stock Journal" -msgstr "Diario de inventario" - -#. module: stock -#: selection:report.stock.inventory,location_type:0 -#: selection:stock.location,usage:0 -msgid "Procurement" -msgstr "Abastecimiento" - -#. module: stock -#: code:addons/stock/wizard/stock_change_product_qty.py:80 -#: code:addons/stock/wizard/stock_change_standard_price.py:106 -#, python-format -msgid "Active ID is not set in Context" -msgstr "No se ha establecido el ID activo en el Contexto" - -#. module: stock -#: view:stock.picking:0 -msgid "Force Availability" -msgstr "Forzar disponibilidad" - -#. module: stock -#: model:ir.actions.act_window,name:stock.move_scrap -#: view:stock.move.scrap:0 -msgid "Scrap Move" -msgstr "Movimiento desecho" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:138 -#: model:ir.actions.act_window,name:stock.action_reception_picking_move -#: model:ir.ui.menu,name:stock.menu_action_pdct_in -#: view:stock.move:0 -#, python-format -msgid "Receive Products" -msgstr "Recibir productos" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:131 -#: model:ir.actions.act_window,name:stock.action_out_picking_move -#: model:ir.ui.menu,name:stock.menu_action_pdct_out -#, python-format -msgid "Deliver Products" -msgstr "Enviar productos" - -#. module: stock -#: view:stock.location.product:0 -msgid "View Stock of Products" -msgstr "Ver stock de productos" - -#. module: stock -#: view:stock.picking:0 -msgid "Internal Picking List" -msgstr "Lista de empaque interna" - -#. module: stock -#: view:report.stock.move:0 -#: field:report.stock.move,month:0 -msgid "Month" -msgstr "Mes" - -#. module: stock -#: help:stock.picking,date_done:0 -msgid "Date of Completion" -msgstr "Fecha de realización." - -#. module: stock -#: help:stock.production.lot,name:0 -msgid "Unique production lot, will be displayed as: PREFIX/SERIAL [INT_REF]" -msgstr "Lote de producción único, se mostrará como: PREFIJO/SERIE [REF_INT]" - -#. module: stock -#: help:stock.tracking,active:0 -msgid "By unchecking the active field, you may hide a pack without deleting it." -msgstr "Si el campo activo se desmarca, permite ocultar un paquete sin eliminarlo." - -#. module: stock -#: view:stock.inventory.merge:0 -msgid "Yes" -msgstr "Sí" - -#. module: stock -#: field:stock.inventory,inventory_line_id:0 -msgid "Inventories" -msgstr "Inventarios" - -#. module: stock -#: view:report.stock.move:0 -msgid "Todo" -msgstr "Por hacer" - -#. module: stock -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,company_id:0 -#: view:report.stock.move:0 -#: field:report.stock.move,company_id:0 -#: field:stock.inventory,company_id:0 -#: field:stock.inventory.line,company_id:0 -#: field:stock.location,company_id:0 -#: field:stock.move,company_id:0 -#: field:stock.picking,company_id:0 -#: field:stock.production.lot,company_id:0 -#: field:stock.production.lot.revision,company_id:0 -#: field:stock.warehouse,company_id:0 -msgid "Company" -msgstr "Compañía" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Unit Of Measure" -msgstr "Unidad de medida" - -#. module: stock -#: code:addons/stock/product.py:122 -#, python-format -msgid "There is no stock input account defined for this product: \"%s\" (id: %d)" -msgstr "No se ha definido una cuenta de entrada de stock para este producto: \"%s\" (id: %d)" - -#. module: stock -#: code:addons/stock/stock.py:2336 -#, python-format -msgid "Can not consume a move with negative or zero quantity !" -msgstr "¡No se puede consumir un movimiento con una cantidad negativa o cero!" - -#. module: stock -#: field:stock.location,stock_real:0 -msgid "Real Stock" -msgstr "Stock real" - -#. module: stock -#: view:stock.fill.inventory:0 -msgid "Fill Inventory" -msgstr "Rellenar inventario" - -#. module: stock -#: constraint:product.template:0 -msgid "Error: The default UOM and the purchase UOM must be in the same category." -msgstr "Error: La UdM por defecto y la UdM de compra deben estar en la misma categoría." - -#. module: stock -#: help:product.category,property_stock_account_input_categ:0 -msgid "When doing real-time inventory valuation, counterpart Journal Items for all incoming stock moves will be posted in this account. This is the default value for all products in this category, it can also directly be set on each product." -msgstr "Al hacer la valoración de inventario en tiempo real, la contrapartida de los asientos del diario para todos los movimientos de stock de entrada se creará en esta cuenta. Este es el valor por defecto para todos los productos de esta categoría, también puede indicarse directamente en cada producto." - -#. module: stock -#: field:stock.production.lot.revision,date:0 -msgid "Revision Date" -msgstr "Fecha de revisión" - -#. module: stock -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,prodlot_id:0 -#: view:stock.move:0 -#: field:stock.move.split.lines,lot_id:0 -#: field:stock.move.split.lines.exist,lot_id:0 -#: report:stock.picking.list:0 -msgid "Lot" -msgstr "Lote" - -#. module: stock -#: view:stock.move.split:0 -msgid "Production Lot Number" -msgstr "Número lote de producción" - -#. module: stock -#: field:stock.move,product_uos_qty:0 -msgid "Quantity (UOS)" -msgstr "Cantidad (UdV)" - -#. module: stock -#: code:addons/stock/stock.py:1664 -#, python-format -msgid "You are moving %.2f %s products but only %.2f %s available in this lot." -msgstr "Está moviendo %.2f %s productos pero sólo %.2f %s están disponibles en este lote." - -#. module: stock -#: view:stock.move:0 -msgid "Set Available" -msgstr "Reservar" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Contact Address :" -msgstr "Dirección de contacto :" - -#. module: stock -#: field:stock.move,backorder_id:0 -msgid "Back Order" -msgstr "Orden pendiente" - -#. module: stock -#: field:stock.incoterms,active:0 -#: field:stock.location,active:0 -#: field:stock.tracking,active:0 -msgid "Active" -msgstr "Activo" - -#. module: stock -#: model:ir.module.module,shortdesc:stock.module_meta_information -msgid "Inventory Management" -msgstr "Almacenes y logística" - -#. module: stock -#: view:product.template:0 -msgid "Properties" -msgstr "Propiedades" - -#. module: stock -#: code:addons/stock/stock.py:974 -#, python-format -msgid "Error, no partner !" -msgstr "¡Error, sin empresa!" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_incoterms_tree -#: model:ir.model,name:stock.model_stock_incoterms -#: model:ir.ui.menu,name:stock.menu_action_incoterm_open -#: view:stock.incoterms:0 -msgid "Incoterms" -msgstr "Incoterms" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -#: report:stock.inventory.move:0 -msgid "Total:" -msgstr "Total:" - -#. module: stock -#: help:stock.incoterms,name:0 -msgid "Incoterms are series of sales terms.They are used to divide transaction costs and responsibilities between buyer and seller and reflect state-of-the-art transportation practices." -msgstr "Los Incoterms son una serie de términos de ventas. Se utilizan para dividir los costes de transacción y las responsabilidades entre el comprador y el vendedor, y reflejan las prácticas de transporte más recientes." - -#. module: stock -#: help:stock.fill.inventory,recursive:0 -msgid "If checked, products contained in child locations of selected location will be included as well." -msgstr "Si se marca, los productos que figuran en las ubicaciones hijas de la ubicación seleccionada se incluirán también." - -#. module: stock -#: field:stock.move.track,tracking_prefix:0 -msgid "Tracking prefix" -msgstr "Prefijo seguimiento" - -#. module: stock -#: field:stock.inventory,name:0 -msgid "Inventory Reference" -msgstr "Referencia inventario" - -#. module: stock -#: code:addons/stock/stock.py:1304 -#, python-format -msgid "Internal picking" -msgstr "Empaque interno" - -#. module: stock -#: view:stock.location.product:0 -msgid "Open Product" -msgstr "Abrir producto" - -#. module: stock -#: field:stock.location.product,to_date:0 -msgid "To" -msgstr "Hasta" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Process" -msgstr "Procesar" - -#. module: stock -#: field:stock.production.lot.revision,name:0 -msgid "Revision Name" -msgstr "Nombre de revisión" - -#. module: stock -#: model:ir.model,name:stock.model_stock_warehouse -#: model:ir.ui.menu,name:stock.menu_stock_root -#: view:stock.warehouse:0 -msgid "Warehouse" -msgstr "Almacén" - -#. module: stock -#: view:stock.location.product:0 -msgid "(Keep empty to open the current situation. Adjust HH:MM:SS to 00:00:00 to filter all resources of the day for the 'From' date and 23:59:59 for the 'To' date)" -msgstr "(Déjelo vacío para abrir la situación actual. Ponga HH:MM:SS a 00:00:00 para filtrar todos los recursos del día en el campo fecha 'Desde' y 23:59:59 en el campo fecha 'Hasta'.)" - -#. module: stock -#: view:product.category:0 -msgid "Accounting Stock Properties" -msgstr "Propiedades contables del stock" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_picking_tree_out -msgid "Customers Packings" -msgstr "Paquetes cliente" - -#. module: stock -#: selection:report.stock.inventory,state:0 -#: view:report.stock.move:0 -#: selection:report.stock.move,state:0 -#: selection:stock.inventory,state:0 -#: view:stock.move:0 -#: selection:stock.move,state:0 -#: view:stock.picking:0 -#: selection:stock.picking,state:0 -msgid "Done" -msgstr "Realizado" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_view_change_standard_price -#: model:ir.model,name:stock.model_stock_change_standard_price -#: view:stock.change.standard.price:0 -msgid "Change Standard Price" -msgstr "Cambiar precio estándar" - -#. module: stock -#: model:stock.location,name:stock.stock_location_locations_virtual -msgid "Virtual Locations" -msgstr "Ubicaciones virtuales" - -#. module: stock -#: selection:stock.picking,invoice_state:0 -msgid "To Be Invoiced" -msgstr "Para facturar" - -#. module: stock -#: field:stock.inventory,date_done:0 -msgid "Date done" -msgstr "Fecha realización" - -#. module: stock -#: code:addons/stock/stock.py:975 -#, python-format -msgid "Please put a partner on the picking list if you want to generate invoice." -msgstr "Por favor indique una empresa en la orden si desea generar factura." - -#. module: stock -#: selection:stock.move,priority:0 -msgid "Not urgent" -msgstr "No urgente" - -#. module: stock -#: view:stock.move:0 -msgid "To Do" -msgstr "Para hacer" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_warehouse_form -#: model:ir.ui.menu,name:stock.menu_action_warehouse_form -msgid "Warehouses" -msgstr "Almacenes" - -#. module: stock -#: field:stock.journal,user_id:0 -msgid "Responsible" -msgstr "Responsable" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_stock_inventory_report -#: model:ir.ui.menu,name:stock.menu_action_stock_inventory_report -#: view:report.stock.inventory:0 -msgid "Inventory Analysis" -msgstr "Análisis inventario" - -#. module: stock -#: field:stock.invoice.onshipping,journal_id:0 -msgid "Destination Journal" -msgstr "Diario de destino" - -#. module: stock -#: model:ir.actions.act_window,name:stock.act_stock_tracking_lot_2_stock_report_tracklots -#: model:stock.location,name:stock.stock_location_stock -msgid "Stock" -msgstr "Stock" - -#. module: stock -#: model:ir.model,name:stock.model_product_product -#: model:ir.ui.menu,name:stock.menu_product_in_config_stock -#: model:ir.ui.menu,name:stock.menu_stock_product -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,product_id:0 -#: field:report.stock.lines.date,product_id:0 -#: view:report.stock.move:0 -#: field:report.stock.move,product_id:0 -#: field:stock.change.product.qty,product_id:0 -#: field:stock.inventory.line,product_id:0 -#: field:stock.inventory.line.split,product_id:0 -#: report:stock.inventory.move:0 -#: view:stock.move:0 -#: field:stock.move,product_id:0 -#: field:stock.move.consume,product_id:0 -#: field:stock.move.memory.in,product_id:0 -#: field:stock.move.memory.out,product_id:0 -#: field:stock.move.scrap,product_id:0 -#: field:stock.move.split,product_id:0 -#: view:stock.production.lot:0 -#: field:stock.production.lot,product_id:0 -#: field:stock.report.prodlots,product_id:0 -#: field:stock.report.tracklots,product_id:0 -msgid "Product" -msgstr "Producto" - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:126 -#, python-format -msgid "Invoicing" -msgstr "Facturación" - -#. module: stock -#: code:addons/stock/stock.py:2271 -#: code:addons/stock/stock.py:2331 -#, python-format -msgid "Please provide Proper Quantity !" -msgstr "¡Indique cantidad correcta!" - -#. module: stock -#: field:stock.move,product_uos:0 -msgid "Product UOS" -msgstr "UdV del producto" - -#. module: stock -#: field:stock.location,posz:0 -msgid "Height (Z)" -msgstr "Altura (Z)" - -#. module: stock -#: field:stock.ups,weight:0 -msgid "Lot weight" -msgstr "Peso lote" - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_consume -#: view:stock.move.consume:0 -msgid "Consume Products" -msgstr "Consumir productos" - -#. module: stock -#: code:addons/stock/stock.py:1663 -#, python-format -msgid "Insufficient Stock in Lot !" -msgstr "¡Stock insuficiente en el lote!" - -#. module: stock -#: field:stock.location,parent_right:0 -msgid "Right Parent" -msgstr "Padre derecho" - -#. module: stock -#: field:stock.picking,address_id:0 -msgid "Address" -msgstr "Dirección" - -#. module: stock -#: report:lot.stock.overview:0 -#: report:lot.stock.overview_all:0 -msgid "Variants" -msgstr "Variantes" - -#. module: stock -#: field:stock.location,posx:0 -msgid "Corridor (X)" -msgstr "Pasillo (X)" - -#. module: stock -#: field:report.stock.inventory,value:0 -#: field:report.stock.move,value:0 -msgid "Total Value" -msgstr "Valor total" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_product_by_category_stock_form -msgid "Products by Category" -msgstr "Productos por categoría" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_product_category_config_stock -msgid "Products Categories" -msgstr "Categorías de productos" - -#. module: stock -#: field:stock.move.memory.in,wizard_id:0 -#: field:stock.move.memory.out,wizard_id:0 -msgid "Wizard" -msgstr "Asistente" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_view_stock_location_product -#: model:ir.model,name:stock.model_stock_location_product -msgid "Products by Location" -msgstr "Productos por ubicación" - -#. module: stock -#: field:stock.fill.inventory,recursive:0 -msgid "Include children" -msgstr "Incluir hijos" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_picking_tree6 -msgid "Internal Moves display all inventory operations you have to perform in your warehouse. All operations can be categorized into stock journals, so that each worker has his own list of operations to perform in his own journal. Most operations are prepared automatically by OpenERP according to your preconfigured logistics rules, but you can also record manual stock operations." -msgstr "Los movimientos internos muestran todas las operaciones de inventario que se deben realizar en su almacén. Todas las operaciones pueden ser clasificadas en diarios de stock, para que cada trabajador tenga su propia lista de operaciones a realizar en su propio diario. La mayor parte de operaciones son preparadas automáticamente por OpenERP según sus reglas de logística preconfiguradas, pero también puede registrar operaciones de stock de forma manual." - -#. module: stock -#: view:stock.move:0 -msgid "Order" -msgstr "Orden" - -#. module: stock -#: field:stock.tracking,name:0 -msgid "Pack Reference" -msgstr "Referencia de paquete" - -#. module: stock -#: view:report.stock.move:0 -#: field:report.stock.move,location_id:0 -#: field:stock.move,location_id:0 -msgid "Source Location" -msgstr "Ubicación de origen" - -#. module: stock -#: view:product.template:0 -msgid "Accounting Entries" -msgstr "Asientos contables" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Total" -msgstr "Total" - -#. module: stock -#: field:stock.change.standard.price,enable_stock_in_out_acc:0 -msgid "Enable Related Account" -msgstr "Activa cuenta relacionada" - -#. module: stock -#: field:stock.location,stock_virtual_value:0 -msgid "Virtual Stock Value" -msgstr "Valor stock virtual" - -#. module: stock -#: view:product.product:0 -#: view:stock.inventory.line.split:0 -#: view:stock.move.split:0 -msgid "Lots" -msgstr "Lotes" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "New Pack" -msgstr "Nuevo paquete" - -#. module: stock -#: view:stock.move:0 -msgid "Destination" -msgstr "Destino" - -#. module: stock -#: selection:stock.picking,move_type:0 -msgid "All at once" -msgstr "Todo junto" - -#. module: stock -#: code:addons/stock/stock.py:1620 -#, python-format -msgid "Quantities, UoMs, Products and Locations cannot be modified on stock moves that have already been processed (except by the Administrator)" -msgstr "Las cantidades, UdM, productos y ubicaciones no se pueden modificar en los movimientos de stock que ya han sido procesados (excepto por el administrador)" - -#. module: stock -#: code:addons/stock/product.py:383 -#, python-format -msgid "Future Productions" -msgstr "Producciones futuras" - -#. module: stock -#: view:stock.picking:0 -msgid "To Invoice" -msgstr "Para facturar" - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:115 -#, python-format -msgid "Return lines" -msgstr "Líneas de devolución" - -#. module: stock -#: model:ir.model,name:stock.model_report_stock_lines_date -#: view:report.stock.lines.date:0 -msgid "Dates of Inventories" -msgstr "Fechas de inventarios" - -#. module: stock -#: view:report.stock.move:0 -msgid "Total incoming quantity" -msgstr "Cantidad de entrada total" - -#. module: stock -#: field:report.stock.move,product_qty_out:0 -msgid "Out Qty" -msgstr "Ctdad salida" - -#. module: stock -#: field:stock.production.lot,move_ids:0 -msgid "Moves for this production lot" -msgstr "Movimientos para este lote de producción" - -#. module: stock -#: code:addons/stock/wizard/stock_fill_inventory.py:115 -#, python-format -msgid "Message !" -msgstr "¡ Mensaje !" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Put in current pack" -msgstr "Poner en el paquete actual" - -#. module: stock -#: view:stock.inventory:0 -msgid "Lot Inventory" -msgstr "Regularización de inventario" - -#. module: stock -#: view:stock.move:0 -msgid "Reason" -msgstr "Motivo" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Delivery Order:" -msgstr "Orden de salida:" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_production_lot_form -msgid "This is the list of all the production lots (serial numbers) you recorded. When you select a lot, you can get the upstream or downstream traceability of the products contained in lot. By default, the list is filtred on the serial numbers that are available in your warehouse but you can uncheck the 'Available' button to get all the lots you produced, received or delivered to customers." -msgstr "Esta es la lista de todos los lotes de producción (números de serie) que registró. Cuando selecciona un lote, puede obtener la trazabilidad hacia arriba o hacia abajo de los productos que componen el lote. Por defecto, la lista es filtrada según los números de serie disponibles en su almacén, pero puede desmarcar el botón 'Disponible' para obtener todos los lotes que produjo, recibió o entregó a sus clientes." - -#. module: stock -#: field:stock.location,icon:0 -msgid "Icon" -msgstr "Icono" - -#. module: stock -#: code:addons/stock/stock.py:2206 -#: code:addons/stock/stock.py:2614 -#, python-format -msgid "UserError" -msgstr "Error de usuario" - -#. module: stock -#: view:stock.inventory.line.split:0 -#: view:stock.move.consume:0 -#: view:stock.move.scrap:0 -#: view:stock.move.split:0 -#: view:stock.move.track:0 -#: view:stock.split.into:0 -msgid "Ok" -msgstr "Aceptar" - -#. module: stock -#: code:addons/stock/product.py:76 -#: code:addons/stock/product.py:90 -#: code:addons/stock/product.py:93 -#: code:addons/stock/product.py:100 -#: code:addons/stock/product.py:121 -#: code:addons/stock/product.py:147 -#: code:addons/stock/stock.py:2006 -#: code:addons/stock/stock.py:2009 -#: code:addons/stock/stock.py:2012 -#: code:addons/stock/stock.py:2015 -#: code:addons/stock/stock.py:2018 -#: code:addons/stock/stock.py:2021 -#: code:addons/stock/stock.py:2336 -#: code:addons/stock/wizard/stock_fill_inventory.py:48 -#: code:addons/stock/wizard/stock_splitinto.py:49 -#: code:addons/stock/wizard/stock_splitinto.py:53 -#, python-format -msgid "Error!" -msgstr "¡Error!" - -#. module: stock -#: code:addons/stock/stock.py:2021 -#, python-format -msgid "There is no inventory variation account defined on the product category: \"%s\" (id: %d)" -msgstr "No se ha definido una cuenta de variación de inventario en la categoría del producto: \"%s\" (id: %d)" - -#. module: stock -#: view:stock.inventory.merge:0 -msgid "Do you want to merge theses inventories?" -msgstr "¿Desea fusionar estos inventarios?" - -#. module: stock -#: selection:report.stock.inventory,state:0 -#: selection:report.stock.move,state:0 -#: selection:stock.inventory,state:0 -#: selection:stock.move,state:0 -#: selection:stock.picking,state:0 -msgid "Cancelled" -msgstr "Cancelado" - -#. module: stock -#: field:stock.location,chained_location_type:0 -msgid "Chained Location Type" -msgstr "Tipo ubicaciones encadenadas" - -#. module: stock -#: help:stock.picking,move_type:0 -msgid "It specifies goods to be delivered all at once or by direct delivery" -msgstr "Indica si las mercancías se enviarán todas a la vez o directamente." - -#. module: stock -#: code:addons/stock/wizard/stock_invoice_onshipping.py:85 -#, python-format -msgid "This picking list does not require invoicing." -msgstr "Esta orden no requiere facturación." - -#. module: stock -#: selection:report.stock.move,type:0 -#: selection:stock.location,chained_picking_type:0 -#: selection:stock.picking,type:0 -msgid "Getting Goods" -msgstr "Recepción mercancías" - -#. module: stock -#: help:stock.location,chained_location_type:0 -msgid "Determines whether this location is chained to another location, i.e. any incoming product in this location \n" -"should next go to the chained location. The chained location is determined according to the type :\n" -"* None: No chaining at all\n" -"* Customer: The chained location will be taken from the Customer Location field on the Partner form of the Partner that is specified in the Picking list of the incoming products.\n" -"* Fixed Location: The chained location is taken from the next field: Chained Location if Fixed." -msgstr "Determina si esta ubicación está encadenada a otra, por ejemplo cualquier producto que entre en esta ubicación debe ir a la siguiente ubicación encadenada. La ubicación encadenada se determina en función del tipo: \n" -"*Ninguna: No se encadena con ninguna.\n" -"*Cliente: Se utiliza la ubicación encadenada definida en el campo Ubicación del cliente del formulario del cliente especificado en la orden de los productos entrantes.\n" -"*Ubicación fija: Se utiliza la ubicación encadenada del siguiente campo: Ubicación encadenada si fija." - -#. module: stock -#: code:addons/stock/wizard/stock_inventory_merge.py:43 -#: code:addons/stock/wizard/stock_inventory_merge.py:63 -#, python-format -msgid "Warning" -msgstr "Advertencia" - -#. module: stock -#: code:addons/stock/stock.py:1318 -#: code:addons/stock/stock.py:2586 -#, python-format -msgid "is done." -msgstr "está realizado." - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_picking_tree -#: model:ir.ui.menu,name:stock.menu_action_picking_tree -#: view:stock.picking:0 -msgid "Delivery Orders" -msgstr "Ordenes de salida" - -#. module: stock -#: help:res.partner,property_stock_customer:0 -msgid "This stock location will be used, instead of the default one, as the destination location for goods you send to this partner" -msgstr "Esta ubicación de stock será utilizada, en lugar de la ubicación por defecto, como la ubicación de destino para enviar mercancías a esta empresa" - -#. module: stock -#: selection:report.stock.inventory,state:0 -#: selection:report.stock.move,state:0 -#: selection:stock.inventory,state:0 -#: view:stock.picking:0 -#: selection:stock.picking,state:0 -msgid "Confirmed" -msgstr "Confirmado" - -#. module: stock -#: view:stock.picking:0 -msgid "Confirm" -msgstr "Confirmar" - -#. module: stock -#: help:stock.location,icon:0 -msgid "Icon show in hierarchical tree view" -msgstr "Icono mostrado en la vista de árbol jerárquica." - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_view_stock_merge_inventories -#: view:stock.inventory.merge:0 -msgid "Merge Inventories" -msgstr "Fusionar inventarios" - -#. module: stock -#: help:stock.change.product.qty,new_quantity:0 -msgid "This quantity is expressed in the Default UoM of the product." -msgstr "Esta cantidad está expresada en la UdM por defecto del producto." - -#. module: stock -#: report:stock.picking.list:0 -msgid "Reception:" -msgstr "Recepción:" - -#. module: stock -#: help:stock.location,scrap_location:0 -msgid "Check this box to allow using this location to put scrapped/damaged goods." -msgstr "Marque esta opción para permitir utilizar esta ubicación para poner mercancías desechadas/defectuosas." - -#. module: stock -#: model:ir.actions.act_window,name:stock.act_relate_picking -msgid "Related Picking" -msgstr "Empaques relacionados" - -#. module: stock -#: view:report.stock.move:0 -msgid "Total outgoing quantity" -msgstr "Cantidad de salida total" - -#. module: stock -#: field:stock.picking,backorder_id:0 -msgid "Back Order of" -msgstr "Orden pendiente de" - -#. module: stock -#: help:stock.move.memory.in,cost:0 -#: help:stock.move.memory.out,cost:0 -msgid "Unit Cost for this product line" -msgstr "Coste unidad para esta línea de producto" - -#. module: stock -#: model:ir.model,name:stock.model_product_category -#: view:report.stock.inventory:0 -#: field:report.stock.inventory,product_categ_id:0 -#: view:report.stock.move:0 -#: field:report.stock.move,categ_id:0 -msgid "Product Category" -msgstr "Categoría de producto" - -#. module: stock -#: code:addons/stock/wizard/stock_change_product_qty.py:88 -#, python-format -msgid "INV: " -msgstr "INV: " - -#. module: stock -#: model:ir.ui.menu,name:stock.next_id_61 -msgid "Reporting" -msgstr "Informes" - -#. module: stock -#: code:addons/stock/stock.py:1313 -#, python-format -msgid " for the " -msgstr " para el " - -#. module: stock -#: view:stock.split.into:0 -msgid "Quantity to Leave in the Current Pack" -msgstr "Cantidad a dejar en el paquete actual" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_stock_invoice_onshipping -#: view:stock.invoice.onshipping:0 -msgid "Create invoice" -msgstr "Crear factura" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_stock_configuration -msgid "Configuration" -msgstr "Configuración" - -#. module: stock -#: field:stock.inventory.line.split,use_exist:0 -#: field:stock.move.split,use_exist:0 -msgid "Existing Lots" -msgstr "Lotes existentes" - -#. module: stock -#: field:product.product,location_id:0 -#: view:stock.location:0 -msgid "Stock Location" -msgstr "Ubicación de stock" - -#. module: stock -#: help:stock.change.standard.price,new_price:0 -msgid "If cost price is increased, stock variation account will be debited and stock output account will be credited with the value = (difference of amount * quantity available).\n" -"If cost price is decreased, stock variation account will be creadited and stock input account will be debited." -msgstr "Si el precio de coste se incrementa, la cuenta la variación de existencias irá al debe y la cuenta de salida de stock irá al haber con el valor = (diferencia de cantidad * cantidad disponible).\n" -"Si el precio de coste se reduce, la cuenta la variación de existencias irá al haber y la cuenta de entrada de stock irá al debe." - -#. module: stock -#: field:stock.location,chained_journal_id:0 -msgid "Chaining Journal" -msgstr "Diario encadenamiento" - -#. module: stock -#: code:addons/stock/stock.py:732 -#, python-format -msgid "Not enough stock, unable to reserve the products." -msgstr "No suficiente stock, no ha sido posible reservar los productos." - -#. module: stock -#: model:stock.location,name:stock.stock_location_customers -msgid "Customers" -msgstr "Clientes" - -#. module: stock -#: code:addons/stock/stock.py:1317 -#, python-format -msgid "is cancelled." -msgstr "está cancelado." - -#. module: stock -#: view:stock.inventory.line:0 -msgid "Stock Inventory Lines" -msgstr "Líneas regularización de inventario" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_picking.py:97 -#, python-format -msgid "Process Document" -msgstr "Procesar documento" - -#. module: stock -#: code:addons/stock/product.py:365 -#, python-format -msgid "Future Deliveries" -msgstr "Entregas futuras" - -#. module: stock -#: view:stock.picking:0 -msgid "Additional info" -msgstr "Información adicional" - -#. module: stock -#: view:stock.move:0 -#: field:stock.move,tracking_id:0 -msgid "Pack" -msgstr "Paquete" - -#. module: stock -#: view:stock.move:0 -#: view:stock.picking:0 -msgid "Date Expected" -msgstr "Fecha prevista" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_picking_tree4 -msgid "The Incoming Shipments is the list of all orders you will receive from your supplier. An incoming shipment contains a list of products to be received according to the original purchase order. You can validate the shipment totally or partially." -msgstr "Las ordenes de entrada son la lista de todos los pedidos que va a recibir de su proveedor. Una orden de entrada contiene la lista de productos a recibir en función del pedido de compra original. Puede validar el envío totalmente o parcialmente." - -#. module: stock -#: field:stock.move,auto_validate:0 -msgid "Auto Validate" -msgstr "Auto validar" - -#. module: stock -#: report:stock.picking.list:0 -msgid "Weight" -msgstr "Peso" - -#. module: stock -#: model:ir.model,name:stock.model_product_template -msgid "Product Template" -msgstr "Plantilla de producto" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "December" -msgstr "Diciembre" - -#. module: stock -#: selection:stock.location,chained_auto_packing:0 -msgid "Automatic Move" -msgstr "Movimiento automático" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_move_form2 -msgid "This menu gives you the full traceability of inventory operations on a specific product. You can filter on the product to see all the past or future movements for the product." -msgstr "Este menú le da la trazabilidad completa de las operaciones de inventario sobre un producto específico. Puede filtrar sobre el producto para ver todos los movimientos pasados o futuros para el producto." - -#. module: stock -#: view:stock.picking:0 -msgid "Return Products" -msgstr "Devolver productos" - -#. module: stock -#: view:stock.inventory:0 -msgid "Validate Inventory" -msgstr "Validar inventario" - -#. module: stock -#: help:stock.move,price_currency_id:0 -msgid "Technical field used to record the currency chosen by the user during a picking confirmation (when average price costing method is used)" -msgstr "Campo técnico utilizado para registrar la moneda elegida por el usuario durante una confirmación de orden (cuando se utiliza el método de precio medio de coste)." - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_stock_products_moves -msgid "Products Moves" -msgstr "Movimientos de productos" - -#. module: stock -#: selection:stock.picking,invoice_state:0 -msgid "Invoiced" -msgstr "Facturado" - -#. module: stock -#: field:stock.move,address_id:0 -msgid "Destination Address" -msgstr "Dirección destino" - -#. module: stock -#: field:stock.picking,max_date:0 -msgid "Max. Expected Date" -msgstr "Fecha prevista máx." - -#. module: stock -#: field:stock.picking,auto_picking:0 -msgid "Auto-Picking" -msgstr "Auto-Orden" - -#. module: stock -#: field:stock.location,chained_auto_packing:0 -msgid "Chaining Type" -msgstr "Tipo encadenado" - -#. module: stock -#: view:report.stock.inventory:0 -#: view:report.stock.move:0 -#: selection:report.stock.move,type:0 -#: view:stock.location:0 -#: selection:stock.location,chained_picking_type:0 -#: selection:stock.picking,type:0 -msgid "Internal" -msgstr "Interno" - -#. module: stock -#: selection:report.stock.inventory,state:0 -#: selection:report.stock.move,state:0 -#: selection:stock.inventory,state:0 -#: selection:stock.move,state:0 -#: selection:stock.picking,state:0 -msgid "Draft" -msgstr "Borrador" - -#. module: stock -#: model:ir.actions.report.xml,name:stock.report_stock_inventory_move -#: report:stock.inventory.move:0 -msgid "Stock Inventory" -msgstr "Inventario stock" - -#. module: stock -#: help:report.stock.inventory,state:0 -msgid "When the stock move is created it is in the 'Draft' state.\n" -" After that it is set to 'Confirmed' state.\n" -" If stock is available state is set to 'Avaiable'.\n" -" When the picking it done the state is 'Done'. \n" -"The state is 'Waiting' if the move is waiting for another one." -msgstr "Cuando se crea un movimiento de stock está en estado 'Borrador'.\n" -" Después se establece en estado 'Confirmado'.\n" -" Si está reservado en stock se establece como 'Reservado'.\n" -" Cuando la orden se envía el estado es 'Realizado'. \n" -"El estado es 'En espera' si el movimiento está a la espera de otro." - -#. module: stock -#: view:board.board:0 -msgid "Outgoing Products Delay" -msgstr "Retraso ordenes salida" - -#. module: stock -#: field:stock.move.split.lines,use_exist:0 -msgid "Existing Lot" -msgstr "Lote existente" - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:194 -#, python-format -msgid "Please specify at least one non-zero quantity!" -msgstr "¡Introduzca por lo menos una cantidad que no sea cero!" - -#. module: stock -#: help:product.template,property_stock_procurement:0 -msgid "For the current product, this stock location will be used, instead of the default one, as the source location for stock moves generated by procurements" -msgstr "Para los productos actuales, esta ubicación de stock se utilizará, en lugar de la por defecto, como la ubicación de origen para los movimientos de stock generados por los abastecimientos." - -#. module: stock -#: code:addons/stock/stock.py:1316 -#, python-format -msgid "is ready to process." -msgstr "preparado para procesar." - -#. module: stock -#: help:stock.picking,origin:0 -msgid "Reference of the document that produced this picking." -msgstr "Referencia del documento que ha generado esta orden." - -#. module: stock -#: field:stock.fill.inventory,set_stock_zero:0 -msgid "Set to zero" -msgstr "Inicializar a cero" - -#. module: stock -#: code:addons/stock/wizard/stock_invoice_onshipping.py:87 -#, python-format -msgid "None of these picking lists require invoicing." -msgstr "Ninguno de estas ordenes requiere facturación." - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "November" -msgstr "Noviembre" - -#. module: stock -#: code:addons/stock/product.py:101 -#: code:addons/stock/stock.py:2018 -#, python-format -msgid "There is no journal defined on the product category: \"%s\" (id: %d)" -msgstr "No se ha definido un diario en la categoría de producto: \"%s\" (id: %d)" - -#. module: stock -#: code:addons/stock/product.py:379 -#, python-format -msgid "Unplanned Qty" -msgstr "Ctdad no planificada" - -#. module: stock -#: code:addons/stock/stock.py:1315 -#, python-format -msgid "is scheduled" -msgstr "está planificado" - -#. module: stock -#: field:stock.location,chained_company_id:0 -msgid "Chained Company" -msgstr "Compañía encadenada" - -#. module: stock -#: view:stock.picking:0 -msgid "Check Availability" -msgstr "Comprobar disponibilidad" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "January" -msgstr "Enero" - -#. module: stock -#: help:product.product,track_incoming:0 -msgid "Forces to specify a Production Lot for all moves containing this product and coming from a Supplier Location" -msgstr "Fuerza a introducir un lote de producción para todos los movimientos que contiene este producto y procedente de una ubicación de proveedores." - -#. module: stock -#: model:ir.actions.act_window,name:stock.act_product_stock_move_futur_open -msgid "Future Stock Moves" -msgstr "Movimientos de stock futuros" - -#. module: stock -#: field:stock.move,move_history_ids2:0 -msgid "Move History (parent moves)" -msgstr "Historial movimientos (mov. padres)" - -#. module: stock -#: code:addons/stock/product.py:361 -#, python-format -msgid "Future Stock" -msgstr "Stock futuro" - -#. module: stock -#: code:addons/stock/stock.py:512 -#: code:addons/stock/stock.py:1120 -#: code:addons/stock/stock.py:1128 -#: code:addons/stock/wizard/stock_invoice_onshipping.py:101 -#, python-format -msgid "Error" -msgstr "Error" - -#. module: stock -#: field:stock.ups.final,xmlfile:0 -msgid "XML File" -msgstr "Fichero XML" - -#. module: stock -#: view:stock.change.product.qty:0 -msgid "Select Quantity" -msgstr "Seleccionar cantidad" - -#. module: stock -#: model:ir.actions.act_window,help:stock.action_location_tree -msgid "This is the structure of your company's warehouses and locations. You can click on a location to get the list of the products and their stock level in this particular location and all its children." -msgstr "Esta es la estructura de los almacenes y ubicaciones de su compañía. Puede pulsar sobre una ubicación para obtener la lista de los productos y su nivel de stock en esta ubicación específica y todos sus hijas." - -#. module: stock -#: model:res.request.link,name:stock.req_link_tracking -#: field:stock.change.product.qty,prodlot_id:0 -#: field:stock.inventory.line,prod_lot_id:0 -#: report:stock.inventory.move:0 -#: field:stock.move,prodlot_id:0 -#: field:stock.move.memory.in,prodlot_id:0 -#: field:stock.move.memory.out,prodlot_id:0 -#: field:stock.move.split.lines.exist,prodlot_id:0 -#: view:stock.production.lot:0 -#: field:stock.production.lot,name:0 -msgid "Production Lot" -msgstr "Lote de producción" - -#. module: stock -#: model:ir.ui.menu,name:stock.menu_traceability -#: view:stock.move:0 -#: view:stock.picking:0 -#: view:stock.production.lot:0 -#: view:stock.tracking:0 -msgid "Traceability" -msgstr "Trazabilidad" - -#. module: stock -#: view:stock.picking:0 -msgid "To invoice" -msgstr "Para facturar" - -#. module: stock -#: model:ir.actions.act_window,name:stock.action_location_form -#: model:ir.ui.menu,name:stock.menu_action_location_form -#: view:stock.picking:0 -msgid "Locations" -msgstr "Ubicaciones" - -#. module: stock -#: view:stock.picking:0 -msgid "General Information" -msgstr "Información general" - -#. module: stock -#: field:stock.production.lot,prefix:0 -msgid "Prefix" -msgstr "Prefijo" - -#. module: stock -#: code:addons/stock/wizard/stock_splitinto.py:53 -#, python-format -msgid "Total quantity after split exceeds the quantity to split for this product: \"%s\" (id: %d)" -msgstr "Cantidad total después de que la división exceda la cantidad para dividir para este producto: \"%s\" (id: %d)" - -#. module: stock -#: view:stock.move:0 -#: field:stock.partial.move,product_moves_in:0 -#: field:stock.partial.move,product_moves_out:0 -#: field:stock.partial.picking,product_moves_in:0 -#: field:stock.partial.picking,product_moves_out:0 -msgid "Moves" -msgstr "Movimientos" - -#. module: stock -#: view:report.stock.move:0 -#: field:report.stock.move,location_dest_id:0 -#: field:stock.picking,location_dest_id:0 -msgid "Dest. Location" -msgstr "Ubicación destino" - -#. module: stock -#: help:stock.move,product_packaging:0 -msgid "It specifies attributes of packaging like type, quantity of packaging,etc." -msgstr "Indica los atributos del empaquetado como el tipo, la cantidad de paquetes, etc." - -#. module: stock -#: code:addons/stock/stock.py:2382 -#, python-format -msgid "quantity." -msgstr "cantidad." - -#. module: stock -#: constraint:stock.move:0 -msgid "You must assign a production lot for this product" -msgstr "Debe asignar un lote de producción para este producto" - -#. module: stock -#: view:stock.move:0 -msgid "Expected" -msgstr "Previsto" - -#. module: stock -#: selection:report.stock.inventory,location_type:0 -#: model:stock.location,name:stock.location_production -#: selection:stock.location,usage:0 -msgid "Production" -msgstr "Producción" - -#. module: stock -#: view:stock.split.into:0 -msgid "Split Move" -msgstr "Dividir movimiento" - -#. module: stock -#: code:addons/stock/wizard/stock_return_picking.py:92 -#, python-format -msgid "There are no products to return (only lines in Done state and not fully returned yet can be returned)!" -msgstr "¡No hay productos para devolver (sólo las líneas en estado Realizado y todavía no devueltas totalmente pueden ser devueltas)!" - -#. module: stock -#: help:stock.location,valuation_in_account_id:0 -msgid "This account will be used to value stock moves that have this location as destination, instead of the stock output account from the product." -msgstr "Esta cuenta sera usada para valorar movimientos de stock que tengan esta ubicacion como destino, en lugar de la cuenta de stock de salida del producto." - -#. module: stock -#: model:ir.model,name:stock.model_stock_move_split -msgid "Split in Production lots" -msgstr "Dividir en lotes de producción" - -#. module: stock -#: view:report.stock.inventory:0 -msgid "Real" -msgstr "Real" - -#. module: stock -#: report:stock.picking.list:0 -#: view:stock.production.lot.revision:0 -#: field:stock.production.lot.revision,description:0 -msgid "Description" -msgstr "Descripción" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "May" -msgstr "Mayo" - -#. module: stock -#: code:addons/stock/wizard/stock_partial_move.py:133 -#, python-format -msgid "Deliver" -msgstr "Enviar" - -#. module: stock -#: help:product.template,property_stock_account_output:0 -msgid "When doing real-time inventory valuation, counterpart Journal Items for all outgoing stock moves will be posted in this account. If not set on the product, the one from the product category is used." -msgstr "Al hacer la valoración de inventario en tiempo real, la contrapartida de los asientos del diario para todos los movimientos de stock de salida se creará en esta cuenta. Si no se indica en el producto, se utilizará la cuenta de la categoría del producto." - -#. module: stock -#: model:ir.actions.act_window,name:stock.action5 -#: view:stock.tracking:0 -msgid "Upstream traceability" -msgstr "Trazabilidad hacia arriba" - -#. module: stock -#: model:ir.actions.report.xml,name:stock.report_location_overview_all -#: report:lot.stock.overview_all:0 -msgid "Location Content" -msgstr "Contenido ubicación" - -#. module: stock -#: code:addons/stock/product.py:385 -#, python-format -msgid "Produced Qty" -msgstr "Ctdad producida" - -#. module: stock -#: field:product.category,property_stock_account_output_categ:0 -#: field:product.template,property_stock_account_output:0 -#: field:stock.change.standard.price,stock_account_output:0 -#: field:stock.location,valuation_out_account_id:0 -msgid "Stock Output Account" -msgstr "Cuenta salida stock" - -#. module: stock -#: view:stock.move:0 -msgid "Picking" -msgstr "Empaque" - -#. module: stock -#: model:ir.model,name:stock.model_stock_report_prodlots -msgid "Stock report by production lots" -msgstr "Reporte de inventario por lotes de producción" - -#. module: stock -#: view:stock.location:0 -#: selection:stock.location,chained_location_type:0 -#: view:stock.move:0 -msgid "Customer" -msgstr "Cliente" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "February" -msgstr "Febrero" - -#. module: stock -#: view:stock.production.lot:0 -msgid "Production Lot Identification" -msgstr "Identificación lote de producción" - -#. module: stock -#: field:stock.location,scrap_location:0 -#: view:stock.move.scrap:0 -msgid "Scrap Location" -msgstr "Ubicación desecho" - -#. module: stock -#: selection:report.stock.move,month:0 -msgid "April" -msgstr "Abril" - -#. module: stock -#: view:report.stock.inventory:0 -#: view:stock.move:0 -msgid "Future" -msgstr "Futuro" - -#. module: stock -#: field:stock.invoice.onshipping,invoice_date:0 -msgid "Invoiced date" -msgstr "Fecha facturado" - -#. module: stock -#: code:addons/stock/stock.py:732 -#: code:addons/stock/wizard/stock_invoice_onshipping.py:85 -#: code:addons/stock/wizard/stock_invoice_onshipping.py:87 -#: code:addons/stock/wizard/stock_return_picking.py:77 -#: code:addons/stock/wizard/stock_return_picking.py:92 -#: code:addons/stock/wizard/stock_return_picking.py:194 -#, python-format -msgid "Warning !" -msgstr "¡Aviso!" - -#. module: stock -#: model:stock.location,name:stock.stock_location_output -msgid "Output" -msgstr "Salida" - -#. module: stock -#: view:res.partner:0 -msgid "Sales & Purchases" -msgstr "Ventas & Compras" - -#. module: stock -#: selection:stock.move.split.lines,action:0 -msgid "Keep in one lot" -msgstr "Mantener en un lote" - -#. module: stock -#: view:product.product:0 -msgid "Cost Price:" -msgstr "Precio coste:" - -#. module: stock -#: help:stock.move,move_dest_id:0 -msgid "Optional: next stock move when chaining them" -msgstr "Opcional: Siguiente movimiento de stock cuando se encadenan." - -#. module: stock -#: view:report.stock.move:0 -#: field:report.stock.move,year:0 -msgid "Year" -msgstr "Año" - -#. module: stock -#: model:stock.location,name:stock.stock_location_locations -msgid "Physical Locations" -msgstr "Ubicaciones físicas" - -#. module: stock -#: model:ir.model,name:stock.model_stock_partial_move -msgid "Partial Move" -msgstr "Movimiento parcial" - -#. module: stock -#: help:stock.location,posx:0 -#: help:stock.location,posy:0 -#: help:stock.location,posz:0 -msgid "Optional localization details, for information purpose only" -msgstr "Detalles de ubicación opcionales, sólo para fines de información." - |
