Merge branch 'master' into edge

This commit is contained in:
Anand Doshi 2013-03-04 14:31:00 +05:30
commit 28cd1ca283
190 changed files with 884 additions and 1846 deletions

View File

@ -518,16 +518,17 @@ class DocType(BuyingController):
def on_update(self):
pass
def update_raw_material_cost(self):
if self.sub_contracted_items:
for d in self.doclist.get({"parentfield": "entries"}):
rm_cost = webnotes.conn.sql(""" select raw_material_cost / quantity
from `tabBOM` where item = %s and is_default = 1 and docstatus = 1
and is_active = 1 """, (d.item_code,))
rm_cost = rm_cost and flt(rm_cost[0][0]) or 0
rm_cost = webnotes.conn.sql(""" select raw_material_cost / quantity
from `tabBOM` where item = %s and is_default = 1 and docstatus = 1
and is_active = 1 """, (d.item_code,))
rm_cost = rm_cost and flt(rm_cost[0][0]) or 0
d.conversion_factor = d.conversion_factor or webnotes.conn.get_value(
"UOM Conversion Detail", {"parent": d.item_code, "uom": d.uom},
"conversion_factor") or 1
d.conversion_factor = d.conversion_factor or webnotes.conn.get_value(
"UOM Conversion Detail", {"parent": d.item_code, "uom": d.uom},
"conversion_factor") or 1
d.rm_supp_cost = rm_cost * flt(d.qty) * flt(d.conversion_factor)
d.rm_supp_cost = rm_cost * flt(d.qty) * flt(d.conversion_factor)

View File

@ -75,6 +75,7 @@ class DocType(SellingController):
self.set_aging_date()
self.set_against_income_account()
self.validate_c_form()
self.validate_time_logs_are_submitted()
self.validate_recurring_invoice()
def on_submit(self):
@ -104,7 +105,7 @@ class DocType(SellingController):
self.update_against_document_in_jv()
self.update_c_form()
self.update_time_log_batch(self.doc.name)
self.convert_to_recurring()
@ -122,12 +123,28 @@ class DocType(SellingController):
self.check_next_docstatus()
sales_com_obj.update_prevdoc_detail(0, self)
self.update_time_log_batch(None)
self.make_gl_entries(is_cancel=1)
def on_update_after_submit(self):
self.validate_recurring_invoice()
self.convert_to_recurring()
def update_time_log_batch(self, sales_invoice):
for d in self.doclist.get({"doctype":"Sales Invoice Item"}):
if d.time_log_batch:
tlb = webnotes.bean("Time Log Batch", d.time_log_batch)
tlb.doc.sales_invoice = sales_invoice
tlb.update_after_submit()
def validate_time_logs_are_submitted(self):
for d in self.doclist.get({"doctype":"Sales Invoice Item"}):
if d.time_log_batch:
status = webnotes.conn.get_value("Time Log Batch", d.time_log_batch, "status")
if status!="Submitted":
webnotes.msgprint(_("Time Log Batch status must be 'Submitted'") + ":" + d.time_log_batch,
raise_exception=True)
def set_pos_fields(self):
"""Set retail related fields from pos settings"""
pos = webnotes.conn.sql("select * from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company), as_dict=1)

View File

@ -0,0 +1,16 @@
wn.model.map_info["Sales Invoice"] = {
"Time Log Batch": {
table_map: {
"Sales Invoice Item": "Time Log Batch",
},
field_map: {
"Sales Invoice Item": {
"basic_rate": "rate",
"time_log_batch": "name",
"qty": "total_hours",
"stock_uom": "=Hour",
"description": "=via Time Logs"
}
},
}
}

View File

@ -28,6 +28,31 @@ class TestSalesInvoice(unittest.TestCase):
jv.cancel()
self.assertEquals(webnotes.conn.get_value("Sales Invoice", w.doc.name, "outstanding_amount"),
561.8)
def test_time_log_batch(self):
tlb = webnotes.bean("Time Log Batch", "_T-Time Log Batch-00001")
tlb.submit()
w = webnotes.bean(webnotes.copy_doclist(test_records[0]))
w.doclist[1].time_log_batch = "_T-Time Log Batch-00001"
w.insert()
w.submit()
self.assertEquals(webnotes.conn.get_value("Time Log Batch", "_T-Time Log Batch-00001", "status"),
"Billed")
self.assertEquals(webnotes.conn.get_value("Time Log", "_T-Time Log-00001", "status"),
"Billed")
w.cancel()
self.assertEquals(webnotes.conn.get_value("Time Log Batch", "_T-Time Log Batch-00001", "status"),
"Submitted")
self.assertEquals(webnotes.conn.get_value("Time Log", "_T-Time Log-00001", "status"),
"Batched for Billing")
test_dependencies = ["Journal Voucher"]

View File

@ -1,8 +1,8 @@
[
{
"creation": "2013-01-10 16:34:09",
"creation": "2013-01-29 19:25:49",
"docstatus": 0,
"modified": "2013-01-29 16:27:51",
"modified": "2013-03-01 13:41:51",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -320,6 +320,13 @@
"read_only": 1,
"search_index": 1
},
{
"doctype": "DocField",
"fieldname": "time_log_batch",
"fieldtype": "Link",
"label": "Time Log Batch",
"options": "Time Log Batch"
},
{
"doctype": "DocField",
"fieldname": "item_tax_rate",

View File

@ -1,18 +0,0 @@
[
"Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.\n10. Add or Deduct: Whether you want to add or deduct the tax.",
"Voucher Import Tool",
"Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.",
"Track separate Income and Expense for product verticals or divisions.",
"Delivered Items To Be Billed",
"Gross Profit",
"**Budget Distribution** helps you distribute your budget across months if you have seasonality in your business.\n\nTo distribute a budget using this distribution, set this **Budget Distribution** in the **Cost Center**",
"Financial Statements",
"General Ledger",
"Accounts Home",
"Ordered Items To Be Billed",
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.",
"Financial Analytics",
"Accounts Browser",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.",
"Trial Balance"
]

File diff suppressed because one or more lines are too long

View File

@ -1,15 +0,0 @@
{
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.": "** Gesch\u00e4ftsjahr ** ein Gesch\u00e4ftsjahr. Alle Buchungen und anderen wichtigen Transaktionen gegen ** Gesch\u00e4ftsjahr ** verfolgt.",
"Accounts Browser": "Konten Browser",
"Accounts Home": "Accounts Startseite",
"Delivered Items To Be Billed": "Liefergegenst\u00e4nde in Rechnung gestellt werden",
"Financial Analytics": "Financial Analytics",
"Financial Statements": "Financial Statements",
"General Ledger": "General Ledger",
"Gross Profit": "Bruttogewinn",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.": "Heads (oder Gruppen), gegen die Accounting-Eintr\u00e4ge und sind Guthaben gehalten werden.",
"Ordered Items To Be Billed": "Bestellte Artikel in Rechnung gestellt werden",
"Track separate Income and Expense for product verticals or divisions.": "Verfolgen separaten Ertr\u00e4ge und Aufwendungen f\u00fcr die Produktentwicklung Branchen oder Gesch\u00e4ftsbereichen.",
"Trial Balance": "Rohbilanz",
"Voucher Import Tool": "Gutschein Import Tool"
}

View File

@ -1,17 +0,0 @@
{
"**Budget Distribution** helps you distribute your budget across months if you have seasonality in your business.To distribute a budget using this distribution, set this **Budget Distribution** in the **Cost Center**": "Distribuci\u00f3n del presupuesto ** ** le ayuda a distribuir su presupuesto a trav\u00e9s de meses, si usted tiene la estacionalidad en su business.To distribuir un presupuesto utilizando esta distribuci\u00f3n, establezca esta distribuci\u00f3n del presupuesto ** ** en el centro de coste ** **",
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.": "A\u00f1o Fiscal ** ** representa un ejercicio. Los asientos contables y otras transacciones importantes se siguen contra ** Ejercicio **.",
"Accounts Browser": "Cuentas Browser",
"Accounts Home": "Inicio Cuentas",
"Delivered Items To Be Billed": "Material que se adjunta a facturar",
"Financial Analytics": "Financial Analytics",
"Financial Statements": "Estados Financieros",
"General Ledger": "Contabilidad General",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.": "Jefes (o grupos) con el que se fabrican los asientos contables y los balances se mantienen.",
"Ordered Items To Be Billed": "Los art\u00edculos pedidos a facturar",
"Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.10. Add or Deduct: Whether you want to add or deduct the tax.": "Plantilla de gravamen que puede aplicarse a todas las transacciones de compra. Esta plantilla puede contener la lista de cabezas de impuestos y tambi\u00e9n otros jefes de gastos como "env\u00edo", "Seguros", "Manipulaci\u00f3n", etc tasa impositiva # # # # NotaEl que defina aqu\u00ed ser\u00e1 el tipo de gravamen general para todos los elementos ** ** . Si hay elementos ** ** que tienen ritmos diferentes, se deben agregar en el Impuesto art\u00edculo ** ** mesa en el art\u00edculo ** ** maestro. # # # # Descripci\u00f3n del Columns1. Tipo de c\u00e1lculo: - Esto puede ser en ** Total Net ** (que es la suma de la cantidad de base). - ** En Fila Anterior total / importe ** (para los impuestos acumulativos o cargos). Si selecciona esta opci\u00f3n, el impuesto se aplica como un porcentaje de la fila anterior (en la tabla de impuestos) o cantidad total. - ** Actual ** (como se mencion\u00f3) .2. Jefe de la cuenta: El libro mayor de cuentas en las que este impuesto ser\u00e1 booked3. Centro de coste: Si el impuesto / carga es un ingreso (como gastos de env\u00edo) o gasto que debe ser reservado frente a un coste Center.4. Descripci\u00f3n: Descripci\u00f3n del impuesto (que se imprimir\u00e1 en las facturas / cotizaciones) .5. Tarifas: Impuesto rate.6. Importe: Impuestos amount.7. Total: Total acumulado de este point.8. Ingrese Fila: Si se basa en "Total Fila Anterior" se puede seleccionar el n\u00famero de fila que se tomar\u00e1 como base para este c\u00e1lculo (por defecto es la fila anterior) .9. Considere la posibilidad de impuesto o tasa para: En esta secci\u00f3n se puede especificar si el impuesto / carga es s\u00f3lo para la valoraci\u00f3n (no es una parte del total) o s\u00f3lo para el total (no agrega valor al elemento) o para both.10. Agregar o deducir: Si desea agregar o deducir el impuesto.",
"Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.": "Plantilla de gravamen que puede aplicarse a todas las transacciones de venta. Esta plantilla puede contener la lista de cabezas de impuestos y tambi\u00e9n otros gastos / ingresos cabezas como "env\u00edo", "Seguros", "Manipulaci\u00f3n", etc del Hotel # # # # NotaEl fiscal que defina aqu\u00ed ser\u00e1 el tipo de gravamen general para todos los elementos ** **. Si hay elementos ** ** que tienen ritmos diferentes, se deben agregar en el Impuesto art\u00edculo ** ** mesa en el art\u00edculo ** ** maestro. # # # # Descripci\u00f3n del Columns1. Tipo de c\u00e1lculo: - Esto puede ser en ** Total Net ** (que es la suma de la cantidad de base). - ** En Fila Anterior total / importe ** (para los impuestos acumulativos o cargos). Si selecciona esta opci\u00f3n, el impuesto se aplica como un porcentaje de la fila anterior (en la tabla de impuestos) o cantidad total. - ** Actual ** (como se mencion\u00f3) .2. Jefe de la cuenta: El libro mayor de cuentas en las que este impuesto ser\u00e1 booked3. Centro de coste: Si el impuesto / carga es un ingreso (como gastos de env\u00edo) o gasto que debe ser reservado frente a un coste Center.4. Descripci\u00f3n: Descripci\u00f3n del impuesto (que se imprimir\u00e1 en las facturas / cotizaciones) .5. Tarifas: Impuesto rate.6. Importe: Impuestos amount.7. Total: Total acumulado de este point.8. Ingrese Fila: Si se basa en "Total Fila Anterior" se puede seleccionar el n\u00famero de fila que se tomar\u00e1 como base para este c\u00e1lculo (por defecto es la fila anterior) .9. \u00bfEs este impuesto incluido en la tarifa b\u00e1sica:? Si marca esto, significa que este impuesto no se mostrar\u00e1 a continuaci\u00f3n la tabla de partidas, pero se incluir\u00e1n en la Tasa B\u00e1sica en su mesa elemento principal. Esto es \u00fatil cuando usted quiere dar un precio fijo (incluidos todos los impuestos) precio a los clientes.",
"Track separate Income and Expense for product verticals or divisions.": "Seguimiento de Ingresos y Gastos por separado para los productos o divisiones verticales.",
"Trial Balance": "Balance de Comprobaci\u00f3n",
"Voucher Import Tool": "Vale herramienta de importaci\u00f3n"
}

View File

@ -1,17 +0,0 @@
{
"**Budget Distribution** helps you distribute your budget across months if you have seasonality in your business.To distribute a budget using this distribution, set this **Budget Distribution** in the **Cost Center**": "R\u00e9partition du budget ** ** vous permet de distribuer votre budget \u00e0 travers les mois si vous avez la saisonnalit\u00e9 dans votre business.To distribuer un budget en utilisant cette distribution, r\u00e9glez ce R\u00e9partition du budget ** ** ** Co\u00fbt du Centre **",
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.": "Exercice ** ** repr\u00e9sente un exercice financier. Toutes les \u00e9critures comptables et autres op\u00e9rations importantes sont compar\u00e9s \u00e0 l'exercice ** **.",
"Accounts Browser": "Navigateur comptes",
"Accounts Home": "Accueil Comptes",
"Delivered Items To Be Billed": "Articles livr\u00e9s \u00e0 facturer",
"Financial Analytics": "Financial Analytics",
"Financial Statements": "\u00c9tats financiers",
"General Ledger": "General Ledger",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.": "Chefs (ou groupes) contre lequel \u00c9critures comptables sont faites et les soldes sont maintenues.",
"Ordered Items To Be Billed": "Articles command\u00e9s \u00e0 facturer",
"Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.10. Add or Deduct: Whether you want to add or deduct the tax.": "Mod\u00e8le normal de l'imp\u00f4t qui peut \u00eatre appliqu\u00e9e \u00e0 toutes les transactions d'achat. Ce mod\u00e8le peut contenir une liste des chefs d'imp\u00f4ts et autres charges aussi des t\u00eates comme "Livraison", "assurance", "Manipulation", etc taux d'imposition # # # # RemarqueLe que vous d\u00e9finissez ici sera le taux normal de l'imp\u00f4t pour tous les articles ** ** . S'il ya ** ** Articles qui ont des taux diff\u00e9rents, ils doivent \u00eatre ajout\u00e9s \u00e0 l'imp\u00f4t sur le point ** ** table dans l'\u00e9l\u00e9ment ** ** ma\u00eetre. # # # # Description des Columns1. Type de calcul: - Cela peut \u00eatre sur ** Total net ** (qui est la somme du montant de base). - ** Sur la ligne pr\u00e9c\u00e9dente total / Montant ** (pour les imp\u00f4ts ou les frais cumulatifs). Si vous s\u00e9lectionnez cette option, la taxe sera appliqu\u00e9e en tant que pourcentage de la rang\u00e9e pr\u00e9c\u00e9dente (dans la table d'imp\u00f4t) le montant ou total. - ** R\u00e9elles ** (comme indiqu\u00e9) .2. Chef du compte: Le grand livre des comptes en vertu de laquelle cette taxe sera booked3. Un centre de co\u00fbts: Si la taxe / redevance est un revenu (comme le transport) ou des frais dont elle a besoin pour \u00eatre comptabilis\u00e9es au titre des co\u00fbts Center.4. Description: Description de l'imp\u00f4t (qui sera imprim\u00e9 sur les factures / devis) .5. Tarif: rate.6 imp\u00f4t. Montant: Taxe amount.7. Total: Total cumulatif \u00e0 ce point.8. Entrez Row: S'il est bas\u00e9 sur \u00abTotal ligne pr\u00e9c\u00e9dente", vous pouvez s\u00e9lectionner le nombre de lignes qui seront pris comme base pour le calcul (par d\u00e9faut la ligne pr\u00e9c\u00e9dente) .9. Prenons l'imp\u00f4t ou charge pour: Dans cette section, vous pouvez sp\u00e9cifier si la taxe / redevance est seulement pour l'\u00e9valuation (et non une partie du total) ou seulement pour le total (ne pas ajouter de la valeur \u00e0 l'\u00e9l\u00e9ment) ou pour both.10. Ajouter ou d\u00e9duire: Si vous voulez ajouter ou d\u00e9duire la taxe.",
"Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.": "Mod\u00e8le normal de l'imp\u00f4t qui peut \u00eatre appliqu\u00e9 \u00e0 toutes les op\u00e9rations de vente. Ce mod\u00e8le peut contenir une liste des chefs d'imp\u00f4t et aussi d'autres d\u00e9penses / revenus des t\u00eates comme "Livraison", "assurance", "Manipulation", etc taux d'imposition # # # # RemarqueLe que vous d\u00e9finissez ici sera le taux normal de l'imp\u00f4t pour tous les articles ** **. S'il ya ** ** Articles qui ont des taux diff\u00e9rents, ils doivent \u00eatre ajout\u00e9s \u00e0 l'imp\u00f4t sur le point ** ** table dans l'\u00e9l\u00e9ment ** ** ma\u00eetre. # # # # Description des Columns1. Type de calcul: - Cela peut \u00eatre sur ** Total net ** (qui est la somme du montant de base). - ** Sur la ligne pr\u00e9c\u00e9dente total / Montant ** (pour les imp\u00f4ts ou les frais cumulatifs). Si vous s\u00e9lectionnez cette option, la taxe sera appliqu\u00e9e en tant que pourcentage de la rang\u00e9e pr\u00e9c\u00e9dente (dans la table d'imp\u00f4t) le montant ou total. - ** R\u00e9elles ** (comme indiqu\u00e9) .2. Chef du compte: Le grand livre des comptes en vertu de laquelle cette taxe sera booked3. Un centre de co\u00fbts: Si la taxe / redevance est un revenu (comme le transport) ou des frais dont elle a besoin pour \u00eatre comptabilis\u00e9es au titre des co\u00fbts Center.4. Description: Description de l'imp\u00f4t (qui sera imprim\u00e9 sur les factures / devis) .5. Tarif: rate.6 imp\u00f4t. Montant: Taxe amount.7. Total: Total cumulatif \u00e0 ce point.8. Entrez Row: S'il est bas\u00e9 sur \u00abTotal ligne pr\u00e9c\u00e9dente", vous pouvez s\u00e9lectionner le nombre de lignes qui seront pris comme base pour le calcul (par d\u00e9faut la ligne pr\u00e9c\u00e9dente) .9. Est-ce Taxes incluses dans le taux de base: Si vous cochez cette page, c'est que cette taxe ne sera pas montr\u00e9 ci-dessous la table article, mais il sera inclus dans le tarif de base dans votre tableau principal point. Ceci est utile lorsque vous voulez donner un prix forfaitaire (toutes taxes comprises) prix \u00e0 ses clients.",
"Track separate Income and Expense for product verticals or divisions.": "Suivre distincte sur le revenu et d\u00e9penses pour des produits ou des divisions verticales.",
"Trial Balance": "Balance",
"Voucher Import Tool": "Bon outil d'importation"
}

File diff suppressed because one or more lines are too long

View File

@ -1,17 +0,0 @@
{
"**Budget Distribution** helps you distribute your budget across months if you have seasonality in your business.To distribute a budget using this distribution, set this **Budget Distribution** in the **Cost Center**": "Prora\u010dun ** Distribucija ** vam poma\u017ee distribuirati svoj prora\u010dun preko mjeseca, ako imate sezonalnost u va\u0161em business.To distribuirati prora\u010dun koriste\u0107i ovu distribuciju, postavite ovu ** Budget Distribution ** u ** tro\u0161ka **",
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.": "Fiskalna godina ** ** predstavlja financijsku godinu. Svi ra\u010dunovodstvene unose i druge glavne transakcije su pra\u0107eni od ** fiskalnu godinu **.",
"Accounts Browser": "Ra\u010duni preglednik",
"Accounts Home": "Ra\u010duni Po\u010detna",
"Delivered Items To Be Billed": "Isporu\u010dena Stavke biti napla\u0107eno",
"Financial Analytics": "Financijski Analytics",
"Financial Statements": "Financijska izvje\u0161\u0107a",
"General Ledger": "Glavna knjiga",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.": "\u0160efovi (ili skupine) protiv kojih Ra\u010dunovodstvo upisi su izra\u0111ene i sredstva su odr\u017eavani.",
"Ordered Items To Be Billed": "Naru\u010deni Stavke biti napla\u0107eno",
"Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.10. Add or Deduct: Whether you want to add or deduct the tax.": "Standardni porez predlo\u017eak koji se mogu primijeniti na sve transakcije kupnje. Ovaj predlo\u017eak mo\u017ee sadr\u017eavati popis poreznih glavama i tako\u0111er ostalim tro\u0161kovima glave poput "brodova", "osiguranje", "Rukovanje" itd. # # # # NoteThe porezna stopa mo\u017eete definirati ovdje \u0107e biti standardna stopa poreza za sve stavke ** ** . Ako postoje ** Proizvodi ** koji imaju razli\u010dite cijene, one moraju biti dodan u ** artikla porezu ** tablice u to\u010dki ** ** majstor. # # # # Opis Columns1. Obra\u010dun Tip: - To mo\u017ee biti na ** Neto Ukupno ** (koja je zbroj osnovnog iznosa). - ** Na prethodni redak Ukupni / Iznos ** (za kumulativne poreza ili pristojbi). Ako odaberete ovu opciju, porez \u0107e se primijeniti kao postotak prethodnog reda (u poreznom tablici) iznos ili ukupno. - ** Stvarni ** (kao \u0161to je spomenuto) 0,2. Ra\u010dun Voditelj: Ra\u010dun knjiga pod kojima taj porez \u0107e biti booked3. Tro\u0161ak Centar: Ako pristojba / zadu\u017een je prihod (kao shipping) ili rashod to treba biti rezervirano protiv tro\u0161kova Center.4. Opis: Opis poreza (koji \u0107e se tiskati u fakturama / citati) 0,5. Ocijeni: Porezna rate.6. Iznos: Porezna amount.7. Ukupno: Kumulativna ukupno ove point.8. Unesite Row: Ako se temelji na "Prethodni Row Totala" mo\u017eete odabrati broj retka koji \u0107e se uzeti kao osnova za ovaj izra\u010dun (default je prethodni redak) 0,9. Razmislite poreza ili pristojbi za: U ovom dijelu mo\u017eete odrediti ako porez / naknada je samo za vrednovanje (nije dio od ukupnog broja) ili samo za ukupno (ne dodati vrijednost stavke) ili za both.10. Dodavanje ili oduzimamo: \u017eelite li dodati ili odbiti porez.",
"Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.": "Standardni porez predlo\u017eak koji se mogu primijeniti na svim prodajnim transakcijama. Ovaj predlo\u017eak mo\u017ee sadr\u017eavati popis poreznih glavama i tako\u0111er ostali rashodi / prihodi glave poput "brodova", "osiguranje", "Rukovanje" itd. # # # # NoteThe porezna stopa mo\u017eete definirati ovdje \u0107e biti standardna stopa poreza za sve stavke ** **. Ako postoje ** Proizvodi ** koji imaju razli\u010dite cijene, one moraju biti dodan u ** artikla porezu ** tablice u to\u010dki ** ** majstor. # # # # Opis Columns1. Obra\u010dun Tip: - To mo\u017ee biti na ** Neto Ukupno ** (koja je zbroj osnovnog iznosa). - ** Na prethodni redak Ukupni / Iznos ** (za kumulativne poreza ili pristojbi). Ako odaberete ovu opciju, porez \u0107e se primijeniti kao postotak prethodnog reda (u poreznom tablici) iznos ili ukupno. - ** Stvarni ** (kao \u0161to je spomenuto) 0,2. Ra\u010dun Voditelj: Ra\u010dun knjiga pod kojima taj porez \u0107e biti booked3. Tro\u0161ak Centar: Ako pristojba / zadu\u017een je prihod (kao shipping) ili rashod to treba biti rezervirano protiv tro\u0161kova Center.4. Opis: Opis poreza (koji \u0107e se tiskati u fakturama / citati) 0,5. Ocijeni: Porezna rate.6. Iznos: Porezna amount.7. Ukupno: Kumulativna ukupno ove point.8. Unesite Row: Ako se temelji na "Prethodni Row Totala" mo\u017eete odabrati broj retka koji \u0107e se uzeti kao osnova za ovaj izra\u010dun (default je prethodni redak) 0,9. Je li ovo pristojba uklju\u010dena u osnovne stope:? Ako to provjerili, to zna\u010di da taj porez ne\u0107e biti prikazan ispod to\u010dke tablici, ali \u0107e biti uklju\u010deni u osnovne stope u glavnom to\u010dkom tablici. To je korisno gdje \u017eelite dati flat cijenu (uklju\u010duju\u0107i sve poreze) cijenu za kupce.",
"Track separate Income and Expense for product verticals or divisions.": "Pratite posebnu prihodi i rashodi za proizvode vertikalama ili podjele.",
"Trial Balance": "Pretresno bilanca",
"Voucher Import Tool": "Bon Uvoz alat"
}

View File

@ -1,17 +0,0 @@
{
"**Budget Distribution** helps you distribute your budget across months if you have seasonality in your business.To distribute a budget using this distribution, set this **Budget Distribution** in the **Cost Center**": "** Budget Distributie ** helpt u uw budget te verdelen over maanden, indien u seizoensgebondenheid in uw business.To verspreiden van een budget met behulp van deze verdeling, stelt u deze ** Budget Distributie ** in het ** Cost Center **",
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.": "** Boekjaar ** staat voor een boekjaar. Alle boekingen en andere grote transacties worden bijgehouden tegen ** boekjaar **.",
"Accounts Browser": "Accounts Browser",
"Accounts Home": "Accounts Startpagina",
"Delivered Items To Be Billed": "Geleverde zaken te factureren",
"Financial Analytics": "Financi\u00eble Analytics",
"Financial Statements": "Jaarrekening",
"General Ledger": "Grootboek",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.": "Heads (of groepen) waartegen de boekingen zijn gemaakt en saldi worden gehandhaafd.",
"Ordered Items To Be Billed": "Bestelde artikelen te factureren",
"Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.10. Add or Deduct: Whether you want to add or deduct the tax.": "Standaard belasting sjabloon die kan worden toegepast op alle aankooptransacties. Deze sjabloon kan bevatten lijst van fiscale hoofden en ook andere kosten hoofden als "Shipping", "verzekering", "Handling", enz. # # # # Opmerking De belastingdruk u hier definieert de nominale belastingtarief voor alle ** Items ** . Als er ** ** Items die verschillende tarieven hebben, moeten zij worden toegevoegd aan de ** Item Belasting ** tafel in de ** Item ** meester. # # # # Beschrijving van Columns1. Type berekening: - Dit kan op ** Netto Totaal ** (dat is de som van het basisbedrag). - ** Op de vorige toer Totaal / Bedrag ** (voor cumulatieve belastingen of heffingen). Als u deze optie selecteert, zal de belasting worden berekend als een percentage van de vorige rij (in de fiscale tabel) bedrag of totaal. - ** Werkelijke ** (zoals vermeld) .2. Account Hoofd: De Account grootboek waaronder deze belasting zal zijn booked3. Kostenplaats: Als de belasting / heffing is een inkomen (zoals scheepvaart) of kosten dient te worden geboekt tegen een kostprijs Center.4. Beschrijving: Beschrijving van de belasting (die zal worden afgedrukt op de facturen / offertes) .5. Prijs: Tax rate.6. Bedrag: Tax amount.7. Totaal: Cumulatieve totaal op deze point.8. Voer Rij: Als op basis van "Vorige Row Totaal" kunt u het nummer van de rij die zullen worden genomen als basis voor deze berekening (de standaardinstelling is de vorige toer) .9 selecteren. Overweeg belasting of heffing voor: In dit gedeelte kunt u aangeven of de belasting / heffing is alleen voor de waardering (niet een deel van het totaal) of alleen voor de totale (niet waarde toevoegen aan het item) of voor both.10. Toevoegen of Af: Of u wilt toevoegen of aftrekken van de belasting.",
"Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.": "Standaard belasting sjabloon die kan worden toegepast op alle verkooptransacties. Deze sjabloon kan bevatten lijst van fiscale hoofden en ook andere kosten / baten hoofden als "Shipping", "verzekering", "Handling", enz. # # # # Opmerking De belastingdruk u hier definieert de nominale belastingtarief voor alle ** Items zijn **. Als er ** ** Items die verschillende tarieven hebben, moeten zij worden toegevoegd aan de ** Item Belasting ** tafel in de ** Item ** meester. # # # # Beschrijving van Columns1. Type berekening: - Dit kan op ** Netto Totaal ** (dat is de som van het basisbedrag). - ** Op de vorige toer Totaal / Bedrag ** (voor cumulatieve belastingen of heffingen). Als u deze optie selecteert, zal de belasting worden berekend als een percentage van de vorige rij (in de fiscale tabel) bedrag of totaal. - ** Werkelijke ** (zoals vermeld) .2. Account Hoofd: De Account grootboek waaronder deze belasting zal zijn booked3. Kostenplaats: Als de belasting / heffing is een inkomen (zoals scheepvaart) of kosten dient te worden geboekt tegen een kostprijs Center.4. Beschrijving: Beschrijving van de belasting (die zal worden afgedrukt op de facturen / offertes) .5. Prijs: Tax rate.6. Bedrag: Tax amount.7. Totaal: Cumulatieve totaal op deze point.8. Voer Rij: Als op basis van "Vorige Row Totaal" kunt u het nummer van de rij die zullen worden genomen als basis voor deze berekening (de standaardinstelling is de vorige toer) .9 selecteren. Deze taks wordt opgenomen in Basic Prijs:? Als u deze, betekent dit dat deze belasting niet zal worden getoond onder de post tafel, maar zal worden opgenomen in de Basic Rate in uw belangrijkste item tafel. Dit is nuttig wanneer u maar wilt een vlakke prijs (inclusief alle belastingen) prijs aan de klanten.",
"Track separate Income and Expense for product verticals or divisions.": "Track aparte Inkomsten en uitgaven voor product verticals of divisies.",
"Trial Balance": "Trial Balance",
"Voucher Import Tool": "Voucher Import Tool"
}

View File

@ -1,14 +0,0 @@
{
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.": "**Ano Fiscal** representa um Exerc\u00edcio. Todos os lan\u00e7amentos cont\u00e1beis e outras transa\u00e7\u00f5es importantes s\u00e3o monitorados contra o **Ano Fiscal**.",
"Accounts Browser": "Navegador de Contas",
"Accounts Home": "In\u00edcio de Contas",
"Delivered Items To Be Billed": "Itens entregues a serem faturados",
"Financial Analytics": "An\u00e1lise Financeira",
"Financial Statements": "Demonstra\u00e7\u00f5es Financeiras",
"General Ledger": "Raz\u00e3o Geral",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.": "Contas (ou grupos) contra a qual os lan\u00e7amentos de contabilidade s\u00e3o feitos e os saldos s\u00e3o mantidos.",
"Ordered Items To Be Billed": "Itens encomendados a serem faturados",
"Track separate Income and Expense for product verticals or divisions.": "Acompanhar Receitas e Gastos separados para produtos verticais ou divis\u00f5es.",
"Trial Balance": "Balancete",
"Voucher Import Tool": "Ferramenta de Importa\u00e7\u00e3o de comprovantes"
}

View File

@ -1,17 +0,0 @@
{
"**Budget Distribution** helps you distribute your budget across months if you have seasonality in your business.To distribute a budget using this distribution, set this **Budget Distribution** in the **Cost Center**": "Distribui\u00e7\u00e3o ** ** Or\u00e7amento ajuda a distribuir o seu or\u00e7amento atrav\u00e9s meses se tiver sazonalidade na sua business.To distribuir um or\u00e7amento usando essa distribui\u00e7\u00e3o, definir esta distribui\u00e7\u00e3o do or\u00e7amento ** ** ** no Centro de Custo **",
"**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.": "Ano Fiscal ** ** representa um Exerc\u00edcio. Todos os lan\u00e7amentos cont\u00e1beis e outras transa\u00e7\u00f5es importantes s\u00e3o monitorados contra ** Ano Fiscal **.",
"Accounts Browser": "Navegador contas",
"Accounts Home": "In\u00edcio contas",
"Delivered Items To Be Billed": "Itens entregues a ser cobrado",
"Financial Analytics": "An\u00e1lise Financeira",
"Financial Statements": "Demonstra\u00e7\u00f5es Financeiras",
"General Ledger": "General Ledger",
"Heads (or groups) against which Accounting Entries are made and balances are maintained.": "Chefes (ou grupos) contra o qual as entradas de contabilidade s\u00e3o feitas e os saldos s\u00e3o mantidos.",
"Ordered Items To Be Billed": "Itens ordenados a ser cobrado",
"Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.10. Add or Deduct: Whether you want to add or deduct the tax.": "Modelo imposto padr\u00e3o que pode ser aplicado a todas as opera\u00e7\u00f5es de compra. Este modelo pode conter lista de cabe\u00e7as de impostos e tamb\u00e9m chefes de despesas outras como "Frete", "Seguro", "Manipula\u00e7\u00e3o", etc taxa de imposto # # # # Observa\u00e7\u00e3oO voc\u00ea definir aqui ser\u00e1 a taxa normal do IVA para todos os itens ** ** . Se houver ** ** Itens que t\u00eam taxas diferentes, eles devem ser adicionados no Imposto item ** ** tabela no item ** ** mestre. # # # # Descri\u00e7\u00e3o do Columns1. Tipo de C\u00e1lculo: - Isto pode ser em ** Total L\u00edquida ** (que \u00e9 a soma do valor de base). - ** Na linha anterior Total / Montante ** (para impostos cumulativos ou encargos). Se voc\u00ea selecionar esta op\u00e7\u00e3o, o imposto ser\u00e1 aplicado como um percentual da linha anterior (na tabela do imposto) ou montante total. - ** Real ** (como mencionado) .2. Chefe da conta: O livro conta em que este imposto ser\u00e1 booked3. Custo Center: Se o imposto / carga \u00e9 uma renda (como o transporte) ou despesa que precisa ser contabilizadas a um Custo Center.4. Descri\u00e7\u00e3o: Descri\u00e7\u00e3o do imposto (que ser\u00e1 impresso nas faturas / cota\u00e7\u00f5es) .5. Taxa: Imposto rate.6. Quantidade: Imposto amount.7. Total: total acumulado a este point.8. Digite Row: Se com base em "Total linha anterior" voc\u00ea pode escolher o n\u00famero da linha que ser\u00e1 tomado como base para este c\u00e1lculo (o padr\u00e3o \u00e9 a linha anterior) .9. Considere imposto ou encargo para: Nesta se\u00e7\u00e3o, voc\u00ea pode especificar se o imposto / carga \u00e9 apenas para avalia\u00e7\u00e3o (n\u00e3o uma parte do total) ou apenas para total (n\u00e3o adiciona valor ao produto) ou para both.10. Adicionar ou Deduzir: Se voc\u00ea quiser adicionar ou deduzir o imposto.",
"Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.#### NoteThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.#### Description of Columns1. Calculation Type: - This can be on **Net Total** (that is the sum of basic amount). - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **Actual** (as mentioned).2. Account Head: The Account ledger under which this tax will be booked3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.4. Description: Description of the tax (that will be printed in invoices / quotes).5. Rate: Tax rate.6. Amount: Tax amount.7. Total: Cumulative total to this point.8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.": "Modelo imposto padr\u00e3o que pode ser aplicado a todas as suas vendas. Este modelo pode conter lista de cabe\u00e7as de impostos e tamb\u00e9m outras despesas / receitas cabe\u00e7as como "Frete", "Seguro", "Manipula\u00e7\u00e3o", etc taxa de imposto # # # # Observa\u00e7\u00e3oO voc\u00ea definir aqui ser\u00e1 a taxa normal do IVA para todos os itens ** . ** Se houver ** ** Itens que t\u00eam taxas diferentes, eles devem ser adicionados no Imposto item ** ** tabela no item ** ** mestre. # # # # Descri\u00e7\u00e3o do Columns1. Tipo de C\u00e1lculo: - Isto pode ser em ** Total L\u00edquida ** (que \u00e9 a soma do valor de base). - ** Na linha anterior Total / Montante ** (para impostos cumulativos ou encargos). Se voc\u00ea selecionar esta op\u00e7\u00e3o, o imposto ser\u00e1 aplicado como um percentual da linha anterior (na tabela do imposto) ou montante total. - ** Real ** (como mencionado) .2. Chefe da conta: O livro conta em que este imposto ser\u00e1 booked3. Custo Center: Se o imposto / carga \u00e9 uma renda (como o transporte) ou despesa que precisa ser contabilizadas a um Custo Center.4. Descri\u00e7\u00e3o: Descri\u00e7\u00e3o do imposto (que ser\u00e1 impresso nas faturas / cota\u00e7\u00f5es) .5. Taxa: Imposto rate.6. Quantidade: Imposto amount.7. Total: total acumulado a este point.8. Digite Row: Se com base em "Total linha anterior" voc\u00ea pode escolher o n\u00famero da linha que ser\u00e1 tomado como base para este c\u00e1lculo (o padr\u00e3o \u00e9 a linha anterior) .9. \u00c9 este imposto inclu\u00eddo na tarifa b\u00e1sica:? Se voc\u00ea verificar isso, significa que este imposto n\u00e3o ser\u00e1 mostrado abaixo da tabela item, mas ser\u00e1 inclu\u00edda na taxa b\u00e1sica em sua mesa principal item. Isso \u00e9 \u00fatil quando voc\u00ea quer dar um pre\u00e7o fixo (incluindo todos os impostos) pre\u00e7o aos clientes.",
"Track separate Income and Expense for product verticals or divisions.": "Localizar renda separado e Despesa para verticais de produtos ou divis\u00f5es.",
"Trial Balance": "Balancete",
"Voucher Import Tool": "Ferramenta de Importa\u00e7\u00e3o de comprovante"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -18,12 +18,10 @@ from __future__ import unicode_literals
import webnotes
from webnotes.utils import cstr, flt
from webnotes.model.doc import addchild
from webnotes.model.bean import getlist
from webnotes.model.code import get_obj
from webnotes import msgprint
from buying.utils import get_last_purchase_details
from setup.utils import get_company_currency
sql = webnotes.conn.sql
@ -35,7 +33,6 @@ class DocType(BuyingController):
self.tname = 'Purchase Order Item'
self.fname = 'po_details'
# Validate
def validate(self):
super(DocType, self).validate()
@ -64,6 +61,10 @@ class DocType(BuyingController):
# Check for stopped status
self.check_for_stopped_status(pc_obj)
# sub-contracting
self.validate_for_subcontracting()
self.update_raw_materials_supplied("po_raw_material_details")
def get_default_schedule_date(self):
get_obj(dt = 'Purchase Common').get_default_schedule_date(self)
@ -79,7 +80,6 @@ class DocType(BuyingController):
def get_indent_details(self):
if self.doc.indent_no:
get_obj('DocType Mapper','Material Request-Purchase Order').dt_map('Material Request','Purchase Order',self.doc.indent_no, self.doc, self.doclist, "[['Material Request','Purchase Order'],['Material Request Item', 'Purchase Order Item']]")
pcomm = get_obj('Purchase Common')
for d in getlist(self.doclist, 'po_details'):
if d.item_code and not d.purchase_rate:
last_purchase_details = get_last_purchase_details(d.item_code, self.doc.name)
@ -173,8 +173,6 @@ class DocType(BuyingController):
msgprint(cstr(self.doc.doctype) +" => "+ cstr(self.doc.name) +" has been modified. Please Refresh. ")
raise Exception
# On Close
#-------------------------------------------------------------------------------------------------
def update_status(self, status):
self.check_modified_date()
# step 1:=> Set Status
@ -186,8 +184,6 @@ class DocType(BuyingController):
# step 3:=> Acknowledge user
msgprint(self.doc.doctype + ": " + self.doc.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
# On Submit
def on_submit(self):
purchase_controller = webnotes.get_obj("Purchase Common")
purchase_controller.is_item_table_empty(self)
@ -207,118 +203,31 @@ class DocType(BuyingController):
# Step 6 :=> Set Status
webnotes.conn.set(self.doc,'status','Submitted')
# On Cancel
# -------------------------------------------------------------------------------------------------------
def on_cancel(self):
pc_obj = get_obj(dt = 'Purchase Common')
# 1.Check if PO status is stopped
# Check if PO status is stopped
pc_obj.check_for_stopped_status(cstr(self.doc.doctype), cstr(self.doc.name))
self.check_for_stopped_status(pc_obj)
# 2.Check if Purchase Receipt has been submitted against current Purchase Order
# Check if Purchase Receipt has been submitted against current Purchase Order
pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Receipt', docname = self.doc.name, detail_doctype = 'Purchase Receipt Item')
# 3.Check if Purchase Invoice has been submitted against current Purchase Order
#pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Invoice', docname = self.doc.name, detail_doctype = 'Purchase Invoice Item')
# Check if Purchase Invoice has been submitted against current Purchase Order
submitted = sql("select t1.name from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2 where t1.name = t2.parent and t2.purchase_order = '%s' and t1.docstatus = 1" % self.doc.name)
if submitted:
msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
raise Exception
# 4.Set Status as Cancelled
webnotes.conn.set(self.doc,'status','Cancelled')
# 5.Update Material Requests Pending Qty and accordingly it's Status
pc_obj.update_prevdoc_detail(self,is_submit = 0)
# 6.Update Bin
self.update_bin( is_submit = 0, is_stopped = 0)
# Step 7 :=> Update last purchase rate
pc_obj.update_last_purchase_rate(self, is_submit = 0)
#----------- code for Sub-contracted Items -------------------
#--------check for sub-contracted items and accordingly update PO raw material detail table--------
def update_rw_material_detail(self):
for d in getlist(self.doclist,'po_details'):
item_det = sql("select is_sub_contracted_item, is_purchase_item from `tabItem` where name = '%s'"%(d.item_code))
if item_det[0][0] == 'Yes':
if item_det[0][1] == 'Yes':
if not self.doc.is_subcontracted:
msgprint("Please enter whether purchase order to be made for subcontracting or for purchasing in 'Is Subcontracted' field .")
raise Exception
if self.doc.is_subcontracted == 'Yes':
self.add_bom(d)
else:
self.doclist = self.doc.clear_table(self.doclist,'po_raw_material_details',1)
self.doc.save()
elif item_det[0][1] == 'No':
self.add_bom(d)
self.delete_irrelevant_raw_material()
#---------------calculate amt in Purchase Order Item Supplied-------------
def add_bom(self, d):
#----- fetching default bom from Bill of Materials instead of Item Master --
bom_det = sql("""select t1.item, t2.item_code, t2.qty_consumed_per_unit,
t2.moving_avg_rate, t2.value_as_per_mar, t2.stock_uom, t2.name, t2.parent
from `tabBOM` t1, `tabBOM Item` t2
where t2.parent = t1.name and t1.item = %s
and ifnull(t1.is_default,0) = 1 and t1.docstatus = 1""", (d.item_code,))
if not bom_det:
msgprint("No default BOM exists for item: %s" % d.item_code)
raise Exception
else:
#-------------- add child function--------------------
chgd_rqd_qty = []
for i in bom_det:
if i and not sql("select name from `tabPurchase Order Item Supplied` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
rm_child = addchild(self.doc, 'po_raw_material_details', 'Purchase Order Item Supplied', self.doclist)
rm_child.reference_name = d.name
rm_child.bom_detail_no = i and i[6] or ''
rm_child.main_item_code = i and i[0] or ''
rm_child.rm_item_code = i and i[1] or ''
rm_child.stock_uom = i and i[5] or ''
rm_child.rate = i and flt(i[3]) or flt(i[4])
rm_child.conversion_factor = d.conversion_factor
rm_child.required_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
rm_child.amount = flt(flt(rm_child.consumed_qty)*flt(rm_child.rate))
rm_child.save()
chgd_rqd_qty.append(cstr(i[1]))
else:
act_qty = flt(i and flt(i[2]) or 0) * flt(d.qty) * flt(d.conversion_factor)
for po_rmd in getlist(self.doclist, 'po_raw_material_details'):
if i and i[6] == po_rmd.bom_detail_no and (flt(act_qty) != flt(po_rmd.required_qty) or i[1] != po_rmd.rm_item_code):
chgd_rqd_qty.append(cstr(i[1]))
po_rmd.main_item_code = i[0]
po_rmd.rm_item_code = i[1]
po_rmd.stock_uom = i[5]
po_rmd.required_qty = flt(act_qty)
po_rmd.rate = i and flt(i[3]) or flt(i[4])
po_rmd.amount = flt(flt(po_rmd.consumed_qty)*flt(po_rmd.rate))
# Delete irrelevant raw material from PR Raw material details
#--------------------------------------------------------------
def delete_irrelevant_raw_material(self):
for d in getlist(self.doclist,'po_raw_material_details'):
if not sql("select name from `tabPurchase Order Item` where name = '%s' and parent = '%s'and item_code = '%s'" % (d.reference_name, self.doc.name, d.main_item_code)):
d.parent = 'old_par:'+self.doc.name
d.save()
# On Update
# ----------------------------------------------------------------------------------------------------
def on_update(self):
self.update_rw_material_detail()
pass
def get_rate(self,arg):
return get_obj('Purchase Common').get_rate(arg,self)

View File

@ -0,0 +1,65 @@
# ERPNext - web based ERP (http://erpnext.com)
# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import unicode_literals
import unittest
import webnotes
import webnotes.defaults
from webnotes.utils import cint
class TestPurchaseOrder(unittest.TestCase):
def test_subcontracting(self):
po = webnotes.bean(copy=test_records[0])
po.insert()
self.assertEquals(len(po.doclist.get({"parentfield": "po_raw_material_details"})), 2)
test_dependencies = ["BOM"]
test_records = [
[
{
"company": "_Test Company",
"conversion_rate": 1.0,
"currency": "INR",
"doctype": "Purchase Order",
"fiscal_year": "_Test Fiscal Year 2013",
"transaction_date": "2013-02-12",
"is_subcontracted": "Yes",
"supplier": "_Test Supplier",
"supplier_name": "_Test Supplier",
"net_total": 5000.0,
"grand_total": 5000.0,
"grand_total_import": 5000.0,
},
{
"conversion_factor": 1.0,
"description": "_Test FG Item",
"doctype": "Purchase Order Item",
"item_code": "_Test FG Item",
"item_name": "_Test FG Item",
"parentfield": "po_details",
"qty": 10.0,
"import_rate": 500.0,
"amount": 5000.0,
"warehouse": "_Test Warehouse",
"stock_uom": "Nos",
"uom": "_Test UOM",
}
],
]

View File

@ -1,5 +0,0 @@
[
"Supplier of Goods or Services.",
"Buying Home",
"Purchase Analytics"
]

View File

@ -1,5 +0,0 @@
{
"Buying Home": "\u0634\u0631\u0627\u0621 \u0645\u0646\u0632\u0644",
"Purchase Analytics": "\u0634\u0631\u0627\u0621 \u062a\u062d\u0644\u064a\u0644\u0627\u062a",
"Supplier of Goods or Services.": "\u0627\u0644\u0645\u0648\u0631\u062f \u0644\u0644\u0633\u0644\u0639 \u0623\u0648 \u0627\u0644\u062e\u062f\u0645\u0627\u062a."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "Kauf Startseite",
"Purchase Analytics": "Kauf Analytics",
"Supplier of Goods or Services.": "Lieferant von Waren oder Dienstleistungen."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "Adquisici\u00f3n de Casas",
"Purchase Analytics": "Compra Analytics",
"Supplier of Goods or Services.": "Proveedor de Productos o Servicios."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "Acheter une maison",
"Purchase Analytics": "Achat Analytics",
"Supplier of Goods or Services.": "Fournisseur de biens ou services."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "\u0918\u0930 \u0916\u0930\u0940\u0926\u0928\u093e",
"Purchase Analytics": "\u0916\u0930\u0940\u0926 \u0935\u093f\u0936\u094d\u0932\u0947\u0937\u093f\u0915\u0940",
"Supplier of Goods or Services.": "\u0938\u093e\u092e\u093e\u0928 \u092f\u093e \u0938\u0947\u0935\u093e\u0913\u0902 \u0915\u0940 \u092a\u094d\u0930\u0926\u093e\u092f\u0915."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "Kupnja Po\u010detna",
"Purchase Analytics": "Kupnja Analytics",
"Supplier of Goods or Services.": "Dobavlja\u010d robe ili usluga."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "Kopen Startpagina",
"Purchase Analytics": "Aankoop Analytics",
"Supplier of Goods or Services.": "Leverancier van goederen of diensten."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "In\u00edcio de Compras",
"Purchase Analytics": "An\u00e1lise de compras",
"Supplier of Goods or Services.": "Fornecedor de Bens ou Servi\u00e7os."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "Compra de casa",
"Purchase Analytics": "Analytics compra",
"Supplier of Goods or Services.": "Fornecedor de bens ou servi\u00e7os."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "\u041a\u0443\u043f\u043e\u0432\u0438\u043d\u0430 \u0425\u043e\u043c\u0435",
"Purchase Analytics": "\u041a\u0443\u043f\u043e\u0432\u0438\u043d\u0430 \u0410\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430",
"Supplier of Goods or Services.": "\u0414\u043e\u0431\u0430\u0432\u0459\u0430\u0447 \u0440\u043e\u0431\u0435 \u0438\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0430."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "\u0bae\u0bc1\u0b95\u0baa\u0bcd\u0baa\u0bc1 \u0bb5\u0bbe\u0b99\u0bcd\u0b95\u0bc1\u0ba4\u0bb2\u0bcd",
"Purchase Analytics": "\u0b95\u0bc6\u0bbe\u0bb3\u0bcd\u0bae\u0bc1\u0ba4\u0bb2\u0bcd \u0b86\u0baf\u0bcd\u0bb5\u0bc1",
"Supplier of Goods or Services.": "\u0b9a\u0bb0\u0b95\u0bcd\u0b95\u0bc1 \u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1 \u0b9a\u0bc7\u0bb5\u0bc8\u0b95\u0bb3\u0bcd \u0b9a\u0baa\u0bcd\u0bb3\u0bc8\u0baf\u0bb0\u0bcd."
}

View File

@ -1,5 +0,0 @@
{
"Buying Home": "\u0e0b\u0e37\u0e49\u0e2d\u0e1a\u0e49\u0e32\u0e19",
"Purchase Analytics": "Analytics \u0e0b\u0e37\u0e49\u0e2d",
"Supplier of Goods or Services.": "\u0e1c\u0e39\u0e49\u0e1c\u0e25\u0e34\u0e15\u0e2a\u0e34\u0e19\u0e04\u0e49\u0e32\u0e2b\u0e23\u0e37\u0e2d\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23"
}

View File

@ -342,6 +342,67 @@ class BuyingController(AccountsController):
) / flt(d.conversion_factor)
else:
d.valuation_rate = 0.0
def validate_for_subcontracting(self):
if not self.doc.is_subcontracted and self.sub_contracted_items:
webnotes.msgprint(_("""Please enter whether %s is made for subcontracting or purchasing,
in 'Is Subcontracted' field""" % self.doc.doctype), raise_exception=1)
if self.doc.doctype == "Purchase Receipt" and self.doc.is_subcontracted=="Yes" \
and not self.doc.supplier_warehouse:
webnotes.msgprint(_("Supplier Warehouse mandatory subcontracted purchase receipt"),
raise_exception=1)
def update_raw_materials_supplied(self, raw_material_table):
self.doclist = self.doc.clear_table(self.doclist, raw_material_table)
if self.doc.is_subcontracted=="Yes":
for item in self.doclist.get({"parentfield": self.fname}):
if item.item_code in self.sub_contracted_items:
self.add_bom_items(item, raw_material_table)
def add_bom_items(self, d, raw_material_table):
bom_items = self.get_items_from_default_bom(d.item_code)
raw_materials_cost = 0
for item in bom_items:
required_qty = flt(item.qty_consumed_per_unit) * flt(d.qty) * flt(d.conversion_factor)
rm_doclist = {
"parentfield": raw_material_table,
"doctype": self.doc.doctype + " Item Supplied",
"reference_name": d.name,
"bom_detail_no": item.name,
"main_item_code": d.item_code,
"rm_item_code": item.item_code,
"stock_uom": item.stock_uom,
"required_qty": required_qty,
"conversion_factor": d.conversion_factor,
"rate": item.rate,
"amount": required_qty * flt(item.rate)
}
if self.doc.doctype == "Purchase Receipt":
rm_doclist.update({
"consumed_qty": required_qty,
"description": item.description,
})
self.doclist.append(rm_doclist)
raw_materials_cost += required_qty * flt(item.rate)
if self.doc.doctype == "Purchase Receipt":
d.rm_supp_cost = raw_materials_cost
def get_items_from_default_bom(self, item_code):
# print webnotes.conn.sql("""select name from `tabBOM` where item = '_Test FG Item'""")
bom_items = webnotes.conn.sql("""select t2.item_code, t2.qty_consumed_per_unit,
t2.rate, t2.stock_uom, t2.name, t2.description
from `tabBOM` t1, `tabBOM Item` t2
where t2.parent = t1.name and t1.item = %s and t1.is_default = 1
and t1.docstatus = 1 and t1.is_active = 1""", item_code, as_dict=1)
if not bom_items:
msgprint(_("No default BOM exists for item: ") + item_code, raise_exception=1)
return bom_items
@property
def precision(self):

View File

@ -1,9 +0,0 @@
[
"Event Updates",
"My Company",
"Desktop",
"Attributions",
"dashboard",
"Activity",
"Latest Updates"
]

View File

@ -1,9 +0,0 @@
{
"Activity": "\u0646\u0634\u0627\u0637",
"Attributions": "\u0635\u0641\u0627\u062a",
"Desktop": "\u0633\u0637\u062d \u0627\u0644\u0645\u0643\u062a\u0628",
"Event Updates": "\u0627\u0644\u062d\u062f\u062b \u0627\u0644\u062a\u062d\u062f\u064a\u062b\u0627\u062a",
"Latest Updates": "\u0622\u062e\u0631 \u0627\u0644\u062a\u062d\u062f\u064a\u062b\u0627\u062a",
"My Company": "\u0628\u0644\u062f\u064a \u0627\u0644\u0634\u0631\u0643\u0629",
"dashboard": "\u0644\u0648\u062d\u0629 \u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0642\u064a\u0627\u0633"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "Aktivit\u00e4t",
"Attributions": "Zuschreibungen",
"Desktop": "Desktop",
"Event Updates": "Event-Updates",
"Latest Updates": "Neueste Updates",
"My Company": "My Company",
"dashboard": "Armaturenbrett"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "Actividad",
"Attributions": "Atribuciones",
"Desktop": "Escritorio",
"Event Updates": "Actualizaciones del Evento",
"Latest Updates": "Las \u00faltimas novedades",
"My Company": "Mi Empresa",
"dashboard": "salpicadero"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "Activit\u00e9",
"Attributions": "Attributions",
"Desktop": "Bureau",
"Event Updates": "Mises \u00e0 jour de l&#39;\u00e9v\u00e9nement",
"Latest Updates": "Derni\u00e8res mises \u00e0 jour",
"My Company": "Mon entreprise",
"dashboard": "tableau de bord"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "\u0938\u0915\u094d\u0930\u093f\u092f\u0924\u093e",
"Attributions": "Attributions",
"Desktop": "\u0921\u0947\u0938\u094d\u0915\u091f\u0949\u092a",
"Event Updates": "\u0918\u091f\u0928\u093e \u0905\u0926\u094d\u092f\u0924\u0928",
"Latest Updates": "\u0928\u0935\u0940\u0928\u0924\u092e \u0905\u0926\u094d\u092f\u0924\u0928",
"My Company": "\u092e\u0947\u0930\u0940 \u0915\u0902\u092a\u0928\u0940",
"dashboard": "\u0921\u0948\u0936\u092c\u094b\u0930\u094d\u0921"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "Djelatnost",
"Attributions": "Pripisivanje",
"Desktop": "Desktop",
"Event Updates": "Doga\u0111aj a\u017euriranja",
"Latest Updates": "Najnovija a\u017euriranja",
"My Company": "Moja tvrtka",
"dashboard": "kontrolna plo\u010da"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "Activiteit",
"Attributions": "Toeschrijvingen",
"Desktop": "Desktop",
"Event Updates": "Event Updates",
"Latest Updates": "Laatste updates",
"My Company": "Mijn bedrijf",
"dashboard": "dashboard"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "Atividade",
"Attributions": "Atribui\u00e7\u00f5es",
"Desktop": "\u00c1rea de trabalho",
"Event Updates": "Atualiza\u00e7\u00f5es do Eento",
"Latest Updates": "\u00daltimas Atualiza\u00e7\u00f5es",
"My Company": "Minha Empresa",
"dashboard": "painel de instrumentos"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "Atividade",
"Attributions": "Atribui\u00e7\u00f5es",
"Desktop": "\u00c1rea de trabalho",
"Event Updates": "Atualiza\u00e7\u00f5es de eventos",
"Latest Updates": "\u00daltimas Atualiza\u00e7\u00f5es",
"My Company": "Minha Empresa",
"dashboard": "painel de instrumentos"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "\u0410\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442",
"Attributions": "\u0410\u0442\u0440\u0438\u0431\u0443\u0446\u0438\u0458\u0435",
"Desktop": "\u0414\u0435\u0441\u043a\u0442\u043e\u043f",
"Event Updates": "\u0414\u043e\u0433\u0430\u0452\u0430\u0458 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045a\u0435",
"Latest Updates": "\u041b\u0430\u0442\u0435\u0441\u0442 \u0423\u043f\u0434\u0430\u0442\u0435\u0441",
"My Company": "\u041c\u043e\u0458\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0458\u0430",
"dashboard": "\u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0430 \u0442\u0430\u0431\u043b\u0430"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "\u0ba8\u0b9f\u0bb5\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bc8",
"Attributions": "\u0baa\u0ba3\u0bcd\u0baa\u0bc1\u0b95\u0bcd\u0b95\u0bc2\u0bb1\u0bc1\u0b95\u0bb3\u0bc8",
"Desktop": "\u0b9f\u0bc6\u0bb8\u0bcd\u0b95\u0bcd\u0b9f\u0bbe\u0baa\u0bcd",
"Event Updates": "\u0ba8\u0bbf\u0b95\u0bb4\u0bcd\u0bb5\u0bc1 \u0bae\u0bc7\u0bae\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd\u0b95\u0bb3\u0bcd",
"Latest Updates": "\u0b9a\u0bae\u0bc0\u0baa\u0ba4\u0bcd\u0ba4\u0bbf\u0baf \u0bae\u0bc7\u0bae\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bb2\u0bcd\u0b95\u0bb3\u0bcd",
"My Company": "\u0b8e\u0ba9\u0bcd \u0ba8\u0bbf\u0bb1\u0bc1\u0bb5\u0ba9\u0ba4\u0bcd\u0ba4\u0bbf\u0ba9\u0bcd",
"dashboard": "\u0b89\u0ba8\u0bcd\u0ba4\u0bc1 \u0bb5\u0ba3\u0bcd\u0b9f\u0bbf\u0baf\u0bbf\u0bb2\u0bcd \u0b93\u0b9f\u0bcd\u0b9f\u0bc1\u0ba8\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0b89\u0ba4\u0bb5\u0bbf\u0baf\u0bbe\u0b95 \u0b87\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd \u0baa\u0bc6\u0bbe\u0bb0\u0bc1\u0bb3\u0bcd\u0b95\u0bb3\u0bcd \u0ba4\u0bbe\u0b99\u0bcd\u0b95\u0bbf \u0b87\u0bb0\u0bc1\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd \u0baa\u0bb2\u0b95\u0bc8"
}

View File

@ -1,9 +0,0 @@
{
"Activity": "\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21",
"Attributions": "\u0e40\u0e2b\u0e15\u0e38\u0e1c\u0e25",
"Desktop": "\u0e2a\u0e01\u0e4c\u0e17\u0e47\u0e2d\u0e1b",
"Event Updates": "\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e40\u0e2b\u0e15\u0e38\u0e01\u0e32\u0e23\u0e13\u0e4c",
"Latest Updates": "\u0e2d\u0e31\u0e1e\u0e40\u0e14\u0e17\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14",
"My Company": "\u0e1a\u0e23\u0e34\u0e29\u0e31\u0e17 \u0e02\u0e2d\u0e07\u0e09\u0e31\u0e19",
"dashboard": "\u0e2b\u0e19\u0e49\u0e32\u0e1b\u0e31\u0e14"
}

View File

@ -1,4 +1,7 @@
erpnext.updates = [
["1st March", [
"Time Log, Time Log Batch: Created feature to batch Time Logs so that they can be tracked for billing."
]],
["27th February", [
"Time Log: Created Time Log System, with Calendar View."
]],
@ -11,7 +14,8 @@ erpnext.updates = [
]],
["21st February, 2013", [
"Item: Warehouse-wise Re-order Level and Quantity",
"Buying: Purchase Request renamed to Material Request"
"Buying: Purchase Request renamed to Material Request",
"Website: Dynamic (mobile friendly) layouts using Bootstrap Responsive layouts"
]],
["20th February, 2013", [
"Disable Rounded Total: If disable in 'Global Defaults', Rounding related fields \

View File

@ -22,6 +22,7 @@ from webnotes.utils import cint, cstr, date_diff, flt, formatdate, getdate, get_
from webnotes import msgprint
class LeaveDayBlockedError(Exception): pass
class OverlapError(Exception): pass
from webnotes.model.controller import DocListController
class DocType(DocListController):
@ -129,17 +130,22 @@ class DocType(DocListController):
(self.doc.leave_type,), raise_exception=1)
def validate_leave_overlap(self):
if not self.doc.name:
self.doc.name = "New Leave Application"
for d in webnotes.conn.sql("""select name, leave_type, posting_date,
from_date, to_date
from `tabLeave Application`
where
(from_date <= %(to_date)s and to_date >= %(from_date)s)
and employee = %(employee)s
employee = %(employee)s
and docstatus < 2
and status in ("Open", "Approved")
and (from_date between %(from_date)s and %(to_date)s
or to_date between %(from_date)s and %(to_date)s
or %(from_date)s between from_date and to_date)
and name != %(name)s""", self.doc.fields, as_dict = 1):
msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : <a href=\"#Form/Leave Application/%s\">%s</a>" % (self.doc.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name'], d['name']), raise_exception = 1)
msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : <a href=\"#Form/Leave Application/%s\">%s</a>" % (self.doc.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name'], d['name']), raise_exception = OverlapError)
def validate_max_days(self):
max_days = webnotes.conn.sql("select max_days_allowed from `tabLeave Type` where name = '%s'" %(self.doc.leave_type))

View File

@ -1,7 +1,7 @@
import webnotes
import unittest
from hr.doctype.leave_application.leave_application import LeaveDayBlockedError
from hr.doctype.leave_application.leave_application import LeaveDayBlockedError, OverlapError
class TestLeaveApplication(unittest.TestCase):
def get_application(self, doclist):
@ -23,13 +23,22 @@ class TestLeaveApplication(unittest.TestCase):
from webnotes.profile import add_role
add_role("test1@example.com", "HR User")
# clear other applications
webnotes.conn.sql("delete from `tabLeave Application`")
application = self.get_application(test_records[1])
self.assertTrue(application.insert())
def test_overlap(self):
application = self.get_application(test_records[1])
self.assertRaises(OverlapError, application.insert)
def test_global_block_list(self):
application = self.get_application(test_records[3])
application.doc.leave_approver = "test@example.com"
webnotes.conn.set_value("Leave Block List", "_Test Leave Block List",
"applies_to_all_departments", 1)
webnotes.conn.set_value("Employee", "_T-Employee-0002", "department",

View File

@ -1,8 +0,0 @@
[
"Block Holidays on important days.",
"Applicant for a Job",
"Description of a Job Opening",
"Apply / Approve Leaves",
"Human Resources Home",
"Employee Leave Balance"
]

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "\u0637\u0627\u0644\u0628 \u0648\u0638\u064a\u0641\u0629",
"Apply / Approve Leaves": "\u062a\u0637\u0628\u064a\u0642 / \u0627\u0644\u0645\u0648\u0627\u0641\u0642\u0629 \u0639\u0644\u0649 \u0623\u0648\u0631\u0627\u0642",
"Block Holidays on important days.": "\u0645\u0646\u0639 \u0627\u0644\u0625\u062c\u0627\u0632\u0627\u062a \u0641\u064a \u0627\u0644\u0623\u064a\u0627\u0645 \u0627\u0644\u0647\u0627\u0645\u0629.",
"Description of a Job Opening": "\u0648\u0635\u0641 \u0644\u0641\u062a\u062d \u0641\u0631\u0635 \u0627\u0644\u0639\u0645\u0644",
"Human Resources Home": "\u0627\u0644\u0645\u0648\u0627\u0631\u062f \u0627\u0644\u0628\u0634\u0631\u064a\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "Antragsteller f\u00fcr einen Job",
"Apply / Approve Leaves": "\u00dcbernehmen / Genehmigen Leaves",
"Block Holidays on important days.": "Blockieren Urlaub auf wichtige Tage.",
"Description of a Job Opening": "Beschreibung eines Job Opening",
"Human Resources Home": "Human Resources Startseite"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "Pretendiente a un puesto",
"Apply / Approve Leaves": "Aplicar / Aprobar Hojas",
"Block Holidays on important days.": "Bloque Vacaciones en d\u00edas importantes.",
"Description of a Job Opening": "Descripci\u00f3n de una oferta de trabajo",
"Human Resources Home": "Recursos Humanos Home"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "Demandeur d&#39;une offre d&#39;emploi",
"Apply / Approve Leaves": "Appliquer / Approuver les feuilles",
"Block Holidays on important days.": "Bloquer les jours f\u00e9ri\u00e9s importants.",
"Description of a Job Opening": "Description d&#39;un Job Opening",
"Human Resources Home": "Ressources humaines Accueil"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "\u090f\u0915 \u0928\u094c\u0915\u0930\u0940 \u0915\u0947 \u0932\u093f\u090f \u0906\u0935\u0947\u0926\u0915",
"Apply / Approve Leaves": "\u092a\u0924\u094d\u0924\u093f\u092f\u093e\u0902 \u0932\u093e\u0917\u0942 / \u0938\u094d\u0935\u0940\u0915\u0943\u0924",
"Block Holidays on important days.": "\u092e\u0939\u0924\u094d\u0935\u092a\u0942\u0930\u094d\u0923 \u0926\u093f\u0928 \u092a\u0930 \u091b\u0941\u091f\u094d\u091f\u093f\u092f\u093e\u0901 \u092e\u0948.",
"Description of a Job Opening": "\u090f\u0915 \u0928\u094c\u0915\u0930\u0940 \u0916\u094b\u0932\u0928\u0947 \u0915\u093e \u0935\u093f\u0935\u0930\u0923",
"Human Resources Home": "\u092e\u093e\u0928\u0935 \u0939\u094b\u092e \u0938\u0902\u0938\u093e\u0927\u0928"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "Podnositelj zahtjeva za posao",
"Apply / Approve Leaves": "Nanesite / Odobri li\u0161\u0107e",
"Block Holidays on important days.": "Blok Odmor o va\u017enim dana.",
"Description of a Job Opening": "Opis posla otvorenje",
"Human Resources Home": "Ljudski resursi Home"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "Aanvrager van een baan",
"Apply / Approve Leaves": "Toepassen / goedkeuren Leaves",
"Block Holidays on important days.": "Blok Vakantie op belangrijke dagen.",
"Description of a Job Opening": "Beschrijving van een vacature",
"Human Resources Home": "Human Resources Startpagina"
}

View File

@ -1,8 +0,0 @@
{
"Applicant for a Job": "Candidato a um Emprego",
"Apply / Approve Leaves": "Aplicar / Aprovar Licen\u00e7as",
"Block Holidays on important days.": "Bloquear feriados em dias importantes.",
"Description of a Job Opening": "Descri\u00e7\u00e3o de uma vaga de emprego",
"Employee Leave Balance": "Equil\u00edbrio Leave empregado",
"Human Resources Home": "In\u00edcio de Recursos Humanos"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "Candidato a um emprego",
"Apply / Approve Leaves": "Aplicar / Aprovar Folhas",
"Block Holidays on important days.": "Bloquear feriados em dias importantes.",
"Description of a Job Opening": "Descri\u00e7\u00e3o de uma vaga de emprego",
"Human Resources Home": "Home Recursos Humanos"
}

View File

@ -1,6 +0,0 @@
{
"Applicant for a Job": "\u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u0437\u0430 \u043f\u043e\u0441\u0430\u043e",
"Apply / Approve Leaves": "\u041f\u0440\u0438\u043c\u0435\u043d\u0438 / \u041e\u0434\u043e\u0431\u0440\u0438\u0442\u0438 \u041b\u0435\u0430\u0432\u0435\u0441",
"Description of a Job Opening": "\u041e\u043f\u0438\u0441 \u043f\u043e\u0441\u043b\u0430 \u041e\u0442\u0432\u0430\u0440\u0430\u045a\u0435",
"Human Resources Home": "\u0409\u0443\u0434\u0441\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0438 \u0425\u043e\u043c\u0435"
}

View File

@ -1,6 +0,0 @@
{
"Applicant for a Job": "\u0b92\u0bb0\u0bc1 \u0bb5\u0bc7\u0bb2\u0bc8 \u0b87\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbf\u0ba3\u0bcd\u0ba3\u0baa\u0bcd\u0baa\u0ba4\u0bbe\u0bb0\u0bb0\u0bcd",
"Apply / Approve Leaves": "\u0b87\u0bb2\u0bc8\u0b95\u0bb3\u0bcd \u0b92\u0baa\u0bcd\u0baa\u0bc1\u0ba4\u0bb2\u0bcd / \u0bb5\u0bbf\u0ba3\u0bcd\u0ba3\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0bb2\u0bbe\u0bae\u0bcd",
"Description of a Job Opening": "\u0bb5\u0bc7\u0bb2\u0bc8 \u0ba4\u0bc6\u0bbe\u0b9f\u0b95\u0bcd\u0b95 \u0bb5\u0bbf\u0bb3\u0b95\u0bcd\u0b95\u0bae\u0bcd",
"Human Resources Home": "\u0bae\u0bc1\u0b95\u0baa\u0bcd\u0baa\u0bc1 \u0bae\u0ba9\u0bbf\u0ba4 \u0bb5\u0bb3\u0b99\u0bcd\u0b95\u0bb3\u0bcd"
}

View File

@ -1,7 +0,0 @@
{
"Applicant for a Job": "\u0e02\u0e2d\u0e23\u0e31\u0e1a\u0e07\u0e32\u0e19",
"Apply / Approve Leaves": "\u0e43\u0e0a\u0e49 / \u0e2d\u0e19\u0e38\u0e21\u0e31\u0e15\u0e34\u0e43\u0e1a",
"Block Holidays on important days.": "\u0e1b\u0e34\u0e14\u0e01\u0e31\u0e49\u0e19\u0e2b\u0e22\u0e38\u0e14\u0e43\u0e19\u0e27\u0e31\u0e19\u0e2a\u0e33\u0e04\u0e31\u0e0d",
"Description of a Job Opening": "\u0e04\u0e33\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e34\u0e14\u0e07\u0e32\u0e19",
"Human Resources Home": "\u0e17\u0e23\u0e31\u0e1e\u0e22\u0e32\u0e01\u0e23\u0e21\u0e19\u0e38\u0e29\u0e22\u0e4c\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01"
}

View File

@ -1,4 +0,0 @@
[
"Manufacturing Home",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM"
]

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "\u062a\u0635\u0646\u064a\u0639 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "\u0627\u0633\u062a\u0628\u062f\u0627\u0644 BOM \u062e\u0627\u0635\u0629 \u0641\u064a \u062c\u0645\u064a\u0639 BOMs \u0627\u0644\u0623\u062e\u0631\u0649 \u0627\u0644\u062a\u064a \u064a\u0633\u062a\u062e\u062f\u0645 \u0641\u064a\u0647\u0627. \u0648\u0627\u0646\u0647 \u0633\u064a\u062d\u0644 \u0645\u062d\u0644 \u0627\u0644\u0631\u0627\u0628\u0637 BOM \u0627\u0644\u0642\u062f\u064a\u0645\u0629\u060c \u0648\u062a\u062d\u062f\u064a\u062b \u0648\u062a\u062c\u062f\u064a\u062f \u0627\u0644\u062a\u0643\u0644\u0641\u0629 &quot;\u0627\u0644\u0628\u0646\u062f \u0627\u0646\u0641\u062c\u0627\u0631 BOM&quot; \u0627\u0644\u062c\u062f\u0648\u0644 \u0627\u0644\u062c\u062f\u064a\u062f \u0648\u0641\u0642\u0627 BOM"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "Herstellung Home",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "Ersetzen Sie die insbesondere gut in allen anderen St\u00fccklisten, wo sie verwendet wird. Es wird die alte BOM Link zu ersetzen, aktualisieren kosten und regenerieren \"Explosion St\u00fccklistenposition\" Tabelle pro neuen GOOD"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "Fabricaci\u00f3n Inicio",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "Reemplazar un BOM particular en todas las listas de materiales de otros en los que se utiliza. Se sustituir\u00e1 el enlace BOM viejo, actualizar el costo y regenerar &quot;Explosi\u00f3n lista de materiales Item&quot; tabla seg\u00fan nueva lista de materiales"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "Accueil Fabrication",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "Remplacer une nomenclature particuli\u00e8re dans toutes les nomenclatures d&#39;autres o\u00f9 il est utilis\u00e9. Il remplacera le lien de nomenclature ancienne, mettre \u00e0 jour les co\u00fbts et r\u00e9g\u00e9n\u00e9rer &quot;Explosion de nomenclature article&quot; la table comme pour une nouvelle nomenclature"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "\u0935\u093f\u0928\u093f\u0930\u094d\u092e\u093e\u0923 \u0939\u094b\u092e",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "\u0905\u0928\u094d\u092f \u0938\u092d\u0940 BOMs \u091c\u0939\u093e\u0902 \u092f\u0939 \u092a\u094d\u0930\u092f\u094b\u0917 \u0915\u093f\u092f\u093e \u091c\u093e\u0924\u093e \u0939\u0948 \u092e\u0947\u0902 \u090f\u0915 \u0935\u093f\u0936\u0947\u0937 \u092c\u0940\u0913\u090f\u092e \u092c\u0926\u0932\u0947\u0902. \u092f\u0939 \u092a\u0941\u0930\u093e\u0928\u0947 \u092c\u0940\u0913\u090f\u092e \u0932\u093f\u0902\u0915 \u0915\u0940 \u091c\u0917\u0939, \u0932\u093e\u0917\u0924 \u0905\u0926\u094d\u092f\u0924\u0928 \u0914\u0930 \u0928\u092f\u093e \u092c\u0940\u0913\u090f\u092e \u0915\u0947 \u0905\u0928\u0941\u0938\u093e\u0930 &quot;BOM \u0927\u092e\u093e\u0915\u093e \u0906\u0907\u091f\u092e&quot; \u0924\u093e\u0932\u093f\u0915\u093e \u092a\u0941\u0928\u0930\u094d\u091c\u0928\u094d\u092e"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "Proizvodnja Po\u010detna",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "Zamijenite odre\u0111eni BOM u svim drugim sastavnicama gdje se koriste. To \u0107e zamijeniti staru vezu BOM, a\u017eurirati tro\u0161kove i regenerirati &quot;BOM eksploziju predmeta&quot; stol kao i po novom BOM"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "Productie Startpagina",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "Vervang een bepaalde BOM in alle andere BOMs waar het wordt gebruikt. Deze vervangt de oude BOM link, updaten kosten en regenereren &quot;BOM Explosion Item&quot; tafel als per nieuwe BOM"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "In\u00edcio de Fabrica\u00e7\u00e3o",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "Substituir uma LDM espec\u00edfica em todas as LDMs outros onde ela \u00e9 usada. Isso ir\u00e1 substituir o link da LDM antiga, atualizar o custo e regenerar a tabela &quot;Item de Explos\u00e3o da LDM&quot; com a nova LDM"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "In\u00edcio de fabrica\u00e7\u00e3o",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "Substituir um BOM particular em todas as BOMs outros onde ele \u00e9 usado. Ele ir\u00e1 substituir o link BOM antigo, atualizar o custo e regenerar &quot;Explos\u00e3o BOM Item&quot; tabela como por novo BOM"
}

View File

@ -1,3 +0,0 @@
{
"Manufacturing Home": "\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u045a\u0430 \u041f\u043e\u0447\u0435\u0442\u043d\u0430"
}

View File

@ -1,3 +0,0 @@
{
"Manufacturing Home": "\u0b89\u0bb1\u0bcd\u0baa\u0ba4\u0bcd\u0ba4\u0bbf \u0bae\u0bc1\u0b95\u0baa\u0bcd\u0baa\u0bc1"
}

View File

@ -1,4 +0,0 @@
{
"Manufacturing Home": "\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01\u0e01\u0e32\u0e23\u0e1c\u0e25\u0e34\u0e15",
"Replace a particular BOM in all other BOMs where it is used. It will replace the old BOM link, update cost and regenerate \"BOM Explosion Item\" table as per new BOM": "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48 BOM \u0e42\u0e14\u0e22\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e43\u0e19 BOMs \u0e2d\u0e37\u0e48\u0e19 \u0e46 \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e19\u0e33\u0e21\u0e32\u0e43\u0e0a\u0e49 \u0e21\u0e31\u0e19\u0e08\u0e30\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e42\u0e22\u0e07 BOM \u0e40\u0e01\u0e48\u0e32\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07\u0e04\u0e48\u0e32\u0e43\u0e0a\u0e49\u0e08\u0e48\u0e32\u0e22\u0e41\u0e25\u0e30\u0e43\u0e2b\u0e49\u0e0a\u0e35\u0e27\u0e34\u0e15\u0e43\u0e2b\u0e21\u0e48 &quot;\u0e23\u0e30\u0e40\u0e1a\u0e34\u0e14\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23 BOM&quot; \u0e15\u0e32\u0e23\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e48\u0e2d\u0e43\u0e2b\u0e21\u0e48 BOM"
}

View File

@ -0,0 +1,20 @@
import webnotes
def execute():
# convert timesheet details to time logs
for name in webnotes.conn.sql_list("""select name from tabTimesheet"""):
ts = webnotes.bean("Timesheet", name)
for tsd in ts.doclist.get({"doctype":"Timesheet Detail"}):
tl = webnotes.bean({
"doctype": "Time Log",
"status": "Draft",
"from_time": ts.doc.timesheet_date + " " + tsd.act_start_time,
"to_time": ts.doc.timesheet_date + " " + tsd.act_end_time,
"activity_type": tsd.activity_type,
"task": tsd.task_id,
"project": tsd.project_name,
"note": ts.doc.notes,
"file_list": ts.doc.file_list,
"_user_tags": ts.doc._user_tags
})
tl.insert()

View File

@ -200,6 +200,7 @@ patch_list = [
'execute:webnotes.reload_doc("accounts", "Print Format", "Sales Invoice Modern") # 2013-02-26',
'execute:webnotes.reload_doc("accounts", "Print Format", "Sales Invoice Spartan") # 2013-02-26',
"execute:(not webnotes.conn.exists('Role', 'Projects Manager')) and webnotes.doc({'doctype':'Role', 'role_name':'Projects Manager'}).insert()",
"execute:(not webnotes.conn.exists('UOM', 'Hour')) and webnotes.doc({'uom_name': 'Unit', 'doctype': 'UOM', 'name': 'Hour'}).insert()",
"patches.february_2013.p09_remove_cancelled_warehouses",
"patches.march_2013.update_po_prevdoc_doctype",
]

View File

@ -1,13 +0,0 @@
[
"Customer",
"Get Open Sales Order",
"Territory",
"Company",
"Update Delivery Date",
"To Date",
"Production",
"From Date",
"Entries",
"Sales Order",
"Update Sales Order"
]

View File

@ -0,0 +1,5 @@
test_records = [
[{"activity_type":"_Test Activity Type"}],
[{"activity_type":"_Test Activity Type 1"}],
[{"activity_type":"_Test Activity Type 2"}]
]

View File

@ -0,0 +1,8 @@
test_records = [[{
"project_name": "_Test Project",
"status": "Open"
}],
[{
"project_name": "_Test Project 1",
"status": "Open"
}]]

View File

@ -0,0 +1,7 @@
test_records = [
[{"subject": "_Test Task", "project":"_Test Project", "status":"Open"}],
[{"subject": "_Test Task 1", "status":"Open"}],
[{"subject": "_Test Task 2", "status":"Open"}]
]
test_ignore = ["Customer"]

View File

@ -0,0 +1,19 @@
import webnotes
import unittest
from projects.doctype.time_log.time_log import OverlapError
class TestTimeLog(unittest.TestCase):
def test_duplication(self):
ts = webnotes.bean(webnotes.copy_doclist(test_records[0]))
self.assertRaises(OverlapError, ts.insert)
test_records = [[{
"from_time": "2013-01-01 10:00:00",
"to_time": "2013-01-01 11:00:00",
"activity_type": "_Test Activity Type",
"note": "_Test Note",
"docstatus": 1
}]]
test_ignore = ["Sales Invoice", "Time Log Batch"]

View File

@ -0,0 +1,5 @@
$.extend(cur_frm.cscript, {
refresh: function(doc) {
}
});

View File

@ -6,23 +6,55 @@ from webnotes import _
from webnotes.widgets.reportview import build_match_conditions
class OverlapError(webnotes.ValidationError): pass
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
def validate(self):
self.set_status()
self.validate_overlap()
self.calculate_total_hours()
def validate_overlap(self):
def calculate_total_hours(self):
from webnotes.utils import time_diff_in_hours
self.doc.hours = time_diff_in_hours(self.doc.to_time, self.doc.from_time)
def set_status(self):
self.doc.status = {
0: "Draft",
1: "Submitted",
2: "Cancelled"
}[self.doc.docstatus or 0]
if self.doc.time_log_batch:
self.doc.status="Batched for Billing"
if self.doc.sales_invoice:
self.doc.status="Billed"
def validate_overlap(self):
existing = webnotes.conn.sql_list("""select name from `tabTime Log` where owner=%s and
((from_time between %s and %s) or (to_time between %s and %s)) and name!=%s""",
(
(from_time between %s and %s) or
(to_time between %s and %s) or
(%s between from_time and to_time))
and name!=%s
and docstatus < 2""",
(self.doc.owner, self.doc.from_time, self.doc.to_time, self.doc.from_time,
self.doc.to_time, self.doc.name))
self.doc.to_time, self.doc.from_time, self.doc.name or "No Name"))
if existing:
webnotes.msgprint(_("This Time Log conflicts with") + ":" + ', '.join(existing),
raise_exception=True)
raise_exception=OverlapError)
def before_cancel(self):
self.set_status()
def before_update_after_submit(self):
self.set_status()
@webnotes.whitelist()
def get_events(start, end):
match = build_match_conditions("Time Log")

View File

@ -2,15 +2,17 @@
{
"creation": "2013-02-26 14:58:28",
"docstatus": 0,
"modified": "2013-02-26 16:09:53",
"modified": "2013-03-01 17:48:09",
"modified_by": "Administrator",
"owner": "Administrator"
},
{
"autoname": "TL-.######",
"allow_attach": 1,
"autoname": "naming_series:",
"description": "Log of Activities performed by users against Tasks that can be used for tracking time, billing.",
"doctype": "DocType",
"document_type": "Master",
"is_submittable": 1,
"module": "Projects",
"name": "__common__"
},
@ -19,8 +21,7 @@
"name": "__common__",
"parent": "Time Log",
"parentfield": "fields",
"parenttype": "DocType",
"permlevel": 0
"parenttype": "DocType"
},
{
"doctype": "DocPerm",
@ -30,30 +31,64 @@
"parenttype": "DocType",
"permlevel": 0,
"read": 1,
"report": 1,
"write": 1
},
{
"doctype": "DocType",
"name": "Time Log"
},
{
"doctype": "DocField",
"fieldname": "naming_series",
"fieldtype": "Select",
"label": "Naming Series",
"options": "TL-",
"permlevel": 0,
"reqd": 1
},
{
"doctype": "DocField",
"fieldname": "from_time",
"fieldtype": "Datetime",
"in_list_view": 1,
"label": "From Time",
"permlevel": 0,
"reqd": 1
},
{
"doctype": "DocField",
"fieldname": "to_time",
"fieldtype": "Datetime",
"in_list_view": 0,
"label": "To Time",
"permlevel": 0,
"reqd": 1
},
{
"doctype": "DocField",
"fieldname": "hours",
"fieldtype": "Float",
"label": "Hours",
"permlevel": 0,
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "column_break_3",
"fieldtype": "Column Break"
"fieldtype": "Column Break",
"permlevel": 0
},
{
"doctype": "DocField",
"fieldname": "status",
"fieldtype": "Select",
"in_list_view": 1,
"label": "Status",
"options": "Draft\nSubmitted\nBatched for Billing\nBilled\nCancelled",
"permlevel": 0,
"read_only": 1,
"reqd": 0
},
{
"doctype": "DocField",
@ -62,6 +97,7 @@
"in_list_view": 1,
"label": "Activity Type",
"options": "Activity Type",
"permlevel": 0,
"reqd": 1
},
{
@ -69,29 +105,35 @@
"fieldname": "task",
"fieldtype": "Link",
"label": "Task",
"options": "Task"
"options": "Task",
"permlevel": 0
},
{
"doctype": "DocField",
"fieldname": "billable",
"fieldtype": "Check",
"label": "Billable"
"in_list_view": 1,
"label": "Billable",
"permlevel": 0
},
{
"doctype": "DocField",
"fieldname": "section_break_7",
"fieldtype": "Section Break"
"fieldtype": "Section Break",
"permlevel": 0
},
{
"doctype": "DocField",
"fieldname": "note",
"fieldtype": "Text Editor",
"label": "Note"
"label": "Note",
"permlevel": 0
},
{
"doctype": "DocField",
"fieldname": "section_break_9",
"fieldtype": "Section Break"
"fieldtype": "Section Break",
"permlevel": 0
},
{
"doctype": "DocField",
@ -99,23 +141,62 @@
"fieldtype": "Link",
"in_list_view": 1,
"label": "Project",
"options": "Project"
"options": "Project",
"permlevel": 0
},
{
"description": "Will be updated when batched.",
"doctype": "DocField",
"fieldname": "time_log_batch",
"fieldtype": "Link",
"label": "Time Log Batch",
"options": "Time Log Batch",
"permlevel": 0,
"read_only": 1
},
{
"description": "Will be updated when billed.",
"doctype": "DocField",
"fieldname": "sales_invoice",
"fieldtype": "Link",
"label": "Sales Invoice",
"options": "Sales Invoice"
"options": "Sales Invoice",
"permlevel": 0,
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "file_list",
"fieldtype": "Text",
"hidden": 1,
"label": "File List",
"no_copy": 1,
"permlevel": 0,
"print_hide": 1
},
{
"doctype": "DocField",
"fieldname": "amended_from",
"fieldtype": "Link",
"label": "Amended From",
"no_copy": 1,
"options": "Time Log",
"permlevel": 1,
"print_hide": 1
},
{
"cancel": 0,
"create": 1,
"doctype": "DocPerm",
"match": "owner",
"role": "Projects User"
"role": "Projects User",
"submit": 1
},
{
"amend": 1,
"cancel": 1,
"doctype": "DocPerm",
"role": "Projects Manager"
"role": "Projects Manager",
"submit": 0
}
]

View File

@ -0,0 +1,45 @@
// render
wn.listview_settings['Time Log'] = {
add_fields: ["`tabTime Log`.`status`", "`tabTime Log`.`billable`", "`tabTime Log`.`activity_type`"],
selectable: true,
onload: function(me) {
me.appframe.add_button(wn._("Make Time Log Batch"), function() {
var selected = me.get_checked_items() || [];
if(!selected.length) {
msgprint(wn._("Please select Time Logs."))
}
// select only billable time logs
for(var i in selected) {
var d = selected[i];
if(!d.billable) {
msgprint(wn._("Time Log is not billable") + ": " + d.name);
return;
}
if(d.status!="Submitted") {
msgprint(wn._("Time Log Status must be Submitted."));
}
}
// make batch
wn.model.with_doctype("Time Log Batch", function() {
var tlb = wn.model.get_new_doc("Time Log Batch");
$.each(selected, function(i, d) {
var detail = wn.model.get_new_doc("Time Log Batch Detail");
$.extend(detail, {
"parenttype": "Time Log Batch",
"parentfield": "time_log_batch_details",
"parent": tlb.name,
"time_log": d.name,
"activity_type": d.activity_type,
"created_by": d.owner,
"idx": i+1
});
})
wn.set_route("Form", "Time Log Batch", tlb.name);
})
}, "icon-file-alt");
}
};

View File

@ -0,0 +1,20 @@
import webnotes, unittest
class TimeLogBatchTest(unittest.TestCase):
def test_time_log_status(self):
self.assertEquals(webnotes.conn.get_value("Time Log", "_T-Time Log-00001", "status"), "Submitted")
tlb = webnotes.bean("Time Log Batch", "_T-Time Log Batch-00001")
tlb.submit()
self.assertEquals(webnotes.conn.get_value("Time Log", "_T-Time Log-00001", "status"), "Batched for Billing")
tlb.cancel()
self.assertEquals(webnotes.conn.get_value("Time Log", "_T-Time Log-00001", "status"), "Submitted")
test_records = [[
{"rate": "500"},
{
"doctype": "Time Log Batch Detail",
"parenttype": "Time Log Batch",
"parentfield": "time_log_batch_details",
"time_log": "_T-Time Log-00001",
}
]]

View File

@ -0,0 +1,36 @@
cur_frm.add_fetch("time_log", "activity_type", "activity_type");
cur_frm.add_fetch("time_log", "owner", "created_by");
cur_frm.add_fetch("time_log", "hours", "hours");
cur_frm.set_query("time_log", "time_log_batch_details", function(doc) {
return {
query: "projects.utils.get_time_log_list",
filters: {
"billable": 1,
"status": "Submitted"
}
}
});
$.extend(cur_frm.cscript, {
refresh: function(doc) {
cur_frm.set_intro({
"Draft": wn._("Select Time Logs and Submit to create a new Sales Invoice."),
"Submitted": wn._("Click on 'Make Sales Invoice' button to create a new Sales Invoice."),
"Billed": wn._("This Time Log Batch has been billed."),
"Cancelled": wn._("This Time Log Batch has been cancelled.")
}[doc.status]);
if(doc.status=="Submitted") {
cur_frm.add_custom_button("Make Sales Invoice", function() { cur_frm.cscript.make_invoice() },
"icon-file-alt");
}
},
make_invoice: function() {
var doc = cur_frm.doc;
wn.model.map({
source: wn.model.get_doclist(doc.doctype, doc.name),
target: "Sales Invoice"
});
}
});

View File

@ -0,0 +1,60 @@
# For license information, please see license.txt
from __future__ import unicode_literals
import webnotes
from webnotes import _
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
def validate(self):
self.set_status()
self.doc.total_hours = 0.0
for d in self.doclist.get({"doctype":"Time Log Batch Detail"}):
tl = webnotes.doc("Time Log", d.time_log)
self.update_time_log_values(d, tl)
self.validate_time_log_is_submitted(tl)
self.doc.total_hours += float(tl.hours or 0.0)
def update_time_log_values(self, d, tl):
d.fields.update({
"hours": tl.hours,
"activity_type": tl.activity_type,
"created_by": tl.owner
})
def validate_time_log_is_submitted(self, tl):
if tl.status != "Submitted":
webnotes.msgprint(_("Time Log must have status 'Submitted'") + \
" :" + tl.name + " (" + _(tl.status) + ")", raise_exception=True)
def set_status(self):
self.doc.status = {
"0": "Draft",
"1": "Submitted",
"2": "Cancelled"
}[str(self.doc.docstatus or 0)]
if self.doc.sales_invoice:
self.doc.status = "Billed"
def on_submit(self):
self.update_status(self.doc.name)
def before_cancel(self):
self.update_status(None)
def before_update_after_submit(self):
self.update_status(self.doc.name)
def update_status(self, time_log_batch):
self.set_status()
for d in self.doclist.get({"doctype":"Time Log Batch Detail"}):
tl = webnotes.bean("Time Log", d.time_log)
tl.doc.time_log_batch = time_log_batch
tl.doc.sales_invoice = self.doc.sales_invoice
tl.update_after_submit()

View File

@ -0,0 +1,121 @@
[
{
"creation": "2013-02-28 17:57:33",
"docstatus": 0,
"modified": "2013-03-01 17:54:57",
"modified_by": "Administrator",
"owner": "Administrator"
},
{
"autoname": "naming_series:",
"description": "Batch Time Logs for Billing.",
"doctype": "DocType",
"document_type": "Transaction",
"is_submittable": 1,
"module": "Projects",
"name": "__common__"
},
{
"doctype": "DocField",
"name": "__common__",
"parent": "Time Log Batch",
"parentfield": "fields",
"parenttype": "DocType",
"permlevel": 0
},
{
"amend": 1,
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
"name": "__common__",
"parent": "Time Log Batch",
"parentfield": "permissions",
"parenttype": "DocType",
"permlevel": 0,
"read": 1,
"report": 1,
"role": "Projects User",
"submit": 1,
"write": 1
},
{
"doctype": "DocType",
"name": "Time Log Batch"
},
{
"doctype": "DocField",
"fieldname": "naming_series",
"fieldtype": "Select",
"label": "Naming Series",
"options": "TLB-",
"reqd": 1
},
{
"description": "For Sales Invoice",
"doctype": "DocField",
"fieldname": "rate",
"fieldtype": "Currency",
"label": "Rate"
},
{
"doctype": "DocField",
"fieldname": "column_break_3",
"fieldtype": "Column Break"
},
{
"default": "Draft",
"doctype": "DocField",
"fieldname": "status",
"fieldtype": "Select",
"in_list_view": 1,
"label": "Status",
"options": "Draft\nSubmitted\nBilled\nCancelled",
"read_only": 1
},
{
"description": "Will be updated after Sales Invoice is Submitted.",
"doctype": "DocField",
"fieldname": "sales_invoice",
"fieldtype": "Link",
"in_list_view": 1,
"label": "Sales Invoice",
"options": "Sales Invoice",
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "section_break_5",
"fieldtype": "Section Break"
},
{
"doctype": "DocField",
"fieldname": "time_log_batch_details",
"fieldtype": "Table",
"label": "Time Log Batch Details",
"options": "Time Log Batch Detail",
"reqd": 1
},
{
"description": "In Hours",
"doctype": "DocField",
"fieldname": "total_hours",
"fieldtype": "Float",
"in_list_view": 1,
"label": "Total Hours",
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "amended_from",
"fieldtype": "Link",
"label": "Amended From",
"no_copy": 1,
"options": "Time Log Batch",
"print_hide": 1,
"read_only": 1
},
{
"doctype": "DocPerm"
}
]

View File

@ -0,0 +1,8 @@
# For license information, please see license.txt
from __future__ import unicode_literals
import webnotes
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl

View File

@ -0,0 +1,57 @@
[
{
"creation": "2013-02-28 17:56:12",
"docstatus": 0,
"modified": "2013-03-01 15:20:17",
"modified_by": "Administrator",
"owner": "Administrator"
},
{
"doctype": "DocType",
"istable": 1,
"module": "Projects",
"name": "__common__"
},
{
"doctype": "DocField",
"name": "__common__",
"parent": "Time Log Batch Detail",
"parentfield": "fields",
"parenttype": "DocType",
"permlevel": 0
},
{
"doctype": "DocType",
"name": "Time Log Batch Detail"
},
{
"doctype": "DocField",
"fieldname": "time_log",
"fieldtype": "Link",
"label": "Time Log",
"options": "Time Log",
"reqd": 1,
"width": "200px"
},
{
"doctype": "DocField",
"fieldname": "created_by",
"fieldtype": "Link",
"label": "Created By",
"options": "Profile",
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "activity_type",
"fieldtype": "Data",
"label": "Activity Type",
"read_only": 1
},
{
"doctype": "DocField",
"fieldname": "hours",
"fieldtype": "Float",
"label": "Hours"
}
]

View File

@ -21,7 +21,10 @@ cur_frm.cscript.onload = function(doc,cdt,cdn){
if(!doc.timesheet_date) set_multiple(cdt,cdn,{timesheet_date:get_today()});
}
cur_frm.cscript.refresh = function(doc,cdt,cdn){}
cur_frm.cscript.refresh = function(doc,cdt,cdn){
cur_frm.set_intro("Timesheets will soon be removed. Please create a new Time Log. To create \
a new Time Log, to to Projects > Time Log > New Time Log. This will be removed in a few days.")
}
cur_frm.fields_dict['timesheet_details'].grid.get_field("project_name").get_query = function(doc,cdt,cdn){

View File

@ -51,6 +51,8 @@ class DocType:
return time.strptime(timestr, format)
def validate(self):
msgprint("Please create a new Time Log", raise_exception=True)
if getdate(self.doc.timesheet_date) > getdate(nowdate()):
msgprint("You can not prepare timesheet for future date")
raise Exception

View File

@ -1,4 +0,0 @@
[
"Projects Home",
"Projects"
]

View File

@ -16,16 +16,22 @@ wn.module_page["Projects"] = [
description: wn._("Project master."),
doctype:"Project"
},
{
label: wn._("Timesheet"),
description: wn._("Timesheet for tasks."),
doctype:"Timesheet"
},
{
label: wn._("Time Log"),
description: wn._("Time Log for tasks."),
doctype:"Time Log"
},
{
label: wn._("Time Log Batch"),
description: wn._("Batch Time Logs for billing."),
doctype:"Time Log Batch"
},
{
label: wn._("Timesheet"),
description: wn._("[DEPRECATED] Timesheet for tasks."),
doctype:"Timesheet"
},
]
},
{
@ -50,7 +56,18 @@ wn.module_page["Projects"] = [
},
]
},
]
{
title: wn._("Reports"),
right: true,
icon: "icon-list",
items: [
{
"label":wn._("Time Log Summary"),
route: "Report2/Time Log/Time Log Summary",
doctype: "Time Log"
},
]
}]
pscript['onload_projects-home'] = function(wrapper) {
wn.views.moduleview.make(wrapper, "Projects");

View File

Some files were not shown because too many files have changed in this diff Show More