def _run_import_model(self, context): """Import records of a configured model""" model = self.env[context.model_line.model_id.model] fields = self._run_import_model_get_fields(context) for data in context.remote.execute(model._name, 'read', context.ids, fields.keys()): self._run_import_get_record( context, model, data, create_dummy=False, ) if (model._name, data['id']) in context.idmap: # one of our mappings hit, create an xmlid to persist # this knowledge self._create_record_xmlid( model, context.idmap[(model._name, data['id'])], data['id']) if self.duplicates == 'skip': # there's a mapping for this record, nothing to do continue data = self._run_import_map_values(context, data) _id = data['id'] record = self._create_record(context, model, data) self._run_import_model_cleanup_dummies( context, model, _id, record.id, )
def analytic_fields_get(self, model, fields, prefix='a', suffix='id'): """Set the label values for the analytic fields.""" ans_dict = self.get_dimensions_names(model) regex = '{pre}(\d+)_{suf}'.format(pre=prefix, suf=suffix) match_fct = re.compile(regex).search matches = filter(None, map(match_fct, fields.keys())) for match in matches: field = match.group(0) slot = match.group(1) fields[field]['string'] = ans_dict.get( '{0}'.format(slot), '{0}{1}'.format(prefix.upper(), slot)) return fields
def _select_pos(self, fields=None): if not fields: fields = {} select_ = ''' -MIN(l.id) AS id, l.product_id AS product_id, t.uom_id AS product_uom, sum(l.qty) AS product_uom_qty, sum(l.qty) AS qty_delivered, 0 as qty_to_deliver, CASE WHEN pos.state = 'invoiced' THEN sum(l.qty) ELSE 0 END AS qty_invoiced, CASE WHEN pos.state != 'invoiced' THEN sum(l.qty) ELSE 0 END AS qty_to_invoice, SUM(l.price_subtotal_incl) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS price_total, SUM(l.price_subtotal) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS price_subtotal, (CASE WHEN pos.state != 'invoiced' THEN SUM(l.price_subtotal_incl) ELSE 0 END) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS amount_to_invoice, (CASE WHEN pos.state = 'invoiced' THEN SUM(l.price_subtotal_incl) ELSE 0 END) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS amount_invoiced, count(*) AS nbr, pos.name AS name, pos.date_order AS date, CASE WHEN pos.state = 'draft' THEN 'pos_draft' WHEN pos.state = 'done' THEN 'pos_done' else pos.state END AS state, pos.partner_id AS partner_id, pos.user_id AS user_id, pos.company_id AS company_id, NULL AS campaign_id, NULL AS medium_id, NULL AS source_id, extract(epoch from avg(date_trunc('day',pos.date_order)-date_trunc('day',pos.create_date)))/(24*60*60)::decimal(16,2) AS delay, t.categ_id AS categ_id, pos.pricelist_id AS pricelist_id, NULL AS analytic_account_id, pos.crm_team_id AS team_id, p.product_tmpl_id, partner.country_id AS country_id, partner.industry_id AS industry_id, partner.commercial_partner_id AS commercial_partner_id, (sum(t.weight) * l.qty / u.factor) AS weight, (sum(t.volume) * l.qty / u.factor) AS volume, l.discount as discount, sum((l.price_unit * l.discount * l.qty / 100.0 / CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END)) as discount_amount, NULL as order_id ''' for field in fields.keys(): select_ += ', NULL AS %s' % (field) return select_
def _query(self, with_clause='', fields={}, groupby='', from_clause=''): with_clause += ''', pol_tax AS (SELECT line_tax.pos_order_line_id AS pol_id,sum(tax.amount/100) AS amount FROM account_tax_pos_order_line_rel line_tax JOIN account_tax tax ON line_tax.account_tax_id = tax.id GROUP BY line_tax.pos_order_line_id)''' res = super(SaleReport, self)._query(with_clause, fields, groupby, from_clause) select_ = ''' MIN(l.id) AS id, l.product_id AS product_id, t.uom_id AS product_uom, sum(l.qty * u.factor) AS product_uom_qty, sum(l.qty * u.factor) AS qty_delivered, CASE WHEN pos.state = 'invoiced' THEN sum(qty) ELSE 0 END AS qty_invoiced, CASE WHEN pos.state != 'invoiced' THEN sum(qty) ELSE 0 END AS qty_to_invoice, COALESCE(COALESCE((l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) )) + (l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) ) * pol_tax.amount), (l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) ))), 1.0) AS price_total, COALESCE((l.qty * u.factor * l.price_unit * ((1 - COALESCE(l.discount / 100, 0)) )), 1.0) AS price_subtotal, CASE WHEN pos.state != 'invoiced' THEN ((l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)))) + (l.price_unit * l.qty * u.factor * (1 - COALESCE(l.discount / 100, 0)) * pol_tax.amount)) ELSE 0 END AS amount_to_invoice, CASE WHEN pos.state = 'invoiced' THEN ((l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) )) + (l.price_unit * l.qty * u.factor * (1 - COALESCE(l.discount / 100, 0)) * pol_tax.amount)) ELSE 0 END AS amount_invoiced, count(*) AS nbr, pos.name AS name, pos.date_order AS date, pos.date_order AS confirmation_date, CASE WHEN pos.state = 'draft' THEN 'pos_draft' WHEN pos.state = 'done' THEN 'pos_done' else pos.state END AS state, pos.partner_id AS partner_id, pos.user_id AS user_id, pos.company_id AS company_id, extract(epoch from avg(date_trunc('day',pos.date_order)-date_trunc('day',pos.create_date)))/(24*60*60)::decimal(16,2) AS delay, t.categ_id AS categ_id, pos.pricelist_id AS pricelist_id, NULL AS analytic_account_id, config.crm_team_id AS team_id, p.product_tmpl_id, partner.country_id AS country_id, partner.commercial_partner_id AS commercial_partner_id, (select sum(t.weight*l.qty/u.factor) from pos_order_line l join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) left join uom_uom u on (u.id=t.uom_id)) AS weight, (select sum(t.volume*l.qty/u.factor) from pos_order_line l join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) left join uom_uom u on (u.id=t.uom_id)) AS volume, l.discount as discount, sum((l.price_unit * l.discount / 100.0 / COALESCE(cr.rate, 1.0))) as discount_amount, NULL as order_id ''' for field in fields.keys(): select_ += ', NULL AS %s' % (field) from_ = ''' pos_order_line l join pos_order pos on (l.order_id=pos.id) left join res_partner partner ON (pos.partner_id = partner.id OR pos.partner_id = NULL) left join pol_tax pol_tax on pol_tax.pol_id=l.id left join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) LEFT JOIN uom_uom u ON (u.id=t.uom_id) LEFT JOIN pos_session session ON (session.id = pos.session_id) LEFT JOIN pos_config config ON (config.id = session.config_id) left join product_pricelist pp on (pos.pricelist_id = pp.id) left join currency_rate cr on (cr.currency_id = pp.currency_id and cr.company_id = pos.company_id and cr.date_start <= coalesce(pos.date_order, now()) and (cr.date_end is null or cr.date_end > coalesce(pos.date_order, now()))) ''' groupby_ = ''' l.order_id, l.product_id, l.price_unit, l.discount, l.qty, t.uom_id, t.categ_id, pos.name, pos.date_order, pos.partner_id, pos.user_id, pos.state, pos.company_id, pos.pricelist_id, p.product_tmpl_id, partner.country_id, partner.commercial_partner_id, pol_tax.amount, u.factor, config.crm_team_id ''' current = '(SELECT %s FROM %s GROUP BY %s)' % (select_, from_, groupby_) return '%s UNION ALL %s' % (res, current)
def _query(self, with_clause='', fields={}, groupby='', from_clause=''): with_clause += '''pol_tax AS (SELECT line_tax.pos_order_line_id AS pol_id,sum(tax.amount/100) AS amount FROM account_tax_pos_order_line_rel line_tax JOIN account_tax tax ON line_tax.account_tax_id = tax.id GROUP BY line_tax.pos_order_line_id)''' res = super(SaleReport, self)._query(with_clause, fields, groupby, from_clause) select_ = ''' MIN(l.id) AS id, l.product_id AS product_id, t.uom_id AS product_uom, sum(l.qty * u.factor) AS product_uom_qty, sum(l.qty * u.factor) AS qty_delivered, CASE WHEN pos.state = 'invoiced' THEN sum(qty) ELSE 0 END AS qty_invoiced, CASE WHEN pos.state != 'invoiced' THEN sum(qty) ELSE 0 END AS qty_to_invoice, (COALESCE(COALESCE((l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) )) + (l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) ) * pol_tax.amount), (l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) ))), 1.0)) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS price_total, (COALESCE((l.qty * u.factor * l.price_unit * ((1 - COALESCE(l.discount / 100, 0)) )), 1.0)) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS price_subtotal, (CASE WHEN pos.state != 'invoiced' THEN ((l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)))) + (l.price_unit * l.qty * u.factor * (1 - COALESCE(l.discount / 100, 0)) * pol_tax.amount)) ELSE 0 END) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS amount_to_invoice, (CASE WHEN pos.state = 'invoiced' THEN ((l.price_unit * l.qty * u.factor * ((1 - COALESCE(l.discount / 100, 0)) )) + (l.price_unit * l.qty * u.factor * (1 - COALESCE(l.discount / 100, 0)) * pol_tax.amount)) ELSE 0 END) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS amount_invoiced, count(*) AS nbr, pos.name AS name, pos.date_order AS date, pos.date_order AS confirmation_date, CASE WHEN pos.state = 'draft' THEN 'pos_draft' WHEN pos.state = 'done' THEN 'pos_done' else pos.state END AS state, pos.partner_id AS partner_id, pos.user_id AS user_id, pos.company_id AS company_id, NULL AS campaign_id, NULL AS medium_id, NULL AS source_id, extract(epoch from avg(date_trunc('day',pos.date_order)-date_trunc('day',pos.create_date)))/(24*60*60)::decimal(16,2) AS delay, t.categ_id AS categ_id, pos.pricelist_id AS pricelist_id, NULL AS analytic_account_id, config.crm_team_id AS team_id, p.product_tmpl_id, partner.country_id AS country_id, partner.industry_id AS industry_id, partner.commercial_partner_id AS commercial_partner_id, (select sum(t.weight*l.qty/u.factor) from pos_order_line l join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) left join uom_uom u on (u.id=t.uom_id)) AS weight, (select sum(t.volume*l.qty/u.factor) from pos_order_line l join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) left join uom_uom u on (u.id=t.uom_id)) AS volume, l.discount as discount, sum((l.price_unit * l.discount / 100.0 / CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END)) as discount_amount, NULL as order_id ''' for field in fields.keys(): select_ += ', NULL AS %s' % (field) from_ = ''' pos_order_line l join pos_order pos on (l.order_id=pos.id) left join res_partner partner ON (pos.partner_id = partner.id OR pos.partner_id = NULL) left join pol_tax pol_tax on pol_tax.pol_id=l.id left join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) LEFT JOIN uom_uom u ON (u.id=t.uom_id) LEFT JOIN pos_session session ON (session.id = pos.session_id) LEFT JOIN pos_config config ON (config.id = session.config_id) left join product_pricelist pp on (pos.pricelist_id = pp.id) ''' groupby_ = ''' l.order_id, l.product_id, l.price_unit, l.discount, l.qty, t.uom_id, t.categ_id, pos.name, pos.date_order, pos.partner_id, pos.user_id, pos.state, pos.company_id, pos.pricelist_id, p.product_tmpl_id, partner.country_id, partner.industry_id, partner.commercial_partner_id, pol_tax.amount, u.factor, config.crm_team_id ''' current = '(SELECT %s FROM %s GROUP BY %s)' % (select_, from_, groupby_) return '%s UNION ALL %s' % (res, current)
def _query(self, with_clause='', fields={}, groupby='', from_clause=''): res = super(SaleReport, self)._query(with_clause, fields, groupby, from_clause) select_ = ''' MIN(l.id) AS id, l.product_id AS product_id, t.uom_id AS product_uom, sum(l.qty) AS product_uom_qty, sum(l.qty) AS qty_delivered, CASE WHEN pos.state = 'invoiced' THEN sum(l.qty) ELSE 0 END AS qty_invoiced, CASE WHEN pos.state != 'invoiced' THEN sum(l.qty) ELSE 0 END AS qty_to_invoice, SUM(l.price_subtotal_incl) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS price_total, SUM(l.price_subtotal) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS price_subtotal, (CASE WHEN pos.state != 'invoiced' THEN SUM(l.price_subtotal_incl) ELSE 0 END) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS amount_to_invoice, (CASE WHEN pos.state = 'invoiced' THEN SUM(l.price_subtotal_incl) ELSE 0 END) / MIN(CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END) AS amount_invoiced, count(*) AS nbr, pos.name AS name, pos.date_order AS date, CASE WHEN pos.state = 'draft' THEN 'pos_draft' WHEN pos.state = 'done' THEN 'pos_done' else pos.state END AS state, pos.partner_id AS partner_id, pos.user_id AS user_id, pos.company_id AS company_id, NULL AS campaign_id, NULL AS medium_id, NULL AS source_id, extract(epoch from avg(date_trunc('day',pos.date_order)-date_trunc('day',pos.create_date)))/(24*60*60)::decimal(16,2) AS delay, t.categ_id AS categ_id, pos.pricelist_id AS pricelist_id, NULL AS analytic_account_id, pos.crm_team_id AS team_id, p.product_tmpl_id, partner.country_id AS country_id, partner.industry_id AS industry_id, partner.commercial_partner_id AS commercial_partner_id, (sum(t.weight) * l.qty / u.factor) AS weight, (sum(t.volume) * l.qty / u.factor) AS volume, l.discount as discount, sum((l.price_unit * l.discount * l.qty / 100.0 / CASE COALESCE(pos.currency_rate, 0) WHEN 0 THEN 1.0 ELSE pos.currency_rate END)) as discount_amount, NULL as order_id ''' for field in fields.keys(): select_ += ', NULL AS %s' % (field) from_ = ''' pos_order_line l join pos_order pos on (l.order_id=pos.id) left join res_partner partner ON (pos.partner_id = partner.id OR pos.partner_id = NULL) left join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) LEFT JOIN uom_uom u ON (u.id=t.uom_id) LEFT JOIN pos_session session ON (session.id = pos.session_id) LEFT JOIN pos_config config ON (config.id = session.config_id) left join product_pricelist pp on (pos.pricelist_id = pp.id) ''' groupby_ = ''' l.order_id, l.product_id, l.price_unit, l.discount, l.qty, t.uom_id, t.categ_id, pos.name, pos.date_order, pos.partner_id, pos.user_id, pos.state, pos.company_id, pos.pricelist_id, p.product_tmpl_id, partner.country_id, partner.industry_id, partner.commercial_partner_id, u.factor, pos.crm_team_id ''' current = '(SELECT %s FROM %s GROUP BY %s)' % (select_, from_, groupby_) return '%s UNION ALL %s' % (res, current)
def sync_product(self): config_ids = self._context['active_ids'] configs = self.env['pos.product.sync'].search( [('id', 'in', config_ids)], limit=1) for config in configs: ROOT = 'http://' + config.ip_address + '/xmlrpc/' DB = config.database_name PASS = config.password USER = config.username uid = xmlrpclib.ServerProxy(ROOT + 'common').login(DB, USER, PASS) sock = xmlrpclib.ServerProxy(ROOT + 'object') products = sock.execute(DB, uid, PASS, 'product.product', 'search_read', []) fields = sock.execute(DB, uid, PASS, 'product.product', 'fields_get', []) for product_dict in products: for field_name in fields.keys(): field = fields[field_name] if field['type'] in ['many2one']: field_item = product_dict[field_name] if field_item: if field_name in [ 'product_tmpl_id', 'product_variant_id' ]: del product_dict[field_name] elif field_name in [ 'write_uid', 'create_uid', 'currency_id' ]: del product_dict[field_name] else: product_dict[field_name] = field_item[0] # TODO: Check external data related_model = field['relation'] exist_item = self.env[related_model].search( [('id', '=', field_item[0])], limit=1) if not exist_item and not exist_item.id: if field_name in ['uom_id', 'uom_po_id']: del product_dict[field_name] else: self.env[related_model].create({ 'id': field_item[0], 'name': field_item[1], }) else: exist_item.write({ 'name': field_item[1], }) elif field['type'] in ['many2many', 'one2many']: del product_dict[field_name] else: if field_name in [ 'write_date', 'create_date', 'price' ]: del product_dict[field_name] elif field_name == 'id': product_dict['external_id'] = product_dict['id'] del product_dict['id'] if product_dict['default_code']: exist_product = self.env['product.product'].search( [('default_code', '=', product_dict['default_code'])], limit=1) else: exist_product = self.env['product.product'].search( [('external_id', '=', product_dict['external_id'])], limit=1) if exist_product and exist_product.id: exist_product.write(product_dict) else: self.env['product.product'].create(product_dict) return True