Merge branch 'develop' into leaderboard
This commit is contained in:
commit
38794c0ca1
@ -5,7 +5,7 @@ import frappe
|
|||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
from frappe.utils import getdate
|
from frappe.utils import getdate
|
||||||
|
|
||||||
__version__ = '12.1.4'
|
__version__ = '12.1.5'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
@ -0,0 +1,809 @@
|
|||||||
|
{
|
||||||
|
"country_code": "sv",
|
||||||
|
"name": "El Salvador Standard",
|
||||||
|
"tree": {
|
||||||
|
"100000 - ACTIVOS - xmC": {
|
||||||
|
"11000000 - ACTIVOS CORRIENTES - xmC": {
|
||||||
|
"11010000 - EFECTIVO Y EQUIVALENTES AL EFECTIVO - xmC": {
|
||||||
|
"11010100 - Caja general - xmC": {
|
||||||
|
"account_number": "11010100",
|
||||||
|
"account_type": "Cash"
|
||||||
|
},
|
||||||
|
"Caja chica": {
|
||||||
|
"account_number": "11010200",
|
||||||
|
"account_type": "Cash",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Efectivo en bancos": {
|
||||||
|
"account_number": "11010300",
|
||||||
|
"account_type": "Bank",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "11010000",
|
||||||
|
"account_type": "Cash"
|
||||||
|
},
|
||||||
|
"CUENTAS POR COBRAR ARRENDAMIENTOS FINANCIEROS": {
|
||||||
|
"Arrendamientos financieros por cobrar": {
|
||||||
|
"account_number": "11040100",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Estimaci\u00f3n para cuentas de cobro dudoso (CR)": {
|
||||||
|
"account_number": "11040200",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "11040000"
|
||||||
|
},
|
||||||
|
"DEUDORES COMERCIALES Y OTRAS CUENTAS POR COBRAR": {
|
||||||
|
"11030100 - Deudores comerciales - xmC": {
|
||||||
|
"account_number": "11030100",
|
||||||
|
"account_type": "Receivable"
|
||||||
|
},
|
||||||
|
"Estimaci\u00f3n para cuentas de cobro dudoso (CR)": {
|
||||||
|
"account_number": "11030200",
|
||||||
|
"account_type": "Receivable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Otras cuentas por cobrar no comerciales": {
|
||||||
|
"account_number": "11030300",
|
||||||
|
"account_type": "Receivable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "11030000",
|
||||||
|
"account_type": "Receivable"
|
||||||
|
},
|
||||||
|
"GASTOS PAGADOS POR ANTICIPADO": {
|
||||||
|
"Adelantos a empleados": {
|
||||||
|
"account_number": "110904",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Papeler\u00eda y \u00fatiles en existencia": {
|
||||||
|
"account_number": "11090300",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Primas de seguros aun no vendidas": {
|
||||||
|
"account_number": "11090100",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Rentas aun no corridas por los inmuebles": {
|
||||||
|
"account_number": "11090200",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "11090000",
|
||||||
|
"account_type": "Temporary"
|
||||||
|
},
|
||||||
|
"INVENTARIOS": {
|
||||||
|
"11050100 - Inventarios en bodega al costo - xmC": {
|
||||||
|
"account_number": "11050100",
|
||||||
|
"account_type": "Stock"
|
||||||
|
},
|
||||||
|
"11050300 - Pedidos en transito - xmC": {
|
||||||
|
"account_number": "11050300",
|
||||||
|
"account_type": "Stock Received But Not Billed"
|
||||||
|
},
|
||||||
|
"Estimaci\u00f3n para obsolescencia de inventarios o de lento movimiento (CR)": {
|
||||||
|
"account_number": "11050200",
|
||||||
|
"account_type": "Stock",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Mercader\u00edas en consignaci\u00f3n": {
|
||||||
|
"account_number": "11050400",
|
||||||
|
"account_type": "Stock",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "11050000",
|
||||||
|
"account_type": "Stock"
|
||||||
|
},
|
||||||
|
"INVERSIONES TEMPORALES": {
|
||||||
|
"Acciones": {
|
||||||
|
"account_number": "11020100",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Bonos": {
|
||||||
|
"account_number": "11020200",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"C\u00e9dulas hipotecarias": {
|
||||||
|
"account_number": "11020300",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "11020000",
|
||||||
|
"account_type": "Temporary"
|
||||||
|
},
|
||||||
|
"IVA CREDITO FISCAL": {
|
||||||
|
"IVA compras locales": {
|
||||||
|
"account_number": "11060100",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1,
|
||||||
|
"tax_rate": 13.0
|
||||||
|
},
|
||||||
|
"IVA importaciones": {
|
||||||
|
"account_number": "11060200",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1,
|
||||||
|
"tax_rate": 13.0
|
||||||
|
},
|
||||||
|
"account_number": "11060000",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"tax_rate": 13.0
|
||||||
|
},
|
||||||
|
"IVA PERCIBIDO": {
|
||||||
|
"account_number": "IVA PERCIBIDO",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1,
|
||||||
|
"tax_rate": 1.0
|
||||||
|
},
|
||||||
|
"IVA RETENIDO": {
|
||||||
|
"account_number": "11070000",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1,
|
||||||
|
"tax_rate": 1.0
|
||||||
|
},
|
||||||
|
"account_number": "11000000"
|
||||||
|
},
|
||||||
|
"12000000 - ACTIVOS NO CORRIENTES - xmC": {
|
||||||
|
"ACTIVOS INTANGIBLES": {
|
||||||
|
"Concesiones y franquicias": {
|
||||||
|
"account_number": "12080300",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Derechos de llave": {
|
||||||
|
"account_number": "12080100",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Patentes y marcas de fabrica": {
|
||||||
|
"account_number": "12080200",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Software": {
|
||||||
|
"account_number": "12080400",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12080000",
|
||||||
|
"account_type": "Fixed Asset"
|
||||||
|
},
|
||||||
|
"CUENTAS POR COBRAR ARRENDAMIENTOS FINANCIEROS A LARGO PLAZO": {
|
||||||
|
"Arrendamientos financieros por cobrar a largo plazo": {
|
||||||
|
"account_number": "12060100",
|
||||||
|
"account_type": "Receivable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Estimaci\u00f3n para cuentas de cobro dudoso a largo plazo (CR)": {
|
||||||
|
"account_number": "12060200",
|
||||||
|
"account_type": "Receivable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12060000",
|
||||||
|
"account_type": "Receivable"
|
||||||
|
},
|
||||||
|
"DEPRECIACION ACUMULUDA (CR)": {
|
||||||
|
"12030100 - Deprec. acumulada de propiedades, planta y equipo propio al costo - xmC": {
|
||||||
|
"account_number": "12030100",
|
||||||
|
"account_type": "Accumulated Depreciation"
|
||||||
|
},
|
||||||
|
"Deprec. acumulada de prop., planta y equipo bajo arrend. Financiero": {
|
||||||
|
"account_number": "12030200",
|
||||||
|
"account_type": "Accumulated Depreciation",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Deprec. acumulada de revaluaos de propiedades, planta y equipo": {
|
||||||
|
"account_number": "12030300",
|
||||||
|
"account_type": "Accumulated Depreciation",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12030000",
|
||||||
|
"account_type": "Accumulated Depreciation"
|
||||||
|
},
|
||||||
|
"DEUDORES COMERCIALES Y OTRAS CUENTAS POR COBRAR A LARGO PLAZO": {
|
||||||
|
"12050100 - Deudores comerciales a largo plazo - xmC": {
|
||||||
|
"account_number": "12050100",
|
||||||
|
"account_type": "Receivable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Cuentas por cobrar no comerciales a largo plazo": {
|
||||||
|
"account_number": "12050300",
|
||||||
|
"account_type": "Receivable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Estimaci\u00f3n para cuentas de cobro dudoso a largo plazo (CR)": {
|
||||||
|
"account_number": "12050200",
|
||||||
|
"account_type": "Receivable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12050000",
|
||||||
|
"account_type": "Receivable"
|
||||||
|
},
|
||||||
|
"IMPUESTO SOBRE LA RENTA DIFERIDO-ACTIVO": {
|
||||||
|
"12070200 - Pago anticipados de impuestos sobre la renta - xmC": {
|
||||||
|
"account_number": "12070200",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Cr\u00e9dito impuestos sobre la renta de a\u00f1os anteriores": {
|
||||||
|
"account_number": "12070100",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12070000",
|
||||||
|
"account_type": "Tax"
|
||||||
|
},
|
||||||
|
"INVERSIONES PERMANENTES": {
|
||||||
|
"Inversiones en asociadas": {
|
||||||
|
"account_number": "12040200",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Inversiones en negocios conjuntos": {
|
||||||
|
"account_number": "12040300",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Inversiones en subsidiarias": {
|
||||||
|
"account_number": "12040100",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12040000",
|
||||||
|
"account_type": "Fixed Asset"
|
||||||
|
},
|
||||||
|
"PROPIEDADES, PLANTA Y EQUIPO": {
|
||||||
|
"12010300 - Maquinarias y equipos - xmC": {
|
||||||
|
"account_number": "12010300",
|
||||||
|
"account_type": "Fixed Asset"
|
||||||
|
},
|
||||||
|
"Edificios": {
|
||||||
|
"account_number": "12010200",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Mobiliario y equipo": {
|
||||||
|
"account_number": "12010400",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Terrenos": {
|
||||||
|
"account_number": "12010100",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Veh\u00edculos": {
|
||||||
|
"account_number": "12010500",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12010000",
|
||||||
|
"account_type": "Fixed Asset"
|
||||||
|
},
|
||||||
|
"REVALUACIONES DE PROPIEDADES, PLANTA Y EQUIPO": {
|
||||||
|
"Revaluaci\u00f3n de edificios": {
|
||||||
|
"account_number": "12020200",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Revaluaci\u00f3n de maquinarias y equipo": {
|
||||||
|
"account_number": "12020300",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Revaluaci\u00f3n de mobiliario y equipo": {
|
||||||
|
"account_number": "12020400",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Revaluaci\u00f3n de terrenos": {
|
||||||
|
"account_number": "12020100",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Revaluaci\u00f3n de veh\u00edculos": {
|
||||||
|
"account_number": "12020500",
|
||||||
|
"account_type": "Fixed Asset",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "12020000",
|
||||||
|
"account_type": "Fixed Asset"
|
||||||
|
},
|
||||||
|
"account_number": "12000000",
|
||||||
|
"account_type": "Fixed Asset"
|
||||||
|
},
|
||||||
|
"account_number": "100000",
|
||||||
|
"root_type": "Asset"
|
||||||
|
},
|
||||||
|
"20000000 - PASIVOS - xmC": {
|
||||||
|
"PASIVOS CORRIENTES": {
|
||||||
|
"ACREEDORES COMERCIALES Y OTRAS CUENTAS POR PAGAR": {
|
||||||
|
"21020100 - Cuentas por pagar comerciales - xmC": {
|
||||||
|
"account_number": "21020100",
|
||||||
|
"account_type": "Payable"
|
||||||
|
},
|
||||||
|
"Documentos por pagar comerciales": {
|
||||||
|
"account_number": "21020200",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "21020000",
|
||||||
|
"account_type": "Payable"
|
||||||
|
},
|
||||||
|
"BENEFICIOS A EMPLEADOS POR PAGAR": {
|
||||||
|
"Beneficios a corto plazo por pagar": {
|
||||||
|
"account_number": "21050100",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Beneficios post empleo por pagar": {
|
||||||
|
"account_number": "21050200",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "21050000",
|
||||||
|
"account_type": "Payable"
|
||||||
|
},
|
||||||
|
"DIVIDENDOS POR PAGAR": {
|
||||||
|
"account_number": "21080000",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"IMPUESTO SOBRE LA RENTA CORRIENTE POR PAGAR": {
|
||||||
|
"account_number": "21070000",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"IVA DEBITOS FISCALES": {
|
||||||
|
"Por ventas a consumidores": {
|
||||||
|
"account_number": "21060200",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Por ventas a contribuyentes": {
|
||||||
|
"account_number": "21060100",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "21060000",
|
||||||
|
"account_type": "Tax"
|
||||||
|
},
|
||||||
|
"OBLIGACIONES BAJO ARRENDAMIENTOS FINANCIEROS PORCION CORRIENTE": {
|
||||||
|
"Contratos bajo arrendamientos financieros": {
|
||||||
|
"account_number": "21030100",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "21030000",
|
||||||
|
"account_type": "Payable"
|
||||||
|
},
|
||||||
|
"OTROS ACREEDORES, RETENCIONES Y DESCUENTOS": {
|
||||||
|
"Cuentas por pagar a accionistas": {
|
||||||
|
"account_number": "21040400",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Descuentos": {
|
||||||
|
"account_number": "21040300",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Otros acreedores": {
|
||||||
|
"account_number": "21040100",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Retenciones": {
|
||||||
|
"account_number": "21040200",
|
||||||
|
"account_type": "Payable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "21040000",
|
||||||
|
"account_type": "Payable"
|
||||||
|
},
|
||||||
|
"PRESTAMOS Y SOBREGIROS BANCARIOS": {
|
||||||
|
"Porci\u00f3n corriente de prestamos bancarios a largo plazo": {
|
||||||
|
"account_number": "21010300",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Prestamos bancarios a corto plazo": {
|
||||||
|
"account_number": "21010100",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Sobregiros bancarios": {
|
||||||
|
"account_number": "21010200",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "21010000"
|
||||||
|
},
|
||||||
|
"account_number": "21000000"
|
||||||
|
},
|
||||||
|
"PASIVOS NO CORRIENTES": {
|
||||||
|
"ANTICIPOS Y GARANTIAS DE CLIENTES": {
|
||||||
|
"Anticipos de clientes": {
|
||||||
|
"account_number": "22040100",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Garant\u00edas de clientes": {
|
||||||
|
"account_number": "22040200",
|
||||||
|
"account_type": "Temporary",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "22040000",
|
||||||
|
"account_type": "Temporary"
|
||||||
|
},
|
||||||
|
"INTERES MINOTARIO": {
|
||||||
|
"Inter\u00e9s de accionista minotarios": {
|
||||||
|
"account_number": "22050100",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "22050000"
|
||||||
|
},
|
||||||
|
"OBLIGACIONES BAJO ARRENDAMIENTOS FINANCIEROS A LARGO PLAZO": {
|
||||||
|
"Contratos bajo arrendamientos financieros": {
|
||||||
|
"account_number": "22030100",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "22030000"
|
||||||
|
},
|
||||||
|
"OTROS PRESTAMOS A LARGO PLAZO": {
|
||||||
|
"account_number": "22020000",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"PRESTAMOS BANCARIOS A LARGO PLAZO": {
|
||||||
|
"account_number": "22010000",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "22000000"
|
||||||
|
},
|
||||||
|
"PROVISIONES": {
|
||||||
|
"IMPUESTOS SOBRE LA RENTA COMPLEMENTARIO": {
|
||||||
|
"Ejercicios anteriores": {
|
||||||
|
"account_number": "23010100",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "23010000",
|
||||||
|
"account_type": "Tax"
|
||||||
|
},
|
||||||
|
"PROVISION PARA OBLIGACIONES LABORALES": {
|
||||||
|
"Indemnizaci\u00f3n": {
|
||||||
|
"account_number": "23020100",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "23020000"
|
||||||
|
},
|
||||||
|
"account_number": "23000000"
|
||||||
|
},
|
||||||
|
"account_number": "20000000",
|
||||||
|
"root_type": "Liability"
|
||||||
|
},
|
||||||
|
"30000000 - PATRIMONIO - xmC": {
|
||||||
|
"CAPITAL, RESERVAS Y RESULTADOS": {
|
||||||
|
"CAPITAL SOCIAL": {
|
||||||
|
"Capital Social M\u00ednimo": {
|
||||||
|
"Capital Social M\u00ednimo NO Pagado": {
|
||||||
|
"account_number": "31010102",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Capital Social M\u00ednimo Suscrito": {
|
||||||
|
"account_number": "31010101",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "31010100",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"Capital Social Variable": {
|
||||||
|
"Capital Social Variable NO Pagado": {
|
||||||
|
"account_number": "31010202",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Capital Social Variable Suscrito": {
|
||||||
|
"account_number": "31010201",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "31010200",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"account_number": "31010000",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"DIVIDENDOS PAGADOS": {
|
||||||
|
"account_number": "31060000",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"GANANCIAS NO DISTRIBUIDAS": {
|
||||||
|
"De ejercicios anteriores": {
|
||||||
|
"account_number": "31020100",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Del presente ejercicio": {
|
||||||
|
"account_number": "31020200",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "31020000",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"GANANCIAS RESTRINGIDAS": {
|
||||||
|
"Reserva legal": {
|
||||||
|
"account_number": "31030100",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "31030000",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"PERDIDAS ACUMULADAS (CR)": {
|
||||||
|
"De ejercicios anteriores": {
|
||||||
|
"account_number": "31050100",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Del presente ejercicio": {
|
||||||
|
"account_number": "31050200",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "31050000",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"SUPERAVIT POR REVALUACIONES": {
|
||||||
|
"Super\u00e1vit por revaluaci\u00f3n de activos": {
|
||||||
|
"account_number": "31040100",
|
||||||
|
"account_type": "Equity",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "31040000",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"account_number": "31000000",
|
||||||
|
"account_type": "Equity"
|
||||||
|
},
|
||||||
|
"account_number": "30000000",
|
||||||
|
"root_type": "Equity"
|
||||||
|
},
|
||||||
|
"40000000 - CUENTAS DE RESULTADO DEUDORAS - xmC": {
|
||||||
|
"COSTOS Y GASTOS DE OPERACI\u00d3N": {
|
||||||
|
"41010000 - COSTO DE LAS VENTAS - xmC": {
|
||||||
|
"account_number": "41010000",
|
||||||
|
"account_type": "Cost of Goods Sold"
|
||||||
|
},
|
||||||
|
"GASTOS DE DEPARTAMENTO DE OPERACIONES": {
|
||||||
|
"41020600 - Depreciaciones y amortizaciones - xmC": {
|
||||||
|
"account_number": "41020600",
|
||||||
|
"account_type": "Depreciation"
|
||||||
|
},
|
||||||
|
"41020900 - Redondeos - xmC": {
|
||||||
|
"account_number": "41020900",
|
||||||
|
"account_type": "Round Off"
|
||||||
|
},
|
||||||
|
"Gastos operativos": {
|
||||||
|
"account_number": "41020700",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Mantenimientos": {
|
||||||
|
"account_number": "41020400",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Materiales y suministros": {
|
||||||
|
"Ajustes de Inventario": {
|
||||||
|
"account_number": "41020201",
|
||||||
|
"account_type": "Stock Adjustment"
|
||||||
|
},
|
||||||
|
"account_number": "41020200",
|
||||||
|
"account_type": "Chargeable"
|
||||||
|
},
|
||||||
|
"Seguros": {
|
||||||
|
"account_number": "41020500",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Servicios b\u00e1sicos": {
|
||||||
|
"account_number": "41020300",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Servicios y honorarios profesionales": {
|
||||||
|
"account_number": "41020800",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Sueldos y prestaciones laborales": {
|
||||||
|
"account_number": "41020100",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "41020000",
|
||||||
|
"account_type": "Expense Account"
|
||||||
|
},
|
||||||
|
"GASTOS DE VENTAS Y DISTRIBUCION": {
|
||||||
|
"Depreciaciones y amortizaciones": {
|
||||||
|
"account_number": "41030600",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Gastos operativos": {
|
||||||
|
"account_number": "41030700",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Mantenimientos": {
|
||||||
|
"account_number": "41030400",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Materiales y suministros": {
|
||||||
|
"account_number": "41030200",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Seguros": {
|
||||||
|
"account_number": "41030500",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Servicios b\u00e1sicos": {
|
||||||
|
"account_number": "41030300",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Servicios y honorarios profesionales": {
|
||||||
|
"account_number": "41030800",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Sueldos y prestaciones laborales": {
|
||||||
|
"account_number": "41030100",
|
||||||
|
"account_type": "Chargeable",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "41030000",
|
||||||
|
"account_type": "Expense Account"
|
||||||
|
},
|
||||||
|
"account_number": "41000000",
|
||||||
|
"account_type": "Expense Account"
|
||||||
|
},
|
||||||
|
"GASTOS DE IMPUESTO SOBRE LA RENTA": {
|
||||||
|
"GASTOS DE IMPUESTO SOBRE LA RENTA CORRIENTE": {
|
||||||
|
"account_number": "43010000",
|
||||||
|
"account_type": "Expense Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "43000000",
|
||||||
|
"account_type": "Expense Account"
|
||||||
|
},
|
||||||
|
"GASTOS DE NO OPERACI\u00d3N": {
|
||||||
|
"42020000 - GASTOS NO DEDUCIBLES - xmC": {
|
||||||
|
"Garant\u00eda por venta de productos": {
|
||||||
|
"account_number": "42020200",
|
||||||
|
"account_type": "Expense Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Impuesto sobre la renta complementario": {
|
||||||
|
"account_number": "42020100",
|
||||||
|
"account_type": "Tax",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "42020000",
|
||||||
|
"account_type": "Expense Account"
|
||||||
|
},
|
||||||
|
"GASTOS FINANCIEROS": {
|
||||||
|
"42010100 - Intereses - xmC": {
|
||||||
|
"account_number": "42010100",
|
||||||
|
"account_type": "Expense Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"42010300 - Diferenciales cambiarios - xmC": {
|
||||||
|
"account_number": "42010300",
|
||||||
|
"account_type": "Expense Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Comisiones bancarias": {
|
||||||
|
"account_number": "42010200",
|
||||||
|
"account_type": "Expense Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "42010000",
|
||||||
|
"account_type": "Expense Account"
|
||||||
|
},
|
||||||
|
"account_number": "42000000",
|
||||||
|
"account_type": "Expense Account"
|
||||||
|
},
|
||||||
|
"account_number": "40000000",
|
||||||
|
"root_type": "Expense"
|
||||||
|
},
|
||||||
|
"50000000 - CUENTAS DE RESULTADO ACREEDORAS - xmC": {
|
||||||
|
"INGRESOS DE NO OPERACI\u00d3N": {
|
||||||
|
"DIVIDENDOS GANADOS": {
|
||||||
|
"Dividendos devengados por inversiones": {
|
||||||
|
"account_number": "52020100",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "52020000",
|
||||||
|
"account_type": "Income Account"
|
||||||
|
},
|
||||||
|
"INGRESOS FINANCIEROS": {
|
||||||
|
"Comisiones": {
|
||||||
|
"account_number": "52010200",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Diferenciales cambiarios": {
|
||||||
|
"account_number": "52010300",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Intereses": {
|
||||||
|
"account_number": "52010100",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "52010000",
|
||||||
|
"account_type": "Income Account"
|
||||||
|
},
|
||||||
|
"OTROS INGRESOS": {
|
||||||
|
"Ingresos por activos dados en arrendamientos financieros": {
|
||||||
|
"account_number": "52030200",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Ingresos por conversi\u00f3n": {
|
||||||
|
"account_number": "52030100",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"Reintegros de seguros": {
|
||||||
|
"account_number": "52030300",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "52030000",
|
||||||
|
"account_type": "Income Account"
|
||||||
|
},
|
||||||
|
"account_number": "52000000",
|
||||||
|
"account_type": "Income Account"
|
||||||
|
},
|
||||||
|
"INGRESOS POR OPERACIONES CONTINUAS": {
|
||||||
|
"51010000 - VENTAS DE BIENES - xmC": {
|
||||||
|
"account_number": "51010000",
|
||||||
|
"account_type": "Income Account"
|
||||||
|
},
|
||||||
|
"VENTAS DE SERVICIOS": {
|
||||||
|
"account_number": "51020000",
|
||||||
|
"account_type": "Income Account",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "51000000",
|
||||||
|
"account_type": "Income Account"
|
||||||
|
},
|
||||||
|
"account_number": "50000000",
|
||||||
|
"root_type": "Income"
|
||||||
|
},
|
||||||
|
"60000000 - CUENTA LIQUIDADORA DE RESULTADOS - xmC": {
|
||||||
|
"CUENTA DE CIERRE": {
|
||||||
|
"PERDIDAS Y GANANCIAS": {
|
||||||
|
"account_number": "61010000",
|
||||||
|
"is_group": 1
|
||||||
|
},
|
||||||
|
"account_number": "61000000"
|
||||||
|
},
|
||||||
|
"account_number": "60000000",
|
||||||
|
"root_type": "Income"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -827,10 +827,10 @@ def get_opening_accounts(company):
|
|||||||
accounts = frappe.db.sql_list("""select
|
accounts = frappe.db.sql_list("""select
|
||||||
name from tabAccount
|
name from tabAccount
|
||||||
where
|
where
|
||||||
is_group=0 and report_type='Balance Sheet' and company=%s and
|
is_group=0 and report_type='Balance Sheet' and company={0} and
|
||||||
name not in (select distinct account from tabWarehouse where
|
name not in (select distinct account from tabWarehouse where
|
||||||
account is not null and account != '')
|
account is not null and account != '')
|
||||||
order by name asc""", frappe.db.escape(company))
|
order by name asc""".format(frappe.db.escape(company)))
|
||||||
|
|
||||||
return [{"account": a, "balance": get_balance_on(a)} for a in accounts]
|
return [{"account": a, "balance": get_balance_on(a)} for a in accounts]
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
"creation": "2013-05-21 16:16:39",
|
"creation": "2013-05-21 16:16:39",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"document_type": "Document",
|
"document_type": "Document",
|
||||||
|
"engine": "InnoDB",
|
||||||
"field_order": [
|
"field_order": [
|
||||||
"title",
|
"title",
|
||||||
"naming_series",
|
"naming_series",
|
||||||
@ -1146,6 +1147,7 @@
|
|||||||
"fieldname": "language",
|
"fieldname": "language",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"label": "Print Language",
|
"label": "Print Language",
|
||||||
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -1208,7 +1210,8 @@
|
|||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"in_standard_filter": 1,
|
"in_standard_filter": 1,
|
||||||
"label": "Status",
|
"label": "Status",
|
||||||
"options": "\nDraft\nReturn\nDebit Note Issued\nSubmitted\nPaid\nUnpaid\nOverdue\nCancelled"
|
"options": "\nDraft\nReturn\nDebit Note Issued\nSubmitted\nPaid\nUnpaid\nOverdue\nCancelled",
|
||||||
|
"print_hide": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "inter_company_invoice_reference",
|
"fieldname": "inter_company_invoice_reference",
|
||||||
@ -1284,7 +1287,7 @@
|
|||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
"idx": 204,
|
"idx": 204,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"modified": "2019-06-18 22:04:28.889159",
|
"modified": "2019-09-17 22:31:42.666601",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Purchase Invoice",
|
"name": "Purchase Invoice",
|
||||||
|
@ -364,7 +364,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
update_outstanding = "No" if (cint(self.is_paid) or self.write_off_account) else "Yes"
|
update_outstanding = "No" if (cint(self.is_paid) or self.write_off_account) else "Yes"
|
||||||
|
|
||||||
make_gl_entries(gl_entries, cancel=(self.docstatus == 2),
|
make_gl_entries(gl_entries, cancel=(self.docstatus == 2),
|
||||||
update_outstanding=update_outstanding, merge_entries=False)
|
update_outstanding=update_outstanding, merge_entries=False, from_repost=from_repost)
|
||||||
|
|
||||||
if update_outstanding == "No":
|
if update_outstanding == "No":
|
||||||
update_outstanding_amt(self.credit_to, "Supplier", self.supplier,
|
update_outstanding_amt(self.credit_to, "Supplier", self.supplier,
|
||||||
|
@ -591,7 +591,6 @@
|
|||||||
"oldfieldname": "purchase_order",
|
"oldfieldname": "purchase_order",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Purchase Order",
|
"options": "Purchase Order",
|
||||||
"print_hide": 1,
|
|
||||||
"read_only": 1,
|
"read_only": 1,
|
||||||
"search_index": 1
|
"search_index": 1
|
||||||
},
|
},
|
||||||
@ -607,6 +606,7 @@
|
|||||||
"fieldname": "include_exploded_items",
|
"fieldname": "include_exploded_items",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Include Exploded Items",
|
"label": "Include Exploded Items",
|
||||||
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -758,7 +758,7 @@
|
|||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"modified": "2019-06-02 06:36:17.078419",
|
"modified": "2019-09-17 22:32:05.984240",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Purchase Invoice Item",
|
"name": "Purchase Invoice Item",
|
||||||
|
@ -238,7 +238,7 @@ def get_contacts(customers):
|
|||||||
customers = [frappe._dict({'name': customers})]
|
customers = [frappe._dict({'name': customers})]
|
||||||
|
|
||||||
for data in customers:
|
for data in customers:
|
||||||
contact = frappe.db.sql(""" select email_id, phone from `tabContact`
|
contact = frappe.db.sql(""" select email_id, phone, mobile_no from `tabContact`
|
||||||
where is_primary_contact=1 and name in
|
where is_primary_contact=1 and name in
|
||||||
(select parent from `tabDynamic Link` where link_doctype = 'Customer' and link_name = %s
|
(select parent from `tabDynamic Link` where link_doctype = 'Customer' and link_name = %s
|
||||||
and parenttype = 'Contact')""", data.name, as_dict=1)
|
and parenttype = 'Contact')""", data.name, as_dict=1)
|
||||||
|
@ -698,7 +698,7 @@ class SalesInvoice(SellingController):
|
|||||||
cint(self.redeem_loyalty_points)) else "Yes"
|
cint(self.redeem_loyalty_points)) else "Yes"
|
||||||
|
|
||||||
make_gl_entries(gl_entries, cancel=(self.docstatus == 2),
|
make_gl_entries(gl_entries, cancel=(self.docstatus == 2),
|
||||||
update_outstanding=update_outstanding, merge_entries=False)
|
update_outstanding=update_outstanding, merge_entries=False, from_repost=from_repost)
|
||||||
|
|
||||||
if update_outstanding == "No":
|
if update_outstanding == "No":
|
||||||
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
|
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
|
||||||
|
@ -817,6 +817,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
if(reg.test(data.name.toLowerCase())
|
if(reg.test(data.name.toLowerCase())
|
||||||
|| reg.test(data.customer_name.toLowerCase())
|
|| reg.test(data.customer_name.toLowerCase())
|
||||||
|| (contact && reg.test(contact["phone"]))
|
|| (contact && reg.test(contact["phone"]))
|
||||||
|
|| (contact && reg.test(contact["mobile_no"]))
|
||||||
|| (data.customer_group && reg.test(data.customer_group.toLowerCase()))){
|
|| (data.customer_group && reg.test(data.customer_group.toLowerCase()))){
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -833,6 +834,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
if(contact && !c['phone']) {
|
if(contact && !c['phone']) {
|
||||||
c["phone"] = contact["phone"];
|
c["phone"] = contact["phone"];
|
||||||
c["email_id"] = contact["email_id"];
|
c["email_id"] = contact["email_id"];
|
||||||
|
c["mobile_no"] = contact["mobile_no"];
|
||||||
}
|
}
|
||||||
|
|
||||||
me.customers_mapper.push({
|
me.customers_mapper.push({
|
||||||
@ -842,9 +844,10 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({
|
|||||||
customer_group: c.customer_group,
|
customer_group: c.customer_group,
|
||||||
territory: c.territory,
|
territory: c.territory,
|
||||||
phone: contact ? contact["phone"] : '',
|
phone: contact ? contact["phone"] : '',
|
||||||
|
mobile_no: contact ? contact["mobile_no"] : '',
|
||||||
email_id: contact ? contact["email_id"] : '',
|
email_id: contact ? contact["email_id"] : '',
|
||||||
searchtext: ['customer_name', 'customer_group', 'name', 'value',
|
searchtext: ['customer_name', 'customer_group', 'name', 'value',
|
||||||
'label', 'email_id', 'phone']
|
'label', 'email_id', 'phone', 'mobile_no']
|
||||||
.map(key => c[key]).join(' ')
|
.map(key => c[key]).join(' ')
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
});
|
});
|
||||||
|
@ -59,7 +59,6 @@ class ReceivablePayableReport(object):
|
|||||||
self.invoices = set()
|
self.invoices = set()
|
||||||
|
|
||||||
def get_data(self):
|
def get_data(self):
|
||||||
t1 = now()
|
|
||||||
self.get_gl_entries()
|
self.get_gl_entries()
|
||||||
self.voucher_balance = OrderedDict()
|
self.voucher_balance = OrderedDict()
|
||||||
self.init_voucher_balance() # invoiced, paid, credit_note, outstanding
|
self.init_voucher_balance() # invoiced, paid, credit_note, outstanding
|
||||||
@ -73,6 +72,9 @@ class ReceivablePayableReport(object):
|
|||||||
# fetch future payments against invoices
|
# fetch future payments against invoices
|
||||||
self.get_future_payments()
|
self.get_future_payments()
|
||||||
|
|
||||||
|
# Get return entries
|
||||||
|
self.get_return_entries()
|
||||||
|
|
||||||
self.data = []
|
self.data = []
|
||||||
for gle in self.gl_entries:
|
for gle in self.gl_entries:
|
||||||
self.update_voucher_balance(gle)
|
self.update_voucher_balance(gle)
|
||||||
@ -91,6 +93,7 @@ class ReceivablePayableReport(object):
|
|||||||
party = gle.party,
|
party = gle.party,
|
||||||
posting_date = gle.posting_date,
|
posting_date = gle.posting_date,
|
||||||
remarks = gle.remarks,
|
remarks = gle.remarks,
|
||||||
|
account_currency = gle.account_currency,
|
||||||
invoiced = 0.0,
|
invoiced = 0.0,
|
||||||
paid = 0.0,
|
paid = 0.0,
|
||||||
credit_note = 0.0,
|
credit_note = 0.0,
|
||||||
@ -106,7 +109,6 @@ class ReceivablePayableReport(object):
|
|||||||
# get the row where this balance needs to be updated
|
# get the row where this balance needs to be updated
|
||||||
# if its a payment, it will return the linked invoice or will be considered as advance
|
# if its a payment, it will return the linked invoice or will be considered as advance
|
||||||
row = self.get_voucher_balance(gle)
|
row = self.get_voucher_balance(gle)
|
||||||
|
|
||||||
# gle_balance will be the total "debit - credit" for receivable type reports and
|
# gle_balance will be the total "debit - credit" for receivable type reports and
|
||||||
# and vice-versa for payable type reports
|
# and vice-versa for payable type reports
|
||||||
gle_balance = self.get_gle_balance(gle)
|
gle_balance = self.get_gle_balance(gle)
|
||||||
@ -131,7 +133,18 @@ class ReceivablePayableReport(object):
|
|||||||
|
|
||||||
if gle.against_voucher:
|
if gle.against_voucher:
|
||||||
# find invoice
|
# find invoice
|
||||||
voucher_balance = self.voucher_balance.get((gle.against_voucher_type, gle.against_voucher, gle.party))
|
against_voucher = gle.against_voucher
|
||||||
|
|
||||||
|
# If payment is made against credit note
|
||||||
|
# and credit note is made against a Sales Invoice
|
||||||
|
# then consider the payment against original sales invoice.
|
||||||
|
if gle.against_voucher_type in ('Sales Invoice', 'Purchase Invoice'):
|
||||||
|
if gle.against_voucher in self.return_entries:
|
||||||
|
return_against = self.return_entries.get(gle.against_voucher)
|
||||||
|
if return_against:
|
||||||
|
against_voucher = return_against
|
||||||
|
|
||||||
|
voucher_balance = self.voucher_balance.get((gle.against_voucher_type, against_voucher, gle.party))
|
||||||
|
|
||||||
if not voucher_balance:
|
if not voucher_balance:
|
||||||
# no invoice, this is an invoice / stand-alone payment / credit note
|
# no invoice, this is an invoice / stand-alone payment / credit note
|
||||||
@ -258,7 +271,6 @@ class ReceivablePayableReport(object):
|
|||||||
# customer / supplier name
|
# customer / supplier name
|
||||||
party_details = self.get_party_details(row.party)
|
party_details = self.get_party_details(row.party)
|
||||||
row.update(party_details)
|
row.update(party_details)
|
||||||
|
|
||||||
if self.filters.get(scrub(self.filters.party_type)):
|
if self.filters.get(scrub(self.filters.party_type)):
|
||||||
row.currency = row.account_currency
|
row.currency = row.account_currency
|
||||||
else:
|
else:
|
||||||
@ -423,6 +435,19 @@ class ReceivablePayableReport(object):
|
|||||||
if row.future_ref:
|
if row.future_ref:
|
||||||
row.future_ref = ', '.join(row.future_ref)
|
row.future_ref = ', '.join(row.future_ref)
|
||||||
|
|
||||||
|
def get_return_entries(self):
|
||||||
|
doctype = "Sales Invoice" if self.party_type == "Customer" else "Purchase Invoice"
|
||||||
|
filters={
|
||||||
|
'is_return': 1,
|
||||||
|
'docstatus': 1
|
||||||
|
}
|
||||||
|
party_field = scrub(self.filters.party_type)
|
||||||
|
if self.filters.get(party_field):
|
||||||
|
filters.update({party_field: self.filters.get(party_field)})
|
||||||
|
self.return_entries = frappe._dict(
|
||||||
|
frappe.get_all(doctype, filters, ['name', 'return_against'], as_list=1)
|
||||||
|
)
|
||||||
|
|
||||||
def set_ageing(self, row):
|
def set_ageing(self, row):
|
||||||
if self.filters.ageing_based_on == "Due Date":
|
if self.filters.ageing_based_on == "Due Date":
|
||||||
entry_date = row.due_date
|
entry_date = row.due_date
|
||||||
@ -689,11 +714,11 @@ class ReceivablePayableReport(object):
|
|||||||
def get_chart_data(self):
|
def get_chart_data(self):
|
||||||
rows = []
|
rows = []
|
||||||
for row in self.data:
|
for row in self.data:
|
||||||
rows.append(
|
values = [row.range1, row.range2, row.range3, row.range4, row.range5]
|
||||||
{
|
precision = cint(frappe.db.get_default("float_precision")) or 2
|
||||||
'values': [row.range1, row.range2, row.range3, row.range4, row.range5]
|
rows.append({
|
||||||
}
|
'values': [flt(val, precision) for val in values]
|
||||||
)
|
})
|
||||||
|
|
||||||
self.chart = {
|
self.chart = {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -5,6 +5,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe.utils import flt
|
from frappe.utils import flt
|
||||||
from frappe import msgprint, _
|
from frappe import msgprint, _
|
||||||
|
from frappe.model.meta import get_field_precision
|
||||||
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions
|
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions
|
||||||
|
|
||||||
def execute(filters=None):
|
def execute(filters=None):
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"add_total_row": 0,
|
"add_total_row": 1,
|
||||||
"creation": "2018-08-21 11:32:30.874923",
|
"creation": "2018-08-21 11:32:30.874923",
|
||||||
|
"disable_prepared_report": 0,
|
||||||
"disabled": 0,
|
"disabled": 0,
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Report",
|
"doctype": "Report",
|
||||||
|
@ -70,7 +70,7 @@ def get_result(filters):
|
|||||||
rate = [i.tax_withholding_rate for i in tds_doc.rates
|
rate = [i.tax_withholding_rate for i in tds_doc.rates
|
||||||
if i.fiscal_year == gle_map[d][0].fiscal_year]
|
if i.fiscal_year == gle_map[d][0].fiscal_year]
|
||||||
|
|
||||||
if rate and len(rate) > 0:
|
if rate and len(rate) > 0 and tds_deducted:
|
||||||
rate = rate[0]
|
rate = rate[0]
|
||||||
|
|
||||||
if getdate(filters.from_date) <= gle_map[d][0].posting_date \
|
if getdate(filters.from_date) <= gle_map[d][0].posting_date \
|
||||||
@ -164,7 +164,7 @@ def get_columns(filters):
|
|||||||
{
|
{
|
||||||
"label": _("TDS Rate %"),
|
"label": _("TDS Rate %"),
|
||||||
"fieldname": "tds_rate",
|
"fieldname": "tds_rate",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Percent",
|
||||||
"width": 90
|
"width": 90
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -267,6 +267,7 @@
|
|||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"label": "Last Purchase Rate",
|
"label": "Last Purchase Rate",
|
||||||
"options": "currency",
|
"options": "currency",
|
||||||
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -561,7 +562,8 @@
|
|||||||
"depends_on": "eval:parent.is_subcontracted == 'Yes'",
|
"depends_on": "eval:parent.is_subcontracted == 'Yes'",
|
||||||
"fieldname": "include_exploded_items",
|
"fieldname": "include_exploded_items",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Include Exploded Items"
|
"label": "Include Exploded Items",
|
||||||
|
"print_hide": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "section_break_56",
|
"fieldname": "section_break_56",
|
||||||
@ -701,7 +703,7 @@
|
|||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"modified": "2019-06-23 20:03:13.818917",
|
"modified": "2019-09-17 22:32:34.703923",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order Item",
|
"name": "Purchase Order Item",
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1195,8 +1195,10 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil
|
|||||||
child_item.rate = flt(d.get("rate"))
|
child_item.rate = flt(d.get("rate"))
|
||||||
|
|
||||||
if flt(child_item.price_list_rate):
|
if flt(child_item.price_list_rate):
|
||||||
child_item.discount_percentage = flt((1 - flt(child_item.rate) / flt(child_item.price_list_rate)) * 100.0, \
|
discount = flt((1 - flt(child_item.rate) / flt(child_item.price_list_rate)) * 100.0,
|
||||||
child_item.precision("discount_percentage"))
|
child_item.precision("discount_percentage"))
|
||||||
|
if discount > 0:
|
||||||
|
child_item.discount_percentage = discount
|
||||||
|
|
||||||
child_item.flags.ignore_validate_update_after_submit = True
|
child_item.flags.ignore_validate_update_after_submit = True
|
||||||
if new_child_flag:
|
if new_child_flag:
|
||||||
@ -1220,7 +1222,6 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil
|
|||||||
parent.update_status_updater()
|
parent.update_status_updater()
|
||||||
else:
|
else:
|
||||||
parent.check_credit_limit()
|
parent.check_credit_limit()
|
||||||
|
|
||||||
parent.save()
|
parent.save()
|
||||||
|
|
||||||
if parent_doctype == 'Purchase Order':
|
if parent_doctype == 'Purchase Order':
|
||||||
|
@ -598,6 +598,7 @@ class BuyingController(StockController):
|
|||||||
'item_code': d.item_code,
|
'item_code': d.item_code,
|
||||||
'via_stock_ledger': False,
|
'via_stock_ledger': False,
|
||||||
'company': self.company,
|
'company': self.company,
|
||||||
|
'supplier': self.supplier,
|
||||||
'actual_qty': d.qty,
|
'actual_qty': d.qty,
|
||||||
'purchase_document_type': self.doctype,
|
'purchase_document_type': self.doctype,
|
||||||
'purchase_document_no': self.name,
|
'purchase_document_no': self.name,
|
||||||
@ -625,6 +626,7 @@ class BuyingController(StockController):
|
|||||||
'asset_category': item_data.get('asset_category'),
|
'asset_category': item_data.get('asset_category'),
|
||||||
'location': row.asset_location,
|
'location': row.asset_location,
|
||||||
'company': self.company,
|
'company': self.company,
|
||||||
|
'supplier': self.supplier,
|
||||||
'purchase_date': self.posting_date,
|
'purchase_date': self.posting_date,
|
||||||
'calculate_depreciation': 1,
|
'calculate_depreciation': 1,
|
||||||
'purchase_receipt_amount': purchase_amount,
|
'purchase_receipt_amount': purchase_amount,
|
||||||
|
@ -283,7 +283,7 @@ def copy_attributes_to_variant(item, variant):
|
|||||||
if 'description' not in allow_fields:
|
if 'description' not in allow_fields:
|
||||||
if not variant.description:
|
if not variant.description:
|
||||||
variant.description = ""
|
variant.description = ""
|
||||||
|
else:
|
||||||
if item.variant_based_on=='Item Attribute':
|
if item.variant_based_on=='Item Attribute':
|
||||||
if variant.attributes:
|
if variant.attributes:
|
||||||
attributes_description = item.description + " "
|
attributes_description = item.description + " "
|
||||||
@ -291,7 +291,7 @@ def copy_attributes_to_variant(item, variant):
|
|||||||
attributes_description += "<div>" + d.attribute + ": " + cstr(d.attribute_value) + "</div>"
|
attributes_description += "<div>" + d.attribute + ": " + cstr(d.attribute_value) + "</div>"
|
||||||
|
|
||||||
if attributes_description not in variant.description:
|
if attributes_description not in variant.description:
|
||||||
variant.description += attributes_description
|
variant.description = attributes_description
|
||||||
|
|
||||||
def make_variant_item_code(template_item_code, template_item_name, variant):
|
def make_variant_item_code(template_item_code, template_item_name, variant):
|
||||||
"""Uses template's item code and abbreviations to make variant's item code"""
|
"""Uses template's item code and abbreviations to make variant's item code"""
|
||||||
|
@ -53,7 +53,7 @@ class TestOpportunity(unittest.TestCase):
|
|||||||
"link_name": customer.name
|
"link_name": customer.name
|
||||||
}]
|
}]
|
||||||
})
|
})
|
||||||
contact.add_email(new_lead_email_id)
|
contact.add_email(new_lead_email_id, is_primary=True)
|
||||||
contact.insert(ignore_permissions=True)
|
contact.insert(ignore_permissions=True)
|
||||||
|
|
||||||
opp_doc = frappe.get_doc(args).insert(ignore_permissions=True)
|
opp_doc = frappe.get_doc(args).insert(ignore_permissions=True)
|
||||||
|
@ -354,3 +354,53 @@ user_privacy_documents = [
|
|||||||
'personal_fields': ['contact_mobile', 'contact_display', 'customer_name'],
|
'personal_fields': ['contact_mobile', 'contact_display', 'customer_name'],
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
global_search_doctypes = [
|
||||||
|
{"doctype": "Customer", "index": 0},
|
||||||
|
{"doctype": "Supplier", "index": 1},
|
||||||
|
{"doctype": "Item", "index": 2},
|
||||||
|
{"doctype": "Warehouse", "index": 3},
|
||||||
|
{"doctype": "Account", "index": 4},
|
||||||
|
{"doctype": "Employee", "index": 5},
|
||||||
|
{"doctype": "BOM", "index": 6},
|
||||||
|
{"doctype": "Sales Invoice", "index": 7},
|
||||||
|
{"doctype": "Sales Order", "index": 8},
|
||||||
|
{"doctype": "Quotation", "index": 9},
|
||||||
|
{"doctype": "Work Order", "index": 10},
|
||||||
|
{"doctype": "Purchase Receipt", "index": 11},
|
||||||
|
{"doctype": "Purchase Invoice", "index": 12},
|
||||||
|
{"doctype": "Delivery Note", "index": 13},
|
||||||
|
{"doctype": "Stock Entry", "index": 14},
|
||||||
|
{"doctype": "Material Request", "index": 15},
|
||||||
|
{"doctype": "Delivery Trip", "index": 16},
|
||||||
|
{"doctype": "Pick List", "index": 17},
|
||||||
|
{"doctype": "Salary Slip", "index": 18},
|
||||||
|
{"doctype": "Leave Application", "index": 19},
|
||||||
|
{"doctype": "Expense Claim", "index": 20},
|
||||||
|
{"doctype": "Payment Entry", "index": 21},
|
||||||
|
{"doctype": "Lead", "index": 22},
|
||||||
|
{"doctype": "Opportunity", "index": 23},
|
||||||
|
{"doctype": "Item Price", "index": 24},
|
||||||
|
{"doctype": "Purchase Taxes and Charges Template", "index": 25},
|
||||||
|
{"doctype": "Sales Taxes and Charges", "index": 26},
|
||||||
|
{"doctype": "Asset", "index": 27},
|
||||||
|
{"doctype": "Project", "index": 28},
|
||||||
|
{"doctype": "Task", "index": 29},
|
||||||
|
{"doctype": "Timesheet", "index": 30},
|
||||||
|
{"doctype": "Issue", "index": 31},
|
||||||
|
{"doctype": "Serial No", "index": 32},
|
||||||
|
{"doctype": "Batch", "index": 33},
|
||||||
|
{"doctype": "Branch", "index": 34},
|
||||||
|
{"doctype": "Department", "index": 35},
|
||||||
|
{"doctype": "Employee Grade", "index": 36},
|
||||||
|
{"doctype": "Designation", "index": 37},
|
||||||
|
{"doctype": "Job Opening", "index": 38},
|
||||||
|
{"doctype": "Job Applicant", "index": 39},
|
||||||
|
{"doctype": "Job Offer", "index": 40},
|
||||||
|
{"doctype": "Salary Structure Assignment", "index": 41},
|
||||||
|
{"doctype": "Appraisal", "index": 42},
|
||||||
|
{"doctype": "Loan", "index": 43},
|
||||||
|
{"doctype": "Maintenance Schedule", "index": 44},
|
||||||
|
{"doctype": "Maintenance Visit", "index": 45},
|
||||||
|
{"doctype": "Warranty Claim", "index": 46},
|
||||||
|
]
|
@ -2,7 +2,7 @@
|
|||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 1,
|
||||||
"autoname": "HR-APP-.YYYY.-.#####",
|
"autoname": "HR-APP-.YYYY.-.#####",
|
||||||
"beta": 0,
|
"beta": 0,
|
||||||
"creation": "2013-01-29 19:25:37",
|
"creation": "2013-01-29 19:25:37",
|
||||||
@ -346,7 +346,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2019-06-21 16:15:43.552049",
|
"modified": "2019-07-21 16:15:43.552049",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Job Applicant",
|
"name": "Job Applicant",
|
||||||
|
@ -73,7 +73,7 @@ def make_contact(supplier):
|
|||||||
{'link_doctype': 'Supplier', 'link_name': supplier.supplier_name}
|
{'link_doctype': 'Supplier', 'link_name': supplier.supplier_name}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
contact.add_email(supplier.supplier_email)
|
contact.add_email(supplier.supplier_email, is_primary=True)
|
||||||
contact.insert()
|
contact.insert()
|
||||||
else:
|
else:
|
||||||
contact = frappe.get_doc('Contact', contact_name)
|
contact = frappe.get_doc('Contact', contact_name)
|
||||||
|
@ -3,6 +3,7 @@ import frappe
|
|||||||
def execute():
|
def execute():
|
||||||
frappe.reload_doc("support", "doctype", "issue_priority")
|
frappe.reload_doc("support", "doctype", "issue_priority")
|
||||||
frappe.reload_doc("support", "doctype", "service_level_priority")
|
frappe.reload_doc("support", "doctype", "service_level_priority")
|
||||||
|
frappe.reload_doc('support', 'doctype', 'issue')
|
||||||
|
|
||||||
set_issue_priority()
|
set_issue_priority()
|
||||||
set_priority_for_issue()
|
set_priority_for_issue()
|
||||||
|
@ -123,6 +123,7 @@
|
|||||||
"fieldtype": "Column Break"
|
"fieldtype": "Column Break"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_in_quick_entry": 1,
|
||||||
"fieldname": "project_template",
|
"fieldname": "project_template",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "From Template",
|
"label": "From Template",
|
||||||
@ -443,7 +444,7 @@
|
|||||||
"icon": "fa fa-puzzle-piece",
|
"icon": "fa fa-puzzle-piece",
|
||||||
"idx": 29,
|
"idx": 29,
|
||||||
"max_attachments": 4,
|
"max_attachments": 4,
|
||||||
"modified": "2019-07-16 11:11:12.343658",
|
"modified": "2019-09-24 15:02:50.208301",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Projects",
|
"module": "Projects",
|
||||||
"name": "Project",
|
"name": "Project",
|
||||||
|
@ -350,8 +350,10 @@ def make_contact(args, is_primary_contact=1):
|
|||||||
'link_name': args.get('name')
|
'link_name': args.get('name')
|
||||||
}]
|
}]
|
||||||
})
|
})
|
||||||
contact.add_email(args.get('email_id'))
|
if args.get('email_id'):
|
||||||
contact.add_phone(args.get('mobile_no'))
|
contact.add_email(args.get('email_id'), is_primary=True)
|
||||||
|
if args.get('mobile_no'):
|
||||||
|
contact.add_phone(args.get('mobile_no'), is_primary_mobile_no=True)
|
||||||
contact.insert()
|
contact.insert()
|
||||||
|
|
||||||
return contact
|
return contact
|
||||||
|
@ -34,11 +34,11 @@
|
|||||||
"fieldname": "bypass_credit_limit_check",
|
"fieldname": "bypass_credit_limit_check",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Bypass credit limit_check"
|
"label": "Bypass Credit Limit Check"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"modified": "2019-08-29 20:46:36.073953",
|
"modified": "2019-09-24 15:05:26.069911",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Customer Credit Limit",
|
"name": "Customer Credit Limit",
|
||||||
|
@ -31,7 +31,7 @@ class SMSCenter(Document):
|
|||||||
self.sales_partner.replace("'", "\'") or " and ifnull(dl.link_name, '') != ''"
|
self.sales_partner.replace("'", "\'") or " and ifnull(dl.link_name, '') != ''"
|
||||||
if self.send_to in ['All Contact', 'All Customer Contact', 'All Supplier Contact', 'All Sales Partner Contact']:
|
if self.send_to in ['All Contact', 'All Customer Contact', 'All Supplier Contact', 'All Sales Partner Contact']:
|
||||||
rec = frappe.db.sql("""select CONCAT(ifnull(c.first_name,''), ' ', ifnull(c.last_name,'')),
|
rec = frappe.db.sql("""select CONCAT(ifnull(c.first_name,''), ' ', ifnull(c.last_name,'')),
|
||||||
c.phone from `tabContact` c, `tabDynamic Link` dl where ifnull(c.phone,'')!='' and
|
c.mobile_no from `tabContact` c, `tabDynamic Link` dl where ifnull(c.mobile_no,'')!='' and
|
||||||
c.docstatus != 2 and dl.parent = c.name%s""" % where_clause)
|
c.docstatus != 2 and dl.parent = c.name%s""" % where_clause)
|
||||||
|
|
||||||
elif self.send_to == 'All Lead (Open)':
|
elif self.send_to == 'All Lead (Open)':
|
||||||
|
@ -9,6 +9,7 @@ from frappe import _
|
|||||||
from frappe.desk.page.setup_wizard.setup_wizard import make_records
|
from frappe.desk.page.setup_wizard.setup_wizard import make_records
|
||||||
from frappe.utils import cstr, getdate
|
from frappe.utils import cstr, getdate
|
||||||
from erpnext.accounts.doctype.account.account import RootNotEditable
|
from erpnext.accounts.doctype.account.account import RootNotEditable
|
||||||
|
from frappe.desk.doctype.global_search_settings.global_search_settings import update_global_search_doctypes
|
||||||
|
|
||||||
default_lead_sources = ["Existing Customer", "Reference", "Advertisement",
|
default_lead_sources = ["Existing Customer", "Reference", "Advertisement",
|
||||||
"Cold Calling", "Exhibition", "Supplier Reference", "Mass Mailing",
|
"Cold Calling", "Exhibition", "Supplier Reference", "Mass Mailing",
|
||||||
@ -274,6 +275,8 @@ def install(country=None):
|
|||||||
|
|
||||||
set_more_defaults()
|
set_more_defaults()
|
||||||
|
|
||||||
|
update_global_search_doctypes()
|
||||||
|
|
||||||
# path = frappe.get_app_path('erpnext', 'regional', frappe.scrub(country))
|
# path = frappe.get_app_path('erpnext', 'regional', frappe.scrub(country))
|
||||||
# if os.path.exists(path.encode("utf-8")):
|
# if os.path.exists(path.encode("utf-8")):
|
||||||
# frappe.get_attr("erpnext.regional.{0}.setup.setup_company_independent_fixtures".format(frappe.scrub(country)))()
|
# frappe.get_attr("erpnext.regional.{0}.setup.setup_company_independent_fixtures".format(frappe.scrub(country)))()
|
||||||
|
@ -55,8 +55,6 @@ def place_order():
|
|||||||
cart_settings = frappe.db.get_value("Shopping Cart Settings", None,
|
cart_settings = frappe.db.get_value("Shopping Cart Settings", None,
|
||||||
["company", "allow_items_not_in_stock"], as_dict=1)
|
["company", "allow_items_not_in_stock"], as_dict=1)
|
||||||
quotation.company = cart_settings.company
|
quotation.company = cart_settings.company
|
||||||
if not quotation.get("customer_address"):
|
|
||||||
throw(_("{0} is required").format(_(quotation.meta.get_label("customer_address"))))
|
|
||||||
|
|
||||||
quotation.flags.ignore_permissions = True
|
quotation.flags.ignore_permissions = True
|
||||||
quotation.submit()
|
quotation.submit()
|
||||||
|
@ -85,26 +85,13 @@ frappe.ui.form.on("Delivery Note", {
|
|||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
if (frm.doc.docstatus === 1 && frm.doc.is_return === 1 && frm.doc.per_billed !== 100) {
|
if (frm.doc.docstatus === 1 && frm.doc.is_return === 1 && frm.doc.per_billed !== 100) {
|
||||||
frm.add_custom_button(__('Credit Note'), function() {
|
frm.add_custom_button(__('Credit Note'), function() {
|
||||||
frappe.confirm(__("Are you sure you want to make credit note?"),
|
frappe.model.open_mapped_doc({
|
||||||
function() {
|
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice",
|
||||||
frm.trigger("make_credit_note");
|
frm: cur_frm,
|
||||||
}
|
})
|
||||||
);
|
|
||||||
}, __('Create'));
|
}, __('Create'));
|
||||||
|
|
||||||
frm.page.set_inner_btn_group_as_primary(__('Create'));
|
frm.page.set_inner_btn_group_as_primary(__('Create'));
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
make_credit_note: function(frm) {
|
|
||||||
frm.call({
|
|
||||||
method: "make_return_invoice",
|
|
||||||
doc: frm.doc,
|
|
||||||
freeze: true,
|
|
||||||
callback: function() {
|
|
||||||
frm.reload_doc();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -123,6 +110,9 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend(
|
|||||||
setup: function(doc) {
|
setup: function(doc) {
|
||||||
this.setup_posting_date_time_check();
|
this.setup_posting_date_time_check();
|
||||||
this._super(doc);
|
this._super(doc);
|
||||||
|
this.frm.make_methods = {
|
||||||
|
'Delivery Trip': this.make_delivery_trip,
|
||||||
|
};
|
||||||
},
|
},
|
||||||
refresh: function(doc, dt, dn) {
|
refresh: function(doc, dt, dn) {
|
||||||
var me = this;
|
var me = this;
|
||||||
@ -239,7 +229,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend(
|
|||||||
make_delivery_trip: function() {
|
make_delivery_trip: function() {
|
||||||
frappe.model.open_mapped_doc({
|
frappe.model.open_mapped_doc({
|
||||||
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_delivery_trip",
|
method: "erpnext.stock.doctype.delivery_note.delivery_note.make_delivery_trip",
|
||||||
frm: this.frm
|
frm: cur_frm
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -458,6 +458,9 @@ def make_sales_invoice(source_name, target_doc=None):
|
|||||||
doc = get_mapped_doc("Delivery Note", source_name, {
|
doc = get_mapped_doc("Delivery Note", source_name, {
|
||||||
"Delivery Note": {
|
"Delivery Note": {
|
||||||
"doctype": "Sales Invoice",
|
"doctype": "Sales Invoice",
|
||||||
|
"field_map": {
|
||||||
|
"is_return": "is_return"
|
||||||
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
"docstatus": ["=", 1]
|
"docstatus": ["=", 1]
|
||||||
}
|
}
|
||||||
|
@ -41,28 +41,15 @@ frappe.ui.form.on("Purchase Receipt", {
|
|||||||
|
|
||||||
if (frm.doc.docstatus === 1 && frm.doc.is_return === 1 && frm.doc.per_billed !== 100) {
|
if (frm.doc.docstatus === 1 && frm.doc.is_return === 1 && frm.doc.per_billed !== 100) {
|
||||||
frm.add_custom_button(__('Debit Note'), function() {
|
frm.add_custom_button(__('Debit Note'), function() {
|
||||||
frappe.confirm(__("Are you sure you want to make debit note?"),
|
frappe.model.open_mapped_doc({
|
||||||
function() {
|
method: "erpnext.stock.doctype.purchase_receipt.purchase_receipt.make_purchase_invoice",
|
||||||
frm.trigger("make_debit_note");
|
frm: cur_frm,
|
||||||
}
|
})
|
||||||
);
|
|
||||||
}, __('Create'));
|
}, __('Create'));
|
||||||
|
|
||||||
frm.page.set_inner_btn_group_as_primary(__('Create'));
|
frm.page.set_inner_btn_group_as_primary(__('Create'));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
make_debit_note: function(frm) {
|
|
||||||
frm.call({
|
|
||||||
method: "make_return_invoice",
|
|
||||||
doc: frm.doc,
|
|
||||||
freeze: true,
|
|
||||||
callback: function() {
|
|
||||||
frm.reload_doc();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
company: function(frm) {
|
company: function(frm) {
|
||||||
frm.trigger("toggle_display_account_head");
|
frm.trigger("toggle_display_account_head");
|
||||||
},
|
},
|
||||||
|
@ -426,16 +426,6 @@ class PurchaseReceipt(BuyingController):
|
|||||||
|
|
||||||
self.load_from_db()
|
self.load_from_db()
|
||||||
|
|
||||||
def make_return_invoice(self):
|
|
||||||
return_invoice = make_purchase_invoice(self.name)
|
|
||||||
return_invoice.is_return = True
|
|
||||||
return_invoice.save()
|
|
||||||
return_invoice.submit()
|
|
||||||
|
|
||||||
debit_note_link = frappe.utils.get_link_to_form('Purchase Invoice', return_invoice.name)
|
|
||||||
|
|
||||||
frappe.msgprint(_("Debit Note {0} has been created automatically").format(debit_note_link))
|
|
||||||
|
|
||||||
def update_billed_amount_based_on_po(po_detail, update_modified=True):
|
def update_billed_amount_based_on_po(po_detail, update_modified=True):
|
||||||
# Billed against Sales Order directly
|
# Billed against Sales Order directly
|
||||||
billed_against_po = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item`
|
billed_against_po = frappe.db.sql("""select sum(amount) from `tabPurchase Invoice Item`
|
||||||
@ -510,7 +500,8 @@ def make_purchase_invoice(source_name, target_doc=None):
|
|||||||
"Purchase Receipt": {
|
"Purchase Receipt": {
|
||||||
"doctype": "Purchase Invoice",
|
"doctype": "Purchase Invoice",
|
||||||
"field_map": {
|
"field_map": {
|
||||||
"supplier_warehouse":"supplier_warehouse"
|
"supplier_warehouse":"supplier_warehouse",
|
||||||
|
"is_return": "is_return"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
"docstatus": ["=", 1],
|
"docstatus": ["=", 1],
|
||||||
|
@ -523,7 +523,6 @@
|
|||||||
"oldfieldname": "prevdoc_docname",
|
"oldfieldname": "prevdoc_docname",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Purchase Order",
|
"options": "Purchase Order",
|
||||||
"print_hide": 1,
|
|
||||||
"print_width": "150px",
|
"print_width": "150px",
|
||||||
"read_only": 1,
|
"read_only": 1,
|
||||||
"search_index": 1,
|
"search_index": 1,
|
||||||
@ -647,6 +646,7 @@
|
|||||||
"fieldname": "include_exploded_items",
|
"fieldname": "include_exploded_items",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Include Exploded Items",
|
"label": "Include Exploded Items",
|
||||||
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -818,7 +818,7 @@
|
|||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"modified": "2019-06-02 06:37:48.198745",
|
"modified": "2019-09-17 22:33:01.109004",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Purchase Receipt Item",
|
"name": "Purchase Receipt Item",
|
||||||
|
@ -362,6 +362,7 @@ def auto_make_serial_nos(args):
|
|||||||
sr.batch_no = args.get('batch_no')
|
sr.batch_no = args.get('batch_no')
|
||||||
sr.location = args.get('location')
|
sr.location = args.get('location')
|
||||||
sr.company = args.get('company')
|
sr.company = args.get('company')
|
||||||
|
sr.supplier = args.get('supplier')
|
||||||
if sr.sales_order and args.get('voucher_type') == "Stock Entry" \
|
if sr.sales_order and args.get('voucher_type') == "Stock Entry" \
|
||||||
and not args.get('actual_qty', 0) > 0:
|
and not args.get('actual_qty', 0) > 0:
|
||||||
sr.sales_order = None
|
sr.sales_order = None
|
||||||
@ -397,9 +398,11 @@ def make_serial_no(serial_no, args):
|
|||||||
sr.asset = args.get('asset')
|
sr.asset = args.get('asset')
|
||||||
sr.location = args.get('location')
|
sr.location = args.get('location')
|
||||||
|
|
||||||
|
|
||||||
if args.get('purchase_document_type'):
|
if args.get('purchase_document_type'):
|
||||||
sr.purchase_document_type = args.get('purchase_document_type')
|
sr.purchase_document_type = args.get('purchase_document_type')
|
||||||
sr.purchase_document_no = args.get('purchase_document_no')
|
sr.purchase_document_no = args.get('purchase_document_no')
|
||||||
|
sr.supplier = args.get('supplier')
|
||||||
|
|
||||||
sr.insert()
|
sr.insert()
|
||||||
if args.get('warehouse'):
|
if args.get('warehouse'):
|
||||||
|
@ -539,6 +539,21 @@ class StockEntry(StockController):
|
|||||||
|
|
||||||
total_allowed = required_qty + (required_qty * (qty_allowance/100))
|
total_allowed = required_qty + (required_qty * (qty_allowance/100))
|
||||||
|
|
||||||
|
if not required_qty:
|
||||||
|
bom_no = frappe.db.get_value("Purchase Order Item",
|
||||||
|
{"parent": self.purchase_order, "item_code": se_item.subcontracted_item},
|
||||||
|
"bom")
|
||||||
|
|
||||||
|
allow_alternative_item = frappe.get_value("BOM", bom_no, "allow_alternative_item")
|
||||||
|
|
||||||
|
if allow_alternative_item:
|
||||||
|
original_item_code = frappe.get_value("Item Alternative", {"alternative_item_code": item_code}, "item_code")
|
||||||
|
|
||||||
|
required_qty = sum([flt(d.required_qty) for d in purchase_order.supplied_items \
|
||||||
|
if d.rm_item_code == original_item_code])
|
||||||
|
|
||||||
|
total_allowed = required_qty + (required_qty * (qty_allowance/100))
|
||||||
|
|
||||||
if not required_qty:
|
if not required_qty:
|
||||||
frappe.throw(_("Item {0} not found in 'Raw Materials Supplied' table in Purchase Order {1}")
|
frappe.throw(_("Item {0} not found in 'Raw Materials Supplied' table in Purchase Order {1}")
|
||||||
.format(se_item.item_code, self.purchase_order))
|
.format(se_item.item_code, self.purchase_order))
|
||||||
|
@ -3,10 +3,10 @@
|
|||||||
|
|
||||||
from __future__ import print_function, unicode_literals
|
from __future__ import print_function, unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
|
|
||||||
from frappe.utils import flt, cstr, nowdate, nowtime
|
from frappe.utils import flt, cstr, nowdate, nowtime
|
||||||
from erpnext.stock.utils import update_bin
|
from erpnext.stock.utils import update_bin
|
||||||
from erpnext.stock.stock_ledger import update_entries_after
|
from erpnext.stock.stock_ledger import update_entries_after
|
||||||
|
from erpnext.controllers.stock_controller import update_gl_entries_after
|
||||||
|
|
||||||
def repost(only_actual=False, allow_negative_stock=False, allow_zero_rate=False, only_bin=False):
|
def repost(only_actual=False, allow_negative_stock=False, allow_zero_rate=False, only_bin=False):
|
||||||
"""
|
"""
|
||||||
@ -18,12 +18,16 @@ def repost(only_actual=False, allow_negative_stock=False, allow_zero_rate=False,
|
|||||||
existing_allow_negative_stock = frappe.db.get_value("Stock Settings", None, "allow_negative_stock")
|
existing_allow_negative_stock = frappe.db.get_value("Stock Settings", None, "allow_negative_stock")
|
||||||
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
|
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
|
||||||
|
|
||||||
for d in frappe.db.sql("""select distinct item_code, warehouse from
|
item_warehouses = frappe.db.sql("""
|
||||||
|
select distinct item_code, warehouse
|
||||||
|
from
|
||||||
(select item_code, warehouse from tabBin
|
(select item_code, warehouse from tabBin
|
||||||
union
|
union
|
||||||
select item_code, warehouse from `tabStock Ledger Entry`) a"""):
|
select item_code, warehouse from `tabStock Ledger Entry`) a
|
||||||
|
""")
|
||||||
|
for d in item_warehouses:
|
||||||
try:
|
try:
|
||||||
repost_stock(d[0], d[1], allow_zero_rate, only_actual, only_bin)
|
repost_stock(d[0], d[1], allow_zero_rate, only_actual, only_bin, allow_negative_stock)
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
except:
|
except:
|
||||||
frappe.db.rollback()
|
frappe.db.rollback()
|
||||||
@ -32,9 +36,11 @@ def repost(only_actual=False, allow_negative_stock=False, allow_zero_rate=False,
|
|||||||
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock)
|
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock)
|
||||||
frappe.db.auto_commit_on_many_writes = 0
|
frappe.db.auto_commit_on_many_writes = 0
|
||||||
|
|
||||||
def repost_stock(item_code, warehouse, allow_zero_rate=False, only_actual=False, only_bin=False):
|
def repost_stock(item_code, warehouse, allow_zero_rate=False,
|
||||||
|
only_actual=False, only_bin=False, allow_negative_stock=False):
|
||||||
|
|
||||||
if not only_bin:
|
if not only_bin:
|
||||||
repost_actual_qty(item_code, warehouse, allow_zero_rate)
|
repost_actual_qty(item_code, warehouse, allow_zero_rate, allow_negative_stock)
|
||||||
|
|
||||||
if item_code and warehouse and not only_actual:
|
if item_code and warehouse and not only_actual:
|
||||||
qty_dict = {
|
qty_dict = {
|
||||||
@ -50,11 +56,8 @@ def repost_stock(item_code, warehouse, allow_zero_rate=False, only_actual=False,
|
|||||||
|
|
||||||
update_bin_qty(item_code, warehouse, qty_dict)
|
update_bin_qty(item_code, warehouse, qty_dict)
|
||||||
|
|
||||||
def repost_actual_qty(item_code, warehouse, allow_zero_rate=False):
|
def repost_actual_qty(item_code, warehouse, allow_zero_rate=False, allow_negative_stock=False): update_entries_after({ "item_code": item_code, "warehouse": warehouse },
|
||||||
try:
|
allow_zero_rate=allow_zero_rate, allow_negative_stock=allow_negative_stock)
|
||||||
update_entries_after({ "item_code": item_code, "warehouse": warehouse }, allow_zero_rate)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_balance_qty_from_sle(item_code, warehouse):
|
def get_balance_qty_from_sle(item_code, warehouse):
|
||||||
balance_qty = frappe.db.sql("""select qty_after_transaction from `tabStock Ledger Entry`
|
balance_qty = frappe.db.sql("""select qty_after_transaction from `tabStock Ledger Entry`
|
||||||
@ -227,39 +230,14 @@ def reset_serial_no_status_and_warehouse(serial_nos=None):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def repost_all_stock_vouchers():
|
def repost_gle_for_stock_transactions(posting_date=None, posting_time=None, for_warehouses=None):
|
||||||
warehouses_with_account = frappe.db.sql_list("""select warehouse from tabAccount
|
frappe.db.auto_commit_on_many_writes = 1
|
||||||
where ifnull(account_type, '') = 'Stock' and (warehouse is not null and warehouse != '')
|
|
||||||
and is_group=0""")
|
|
||||||
|
|
||||||
vouchers = frappe.db.sql("""select distinct voucher_type, voucher_no
|
if not posting_date:
|
||||||
from `tabStock Ledger Entry` sle
|
posting_date = "1900-01-01"
|
||||||
where voucher_type != "Serial No" and sle.warehouse in (%s)
|
if not posting_time:
|
||||||
order by posting_date, posting_time, creation""" %
|
posting_time = "00:00"
|
||||||
', '.join(['%s']*len(warehouses_with_account)), tuple(warehouses_with_account))
|
|
||||||
|
|
||||||
rejected = []
|
update_gl_entries_after(posting_date, posting_time, for_warehouses=for_warehouses)
|
||||||
i = 0
|
|
||||||
for voucher_type, voucher_no in vouchers:
|
|
||||||
i+=1
|
|
||||||
print(i, "/", len(vouchers), voucher_type, voucher_no)
|
|
||||||
try:
|
|
||||||
for dt in ["Stock Ledger Entry", "GL Entry"]:
|
|
||||||
frappe.db.sql("""delete from `tab%s` where voucher_type=%s and voucher_no=%s"""%
|
|
||||||
(dt, '%s', '%s'), (voucher_type, voucher_no))
|
|
||||||
|
|
||||||
doc = frappe.get_doc(voucher_type, voucher_no)
|
frappe.db.auto_commit_on_many_writes = 0
|
||||||
if voucher_type=="Stock Entry" and doc.purpose in ["Manufacture", "Repack"]:
|
|
||||||
doc.calculate_rate_and_amount(force=1)
|
|
||||||
elif voucher_type=="Purchase Receipt" and doc.is_subcontracted == "Yes":
|
|
||||||
doc.validate()
|
|
||||||
|
|
||||||
doc.update_stock_ledger()
|
|
||||||
doc.make_gl_entries(repost_future_gle=False)
|
|
||||||
frappe.db.commit()
|
|
||||||
except Exception:
|
|
||||||
print(frappe.get_traceback())
|
|
||||||
rejected.append([voucher_type, voucher_no])
|
|
||||||
frappe.db.rollback()
|
|
||||||
|
|
||||||
print(rejected)
|
|
||||||
|
@ -1,3 +1,18 @@
|
|||||||
{% set domains = frappe.get_doc("Domain Settings").active_domains %}
|
{% set domains = frappe.get_doc("Domain Settings").active_domains %}
|
||||||
|
{% set links = {
|
||||||
|
'Manufacturing': '/manufacturing',
|
||||||
|
'Services': '/services',
|
||||||
|
'Retail': '/retail',
|
||||||
|
'Distribution': '/distribution',
|
||||||
|
'Non Profit': '/non-profit',
|
||||||
|
'Education': '/education',
|
||||||
|
'Healthcare': '/healthcare',
|
||||||
|
'Agriculture': '/agriculture',
|
||||||
|
'Hospitality': ''
|
||||||
|
} %}
|
||||||
|
{% set link = '' %}
|
||||||
|
{% if domains %}
|
||||||
|
{% set link = links[domains[0].domain] %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<a href="https://erpnext.com?source=website_footer" target="_blank" class="text-muted">Powered by ERPNext - ERP Software {{ ('for ' + domains[0].domain + ' Companies') if domains else '' }}</a>
|
<a href="https://erpnext.com{{ link }}?source=website_footer" target="_blank" class="text-muted">Powered by ERPNext - {{ '' if domains else 'Open Source' }} ERP Software {{ ('for ' + domains[0].domain + ' Companies') if domains else '' }}</a>
|
||||||
|
@ -10,27 +10,32 @@ def create_test_contact_and_address():
|
|||||||
frappe.db.sql('delete from tabAddress')
|
frappe.db.sql('delete from tabAddress')
|
||||||
frappe.db.sql('delete from `tabDynamic Link`')
|
frappe.db.sql('delete from `tabDynamic Link`')
|
||||||
|
|
||||||
frappe.get_doc(dict(
|
frappe.get_doc({
|
||||||
doctype='Address',
|
"doctype": "Address",
|
||||||
address_title='_Test Address for Customer',
|
"address_title": "_Test Address for Customer",
|
||||||
address_type='Office',
|
"address_type": "Office",
|
||||||
address_line1='Station Road',
|
"address_line1": "Station Road",
|
||||||
city='_Test City',
|
"city": "_Test City",
|
||||||
state='Test State',
|
"state": "Test State",
|
||||||
country='India',
|
"country": "India",
|
||||||
links = [dict(
|
"links": [
|
||||||
link_doctype='Customer',
|
{
|
||||||
link_name='_Test Customer'
|
"link_doctype": "Customer",
|
||||||
)]
|
"link_name": "_Test Customer"
|
||||||
)).insert()
|
}
|
||||||
|
]
|
||||||
|
}).insert()
|
||||||
|
|
||||||
frappe.get_doc(dict(
|
contact = frappe.get_doc({
|
||||||
doctype='Contact',
|
"doctype": 'Contact',
|
||||||
email_id='test_contact_customer@example.com',
|
"first_name": "_Test Contact for _Test Customer",
|
||||||
phone='+91 0000000000',
|
"links": [
|
||||||
first_name='_Test Contact for _Test Customer',
|
{
|
||||||
links = [dict(
|
"link_doctype": "Customer",
|
||||||
link_doctype='Customer',
|
"link_name": "_Test Customer"
|
||||||
link_name='_Test Customer'
|
}
|
||||||
)]
|
]
|
||||||
)).insert()
|
})
|
||||||
|
contact.add_email("test_contact_customer@example.com", is_primary=True)
|
||||||
|
contact.add_phone("+91 0000000000", is_primary_phone=True)
|
||||||
|
contact.insert()
|
||||||
|
Loading…
Reference in New Issue
Block a user