Merge branch 'develop' into bank-trans-party-automatch

This commit is contained in:
Raffael Meyer 2023-06-19 15:04:37 +02:00 committed by GitHub
commit 11126521c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 11400 additions and 3072 deletions

View File

@ -575,7 +575,7 @@ $.extend(erpnext.journal_entry, {
}; };
if(!frm.doc.multi_currency) { if(!frm.doc.multi_currency) {
$.extend(filters, { $.extend(filters, {
account_currency: frappe.get_doc(":Company", frm.doc.company).default_currency account_currency: ['in', [frappe.get_doc(":Company", frm.doc.company).default_currency, null]]
}); });
} }
return { filters: filters }; return { filters: filters };

View File

@ -28,7 +28,7 @@ frappe.ui.form.on("Journal Entry Template", {
if(!frm.doc.multi_currency) { if(!frm.doc.multi_currency) {
$.extend(filters, { $.extend(filters, {
account_currency: frappe.get_doc(":Company", frm.doc.company).default_currency account_currency: ['in', [frappe.get_doc(":Company", frm.doc.company).default_currency, null]]
}); });
} }

View File

@ -151,6 +151,19 @@ class PaymentEntry(AccountsController):
if self.payment_type == "Internal Transfer": if self.payment_type == "Internal Transfer":
return return
if self.party_type in ("Customer", "Supplier"):
self.validate_allocated_amount_with_latest_data()
else:
fail_message = _("Row #{0}: Allocated Amount cannot be greater than outstanding amount.")
for d in self.get("references"):
if (flt(d.allocated_amount)) > 0 and flt(d.allocated_amount) > flt(d.outstanding_amount):
frappe.throw(fail_message.format(d.idx))
# Check for negative outstanding invoices as well
if flt(d.allocated_amount) < 0 and flt(d.allocated_amount) < flt(d.outstanding_amount):
frappe.throw(fail_message.format(d.idx))
def validate_allocated_amount_with_latest_data(self):
latest_references = get_outstanding_reference_documents( latest_references = get_outstanding_reference_documents(
{ {
"posting_date": self.posting_date, "posting_date": self.posting_date,
@ -168,7 +181,7 @@ class PaymentEntry(AccountsController):
d = frappe._dict(d) d = frappe._dict(d)
latest_lookup.update({(d.voucher_type, d.voucher_no): d}) latest_lookup.update({(d.voucher_type, d.voucher_no): d})
for d in self.get("references").copy(): for d in self.get("references"):
latest = latest_lookup.get((d.reference_doctype, d.reference_name)) latest = latest_lookup.get((d.reference_doctype, d.reference_name))
# The reference has already been fully paid # The reference has already been fully paid
@ -187,18 +200,14 @@ class PaymentEntry(AccountsController):
).format(d.reference_doctype, d.reference_name) ).format(d.reference_doctype, d.reference_name)
) )
d.outstanding_amount = latest.outstanding_amount
fail_message = _("Row #{0}: Allocated Amount cannot be greater than outstanding amount.") fail_message = _("Row #{0}: Allocated Amount cannot be greater than outstanding amount.")
if (flt(d.allocated_amount)) > 0: if (flt(d.allocated_amount)) > 0 and flt(d.allocated_amount) > flt(latest.outstanding_amount):
if flt(d.allocated_amount) > flt(d.outstanding_amount): frappe.throw(fail_message.format(d.idx))
frappe.throw(fail_message.format(d.idx))
# Check for negative outstanding invoices as well # Check for negative outstanding invoices as well
if flt(d.allocated_amount) < 0: if flt(d.allocated_amount) < 0 and flt(d.allocated_amount) < flt(latest.outstanding_amount):
if flt(d.allocated_amount) < flt(d.outstanding_amount): frappe.throw(fail_message.format(d.idx))
frappe.throw(fail_message.format(d.idx))
def delink_advance_entry_references(self): def delink_advance_entry_references(self):
for reference in self.references: for reference in self.references:

View File

@ -1001,10 +1001,16 @@ class SalesInvoice(SellingController):
def check_prev_docstatus(self): def check_prev_docstatus(self):
for d in self.get("items"): for d in self.get("items"):
if d.sales_order and frappe.db.get_value("Sales Order", d.sales_order, "docstatus") != 1: if (
d.sales_order
and frappe.db.get_value("Sales Order", d.sales_order, "docstatus", cache=True) != 1
):
frappe.throw(_("Sales Order {0} is not submitted").format(d.sales_order)) frappe.throw(_("Sales Order {0} is not submitted").format(d.sales_order))
if d.delivery_note and frappe.db.get_value("Delivery Note", d.delivery_note, "docstatus") != 1: if (
d.delivery_note
and frappe.db.get_value("Delivery Note", d.delivery_note, "docstatus", cache=True) != 1
):
throw(_("Delivery Note {0} is not submitted").format(d.delivery_note)) throw(_("Delivery Note {0} is not submitted").format(d.delivery_note))
def make_gl_entries(self, gl_entries=None, from_repost=False): def make_gl_entries(self, gl_entries=None, from_repost=False):

View File

@ -112,6 +112,17 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s
} }
}; };
}); });
let sbb_field = me.frm.get_docfield('stock_items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
'warehouse': row.doc.warehouse,
'voucher_type': me.frm.doc.doctype,
}
};
}
} }
target_item_code() { target_item_code() {

View File

@ -40,6 +40,16 @@ frappe.ui.form.on('Asset Repair', {
} }
} }
}); });
let sbb_field = frm.get_docfield('stock_items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
'voucher_type': frm.doc.doctype,
}
};
}
}, },
refresh: function(frm) { refresh: function(frm) {

View File

@ -498,7 +498,7 @@ class BuyingController(SubcontractingController):
continue continue
if d.warehouse: if d.warehouse:
pr_qty = flt(d.qty) * flt(d.conversion_factor) pr_qty = flt(flt(d.qty) * flt(d.conversion_factor), d.precision("stock_qty"))
if pr_qty: if pr_qty:
@ -574,7 +574,7 @@ class BuyingController(SubcontractingController):
d, d,
{ {
"warehouse": d.rejected_warehouse, "warehouse": d.rejected_warehouse,
"actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor), "actual_qty": flt(flt(d.rejected_qty) * flt(d.conversion_factor), d.precision("stock_qty")),
"incoming_rate": 0.0, "incoming_rate": 0.0,
"serial_and_batch_bundle": d.rejected_serial_and_batch_bundle, "serial_and_batch_bundle": d.rejected_serial_and_batch_bundle,
}, },

View File

@ -660,6 +660,9 @@ def get_filters(
if reference_voucher_detail_no: if reference_voucher_detail_no:
filters["voucher_detail_no"] = reference_voucher_detail_no filters["voucher_detail_no"] = reference_voucher_detail_no
if item_row and item_row.get("warehouse"):
filters["warehouse"] = item_row.get("warehouse")
return filters return filters

View File

@ -293,8 +293,8 @@ def get_last_accrual_date(loan, posting_date):
# interest for last interest accrual date is already booked, so add 1 day # interest for last interest accrual date is already booked, so add 1 day
last_disbursement_date = get_last_disbursement_date(loan, posting_date) last_disbursement_date = get_last_disbursement_date(loan, posting_date)
if last_disbursement_date and getdate(last_disbursement_date) > getdate( if last_disbursement_date and getdate(last_disbursement_date) > add_days(
last_interest_accrual_date getdate(last_interest_accrual_date), 1
): ):
last_interest_accrual_date = last_disbursement_date last_interest_accrual_date = last_disbursement_date

View File

@ -23,6 +23,17 @@ frappe.ui.form.on('Job Card', {
} }
}); });
let sbb_field = frm.get_docfield('serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = () => {
return {
'item_code': frm.doc.production_item,
'warehouse': frm.doc.wip_warehouse,
'voucher_type': frm.doc.doctype,
}
};
}
frm.set_indicator_formatter('sub_operation', frm.set_indicator_formatter('sub_operation',
function(doc) { function(doc) {
if (doc.status == "Pending") { if (doc.status == "Pending") {

View File

@ -161,7 +161,7 @@ class JobCard(Document):
self.total_completed_qty = flt(self.total_completed_qty, self.precision("total_completed_qty")) self.total_completed_qty = flt(self.total_completed_qty, self.precision("total_completed_qty"))
for row in self.sub_operations: for row in self.sub_operations:
self.c += row.completed_qty self.total_completed_qty += row.completed_qty
def get_overlap_for(self, args, check_next_available_slot=False): def get_overlap_for(self, args, check_next_available_slot=False):
production_capacity = 1 production_capacity = 1

View File

@ -134,6 +134,15 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
} }
} }
}); });
let sbb_field = this.frm.get_docfield('items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
}
};
}
} }
if( if(

View File

@ -18,6 +18,16 @@ frappe.ui.form.on('Installation Note', {
} }
} }
}); });
let sbb_field = frm.get_docfield('items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
'voucher_type': frm.doc.doctype,
}
};
}
}, },
onload: function(frm) { onload: function(frm) {
if(!frm.doc.status) { if(!frm.doc.status) {

View File

@ -46,6 +46,17 @@ frappe.ui.form.on('Quotation', {
} }
} }
}); });
let sbb_field = frm.get_docfield('packed_items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
'warehouse': row.doc.warehouse,
'voucher_type': frm.doc.doctype,
}
};
}
}, },
refresh: function(frm) { refresh: function(frm) {

View File

@ -65,7 +65,7 @@ def search_by_term(search_term, warehouse, price_list):
"item_code": item_code, "item_code": item_code,
"batch_no": batch_no, "batch_no": batch_no,
}, },
fields=["uom", "stock_uom", "currency", "price_list_rate", "batch_no"], fields=["uom", "currency", "price_list_rate", "batch_no"],
) )
def __sort(p): def __sort(p):

View File

@ -1223,7 +1223,8 @@
"hidden": 1, "hidden": 1,
"label": "Pick List", "label": "Pick List",
"options": "Pick List", "options": "Pick List",
"read_only": 1 "read_only": 1,
"search_index": 1
}, },
{ {
"default": "0", "default": "0",
@ -1399,7 +1400,7 @@
"idx": 146, "idx": 146,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2023-06-03 16:13:25.011487", "modified": "2023-06-16 14:58:55.066602",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Delivery Note", "name": "Delivery Note",
@ -1469,4 +1470,4 @@
"title_field": "title", "title_field": "title",
"track_changes": 1, "track_changes": 1,
"track_seen": 1 "track_seen": 1
} }

View File

@ -115,7 +115,7 @@ class MaterialRequest(BuyingController):
"""Set title as comma separated list of items""" """Set title as comma separated list of items"""
if not self.title: if not self.title:
items = ", ".join([d.item_name for d in self.items][:3]) items = ", ".join([d.item_name for d in self.items][:3])
self.title = _("{0} Request for {1}").format(self.material_request_type, items)[:100] self.title = _("{0} Request for {1}").format(_(self.material_request_type), items)[:100]
def on_submit(self): def on_submit(self):
self.update_requested_qty() self.update_requested_qty()

View File

@ -65,6 +65,17 @@ frappe.ui.form.on('Pick List', {
} }
} }
}); });
let sbb_field = frm.get_docfield('locations', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
'warehouse': row.doc.warehouse,
'voucher_type': frm.doc.doctype,
}
};
}
}, },
set_item_locations:(frm, save) => { set_item_locations:(frm, save) => {
if (!(frm.doc.locations && frm.doc.locations.length)) { if (!(frm.doc.locations && frm.doc.locations.length)) {

View File

@ -40,7 +40,7 @@ class PickList(Document):
for location in self.get("locations"): for location in self.get("locations"):
if ( if (
location.sales_order location.sales_order
and frappe.db.get_value("Sales Order", location.sales_order, "per_picked") == 100 and frappe.db.get_value("Sales Order", location.sales_order, "per_picked", cache=True) == 100
): ):
frappe.throw( frappe.throw(
_("Row #{}: item {} has been picked already.").format(location.idx, location.item_code) _("Row #{}: item {} has been picked already.").format(location.idx, location.item_code)
@ -384,6 +384,7 @@ class PickList(Document):
(pi_item.item_code.isin([x.item_code for x in items])) (pi_item.item_code.isin([x.item_code for x in items]))
& ((pi_item.picked_qty > 0) | (pi_item.stock_qty > 0)) & ((pi_item.picked_qty > 0) | (pi_item.stock_qty > 0))
& (pi.status != "Completed") & (pi.status != "Completed")
& (pi.status != "Cancelled")
& (pi_item.docstatus != 2) & (pi_item.docstatus != 2)
) )
.groupby( .groupby(
@ -497,7 +498,7 @@ def get_items_with_location_and_quantity(item_doc, item_location_map, docstatus)
) )
qty = stock_qty / (item_doc.conversion_factor or 1) qty = stock_qty / (item_doc.conversion_factor or 1)
uom_must_be_whole_number = frappe.db.get_value("UOM", item_doc.uom, "must_be_whole_number") uom_must_be_whole_number = frappe.get_cached_value("UOM", item_doc.uom, "must_be_whole_number")
if uom_must_be_whole_number: if uom_must_be_whole_number:
qty = floor(qty) qty = floor(qty)
stock_qty = qty * item_doc.conversion_factor stock_qty = qty * item_doc.conversion_factor

View File

@ -153,7 +153,8 @@
"fieldtype": "Data", "fieldtype": "Data",
"hidden": 1, "hidden": 1,
"label": "Sales Order Item", "label": "Sales Order Item",
"read_only": 1 "read_only": 1,
"search_index": 1
}, },
{ {
"fieldname": "serial_no_and_batch_section", "fieldname": "serial_no_and_batch_section",
@ -208,7 +209,7 @@
], ],
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2023-03-12 13:50:22.258100", "modified": "2023-06-16 14:05:51.719959",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Pick List Item", "name": "Pick List Item",

View File

@ -122,6 +122,7 @@ class PurchaseReceipt(BuyingController):
self.set_status() self.set_status()
self.po_required() self.po_required()
self.validate_items_quality_inspection()
self.validate_with_previous_doc() self.validate_with_previous_doc()
self.validate_uom_is_integer("uom", ["qty", "received_qty"]) self.validate_uom_is_integer("uom", ["qty", "received_qty"])
self.validate_uom_is_integer("stock_uom", "stock_qty") self.validate_uom_is_integer("stock_uom", "stock_qty")
@ -195,6 +196,26 @@ class PurchaseReceipt(BuyingController):
if not d.purchase_order: if not d.purchase_order:
frappe.throw(_("Purchase Order number required for Item {0}").format(d.item_code)) frappe.throw(_("Purchase Order number required for Item {0}").format(d.item_code))
def validate_items_quality_inspection(self):
for item in self.get("items"):
if item.quality_inspection:
qi = frappe.db.get_value(
"Quality Inspection",
item.quality_inspection,
["reference_type", "reference_name", "item_code"],
as_dict=True,
)
if qi.reference_type != self.doctype or qi.reference_name != self.name:
msg = f"""Row #{item.idx}: Please select a valid Quality Inspection with Reference Type
{frappe.bold(self.doctype)} and Reference Name {frappe.bold(self.name)}."""
frappe.throw(_(msg))
if qi.item_code != item.item_code:
msg = f"""Row #{item.idx}: Please select a valid Quality Inspection with Item Code
{frappe.bold(item.item_code)}."""
frappe.throw(_(msg))
def get_already_received_qty(self, po, po_detail): def get_already_received_qty(self, po, po_detail):
qty = frappe.db.sql( qty = frappe.db.sql(
"""select sum(qty) from `tabPurchase Receipt Item` """select sum(qty) from `tabPurchase Receipt Item`

View File

@ -1781,6 +1781,52 @@ class TestPurchaseReceipt(FrappeTestCase):
pr.items[0].delivery_note_item = delivery_note_item pr.items[0].delivery_note_item = delivery_note_item
pr.save() pr.save()
def test_purchase_return_valuation_with_rejected_qty(self):
item_code = "_Test Item Return Valuation"
create_item(item_code)
warehouse = create_warehouse("_Test Warehouse Return Valuation")
rejected_warehouse = create_warehouse("_Test Rejected Warehouse Return Valuation")
# Step 1: Create Purchase Receipt with valuation rate 100
make_purchase_receipt(
item_code=item_code,
warehouse=warehouse,
qty=10,
rate=100,
rejected_qty=2,
rejected_warehouse=rejected_warehouse,
)
# Step 2: Create One more Purchase Receipt with valuation rate 200
pr = make_purchase_receipt(
item_code=item_code,
warehouse=warehouse,
qty=10,
rate=200,
rejected_qty=2,
rejected_warehouse=rejected_warehouse,
)
# Step 3: Create Purchase Return for 2 qty
from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_return
pr_return = make_purchase_return(pr.name)
pr_return.items[0].qty = 2 * -1
pr_return.items[0].received_qty = 2 * -1
pr_return.items[0].rejected_qty = 0
pr_return.items[0].rejected_warehouse = ""
pr_return.save()
pr_return.submit()
data = frappe.get_all(
"Stock Ledger Entry",
filters={"voucher_no": pr_return.name, "docstatus": 1},
fields=["SUM(stock_value_difference) as stock_value_difference"],
)[0]
self.assertEqual(abs(data["stock_value_difference"]), 400.00)
def prepare_data_for_internal_transfer(): def prepare_data_for_internal_transfer():
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier

View File

@ -115,6 +115,15 @@ frappe.ui.form.on('Stock Entry', {
} }
}); });
let sbb_field = frm.get_docfield('items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
'voucher_type': frm.doc.doctype,
}
};
}
frm.add_fetch("bom_no", "inspection_required", "inspection_required"); frm.add_fetch("bom_no", "inspection_required", "inspection_required");
erpnext.accounts.dimensions.setup_dimension_filters(frm, frm.doctype); erpnext.accounts.dimensions.setup_dimension_filters(frm, frm.doctype);

View File

@ -577,7 +577,8 @@
"fieldtype": "Link", "fieldtype": "Link",
"label": "Pick List", "label": "Pick List",
"options": "Pick List", "options": "Pick List",
"read_only": 1 "read_only": 1,
"search_index": 1
}, },
{ {
"fieldname": "print_settings_col_break", "fieldname": "print_settings_col_break",
@ -677,7 +678,7 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2023-06-09 15:46:28.418339", "modified": "2023-06-16 14:59:10.917235",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Stock Entry", "name": "Stock Entry",
@ -738,7 +739,6 @@
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Stock Manager", "role": "Stock Manager",
"set_user_permissions": 1,
"share": 1, "share": 1,
"submit": 1, "submit": 1,
"write": 1 "write": 1

View File

@ -266,10 +266,10 @@ class StockEntry(StockController):
return return
for row in self.items: for row in self.items:
if row.job_card_item: if row.job_card_item or not row.s_warehouse:
continue continue
msg = f"""Row #{0}: The job card item reference msg = f"""Row #{row.idx}: The job card item reference
is missing. Kindly create the stock entry is missing. Kindly create the stock entry
from the job card. If you have added the row manually from the job card. If you have added the row manually
then you won't be able to add job card item reference.""" then you won't be able to add job card item reference."""

View File

@ -42,6 +42,17 @@ frappe.ui.form.on("Stock Reconciliation", {
} }
}); });
let sbb_field = frm.get_docfield('items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.item_code,
'warehouse': row.doc.warehouse,
'voucher_type': frm.doc.doctype,
}
};
}
if (frm.doc.company) { if (frm.doc.company) {
erpnext.queries.setup_queries(frm, "Warehouse", function() { erpnext.queries.setup_queries(frm, "Warehouse", function() {
return erpnext.queries.warehouse(frm.doc); return erpnext.queries.warehouse(frm.doc);

View File

@ -89,6 +89,16 @@ frappe.ui.form.on('Subcontracting Receipt', {
} }
}); });
let sbb_field = frm.get_docfield('supplied_items', 'serial_and_batch_bundle');
if (sbb_field) {
sbb_field.get_route_options_for_new_doc = (row) => {
return {
'item_code': row.doc.rm_item_code,
'voucher_type': frm.doc.doctype,
}
};
}
let batch_no_field = frm.get_docfield('items', 'batch_no'); let batch_no_field = frm.get_docfield('items', 'batch_no');
if (batch_no_field) { if (batch_no_field) {
batch_no_field.get_route_options_for_new_doc = function(row) { batch_no_field.get_route_options_for_new_doc = function(row) {

View File

@ -115,7 +115,7 @@ Add Customers,Ajouter des clients,
Add Employees,Ajouter des employés, Add Employees,Ajouter des employés,
Add Item,Ajouter un Article, Add Item,Ajouter un Article,
Add Items,Ajouter des articles, Add Items,Ajouter des articles,
Add Leads,Créer des Prospects, Add Leads,Créer des Leads,
Add Multiple Tasks,Ajouter plusieurs tâches, Add Multiple Tasks,Ajouter plusieurs tâches,
Add Row,Ajouter une Ligne, Add Row,Ajouter une Ligne,
Add Sales Partners,Ajouter des partenaires commerciaux, Add Sales Partners,Ajouter des partenaires commerciaux,
@ -658,8 +658,8 @@ Create Invoice,Créer une facture,
Create Invoices,Créer des factures, Create Invoices,Créer des factures,
Create Job Card,Créer une carte de travail, Create Job Card,Créer une carte de travail,
Create Journal Entry,Créer une entrée de journal, Create Journal Entry,Créer une entrée de journal,
Create Lead,Créer un Prospect, Create Lead,Créer un Lead,
Create Leads,Créer des Prospects, Create Leads,Créer des Lead,
Create Maintenance Visit,Créer une visite de maintenance, Create Maintenance Visit,Créer une visite de maintenance,
Create Material Request,Créer une demande de matériel, Create Material Request,Créer une demande de matériel,
Create Multiple,Créer plusieurs, Create Multiple,Créer plusieurs,
@ -1426,13 +1426,12 @@ Last Purchase Price,Dernier prix d'achat,
Last Purchase Rate,Dernier Prix d'Achat, Last Purchase Rate,Dernier Prix d'Achat,
Latest,Dernier, Latest,Dernier,
Latest price updated in all BOMs,Prix les plus récents mis à jour dans toutes les nomenclatures, Latest price updated in all BOMs,Prix les plus récents mis à jour dans toutes les nomenclatures,
Lead,Prospect, Lead Count,Nombre de Lead,
Lead Count,Nombre de Prospects,
Lead Owner,Responsable du Prospect, Lead Owner,Responsable du Prospect,
Lead Owner cannot be same as the Lead,Le Responsable du Prospect ne peut pas être identique au Prospect, Lead Owner cannot be same as the Lead,Le Responsable du Prospect ne peut pas être identique au Lead,
Lead Time Days,Jours de Délai, Lead Time Days,Jours de Délai,
Lead to Quotation,Du Prospect au Devis, Lead to Quotation,Du Prospect au Devis,
"Leads help you get business, add all your contacts and more as your leads","Les prospects vous aident à obtenir des contrats, ajoutez tous vos contacts et plus dans votre liste de prospects", "Leads help you get business, add all your contacts and more as your leads","Les lead vous aident à obtenir des contrats, ajoutez tous vos contacts et plus dans votre liste de lead",
Learn,Apprendre, Learn,Apprendre,
Leave Approval Notification,Notification d'approbation de congés, Leave Approval Notification,Notification d'approbation de congés,
Leave Blocked,Laisser Verrouillé, Leave Blocked,Laisser Verrouillé,
@ -1596,7 +1595,7 @@ Middle Name,Deuxième Nom,
Middle Name (Optional),Deuxième Prénom (Optionnel), Middle Name (Optional),Deuxième Prénom (Optionnel),
Min Amt can not be greater than Max Amt,Min Amt ne peut pas être supérieur à Max Amt, Min Amt can not be greater than Max Amt,Min Amt ne peut pas être supérieur à Max Amt,
Min Qty can not be greater than Max Qty,Qté Min ne peut pas être supérieure à Qté Max, Min Qty can not be greater than Max Qty,Qté Min ne peut pas être supérieure à Qté Max,
Minimum Lead Age (Days),Âge Minimum du Prospect (Jours), Minimum Lead Age (Days),Âge Minimum du lead (Jours),
Miscellaneous Expenses,Charges Diverses, Miscellaneous Expenses,Charges Diverses,
Missing Currency Exchange Rates for {0},Taux de Change Manquant pour {0}, Missing Currency Exchange Rates for {0},Taux de Change Manquant pour {0},
Missing email template for dispatch. Please set one in Delivery Settings.,Modèle de courrier électronique manquant pour l'envoi. Veuillez en définir un dans les paramètres de livraison., Missing email template for dispatch. Please set one in Delivery Settings.,Modèle de courrier électronique manquant pour l'envoi. Veuillez en définir un dans les paramètres de livraison.,
@ -1676,7 +1675,7 @@ New {0} pricing rules are created,De nouvelles règles de tarification {0} sont
Newsletters,Newsletters, Newsletters,Newsletters,
Newspaper Publishers,Éditeurs de journaux, Newspaper Publishers,Éditeurs de journaux,
Next,Suivant, Next,Suivant,
Next Contact By cannot be same as the Lead Email Address,Prochain Contact Par ne peut être identique à lAdresse Email du Prospect, Next Contact By cannot be same as the Lead Email Address,Prochain Contact Par ne peut être identique à lAdresse Email du Lead,
Next Contact Date cannot be in the past,La Date de Prochain Contact ne peut pas être dans le passé, Next Contact Date cannot be in the past,La Date de Prochain Contact ne peut pas être dans le passé,
Next Steps,Prochaines étapes, Next Steps,Prochaines étapes,
No Action,Pas d'action, No Action,Pas d'action,
@ -1808,9 +1807,9 @@ Operation Time must be greater than 0 for Operation {0},Temps de l'Opération do
Operations,Opérations, Operations,Opérations,
Operations cannot be left blank,Les opérations ne peuvent pas être laissées vides, Operations cannot be left blank,Les opérations ne peuvent pas être laissées vides,
Opp Count,Compte d'Opportunités, Opp Count,Compte d'Opportunités,
Opp/Lead %,Opp / Prospect %, Opp/Lead %,Opp / Lead %,
Opportunities,Opportunités, Opportunities,Opportunités,
Opportunities by lead source,Opportunités par source de plomb, Opportunities by lead source,Opportunités par source de lead,
Opportunity,Opportunité, Opportunity,Opportunité,
Opportunity Amount,Montant de l'opportunité, Opportunity Amount,Montant de l'opportunité,
Optional Holiday List not set for leave period {0},Une liste de vacances facultative n'est pas définie pour la période de congé {0}, Optional Holiday List not set for leave period {0},Une liste de vacances facultative n'est pas définie pour la période de congé {0},
@ -2007,7 +2006,7 @@ Please mention Basic and HRA component in Company,Veuillez mentionner les compos
Please mention Round Off Account in Company,Veuillez indiquer le Compte dArrondi de la Société, Please mention Round Off Account in Company,Veuillez indiquer le Compte dArrondi de la Société,
Please mention Round Off Cost Center in Company,Veuillez indiquer le Centre de Coûts dArrondi de la Société, Please mention Round Off Cost Center in Company,Veuillez indiquer le Centre de Coûts dArrondi de la Société,
Please mention no of visits required,Veuillez indiquer le nb de visites requises, Please mention no of visits required,Veuillez indiquer le nb de visites requises,
Please mention the Lead Name in Lead {0},Veuillez mentionner le nom du Prospect dans le Prospect {0}, Please mention the Lead Name in Lead {0},Veuillez mentionner le nom du Lead dans le Lead {0},
Please pull items from Delivery Note,Veuillez récupérer les articles des Bons de Livraison, Please pull items from Delivery Note,Veuillez récupérer les articles des Bons de Livraison,
Please register the SIREN number in the company information file,Veuillez enregistrer le numéro SIREN dans la fiche d'information de la société, Please register the SIREN number in the company information file,Veuillez enregistrer le numéro SIREN dans la fiche d'information de la société,
Please remove this Invoice {0} from C-Form {1},Veuillez retirez cette Facture {0} du C-Form {1}, Please remove this Invoice {0} from C-Form {1},Veuillez retirez cette Facture {0} du C-Form {1},
@ -2277,7 +2276,7 @@ Queued for replacing the BOM. It may take a few minutes.,En file d'attente pour
Queued for updating latest price in all Bill of Materials. It may take a few minutes.,Mise à jour des prix les plus récents dans toutes les nomenclatures en file d'attente. Cela peut prendre quelques minutes., Queued for updating latest price in all Bill of Materials. It may take a few minutes.,Mise à jour des prix les plus récents dans toutes les nomenclatures en file d'attente. Cela peut prendre quelques minutes.,
Quick Journal Entry,Écriture Rapide dans le Journal, Quick Journal Entry,Écriture Rapide dans le Journal,
Quot Count,Compte de Devis, Quot Count,Compte de Devis,
Quot/Lead %,Devis / Prospects %, Quot/Lead %,Devis / Lead %,
Quotation,Devis, Quotation,Devis,
Quotation {0} is cancelled,Devis {0} est annulée, Quotation {0} is cancelled,Devis {0} est annulée,
Quotation {0} not of type {1},Le devis {0} n'est pas du type {1}, Quotation {0} not of type {1},Le devis {0} n'est pas du type {1},
@ -2285,7 +2284,7 @@ Quotations,Devis,
"Quotations are proposals, bids you have sent to your customers","Les devis sont des propositions, offres que vous avez envoyées à vos clients", "Quotations are proposals, bids you have sent to your customers","Les devis sont des propositions, offres que vous avez envoyées à vos clients",
Quotations received from Suppliers.,Devis reçus des Fournisseurs., Quotations received from Suppliers.,Devis reçus des Fournisseurs.,
Quotations: ,Devis :, Quotations: ,Devis :,
Quotes to Leads or Customers.,Devis de Prospects ou Clients., Quotes to Leads or Customers.,Devis de Lead ou Clients.,
RFQs are not allowed for {0} due to a scorecard standing of {1},Les Appels d'Offres ne sont pas autorisés pour {0} en raison d'une note de {1} sur la fiche d'évaluation, RFQs are not allowed for {0} due to a scorecard standing of {1},Les Appels d'Offres ne sont pas autorisés pour {0} en raison d'une note de {1} sur la fiche d'évaluation,
Range,Plage, Range,Plage,
Rate,Prix, Rate,Prix,
@ -3122,7 +3121,7 @@ Total(Amt),Total (Mnt),
Total(Qty),Total (Qté), Total(Qty),Total (Qté),
Traceability,Traçabilité, Traceability,Traçabilité,
Traceback,Retraçage, Traceback,Retraçage,
Track Leads by Lead Source.,Suivre les prospects par sources, Track Leads by Lead Source.,Suivre les leads par sources,
Training,Formation, Training,Formation,
Training Event,Événement de formation, Training Event,Événement de formation,
Training Events,Événements de formation, Training Events,Événements de formation,
@ -3243,8 +3242,8 @@ View Chart of Accounts,Voir le plan comptable,
View Fees Records,Voir les honoraires, View Fees Records,Voir les honoraires,
View Form,Voir le formulaire, View Form,Voir le formulaire,
View Lab Tests,Afficher les tests de laboratoire, View Lab Tests,Afficher les tests de laboratoire,
View Leads,Voir Prospects, View Leads,Voir Lead,
View Ledger,Voir le Livre, View Ledger,Voir le Journal,
View Now,Voir maintenant, View Now,Voir maintenant,
View a list of all the help videos,Afficher la liste de toutes les vidéos d'aide, View a list of all the help videos,Afficher la liste de toutes les vidéos d'aide,
View in Cart,Voir Panier, View in Cart,Voir Panier,
@ -3677,7 +3676,7 @@ Couldn't Set Service Level Agreement {0}.,Impossible de définir le contrat de s
Country,Pays, Country,Pays,
Country Code in File does not match with country code set up in the system,Le code de pays dans le fichier ne correspond pas au code de pays configuré dans le système, Country Code in File does not match with country code set up in the system,Le code de pays dans le fichier ne correspond pas au code de pays configuré dans le système,
Create New Contact,Créer un nouveau contact, Create New Contact,Créer un nouveau contact,
Create New Lead,Créer une nouvelle piste, Create New Lead,Créer une nouvelle lead,
Create Pick List,Créer une liste de choix, Create Pick List,Créer une liste de choix,
Create Quality Inspection for Item {0},Créer un contrôle qualité pour l'article {0}, Create Quality Inspection for Item {0},Créer un contrôle qualité pour l'article {0},
Creating Accounts...,Création de comptes ..., Creating Accounts...,Création de comptes ...,
@ -3784,7 +3783,7 @@ Group Warehouses cannot be used in transactions. Please change the value of {0},
Help,Aidez-moi, Help,Aidez-moi,
Help Article,Article dAide, Help Article,Article dAide,
"Helps you keep tracks of Contracts based on Supplier, Customer and Employee","Vous aide à garder une trace des contrats en fonction du fournisseur, client et employé", "Helps you keep tracks of Contracts based on Supplier, Customer and Employee","Vous aide à garder une trace des contrats en fonction du fournisseur, client et employé",
Helps you manage appointments with your leads,Vous aide à gérer les rendez-vous avec vos prospects, Helps you manage appointments with your leads,Vous aide à gérer les rendez-vous avec vos leads,
Home,Accueil, Home,Accueil,
IBAN is not valid,IBAN n'est pas valide, IBAN is not valid,IBAN n'est pas valide,
Import Data from CSV / Excel files.,Importer des données à partir de fichiers CSV / Excel, Import Data from CSV / Excel files.,Importer des données à partir de fichiers CSV / Excel,
@ -3880,7 +3879,7 @@ Only expired allocation can be cancelled,Seule l'allocation expirée peut être
Only users with the {0} role can create backdated leave applications,Seuls les utilisateurs avec le rôle {0} peuvent créer des demandes de congé antidatées, Only users with the {0} role can create backdated leave applications,Seuls les utilisateurs avec le rôle {0} peuvent créer des demandes de congé antidatées,
Open,Ouvert, Open,Ouvert,
Open Contact,Contact ouvert, Open Contact,Contact ouvert,
Open Lead,Ouvrir le Prospect, Open Lead,Ouvrir le Lead,
Opening and Closing,Ouverture et fermeture, Opening and Closing,Ouverture et fermeture,
Operating Cost as per Work Order / BOM,Coût d'exploitation selon l'ordre de fabrication / nomenclature, Operating Cost as per Work Order / BOM,Coût d'exploitation selon l'ordre de fabrication / nomenclature,
Order Amount,Montant de la commande, Order Amount,Montant de la commande,
@ -3926,7 +3925,7 @@ Please select another payment method. Stripe does not support transactions in cu
Please select the customer.,S'il vous plaît sélectionner le client., Please select the customer.,S'il vous plaît sélectionner le client.,
Please set a Supplier against the Items to be considered in the Purchase Order.,Veuillez définir un fournisseur par rapport aux articles à prendre en compte dans la Commande d'Achat., Please set a Supplier against the Items to be considered in the Purchase Order.,Veuillez définir un fournisseur par rapport aux articles à prendre en compte dans la Commande d'Achat.,
Please set account heads in GST Settings for Compnay {0},Définissez les en-têtes de compte dans les paramètres de la TPS pour le service {0}., Please set account heads in GST Settings for Compnay {0},Définissez les en-têtes de compte dans les paramètres de la TPS pour le service {0}.,
Please set an email id for the Lead {0},Veuillez définir un identifiant de messagerie pour le prospect {0}., Please set an email id for the Lead {0},Veuillez définir un identifiant de messagerie pour le lead {0}.,
Please set default UOM in Stock Settings,Veuillez définir l'UdM par défaut dans les paramètres de stock, Please set default UOM in Stock Settings,Veuillez définir l'UdM par défaut dans les paramètres de stock,
Please set filter based on Item or Warehouse due to a large amount of entries.,Veuillez définir le filtre en fonction de l'article ou de l'entrepôt en raison d'une grande quantité d'entrées., Please set filter based on Item or Warehouse due to a large amount of entries.,Veuillez définir le filtre en fonction de l'article ou de l'entrepôt en raison d'une grande quantité d'entrées.,
Please set up the Campaign Schedule in the Campaign {0},Configurez le calendrier de la campagne dans la campagne {0}., Please set up the Campaign Schedule in the Campaign {0},Configurez le calendrier de la campagne dans la campagne {0}.,
@ -5600,7 +5599,7 @@ Call Log,Journal d'appel,
Received By,Reçu par, Received By,Reçu par,
Caller Information,Informations sur l'appelant, Caller Information,Informations sur l'appelant,
Contact Name,Nom du Contact, Contact Name,Nom du Contact,
Lead Name,Nom du Prospect, Lead Name,Nom du Lead,
Ringing,Sonnerie, Ringing,Sonnerie,
Missed,Manqué, Missed,Manqué,
Call Duration in seconds,Durée d'appel en secondes, Call Duration in seconds,Durée d'appel en secondes,
@ -5668,7 +5667,7 @@ Fulfilment Terms and Conditions,Termes et conditions d'exécution,
Contract Template Fulfilment Terms,Conditions d'exécution du modèle de contrat, Contract Template Fulfilment Terms,Conditions d'exécution du modèle de contrat,
Email Campaign,Campagne Email, Email Campaign,Campagne Email,
Email Campaign For ,Campagne d'email pour, Email Campaign For ,Campagne d'email pour,
Lead is an Organization,Le prospect est une organisation, Lead is an Organization,Le Lead est une organisation,
CRM-LEAD-.YYYY.-,CRM-LEAD-.YYYY.-, CRM-LEAD-.YYYY.-,CRM-LEAD-.YYYY.-,
Person Name,Nom de la Personne, Person Name,Nom de la Personne,
Lost Quotation,Devis Perdu, Lost Quotation,Devis Perdu,
@ -5683,7 +5682,7 @@ Next Contact Date,Date du Prochain Contact,
Ends On,Se termine le, Ends On,Se termine le,
Address & Contact,Adresse &amp; Contact, Address & Contact,Adresse &amp; Contact,
Mobile No.,N° Mobile., Mobile No.,N° Mobile.,
Lead Type,Type de Prospect, Lead Type,Type de Lead,
Channel Partner,Partenaire de Canal, Channel Partner,Partenaire de Canal,
Consultant,Consultant, Consultant,Consultant,
Market Segment,Part de Marché, Market Segment,Part de Marché,
@ -5706,7 +5705,7 @@ Opportunity Lost Reason,Raison perdue,
Potential Sales Deal,Ventes Potentielles, Potential Sales Deal,Ventes Potentielles,
CRM-OPP-.YYYY.-,CRM-OPP-YYYY.-, CRM-OPP-.YYYY.-,CRM-OPP-YYYY.-,
Opportunity From,Opportunité De, Opportunity From,Opportunité De,
Customer / Lead Name,Nom du Client / Prospect, Customer / Lead Name,Nom du Client / Lead,
Opportunity Type,Type d'Opportunité, Opportunity Type,Type d'Opportunité,
Converted By,Converti par, Converted By,Converti par,
Sales Stage,Stade de vente, Sales Stage,Stade de vente,
@ -5716,7 +5715,7 @@ To Discuss,À Discuter,
With Items,Avec Articles, With Items,Avec Articles,
Probability (%),Probabilité (%), Probability (%),Probabilité (%),
Contact Info,Information du Contact, Contact Info,Information du Contact,
Customer / Lead Address,Adresse du Client / Prospect, Customer / Lead Address,Adresse du Lead / Prospect,
Contact Mobile No,N° de Portable du Contact, Contact Mobile No,N° de Portable du Contact,
Enter name of campaign if source of enquiry is campaign,Entrez le nom de la campagne si la source de l'enquête est une campagne, Enter name of campaign if source of enquiry is campaign,Entrez le nom de la campagne si la source de l'enquête est une campagne,
Opportunity Date,Date d'Opportunité, Opportunity Date,Date d'Opportunité,
@ -7643,7 +7642,7 @@ Campaign Schedules,Horaires de campagne,
Buyer of Goods and Services.,Acheteur des Biens et Services., Buyer of Goods and Services.,Acheteur des Biens et Services.,
CUST-.YYYY.-,CUST-.YYYY.-, CUST-.YYYY.-,CUST-.YYYY.-,
Default Company Bank Account,Compte bancaire d'entreprise par défaut, Default Company Bank Account,Compte bancaire d'entreprise par défaut,
From Lead,Du Prospect, From Lead,Du Lead,
Account Manager,Gestionnaire de compte, Account Manager,Gestionnaire de compte,
Allow Sales Invoice Creation Without Sales Order,Autoriser la création de factures de vente sans commande client, Allow Sales Invoice Creation Without Sales Order,Autoriser la création de factures de vente sans commande client,
Allow Sales Invoice Creation Without Delivery Note,Autoriser la création de factures de vente sans bon de livraison, Allow Sales Invoice Creation Without Delivery Note,Autoriser la création de factures de vente sans bon de livraison,
@ -7670,7 +7669,7 @@ Installation Date,Date d'Installation,
Installation Time,Temps d'Installation, Installation Time,Temps d'Installation,
Installation Note Item,Article Remarque d'Installation, Installation Note Item,Article Remarque d'Installation,
Installed Qty,Qté Installée, Installed Qty,Qté Installée,
Lead Source,Source du Prospect, Lead Source,Source du Lead,
Period Start Date,Date de début de la période, Period Start Date,Date de début de la période,
Period End Date,Date de fin de la période, Period End Date,Date de fin de la période,
Cashier,Caissier, Cashier,Caissier,
@ -8515,8 +8514,8 @@ Item-wise Sales Register,Registre des Ventes par Article,
Items To Be Requested,Articles À Demander, Items To Be Requested,Articles À Demander,
Reserved,Réservé, Reserved,Réservé,
Itemwise Recommended Reorder Level,Renouvellement Recommandé par Article, Itemwise Recommended Reorder Level,Renouvellement Recommandé par Article,
Lead Details,Détails du Prospect, Lead Details,Détails du Lead,
Lead Owner Efficiency,Efficacité des Responsables des Prospects, Lead Owner Efficiency,Efficacité des Responsables des Leads,
Loan Repayment and Closure,Remboursement et clôture de prêts, Loan Repayment and Closure,Remboursement et clôture de prêts,
Loan Security Status,État de la sécurité du prêt, Loan Security Status,État de la sécurité du prêt,
Lost Opportunity,Occasion perdue, Lost Opportunity,Occasion perdue,
@ -9205,7 +9204,7 @@ Time Required (In Mins),Temps requis (en minutes),
From Posting Date,À partir de la date de publication, From Posting Date,À partir de la date de publication,
To Posting Date,À la date de publication, To Posting Date,À la date de publication,
No records found,Aucun enregistrement trouvé, No records found,Aucun enregistrement trouvé,
Customer/Lead Name,Nom du client / prospect, Customer/Lead Name,Nom du client / lead,
Unmarked Days,Jours non marqués, Unmarked Days,Jours non marqués,
Jan,Jan, Jan,Jan,
Feb,fév, Feb,fév,
@ -9469,7 +9468,7 @@ Row {0}: Loan Security {1} added multiple times,Ligne {0}: Garantie de prêt {1}
Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save,Ligne n ° {0}: l'élément enfant ne doit pas être un ensemble de produits. Veuillez supprimer l'élément {1} et enregistrer, Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save,Ligne n ° {0}: l'élément enfant ne doit pas être un ensemble de produits. Veuillez supprimer l'élément {1} et enregistrer,
Credit limit reached for customer {0},Limite de crédit atteinte pour le client {0}, Credit limit reached for customer {0},Limite de crédit atteinte pour le client {0},
Could not auto create Customer due to the following missing mandatory field(s):,Impossible de créer automatiquement le client en raison du ou des champs obligatoires manquants suivants:, Could not auto create Customer due to the following missing mandatory field(s):,Impossible de créer automatiquement le client en raison du ou des champs obligatoires manquants suivants:,
Please create Customer from Lead {0}.,Veuillez créer un client à partir du prospect {0}., Please create Customer from Lead {0}.,Veuillez créer un client à partir du lead {0}.,
Mandatory Missing,Obligatoire manquant, Mandatory Missing,Obligatoire manquant,
Please set Payroll based on in Payroll settings,Veuillez définir la paie en fonction des paramètres de paie, Please set Payroll based on in Payroll settings,Veuillez définir la paie en fonction des paramètres de paie,
Additional Salary: {0} already exist for Salary Component: {1} for period {2} and {3},Salaire supplémentaire: {0} existe déjà pour le composant de salaire: {1} pour la période {2} et {3}, Additional Salary: {0} already exist for Salary Component: {1} for period {2} and {3},Salaire supplémentaire: {0} existe déjà pour le composant de salaire: {1} pour la période {2} et {3},

Can't render this file because it is too large.