import { Produto } from './produto'; import Imposto from './imposto/imposto'; import { Entity } from './entity'; import { Pedido } from './pedido'; import { Composto } from './composto'; import { get } from 'lodash'; import { Divisao } from './divisao'; import { ValorIngredienteAdicional } from './ingredientesAdicionais'; export declare class InfoComboEssencial { _id: string; // id do produto pai descricao: string; // descricao do produto pai fracionado?: Boolean; //meio a meio } export class ItemVenda extends Entity { public _entry: any; public _id_produto: any; public _id_combo: any; public observacao: string; public valor_unitario: number; public unidade: string; public estorno: boolean; public desconto: number; public outro: number; public grupo: any; public frete: number; public seguro: number; public ean: string; public codigo: string; public descricao: string; public label: string; public ncm: string; public cfop: string; public cbenef: string; public cest: string; public template: string; public extra_properties: any; public cortesia: boolean; public composicao_ativa: boolean; public quantidade: number; public imposto: Imposto; public valor_total: number; public valor_final: number; public prc_tx_servico: number; public comissao: number; public data_lancamento: string; public vendedor; public divisoes: Array; public compoe_total: boolean; public terminal: any; public combo: InfoComboEssencial; public impressora: string; public impresso: boolean; public _adicional : boolean; public ingredientes_adicionais: Array; public _changed: boolean; constructor(json?: any) { super(json, true); json = json || {}; let produto = json.produto || new Produto(json.produto); this._entry = json._entry || this._id; this.grupo = json.grupo || produto.grupo; this._id = json._id || produto._id; this._id_produto = json._id || produto._id; this._id_combo = json._id_combo || ''; this.terminal = json.terminal || ''; this.impressora = json.impressora || ''; this.impresso = get(json, 'impresso') || false; this.quantidade = json.quantidade || 1; this.outro = json.outro || 0.0; this.frete = json.frete || 0.0; this.seguro = json.seguro || 0.0; this.desconto = json.desconto || 0.0; this.observacao = json.observacao || produto.observacao || ''; this.label = json.label || produto.label || json.descricao || produto.descricao; this.estorno = json.estorno || false; this.ean = json.ean || produto.ean; this.codigo = json.codigo || produto.codigo; this.descricao = json.descricao || produto.descricao; this.ncm = json.ncm || produto.ncm; this.cfop = json.cfop || produto.cfop; this.cbenef = json.cbenef || produto.cbenef; this.cest = json.cest || produto.cest; this.unidade = json.unidade || get(produto, 'unidade_venda.nome') || 'UND'; this.valor_unitario = json.valor_unitario || produto.preco; this.valor_total = json.valor_total || this.valor_unitario * this.quantidade; this.valor_final = json.valor_final || this.valor_total + this.extra; this.extra_properties = json.extra_properties || produto.extra_properties; this.template = this.extra_properties && this.extra_properties.template || 'ticket'; this.cortesia = this.extra_properties ? !!this.extra_properties.cortesia : false; this.prc_tx_servico = json.comissao && !json.prc_tx_servico ? json.comissao / this.valor_final * 100 // Taxa de serviço recalculada com base na comissao : json.prc_tx_servico || produto.prc_tx_servico || 0.0; // Taxa de serviço provinda da base ou a partir do produto this.comissao = this.valor_final * ( this.prc_tx_servico / 100 ) || 0.0; this.data_lancamento = json.data_lancamento || new Date().toISOString(); this.vendedor = json.vendedor; this.divisoes = (json.divisoes || []).map(divisao => new Divisao(divisao)); this.ingredientes_adicionais = json && json.ingredientes_adicionais && new Array(...json.ingredientes_adicionais) || produto.ingredientes_adicionais || new Array(); this.compoe_total = json.compoe_total === false ? false : produto.compoe_total === false ? false : true; this.imposto = json.imposto; this.combo = json.combo || {}; this._adicional = json._adicional || false; this._changed = json._changed || false; this.calcularImposto(json.crtEmpresa, produto); } // methods public calcularImposto(crtEmpresa?, produto? : Produto) { this.imposto = new Imposto(Object.assign(this.imposto || {}, { quantidade: this.quantidade, valor_unitario: this.valor_unitario, extra: this.extra, crtEmpresa : crtEmpresa, produto : produto })); return this.imposto; } public estornar() { this.estorno = true; } get extra(): number { return this.outro + this.frete + this.seguro - this.desconto; } setQuantidade(quantidade: number, crtEmpresa) { this.quantidade = quantidade; this.recalc(false, crtEmpresa); } public recalc(changeValorTotal: boolean, crtEmpresa) { if (changeValorTotal) this.valor_unitario = this.valor_total / this.quantidade; this['_changed'] = true; this.valor_total = (this.valor_unitario * this.quantidade); this.valor_final = this.valor_total + this.extra; this.comissao = this.valor_final * ( this.prc_tx_servico / 100 ) || 0.0; return this.calcularImposto(crtEmpresa); } addDivisao(pedido: Pedido) { const porcentagem_faltante: number = 100 - this.divisoes.reduce((total, divisao: Divisao) => total += divisao.porcentagem, 0); if (!porcentagem_faltante) return; this.divisoes.push(new Divisao({porcentagem: porcentagem_faltante, pedido: pedido})); this['_changed'] = true; } }