销售业务

销售业务

把产品和服务出售给客户

销售订单是源头数据,对于源头数据和关键主数据要严防死守

最容易出问题的地方,是订单的变更是否正确传达


业务场景

重点了解产品、订单获取方式



模块架构


对于价格而言,下游的单据不允许改单价,但是产品的标价是可以修改的,类似于服装店的吊牌价,在ERPNext中允许物料改负价,但不允许售价低于采购价和成本价,一般使用默认价格表

对于物料明细,允许相同物料号在不同行重复出现

对于订单防重,允许一张客户采购订单绑定多张销售订单


流程控制:有订单才能出库,有出库才能开票


ERPNext提供多种模板:税费模板、默认付款模板等



业务流程

详细的销售业务流程

流程不是固定的,可以是标准化的流程,也可以根据自身业务来更改流程

常规的步骤可以合并、可以根据自身需求修改

订单关闭后不会再做任何的需求


销售模块主要流程图


添加标题以增强此图像的含义。

Py脚本定制

对于复杂的业务功能可以使用py脚本来编写业务逻辑

单据导出到Excel模板,示例代码如下所示:

点击右侧面板中的"编辑",将其替换为您自己的 HTML 代码 def process_worksheet(ws, doc, language=None, bench_path=None): max_row, max_column = find_max_data_row_and_column(ws) rows, row = [], frappe._dict() rows_count, cur_row_index= 0, -1 i = 1 # row index with print_language(language): while i<= max_row and i<2000: for j in range(1, max_column+1): if j==1: #明细行第1列批注中设置子表字段,类似这样 rows=doc.items comment = ws.cell(row=i, column=j).comment if comment: comment = comment.text if comment[:4] == "row=": #这里不能用render_template因为其返回的是文本串,不是子表变量 rows = frappe.safe_eval(comment[4:], None, {"doc": doc}) ws.cell(row=i, column=j).comment.text = '' #清空 rows_count = len(rows) if rows_count>1: num_rows_to_insert = rows_count - 1 #插入在当前行之前,为了实现在当前行之后插入,设当前行为i+1 insert_rows_with_copy(ws, i+1, num_rows_to_insert) max_row += num_rows_to_insert # j==1表示按行来处理row的动态切换 if j==1 and rows and rows_count and cur_row_index < rows_count: cur_row_index += 1 row = rows[cur_row_index] text = str(ws.cell(row=i, column=j).value or '') if text and has_variable_string(text): try: value = frappe.render_template(text, {'doc':doc, 'row':row}) if value and value[0] == "/" and value[-4:] in ['.jpg','.png']: #公开文件路径中要加public,私有文件不用加 file = value if value[:9]=='/private/' else f'/public{value}' path = f"{bench_path}/sites/{frappe.local.site}{file}" add_image(ws, i, j, path) ws.cell(row=i, column=j).value = '' else: value = strip_html(value or '').replace('None', '') ws.cell(row=i, column=j).value = text if "{{ no such element:" in value else value except: if not text in logged_error and len(logged_error) < 10: logged_error.add(text) traceback = frappe.get_traceback(with_context=True) frappe.log_error("export excel render template error", traceback) #清空明细行相关变量 if rows and rows_count and (cur_row_index + 1) >= rows_count: rows_count, cur_row_index = 0, -1 rows, row =[], frappe._dict() i += 1


销售业务
刘旭晟 2024年11月12日
分析这篇文章

存档
登录 留下评论
Docker基础知识